diff --git a/.air.toml b/.air.toml new file mode 100644 index 00000000..4c5465ee --- /dev/null +++ b/.air.toml @@ -0,0 +1,46 @@ +root = "." +testdata_dir = "testdata" +tmp_dir = "tmp" + +[build] + args_bin = [] + bin = "./server" + cmd = "make build" + delay = 1000 + exclude_dir = [".github", "src/database/migrations"] + exclude_file = ["src/database/*.sql.go", "src/database/db.go", "src/database/models.go"] + exclude_regex = ["_test.go"] + exclude_unchanged = false + follow_symlink = false + full_bin = "" + include_dir = [] + include_ext = ["go", "sql"] + include_file = [] + kill_delay = "0s" + log = "build-errors.log" + poll = false + poll_interval = 0 + post_cmd = [] + pre_cmd = [] + rerun = false + rerun_delay = 500 + send_interrupt = false + stop_on_error = false + +[color] + app = "" + build = "yellow" + main = "magenta" + runner = "green" + watcher = "cyan" + +[log] + main_only = false + time = false + +[misc] + clean_on_exit = false + +[screen] + clear_on_rebuild = false + keep_scroll = true diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index f6c62bee..00000000 --- a/.eslintrc.js +++ /dev/null @@ -1,24 +0,0 @@ -module.exports = { - parser: '@typescript-eslint/parser', - parserOptions: { - project: 'tsconfig.json', - sourceType: 'module', - }, - plugins: ['@typescript-eslint/eslint-plugin'], - extends: [ - 'plugin:@typescript-eslint/recommended', - 'plugin:prettier/recommended', - ], - root: true, - env: { - node: true, - jest: true, - }, - ignorePatterns: ['.eslintrc.js'], - rules: { - '@typescript-eslint/interface-name-prefix': 'off', - '@typescript-eslint/explicit-function-return-type': 'off', - '@typescript-eslint/explicit-module-boundary-types': 'off', - '@typescript-eslint/no-explicit-any': 'off', - }, -}; diff --git a/.github/workflows/go-build.yaml b/.github/workflows/go-build.yaml new file mode 100644 index 00000000..a54672a0 --- /dev/null +++ b/.github/workflows/go-build.yaml @@ -0,0 +1,20 @@ +name: Build + +on: push + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - name: set up go + uses: actions/setup-go@v2 + with: + go-version: 1.21 + + - name: sqlc generate + run: make sqlc + + - name: build + run: make build \ No newline at end of file diff --git a/.github/workflows/go-test.yaml b/.github/workflows/go-test.yaml new file mode 100644 index 00000000..5af2d057 --- /dev/null +++ b/.github/workflows/go-test.yaml @@ -0,0 +1,41 @@ +name: Unit Tests +on: push + +jobs: + # Label of the runner job + runner-job: + # You must use a Linux environment when using service containers or container jobs + runs-on: ubuntu-latest + + services: + postgres: + # Docker Hub image + image: postgres + + env: + POSTGRES_PASSWORD: postgres + # Set health checks to wait until postgres has started + options: >- + --health-cmd pg_isready + --health-interval 10s + --health-timeout 5s + --health-retries 5 + ports: + - 54322:5432 + + steps: + - uses: actions/checkout@v2 + + - name: set up go + uses: actions/setup-go@v2 + with: + go-version: 1.21 + + - name: sqlc generate + run: make sqlc + + - name: build + run: make build + + - name: run tests + run: make test \ No newline at end of file diff --git a/.gitignore b/.gitignore index bee5f2c9..4ae4ed7c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,39 +1,8 @@ -# compiled output -/dist -/node_modules +main +server +db_config.json +*tokens.json -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* +typescript -# OS -.DS_Store - -# Tests -/coverage -/.nyc_output - -# IDEs and editors -/.idea -.project -.classpath -.c9/ -*.launch -.settings/ -*.sublime-workspace - -# IDE - VSCode -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json - - -ormconfig.json -uploads -auth-tokens.json \ No newline at end of file +tmp diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index dcb72794..00000000 --- a/.prettierrc +++ /dev/null @@ -1,4 +0,0 @@ -{ - "singleQuote": true, - "trailingComma": "all" -} \ No newline at end of file diff --git a/README.md b/README.md index d567fbde..c89e0fd2 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,6 @@

- - GiftTrade Logo + GiftTrade Logo

@@ -11,88 +10,80 @@
-## Description -The GiftTrade API repository serves as the REST API for the [giftxtrade.com](https://giftxtrade.com) web app. This repo is designed to work with a fully working MySQL database. - -## API endpoints -| Endpoint | Request Method | Auth | Description | -| ------------------------------------------ | ------------------------ | ---- | -------------------------------- | -| `/` | `GET` | no | `n/a` | -| `/auth/google` | `GET` | no | Redirects to Google oauth endpoint | -| `/auth/google/redirect` | `GET` | no | Generates a token given the Google oauth callback | -| `/auth/profile` | `GET` | yes | Given a token, returns the profile details for the authenticated user | -| `/products` | `GET` | no | Returns a list of products with given a set of query parameters to tune the results | -| `/events` | `GET`, `POST` | yes | Create and fetch events for an authenticated user | -| `/events/:id` | `GET`, `PATCH`, `DELETE` | yes | Fetch, update, or delete a specific event for an authenticated user. Updating or deleting an event requires the user to be an event organizer | -| `/events/get-details/:linkCode` | `GET` | yes | Returns the name and description (if exists) for a specific event | -| `/events/invites` | `GET` | yes | Returns a list of all pending invites for an authenticated user | -| `/events/invites/accept/:eventId` | `GET` | yes | Accepts the event invite for an authenticated user | -| `/events/invites/decline/:eventId` | `GET` | yes | Declines the event invite for an authenticated user | -| `/events/get-link/:eventId` | `GET` | yes | Generates the invite link to a specific event | -| `/events/get-link/:eventId` | `GET` | yes | Generates the invite link to a specific event | -| `/events/verify-invite-code/:inviteCode` | `GET` | yes | Verify the invite code for a specific event | -| `/events/invite-code/:inviteCode` | `GET` | yes | Add the event to the user's pending invites list | -| `/participants/manage` | `PATCH`, `DELETE` | yes | Update participant details, or remove them from event. Requires that the participant is also an organizer | -| `/participants/:eventId/:participantId` | `GET` | yes | Fetch participant information, given the user is part of the same event | -| `/participants/:participantId` | `PATCH`, `DELETE` | yes | Allows user to manage their participant information, including leaving event, and updating address | -| `/wishes` | `POST`, `DELETE` | yes | Creates or removes a wishlist item | -| `/wishes/:id` | `GET` | yes | Fetch all wishlist items from the user participant given an event id | -| `/wishes/:eventId/:participantId` | `GET` | yes | Fetch all wishlist items from a participant given the participant's id and an event id | -| `/draws` | `POST` | yes | Creates randomized pairings from the active participants. Requires that user is an organizer | -| `/draws/confirm/:eventId` | `GET` | yes | Confirms the generated draws and sends emails to all the participants. Requires that user is an organizer | -| `/draws/:eventId` | `GET` | yes | Fetch all pairings for a given event. Requires that user is an organizer | -| `/me/:eventId` | `GET` | yes | Fetch user's draw for a given event | -| `/categories` | `GET` | no | Fetches all product categories | - -## Set up - -### Clone repository -``` -git clone git@github.com:giftxtrade/api.git -``` +## Tech stack +- [PostgreSQL](https://www.postgresql.org/) - Primary database +- [GORM](https://gorm.io) - ORM to interact with the database programmatically +- [Postgres for GORM](https://github.com/go-gorm/postgres) - Postgres Driver for GORM +- [Google UUID](https://pkg.go.dev/github.com/google/uuid@v1.3.0) - Generates UUID before inserts +- [Fiber](https://github.com/gofiber/fiber) - Express.js inspired framework for Go (uses [Fasthttp](https://github.com/valyala/fasthttp)) +- [Goth](https://github.com/markbates/goth) - OAuth support for multiple platforms +- [Goth Fiber](https://github.com/Shareed2k/goth_fiber) - Goth implementation for Fiber -### Install dependencies -``` -npm install -``` +## Instructions + +### Set up config files -### Configure database connection -This repo requires a working connection with a MySQL database and uses TypeORM to manage models and connections with the database. +#### `db_config.json` +This project also uses a PostgreSQL database in order to run. To start, create a file called `db_config.json` in the project root and place the following in the file, replacing all content within the `[]` with the correct database values: -To set up the config file with the connection details, create a file named `ormconfig.json` in the root of the project directory, then copy the code below, replacing all `<...>` with the appropriate values for you local database. ```json { - "type": "mysql", "host": "localhost", - "port": 3306, - "username": "", - "password": "", - "database": "", - "entities": [ - "dist/**/*.entity{.ts,.js}" - ], - "synchronize": true + "dbName": "[database name]", + "username": "[database username]", + "password": "[database password]", + "port": 5432 +} +``` + +***Note:*** All database table and column names are represented in `snake_case`. While all json field names are represented using `camelCase`. + +#### `tokens.json` + +In addition to the `db_config.json`, you will also need to create a `tokens.json` file which will hold the JWT secret, note that this token should be a randomly generated value and must not be made public. The `token.json` file should contain the following: +```json +{ + "jwtKey": "[YOUR SECRET TOKEN]", + "twitter": { + "apiKey": "[Twitter OAuth 1.0 API Key]", + "apiKeySecret": "[Twitter OAuth 1.0 API Secret]", + "bearerToken": "[Twitter OAuth Bearer Token]", + "callbackUrl": "http://localhost:8080/auth/twitter/callback" + }, + "google": { + "clientId": "[Google Client Id]", + "clientSecret": "[Google Secret Key]", + "callbackUrl": "http://localhost:8080/auth/google/callback" + } } ``` -### Configure API keys -GiftTrade API requires a number of API keys from Google, Sendgrid, (and possible from Amazon in the near future). To configure the authentication tokens file, copy `auth-tokens.sample.json` file from the root of the project, then rename the file to `auth-tokens.json`, or use the following command in the terminal: +### Generate Binary + ``` -cp auth-tokens.sample.json ./auth-tokens.json +$ make build ``` -Once `auth-tokens.json` is present, make sure to replace all values with the appropriate values, if working locally, you can leave `FRONTEND_BASE` and `JWT.SECRET` as it is. However, it is essential that at the very least you create an account on [Google Console](https://console.cloud.google.com/) and set up an OAuth key and paste the appropriate keys on the `GOOGLE` section. Do the same for [SendGrid](https://sendgrid.com) and use the free tier to get access to the appropriate API tokens. -### Start server in watch-mode +or + ``` -npm start:dev +$ go build src/server.go ``` -### Start server +Creates an executable binary file called `server`. To run this file call `./server`, like so: + ``` -npm start +$ ./server ``` -### Build server +This should start the server on port `8080`. + +### Run without Binary + +Another way to run the server is by using the `make run` command. + ``` -npm build -``` \ No newline at end of file +$ make run +``` + +Running the command should also start the server on port `8080`. This command is equivalent to running `go run src/server.go`. diff --git a/auth-tokens.sample.json b/auth-tokens.sample.json deleted file mode 100644 index 5eda7381..00000000 --- a/auth-tokens.sample.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "FRONTEND_BASE": "http://localhost:3000/", - "JWT": { - "SECRET": "[YOUR_SECURE_GENERATED_TOKEN]" - }, - "GOOGLE": { - "CLIENT_ID": "[GOOGLE_OAUTH_CLIENT_ID]", - "CLIENT_SECRET": "[GOOGLE_OAUTH_CLIENT_SECRET]" - }, - "SENDGRID": { - "API_KEY": "[SENDGRID_API_KEY]" - } -} \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..e60151ae --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,34 @@ +version: '3.8' +services: + db: + image: postgres:14.1-alpine + restart: always + environment: + - POSTGRES_HOST=postgres + - POSTGRES_PORT=5432 + - POSTGRES_DB=postgres + - POSTGRES_USER=postgres + - POSTGRES_PASSWORD=postgres + ports: + - '5433:5432' + volumes: + - giftxtrade-db:/var/lib/postgresql/data + + db-test: + image: postgres:14.1-alpine + restart: always + environment: + - POSTGRES_HOST=postgres + - POSTGRES_PORT=5432 + - POSTGRES_DB=postgres + - POSTGRES_USER=postgres + - POSTGRES_PASSWORD=postgres + ports: + - '54322:5432' + volumes: + - giftxtrade-db-test:/var/lib/postgresql/data +volumes: + giftxtrade-db: + driver: local + giftxtrade-db-test: + driver: local diff --git a/go.mod b/go.mod new file mode 100644 index 00000000..085ef559 --- /dev/null +++ b/go.mod @@ -0,0 +1,162 @@ +module github.com/giftxtrade/api + +go 1.22 + +toolchain go1.22.6 + +require ( + github.com/ayaanqui/go-migration-tool v1.0.5 + github.com/go-playground/validator/v10 v10.22.0 + github.com/gofiber/fiber/v2 v2.51.0 + github.com/golang-jwt/jwt v3.2.2+incompatible + github.com/lib/pq v1.10.9 + gorm.io/gorm v1.25.5 +) + +require ( + dario.cat/mergo v1.0.0 // indirect + filippo.io/edwards25519 v1.1.0 // indirect + github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 // indirect + github.com/antlr4-go/antlr/v4 v4.13.0 // indirect + github.com/bep/godartsass v0.16.0 // indirect + github.com/bep/golibsass v1.1.0 // indirect + github.com/cenkalti/backoff/v4 v4.3.0 // indirect + github.com/cli/safeexec v1.0.0 // indirect + github.com/containerd/continuity v0.4.3 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect + github.com/creack/pty v1.1.18 // indirect + github.com/cubicdaiya/gonp v1.0.4 // indirect + github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/docker/cli v26.1.4+incompatible // indirect + github.com/docker/docker v27.1.1+incompatible // indirect + github.com/docker/go-connections v0.5.0 // indirect + github.com/docker/go-units v0.5.0 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/fatih/color v1.14.1 // indirect + github.com/fatih/structtag v1.2.0 // indirect + github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/go-sql-driver/mysql v1.8.1 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/gohugoio/hugo v0.111.3 // indirect + github.com/google/cel-go v0.18.2 // indirect + github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect + github.com/gosimple/unidecode v1.0.1 // indirect + github.com/gzuidhof/tygo v0.2.13 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/jackc/chunkreader/v2 v2.0.1 // indirect + github.com/jackc/pgconn v1.14.3 // indirect + github.com/jackc/pgio v1.0.0 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgproto3/v2 v2.3.3 // indirect + github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect + github.com/jackc/pgx/v5 v5.5.1 // indirect + github.com/jackc/puddle/v2 v2.2.1 // indirect + github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect + github.com/mattn/go-sqlite3 v1.14.18 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/moby/docker-image-spec v1.3.1 // indirect + github.com/moby/term v0.5.0 // indirect + github.com/opencontainers/go-digest v1.0.0 // indirect + github.com/opencontainers/image-spec v1.1.0 // indirect + github.com/opencontainers/runc v1.1.13 // indirect + github.com/ory/dockertest/v3 v3.11.0 // indirect + github.com/pelletier/go-toml v1.9.5 // indirect + github.com/pelletier/go-toml/v2 v2.0.6 // indirect + github.com/pganalyze/pg_query_go/v4 v4.2.4-0.20231205012101-7463430c7b73 // indirect + github.com/pingcap/errors v0.11.5-0.20210425183316-da1aaba5fb63 // indirect + github.com/pingcap/failpoint v0.0.0-20220801062533-2eaa32854a6c // indirect + github.com/pingcap/log v1.1.0 // indirect + github.com/pingcap/tidb/pkg/parser v0.0.0-20231103154709-4f00ece106b1 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect + github.com/riza-io/grpc-go v0.2.0 // indirect + github.com/russross/blackfriday/v2 v2.1.0 // indirect + github.com/sirupsen/logrus v1.9.3 // indirect + github.com/spf13/afero v1.9.3 // indirect + github.com/spf13/cobra v1.8.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/stoewer/go-strcase v1.2.0 // indirect + github.com/stretchr/testify v1.9.0 // indirect + github.com/tdewolff/parse/v2 v2.6.5 // indirect + github.com/tetratelabs/wazero v1.6.0 // indirect + github.com/urfave/cli v1.22.12 // indirect + github.com/wasilibs/go-pgquery v0.0.0-20231208014744-de63626a1e99 // indirect + github.com/wasilibs/wazerox v0.0.0-20231208014050-e6b725634531 // indirect + github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect + github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect + github.com/xeipuuv/gojsonschema v1.2.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.26.0 // indirect + golang.org/x/mod v0.13.0 // indirect + golang.org/x/sync v0.5.0 // indirect + golang.org/x/tools v0.14.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f // indirect + gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + lukechampine.com/uint128 v1.2.0 // indirect + modernc.org/cc/v3 v3.40.0 // indirect + modernc.org/ccgo/v3 v3.16.13 // indirect + modernc.org/libc v1.29.0 // indirect + modernc.org/mathutil v1.6.0 // indirect + modernc.org/memory v1.7.2 // indirect + modernc.org/opt v0.1.3 // indirect + modernc.org/sqlite v1.28.0 // indirect + modernc.org/strutil v1.2.0 // indirect + modernc.org/token v1.0.1 // indirect +) + +require ( + cloud.google.com/go/compute v1.23.3 // indirect + cloud.google.com/go/compute/metadata v0.2.3 // indirect + github.com/andybalholm/brotli v1.0.6 // indirect + github.com/cosmtrek/air v1.49.0 + github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/gabriel-vasile/mimetype v1.4.3 // indirect + github.com/go-jet/jet/v2 v2.11.1 + github.com/go-logr/logr v1.3.0 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/protobuf v1.5.3 // indirect + github.com/google/s2a-go v0.1.7 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect + github.com/googleapis/gax-go/v2 v2.12.0 // indirect + github.com/gosimple/slug v1.13.1 + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.5 // indirect + github.com/klauspost/compress v1.17.4 // indirect + github.com/leodido/go-urn v1.4.0 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-runewidth v0.0.15 // indirect + github.com/rakyll/gotest v0.0.6 + github.com/rivo/uniseg v0.2.0 // indirect + github.com/sqlc-dev/sqlc v1.25.0 + github.com/valyala/bytebufferpool v1.0.0 // indirect + github.com/valyala/fasthttp v1.51.0 // indirect + github.com/valyala/tcplisten v1.0.0 // indirect + go.opencensus.io v0.24.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 // indirect + go.opentelemetry.io/otel v1.21.0 // indirect + go.opentelemetry.io/otel/metric v1.21.0 // indirect + go.opentelemetry.io/otel/trace v1.21.0 // indirect + golang.org/x/crypto v0.22.0 // indirect + golang.org/x/exp v0.0.0-20231006140011-7918f672742d + golang.org/x/net v0.24.0 // indirect + golang.org/x/oauth2 v0.15.0 // indirect + golang.org/x/sys v0.21.0 // indirect + golang.org/x/text v0.14.0 // indirect + google.golang.org/api v0.154.0 + google.golang.org/appengine v1.6.8 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20231127180814-3a041ad873d4 // indirect + google.golang.org/grpc v1.60.1 // indirect + google.golang.org/protobuf v1.32.0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 00000000..7b51191b --- /dev/null +++ b/go.sum @@ -0,0 +1,953 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk= +cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= +cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= +dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= +dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= +filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= +github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= +github.com/andybalholm/brotli v1.0.6 h1:Yf9fFpf49Zrxb9NlQaluyE92/+X7UVHlhMNJN2sxfOI= +github.com/andybalholm/brotli v1.0.6/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI= +github.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g= +github.com/ayaanqui/go-migration-tool v1.0.5 h1:7ukBftAofzoqLSqFlWjq2wkLolxEt3KDW2pf2/vP3qA= +github.com/ayaanqui/go-migration-tool v1.0.5/go.mod h1:LjP69eoMjKlPehlIbHNRElMRdrbzo+lvx1FWIjLZjXA= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/bep/godartsass v0.16.0 h1:nTpenrZBQjVSjLkCw3AgnYmBB2czauTJa4BLLv448qg= +github.com/bep/godartsass v0.16.0/go.mod h1:6LvK9RftsXMxGfsA0LDV12AGc4Jylnu6NgHL+Q5/pE8= +github.com/bep/golibsass v1.1.0 h1:pjtXr00IJZZaOdfryNa9wARTB3Q0BmxC3/V1KNcgyTw= +github.com/bep/golibsass v1.1.0/go.mod h1:DL87K8Un/+pWUS75ggYv41bliGiolxzDKWJAq3eJ1MA= +github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/cli/safeexec v1.0.0 h1:0VngyaIyqACHdcMNWfo6+KdUYnqEr2Sg+bSP1pdF+dI= +github.com/cli/safeexec v1.0.0/go.mod h1:Z/D4tTN8Vs5gXYHDCbaM1S/anmEDnJb1iW0+EJ5zx3Q= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= +github.com/containerd/continuity v0.4.3 h1:6HVkalIp+2u1ZLH1J/pYX2oBVXlJZvh1X1A7bEZ9Su8= +github.com/containerd/continuity v0.4.3/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/cosmtrek/air v1.49.0 h1:/LfwnLquRoRyUO/K+m/6N5YpUkxcKcDGq2dH7RYbT9c= +github.com/cosmtrek/air v1.49.0/go.mod h1:yOz9vy7edZ75KRN9+Ofqwm3OU0wuv4Csc+ikMeZxxS8= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM= +github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= +github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= +github.com/cubicdaiya/gonp v1.0.4 h1:ky2uIAJh81WiLcGKBVD5R7KsM/36W6IqqTy6Bo6rGws= +github.com/cubicdaiya/gonp v1.0.4/go.mod h1:iWGuP/7+JVTn02OWhRemVbMmG1DOUnmrGTYYACpOI0I= +github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548 h1:iwZdTE0PVqJCos1vaoKsclOGD3ADKpshg3SRtYBbwso= +github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548/go.mod h1:e6NPNENfs9mPDVNRekM7lKScauxd5kXTr1Mfyig6TDM= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/docker/cli v26.1.4+incompatible h1:I8PHdc0MtxEADqYJZvhBrW9bo8gawKwwenxRM7/rLu8= +github.com/docker/cli v26.1.4+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/docker v27.1.1+incompatible h1:hO/M4MtV36kzKldqnA37IWhebRA+LnqqcqDja6kVaKY= +github.com/docker/docker v27.1.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= +github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= +github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fatih/color v1.14.1 h1:qfhVLaG5s+nCROl1zJsZRxFeYrHLqWroPOQ8BWiNb4w= +github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg= +github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= +github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= +github.com/felixge/fgprof v0.9.3/go.mod h1:RdbpDgzqYVh/T9fPELJyV7EYJuHB55UTEULNun8eiPw= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/frankban/quicktest v1.7.2/go.mod h1:jaStnuzAqU1AJdCO0l53JDCJrVDKcS03DbaAcR7Ks/o= +github.com/frankban/quicktest v1.14.2/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= +github.com/friendsofgo/errors v0.9.2/go.mod h1:yCvFW5AkDIL9qn7suHVLiI/gH228n7PC4Pn44IGoTOI= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= +github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= +github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= +github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-jet/jet/v2 v2.10.1 h1:mOKE5S+mt5bM/xNiuD7Dcz+FdqM83zg1FpOzfTJGJNw= +github.com/go-jet/jet/v2 v2.10.1/go.mod h1:XF5x5l7W4g7S9Rok9aXfPARFUyurl61nc+UNhuxKlYA= +github.com/go-jet/jet/v2 v2.11.1 h1:SEbh2lRUIiQweJpV0boWsQ4bV13x9p4h+RfajnL6vgM= +github.com/go-jet/jet/v2 v2.11.1/go.mod h1:+DTofDkGp1c0vpooXWEZyNhyi0k0mL7N2W9tdP4YqfA= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= +github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.16.0 h1:x+plE831WK4vaKHO/jpgUGsvLKIqRRkz6M78GuJAfGE= +github.com/go-playground/validator/v10 v10.16.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= +github.com/go-playground/validator/v10 v10.22.0 h1:k6HsTZ0sTnROkhS//R0O+55JgM8C4Bx7ia+JlgcnOao= +github.com/go-playground/validator/v10 v10.22.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= +github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI= +github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= +github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gofiber/fiber/v2 v2.51.0 h1:JNACcZy5e2tGApWB2QrRpenTWn0fq0hkFm6k0C86gKQ= +github.com/gofiber/fiber/v2 v2.51.0/go.mod h1:xaQRZQJGqnKOQnbQw+ltvku3/h8QxvNi8o6JiJ7Ll0U= +github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/gohugoio/hugo v0.111.3 h1:m98NJv/5ivJLkQ4u3vPYsrAfBTnDIefZPGhnw/7xW80= +github.com/gohugoio/hugo v0.111.3/go.mod h1:1gb2es3022plbaNiZjhBTdpXN2cepIeqvBnL/NHnKLY= +github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= +github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/cel-go v0.18.2 h1:L0B6sNBSVmt0OyECi8v6VOS74KOc9W/tLiWKfZABvf4= +github.com/google/cel-go v0.18.2/go.mod h1:kWcIzTsPX0zmQ+H3TirHstLLf9ep5QTsZBN9u4dOYLg= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20211214055906-6f57359322fd/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= +github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= +github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= +github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/gosimple/slug v1.13.1 h1:bQ+kpX9Qa6tHRaK+fZR0A0M2Kd7Pa5eHPPsb1JpHD+Q= +github.com/gosimple/slug v1.13.1/go.mod h1:UiRaFH+GEilHstLUmcBgWcI42viBN7mAb818JrYOeFQ= +github.com/gosimple/unidecode v1.0.1 h1:hZzFTMMqSswvf0LBJZCZgThIZrpDHFXux9KeGmn6T/o= +github.com/gosimple/unidecode v1.0.1/go.mod h1:CP0Cr1Y1kogOtx0bJblKzsVWrqYaqfNOnHzpgWw4Awc= +github.com/gzuidhof/tygo v0.2.13 h1:aCPwb+N5Oh5pP3HiC/3a3Jwq4QXmMZPhRMCZu927yHg= +github.com/gzuidhof/tygo v0.2.13/go.mod h1:s3lpnppkDixQQhMWD78yPtAmugMHENsPWpQYziUIpw0= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0= +github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= +github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= +github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= +github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= +github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA= +github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE= +github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s= +github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= +github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY= +github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= +github.com/jackc/pgconn v1.14.0/go.mod h1:9mBNlny0UvkgJdCDvdVHYSjI+8tD2rnKK69Wz8ti++E= +github.com/jackc/pgconn v1.14.1 h1:smbxIaZA08n6YuxEX1sDyjV/qkbtUtkH20qLkR9MUR4= +github.com/jackc/pgconn v1.14.1/go.mod h1:9mBNlny0UvkgJdCDvdVHYSjI+8tD2rnKK69Wz8ti++E= +github.com/jackc/pgconn v1.14.3 h1:bVoTr12EGANZz66nZPkMInAV/KHD2TxH9npjXXgiB3w= +github.com/jackc/pgconn v1.14.3/go.mod h1:RZbme4uasqzybK2RK5c65VsHxoyaml09lx3tXOcO/VM= +github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= +github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= +github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= +github.com/jackc/pgmock v0.0.0-20201204152224-4fe30f7445fd/go.mod h1:hrBW0Enj2AZTNpt/7Y5rr2xe/9Mn757Wtb2xeBzPv2c= +github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgproto3 v1.1.0 h1:FYYE4yRw+AgI8wXIinMlNjBbp/UitDJwfj5LqqewP1A= +github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= +github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= +github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= +github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= +github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= +github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.3.2 h1:7eY55bdBeCz1F2fTzSz69QC+pG46jYq9/jtSPiJ5nn0= +github.com/jackc/pgproto3/v2 v2.3.2/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.3.3 h1:1HLSx5H+tXR9pW3in3zaztoEwQYRC9SQaYUHjTSUOag= +github.com/jackc/pgproto3/v2 v2.3.3/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= +github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= +github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= +github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM= +github.com/jackc/pgtype v1.14.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= +github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= +github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= +github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= +github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs= +github.com/jackc/pgx/v4 v4.18.1/go.mod h1:FydWkUyadDmdNH/mHnGob881GawxeEm7TcMCzkb+qQE= +github.com/jackc/pgx/v5 v5.5.1 h1:5I9etrGkLrN+2XPCsi6XLlV5DITbSL/xBZdmAxFcXPI= +github.com/jackc/pgx/v5 v5.5.1/go.mod h1:Ig06C2Vu0t5qXC60W8sqIthScaEnFvojjj9dSljmHRA= +github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.3.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= +github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= +github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4= +github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= +github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.8/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= +github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= +github.com/mattn/go-sqlite3 v1.14.18 h1:JL0eqdCOq6DJVNPSvArO/bIV9/P7fbGrV00LZHc+5aI= +github.com/mattn/go-sqlite3 v1.14.18/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= +github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= +github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= +github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= +github.com/opencontainers/runc v1.1.13 h1:98S2srgG9vw0zWcDpFMn5TRrh8kLxa/5OFUstuUhmRs= +github.com/opencontainers/runc v1.1.13/go.mod h1:R016aXacfp/gwQBYw2FDGa9m+n6atbLWrYY8hNMT/sA= +github.com/ory/dockertest/v3 v3.11.0 h1:OiHcxKAvSDUwsEVh2BjxQQc/5EHz9n0va9awCtNGuyA= +github.com/ory/dockertest/v3 v3.11.0/go.mod h1:VIPxS1gwT9NpPOrfD3rACs8Y9Z7yhzO4SB194iUDnUI= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU= +github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= +github.com/pganalyze/pg_query_go/v4 v4.2.4-0.20231205012101-7463430c7b73 h1:vZEujakYrBzd7CWMwqTsDRU7bdRm4Aiu76X9K3P+qtI= +github.com/pganalyze/pg_query_go/v4 v4.2.4-0.20231205012101-7463430c7b73/go.mod h1:pRJ9rCcWIhDLAzymhH2iY5kEVEfU6UGrL1wBWuO7gmM= +github.com/pingcap/errors v0.11.0/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pingcap/errors v0.11.5-0.20210425183316-da1aaba5fb63 h1:+FZIDR/D97YOPik4N4lPDaUcLDF/EQPogxtlHB2ZZRM= +github.com/pingcap/errors v0.11.5-0.20210425183316-da1aaba5fb63/go.mod h1:X2r9ueLEUZgtx2cIogM0v4Zj5uvvzhuuiu7Pn8HzMPg= +github.com/pingcap/failpoint v0.0.0-20220801062533-2eaa32854a6c h1:CgbKAHto5CQgWM9fSBIvaxsJHuGP0uM74HXtv3MyyGQ= +github.com/pingcap/failpoint v0.0.0-20220801062533-2eaa32854a6c/go.mod h1:4qGtCB0QK0wBzKtFEGDhxXnSnbQApw1gc9siScUl8ew= +github.com/pingcap/log v1.1.0 h1:ELiPxACz7vdo1qAvvaWJg1NrYFoY6gqAh/+Uo6aXdD8= +github.com/pingcap/log v1.1.0/go.mod h1:DWQW5jICDR7UJh4HtxXSM20Churx4CQL0fwL/SoOSA4= +github.com/pingcap/tidb/pkg/parser v0.0.0-20231103154709-4f00ece106b1 h1:SwGY3zMnK4wO85vvRIqrR3Yh6VpIC9pydG0QNOUPHCY= +github.com/pingcap/tidb/pkg/parser v0.0.0-20231103154709-4f00ece106b1/go.mod h1:yRkiqLFwIqibYg2P7h4bclHjHcJiIFRLKhGRyBcKYus= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/profile v1.7.0/go.mod h1:8Uer0jas47ZQMJ7VD+OHknK4YDY07LPUC6dEvqDjvNo= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/rakyll/gotest v0.0.6 h1:hBTqkO3jiuwYW/M9gL4bu0oTYcm8J6knQAAPUsJsz1I= +github.com/rakyll/gotest v0.0.6/go.mod h1:SkoesdNCWmiD4R2dljIUcfSnNdVZ12y8qK4ojDkc2Sc= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/riza-io/grpc-go v0.2.0 h1:2HxQKFVE7VuYstcJ8zqpN84VnAoJ4dCL6YFhJewNcHQ= +github.com/riza-io/grpc-go v0.2.0/go.mod h1:2bDvR9KkKC3KhtlSHfR3dAXjUMT86kg4UfWFyVGWqi8= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= +github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= +github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/spf13/afero v1.9.3 h1:41FoI0fD7OR7mGcKE/aOiLkGreyf8ifIOQmJANWogMk= +github.com/spf13/afero v1.9.3/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= +github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= +github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/sqlc-dev/sqlc v1.25.0 h1:+lI62q7IiLeEwM1tuX5dRmIKi2sdWY5Yd1d93VRRdQw= +github.com/sqlc-dev/sqlc v1.25.0/go.mod h1:f2/ok8PBTvvf4KPZuofiksVOB0OCKGLWp+wyxTHapp8= +github.com/stoewer/go-strcase v1.2.0 h1:Z2iHWqGXH00XYgqDmNgQbIBxf3wrNq0F3feEy0ainaU= +github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/tdewolff/parse/v2 v2.6.5 h1:lYvWBk55GkqKl0JJenGpmrgu/cPHQQ6/Mm1hBGswoGQ= +github.com/tdewolff/parse/v2 v2.6.5/go.mod h1:woz0cgbLwFdtbjJu8PIKxhW05KplTFQkOdX78o+Jgrs= +github.com/tdewolff/test v1.0.7/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE= +github.com/tetratelabs/wazero v1.6.0 h1:z0H1iikCdP8t+q341xqepY4EWvHEw8Es7tlqiVzlP3g= +github.com/tetratelabs/wazero v1.6.0/go.mod h1:0U0G41+ochRKoPKCJlh0jMg1CHkyfK8kDqiirMmKY8A= +github.com/urfave/cli v1.22.12 h1:igJgVw1JdKH+trcLWLeLwZjU9fEfPesQ+9/e4MQ44S8= +github.com/urfave/cli v1.22.12/go.mod h1:sSBEIC79qR6OvcmsD4U3KABeOTxDqQtdDnaFuUN30b8= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.51.0 h1:8b30A5JlZ6C7AS81RsWjYMQmrZG6feChmgAolCl1SqA= +github.com/valyala/fasthttp v1.51.0/go.mod h1:oI2XroL+lI7vdXyYoQk03bXBThfFl2cVdIA3Xl7cH8g= +github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= +github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= +github.com/volatiletech/inflect v0.0.1/go.mod h1:IBti31tG6phkHitLlr5j7shC5SOo//x0AjDzaJU1PLA= +github.com/volatiletech/null/v8 v8.1.2/go.mod h1:98DbwNoKEpRrYtGjWFctievIfm4n4MxG0A6EBUcoS5g= +github.com/volatiletech/randomize v0.0.1/go.mod h1:GN3U0QYqfZ9FOJ67bzax1cqZ5q2xuj2mXrXBjWaRTlY= +github.com/volatiletech/strmangle v0.0.1/go.mod h1:F6RA6IkB5vq0yTG4GQ0UsbbRcl3ni9P76i+JrTBKFFg= +github.com/wasilibs/go-pgquery v0.0.0-20231208014744-de63626a1e99 h1:HFee1ByN4FrqNVd53Mo28ccGO+g5gxqUV/gdvKMe4b8= +github.com/wasilibs/go-pgquery v0.0.0-20231208014744-de63626a1e99/go.mod h1:f2JMhFocVxY3VKMd9ykUxMnX4EVew9WOgjnfaNBB6C8= +github.com/wasilibs/wazerox v0.0.0-20231208014050-e6b725634531 h1:zVJ4SZgaEE9sEH2L9k1+eAvCNa/WAAnT9UiMa3/tQrI= +github.com/wasilibs/wazerox v0.0.0-20231208014050-e6b725634531/go.mod h1:IQNVyA4d1hWIe23mlMMuqXjyWMdndgSlNx6FqBkwPsM= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 h1:aFJWCqJMNjENlcleuuOkGAPH82y0yULBScfXcIEdS24= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1/go.mod h1:sEGXWArGqc3tVa+ekntsN65DmVbVeW+7lTKTjZF3/Fo= +go.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc= +go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= +go.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4= +go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= +go.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc= +go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= +go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= +go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= +golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= +golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= +golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= +golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI= +golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.13.0 h1:I/DsJXRlw/8l/0c24sM9yb0T4z9liZTduXvdAWYiysY= +golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= +golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= +golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.15.0 h1:s8pnnxNVzjWyrvYdFUQq5llS1PX2zhPXmccZv99h7uQ= +golang.org/x/oauth2 v0.15.0/go.mod h1:q48ptWNTY5XWf+JNten23lcvHpLJ0ZSxF5ttTHKVCAM= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= +golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.14.0 h1:jvNa2pY0M4r62jkRQ6RwEZZyPcymeL9XZMLBbV7U2nc= +golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= +golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.154.0 h1:X7QkVKZBskztmpPKWQXgjJRPA2dJYrL6r+sYPRLj050= +google.golang.org/api v0.154.0/go.mod h1:qhSMkM85hgqiokIYsrRyKxrjfBeIhgl4Z2JmeRkYylc= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20231120223509-83a465c0220f h1:Vn+VyHU5guc9KjB5KrjI2q0wCOWEOIh0OEsleqakHJg= +google.golang.org/genproto v0.0.0-20231120223509-83a465c0220f/go.mod h1:nWSwAFPb+qfNJXsoeO3Io7zf4tMSfN8EA8RlDA04GhY= +google.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f h1:2yNACc1O40tTnrsbk9Cv6oxiW8pxI/pXj0wRtdlYmgY= +google.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f/go.mod h1:Uy9bTZJqmfrw2rIBxgGLnamc78euZULUBrLZ9XTITKI= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231127180814-3a041ad873d4 h1:DC7wcm+i+P1rN3Ff07vL+OndGg5OhNddHyTA+ocPqYE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231127180814-3a041ad873d4/go.mod h1:eJVxU6o+4G1PSczBr85xmyvSNYAKvAYgkub40YGomFM= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= +google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= +google.golang.org/grpc v1.60.1 h1:26+wFr+cNqSGFcOXcabYC0lUVJVRa2Sb2ortSK7VrEU= +google.golang.org/grpc v1.60.1/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/guregu/null.v4 v4.0.0/go.mod h1:YoQhUrADuG3i9WqesrCmpNRwm1ypAgSHYqoOcTu/JrI= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls= +gorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +lukechampine.com/uint128 v1.2.0 h1:mBi/5l91vocEN8otkC5bDLhi2KdCticRiwbdB0O+rjI= +lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +modernc.org/cc/v3 v3.40.0 h1:P3g79IUS/93SYhtoeaHW+kRCIrYaxJ27MFPv+7kaTOw= +modernc.org/cc/v3 v3.40.0/go.mod h1:/bTg4dnWkSXowUO6ssQKnOV0yMVxDYNIsIrzqTFDGH0= +modernc.org/ccgo/v3 v3.16.13 h1:Mkgdzl46i5F/CNR/Kj80Ri59hC8TKAhZrYSaqvkwzUw= +modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY= +modernc.org/libc v1.29.0 h1:tTFRFq69YKCF2QyGNuRUQxKBm1uZZLubf6Cjh/pVHXs= +modernc.org/libc v1.29.0/go.mod h1:DaG/4Q3LRRdqpiLyP0C2m1B8ZMGkQ+cCgOIjEtQlYhQ= +modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= +modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= +modernc.org/memory v1.7.2 h1:Klh90S215mmH8c9gO98QxQFsY+W451E8AnzjoE2ee1E= +modernc.org/memory v1.7.2/go.mod h1:NO4NVCQy0N7ln+T9ngWqOQfi7ley4vpwvARR+Hjw95E= +modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= +modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/sqlite v1.28.0 h1:Zx+LyDDmXczNnEQdvPuEfcFVA2ZPyaD7UCZDjef3BHQ= +modernc.org/sqlite v1.28.0/go.mod h1:Qxpazz0zH8Z1xCFyi5GSL3FzbtZ3fvbjmywNogldEW0= +modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= +modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= +modernc.org/token v1.0.1 h1:A3qvTqOwexpfZZeyI0FeGPDlSWX5pjZu9hF4lU+EKWg= +modernc.org/token v1.0.1/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/makefile b/makefile new file mode 100644 index 00000000..1fafc181 --- /dev/null +++ b/makefile @@ -0,0 +1,29 @@ +sqlc: + go run github.com/sqlc-dev/sqlc/cmd/sqlc generate + +jet: + go run github.com/go-jet/jet/v2/cmd/jet -dsn=postgresql://postgres:postgres@localhost:5433/postgres?sslmode=disable -path=./src/database/jet + +create-migration: + go run github.com/ayaanqui/go-migration-tool --directory "./src/database/migrations" create-migration $(fileName) + +docker-container: + docker compose -f ./docker-compose.yml up + +build: + make sqlc && go build src/server.go + +run: + make sqlc && go run src/server.go + +watch: + go run github.com/cosmtrek/air -c .air.toml -- -h + +test: + make sqlc && go run github.com/rakyll/gotest -v ./src/tests + +ts: + go run github.com/gzuidhof/tygo generate && go run ts_types/version.go + +ts_publish: + npm publish --access public diff --git a/nest-cli.json b/nest-cli.json deleted file mode 100644 index 56167b36..00000000 --- a/nest-cli.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "collection": "@nestjs/schematics", - "sourceRoot": "src" -} diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index a28a0c10..00000000 --- a/package-lock.json +++ /dev/null @@ -1,21200 +0,0 @@ -{ - "name": "api", - "version": "0.0.1", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "version": "0.0.1", - "license": "UNLICENSED", - "dependencies": { - "@nestjs/common": "^7.6.15", - "@nestjs/core": "^7.6.15", - "@nestjs/jwt": "^7.2.0", - "@nestjs/mapped-types": "*", - "@nestjs/passport": "^7.1.5", - "@nestjs/platform-express": "^7.6.15", - "@nestjs/serve-static": "^2.1.4", - "@nestjs/typeorm": "^7.1.5", - "@sendgrid/mail": "^7.4.5", - "dotenv": "^8.6.0", - "express-session": "^1.17.2", - "mysql2": "^2.2.5", - "passport": "^0.4.1", - "passport-google-oauth20": "^2.0.0", - "passport-jwt": "^4.0.0", - "passport-local": "^1.0.0", - "passport-twitter": "^0.1.5", - "randomstring": "^1.2.1", - "reflect-metadata": "^0.1.13", - "rimraf": "^3.0.2", - "rxjs": "^6.6.6", - "slugify": "^1.6.0", - "typeorm": "^0.2.34" - }, - "devDependencies": { - "@nestjs/cli": "^7.6.0", - "@nestjs/schematics": "^7.3.0", - "@nestjs/testing": "^7.6.15", - "@types/express": "^4.17.11", - "@types/express-session": "^1.17.3", - "@types/jest": "^26.0.22", - "@types/node": "^14.14.36", - "@types/passport-google-oauth20": "^2.0.8", - "@types/passport-jwt": "^3.0.5", - "@types/passport-local": "^1.0.33", - "@types/supertest": "^2.0.10", - "@typescript-eslint/eslint-plugin": "^4.19.0", - "@typescript-eslint/parser": "^4.19.0", - "eslint": "^7.22.0", - "eslint-config-prettier": "^8.1.0", - "eslint-plugin-prettier": "^3.3.1", - "jest": "^26.6.3", - "prettier": "^2.2.1", - "supertest": "^6.1.3", - "ts-jest": "^26.5.4", - "ts-loader": "^8.0.18", - "ts-node": "^9.1.1", - "tsconfig-paths": "^3.9.0", - "typescript": "^4.2.3" - } - }, - "node_modules/@angular-devkit/core": { - "version": "11.2.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-11.2.6.tgz", - "integrity": "sha512-3dA0Z6sIIxCDjZS/DucgmIKti7EZ/LgHoHgCO72Q50H5ZXbUSNBz5wGl5hVq2+gzrnFgU/0u40MIs6eptk30ZA==", - "dev": true, - "dependencies": { - "ajv": "6.12.6", - "fast-json-stable-stringify": "2.1.0", - "magic-string": "0.25.7", - "rxjs": "6.6.3", - "source-map": "0.7.3" - }, - "engines": { - "node": ">= 10.13.0", - "npm": "^6.11.0 || ^7.5.6", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular-devkit/core/node_modules/rxjs": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", - "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", - "dev": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/@angular-devkit/core/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/@angular-devkit/schematics": { - "version": "11.2.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-11.2.6.tgz", - "integrity": "sha512-bhi2+5xtVAjtr3bsXKT8pnoBamQrArd/Y20ueA4Od7cd38YT97nzTA1wyHBFG0vWd0HMyg42ZS0aycNBuOebaA==", - "dev": true, - "dependencies": { - "@angular-devkit/core": "11.2.6", - "ora": "5.3.0", - "rxjs": "6.6.3" - }, - "engines": { - "node": ">= 10.13.0", - "npm": "^6.11.0 || ^7.5.6", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular-devkit/schematics-cli": { - "version": "0.1102.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics-cli/-/schematics-cli-0.1102.6.tgz", - "integrity": "sha512-86PmafA9mYDeM08cNWHcJCEY1Yqo5aq/YaBzCak93luByDQ4Ao4Jqts9l/xBCZBGUdVrczCNzcdwr/Y/6JPPzA==", - "dev": true, - "dependencies": { - "@angular-devkit/core": "11.2.6", - "@angular-devkit/schematics": "11.2.6", - "@schematics/schematics": "0.1102.6", - "ansi-colors": "4.1.1", - "inquirer": "7.3.3", - "minimist": "1.2.5", - "symbol-observable": "3.0.0" - }, - "bin": { - "schematics": "bin/schematics.js" - }, - "engines": { - "node": ">= 10.13.0", - "npm": "^6.11.0 || ^7.5.6", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular-devkit/schematics/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@angular-devkit/schematics/node_modules/ora": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", - "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", - "dev": true, - "dependencies": { - "bl": "^4.0.3", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "log-symbols": "^4.0.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@angular-devkit/schematics/node_modules/rxjs": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", - "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", - "dev": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/@angular-devkit/schematics/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.14.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.4.tgz", - "integrity": "sha512-i2wXrWQNkH6JplJQGn3Rd2I4Pij8GdHkXwHMxm+zV5YG/Jci+bCNrWZEWC4o+umiDkRrRs4dVzH3X4GP7vyjQQ==", - "dev": true - }, - "node_modules/@babel/core": { - "version": "7.14.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.3.tgz", - "integrity": "sha512-jB5AmTKOCSJIZ72sd78ECEhuPiDMKlQdDI/4QRI6lzYATx5SSogS1oQA2AoPecRCknm30gHi2l+QVvNUu3wZAg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.14.3", - "@babel/helper-compilation-targets": "^7.13.16", - "@babel/helper-module-transforms": "^7.14.2", - "@babel/helpers": "^7.14.0", - "@babel/parser": "^7.14.3", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.14.2", - "@babel/types": "^7.14.2", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.12.13" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/core/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@babel/generator": { - "version": "7.14.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.3.tgz", - "integrity": "sha512-bn0S6flG/j0xtQdz3hsjJ624h3W0r3llttBMfyHX3YrZ/KtLYr15bjA0FXkgW7FpvrDuTuElXeVjiKlYRpnOFA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.14.2", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "node_modules/@babel/generator/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.14.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.4.tgz", - "integrity": "sha512-JgdzOYZ/qGaKTVkn5qEDV/SXAh8KcyUVkCoSWGN8T3bwrgd6m+/dJa2kVGi6RJYJgEYPBdZ84BZp9dUjNWkBaA==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.14.4", - "@babel/helper-validator-option": "^7.12.17", - "browserslist": "^4.16.6", - "semver": "^6.3.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz", - "integrity": "sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==", - "dev": true, - "dependencies": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.14.2" - } - }, - "node_modules/@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.12.13" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", - "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.13.12" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", - "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.13.12" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.2.tgz", - "integrity": "sha512-OznJUda/soKXv0XhpvzGWDnml4Qnwp16GN+D/kZIdLsWoHj05kyu8Rm5kXmMef+rVJZ0+4pSGLkeixdqNUATDA==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.13.12", - "@babel/helper-replace-supers": "^7.13.12", - "@babel/helper-simple-access": "^7.13.12", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/helper-validator-identifier": "^7.14.0", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.14.2", - "@babel/types": "^7.14.2" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", - "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.12.13" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.14.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.4.tgz", - "integrity": "sha512-zZ7uHCWlxfEAAOVDYQpEf/uyi1dmeC7fX4nCf2iz9drnCwi1zvwXL3HwWWNXUQEJ1k23yVn3VbddiI9iJEXaTQ==", - "dev": true, - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.13.12", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/traverse": "^7.14.2", - "@babel/types": "^7.14.4" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", - "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.13.12" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.12.13" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", - "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", - "dev": true - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", - "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==", - "dev": true - }, - "node_modules/@babel/helpers": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.0.tgz", - "integrity": "sha512-+ufuXprtQ1D1iZTO/K9+EBRn+qPWMJjZSw/S0KlFrxCw4tkrzv9grgpDHkY9MeQTjTY8i2sp7Jep8DfU6tN9Mg==", - "dev": true, - "dependencies": { - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.14.0", - "@babel/types": "^7.14.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", - "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.0", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.14.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.4.tgz", - "integrity": "sha512-ArliyUsWDUqEGfWcmzpGUzNfLxTdTp6WU4IuP6QFSp9gGfWS6boxFCkJSJ/L4+RG8z/FnIU3WxCk6hPL9SSWeA==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "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", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz", - "integrity": "sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "node_modules/@babel/template/node_modules/@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.12.13" - } - }, - "node_modules/@babel/traverse": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.2.tgz", - "integrity": "sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.14.2", - "@babel/helper-function-name": "^7.14.2", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.14.2", - "@babel/types": "^7.14.2", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "node_modules/@babel/traverse/node_modules/@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.12.13" - } - }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/types": { - "version": "7.14.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.4.tgz", - "integrity": "sha512-lCj4aIs0xUefJFQnwwQv2Bxg7Omd6bgquZ6LGC+gGMh6/s5qDVfjuCMlDmYQ15SLsWHd9n+X3E75lKIhl5Lkiw==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.0", - "to-fast-properties": "^2.0.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "node_modules/@cnakazawa/watch": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", - "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", - "dev": true, - "dependencies": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" - }, - "bin": { - "watch": "cli.js" - }, - "engines": { - "node": ">=0.1.95" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.2.tgz", - "integrity": "sha512-8nmGq/4ycLpIwzvhI4tNDmQztZ8sp+hI7cyG8i1nQDhkAbRzHpXPidRAHlNvCZQpJTKw5ItIpMw9RSToGF00mg==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", - "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", - "dev": true, - "dependencies": { - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^26.6.2", - "jest-util": "^26.6.2", - "slash": "^3.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/console/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/core": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", - "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", - "dev": true, - "dependencies": { - "@jest/console": "^26.6.2", - "@jest/reporters": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-changed-files": "^26.6.2", - "jest-config": "^26.6.3", - "jest-haste-map": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-resolve-dependencies": "^26.6.3", - "jest-runner": "^26.6.3", - "jest-runtime": "^26.6.3", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "jest-watcher": "^26.6.2", - "micromatch": "^4.0.2", - "p-each-series": "^2.1.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/core/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/environment": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", - "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", - "dev": true, - "dependencies": { - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "jest-mock": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/fake-timers": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", - "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", - "dev": true, - "dependencies": { - "@jest/types": "^26.6.2", - "@sinonjs/fake-timers": "^6.0.1", - "@types/node": "*", - "jest-message-util": "^26.6.2", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/globals": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", - "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", - "dev": true, - "dependencies": { - "@jest/environment": "^26.6.2", - "@jest/types": "^26.6.2", - "expect": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/reporters": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", - "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", - "dev": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.4", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.3", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "jest-haste-map": "^26.6.2", - "jest-resolve": "^26.6.2", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "node-notifier": "^8.0.0", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^7.0.0" - }, - "engines": { - "node": ">= 10.14.2" - }, - "optionalDependencies": { - "node-notifier": "^8.0.0" - } - }, - "node_modules/@jest/reporters/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/reporters/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@jest/source-map": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", - "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.4", - "source-map": "^0.6.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/source-map/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@jest/test-result": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", - "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", - "dev": true, - "dependencies": { - "@jest/console": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", - "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", - "dev": true, - "dependencies": { - "@jest/test-result": "^26.6.2", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.2", - "jest-runner": "^26.6.3", - "jest-runtime": "^26.6.3" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/transform": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", - "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.1.0", - "@jest/types": "^26.6.2", - "babel-plugin-istanbul": "^6.0.0", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-util": "^26.6.2", - "micromatch": "^4.0.2", - "pirates": "^4.0.1", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/transform/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/transform/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@jest/types": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/types/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "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/@nestjs/cli": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-7.6.0.tgz", - "integrity": "sha512-lW1px2gSHkRoBpKSxzP6IJNQscRKs97OAaVyV46OAP6oUR996E0EPkIslIaa16kKLJ3SFOUeZo5xl5nYbqp43g==", - "dev": true, - "dependencies": { - "@angular-devkit/core": "11.2.6", - "@angular-devkit/schematics": "11.2.6", - "@angular-devkit/schematics-cli": "0.1102.6", - "@nestjs/schematics": "^7.3.0", - "chalk": "3.0.0", - "chokidar": "3.5.1", - "cli-table3": "0.5.1", - "commander": "4.1.1", - "fork-ts-checker-webpack-plugin": "6.2.0", - "inquirer": "7.3.3", - "node-emoji": "1.10.0", - "ora": "5.4.0", - "os-name": "4.0.0", - "rimraf": "3.0.2", - "shelljs": "0.8.4", - "tree-kill": "1.2.2", - "tsconfig-paths": "3.9.0", - "tsconfig-paths-webpack-plugin": "3.5.1", - "typescript": "4.2.3", - "webpack": "5.28.0", - "webpack-node-externals": "2.5.2" - }, - "bin": { - "nest": "bin/nest.js" - }, - "engines": { - "node": ">= 10.13.0", - "npm": ">= 6.11.0" - } - }, - "node_modules/@nestjs/cli/node_modules/@types/estree": { - "version": "0.0.46", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.46.tgz", - "integrity": "sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg==", - "dev": true - }, - "node_modules/@nestjs/cli/node_modules/acorn": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.3.0.tgz", - "integrity": "sha512-tqPKHZ5CaBJw0Xmy0ZZvLs1qTV+BNFSyvn77ASXkpBNfIRk8ev26fKrD9iLGwGA9zedPao52GSHzq8lyZG0NUw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/@nestjs/cli/node_modules/enhanced-resolve": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.2.tgz", - "integrity": "sha512-F27oB3WuHDzvR2DOGNTaYy0D5o0cnrv8TeI482VM4kYgQd/FT9lUQwuNsJ0oOHtBUq7eiW5ytqzp7nBFknL+GA==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@nestjs/cli/node_modules/schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/@nestjs/cli/node_modules/tapable": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz", - "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@nestjs/cli/node_modules/typescript": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz", - "integrity": "sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/@nestjs/cli/node_modules/webpack": { - "version": "5.28.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.28.0.tgz", - "integrity": "sha512-1xllYVmA4dIvRjHzwELgW4KjIU1fW4PEuEnjsylz7k7H5HgPOctIq7W1jrt3sKH9yG5d72//XWzsHhfoWvsQVg==", - "dev": true, - "dependencies": { - "@types/eslint-scope": "^3.7.0", - "@types/estree": "^0.0.46", - "@webassemblyjs/ast": "1.11.0", - "@webassemblyjs/wasm-edit": "1.11.0", - "@webassemblyjs/wasm-parser": "1.11.0", - "acorn": "^8.0.4", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.7.0", - "es-module-lexer": "^0.4.0", - "eslint-scope": "^5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.4", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.0.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.1", - "watchpack": "^2.0.0", - "webpack-sources": "^2.1.1" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/@nestjs/common": { - "version": "7.6.17", - "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-7.6.17.tgz", - "integrity": "sha512-RHvD32FxfV7yDWX9GPmn0ZSv7ka5kLeVamU5ZpoXSTUjkGqWFt3MTyIP+HUQD2778kDqT+CgEtVJ1fxDG5Oh9g==", - "dependencies": { - "axios": "0.21.1", - "iterare": "1.2.1", - "tslib": "2.2.0", - "uuid": "8.3.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nest" - }, - "peerDependencies": { - "cache-manager": "*", - "class-transformer": "*", - "class-validator": "*", - "reflect-metadata": "^0.1.12", - "rxjs": "^6.0.0" - }, - "peerDependenciesMeta": { - "cache-manager": { - "optional": true - }, - "class-transformer": { - "optional": true - }, - "class-validator": { - "optional": true - } - } - }, - "node_modules/@nestjs/core": { - "version": "7.6.17", - "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-7.6.17.tgz", - "integrity": "sha512-dH7PGDj1dvBfOYgxJlxh54vdnFFSLst7+Spg3E7Jpo+n11Ht5Ee5mTjSzXieRVfFba/sI3NIHF/N1stn36bU9w==", - "hasInstallScript": true, - "dependencies": { - "@nuxtjs/opencollective": "0.3.2", - "fast-safe-stringify": "2.0.7", - "iterare": "1.2.1", - "object-hash": "2.1.1", - "path-to-regexp": "3.2.0", - "tslib": "2.2.0", - "uuid": "8.3.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nest" - }, - "peerDependencies": { - "@nestjs/common": "^7.0.0", - "@nestjs/microservices": "^7.0.0", - "@nestjs/platform-express": "^7.0.0", - "@nestjs/websockets": "^7.0.0", - "reflect-metadata": "^0.1.12", - "rxjs": "^6.0.0" - }, - "peerDependenciesMeta": { - "@nestjs/microservices": { - "optional": true - }, - "@nestjs/platform-express": { - "optional": true - }, - "@nestjs/websockets": { - "optional": true - } - } - }, - "node_modules/@nestjs/jwt": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@nestjs/jwt/-/jwt-7.2.0.tgz", - "integrity": "sha512-uOTqYmWNpu+oS/MrdYjrWXtKGV4HkCYmAEVEFPP/KfiP/7K6fNy+boLllE6cnqESAXh9u0CLa1noAAavs+LHEQ==", - "dependencies": { - "@types/jsonwebtoken": "8.5.0", - "jsonwebtoken": "8.5.1" - }, - "peerDependencies": { - "@nestjs/common": "^6.0.0 || ^7.0.0" - } - }, - "node_modules/@nestjs/mapped-types": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-0.4.1.tgz", - "integrity": "sha512-JXrw2LMangSU3vnaXWXVX47GRG1FbbNh4aVBbidDjxT3zlghsoNQY6qyWtT001MCl8lJGo8I6i6+DurBRRxl/Q==", - "peerDependencies": { - "@nestjs/common": "^7.0.8", - "class-transformer": "^0.2.0 || ^0.3.0 || ^0.4.0", - "class-validator": "^0.11.1 || ^0.12.0 || ^0.13.0", - "reflect-metadata": "^0.1.12" - } - }, - "node_modules/@nestjs/passport": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/@nestjs/passport/-/passport-7.1.5.tgz", - "integrity": "sha512-Hu9hPxTdBZA0C4GrWTsSflzwsJ99oAk9jqAwpcszdFNqfjMjkPGuCM9QsVZbBP2bE8fxrVrPsNOILS6puY8e/A==", - "peerDependencies": { - "@nestjs/common": "^6.0.0 || ^7.0.0", - "passport": "^0.4.0" - } - }, - "node_modules/@nestjs/platform-express": { - "version": "7.6.17", - "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-7.6.17.tgz", - "integrity": "sha512-lyMwx8X/zTXZzxrd6Xn8BEcS/wuFyEgRVk9f15Z29hSaWHd78mUlBXvSnKJpzsN7wTjU8YWbAy/Ig9kIBS6efg==", - "dependencies": { - "body-parser": "1.19.0", - "cors": "2.8.5", - "express": "4.17.1", - "multer": "1.4.2", - "tslib": "2.2.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nest" - }, - "peerDependencies": { - "@nestjs/common": "^7.0.0", - "@nestjs/core": "^7.0.0" - } - }, - "node_modules/@nestjs/schematics": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-7.3.1.tgz", - "integrity": "sha512-eyBjJstAjecpdzRuBLiqnwomwXIAEV3+kPkpaphOieRUM6nBhjnXCCl3Qf8Dul2QUQK4NOVPd8FFxWtGP5XNlg==", - "dev": true, - "dependencies": { - "@angular-devkit/core": "11.2.4", - "@angular-devkit/schematics": "11.2.4", - "fs-extra": "9.1.0", - "jsonc-parser": "3.0.0", - "pluralize": "8.0.0" - }, - "peerDependencies": { - "typescript": "^3.4.5 || ^4.0.0" - } - }, - "node_modules/@nestjs/schematics/node_modules/@angular-devkit/core": { - "version": "11.2.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-11.2.4.tgz", - "integrity": "sha512-98mGDV4XtKWiQ/2D6yzvOHrnJovXchaAN9AjscAHd2an8Fkiq72d9m2wREpk+2J40NWTDB6J5iesTh3qbi8+CA==", - "dev": true, - "dependencies": { - "ajv": "6.12.6", - "fast-json-stable-stringify": "2.1.0", - "magic-string": "0.25.7", - "rxjs": "6.6.3", - "source-map": "0.7.3" - }, - "engines": { - "node": ">= 10.13.0", - "npm": "^6.11.0 || ^7.5.6", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@nestjs/schematics/node_modules/@angular-devkit/schematics": { - "version": "11.2.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-11.2.4.tgz", - "integrity": "sha512-M9Ike1TYawOIHzenlZS1ufQbsS+Z11/doj5w/UrU0q2OEKc6U375t5qVGgKo3PLHHS8osb9aW9xYwBfVlKrryQ==", - "dev": true, - "dependencies": { - "@angular-devkit/core": "11.2.4", - "ora": "5.3.0", - "rxjs": "6.6.3" - }, - "engines": { - "node": ">= 10.13.0", - "npm": "^6.11.0 || ^7.5.6", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@nestjs/schematics/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "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/@nestjs/schematics/node_modules/ora": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", - "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", - "dev": true, - "dependencies": { - "bl": "^4.0.3", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "log-symbols": "^4.0.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@nestjs/schematics/node_modules/rxjs": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", - "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", - "dev": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/@nestjs/schematics/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/@nestjs/serve-static": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@nestjs/serve-static/-/serve-static-2.1.4.tgz", - "integrity": "sha512-w2PpLKzQOB8rJ+vMOy28xm8jwE8VjJfA9U+KOm0H0OY62g2oOWJ+OQPSDogP7XxAzZwq+Bt8wNU2oS8+z6v6Zg==", - "dependencies": { - "path-to-regexp": "0.1.7" - }, - "peerDependencies": { - "@nestjs/common": "^6.0.0 || ^7.0.0", - "@nestjs/core": "^6.0.0 || ^7.0.0" - } - }, - "node_modules/@nestjs/serve-static/node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "node_modules/@nestjs/testing": { - "version": "7.6.17", - "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-7.6.17.tgz", - "integrity": "sha512-wWImNvfRapCCtLXMsxCs1Ax2Uj/qSytCnolSEXL7LnH80exwHRmBeLtTfGxArsv9Y1NHr24NarfN6H0QxysZ3g==", - "dev": true, - "dependencies": { - "optional": "0.1.4", - "tslib": "2.2.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nest" - }, - "peerDependencies": { - "@nestjs/common": "^7.0.0", - "@nestjs/core": "^7.0.0", - "@nestjs/microservices": "^7.0.0", - "@nestjs/platform-express": "^7.0.0" - }, - "peerDependenciesMeta": { - "@nestjs/microservices": { - "optional": true - }, - "@nestjs/platform-express": { - "optional": true - } - } - }, - "node_modules/@nestjs/typeorm": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/@nestjs/typeorm/-/typeorm-7.1.5.tgz", - "integrity": "sha512-utE1FkYM/gyCXUqw3zKYYS0YZ3DfkAnzsCx4T48cNnSDTCeWS+u3yt0FMDFjwSiQSaLrzpiSff/FaxJQvRlYow==", - "dependencies": { - "uuid": "8.3.1" - }, - "peerDependencies": { - "@nestjs/common": "^6.7.0 || ^7.0.0", - "@nestjs/core": "^6.7.0 || ^7.0.0", - "reflect-metadata": "^0.1.12", - "rxjs": "^6.0.0", - "typeorm": "^0.2.7" - } - }, - "node_modules/@nestjs/typeorm/node_modules/uuid": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.1.tgz", - "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.7.tgz", - "integrity": "sha512-BTIhocbPBSrRmHxOAJFtR18oLhxTtAFDAvL8hY1S3iU8k+E60W/YFs4jrixGzQjMpF4qPXxIQHcjVD9dz1C2QA==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nuxtjs/opencollective": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.3.2.tgz", - "integrity": "sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==", - "dependencies": { - "chalk": "^4.1.0", - "consola": "^2.15.0", - "node-fetch": "^2.6.1" - }, - "bin": { - "opencollective": "bin/opencollective.js" - }, - "engines": { - "node": ">=8.0.0", - "npm": ">=5.0.0" - } - }, - "node_modules/@nuxtjs/opencollective/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "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/@schematics/schematics": { - "version": "0.1102.6", - "resolved": "https://registry.npmjs.org/@schematics/schematics/-/schematics-0.1102.6.tgz", - "integrity": "sha512-x77kbJL/HqR4gx0tbt35VCOGLyMvB7jD/x7eB1njhQRF8E/xynEOk3i+7A5VmK67QP5NJxU8BQKlPkJ55tBDmg==", - "dev": true, - "dependencies": { - "@angular-devkit/core": "11.2.6", - "@angular-devkit/schematics": "11.2.6" - }, - "engines": { - "node": ">= 10.13.0", - "npm": "^6.11.0 || ^7.5.6", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@sendgrid/client": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@sendgrid/client/-/client-7.4.3.tgz", - "integrity": "sha512-tTaHx893w5iqG0sVtUnMyRchuwYF95k4UOkmov1MouMIeMUbNvbalITo7cG7YSXUTY9rT2t4eBY6HcEBCVeqfg==", - "dependencies": { - "@sendgrid/helpers": "^7.4.3", - "axios": "^0.21.1" - }, - "engines": { - "node": "6.* || 8.* || >=10.*" - } - }, - "node_modules/@sendgrid/helpers": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@sendgrid/helpers/-/helpers-7.4.3.tgz", - "integrity": "sha512-Wt+68g1sVEM5UspJh34O/cxtv6BBbtAIk7U9B3PB2ySOtPs9e6hI1QkgYVwpNmkt7k2p86muUNyma/Aig25agg==", - "dependencies": { - "deepmerge": "^4.2.2" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/@sendgrid/mail": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@sendgrid/mail/-/mail-7.4.5.tgz", - "integrity": "sha512-adXMvrTUOlYr7+UTigZRGSYR9vheBv1y4fF2mugn29NBdQMfcQPGLQ5vIHgSAfcboBFCagZdamZqM5FeSGU0Hw==", - "dependencies": { - "@sendgrid/client": "^7.4.3", - "@sendgrid/helpers": "^7.4.3" - }, - "engines": { - "node": "6.* || 8.* || >=10.*" - } - }, - "node_modules/@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", - "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "node_modules/@sqltools/formatter": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@sqltools/formatter/-/formatter-1.2.3.tgz", - "integrity": "sha512-O3uyB/JbkAEMZaP3YqyHH7TMnex7tWyCbCI4EfJdOCoN6HIhqdJBWTM6aCCiWQ/5f5wxjgU735QAIpJbjDvmzg==" - }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@types/babel__core": { - "version": "7.1.14", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.14.tgz", - "integrity": "sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", - "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", - "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.1.tgz", - "integrity": "sha512-Vs0hm0vPahPMYi9tDjtP66llufgO3ST16WXaSTtDGEl9cewAl3AibmxWw6TINOqHPT9z0uABKAYjT9jNSg4npw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.3.0" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", - "dev": true, - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.34", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.34.tgz", - "integrity": "sha512-ePPA/JuI+X0vb+gSWlPKOY0NdNAie/rPUqX2GUPpbZwiKTkSPhjXWuee47E4MtE54QVzGCQMQkAL6JhV2E1+cQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/cookiejar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.2.tgz", - "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==", - "dev": true - }, - "node_modules/@types/eslint": { - "version": "7.2.13", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.13.tgz", - "integrity": "sha512-LKmQCWAlnVHvvXq4oasNUMTJJb2GwSyTY8+1C7OH5ILR8mPLaljv1jxL1bXW3xB3jFbQxTKxJAvI8PyjB09aBg==", - "dev": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.0.tgz", - "integrity": "sha512-O/ql2+rrCUe2W2rs7wMR+GqPRcgB6UiqN5RhrR5xruFlY7l9YLMn0ZkDzjoHLeiFkR8MCQZVudUuuvQ2BLC9Qw==", - "dev": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "0.0.47", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.47.tgz", - "integrity": "sha512-c5ciR06jK8u9BstrmJyO97m+klJrrhCf9u3rLu3DEAJBirxRqSCvDQoYKmxuYwQI5SZChAWu+tq9oVlGRuzPAg==", - "dev": true - }, - "node_modules/@types/express": { - "version": "4.17.12", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.12.tgz", - "integrity": "sha512-pTYas6FrP15B1Oa0bkN5tQMNqOcVXa9j4FTFtO8DWI9kppKib+6NJtfTOOLcwxuuYvcX2+dVG6et1SxW/Kc17Q==", - "dev": true, - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.18", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.21.tgz", - "integrity": "sha512-gwCiEZqW6f7EoR8TTEfalyEhb1zA5jQJnRngr97+3pzMaO1RKoI1w2bw07TK72renMUVWcWS5mLI6rk1NqN0nA==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, - "node_modules/@types/express-session": { - "version": "1.17.3", - "resolved": "https://registry.npmjs.org/@types/express-session/-/express-session-1.17.3.tgz", - "integrity": "sha512-57DnyxiqClXOIjoCgeKCUYfKxBPOlOY/k+l1TPK+7bSwyiPTrS5FIk1Ycql7twk4wO7P5lfOVy6akDGiaMSLfw==", - "dev": true, - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", - "dev": true - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "26.0.23", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.23.tgz", - "integrity": "sha512-ZHLmWMJ9jJ9PTiT58juykZpL7KjwJywFN3Rr2pTSkyQfydf/rk22yS7W8p5DaVUMQ2BQC7oYiU3FjbTM/mYrOA==", - "dev": true, - "dependencies": { - "jest-diff": "^26.0.0", - "pretty-format": "^26.0.0" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", - "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", - "dev": true - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", - "dev": true - }, - "node_modules/@types/jsonwebtoken": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.0.tgz", - "integrity": "sha512-9bVao7LvyorRGZCw0VmH/dr7Og+NdjYSsKAxB43OQoComFbBgsEpoR9JW6+qSq/ogwVBg8GI2MfAlk4SYI4OLg==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", - "dev": true - }, - "node_modules/@types/node": { - "version": "14.17.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.3.tgz", - "integrity": "sha512-e6ZowgGJmTuXa3GyaPbTGxX17tnThl2aSSizrFthQ7m9uLGZBXiGhgE55cjRZTF5kjZvYn9EOPOMljdjwbflxw==" - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", - "dev": true - }, - "node_modules/@types/oauth": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@types/oauth/-/oauth-0.9.1.tgz", - "integrity": "sha512-a1iY62/a3yhZ7qH7cNUsxoI3U/0Fe9+RnuFrpTKr+0WVOzbKlSLojShCKe20aOD1Sppv+i8Zlq0pLDuTJnwS4A==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, - "node_modules/@types/passport": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.6.tgz", - "integrity": "sha512-9oKfrJXuAxvyxdrtMCxKkHgmd6DMO8NDOLvMJ1LvIWd6/xP+i81PAkpTaEca7VhJX9S009RciwZL/j6dsLsHrA==", - "dev": true, - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/passport-google-oauth20": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@types/passport-google-oauth20/-/passport-google-oauth20-2.0.8.tgz", - "integrity": "sha512-Lc+DYCCFeMVbodISydQLT6PjIlL0TcLup3HMiJ8RHHHBltArA3oC4qocyQH1OsEq5ovQ19PaKlpGqsNT8NYz1w==", - "dev": true, - "dependencies": { - "@types/express": "*", - "@types/passport": "*", - "@types/passport-oauth2": "*" - } - }, - "node_modules/@types/passport-jwt": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/passport-jwt/-/passport-jwt-3.0.5.tgz", - "integrity": "sha512-O6zZ4WKzQUwg3OU0MnOA2AIEQ6KfHyGdLoi4fqBLyb+kV7miGKNA2KNJRtiq45EsQ2QEDO8rKqORjXpWV7UJNg==", - "dev": true, - "dependencies": { - "@types/express": "*", - "@types/jsonwebtoken": "*", - "@types/passport-strategy": "*" - } - }, - "node_modules/@types/passport-local": { - "version": "1.0.33", - "resolved": "https://registry.npmjs.org/@types/passport-local/-/passport-local-1.0.33.tgz", - "integrity": "sha512-+rn6ZIxje0jZ2+DAiWFI8vGG7ZFKB0hXx2cUdMmudSWsigSq6ES7Emso46r4HJk0qCgrZVfI8sJiM7HIYf4SbA==", - "dev": true, - "dependencies": { - "@types/express": "*", - "@types/passport": "*", - "@types/passport-strategy": "*" - } - }, - "node_modules/@types/passport-oauth2": { - "version": "1.4.10", - "resolved": "https://registry.npmjs.org/@types/passport-oauth2/-/passport-oauth2-1.4.10.tgz", - "integrity": "sha512-klShWm9xAqjM3rU31KyMMiB9M8jmJPkStUvCJ/kIv73/Vh3OVnfeTExrkMCM2wA+94MliExqwHVL3J0WD2kbnQ==", - "dev": true, - "dependencies": { - "@types/express": "*", - "@types/oauth": "*", - "@types/passport": "*" - } - }, - "node_modules/@types/passport-strategy": { - "version": "0.2.35", - "resolved": "https://registry.npmjs.org/@types/passport-strategy/-/passport-strategy-0.2.35.tgz", - "integrity": "sha512-o5D19Jy2XPFoX2rKApykY15et3Apgax00RRLf0RUotPDUsYrQa7x4howLYr9El2mlUApHmCMv5CZ1IXqKFQ2+g==", - "dev": true, - "dependencies": { - "@types/express": "*", - "@types/passport": "*" - } - }, - "node_modules/@types/prettier": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.2.3.tgz", - "integrity": "sha512-PijRCG/K3s3w1We6ynUKdxEc5AcuuH3NBmMDP8uvKVp6X43UY7NQlTzczakXP3DJR0F4dfNQIGjU2cUeRYs2AA==", - "dev": true - }, - "node_modules/@types/qs": { - "version": "6.9.6", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.6.tgz", - "integrity": "sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA==", - "dev": true - }, - "node_modules/@types/range-parser": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", - "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==", - "dev": true - }, - "node_modules/@types/serve-static": { - "version": "1.13.9", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.9.tgz", - "integrity": "sha512-ZFqF6qa48XsPdjXV5Gsz0Zqmux2PerNd3a/ktL45mHpa19cuMi/cL8tcxdAx497yRh+QtYPuofjT9oWw9P7nkA==", - "dev": true, - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/stack-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", - "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", - "dev": true - }, - "node_modules/@types/superagent": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.11.tgz", - "integrity": "sha512-cZkWBXZI+jESnUTp8RDGBmk1Zn2MkScP4V5bjD7DyqB7L0WNWpblh4KX5K/6aTqxFZMhfo1bhi2cwoAEDVBBJw==", - "dev": true, - "dependencies": { - "@types/cookiejar": "*", - "@types/node": "*" - } - }, - "node_modules/@types/supertest": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-2.0.11.tgz", - "integrity": "sha512-uci4Esokrw9qGb9bvhhSVEjd6rkny/dk5PK/Qz4yxKiyppEI+dOPlNrZBahE3i+PoKFYyDxChVXZ/ysS/nrm1Q==", - "dev": true, - "dependencies": { - "@types/superagent": "*" - } - }, - "node_modules/@types/validator": { - "version": "13.1.3", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.1.3.tgz", - "integrity": "sha512-DaOWN1zf7j+8nHhqXhIgNmS+ltAC53NXqGxYuBhWqWgqolRhddKzfZU814lkHQSTG0IUfQxU7Cg0gb8fFWo2mA==", - "peer": true - }, - "node_modules/@types/yargs": { - "version": "15.0.13", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.13.tgz", - "integrity": "sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "20.2.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", - "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==", - "dev": true - }, - "node_modules/@types/zen-observable": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/@types/zen-observable/-/zen-observable-0.8.2.tgz", - "integrity": "sha512-HrCIVMLjE1MOozVoD86622S7aunluLb2PJdPfb3nYiEtohm8mIB/vyv0Fd37AdeMFrTUQXEunw78YloMA3Qilg==" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "4.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.26.1.tgz", - "integrity": "sha512-aoIusj/8CR+xDWmZxARivZjbMBQTT9dImUtdZ8tVCVRXgBUuuZyM5Of5A9D9arQPxbi/0rlJLcuArclz/rCMJw==", - "dev": true, - "dependencies": { - "@typescript-eslint/experimental-utils": "4.26.1", - "@typescript-eslint/scope-manager": "4.26.1", - "debug": "^4.3.1", - "functional-red-black-tree": "^1.0.1", - "lodash": "^4.17.21", - "regexpp": "^3.1.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^4.0.0", - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/experimental-utils": { - "version": "4.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.26.1.tgz", - "integrity": "sha512-sQHBugRhrXzRCs9PaGg6rowie4i8s/iD/DpTB+EXte8OMDfdCG5TvO73XlO9Wc/zi0uyN4qOmX9hIjQEyhnbmQ==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.7", - "@typescript-eslint/scope-manager": "4.26.1", - "@typescript-eslint/types": "4.26.1", - "@typescript-eslint/typescript-estree": "4.26.1", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "4.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.26.1.tgz", - "integrity": "sha512-q7F3zSo/nU6YJpPJvQveVlIIzx9/wu75lr6oDbDzoeIRWxpoc/HQ43G4rmMoCc5my/3uSj2VEpg/D83LYZF5HQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "4.26.1", - "@typescript-eslint/types": "4.26.1", - "@typescript-eslint/typescript-estree": "4.26.1", - "debug": "^4.3.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "4.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.26.1.tgz", - "integrity": "sha512-TW1X2p62FQ8Rlne+WEShyd7ac2LA6o27S9i131W4NwDSfyeVlQWhw8ylldNNS8JG6oJB9Ha9Xyc+IUcqipvheQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "4.26.1", - "@typescript-eslint/visitor-keys": "4.26.1" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "4.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.26.1.tgz", - "integrity": "sha512-STyMPxR3cS+LaNvS8yK15rb8Y0iL0tFXq0uyl6gY45glyI7w0CsyqyEXl/Fa0JlQy+pVANeK3sbwPneCbWE7yg==", - "dev": true, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "4.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.26.1.tgz", - "integrity": "sha512-l3ZXob+h0NQzz80lBGaykdScYaiEbFqznEs99uwzm8fPHhDjwaBFfQkjUC/slw6Sm7npFL8qrGEAMxcfBsBJUg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "4.26.1", - "@typescript-eslint/visitor-keys": "4.26.1", - "debug": "^4.3.1", - "globby": "^11.0.3", - "is-glob": "^4.0.1", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "4.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.26.1.tgz", - "integrity": "sha512-IGouNSSd+6x/fHtYRyLOM6/C+QxMDzWlDtN41ea+flWuSF9g02iqcIlX8wM53JkfljoIjP0U+yp7SiTS1onEkw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "4.26.1", - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.0.tgz", - "integrity": "sha512-kX2W49LWsbthrmIRMbQZuQDhGtjyqXfEmmHyEi4XWnSZtPmxY0+3anPIzsnRb45VH/J55zlOfWvZuY47aJZTJg==", - "dev": true, - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.0", - "@webassemblyjs/helper-wasm-bytecode": "1.11.0" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.0.tgz", - "integrity": "sha512-Q/aVYs/VnPDVYvsCBL/gSgwmfjeCb4LW8+TMrO3cSzJImgv8lxxEPM2JA5jMrivE7LSz3V+PFqtMbls3m1exDA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.0.tgz", - "integrity": "sha512-baT/va95eXiXb2QflSx95QGT5ClzWpGaa8L7JnJbgzoYeaA27FCvuBXU758l+KXWRndEmUXjP0Q5fibhavIn8w==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.0.tgz", - "integrity": "sha512-u9HPBEl4DS+vA8qLQdEQ6N/eJQ7gT7aNvMIo8AAWvAl/xMrcOSiI2M0MAnMCy3jIFke7bEee/JwdX1nUpCtdyA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.0.tgz", - "integrity": "sha512-DhRQKelIj01s5IgdsOJMKLppI+4zpmcMQ3XboFPLwCpSNH6Hqo1ritgHgD0nqHeSYqofA6aBN/NmXuGjM1jEfQ==", - "dev": true, - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.0", - "@webassemblyjs/helper-api-error": "1.11.0", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.0.tgz", - "integrity": "sha512-MbmhvxXExm542tWREgSFnOVo07fDpsBJg3sIl6fSp9xuu75eGz5lz31q7wTLffwL3Za7XNRCMZy210+tnsUSEA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.0.tgz", - "integrity": "sha512-3Eb88hcbfY/FCukrg6i3EH8H2UsD7x8Vy47iVJrP967A9JGqgBVL9aH71SETPx1JrGsOUVLo0c7vMCN22ytJew==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.0", - "@webassemblyjs/helper-buffer": "1.11.0", - "@webassemblyjs/helper-wasm-bytecode": "1.11.0", - "@webassemblyjs/wasm-gen": "1.11.0" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.0.tgz", - "integrity": "sha512-KXzOqpcYQwAfeQ6WbF6HXo+0udBNmw0iXDmEK5sFlmQdmND+tr773Ti8/5T/M6Tl/413ArSJErATd8In3B+WBA==", - "dev": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.0.tgz", - "integrity": "sha512-aqbsHa1mSQAbeeNcl38un6qVY++hh8OpCOzxhixSYgbRfNWcxJNJQwe2rezK9XEcssJbbWIkblaJRwGMS9zp+g==", - "dev": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.0.tgz", - "integrity": "sha512-A/lclGxH6SpSLSyFowMzO/+aDEPU4hvEiooCMXQPcQFPPJaYcPQNKGOCLUySJsYJ4trbpr+Fs08n4jelkVTGVw==", - "dev": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.0.tgz", - "integrity": "sha512-JHQ0damXy0G6J9ucyKVXO2j08JVJ2ntkdJlq1UTiUrIgfGMmA7Ik5VdC/L8hBK46kVJgujkBIoMtT8yVr+yVOQ==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.0", - "@webassemblyjs/helper-buffer": "1.11.0", - "@webassemblyjs/helper-wasm-bytecode": "1.11.0", - "@webassemblyjs/helper-wasm-section": "1.11.0", - "@webassemblyjs/wasm-gen": "1.11.0", - "@webassemblyjs/wasm-opt": "1.11.0", - "@webassemblyjs/wasm-parser": "1.11.0", - "@webassemblyjs/wast-printer": "1.11.0" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.0.tgz", - "integrity": "sha512-BEUv1aj0WptCZ9kIS30th5ILASUnAPEvE3tVMTrItnZRT9tXCLW2LEXT8ezLw59rqPP9klh9LPmpU+WmRQmCPQ==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.0", - "@webassemblyjs/helper-wasm-bytecode": "1.11.0", - "@webassemblyjs/ieee754": "1.11.0", - "@webassemblyjs/leb128": "1.11.0", - "@webassemblyjs/utf8": "1.11.0" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.0.tgz", - "integrity": "sha512-tHUSP5F4ywyh3hZ0+fDQuWxKx3mJiPeFufg+9gwTpYp324mPCQgnuVKwzLTZVqj0duRDovnPaZqDwoyhIO8kYg==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.0", - "@webassemblyjs/helper-buffer": "1.11.0", - "@webassemblyjs/wasm-gen": "1.11.0", - "@webassemblyjs/wasm-parser": "1.11.0" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.0.tgz", - "integrity": "sha512-6L285Sgu9gphrcpDXINvm0M9BskznnzJTE7gYkjDbxET28shDqp27wpruyx3C2S/dvEwiigBwLA1cz7lNUi0kw==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.0", - "@webassemblyjs/helper-api-error": "1.11.0", - "@webassemblyjs/helper-wasm-bytecode": "1.11.0", - "@webassemblyjs/ieee754": "1.11.0", - "@webassemblyjs/leb128": "1.11.0", - "@webassemblyjs/utf8": "1.11.0" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.0.tgz", - "integrity": "sha512-Fg5OX46pRdTgB7rKIUojkh9vXaVN6sGYCnEiJN1GYkb0RPwShZXp6KTDqmoMdQPKhcroOXh3fEzmkWmCYaKYhQ==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.0", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "node_modules/abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", - "dev": true - }, - "node_modules/accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "dependencies": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dev": true, - "dependencies": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", - "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/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==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "engines": { - "node": ">=8" - } - }, - "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/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" - }, - "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/app-root-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.0.0.tgz", - "integrity": "sha512-qMcx+Gy2UZynHjOHOIXPNvpf+9cjvk3cWrBBK7zg4gH9+clobJRb9NGzcT7mQTcV/6Gm/1WelUtqxVXnNlrwcw==", - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/append-field": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", - "integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY=" - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "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/array-uniq": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.2.tgz", - "integrity": "sha1-X8w3OSB3VyPP1k1lxkvvU7+eum0=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true, - "bin": { - "atob": "bin/atob.js" - }, - "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/axios": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", - "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", - "dependencies": { - "follow-redirects": "^1.10.0" - } - }, - "node_modules/babel-jest": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", - "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", - "dev": true, - "dependencies": { - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/babel__core": "^7.1.7", - "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^26.6.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "slash": "^3.0.0" - }, - "engines": { - "node": ">= 10.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-jest/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", - "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^4.0.0", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", - "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@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-top-level-await": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-jest": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", - "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", - "dev": true, - "dependencies": { - "babel-plugin-jest-hoist": "^26.6.2", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": ">= 10.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "dependencies": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/base64url": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", - "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bl/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bl/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/bl/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "dependencies": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "node_modules/browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", - "dev": true, - "dependencies": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", - "escalade": "^3.1.1", - "node-releases": "^1.1.71" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } - }, - "node_modules/bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "dependencies": { - "fast-json-stable-stringify": "2.x" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "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" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" - }, - "node_modules/buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" - }, - "node_modules/busboy": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz", - "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=", - "dependencies": { - "dicer": "0.2.5", - "readable-stream": "1.1.x" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "dependencies": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001235", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001235.tgz", - "integrity": "sha512-zWEwIVqnzPkSAXOUlQnPW2oKoYb2aLQ4Q5ejdjBcnH63rfypaW34CxaeBn1VMya2XaEU3P/R2qHpWyj+l0BT1A==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } - }, - "node_modules/capture-exit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", - "dev": true, - "dependencies": { - "rsvp": "^4.8.4" - }, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "node_modules/chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", - "dev": true, - "dependencies": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.3.1", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.1" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "node_modules/cjs-module-lexer": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", - "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==", - "dev": true - }, - "node_modules/class-transformer": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.4.0.tgz", - "integrity": "sha512-ETWD/H2TbWbKEi7m9N4Km5+cw1hNcqJSxlSYhsLsNjQzWWiZIYA1zafxpK9PwVfaZ6AqR5rrjPVUBGESm5tQUA==", - "peer": true - }, - "node_modules/class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "dependencies": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-validator": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.13.1.tgz", - "integrity": "sha512-zWIeYFhUitvAHBwNhDdCRK09hWx+P0HUwFE8US8/CxFpMVzkUK8RJl7yOIE+BVu2lxyPNgeOaFv78tLE47jBIg==", - "peer": true, - "dependencies": { - "@types/validator": "^13.1.3", - "libphonenumber-js": "^1.9.7", - "validator": "^13.5.2" - } - }, - "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==", - "dev": true, - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-highlight": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", - "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", - "dependencies": { - "chalk": "^4.0.0", - "highlight.js": "^10.7.1", - "mz": "^2.4.0", - "parse5": "^5.1.1", - "parse5-htmlparser2-tree-adapter": "^6.0.0", - "yargs": "^16.0.0" - }, - "bin": { - "highlight": "bin/highlight" - }, - "engines": { - "node": ">=8.0.0", - "npm": ">=5.0.0" - } - }, - "node_modules/cli-highlight/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "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/cli-highlight/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/cli-highlight/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/cli-highlight/node_modules/parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" - }, - "node_modules/cli-highlight/node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-highlight/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "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/cli-highlight/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/cli-highlight/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cli-spinners": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.0.tgz", - "integrity": "sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-table3": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", - "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", - "dev": true, - "dependencies": { - "colors": "^1.1.2", - "object-assign": "^4.1.0", - "string-width": "^2.1.1" - }, - "engines": { - "node": ">=6" - }, - "optionalDependencies": { - "colors": "^1.1.2" - } - }, - "node_modules/cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/cliui/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==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true, - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "dev": true - }, - "node_modules/collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "dependencies": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", - "dev": true - }, - "node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "engines": [ - "node >= 0.8" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/concat-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/concat-stream/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/concat-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/consola": { - "version": "2.15.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", - "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" - }, - "node_modules/content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "dependencies": { - "safe-buffer": "5.1.2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "node_modules/cookiejar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", - "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==", - "dev": true - }, - "node_modules/copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "dev": true, - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true - }, - "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "dependencies": { - "cssom": "~0.3.6" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - }, - "node_modules/data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "dev": true, - "dependencies": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decimal.js": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", - "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==", - "dev": true - }, - "node_modules/decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "node_modules/deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "dev": true, - "dependencies": { - "clone": "^1.0.2" - } - }, - "node_modules/define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/denque": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz", - "integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ==", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/dicer": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz", - "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=", - "dependencies": { - "readable-stream": "1.1.x", - "streamsearch": "0.1.2" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/diff-sequences": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", - "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", - "dev": true, - "engines": { - "node": ">= 10.14.2" - } - }, - "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/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "dev": true, - "dependencies": { - "webidl-conversions": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/domexception/node_modules/webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/dotenv": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", - "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", - "engines": { - "node": ">=10" - } - }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "node_modules/electron-to-chromium": { - "version": "1.3.749", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.749.tgz", - "integrity": "sha512-F+v2zxZgw/fMwPz/VUGIggG4ZndDsYy0vlpthi3tjmDZlcfbhN5mYW0evXUsBr2sUtuDANFtle410A9u/sd/4A==", - "dev": true - }, - "node_modules/emittery": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", - "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "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/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "engines": { - "node": ">= 0.8" - } - }, - "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==", - "dev": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/enhanced-resolve": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", - "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "dependencies": { - "ansi-colors": "^4.1.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "dev": true, - "dependencies": { - "prr": "~1.0.1" - }, - "bin": { - "errno": "cli.js" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-module-lexer": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.4.1.tgz", - "integrity": "sha512-ooYciCUtfw6/d2w56UVeqHPcoCFAiJdz5XOkYpv/Txl1HMUozpXjz/2RIQgqwKdXNDPSF1W7mJCFse3G+HDyAA==", - "dev": true - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "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/escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", - "dev": true, - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/escodegen/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/escodegen/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/escodegen/node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/eslint": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.28.0.tgz", - "integrity": "sha512-UMfH0VSjP0G4p3EWirscJEQ/cHqnT/iuH6oNZOB94nBjWbMnhGEPxsZm1eyIW0C/9jLI0Fow4W5DXLjEI7mn1g==", - "dev": true, - "dependencies": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.2", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-prettier": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", - "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-prettier": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.0.tgz", - "integrity": "sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw==", - "dev": true, - "dependencies": { - "prettier-linter-helpers": "^1.0.0" - }, - "engines": { - "node": ">=6.0.0" - }, - "peerDependencies": { - "eslint": ">=5.0.0", - "prettier": ">=1.13.0" - }, - "peerDependenciesMeta": { - "eslint-config-prettier": { - "optional": true - } - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint/node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "dev": true, - "dependencies": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/exec-sh": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", - "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==", - "dev": true - }, - "node_modules/execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "dependencies": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/expand-brackets/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "node_modules/expect": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", - "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", - "dev": true, - "dependencies": { - "@jest/types": "^26.6.2", - "ansi-styles": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-regex-util": "^26.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "dependencies": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express-session": { - "version": "1.17.2", - "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.2.tgz", - "integrity": "sha512-mPcYcLA0lvh7D4Oqr5aNJFMtBMKPLl++OKKxkHzZ0U0oDq1rpKBnkR5f5vCHR26VeArlTOEF9td4x5IjICksRQ==", - "dependencies": { - "cookie": "0.4.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~2.0.0", - "on-headers": "~1.0.2", - "parseurl": "~1.3.3", - "safe-buffer": "5.2.1", - "uid-safe": "~2.1.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/express-session/node_modules/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express-session/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express-session/node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/express-session/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/express-session/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/express/node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "dev": true, - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "dependencies": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", - "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", - "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "node_modules/fast-safe-stringify": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", - "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" - }, - "node_modules/fastq": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", - "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", - "dev": true, - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/figlet": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.5.0.tgz", - "integrity": "sha512-ZQJM4aifMpz6H19AW1VqvZ7l4pOE9p7i/3LyxgO2kp+PO/VcDYNqIHEMtkccqIhTXMKci4kjueJr/iCQEaT/Ww==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", - "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", - "dev": true - }, - "node_modules/follow-redirects": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", - "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fork-ts-checker-webpack-plugin": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.2.0.tgz", - "integrity": "sha512-DTNbOhq6lRdjYprukX54JMeYJgQ0zMow+R5BMLwWxEX2NAXthIkwnV8DBmsWjwNLSUItKZM4TCCJbtgrtKBu2Q==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.8.3", - "@types/json-schema": "^7.0.5", - "chalk": "^4.1.0", - "chokidar": "^3.4.2", - "cosmiconfig": "^6.0.0", - "deepmerge": "^4.2.2", - "fs-extra": "^9.0.0", - "memfs": "^3.1.2", - "minimatch": "^3.0.4", - "schema-utils": "2.7.0", - "semver": "^7.3.2", - "tapable": "^1.0.0" - }, - "engines": { - "node": ">=10", - "yarn": ">=1.0.0" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/formidable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", - "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==", - "dev": true, - "funding": { - "url": "https://ko-fi.com/tunnckoCore/commissions" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "dependencies": { - "map-cache": "^0.2.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", - "dev": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "node_modules/generate-function": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", - "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", - "dependencies": { - "is-property": "^1.0.2" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "node_modules/globals": { - "version": "13.9.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.9.0.tgz", - "integrity": "sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz", - "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby/node_modules/ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", - "dev": true - }, - "node_modules/growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", - "dev": true, - "optional": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-ansi/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "engines": { - "node": ">=0.10.0" - } - }, - "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/has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "dependencies": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/highlight.js": { - "version": "10.7.3", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", - "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", - "engines": { - "node": "*" - } - }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "dev": true, - "dependencies": { - "whatwg-encoding": "^1.0.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true, - "engines": { - "node": ">=8.12.0" - } - }, - "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/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-local": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", - "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", - "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "node_modules/inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/inquirer/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/inquirer/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "dependencies": { - "ci-info": "^2.0.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-core-module": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", - "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "optional": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "node_modules/is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" - }, - "node_modules/is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "optional": true, - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/iterare": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/iterare/-/iterare-1.2.1.tgz", - "integrity": "sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==", - "engines": { - "node": ">=6" - } - }, - "node_modules/jest": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz", - "integrity": "sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==", - "dev": true, - "dependencies": { - "@jest/core": "^26.6.3", - "import-local": "^3.0.2", - "jest-cli": "^26.6.3" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-changed-files": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", - "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", - "dev": true, - "dependencies": { - "@jest/types": "^26.6.2", - "execa": "^4.0.0", - "throat": "^5.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-cli": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", - "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", - "dev": true, - "dependencies": { - "@jest/core": "^26.6.3", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "import-local": "^3.0.2", - "is-ci": "^2.0.0", - "jest-config": "^26.6.3", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "prompts": "^2.0.1", - "yargs": "^15.4.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-cli/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-config": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", - "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", - "dev": true, - "dependencies": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^26.6.3", - "@jest/types": "^26.6.2", - "babel-jest": "^26.6.3", - "chalk": "^4.0.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.4", - "jest-environment-jsdom": "^26.6.2", - "jest-environment-node": "^26.6.2", - "jest-get-type": "^26.3.0", - "jest-jasmine2": "^26.6.3", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "micromatch": "^4.0.2", - "pretty-format": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - }, - "peerDependencies": { - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-config/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-diff": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", - "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-diff/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-docblock": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", - "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", - "dev": true, - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-each": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", - "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", - "dev": true, - "dependencies": { - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-util": "^26.6.2", - "pretty-format": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-each/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-environment-jsdom": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", - "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", - "dev": true, - "dependencies": { - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2", - "jsdom": "^16.4.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-environment-node": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", - "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", - "dev": true, - "dependencies": { - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-get-type": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", - "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", - "dev": true, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-haste-map": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", - "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", - "dev": true, - "dependencies": { - "@jest/types": "^26.6.2", - "@types/graceful-fs": "^4.1.2", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.1.2", - "graceful-fs": "^4.2.4", - "jest-regex-util": "^26.0.0", - "jest-serializer": "^26.6.2", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "micromatch": "^4.0.2", - "sane": "^4.0.3", - "walker": "^1.0.7" - }, - "engines": { - "node": ">= 10.14.2" - }, - "optionalDependencies": { - "fsevents": "^2.1.2" - } - }, - "node_modules/jest-jasmine2": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", - "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", - "dev": true, - "dependencies": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^26.6.2", - "@jest/source-map": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^26.6.2", - "is-generator-fn": "^2.0.0", - "jest-each": "^26.6.2", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-runtime": "^26.6.3", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "pretty-format": "^26.6.2", - "throat": "^5.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-jasmine2/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-leak-detector": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", - "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", - "dev": true, - "dependencies": { - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-matcher-utils": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", - "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-matcher-utils/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-message-util": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", - "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "@jest/types": "^26.6.2", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.2", - "pretty-format": "^26.6.2", - "slash": "^3.0.0", - "stack-utils": "^2.0.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-message-util/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-mock": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", - "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", - "dev": true, - "dependencies": { - "@jest/types": "^26.6.2", - "@types/node": "*" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "dev": true, - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", - "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", - "dev": true, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-resolve": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", - "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", - "dev": true, - "dependencies": { - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.6.2", - "read-pkg-up": "^7.0.1", - "resolve": "^1.18.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", - "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", - "dev": true, - "dependencies": { - "@jest/types": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-snapshot": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-resolve/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-runner": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", - "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", - "dev": true, - "dependencies": { - "@jest/console": "^26.6.2", - "@jest/environment": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.7.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-config": "^26.6.3", - "jest-docblock": "^26.0.0", - "jest-haste-map": "^26.6.2", - "jest-leak-detector": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-resolve": "^26.6.2", - "jest-runtime": "^26.6.3", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "source-map-support": "^0.5.6", - "throat": "^5.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-runner/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-runtime": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", - "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", - "dev": true, - "dependencies": { - "@jest/console": "^26.6.2", - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/globals": "^26.6.2", - "@jest/source-map": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0", - "cjs-module-lexer": "^0.6.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.4", - "jest-config": "^26.6.3", - "jest-haste-map": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-mock": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "slash": "^3.0.0", - "strip-bom": "^4.0.0", - "yargs": "^15.4.1" - }, - "bin": { - "jest-runtime": "bin/jest-runtime.js" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-runtime/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-serializer": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", - "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", - "dev": true, - "dependencies": { - "@types/node": "*", - "graceful-fs": "^4.2.4" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-snapshot": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", - "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0", - "@jest/types": "^26.6.2", - "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.0.0", - "chalk": "^4.0.0", - "expect": "^26.6.2", - "graceful-fs": "^4.2.4", - "jest-diff": "^26.6.2", - "jest-get-type": "^26.3.0", - "jest-haste-map": "^26.6.2", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-resolve": "^26.6.2", - "natural-compare": "^1.4.0", - "pretty-format": "^26.6.2", - "semver": "^7.3.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-snapshot/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-util": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", - "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", - "dev": true, - "dependencies": { - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "is-ci": "^2.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-util/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-validate": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", - "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", - "dev": true, - "dependencies": { - "@jest/types": "^26.6.2", - "camelcase": "^6.0.0", - "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", - "leven": "^3.1.0", - "pretty-format": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-validate/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-watcher": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", - "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", - "dev": true, - "dependencies": { - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^26.6.2", - "string-length": "^4.0.1" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-watcher/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsdom": { - "version": "16.6.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.6.0.tgz", - "integrity": "sha512-Ty1vmF4NHJkolaEmdjtxTfSfkdb8Ywarwf63f+F8/mDD1uLSSWDxDuMiZxiPhwunLrn9LOSVItWj4bLYsLN3Dg==", - "dev": true, - "dependencies": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.5", - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsdom/node_modules/acorn": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.3.0.tgz", - "integrity": "sha512-tqPKHZ5CaBJw0Xmy0ZZvLs1qTV+BNFSyvn77ASXkpBNfIRk8ev26fKrD9iLGwGA9zedPao52GSHzq8lyZG0NUw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonc-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", - "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", - "dev": true - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonwebtoken": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", - "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", - "dependencies": { - "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=4", - "npm": ">=1.4.28" - } - }, - "node_modules/jsonwebtoken/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "dependencies": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/libphonenumber-js": { - "version": "1.9.19", - "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.9.19.tgz", - "integrity": "sha512-RjStfSE63LvXQEBw7pgQHPkY35z8feiMjC9wLvL1Hbt8PbhxpRrACwMXmLQgabb+IpVdcEx+olh8ll7UDXXkfA==", - "peer": true - }, - "node_modules/lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", - "dev": true - }, - "node_modules/loader-runner": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", - "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", - "dev": true, - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true - }, - "node_modules/lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" - }, - "node_modules/lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" - }, - "node_modules/lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" - }, - "node_modules/lodash.toarray": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", - "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=", - "dev": true - }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", - "dev": true - }, - "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==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "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/long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/macos-release": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.4.1.tgz", - "integrity": "sha512-H/QHeBIN1fIGJX517pvK8IEK53yQOW7YcEI55oYtgjDdoCQQz7eJS94qt5kNrscReEyuD/JcdFCm2XBEcGOITg==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/magic-string": { - "version": "0.25.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", - "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", - "dev": true, - "dependencies": { - "sourcemap-codec": "^1.4.4" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", - "dev": true, - "dependencies": { - "tmpl": "1.0.x" - } - }, - "node_modules/map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "dependencies": { - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memfs": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.2.2.tgz", - "integrity": "sha512-RE0CwmIM3CEvpcdK3rZ19BC4E6hv9kADkMN5rPduRak58cNArWLi/9jFLsa4rhsjfVxMP3v0jO7FHXq7SvFY5Q==", - "dev": true, - "dependencies": { - "fs-monkey": "1.0.3" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "dev": true, - "dependencies": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - }, - "engines": { - "node": ">=4.3.0 <5.0.0 || >=5.10" - } - }, - "node_modules/memory-fs/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/memory-fs/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "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/memory-fs/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.48.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", - "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.31", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", - "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", - "dependencies": { - "mime-db": "1.48.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "node_modules/mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "dependencies": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/multer": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.2.tgz", - "integrity": "sha512-xY8pX7V+ybyUpbYMxtjM9KAiD9ixtg5/JkeKUTD6xilfDv0vzzOFcCp4Ljb1UU3tSOM3VTZtKo63OmzOrGi3Cg==", - "dependencies": { - "append-field": "^1.0.0", - "busboy": "^0.2.11", - "concat-stream": "^1.5.2", - "mkdirp": "^0.5.1", - "object-assign": "^4.1.1", - "on-finished": "^2.3.0", - "type-is": "^1.6.4", - "xtend": "^4.0.0" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "node_modules/mysql2": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-2.2.5.tgz", - "integrity": "sha512-XRqPNxcZTpmFdXbJqb+/CtYVLCx14x1RTeNMD4954L331APu75IC74GDqnZMEt1kwaXy6TySo55rF2F3YJS78g==", - "dependencies": { - "denque": "^1.4.1", - "generate-function": "^2.3.1", - "iconv-lite": "^0.6.2", - "long": "^4.0.0", - "lru-cache": "^6.0.0", - "named-placeholders": "^1.1.2", - "seq-queue": "^0.0.5", - "sqlstring": "^2.3.2" - }, - "engines": { - "node": ">= 8.0" - } - }, - "node_modules/mysql2/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/named-placeholders": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz", - "integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==", - "dependencies": { - "lru-cache": "^4.1.3" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/named-placeholders/node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "node_modules/named-placeholders/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" - }, - "node_modules/nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node_modules/negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node_modules/node-emoji": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.10.0.tgz", - "integrity": "sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw==", - "dev": true, - "dependencies": { - "lodash.toarray": "^4.4.0" - } - }, - "node_modules/node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", - "engines": { - "node": "4.x || >=6.0.0" - } - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", - "dev": true - }, - "node_modules/node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/node-notifier": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz", - "integrity": "sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==", - "dev": true, - "optional": true, - "dependencies": { - "growly": "^1.3.0", - "is-wsl": "^2.2.0", - "semver": "^7.3.2", - "shellwords": "^0.1.1", - "uuid": "^8.3.0", - "which": "^2.0.2" - } - }, - "node_modules/node-releases": { - "version": "1.1.73", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz", - "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==", - "dev": true - }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "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/normalize-package-data/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", - "dev": true - }, - "node_modules/oauth": { - "version": "0.9.15", - "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", - "integrity": "sha1-vR/vr2hslrdUda7VGWQS/2DPucE=" - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "dependencies": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.1.1.tgz", - "integrity": "sha512-VOJmgmS+7wvXf8CjbQmimtCnEx3IAoLxI3fp2fbWehxrWBcAQFbk+vcwb6vzR0VZv/eNCJ/27j151ZTwqW/JeQ==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/object-inspect": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", - "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "dependencies": { - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optional": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/optional/-/optional-0.1.4.tgz", - "integrity": "sha512-gtvrrCfkE08wKcgXaVwQVgwEQ8vel2dc5DDBn9RLQZ3YtmtkBss6A2HY6BnJH4N/4Ku97Ri/SF8sNWE2225WJw==", - "dev": true - }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/ora": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.0.tgz", - "integrity": "sha512-1StwyXQGoU6gdjYkyVcqOLnVlbKj+6yPNNOxJVgpt9t4eksKjiriiHuxktLYkgllwk+D6MbC4ihH84L1udRXPg==", - "dev": true, - "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/ora/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/os-name": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-4.0.0.tgz", - "integrity": "sha512-caABzDdJMbtykt7GmSogEat3faTKQhmZf0BS5l/pZGmP0vPWQjXWqOhbLyK+b6j2/DQPmEvYdzLXJXXLJNVDNg==", - "dev": true, - "dependencies": { - "macos-release": "^2.2.0", - "windows-release": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/p-each-series": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", - "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parent-require": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parent-require/-/parent-require-1.0.0.tgz", - "integrity": "sha1-dGoWdjgIOoYLDu9nMssn7UbDKXc=", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "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/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" - }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", - "dependencies": { - "parse5": "^6.0.1" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/passport": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/passport/-/passport-0.4.1.tgz", - "integrity": "sha512-IxXgZZs8d7uFSt3eqNjM9NQ3g3uQCW5avD8mRNoXV99Yig50vjuaez6dQK2qC0kVWPRTujxY0dWgGfT09adjYg==", - "dependencies": { - "passport-strategy": "1.x.x", - "pause": "0.0.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/passport-google-oauth20": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/passport-google-oauth20/-/passport-google-oauth20-2.0.0.tgz", - "integrity": "sha512-KSk6IJ15RoxuGq7D1UKK/8qKhNfzbLeLrG3gkLZ7p4A6DBCcv7xpyQwuXtWdpyR0+E0mwkpjY1VfPOhxQrKzdQ==", - "dependencies": { - "passport-oauth2": "1.x.x" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/passport-jwt": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/passport-jwt/-/passport-jwt-4.0.0.tgz", - "integrity": "sha512-BwC0n2GP/1hMVjR4QpnvqA61TxenUMlmfNjYNgK0ZAs0HK4SOQkHcSv4L328blNTLtHq7DbmvyNJiH+bn6C5Mg==", - "dependencies": { - "jsonwebtoken": "^8.2.0", - "passport-strategy": "^1.0.0" - } - }, - "node_modules/passport-local": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/passport-local/-/passport-local-1.0.0.tgz", - "integrity": "sha1-H+YyaMkudWBmJkN+O5BmYsFbpu4=", - "dependencies": { - "passport-strategy": "1.x.x" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/passport-oauth": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/passport-oauth/-/passport-oauth-0.1.15.tgz", - "integrity": "sha1-+3Tgr+hGFL+iVsX8cWzFa7/IzsA=", - "dependencies": { - "oauth": "0.9.x", - "passport": "~0.1.1", - "pkginfo": "0.2.x" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/passport-oauth/node_modules/passport": { - "version": "0.1.18", - "resolved": "https://registry.npmjs.org/passport/-/passport-0.1.18.tgz", - "integrity": "sha1-yCZEedy2QUytu2Z1LRKzfgtlJaE=", - "dependencies": { - "pause": "0.0.1", - "pkginfo": "0.2.x" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/passport-oauth2": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/passport-oauth2/-/passport-oauth2-1.5.0.tgz", - "integrity": "sha512-kqBt6vR/5VlCK8iCx1/KpY42kQ+NEHZwsSyt4Y6STiNjU+wWICG1i8ucc1FapXDGO15C5O5VZz7+7vRzrDPXXQ==", - "dependencies": { - "base64url": "3.x.x", - "oauth": "0.9.x", - "passport-strategy": "1.x.x", - "uid2": "0.0.x", - "utils-merge": "1.x.x" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/passport-strategy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", - "integrity": "sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ=", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/passport-twitter": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/passport-twitter/-/passport-twitter-0.1.5.tgz", - "integrity": "sha1-0Jqiwil9AhS213Vb9Zs5Lj4D+7I=", - "dependencies": { - "passport-oauth": "0.1.x", - "pkginfo": "0.2.x" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-to-regexp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.2.0.tgz", - "integrity": "sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/pause": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", - "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=" - }, - "node_modules/picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "dev": true, - "dependencies": { - "node-modules-regexp": "^1.0.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkginfo": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.2.3.tgz", - "integrity": "sha1-cjnEKl72wwuPMoQ52bn/cQQkkPg=", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.1.tgz", - "integrity": "sha512-p+vNbgpLjif/+D+DwAZAbndtRrR0md0MwfmOVN9N+2RgyACMT+7tfaRnT+WDPkqnuVwleyuBIG2XBxKDme3hPA==", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/pretty-format": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", - "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", - "dev": true, - "dependencies": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/prompts": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.1.tgz", - "integrity": "sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ==", - "dev": true, - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" - }, - "node_modules/psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/random-bytes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", - "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/randomstring": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/randomstring/-/randomstring-1.2.1.tgz", - "integrity": "sha512-eMnfell9XuU3jfCx3f4xCaFAt0YMFPZhx9R3PSStmLarDKg5j5vivqKhf/8pvG+VX/YkxsckHK/VPUrKa5V07A==", - "dependencies": { - "array-uniq": "1.0.2", - "randombytes": "2.0.3" - }, - "bin": { - "randomstring": "bin/randomstring" - }, - "engines": { - "node": "*" - } - }, - "node_modules/randomstring/node_modules/randombytes": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.3.tgz", - "integrity": "sha1-Z0yZdgkBw8QRJ3GjHlIdw0nMCew=" - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "dependencies": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true - }, - "node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "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/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "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/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "dependencies": { - "resolve": "^1.1.6" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/reflect-metadata": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" - }, - "node_modules/regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "dependencies": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "node_modules/repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "node_modules/resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "deprecated": "https://github.com/lydell/resolve-url#deprecated", - "dev": true - }, - "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==", - "dev": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rsvp": { - "version": "4.8.5", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", - "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", - "dev": true, - "engines": { - "node": "6.* || >= 7.*" - } - }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/rxjs/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "dependencies": { - "ret": "~0.1.10" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", - "dev": true, - "dependencies": { - "@cnakazawa/watch": "^1.0.3", - "anymatch": "^2.0.0", - "capture-exit": "^2.0.0", - "exec-sh": "^0.3.2", - "execa": "^1.0.0", - "fb-watchman": "^2.0.0", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5" - }, - "bin": { - "sane": "src/cli.js" - }, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/sane/node_modules/anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "dependencies": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "node_modules/sane/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/sane/node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/sane/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/sane/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/sane/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/sane/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/sane/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "node_modules/saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "dependencies": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - }, - "node_modules/seq-queue": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", - "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=" - }, - "node_modules/serialize-javascript": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", - "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "node_modules/set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/set-value/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/set-value/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" - }, - "node_modules/sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "bin": { - "sha.js": "bin.js" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/shelljs": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", - "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", - "dev": true, - "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "dev": true, - "optional": true - }, - "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==", - "dev": true, - "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/signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/slice-ansi/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==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/slugify": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.0.tgz", - "integrity": "sha512-FkMq+MQc5hzYgM86nLuHI98Acwi3p4wX+a5BO9Hhw4JdK4L7WueIiZ4tXEobImPqBz2sVcV0+Mu3GRB30IGang==", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "dependencies": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "dependencies": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "dependencies": { - "kind-of": "^3.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/snapdragon/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "node_modules/snapdragon/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true - }, - "node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "dependencies": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "dev": true - }, - "node_modules/sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true - }, - "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", - "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==", - "dev": true - }, - "node_modules/split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "dependencies": { - "extend-shallow": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "node_modules/sqlstring": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.2.tgz", - "integrity": "sha512-vF4ZbYdKS8OnoJAWBmMxCQDkiEBkGQYU7UZPtL8flbDRSNkhaXvRJ279ZtI6M+zDaQovVU4tuRgzK5fVhvFAhg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "dependencies": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/streamsearch": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", - "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/superagent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-6.1.0.tgz", - "integrity": "sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==", - "dev": true, - "dependencies": { - "component-emitter": "^1.3.0", - "cookiejar": "^2.1.2", - "debug": "^4.1.1", - "fast-safe-stringify": "^2.0.7", - "form-data": "^3.0.0", - "formidable": "^1.2.2", - "methods": "^1.1.2", - "mime": "^2.4.6", - "qs": "^6.9.4", - "readable-stream": "^3.6.0", - "semver": "^7.3.2" - }, - "engines": { - "node": ">= 7.0.0" - } - }, - "node_modules/superagent/node_modules/mime": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", - "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/superagent/node_modules/qs": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", - "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", - "dev": true, - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/superagent/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/superagent/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/superagent/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/supertest": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.1.3.tgz", - "integrity": "sha512-v2NVRyP73XDewKb65adz+yug1XMtmvij63qIWHZzSX8tp6wiq6xBLUy4SUAd2NII6wIipOmHT/FD9eicpJwdgQ==", - "dev": true, - "dependencies": { - "methods": "^1.1.2", - "superagent": "^6.1.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "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/supports-hyperlinks": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", - "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/symbol-observable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-3.0.0.tgz", - "integrity": "sha512-6tDOXSHiVjuCaasQSWTmHUWn4PuG7qa3+1WT031yTc/swT7+rLiw3GOrFxaH1E3lLP09dH3bVuVDf2gK5rxG3Q==", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "node_modules/table": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", - "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", - "dev": true, - "dependencies": { - "ajv": "^8.0.1", - "lodash.clonedeep": "^4.5.0", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/table/node_modules/ajv": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz", - "integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==", - "dev": true, - "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/table/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==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/table/node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/terser": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.7.0.tgz", - "integrity": "sha512-HP5/9hp2UaZt5fYkuhNBR8YyRcT8juw8+uFbAme53iN9hblvKnLUTKkmwJG6ocWpIKf8UK4DoeWG4ty0J6S6/g==", - "dev": true, - "dependencies": { - "commander": "^2.20.0", - "source-map": "~0.7.2", - "source-map-support": "~0.5.19" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.1.3.tgz", - "integrity": "sha512-cxGbMqr6+A2hrIB5ehFIF+F/iST5ZOxvOmy9zih9ySbP1C2oEWQSOUS+2SNBTjzx5xLKO4xnod9eywdfq1Nb9A==", - "dev": true, - "dependencies": { - "jest-worker": "^27.0.2", - "p-limit": "^3.1.0", - "schema-utils": "^3.0.0", - "serialize-javascript": "^5.0.1", - "source-map": "^0.6.1", - "terser": "^5.7.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - } - }, - "node_modules/terser-webpack-plugin/node_modules/jest-worker": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.0.2.tgz", - "integrity": "sha512-EoBdilOTTyOgmHXtw/cPc+ZrCA0KJMrkXzkrPGNwLmnvvlN1nj7MPrxpT7m+otSv2e1TLaVffzDnE/LB14zJMg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/terser-webpack-plugin/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/terser-webpack-plugin/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/terser-webpack-plugin/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", - "dev": true - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", - "dev": true - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-object-path/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "dependencies": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tough-cookie": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", - "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", - "dev": true, - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.1.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tough-cookie/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "dev": true, - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, - "bin": { - "tree-kill": "cli.js" - } - }, - "node_modules/ts-jest": { - "version": "26.5.6", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.5.6.tgz", - "integrity": "sha512-rua+rCP8DxpA8b4DQD/6X2HQS8Zy/xzViVYfEs2OQu68tkCuKLV0Md8pmX55+W24uRIyAsf/BajRfxOs+R2MKA==", - "dev": true, - "dependencies": { - "bs-logger": "0.x", - "buffer-from": "1.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^26.1.0", - "json5": "2.x", - "lodash": "4.x", - "make-error": "1.x", - "mkdirp": "1.x", - "semver": "7.x", - "yargs-parser": "20.x" - }, - "bin": { - "ts-jest": "cli.js" - }, - "engines": { - "node": ">= 10" - }, - "peerDependencies": { - "jest": ">=26 <27", - "typescript": ">=3.8 <5.0" - } - }, - "node_modules/ts-jest/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ts-loader": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-8.3.0.tgz", - "integrity": "sha512-MgGly4I6cStsJy27ViE32UoqxPTN9Xly4anxxVyaIWR+9BGxboV4EyJBGfR3RePV7Ksjj3rHmPZJeIt+7o4Vag==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "enhanced-resolve": "^4.0.0", - "loader-utils": "^2.0.0", - "micromatch": "^4.0.0", - "semver": "^7.3.4" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "typescript": "*", - "webpack": "*" - } - }, - "node_modules/ts-loader/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/ts-node": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", - "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", - "dev": true, - "dependencies": { - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "source-map-support": "^0.5.17", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "typescript": ">=2.7" - } - }, - "node_modules/tsconfig-paths": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", - "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", - "dev": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.0", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths-webpack-plugin": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-3.5.1.tgz", - "integrity": "sha512-n5CMlUUj+N5pjBhBACLq4jdr9cPTitySCjIosoQm0zwK99gmrcTGAfY9CwxRFT9+9OleNWXPRUcxsKP4AYExxQ==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "enhanced-resolve": "^5.7.0", - "tsconfig-paths": "^3.9.0" - } - }, - "node_modules/tsconfig-paths-webpack-plugin/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "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/tsconfig-paths-webpack-plugin/node_modules/enhanced-resolve": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.2.tgz", - "integrity": "sha512-F27oB3WuHDzvR2DOGNTaYy0D5o0cnrv8TeI482VM4kYgQd/FT9lUQwuNsJ0oOHtBUq7eiW5ytqzp7nBFknL+GA==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/tsconfig-paths-webpack-plugin/node_modules/tapable": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz", - "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/tsconfig-paths/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "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": "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/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typeorm": { - "version": "0.2.34", - "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.2.34.tgz", - "integrity": "sha512-FZAeEGGdSGq7uTH3FWRQq67JjKu0mgANsSZ04j3kvDYNgy9KwBl/6RFgMVgiSgjf7Rqd7NrhC2KxVT7I80qf7w==", - "dependencies": { - "@sqltools/formatter": "^1.2.2", - "app-root-path": "^3.0.0", - "buffer": "^6.0.3", - "chalk": "^4.1.0", - "cli-highlight": "^2.1.10", - "debug": "^4.3.1", - "dotenv": "^8.2.0", - "glob": "^7.1.6", - "js-yaml": "^4.0.0", - "mkdirp": "^1.0.4", - "reflect-metadata": "^0.1.13", - "sha.js": "^2.4.11", - "tslib": "^2.1.0", - "xml2js": "^0.4.23", - "yargonaut": "^1.1.4", - "yargs": "^16.2.0", - "zen-observable-ts": "^1.0.0" - }, - "bin": { - "typeorm": "cli.js" - }, - "funding": { - "url": "https://opencollective.com/typeorm" - } - }, - "node_modules/typeorm/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/typeorm/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "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.2.1" - } - }, - "node_modules/typeorm/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "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/typeorm/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/typeorm/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/typeorm/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/typeorm/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/typeorm/node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/typeorm/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "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/typeorm/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/typeorm/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/typescript": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.2.tgz", - "integrity": "sha512-zZ4hShnmnoVnAHpVHWpTcxdv7dWP60S2FsydQLV8V5PbS3FifjWFFRiHSWpDJahly88PRyV5teTSLoq4eG7mKw==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/uid-safe": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", - "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", - "dependencies": { - "random-bytes": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/uid2": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz", - "integrity": "sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I=" - }, - "node_modules/union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "dependencies": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/union-value/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "dependencies": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "dependencies": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "dependencies": { - "isarray": "1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "deprecated": "Please see https://github.com/lydell/urix#deprecated", - "dev": true - }, - "node_modules/use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "engines": { - "node": ">= 0.4.0" - } - }, - "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/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "node_modules/v8-to-istanbul": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz", - "integrity": "sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/validator": { - "version": "13.6.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.6.0.tgz", - "integrity": "sha512-gVgKbdbHgtxpRyR8K0O6oFZPhhB5tT1jeEHZR0Znr9Svg03U0+r9DXWMrnRAB+HtCStDQKlaIZm42tVsVjqtjg==", - "peer": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dev": true, - "dependencies": { - "browser-process-hrtime": "^1.0.0" - } - }, - "node_modules/w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dev": true, - "dependencies": { - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/walker": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", - "dev": true, - "dependencies": { - "makeerror": "1.0.x" - } - }, - "node_modules/watchpack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.2.0.tgz", - "integrity": "sha512-up4YAn/XHgZHIxFBVCdlMiWDj6WaLKpwVeGQk2I5thdYxF/KmF0aaz6TfJZ/hfl1h/XlcDr7k1KH7ThDagpFaA==", - "dev": true, - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", - "dev": true, - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true, - "engines": { - "node": ">=10.4" - } - }, - "node_modules/webpack": { - "version": "5.38.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.38.1.tgz", - "integrity": "sha512-OqRmYD1OJbHZph6RUMD93GcCZy4Z4wC0ele4FXyYF0J6AxO1vOSuIlU1hkS/lDlR9CDYBz64MZRmdbdnFFoT2g==", - "dev": true, - "peer": true, - "dependencies": { - "@types/eslint-scope": "^3.7.0", - "@types/estree": "^0.0.47", - "@webassemblyjs/ast": "1.11.0", - "@webassemblyjs/wasm-edit": "1.11.0", - "@webassemblyjs/wasm-parser": "1.11.0", - "acorn": "^8.2.1", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.8.0", - "es-module-lexer": "^0.4.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.4", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.0.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.1", - "watchpack": "^2.2.0", - "webpack-sources": "^2.3.0" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-node-externals": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-2.5.2.tgz", - "integrity": "sha512-aHdl/y2N7PW2Sx7K+r3AxpJO+aDMcYzMQd60Qxefq3+EwhewSbTBqNumOsCE1JsCUNoyfGj5465N0sSf6hc/5w==", - "dev": true - }, - "node_modules/webpack-sources": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.0.tgz", - "integrity": "sha512-WyOdtwSvOML1kbgtXbTDnEW0jkJ7hZr/bDByIwszhWd/4XX1A3XMkrbFMsuH4+/MfLlZCUzlAdg4r7jaGKEIgQ==", - "dev": true, - "dependencies": { - "source-list-map": "^2.0.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack-sources/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack/node_modules/acorn": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.3.0.tgz", - "integrity": "sha512-tqPKHZ5CaBJw0Xmy0ZZvLs1qTV+BNFSyvn77ASXkpBNfIRk8ev26fKrD9iLGwGA9zedPao52GSHzq8lyZG0NUw==", - "dev": true, - "peer": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/webpack/node_modules/enhanced-resolve": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.2.tgz", - "integrity": "sha512-F27oB3WuHDzvR2DOGNTaYy0D5o0cnrv8TeI482VM4kYgQd/FT9lUQwuNsJ0oOHtBUq7eiW5ytqzp7nBFknL+GA==", - "dev": true, - "peer": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", - "dev": true, - "peer": true, - "dependencies": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/webpack/node_modules/tapable": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz", - "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dev": true, - "dependencies": { - "iconv-lite": "0.4.24" - } - }, - "node_modules/whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true - }, - "node_modules/whatwg-url": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.5.0.tgz", - "integrity": "sha512-fy+R77xWv0AiqfLl4nuGUlQ3/6b5uNfQ4WAbGQVMYshCTCCPK9psC1nWh3XHuxGVCtlcDDQPQW1csmmIQo+fwg==", - "dev": true, - "dependencies": { - "lodash": "^4.7.0", - "tr46": "^2.0.2", - "webidl-conversions": "^6.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "node_modules/windows-release": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-4.0.0.tgz", - "integrity": "sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==", - "dev": true, - "dependencies": { - "execa": "^4.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/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==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "dev": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true - }, - "node_modules/xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/yargonaut": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/yargonaut/-/yargonaut-1.1.4.tgz", - "integrity": "sha512-rHgFmbgXAAzl+1nngqOcwEljqHGG9uUZoPjsdZEs1w5JW9RXYzrSvH/u70C1JE5qFi0qjsdhnUX/dJRpWqitSA==", - "dependencies": { - "chalk": "^1.1.1", - "figlet": "^1.1.1", - "parent-require": "^1.0.0" - } - }, - "node_modules/yargonaut/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yargonaut/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yargonaut/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "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/yargonaut/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/yargonaut/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yargonaut/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.7", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", - "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs/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==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zen-observable": { - "version": "0.8.15", - "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz", - "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==" - }, - "node_modules/zen-observable-ts": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-1.0.0.tgz", - "integrity": "sha512-KmWcbz+9kKUeAQ8btY8m1SsEFgBcp7h/Uf3V5quhan7ZWdjGsf0JcGLULQiwOZibbFWnHkYq8Nn2AZbJabovQg==", - "dependencies": { - "@types/zen-observable": "^0.8.2", - "zen-observable": "^0.8.15" - } - } - }, - "dependencies": { - "@angular-devkit/core": { - "version": "11.2.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-11.2.6.tgz", - "integrity": "sha512-3dA0Z6sIIxCDjZS/DucgmIKti7EZ/LgHoHgCO72Q50H5ZXbUSNBz5wGl5hVq2+gzrnFgU/0u40MIs6eptk30ZA==", - "dev": true, - "requires": { - "ajv": "6.12.6", - "fast-json-stable-stringify": "2.1.0", - "magic-string": "0.25.7", - "rxjs": "6.6.3", - "source-map": "0.7.3" - }, - "dependencies": { - "rxjs": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", - "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "@angular-devkit/schematics": { - "version": "11.2.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-11.2.6.tgz", - "integrity": "sha512-bhi2+5xtVAjtr3bsXKT8pnoBamQrArd/Y20ueA4Od7cd38YT97nzTA1wyHBFG0vWd0HMyg42ZS0aycNBuOebaA==", - "dev": true, - "requires": { - "@angular-devkit/core": "11.2.6", - "ora": "5.3.0", - "rxjs": "6.6.3" - }, - "dependencies": { - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "ora": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", - "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", - "dev": true, - "requires": { - "bl": "^4.0.3", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "log-symbols": "^4.0.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - } - }, - "rxjs": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", - "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "@angular-devkit/schematics-cli": { - "version": "0.1102.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics-cli/-/schematics-cli-0.1102.6.tgz", - "integrity": "sha512-86PmafA9mYDeM08cNWHcJCEY1Yqo5aq/YaBzCak93luByDQ4Ao4Jqts9l/xBCZBGUdVrczCNzcdwr/Y/6JPPzA==", - "dev": true, - "requires": { - "@angular-devkit/core": "11.2.6", - "@angular-devkit/schematics": "11.2.6", - "@schematics/schematics": "0.1102.6", - "ansi-colors": "4.1.1", - "inquirer": "7.3.3", - "minimist": "1.2.5", - "symbol-observable": "3.0.0" - } - }, - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/compat-data": { - "version": "7.14.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.4.tgz", - "integrity": "sha512-i2wXrWQNkH6JplJQGn3Rd2I4Pij8GdHkXwHMxm+zV5YG/Jci+bCNrWZEWC4o+umiDkRrRs4dVzH3X4GP7vyjQQ==", - "dev": true - }, - "@babel/core": { - "version": "7.14.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.3.tgz", - "integrity": "sha512-jB5AmTKOCSJIZ72sd78ECEhuPiDMKlQdDI/4QRI6lzYATx5SSogS1oQA2AoPecRCknm30gHi2l+QVvNUu3wZAg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.14.3", - "@babel/helper-compilation-targets": "^7.13.16", - "@babel/helper-module-transforms": "^7.14.2", - "@babel/helpers": "^7.14.0", - "@babel/parser": "^7.14.3", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.14.2", - "@babel/types": "^7.14.2", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.12.13" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.14.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.3.tgz", - "integrity": "sha512-bn0S6flG/j0xtQdz3hsjJ624h3W0r3llttBMfyHX3YrZ/KtLYr15bjA0FXkgW7FpvrDuTuElXeVjiKlYRpnOFA==", - "dev": true, - "requires": { - "@babel/types": "^7.14.2", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@babel/helper-compilation-targets": { - "version": "7.14.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.4.tgz", - "integrity": "sha512-JgdzOYZ/qGaKTVkn5qEDV/SXAh8KcyUVkCoSWGN8T3bwrgd6m+/dJa2kVGi6RJYJgEYPBdZ84BZp9dUjNWkBaA==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.14.4", - "@babel/helper-validator-option": "^7.12.17", - "browserslist": "^4.16.6", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/helper-function-name": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz", - "integrity": "sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.14.2" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", - "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", - "dev": true, - "requires": { - "@babel/types": "^7.13.12" - } - }, - "@babel/helper-module-imports": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", - "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", - "dev": true, - "requires": { - "@babel/types": "^7.13.12" - } - }, - "@babel/helper-module-transforms": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.2.tgz", - "integrity": "sha512-OznJUda/soKXv0XhpvzGWDnml4Qnwp16GN+D/kZIdLsWoHj05kyu8Rm5kXmMef+rVJZ0+4pSGLkeixdqNUATDA==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.13.12", - "@babel/helper-replace-supers": "^7.13.12", - "@babel/helper-simple-access": "^7.13.12", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/helper-validator-identifier": "^7.14.0", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.14.2", - "@babel/types": "^7.14.2" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", - "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - }, - "@babel/helper-replace-supers": { - "version": "7.14.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.4.tgz", - "integrity": "sha512-zZ7uHCWlxfEAAOVDYQpEf/uyi1dmeC7fX4nCf2iz9drnCwi1zvwXL3HwWWNXUQEJ1k23yVn3VbddiI9iJEXaTQ==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.13.12", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/traverse": "^7.14.2", - "@babel/types": "^7.14.4" - } - }, - "@babel/helper-simple-access": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", - "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", - "dev": true, - "requires": { - "@babel/types": "^7.13.12" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", - "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", - "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==", - "dev": true - }, - "@babel/helpers": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.0.tgz", - "integrity": "sha512-+ufuXprtQ1D1iZTO/K9+EBRn+qPWMJjZSw/S0KlFrxCw4tkrzv9grgpDHkY9MeQTjTY8i2sp7Jep8DfU6tN9Mg==", - "dev": true, - "requires": { - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.14.0", - "@babel/types": "^7.14.0" - } - }, - "@babel/highlight": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", - "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.0", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.14.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.4.tgz", - "integrity": "sha512-ArliyUsWDUqEGfWcmzpGUzNfLxTdTp6WU4IuP6QFSp9gGfWS6boxFCkJSJ/L4+RG8z/FnIU3WxCk6hPL9SSWeA==", - "dev": true - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz", - "integrity": "sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.12.13" - } - } - } - }, - "@babel/traverse": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.2.tgz", - "integrity": "sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.14.2", - "@babel/helper-function-name": "^7.14.2", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.14.2", - "@babel/types": "^7.14.2", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.12.13" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.14.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.4.tgz", - "integrity": "sha512-lCj4aIs0xUefJFQnwwQv2Bxg7Omd6bgquZ6LGC+gGMh6/s5qDVfjuCMlDmYQ15SLsWHd9n+X3E75lKIhl5Lkiw==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.0", - "to-fast-properties": "^2.0.0" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "@cnakazawa/watch": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", - "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", - "dev": true, - "requires": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" - } - }, - "@eslint/eslintrc": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.2.tgz", - "integrity": "sha512-8nmGq/4ycLpIwzvhI4tNDmQztZ8sp+hI7cyG8i1nQDhkAbRzHpXPidRAHlNvCZQpJTKw5ItIpMw9RSToGF00mg==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - } - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@jest/console": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", - "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^26.6.2", - "jest-util": "^26.6.2", - "slash": "^3.0.0" - }, - "dependencies": { - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "@jest/core": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", - "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", - "dev": true, - "requires": { - "@jest/console": "^26.6.2", - "@jest/reporters": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-changed-files": "^26.6.2", - "jest-config": "^26.6.3", - "jest-haste-map": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-resolve-dependencies": "^26.6.3", - "jest-runner": "^26.6.3", - "jest-runtime": "^26.6.3", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "jest-watcher": "^26.6.2", - "micromatch": "^4.0.2", - "p-each-series": "^2.1.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "@jest/environment": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", - "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", - "dev": true, - "requires": { - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "jest-mock": "^26.6.2" - } - }, - "@jest/fake-timers": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", - "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "@sinonjs/fake-timers": "^6.0.1", - "@types/node": "*", - "jest-message-util": "^26.6.2", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2" - } - }, - "@jest/globals": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", - "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", - "dev": true, - "requires": { - "@jest/environment": "^26.6.2", - "@jest/types": "^26.6.2", - "expect": "^26.6.2" - } - }, - "@jest/reporters": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", - "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.4", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.3", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "jest-haste-map": "^26.6.2", - "jest-resolve": "^26.6.2", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "node-notifier": "^8.0.0", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^7.0.0" - }, - "dependencies": { - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "@jest/source-map": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", - "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", - "dev": true, - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.4", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "@jest/test-result": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", - "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", - "dev": true, - "requires": { - "@jest/console": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/test-sequencer": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", - "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", - "dev": true, - "requires": { - "@jest/test-result": "^26.6.2", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.2", - "jest-runner": "^26.6.3", - "jest-runtime": "^26.6.3" - } - }, - "@jest/transform": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", - "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^26.6.2", - "babel-plugin-istanbul": "^6.0.0", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-util": "^26.6.2", - "micromatch": "^4.0.2", - "pirates": "^4.0.1", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - }, - "dependencies": { - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "@jest/types": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - }, - "dependencies": { - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "@nestjs/cli": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-7.6.0.tgz", - "integrity": "sha512-lW1px2gSHkRoBpKSxzP6IJNQscRKs97OAaVyV46OAP6oUR996E0EPkIslIaa16kKLJ3SFOUeZo5xl5nYbqp43g==", - "dev": true, - "requires": { - "@angular-devkit/core": "11.2.6", - "@angular-devkit/schematics": "11.2.6", - "@angular-devkit/schematics-cli": "0.1102.6", - "@nestjs/schematics": "^7.3.0", - "chalk": "3.0.0", - "chokidar": "3.5.1", - "cli-table3": "0.5.1", - "commander": "4.1.1", - "fork-ts-checker-webpack-plugin": "6.2.0", - "inquirer": "7.3.3", - "node-emoji": "1.10.0", - "ora": "5.4.0", - "os-name": "4.0.0", - "rimraf": "3.0.2", - "shelljs": "0.8.4", - "tree-kill": "1.2.2", - "tsconfig-paths": "3.9.0", - "tsconfig-paths-webpack-plugin": "3.5.1", - "typescript": "4.2.3", - "webpack": "5.28.0", - "webpack-node-externals": "2.5.2" - }, - "dependencies": { - "@types/estree": { - "version": "0.0.46", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.46.tgz", - "integrity": "sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg==", - "dev": true - }, - "acorn": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.3.0.tgz", - "integrity": "sha512-tqPKHZ5CaBJw0Xmy0ZZvLs1qTV+BNFSyvn77ASXkpBNfIRk8ev26fKrD9iLGwGA9zedPao52GSHzq8lyZG0NUw==", - "dev": true - }, - "enhanced-resolve": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.2.tgz", - "integrity": "sha512-F27oB3WuHDzvR2DOGNTaYy0D5o0cnrv8TeI482VM4kYgQd/FT9lUQwuNsJ0oOHtBUq7eiW5ytqzp7nBFknL+GA==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - } - }, - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - }, - "tapable": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz", - "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==", - "dev": true - }, - "typescript": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz", - "integrity": "sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==", - "dev": true - }, - "webpack": { - "version": "5.28.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.28.0.tgz", - "integrity": "sha512-1xllYVmA4dIvRjHzwELgW4KjIU1fW4PEuEnjsylz7k7H5HgPOctIq7W1jrt3sKH9yG5d72//XWzsHhfoWvsQVg==", - "dev": true, - "requires": { - "@types/eslint-scope": "^3.7.0", - "@types/estree": "^0.0.46", - "@webassemblyjs/ast": "1.11.0", - "@webassemblyjs/wasm-edit": "1.11.0", - "@webassemblyjs/wasm-parser": "1.11.0", - "acorn": "^8.0.4", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.7.0", - "es-module-lexer": "^0.4.0", - "eslint-scope": "^5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.4", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.0.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.1", - "watchpack": "^2.0.0", - "webpack-sources": "^2.1.1" - } - } - } - }, - "@nestjs/common": { - "version": "7.6.17", - "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-7.6.17.tgz", - "integrity": "sha512-RHvD32FxfV7yDWX9GPmn0ZSv7ka5kLeVamU5ZpoXSTUjkGqWFt3MTyIP+HUQD2778kDqT+CgEtVJ1fxDG5Oh9g==", - "requires": { - "axios": "0.21.1", - "iterare": "1.2.1", - "tslib": "2.2.0", - "uuid": "8.3.2" - } - }, - "@nestjs/core": { - "version": "7.6.17", - "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-7.6.17.tgz", - "integrity": "sha512-dH7PGDj1dvBfOYgxJlxh54vdnFFSLst7+Spg3E7Jpo+n11Ht5Ee5mTjSzXieRVfFba/sI3NIHF/N1stn36bU9w==", - "requires": { - "@nuxtjs/opencollective": "0.3.2", - "fast-safe-stringify": "2.0.7", - "iterare": "1.2.1", - "object-hash": "2.1.1", - "path-to-regexp": "3.2.0", - "tslib": "2.2.0", - "uuid": "8.3.2" - } - }, - "@nestjs/jwt": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@nestjs/jwt/-/jwt-7.2.0.tgz", - "integrity": "sha512-uOTqYmWNpu+oS/MrdYjrWXtKGV4HkCYmAEVEFPP/KfiP/7K6fNy+boLllE6cnqESAXh9u0CLa1noAAavs+LHEQ==", - "requires": { - "@types/jsonwebtoken": "8.5.0", - "jsonwebtoken": "8.5.1" - } - }, - "@nestjs/mapped-types": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-0.4.1.tgz", - "integrity": "sha512-JXrw2LMangSU3vnaXWXVX47GRG1FbbNh4aVBbidDjxT3zlghsoNQY6qyWtT001MCl8lJGo8I6i6+DurBRRxl/Q==", - "requires": {} - }, - "@nestjs/passport": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/@nestjs/passport/-/passport-7.1.5.tgz", - "integrity": "sha512-Hu9hPxTdBZA0C4GrWTsSflzwsJ99oAk9jqAwpcszdFNqfjMjkPGuCM9QsVZbBP2bE8fxrVrPsNOILS6puY8e/A==", - "requires": {} - }, - "@nestjs/platform-express": { - "version": "7.6.17", - "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-7.6.17.tgz", - "integrity": "sha512-lyMwx8X/zTXZzxrd6Xn8BEcS/wuFyEgRVk9f15Z29hSaWHd78mUlBXvSnKJpzsN7wTjU8YWbAy/Ig9kIBS6efg==", - "requires": { - "body-parser": "1.19.0", - "cors": "2.8.5", - "express": "4.17.1", - "multer": "1.4.2", - "tslib": "2.2.0" - } - }, - "@nestjs/schematics": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-7.3.1.tgz", - "integrity": "sha512-eyBjJstAjecpdzRuBLiqnwomwXIAEV3+kPkpaphOieRUM6nBhjnXCCl3Qf8Dul2QUQK4NOVPd8FFxWtGP5XNlg==", - "dev": true, - "requires": { - "@angular-devkit/core": "11.2.4", - "@angular-devkit/schematics": "11.2.4", - "fs-extra": "9.1.0", - "jsonc-parser": "3.0.0", - "pluralize": "8.0.0" - }, - "dependencies": { - "@angular-devkit/core": { - "version": "11.2.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-11.2.4.tgz", - "integrity": "sha512-98mGDV4XtKWiQ/2D6yzvOHrnJovXchaAN9AjscAHd2an8Fkiq72d9m2wREpk+2J40NWTDB6J5iesTh3qbi8+CA==", - "dev": true, - "requires": { - "ajv": "6.12.6", - "fast-json-stable-stringify": "2.1.0", - "magic-string": "0.25.7", - "rxjs": "6.6.3", - "source-map": "0.7.3" - } - }, - "@angular-devkit/schematics": { - "version": "11.2.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-11.2.4.tgz", - "integrity": "sha512-M9Ike1TYawOIHzenlZS1ufQbsS+Z11/doj5w/UrU0q2OEKc6U375t5qVGgKo3PLHHS8osb9aW9xYwBfVlKrryQ==", - "dev": true, - "requires": { - "@angular-devkit/core": "11.2.4", - "ora": "5.3.0", - "rxjs": "6.6.3" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "ora": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", - "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", - "dev": true, - "requires": { - "bl": "^4.0.3", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "log-symbols": "^4.0.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - } - }, - "rxjs": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", - "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "@nestjs/serve-static": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@nestjs/serve-static/-/serve-static-2.1.4.tgz", - "integrity": "sha512-w2PpLKzQOB8rJ+vMOy28xm8jwE8VjJfA9U+KOm0H0OY62g2oOWJ+OQPSDogP7XxAzZwq+Bt8wNU2oS8+z6v6Zg==", - "requires": { - "path-to-regexp": "0.1.7" - }, - "dependencies": { - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - } - } - }, - "@nestjs/testing": { - "version": "7.6.17", - "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-7.6.17.tgz", - "integrity": "sha512-wWImNvfRapCCtLXMsxCs1Ax2Uj/qSytCnolSEXL7LnH80exwHRmBeLtTfGxArsv9Y1NHr24NarfN6H0QxysZ3g==", - "dev": true, - "requires": { - "optional": "0.1.4", - "tslib": "2.2.0" - } - }, - "@nestjs/typeorm": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/@nestjs/typeorm/-/typeorm-7.1.5.tgz", - "integrity": "sha512-utE1FkYM/gyCXUqw3zKYYS0YZ3DfkAnzsCx4T48cNnSDTCeWS+u3yt0FMDFjwSiQSaLrzpiSff/FaxJQvRlYow==", - "requires": { - "uuid": "8.3.1" - }, - "dependencies": { - "uuid": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.1.tgz", - "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==" - } - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.7.tgz", - "integrity": "sha512-BTIhocbPBSrRmHxOAJFtR18oLhxTtAFDAvL8hY1S3iU8k+E60W/YFs4jrixGzQjMpF4qPXxIQHcjVD9dz1C2QA==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@nuxtjs/opencollective": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.3.2.tgz", - "integrity": "sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==", - "requires": { - "chalk": "^4.1.0", - "consola": "^2.15.0", - "node-fetch": "^2.6.1" - }, - "dependencies": { - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "@schematics/schematics": { - "version": "0.1102.6", - "resolved": "https://registry.npmjs.org/@schematics/schematics/-/schematics-0.1102.6.tgz", - "integrity": "sha512-x77kbJL/HqR4gx0tbt35VCOGLyMvB7jD/x7eB1njhQRF8E/xynEOk3i+7A5VmK67QP5NJxU8BQKlPkJ55tBDmg==", - "dev": true, - "requires": { - "@angular-devkit/core": "11.2.6", - "@angular-devkit/schematics": "11.2.6" - } - }, - "@sendgrid/client": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@sendgrid/client/-/client-7.4.3.tgz", - "integrity": "sha512-tTaHx893w5iqG0sVtUnMyRchuwYF95k4UOkmov1MouMIeMUbNvbalITo7cG7YSXUTY9rT2t4eBY6HcEBCVeqfg==", - "requires": { - "@sendgrid/helpers": "^7.4.3", - "axios": "^0.21.1" - } - }, - "@sendgrid/helpers": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@sendgrid/helpers/-/helpers-7.4.3.tgz", - "integrity": "sha512-Wt+68g1sVEM5UspJh34O/cxtv6BBbtAIk7U9B3PB2ySOtPs9e6hI1QkgYVwpNmkt7k2p86muUNyma/Aig25agg==", - "requires": { - "deepmerge": "^4.2.2" - } - }, - "@sendgrid/mail": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@sendgrid/mail/-/mail-7.4.5.tgz", - "integrity": "sha512-adXMvrTUOlYr7+UTigZRGSYR9vheBv1y4fF2mugn29NBdQMfcQPGLQ5vIHgSAfcboBFCagZdamZqM5FeSGU0Hw==", - "requires": { - "@sendgrid/client": "^7.4.3", - "@sendgrid/helpers": "^7.4.3" - } - }, - "@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", - "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" - } - }, - "@sqltools/formatter": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@sqltools/formatter/-/formatter-1.2.3.tgz", - "integrity": "sha512-O3uyB/JbkAEMZaP3YqyHH7TMnex7tWyCbCI4EfJdOCoN6HIhqdJBWTM6aCCiWQ/5f5wxjgU735QAIpJbjDvmzg==" - }, - "@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true - }, - "@types/babel__core": { - "version": "7.1.14", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.14.tgz", - "integrity": "sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", - "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", - "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.1.tgz", - "integrity": "sha512-Vs0hm0vPahPMYi9tDjtP66llufgO3ST16WXaSTtDGEl9cewAl3AibmxWw6TINOqHPT9z0uABKAYjT9jNSg4npw==", - "dev": true, - "requires": { - "@babel/types": "^7.3.0" - } - }, - "@types/body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", - "dev": true, - "requires": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "@types/connect": { - "version": "3.4.34", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.34.tgz", - "integrity": "sha512-ePPA/JuI+X0vb+gSWlPKOY0NdNAie/rPUqX2GUPpbZwiKTkSPhjXWuee47E4MtE54QVzGCQMQkAL6JhV2E1+cQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/cookiejar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.2.tgz", - "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==", - "dev": true - }, - "@types/eslint": { - "version": "7.2.13", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.13.tgz", - "integrity": "sha512-LKmQCWAlnVHvvXq4oasNUMTJJb2GwSyTY8+1C7OH5ILR8mPLaljv1jxL1bXW3xB3jFbQxTKxJAvI8PyjB09aBg==", - "dev": true, - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/eslint-scope": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.0.tgz", - "integrity": "sha512-O/ql2+rrCUe2W2rs7wMR+GqPRcgB6UiqN5RhrR5xruFlY7l9YLMn0ZkDzjoHLeiFkR8MCQZVudUuuvQ2BLC9Qw==", - "dev": true, - "requires": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "@types/estree": { - "version": "0.0.47", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.47.tgz", - "integrity": "sha512-c5ciR06jK8u9BstrmJyO97m+klJrrhCf9u3rLu3DEAJBirxRqSCvDQoYKmxuYwQI5SZChAWu+tq9oVlGRuzPAg==", - "dev": true - }, - "@types/express": { - "version": "4.17.12", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.12.tgz", - "integrity": "sha512-pTYas6FrP15B1Oa0bkN5tQMNqOcVXa9j4FTFtO8DWI9kppKib+6NJtfTOOLcwxuuYvcX2+dVG6et1SxW/Kc17Q==", - "dev": true, - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.18", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "@types/express-serve-static-core": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.21.tgz", - "integrity": "sha512-gwCiEZqW6f7EoR8TTEfalyEhb1zA5jQJnRngr97+3pzMaO1RKoI1w2bw07TK72renMUVWcWS5mLI6rk1NqN0nA==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, - "@types/express-session": { - "version": "1.17.3", - "resolved": "https://registry.npmjs.org/@types/express-session/-/express-session-1.17.3.tgz", - "integrity": "sha512-57DnyxiqClXOIjoCgeKCUYfKxBPOlOY/k+l1TPK+7bSwyiPTrS5FIk1Ycql7twk4wO7P5lfOVy6akDGiaMSLfw==", - "dev": true, - "requires": { - "@types/express": "*" - } - }, - "@types/graceful-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", - "dev": true - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/jest": { - "version": "26.0.23", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.23.tgz", - "integrity": "sha512-ZHLmWMJ9jJ9PTiT58juykZpL7KjwJywFN3Rr2pTSkyQfydf/rk22yS7W8p5DaVUMQ2BQC7oYiU3FjbTM/mYrOA==", - "dev": true, - "requires": { - "jest-diff": "^26.0.0", - "pretty-format": "^26.0.0" - } - }, - "@types/json-schema": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", - "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", - "dev": true - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", - "dev": true - }, - "@types/jsonwebtoken": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.0.tgz", - "integrity": "sha512-9bVao7LvyorRGZCw0VmH/dr7Og+NdjYSsKAxB43OQoComFbBgsEpoR9JW6+qSq/ogwVBg8GI2MfAlk4SYI4OLg==", - "requires": { - "@types/node": "*" - } - }, - "@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", - "dev": true - }, - "@types/node": { - "version": "14.17.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.3.tgz", - "integrity": "sha512-e6ZowgGJmTuXa3GyaPbTGxX17tnThl2aSSizrFthQ7m9uLGZBXiGhgE55cjRZTF5kjZvYn9EOPOMljdjwbflxw==" - }, - "@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", - "dev": true - }, - "@types/oauth": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@types/oauth/-/oauth-0.9.1.tgz", - "integrity": "sha512-a1iY62/a3yhZ7qH7cNUsxoI3U/0Fe9+RnuFrpTKr+0WVOzbKlSLojShCKe20aOD1Sppv+i8Zlq0pLDuTJnwS4A==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, - "@types/passport": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.6.tgz", - "integrity": "sha512-9oKfrJXuAxvyxdrtMCxKkHgmd6DMO8NDOLvMJ1LvIWd6/xP+i81PAkpTaEca7VhJX9S009RciwZL/j6dsLsHrA==", - "dev": true, - "requires": { - "@types/express": "*" - } - }, - "@types/passport-google-oauth20": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@types/passport-google-oauth20/-/passport-google-oauth20-2.0.8.tgz", - "integrity": "sha512-Lc+DYCCFeMVbodISydQLT6PjIlL0TcLup3HMiJ8RHHHBltArA3oC4qocyQH1OsEq5ovQ19PaKlpGqsNT8NYz1w==", - "dev": true, - "requires": { - "@types/express": "*", - "@types/passport": "*", - "@types/passport-oauth2": "*" - } - }, - "@types/passport-jwt": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/passport-jwt/-/passport-jwt-3.0.5.tgz", - "integrity": "sha512-O6zZ4WKzQUwg3OU0MnOA2AIEQ6KfHyGdLoi4fqBLyb+kV7miGKNA2KNJRtiq45EsQ2QEDO8rKqORjXpWV7UJNg==", - "dev": true, - "requires": { - "@types/express": "*", - "@types/jsonwebtoken": "*", - "@types/passport-strategy": "*" - } - }, - "@types/passport-local": { - "version": "1.0.33", - "resolved": "https://registry.npmjs.org/@types/passport-local/-/passport-local-1.0.33.tgz", - "integrity": "sha512-+rn6ZIxje0jZ2+DAiWFI8vGG7ZFKB0hXx2cUdMmudSWsigSq6ES7Emso46r4HJk0qCgrZVfI8sJiM7HIYf4SbA==", - "dev": true, - "requires": { - "@types/express": "*", - "@types/passport": "*", - "@types/passport-strategy": "*" - } - }, - "@types/passport-oauth2": { - "version": "1.4.10", - "resolved": "https://registry.npmjs.org/@types/passport-oauth2/-/passport-oauth2-1.4.10.tgz", - "integrity": "sha512-klShWm9xAqjM3rU31KyMMiB9M8jmJPkStUvCJ/kIv73/Vh3OVnfeTExrkMCM2wA+94MliExqwHVL3J0WD2kbnQ==", - "dev": true, - "requires": { - "@types/express": "*", - "@types/oauth": "*", - "@types/passport": "*" - } - }, - "@types/passport-strategy": { - "version": "0.2.35", - "resolved": "https://registry.npmjs.org/@types/passport-strategy/-/passport-strategy-0.2.35.tgz", - "integrity": "sha512-o5D19Jy2XPFoX2rKApykY15et3Apgax00RRLf0RUotPDUsYrQa7x4howLYr9El2mlUApHmCMv5CZ1IXqKFQ2+g==", - "dev": true, - "requires": { - "@types/express": "*", - "@types/passport": "*" - } - }, - "@types/prettier": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.2.3.tgz", - "integrity": "sha512-PijRCG/K3s3w1We6ynUKdxEc5AcuuH3NBmMDP8uvKVp6X43UY7NQlTzczakXP3DJR0F4dfNQIGjU2cUeRYs2AA==", - "dev": true - }, - "@types/qs": { - "version": "6.9.6", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.6.tgz", - "integrity": "sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA==", - "dev": true - }, - "@types/range-parser": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", - "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==", - "dev": true - }, - "@types/serve-static": { - "version": "1.13.9", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.9.tgz", - "integrity": "sha512-ZFqF6qa48XsPdjXV5Gsz0Zqmux2PerNd3a/ktL45mHpa19cuMi/cL8tcxdAx497yRh+QtYPuofjT9oWw9P7nkA==", - "dev": true, - "requires": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "@types/stack-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", - "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", - "dev": true - }, - "@types/superagent": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.11.tgz", - "integrity": "sha512-cZkWBXZI+jESnUTp8RDGBmk1Zn2MkScP4V5bjD7DyqB7L0WNWpblh4KX5K/6aTqxFZMhfo1bhi2cwoAEDVBBJw==", - "dev": true, - "requires": { - "@types/cookiejar": "*", - "@types/node": "*" - } - }, - "@types/supertest": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-2.0.11.tgz", - "integrity": "sha512-uci4Esokrw9qGb9bvhhSVEjd6rkny/dk5PK/Qz4yxKiyppEI+dOPlNrZBahE3i+PoKFYyDxChVXZ/ysS/nrm1Q==", - "dev": true, - "requires": { - "@types/superagent": "*" - } - }, - "@types/validator": { - "version": "13.1.3", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.1.3.tgz", - "integrity": "sha512-DaOWN1zf7j+8nHhqXhIgNmS+ltAC53NXqGxYuBhWqWgqolRhddKzfZU814lkHQSTG0IUfQxU7Cg0gb8fFWo2mA==", - "peer": true - }, - "@types/yargs": { - "version": "15.0.13", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.13.tgz", - "integrity": "sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "20.2.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", - "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==", - "dev": true - }, - "@types/zen-observable": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/@types/zen-observable/-/zen-observable-0.8.2.tgz", - "integrity": "sha512-HrCIVMLjE1MOozVoD86622S7aunluLb2PJdPfb3nYiEtohm8mIB/vyv0Fd37AdeMFrTUQXEunw78YloMA3Qilg==" - }, - "@typescript-eslint/eslint-plugin": { - "version": "4.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.26.1.tgz", - "integrity": "sha512-aoIusj/8CR+xDWmZxARivZjbMBQTT9dImUtdZ8tVCVRXgBUuuZyM5Of5A9D9arQPxbi/0rlJLcuArclz/rCMJw==", - "dev": true, - "requires": { - "@typescript-eslint/experimental-utils": "4.26.1", - "@typescript-eslint/scope-manager": "4.26.1", - "debug": "^4.3.1", - "functional-red-black-tree": "^1.0.1", - "lodash": "^4.17.21", - "regexpp": "^3.1.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/experimental-utils": { - "version": "4.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.26.1.tgz", - "integrity": "sha512-sQHBugRhrXzRCs9PaGg6rowie4i8s/iD/DpTB+EXte8OMDfdCG5TvO73XlO9Wc/zi0uyN4qOmX9hIjQEyhnbmQ==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.7", - "@typescript-eslint/scope-manager": "4.26.1", - "@typescript-eslint/types": "4.26.1", - "@typescript-eslint/typescript-estree": "4.26.1", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - } - }, - "@typescript-eslint/parser": { - "version": "4.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.26.1.tgz", - "integrity": "sha512-q7F3zSo/nU6YJpPJvQveVlIIzx9/wu75lr6oDbDzoeIRWxpoc/HQ43G4rmMoCc5my/3uSj2VEpg/D83LYZF5HQ==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "4.26.1", - "@typescript-eslint/types": "4.26.1", - "@typescript-eslint/typescript-estree": "4.26.1", - "debug": "^4.3.1" - } - }, - "@typescript-eslint/scope-manager": { - "version": "4.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.26.1.tgz", - "integrity": "sha512-TW1X2p62FQ8Rlne+WEShyd7ac2LA6o27S9i131W4NwDSfyeVlQWhw8ylldNNS8JG6oJB9Ha9Xyc+IUcqipvheQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.26.1", - "@typescript-eslint/visitor-keys": "4.26.1" - } - }, - "@typescript-eslint/types": { - "version": "4.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.26.1.tgz", - "integrity": "sha512-STyMPxR3cS+LaNvS8yK15rb8Y0iL0tFXq0uyl6gY45glyI7w0CsyqyEXl/Fa0JlQy+pVANeK3sbwPneCbWE7yg==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "4.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.26.1.tgz", - "integrity": "sha512-l3ZXob+h0NQzz80lBGaykdScYaiEbFqznEs99uwzm8fPHhDjwaBFfQkjUC/slw6Sm7npFL8qrGEAMxcfBsBJUg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.26.1", - "@typescript-eslint/visitor-keys": "4.26.1", - "debug": "^4.3.1", - "globby": "^11.0.3", - "is-glob": "^4.0.1", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "4.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.26.1.tgz", - "integrity": "sha512-IGouNSSd+6x/fHtYRyLOM6/C+QxMDzWlDtN41ea+flWuSF9g02iqcIlX8wM53JkfljoIjP0U+yp7SiTS1onEkw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.26.1", - "eslint-visitor-keys": "^2.0.0" - } - }, - "@webassemblyjs/ast": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.0.tgz", - "integrity": "sha512-kX2W49LWsbthrmIRMbQZuQDhGtjyqXfEmmHyEi4XWnSZtPmxY0+3anPIzsnRb45VH/J55zlOfWvZuY47aJZTJg==", - "dev": true, - "requires": { - "@webassemblyjs/helper-numbers": "1.11.0", - "@webassemblyjs/helper-wasm-bytecode": "1.11.0" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.0.tgz", - "integrity": "sha512-Q/aVYs/VnPDVYvsCBL/gSgwmfjeCb4LW8+TMrO3cSzJImgv8lxxEPM2JA5jMrivE7LSz3V+PFqtMbls3m1exDA==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.0.tgz", - "integrity": "sha512-baT/va95eXiXb2QflSx95QGT5ClzWpGaa8L7JnJbgzoYeaA27FCvuBXU758l+KXWRndEmUXjP0Q5fibhavIn8w==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.0.tgz", - "integrity": "sha512-u9HPBEl4DS+vA8qLQdEQ6N/eJQ7gT7aNvMIo8AAWvAl/xMrcOSiI2M0MAnMCy3jIFke7bEee/JwdX1nUpCtdyA==", - "dev": true - }, - "@webassemblyjs/helper-numbers": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.0.tgz", - "integrity": "sha512-DhRQKelIj01s5IgdsOJMKLppI+4zpmcMQ3XboFPLwCpSNH6Hqo1ritgHgD0nqHeSYqofA6aBN/NmXuGjM1jEfQ==", - "dev": true, - "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.0", - "@webassemblyjs/helper-api-error": "1.11.0", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.0.tgz", - "integrity": "sha512-MbmhvxXExm542tWREgSFnOVo07fDpsBJg3sIl6fSp9xuu75eGz5lz31q7wTLffwL3Za7XNRCMZy210+tnsUSEA==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.0.tgz", - "integrity": "sha512-3Eb88hcbfY/FCukrg6i3EH8H2UsD7x8Vy47iVJrP967A9JGqgBVL9aH71SETPx1JrGsOUVLo0c7vMCN22ytJew==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.0", - "@webassemblyjs/helper-buffer": "1.11.0", - "@webassemblyjs/helper-wasm-bytecode": "1.11.0", - "@webassemblyjs/wasm-gen": "1.11.0" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.0.tgz", - "integrity": "sha512-KXzOqpcYQwAfeQ6WbF6HXo+0udBNmw0iXDmEK5sFlmQdmND+tr773Ti8/5T/M6Tl/413ArSJErATd8In3B+WBA==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.0.tgz", - "integrity": "sha512-aqbsHa1mSQAbeeNcl38un6qVY++hh8OpCOzxhixSYgbRfNWcxJNJQwe2rezK9XEcssJbbWIkblaJRwGMS9zp+g==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.0.tgz", - "integrity": "sha512-A/lclGxH6SpSLSyFowMzO/+aDEPU4hvEiooCMXQPcQFPPJaYcPQNKGOCLUySJsYJ4trbpr+Fs08n4jelkVTGVw==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.0.tgz", - "integrity": "sha512-JHQ0damXy0G6J9ucyKVXO2j08JVJ2ntkdJlq1UTiUrIgfGMmA7Ik5VdC/L8hBK46kVJgujkBIoMtT8yVr+yVOQ==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.0", - "@webassemblyjs/helper-buffer": "1.11.0", - "@webassemblyjs/helper-wasm-bytecode": "1.11.0", - "@webassemblyjs/helper-wasm-section": "1.11.0", - "@webassemblyjs/wasm-gen": "1.11.0", - "@webassemblyjs/wasm-opt": "1.11.0", - "@webassemblyjs/wasm-parser": "1.11.0", - "@webassemblyjs/wast-printer": "1.11.0" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.0.tgz", - "integrity": "sha512-BEUv1aj0WptCZ9kIS30th5ILASUnAPEvE3tVMTrItnZRT9tXCLW2LEXT8ezLw59rqPP9klh9LPmpU+WmRQmCPQ==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.0", - "@webassemblyjs/helper-wasm-bytecode": "1.11.0", - "@webassemblyjs/ieee754": "1.11.0", - "@webassemblyjs/leb128": "1.11.0", - "@webassemblyjs/utf8": "1.11.0" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.0.tgz", - "integrity": "sha512-tHUSP5F4ywyh3hZ0+fDQuWxKx3mJiPeFufg+9gwTpYp324mPCQgnuVKwzLTZVqj0duRDovnPaZqDwoyhIO8kYg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.0", - "@webassemblyjs/helper-buffer": "1.11.0", - "@webassemblyjs/wasm-gen": "1.11.0", - "@webassemblyjs/wasm-parser": "1.11.0" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.0.tgz", - "integrity": "sha512-6L285Sgu9gphrcpDXINvm0M9BskznnzJTE7gYkjDbxET28shDqp27wpruyx3C2S/dvEwiigBwLA1cz7lNUi0kw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.0", - "@webassemblyjs/helper-api-error": "1.11.0", - "@webassemblyjs/helper-wasm-bytecode": "1.11.0", - "@webassemblyjs/ieee754": "1.11.0", - "@webassemblyjs/leb128": "1.11.0", - "@webassemblyjs/utf8": "1.11.0" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.0.tgz", - "integrity": "sha512-Fg5OX46pRdTgB7rKIUojkh9vXaVN6sGYCnEiJN1GYkb0RPwShZXp6KTDqmoMdQPKhcroOXh3fEzmkWmCYaKYhQ==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.0", - "@xtuc/long": "4.2.2" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", - "dev": true - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } - }, - "acorn-jsx": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", - "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", - "dev": true, - "requires": {} - }, - "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} - }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - }, - "dependencies": { - "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==", - "dev": true - } - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "app-root-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.0.0.tgz", - "integrity": "sha512-qMcx+Gy2UZynHjOHOIXPNvpf+9cjvk3cWrBBK7zg4gH9+clobJRb9NGzcT7mQTcV/6Gm/1WelUtqxVXnNlrwcw==" - }, - "append-field": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", - "integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY=" - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "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 - }, - "array-uniq": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.2.tgz", - "integrity": "sha1-X8w3OSB3VyPP1k1lxkvvU7+eum0=" - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "axios": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", - "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", - "requires": { - "follow-redirects": "^1.10.0" - } - }, - "babel-jest": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", - "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", - "dev": true, - "requires": { - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/babel__core": "^7.1.7", - "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^26.6.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "slash": "^3.0.0" - }, - "dependencies": { - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "babel-plugin-istanbul": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", - "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^4.0.0", - "test-exclude": "^6.0.0" - } - }, - "babel-plugin-jest-hoist": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", - "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", - "dev": true, - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "requires": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@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-top-level-await": "^7.8.3" - } - }, - "babel-preset-jest": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", - "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^26.6.2", - "babel-preset-current-node-syntax": "^1.0.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - } - } - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - }, - "base64url": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", - "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==" - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - } - } - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", - "escalade": "^3.1.1", - "node-releases": "^1.1.71" - } - }, - "bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "requires": { - "fast-json-stable-stringify": "2.x" - } - }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" - }, - "busboy": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz", - "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=", - "requires": { - "dicer": "0.2.5", - "readable-stream": "1.1.x" - } - }, - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001235", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001235.tgz", - "integrity": "sha512-zWEwIVqnzPkSAXOUlQnPW2oKoYb2aLQ4Q5ejdjBcnH63rfypaW34CxaeBn1VMya2XaEU3P/R2qHpWyj+l0BT1A==", - "dev": true - }, - "capture-exit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", - "dev": true, - "requires": { - "rsvp": "^4.8.4" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", - "dev": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.3.1", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" - } - }, - "chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "cjs-module-lexer": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", - "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==", - "dev": true - }, - "class-transformer": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.4.0.tgz", - "integrity": "sha512-ETWD/H2TbWbKEi7m9N4Km5+cw1hNcqJSxlSYhsLsNjQzWWiZIYA1zafxpK9PwVfaZ6AqR5rrjPVUBGESm5tQUA==", - "peer": true - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "class-validator": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.13.1.tgz", - "integrity": "sha512-zWIeYFhUitvAHBwNhDdCRK09hWx+P0HUwFE8US8/CxFpMVzkUK8RJl7yOIE+BVu2lxyPNgeOaFv78tLE47jBIg==", - "peer": true, - "requires": { - "@types/validator": "^13.1.3", - "libphonenumber-js": "^1.9.7", - "validator": "^13.5.2" - } - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-highlight": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", - "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", - "requires": { - "chalk": "^4.0.0", - "highlight.js": "^10.7.1", - "mz": "^2.4.0", - "parse5": "^5.1.1", - "parse5-htmlparser2-tree-adapter": "^6.0.0", - "yargs": "^16.0.0" - }, - "dependencies": { - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "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==" - }, - "parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - } - } - }, - "cli-spinners": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.0.tgz", - "integrity": "sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q==", - "dev": true - }, - "cli-table3": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", - "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", - "dev": true, - "requires": { - "colors": "^1.1.2", - "object-assign": "^4.1.0", - "string-width": "^2.1.1" - } - }, - "cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - } - } - }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "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==", - "requires": { - "color-name": "~1.1.4" - } - }, - "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==" - }, - "colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", - "dev": true - }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true, - "optional": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "consola": { - "version": "2.15.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", - "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "requires": { - "safe-buffer": "5.1.2" - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "cookiejar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", - "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==", - "dev": true - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "requires": { - "object-assign": "^4", - "vary": "^1" - } - }, - "cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - } - }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true - }, - "cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "requires": { - "cssom": "~0.3.6" - }, - "dependencies": { - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - } - } - }, - "data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "dev": true, - "requires": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - } - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decimal.js": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", - "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" - }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "dev": true, - "requires": { - "clone": "^1.0.2" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "denque": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz", - "integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ==" - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true - }, - "dicer": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz", - "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=", - "requires": { - "readable-stream": "1.1.x", - "streamsearch": "0.1.2" - } - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "diff-sequences": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", - "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", - "dev": true - }, - "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, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "dev": true, - "requires": { - "webidl-conversions": "^5.0.0" - }, - "dependencies": { - "webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true - } - } - }, - "dotenv": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", - "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==" - }, - "ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "electron-to-chromium": { - "version": "1.3.749", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.749.tgz", - "integrity": "sha512-F+v2zxZgw/fMwPz/VUGIggG4ZndDsYy0vlpthi3tjmDZlcfbhN5mYW0evXUsBr2sUtuDANFtle410A9u/sd/4A==", - "dev": true - }, - "emittery": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", - "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" - }, - "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==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "enhanced-resolve": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", - "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - } - }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.1" - } - }, - "errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "dev": true, - "requires": { - "prr": "~1.0.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-module-lexer": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.4.1.tgz", - "integrity": "sha512-ooYciCUtfw6/d2w56UVeqHPcoCFAiJdz5XOkYpv/Txl1HMUozpXjz/2RIQgqwKdXNDPSF1W7mJCFse3G+HDyAA==", - "dev": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", - "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - } - } - }, - "eslint": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.28.0.tgz", - "integrity": "sha512-UMfH0VSjP0G4p3EWirscJEQ/cHqnT/iuH6oNZOB94nBjWbMnhGEPxsZm1eyIW0C/9jLI0Fow4W5DXLjEI7mn1g==", - "dev": true, - "requires": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.2", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } - } - } - } - }, - "eslint-config-prettier": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", - "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", - "dev": true, - "requires": {} - }, - "eslint-plugin-prettier": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.0.tgz", - "integrity": "sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw==", - "dev": true, - "requires": { - "prettier-linter-helpers": "^1.0.0" - } - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - } - }, - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - }, - "espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "dev": true, - "requires": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true - }, - "exec-sh": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", - "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==", - "dev": true - }, - "execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "expect": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", - "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "ansi-styles": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-regex-util": "^26.0.0" - } - }, - "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - } - } - }, - "express-session": { - "version": "1.17.2", - "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.2.tgz", - "integrity": "sha512-mPcYcLA0lvh7D4Oqr5aNJFMtBMKPLl++OKKxkHzZ0U0oDq1rpKBnkR5f5vCHR26VeArlTOEF9td4x5IjICksRQ==", - "requires": { - "cookie": "0.4.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~2.0.0", - "on-headers": "~1.0.2", - "parseurl": "~1.3.3", - "safe-buffer": "5.2.1", - "uid-safe": "~2.1.5" - }, - "dependencies": { - "cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - } - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, - "fast-glob": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", - "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", - "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fast-safe-stringify": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", - "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" - }, - "fastq": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", - "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", - "dev": true, - "requires": { - "bser": "2.1.1" - } - }, - "figlet": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.5.0.tgz", - "integrity": "sha512-ZQJM4aifMpz6H19AW1VqvZ7l4pOE9p7i/3LyxgO2kp+PO/VcDYNqIHEMtkccqIhTXMKci4kjueJr/iCQEaT/Ww==" - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - }, - "dependencies": { - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - } - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", - "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", - "dev": true - }, - "follow-redirects": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", - "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==" - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "fork-ts-checker-webpack-plugin": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.2.0.tgz", - "integrity": "sha512-DTNbOhq6lRdjYprukX54JMeYJgQ0zMow+R5BMLwWxEX2NAXthIkwnV8DBmsWjwNLSUItKZM4TCCJbtgrtKBu2Q==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@types/json-schema": "^7.0.5", - "chalk": "^4.1.0", - "chokidar": "^3.4.2", - "cosmiconfig": "^6.0.0", - "deepmerge": "^4.2.2", - "fs-extra": "^9.0.0", - "memfs": "^3.1.2", - "minimatch": "^3.0.4", - "schema-utils": "2.7.0", - "semver": "^7.3.2", - "tapable": "^1.0.0" - }, - "dependencies": { - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "formidable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", - "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==", - "dev": true - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" - }, - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "generate-function": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", - "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", - "requires": { - "is-property": "^1.0.2" - } - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - } - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "globals": { - "version": "13.9.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.9.0.tgz", - "integrity": "sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globby": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz", - "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - }, - "dependencies": { - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true - } - } - }, - "graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", - "dev": true - }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", - "dev": true, - "optional": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - } - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "highlight.js": { - "version": "10.7.3", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", - "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==" - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "dev": true, - "requires": { - "whatwg-encoding": "^1.0.5" - } - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - } - }, - "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-local": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", - "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - } - } - }, - "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "requires": { - "ci-info": "^2.0.0" - } - }, - "is-core-module": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", - "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "optional": true - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "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==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" - }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "optional": true, - "requires": { - "is-docker": "^2.0.0" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "requires": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "iterare": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/iterare/-/iterare-1.2.1.tgz", - "integrity": "sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==" - }, - "jest": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz", - "integrity": "sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==", - "dev": true, - "requires": { - "@jest/core": "^26.6.3", - "import-local": "^3.0.2", - "jest-cli": "^26.6.3" - } - }, - "jest-changed-files": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", - "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "execa": "^4.0.0", - "throat": "^5.0.0" - } - }, - "jest-cli": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", - "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", - "dev": true, - "requires": { - "@jest/core": "^26.6.3", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "import-local": "^3.0.2", - "is-ci": "^2.0.0", - "jest-config": "^26.6.3", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "prompts": "^2.0.1", - "yargs": "^15.4.1" - }, - "dependencies": { - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "jest-config": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", - "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^26.6.3", - "@jest/types": "^26.6.2", - "babel-jest": "^26.6.3", - "chalk": "^4.0.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.4", - "jest-environment-jsdom": "^26.6.2", - "jest-environment-node": "^26.6.2", - "jest-get-type": "^26.3.0", - "jest-jasmine2": "^26.6.3", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "micromatch": "^4.0.2", - "pretty-format": "^26.6.2" - }, - "dependencies": { - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "jest-diff": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", - "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" - }, - "dependencies": { - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "jest-docblock": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", - "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", - "dev": true, - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-each": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", - "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-util": "^26.6.2", - "pretty-format": "^26.6.2" - }, - "dependencies": { - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "jest-environment-jsdom": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", - "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", - "dev": true, - "requires": { - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2", - "jsdom": "^16.4.0" - } - }, - "jest-environment-node": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", - "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", - "dev": true, - "requires": { - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2" - } - }, - "jest-get-type": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", - "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", - "dev": true - }, - "jest-haste-map": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", - "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "@types/graceful-fs": "^4.1.2", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.1.2", - "graceful-fs": "^4.2.4", - "jest-regex-util": "^26.0.0", - "jest-serializer": "^26.6.2", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "micromatch": "^4.0.2", - "sane": "^4.0.3", - "walker": "^1.0.7" - } - }, - "jest-jasmine2": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", - "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", - "dev": true, - "requires": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^26.6.2", - "@jest/source-map": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^26.6.2", - "is-generator-fn": "^2.0.0", - "jest-each": "^26.6.2", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-runtime": "^26.6.3", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "pretty-format": "^26.6.2", - "throat": "^5.0.0" - }, - "dependencies": { - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "jest-leak-detector": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", - "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", - "dev": true, - "requires": { - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" - } - }, - "jest-matcher-utils": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", - "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" - }, - "dependencies": { - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "jest-message-util": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", - "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/types": "^26.6.2", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.2", - "pretty-format": "^26.6.2", - "slash": "^3.0.0", - "stack-utils": "^2.0.2" - }, - "dependencies": { - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "jest-mock": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", - "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "@types/node": "*" - } - }, - "jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "dev": true, - "requires": {} - }, - "jest-regex-util": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", - "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", - "dev": true - }, - "jest-resolve": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", - "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.6.2", - "read-pkg-up": "^7.0.1", - "resolve": "^1.18.1", - "slash": "^3.0.0" - }, - "dependencies": { - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "jest-resolve-dependencies": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", - "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-snapshot": "^26.6.2" - } - }, - "jest-runner": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", - "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", - "dev": true, - "requires": { - "@jest/console": "^26.6.2", - "@jest/environment": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.7.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-config": "^26.6.3", - "jest-docblock": "^26.0.0", - "jest-haste-map": "^26.6.2", - "jest-leak-detector": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-resolve": "^26.6.2", - "jest-runtime": "^26.6.3", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "source-map-support": "^0.5.6", - "throat": "^5.0.0" - }, - "dependencies": { - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "jest-runtime": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", - "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", - "dev": true, - "requires": { - "@jest/console": "^26.6.2", - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/globals": "^26.6.2", - "@jest/source-map": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0", - "cjs-module-lexer": "^0.6.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.4", - "jest-config": "^26.6.3", - "jest-haste-map": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-mock": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "slash": "^3.0.0", - "strip-bom": "^4.0.0", - "yargs": "^15.4.1" - }, - "dependencies": { - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "jest-serializer": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", - "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", - "dev": true, - "requires": { - "@types/node": "*", - "graceful-fs": "^4.2.4" - } - }, - "jest-snapshot": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", - "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0", - "@jest/types": "^26.6.2", - "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.0.0", - "chalk": "^4.0.0", - "expect": "^26.6.2", - "graceful-fs": "^4.2.4", - "jest-diff": "^26.6.2", - "jest-get-type": "^26.3.0", - "jest-haste-map": "^26.6.2", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-resolve": "^26.6.2", - "natural-compare": "^1.4.0", - "pretty-format": "^26.6.2", - "semver": "^7.3.2" - }, - "dependencies": { - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "jest-util": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", - "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "is-ci": "^2.0.0", - "micromatch": "^4.0.2" - }, - "dependencies": { - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "jest-validate": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", - "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "camelcase": "^6.0.0", - "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", - "leven": "^3.1.0", - "pretty-format": "^26.6.2" - }, - "dependencies": { - "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "jest-watcher": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", - "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", - "dev": true, - "requires": { - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^26.6.2", - "string-length": "^4.0.1" - }, - "dependencies": { - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsdom": { - "version": "16.6.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.6.0.tgz", - "integrity": "sha512-Ty1vmF4NHJkolaEmdjtxTfSfkdb8Ywarwf63f+F8/mDD1uLSSWDxDuMiZxiPhwunLrn9LOSVItWj4bLYsLN3Dg==", - "dev": true, - "requires": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.5", - "xml-name-validator": "^3.0.0" - }, - "dependencies": { - "acorn": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.3.0.tgz", - "integrity": "sha512-tqPKHZ5CaBJw0Xmy0ZZvLs1qTV+BNFSyvn77ASXkpBNfIRk8ev26fKrD9iLGwGA9zedPao52GSHzq8lyZG0NUw==", - "dev": true - } - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "jsonc-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", - "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "jsonwebtoken": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", - "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", - "requires": { - "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^5.6.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", - "requires": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "requires": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "libphonenumber-js": { - "version": "1.9.19", - "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.9.19.tgz", - "integrity": "sha512-RjStfSE63LvXQEBw7pgQHPkY35z8feiMjC9wLvL1Hbt8PbhxpRrACwMXmLQgabb+IpVdcEx+olh8ll7UDXXkfA==", - "peer": true - }, - "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", - "dev": true - }, - "loader-runner": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", - "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", - "dev": true - }, - "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true - }, - "lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" - }, - "lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" - }, - "lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" - }, - "lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" - }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" - }, - "lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" - }, - "lodash.toarray": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", - "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=", - "dev": true - }, - "lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "dependencies": { - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "macos-release": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.4.1.tgz", - "integrity": "sha512-H/QHeBIN1fIGJX517pvK8IEK53yQOW7YcEI55oYtgjDdoCQQz7eJS94qt5kNrscReEyuD/JcdFCm2XBEcGOITg==", - "dev": true - }, - "magic-string": { - "version": "0.25.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", - "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", - "dev": true, - "requires": { - "sourcemap-codec": "^1.4.4" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", - "dev": true, - "requires": { - "tmpl": "1.0.x" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" - }, - "memfs": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.2.2.tgz", - "integrity": "sha512-RE0CwmIM3CEvpcdK3rZ19BC4E6hv9kADkMN5rPduRak58cNArWLi/9jFLsa4rhsjfVxMP3v0jO7FHXq7SvFY5Q==", - "dev": true, - "requires": { - "fs-monkey": "1.0.3" - } - }, - "memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "mime-db": { - "version": "1.48.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", - "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==" - }, - "mime-types": { - "version": "2.1.31", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", - "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", - "requires": { - "mime-db": "1.48.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "requires": { - "minimist": "^1.2.5" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "multer": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.2.tgz", - "integrity": "sha512-xY8pX7V+ybyUpbYMxtjM9KAiD9ixtg5/JkeKUTD6xilfDv0vzzOFcCp4Ljb1UU3tSOM3VTZtKo63OmzOrGi3Cg==", - "requires": { - "append-field": "^1.0.0", - "busboy": "^0.2.11", - "concat-stream": "^1.5.2", - "mkdirp": "^0.5.1", - "object-assign": "^4.1.1", - "on-finished": "^2.3.0", - "type-is": "^1.6.4", - "xtend": "^4.0.0" - } - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "mysql2": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-2.2.5.tgz", - "integrity": "sha512-XRqPNxcZTpmFdXbJqb+/CtYVLCx14x1RTeNMD4954L331APu75IC74GDqnZMEt1kwaXy6TySo55rF2F3YJS78g==", - "requires": { - "denque": "^1.4.1", - "generate-function": "^2.3.1", - "iconv-lite": "^0.6.2", - "long": "^4.0.0", - "lru-cache": "^6.0.0", - "named-placeholders": "^1.1.2", - "seq-queue": "^0.0.5", - "sqlstring": "^2.3.2" - }, - "dependencies": { - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } - } - }, - "mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "requires": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "named-placeholders": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz", - "integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==", - "requires": { - "lru-cache": "^4.1.3" - }, - "dependencies": { - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" - } - } - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node-emoji": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.10.0.tgz", - "integrity": "sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw==", - "dev": true, - "requires": { - "lodash.toarray": "^4.4.0" - } - }, - "node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", - "dev": true - }, - "node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", - "dev": true - }, - "node-notifier": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz", - "integrity": "sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==", - "dev": true, - "optional": true, - "requires": { - "growly": "^1.3.0", - "is-wsl": "^2.2.0", - "semver": "^7.3.2", - "shellwords": "^0.1.1", - "uuid": "^8.3.0", - "which": "^2.0.2" - } - }, - "node-releases": { - "version": "1.1.73", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz", - "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==", - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", - "dev": true - }, - "oauth": { - "version": "0.9.15", - "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", - "integrity": "sha1-vR/vr2hslrdUda7VGWQS/2DPucE=" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-hash": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.1.1.tgz", - "integrity": "sha512-VOJmgmS+7wvXf8CjbQmimtCnEx3IAoLxI3fp2fbWehxrWBcAQFbk+vcwb6vzR0VZv/eNCJ/27j151ZTwqW/JeQ==" - }, - "object-inspect": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", - "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "optional": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/optional/-/optional-0.1.4.tgz", - "integrity": "sha512-gtvrrCfkE08wKcgXaVwQVgwEQ8vel2dc5DDBn9RLQZ3YtmtkBss6A2HY6BnJH4N/4Ku97Ri/SF8sNWE2225WJw==", - "dev": true - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "ora": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.0.tgz", - "integrity": "sha512-1StwyXQGoU6gdjYkyVcqOLnVlbKj+6yPNNOxJVgpt9t4eksKjiriiHuxktLYkgllwk+D6MbC4ihH84L1udRXPg==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "os-name": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-4.0.0.tgz", - "integrity": "sha512-caABzDdJMbtykt7GmSogEat3faTKQhmZf0BS5l/pZGmP0vPWQjXWqOhbLyK+b6j2/DQPmEvYdzLXJXXLJNVDNg==", - "dev": true, - "requires": { - "macos-release": "^2.2.0", - "windows-release": "^4.0.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "p-each-series": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", - "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parent-require": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parent-require/-/parent-require-1.0.0.tgz", - "integrity": "sha1-dGoWdjgIOoYLDu9nMssn7UbDKXc=" - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@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" - } - }, - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" - }, - "parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", - "requires": { - "parse5": "^6.0.1" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "passport": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/passport/-/passport-0.4.1.tgz", - "integrity": "sha512-IxXgZZs8d7uFSt3eqNjM9NQ3g3uQCW5avD8mRNoXV99Yig50vjuaez6dQK2qC0kVWPRTujxY0dWgGfT09adjYg==", - "requires": { - "passport-strategy": "1.x.x", - "pause": "0.0.1" - } - }, - "passport-google-oauth20": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/passport-google-oauth20/-/passport-google-oauth20-2.0.0.tgz", - "integrity": "sha512-KSk6IJ15RoxuGq7D1UKK/8qKhNfzbLeLrG3gkLZ7p4A6DBCcv7xpyQwuXtWdpyR0+E0mwkpjY1VfPOhxQrKzdQ==", - "requires": { - "passport-oauth2": "1.x.x" - } - }, - "passport-jwt": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/passport-jwt/-/passport-jwt-4.0.0.tgz", - "integrity": "sha512-BwC0n2GP/1hMVjR4QpnvqA61TxenUMlmfNjYNgK0ZAs0HK4SOQkHcSv4L328blNTLtHq7DbmvyNJiH+bn6C5Mg==", - "requires": { - "jsonwebtoken": "^8.2.0", - "passport-strategy": "^1.0.0" - } - }, - "passport-local": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/passport-local/-/passport-local-1.0.0.tgz", - "integrity": "sha1-H+YyaMkudWBmJkN+O5BmYsFbpu4=", - "requires": { - "passport-strategy": "1.x.x" - } - }, - "passport-oauth": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/passport-oauth/-/passport-oauth-0.1.15.tgz", - "integrity": "sha1-+3Tgr+hGFL+iVsX8cWzFa7/IzsA=", - "requires": { - "oauth": "0.9.x", - "passport": "~0.1.1", - "pkginfo": "0.2.x" - }, - "dependencies": { - "passport": { - "version": "0.1.18", - "resolved": "https://registry.npmjs.org/passport/-/passport-0.1.18.tgz", - "integrity": "sha1-yCZEedy2QUytu2Z1LRKzfgtlJaE=", - "requires": { - "pause": "0.0.1", - "pkginfo": "0.2.x" - } - } - } - }, - "passport-oauth2": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/passport-oauth2/-/passport-oauth2-1.5.0.tgz", - "integrity": "sha512-kqBt6vR/5VlCK8iCx1/KpY42kQ+NEHZwsSyt4Y6STiNjU+wWICG1i8ucc1FapXDGO15C5O5VZz7+7vRzrDPXXQ==", - "requires": { - "base64url": "3.x.x", - "oauth": "0.9.x", - "passport-strategy": "1.x.x", - "uid2": "0.0.x", - "utils-merge": "1.x.x" - } - }, - "passport-strategy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", - "integrity": "sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ=" - }, - "passport-twitter": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/passport-twitter/-/passport-twitter-0.1.5.tgz", - "integrity": "sha1-0Jqiwil9AhS213Vb9Zs5Lj4D+7I=", - "requires": { - "passport-oauth": "0.1.x", - "pkginfo": "0.2.x" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-to-regexp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.2.0.tgz", - "integrity": "sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==" - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "pause": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", - "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=" - }, - "picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "dev": true - }, - "pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "dev": true, - "requires": { - "node-modules-regexp": "^1.0.0" - } - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "pkginfo": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.2.3.tgz", - "integrity": "sha1-cjnEKl72wwuPMoQ52bn/cQQkkPg=" - }, - "pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", - "dev": true - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "prettier": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.1.tgz", - "integrity": "sha512-p+vNbgpLjif/+D+DwAZAbndtRrR0md0MwfmOVN9N+2RgyACMT+7tfaRnT+WDPkqnuVwleyuBIG2XBxKDme3hPA==", - "dev": true - }, - "prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "requires": { - "fast-diff": "^1.1.2" - } - }, - "pretty-format": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", - "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^17.0.1" - } - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "prompts": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.1.tgz", - "integrity": "sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ==", - "dev": true, - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - } - }, - "proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "random-bytes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", - "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=" - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomstring": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/randomstring/-/randomstring-1.2.1.tgz", - "integrity": "sha512-eMnfell9XuU3jfCx3f4xCaFAt0YMFPZhx9R3PSStmLarDKg5j5vivqKhf/8pvG+VX/YkxsckHK/VPUrKa5V07A==", - "requires": { - "array-uniq": "1.0.2", - "randombytes": "2.0.3" - }, - "dependencies": { - "randombytes": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.3.tgz", - "integrity": "sha1-Z0yZdgkBw8QRJ3GjHlIdw0nMCew=" - } - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } - } - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, - "reflect-metadata": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", - "dev": true - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } - }, - "rsvp": { - "version": "4.8.5", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", - "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", - "dev": true - }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "requires": { - "tslib": "^1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", - "dev": true, - "requires": { - "@cnakazawa/watch": "^1.0.3", - "anymatch": "^2.0.0", - "capture-exit": "^2.0.0", - "exec-sh": "^0.3.2", - "execa": "^1.0.0", - "fb-watchman": "^2.0.0", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "requires": { - "xmlchars": "^2.2.0" - } - }, - "schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" - } - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - } - } - }, - "seq-queue": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", - "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=" - }, - "serialize-javascript": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", - "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - } - } - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "shelljs": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", - "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", - "dev": true, - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - } - }, - "shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "dev": true, - "optional": true - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true - }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - } - } - }, - "slugify": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.0.tgz", - "integrity": "sha512-FkMq+MQc5hzYgM86nLuHI98Acwi3p4wX+a5BO9Hhw4JdK4L7WueIiZ4tXEobImPqBz2sVcV0+Mu3GRB30IGang==" - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "dev": true - }, - "sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", - "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==", - "dev": true - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sqlstring": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.2.tgz", - "integrity": "sha512-vF4ZbYdKS8OnoJAWBmMxCQDkiEBkGQYU7UZPtL8flbDRSNkhaXvRJ279ZtI6M+zDaQovVU4tuRgzK5fVhvFAhg==" - }, - "stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", - "dev": true, - "requires": { - "escape-string-regexp": "^2.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - } - } - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" - }, - "streamsearch": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", - "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "requires": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "superagent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-6.1.0.tgz", - "integrity": "sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==", - "dev": true, - "requires": { - "component-emitter": "^1.3.0", - "cookiejar": "^2.1.2", - "debug": "^4.1.1", - "fast-safe-stringify": "^2.0.7", - "form-data": "^3.0.0", - "formidable": "^1.2.2", - "methods": "^1.1.2", - "mime": "^2.4.6", - "qs": "^6.9.4", - "readable-stream": "^3.6.0", - "semver": "^7.3.2" - }, - "dependencies": { - "mime": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", - "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", - "dev": true - }, - "qs": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", - "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", - "dev": true, - "requires": { - "side-channel": "^1.0.4" - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - } - } - }, - "supertest": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.1.3.tgz", - "integrity": "sha512-v2NVRyP73XDewKb65adz+yug1XMtmvij63qIWHZzSX8tp6wiq6xBLUy4SUAd2NII6wIipOmHT/FD9eicpJwdgQ==", - "dev": true, - "requires": { - "methods": "^1.1.2", - "superagent": "^6.1.0" - } - }, - "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==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-hyperlinks": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", - "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", - "dev": true, - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - } - }, - "symbol-observable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-3.0.0.tgz", - "integrity": "sha512-6tDOXSHiVjuCaasQSWTmHUWn4PuG7qa3+1WT031yTc/swT7+rLiw3GOrFxaH1E3lLP09dH3bVuVDf2gK5rxG3Q==", - "dev": true - }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "table": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", - "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", - "dev": true, - "requires": { - "ajv": "^8.0.1", - "lodash.clonedeep": "^4.5.0", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz", - "integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - } - } - }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true - }, - "terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - } - }, - "terser": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.7.0.tgz", - "integrity": "sha512-HP5/9hp2UaZt5fYkuhNBR8YyRcT8juw8+uFbAme53iN9hblvKnLUTKkmwJG6ocWpIKf8UK4DoeWG4ty0J6S6/g==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.7.2", - "source-map-support": "~0.5.19" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - } - } - }, - "terser-webpack-plugin": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.1.3.tgz", - "integrity": "sha512-cxGbMqr6+A2hrIB5ehFIF+F/iST5ZOxvOmy9zih9ySbP1C2oEWQSOUS+2SNBTjzx5xLKO4xnod9eywdfq1Nb9A==", - "dev": true, - "requires": { - "jest-worker": "^27.0.2", - "p-limit": "^3.1.0", - "schema-utils": "^3.0.0", - "serialize-javascript": "^5.0.1", - "source-map": "^0.6.1", - "terser": "^5.7.0" - }, - "dependencies": { - "jest-worker": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.0.2.tgz", - "integrity": "sha512-EoBdilOTTyOgmHXtw/cPc+ZrCA0KJMrkXzkrPGNwLmnvvlN1nj7MPrxpT7m+otSv2e1TLaVffzDnE/LB14zJMg==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "requires": { - "any-promise": "^1.0.0" - } - }, - "thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", - "requires": { - "thenify": ">= 3.1.0 < 4" - } - }, - "throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" - }, - "tough-cookie": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", - "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", - "dev": true, - "requires": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.1.2" - }, - "dependencies": { - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - } - } - }, - "tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "dev": true, - "requires": { - "punycode": "^2.1.1" - } - }, - "tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true - }, - "ts-jest": { - "version": "26.5.6", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.5.6.tgz", - "integrity": "sha512-rua+rCP8DxpA8b4DQD/6X2HQS8Zy/xzViVYfEs2OQu68tkCuKLV0Md8pmX55+W24uRIyAsf/BajRfxOs+R2MKA==", - "dev": true, - "requires": { - "bs-logger": "0.x", - "buffer-from": "1.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^26.1.0", - "json5": "2.x", - "lodash": "4.x", - "make-error": "1.x", - "mkdirp": "1.x", - "semver": "7.x", - "yargs-parser": "20.x" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - } - } - }, - "ts-loader": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-8.3.0.tgz", - "integrity": "sha512-MgGly4I6cStsJy27ViE32UoqxPTN9Xly4anxxVyaIWR+9BGxboV4EyJBGfR3RePV7Ksjj3rHmPZJeIt+7o4Vag==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "enhanced-resolve": "^4.0.0", - "loader-utils": "^2.0.0", - "micromatch": "^4.0.0", - "semver": "^7.3.4" - }, - "dependencies": { - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "ts-node": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", - "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", - "dev": true, - "requires": { - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "source-map-support": "^0.5.17", - "yn": "3.1.1" - } - }, - "tsconfig-paths": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", - "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", - "dev": true, - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.0", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - } - } - }, - "tsconfig-paths-webpack-plugin": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-3.5.1.tgz", - "integrity": "sha512-n5CMlUUj+N5pjBhBACLq4jdr9cPTitySCjIosoQm0zwK99gmrcTGAfY9CwxRFT9+9OleNWXPRUcxsKP4AYExxQ==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "enhanced-resolve": "^5.7.0", - "tsconfig-paths": "^3.9.0" - }, - "dependencies": { - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "enhanced-resolve": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.2.tgz", - "integrity": "sha512-F27oB3WuHDzvR2DOGNTaYy0D5o0cnrv8TeI482VM4kYgQd/FT9lUQwuNsJ0oOHtBUq7eiW5ytqzp7nBFknL+GA==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - } - }, - "tapable": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz", - "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==", - "dev": true - } - } - }, - "tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "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 - }, - "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 - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typeorm": { - "version": "0.2.34", - "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.2.34.tgz", - "integrity": "sha512-FZAeEGGdSGq7uTH3FWRQq67JjKu0mgANsSZ04j3kvDYNgy9KwBl/6RFgMVgiSgjf7Rqd7NrhC2KxVT7I80qf7w==", - "requires": { - "@sqltools/formatter": "^1.2.2", - "app-root-path": "^3.0.0", - "buffer": "^6.0.3", - "chalk": "^4.1.0", - "cli-highlight": "^2.1.10", - "debug": "^4.3.1", - "dotenv": "^8.2.0", - "glob": "^7.1.6", - "js-yaml": "^4.0.0", - "mkdirp": "^1.0.4", - "reflect-metadata": "^0.1.13", - "sha.js": "^2.4.11", - "tslib": "^2.1.0", - "xml2js": "^0.4.23", - "yargonaut": "^1.1.4", - "yargs": "^16.2.0", - "zen-observable-ts": "^1.0.0" - }, - "dependencies": { - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "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==" - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "requires": { - "argparse": "^2.0.1" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - } - } - }, - "typescript": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.2.tgz", - "integrity": "sha512-zZ4hShnmnoVnAHpVHWpTcxdv7dWP60S2FsydQLV8V5PbS3FifjWFFRiHSWpDJahly88PRyV5teTSLoq4eG7mKw==", - "dev": true - }, - "uid-safe": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", - "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", - "requires": { - "random-bytes": "~1.0.0" - } - }, - "uid2": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz", - "integrity": "sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I=" - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - } - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - } - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "v8-to-istanbul": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz", - "integrity": "sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - } - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "validator": { - "version": "13.6.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.6.0.tgz", - "integrity": "sha512-gVgKbdbHgtxpRyR8K0O6oFZPhhB5tT1jeEHZR0Znr9Svg03U0+r9DXWMrnRAB+HtCStDQKlaIZm42tVsVjqtjg==", - "peer": true - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" - }, - "w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dev": true, - "requires": { - "browser-process-hrtime": "^1.0.0" - } - }, - "w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dev": true, - "requires": { - "xml-name-validator": "^3.0.0" - } - }, - "walker": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", - "dev": true, - "requires": { - "makeerror": "1.0.x" - } - }, - "watchpack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.2.0.tgz", - "integrity": "sha512-up4YAn/XHgZHIxFBVCdlMiWDj6WaLKpwVeGQk2I5thdYxF/KmF0aaz6TfJZ/hfl1h/XlcDr7k1KH7ThDagpFaA==", - "dev": true, - "requires": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - } - }, - "wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", - "dev": true, - "requires": { - "defaults": "^1.0.3" - } - }, - "webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true - }, - "webpack": { - "version": "5.38.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.38.1.tgz", - "integrity": "sha512-OqRmYD1OJbHZph6RUMD93GcCZy4Z4wC0ele4FXyYF0J6AxO1vOSuIlU1hkS/lDlR9CDYBz64MZRmdbdnFFoT2g==", - "dev": true, - "peer": true, - "requires": { - "@types/eslint-scope": "^3.7.0", - "@types/estree": "^0.0.47", - "@webassemblyjs/ast": "1.11.0", - "@webassemblyjs/wasm-edit": "1.11.0", - "@webassemblyjs/wasm-parser": "1.11.0", - "acorn": "^8.2.1", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.8.0", - "es-module-lexer": "^0.4.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.4", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.0.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.1", - "watchpack": "^2.2.0", - "webpack-sources": "^2.3.0" - }, - "dependencies": { - "acorn": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.3.0.tgz", - "integrity": "sha512-tqPKHZ5CaBJw0Xmy0ZZvLs1qTV+BNFSyvn77ASXkpBNfIRk8ev26fKrD9iLGwGA9zedPao52GSHzq8lyZG0NUw==", - "dev": true, - "peer": true - }, - "enhanced-resolve": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.2.tgz", - "integrity": "sha512-F27oB3WuHDzvR2DOGNTaYy0D5o0cnrv8TeI482VM4kYgQd/FT9lUQwuNsJ0oOHtBUq7eiW5ytqzp7nBFknL+GA==", - "dev": true, - "peer": true, - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - } - }, - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", - "dev": true, - "peer": true, - "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - }, - "tapable": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz", - "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==", - "dev": true, - "peer": true - } - } - }, - "webpack-node-externals": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-2.5.2.tgz", - "integrity": "sha512-aHdl/y2N7PW2Sx7K+r3AxpJO+aDMcYzMQd60Qxefq3+EwhewSbTBqNumOsCE1JsCUNoyfGj5465N0sSf6hc/5w==", - "dev": true - }, - "webpack-sources": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.0.tgz", - "integrity": "sha512-WyOdtwSvOML1kbgtXbTDnEW0jkJ7hZr/bDByIwszhWd/4XX1A3XMkrbFMsuH4+/MfLlZCUzlAdg4r7jaGKEIgQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.1", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dev": true, - "requires": { - "iconv-lite": "0.4.24" - } - }, - "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true - }, - "whatwg-url": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.5.0.tgz", - "integrity": "sha512-fy+R77xWv0AiqfLl4nuGUlQ3/6b5uNfQ4WAbGQVMYshCTCCPK9psC1nWh3XHuxGVCtlcDDQPQW1csmmIQo+fwg==", - "dev": true, - "requires": { - "lodash": "^4.7.0", - "tr46": "^2.0.2", - "webidl-conversions": "^6.1.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "windows-release": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-4.0.0.tgz", - "integrity": "sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==", - "dev": true, - "requires": { - "execa": "^4.0.2" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "dev": true, - "requires": {} - }, - "xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true - }, - "xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - } - }, - "xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" - }, - "xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true - }, - "yargonaut": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/yargonaut/-/yargonaut-1.1.4.tgz", - "integrity": "sha512-rHgFmbgXAAzl+1nngqOcwEljqHGG9uUZoPjsdZEs1w5JW9RXYzrSvH/u70C1JE5qFi0qjsdhnUX/dJRpWqitSA==", - "requires": { - "chalk": "^1.1.1", - "figlet": "^1.1.1", - "parent-require": "^1.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "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" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "yargs-parser": { - "version": "20.2.7", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", - "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==" - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - }, - "zen-observable": { - "version": "0.8.15", - "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz", - "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==" - }, - "zen-observable-ts": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-1.0.0.tgz", - "integrity": "sha512-KmWcbz+9kKUeAQ8btY8m1SsEFgBcp7h/Uf3V5quhan7ZWdjGsf0JcGLULQiwOZibbFWnHkYq8Nn2AZbJabovQg==", - "requires": { - "@types/zen-observable": "^0.8.2", - "zen-observable": "^0.8.15" - } - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index 3db1e081..00000000 --- a/package.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "name": "api", - "version": "0.0.1", - "description": "", - "author": "", - "private": true, - "license": "UNLICENSED", - "scripts": { - "prebuild": "rimraf dist", - "build": "nest build", - "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", - "start": "nest start", - "start:dev": "nest start --watch", - "start:debug": "nest start --debug --watch", - "start:prod": "node dist/main", - "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", - "test": "jest", - "test:watch": "jest --watch", - "test:cov": "jest --coverage", - "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", - "test:e2e": "jest --config ./test/jest-e2e.json" - }, - "dependencies": { - "@nestjs/common": "^7.6.15", - "@nestjs/core": "^7.6.15", - "@nestjs/jwt": "^7.2.0", - "@nestjs/mapped-types": "*", - "@nestjs/passport": "^7.1.5", - "@nestjs/platform-express": "^7.6.15", - "@nestjs/serve-static": "^2.1.4", - "@nestjs/typeorm": "^7.1.5", - "@sendgrid/mail": "^7.4.5", - "dotenv": "^8.6.0", - "express-session": "^1.17.2", - "mysql2": "^2.2.5", - "passport": "^0.4.1", - "passport-google-oauth20": "^2.0.0", - "passport-jwt": "^4.0.0", - "passport-local": "^1.0.0", - "passport-twitter": "^0.1.5", - "randomstring": "^1.2.1", - "reflect-metadata": "^0.1.13", - "rimraf": "^3.0.2", - "rxjs": "^6.6.6", - "slugify": "^1.6.0", - "typeorm": "^0.2.34" - }, - "devDependencies": { - "@nestjs/cli": "^7.6.0", - "@nestjs/schematics": "^7.3.0", - "@nestjs/testing": "^7.6.15", - "@types/express": "^4.17.11", - "@types/express-session": "^1.17.3", - "@types/jest": "^26.0.22", - "@types/node": "^14.14.36", - "@types/passport-google-oauth20": "^2.0.8", - "@types/passport-jwt": "^3.0.5", - "@types/passport-local": "^1.0.33", - "@types/supertest": "^2.0.10", - "@typescript-eslint/eslint-plugin": "^4.19.0", - "@typescript-eslint/parser": "^4.19.0", - "eslint": "^7.22.0", - "eslint-config-prettier": "^8.1.0", - "eslint-plugin-prettier": "^3.3.1", - "jest": "^26.6.3", - "prettier": "^2.2.1", - "supertest": "^6.1.3", - "ts-jest": "^26.5.4", - "ts-loader": "^8.0.18", - "ts-node": "^9.1.1", - "tsconfig-paths": "^3.9.0", - "typescript": "^4.2.3" - }, - "jest": { - "moduleFileExtensions": [ - "js", - "json", - "ts" - ], - "rootDir": "src", - "testRegex": ".*\\.spec\\.ts$", - "transform": { - "^.+\\.(t|j)s$": "ts-jest" - }, - "collectCoverageFrom": [ - "**/*.(t|j)s" - ], - "coverageDirectory": "../coverage", - "testEnvironment": "node" - } -} diff --git a/sqlc.yml b/sqlc.yml new file mode 100644 index 00000000..015a08ca --- /dev/null +++ b/sqlc.yml @@ -0,0 +1,20 @@ +# Reference: https://docs.sqlc.dev/en/latest/reference/config.html +version: "2" +sql: + - engine: postgresql + queries: src/database/queries/*.sql + schema: src/database/migrations/*.sql + database: + # uri: postgresql://${DB_USER}:${DB_PASS}@${DB_HOST}:${DB_PORT}/${DB_NAME} + # uri: postgresql://postgres:postgres@localhost:5433/postgres + gen: + go: + package: database + out: src/database + sql_package: pg + json_tags_case_style: camel + emit_json_tags: true + emit_db_tags: true + emit_prepared_queries: true + emit_enum_valid_method: true + emit_all_enum_values: true diff --git a/src/app.controller.ts b/src/app.controller.ts deleted file mode 100644 index b1aa817d..00000000 --- a/src/app.controller.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Controller, Get } from '@nestjs/common'; - -@Controller() -export class AppController { - @Get() - getHello(): string { - return "GiftTrade API ⚡"; - } -} diff --git a/src/app.module.ts b/src/app.module.ts deleted file mode 100644 index c8f085fc..00000000 --- a/src/app.module.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { Module } from '@nestjs/common'; -import { TypeOrmModule } from '@nestjs/typeorm'; -import { AppController } from './app.controller'; -import { UsersModule } from './users/users.module'; -import { GoogleModule } from './google/google.module'; -import { AuthModule } from './auth/auth.module'; -import { ProductsModule } from './products/products.module'; -import { CategoriesModule } from './categories/categories.module'; -import { EventsModule } from './events/events.module'; -import { ServeStaticModule } from '@nestjs/serve-static'; -import { join } from 'path'; -import { ParticipantsModule } from './participants/participants.module'; -import { WishesModule } from './wishes/wishes.module'; -import { LinksModule } from './links/links.module'; -import { DrawsModule } from './draws/draws.module'; - -@Module({ - imports: [ - TypeOrmModule.forRoot(), - ServeStaticModule.forRoot({ - rootPath: join(__dirname, '..', 'uploads'), - serveRoot: '/static', - }), - UsersModule, - GoogleModule, - AuthModule, - ProductsModule, - CategoriesModule, - EventsModule, - ParticipantsModule, - WishesModule, - LinksModule, - DrawsModule, - ], - controllers: [AppController], - providers: [], -}) -export class AppModule {} diff --git a/src/app/app.go b/src/app/app.go new file mode 100644 index 00000000..af83eaa7 --- /dev/null +++ b/src/app/app.go @@ -0,0 +1,91 @@ +package app + +import ( + "database/sql" + "reflect" + "strings" + + "github.com/ayaanqui/go-migration-tool/migration_tool" + "github.com/giftxtrade/api/src/controllers" + "github.com/giftxtrade/api/src/database" + "github.com/giftxtrade/api/src/services" + "github.com/giftxtrade/api/src/types" + "github.com/giftxtrade/api/src/utils" + "github.com/go-playground/validator/v10" + "github.com/gofiber/fiber/v2" + "github.com/gofiber/fiber/v2/middleware/cors" + "gorm.io/gorm" +) + +type AppBase struct { + types.AppContext + Service services.Service + MigrationDirectory string + Querier *database.Queries +} + +type IAppBase interface { + NewBaseHandler() *AppBase + // database + AutoMigrate(db *gorm.DB) error + CreateSchemas() *AppBase +} + +// Given app.AppBase.DB, and app.AppBase.Router +// creates db migrations, db services, oauth, and routes +func (app *AppBase) NewBaseHandler() *AppBase { + app.Validator = validator.New() + app.Validator.RegisterTagNameFunc(func(field reflect.StructField) string { + name := strings.SplitN(field.Tag.Get("json"), ",", 2)[0] + if name == "-" { + return "" + } + return name + }) + + m := migration_tool.New(app.DB, &migration_tool.Config{ + TableName: "migration", + Directory: app.MigrationDirectory, + }) + m.RunMigration() + + // initialize services + app.Service = services.New(app.DB, app.Querier, app.Validator, app.Tokens) + // initialize controllers + controllers.New(app.AppContext, app.Querier, app.Service) + return app +} + +func New(conn *sql.DB, server *fiber.App) *AppBase { + app := AppBase{} + app.DB = conn + app.Server = server + server.Use(cors.New(cors.Config{ + AllowOrigins: strings.Join([]string{ + "https://giftxtrade.com", + "http://localhost:3000", // TODO: allow only in development + }, ","), + })) + + app.Querier = database.New(conn) + // initialize tokens + tokens, tokens_err := utils.ParseTokens() + if tokens_err != nil { + panic(tokens_err) + } + app.Tokens = &tokens + app.MigrationDirectory = "./src/database/migrations" + return app.NewBaseHandler() +} + +func NewMock(conn *sql.DB, server *fiber.App) *AppBase { + app := AppBase{} + app.DB = conn + app.Server = server + app.Querier = database.New(conn) + app.Tokens = &types.Tokens{ + JwtKey: "my-secret-jwt-token", + } + app.MigrationDirectory = "../database/migrations" + return app.NewBaseHandler() +} \ No newline at end of file diff --git a/src/auth/auth.controller.ts b/src/auth/auth.controller.ts deleted file mode 100644 index cd71e49a..00000000 --- a/src/auth/auth.controller.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Controller, Get, UseGuards, Request } from '@nestjs/common'; -import { AuthService } from './auth.service'; -import { JwtAuthGuard } from './jwt-auth.guard'; - -@Controller('auth') -export class AuthController { - constructor(private authService: AuthService) { } - - @UseGuards(JwtAuthGuard) - @Get('profile') - getProfile(@Request() req) { - return req.user; - } -} diff --git a/src/auth/auth.module.ts b/src/auth/auth.module.ts deleted file mode 100644 index bed0397b..00000000 --- a/src/auth/auth.module.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Module } from '@nestjs/common'; -import { UsersModule } from 'src/users/users.module'; -import { AuthController } from './auth.controller'; -import { AuthService } from './auth.service'; -import { JwtModule } from '@nestjs/jwt'; -import { PassportModule } from '@nestjs/passport'; -import { JWT } from '../../auth-tokens.json'; -import { LocalStrategy } from './local.strategy'; -import { JwtStrategy } from './jwt.strategy'; - -@Module({ - imports: [ - UsersModule, - PassportModule, - JwtModule.register({ - secret: JWT.SECRET, - signOptions: { expiresIn: '60 days' }, - }) - ], - controllers: [AuthController], - providers: [AuthService, LocalStrategy, JwtStrategy], - exports: [AuthService] -}) -export class AuthModule {} diff --git a/src/auth/auth.service.ts b/src/auth/auth.service.ts deleted file mode 100644 index 051d6cf3..00000000 --- a/src/auth/auth.service.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { Injectable } from '@nestjs/common'; -import { User } from 'src/users/entities/user.entity'; -import { UsersService } from 'src/users/users.service'; -import { JwtService } from '@nestjs/jwt'; -import { CreateUserDto } from '../users/dto/create-user.dto'; -import JwtPayload from 'src/util/jwtPayload'; -import { JwtAuthReturn } from '../util/jwtPayload'; - -@Injectable() -export class AuthService { - constructor( - private readonly userServices: UsersService, - private readonly jwtService: JwtService, - ) {} - - async validateUser(email: string): Promise { - return this.userServices.findOne(email); - } - - async login( - createUser: CreateUserDto, - gToken: string, - ): Promise { - const user = await this.userServices.findOneOrCreate(createUser); - const payload: JwtPayload = { user, gToken }; - return { - user: user, - accessToken: this.jwtService.sign(payload), - gToken, - loggedIn: true, - }; - } -} diff --git a/src/auth/jwt-auth.guard.ts b/src/auth/jwt-auth.guard.ts deleted file mode 100644 index c529411c..00000000 --- a/src/auth/jwt-auth.guard.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { Injectable } from '@nestjs/common'; -import { AuthGuard } from '@nestjs/passport'; - -@Injectable() -export class JwtAuthGuard extends AuthGuard('jwt') { } \ No newline at end of file diff --git a/src/auth/jwt.strategy.ts b/src/auth/jwt.strategy.ts deleted file mode 100644 index 7727d073..00000000 --- a/src/auth/jwt.strategy.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ExtractJwt, Strategy } from 'passport-jwt'; -import { PassportStrategy } from '@nestjs/passport'; -import { Injectable, UnauthorizedException } from '@nestjs/common'; -import { AuthService } from './auth.service'; -import { JWT } from '../../auth-tokens.json'; -import { User } from 'src/users/entities/user.entity'; -import JwtPayload from 'src/util/jwtPayload'; - -@Injectable() -export class JwtStrategy extends PassportStrategy(Strategy) { - constructor(private authServices: AuthService) { - super({ - jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), - ignoreExpiration: false, - secretOrKey: JWT.SECRET, - }); - } - - async validate(payload: JwtPayload): Promise { - const user: User = await this.authServices.validateUser(payload.user.email); - if (user == null) - throw new UnauthorizedException(); - return payload; - } -} \ No newline at end of file diff --git a/src/auth/local-auth.guard.ts b/src/auth/local-auth.guard.ts deleted file mode 100644 index 134bcb17..00000000 --- a/src/auth/local-auth.guard.ts +++ /dev/null @@ -1,6 +0,0 @@ - -import { Injectable } from '@nestjs/common'; -import { AuthGuard } from '@nestjs/passport'; - -@Injectable() -export class LocalAuthGuard extends AuthGuard('local') { } diff --git a/src/auth/local.strategy.ts b/src/auth/local.strategy.ts deleted file mode 100644 index e4ed9d2c..00000000 --- a/src/auth/local.strategy.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Strategy } from 'passport-local'; -import { PassportStrategy } from '@nestjs/passport'; -import { Injectable, UnauthorizedException } from '@nestjs/common'; -import { AuthService } from './auth.service'; -import { User } from 'src/users/entities/user.entity'; - -@Injectable() -export class LocalStrategy extends PassportStrategy(Strategy) { - constructor(private authService: AuthService) { - super(); - } - - async validate(email: string, password: string): Promise { - const user = await this.authService.validateUser(email); - if (!user) { - throw new UnauthorizedException(); - } - return user; - } -} diff --git a/src/categories/categories.controller.spec.ts b/src/categories/categories.controller.spec.ts deleted file mode 100644 index 6b4023f6..00000000 --- a/src/categories/categories.controller.spec.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { CategoriesController } from './categories.controller'; - -describe('CategoriesController', () => { - let controller: CategoriesController; - - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - controllers: [CategoriesController], - }).compile(); - - controller = module.get(CategoriesController); - }); - - it('should be defined', () => { - expect(controller).toBeDefined(); - }); -}); diff --git a/src/categories/categories.controller.ts b/src/categories/categories.controller.ts deleted file mode 100644 index 219e24f9..00000000 --- a/src/categories/categories.controller.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Controller, Get } from '@nestjs/common'; -import { CategoriesService } from './categories.service'; - -@Controller('categories') -export class CategoriesController { - constructor(private readonly categoriesService: CategoriesService) { } - - @Get() - async findAll() { - return await this.categoriesService.findAll(); - } -} diff --git a/src/categories/categories.module.ts b/src/categories/categories.module.ts deleted file mode 100644 index ef0db6e1..00000000 --- a/src/categories/categories.module.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Module } from '@nestjs/common'; -import { TypeOrmModule } from '@nestjs/typeorm'; -import { CategoriesService } from './categories.service'; -import { Category } from './entities/category.entity'; -import { CategoriesController } from './categories.controller'; - -@Module({ - imports: [ - TypeOrmModule.forFeature([Category]), - ], - providers: [CategoriesService], - exports: [CategoriesService], - controllers: [CategoriesController] -}) -export class CategoriesModule { } diff --git a/src/categories/categories.service.spec.ts b/src/categories/categories.service.spec.ts deleted file mode 100644 index 9095d781..00000000 --- a/src/categories/categories.service.spec.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { CategoriesService } from './categories.service'; - -describe('CategoriesService', () => { - let service: CategoriesService; - - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - providers: [CategoriesService], - }).compile(); - - service = module.get(CategoriesService); - }); - - it('should be defined', () => { - expect(service).toBeDefined(); - }); -}); diff --git a/src/categories/categories.service.ts b/src/categories/categories.service.ts deleted file mode 100644 index 0ddfbefb..00000000 --- a/src/categories/categories.service.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { Injectable } from '@nestjs/common'; -import { InjectRepository } from '@nestjs/typeorm'; -import { Repository } from 'typeorm'; -import { Category } from './entities/category.entity'; - -@Injectable() -export class CategoriesService { - constructor( - @InjectRepository(Category) - private readonly categoryRepository: Repository, - ) { } - - async insert(name: string, description?: string, categoryUrl?: string): Promise { - const category: Category = new Category(); - category.name = name; - category.description = description ? description : ''; - category.categoryUrl = categoryUrl ? categoryUrl : ''; - return await category.save(); - } - - async findAll(): Promise { - return await this.categoryRepository.find(); - } - - async findOne(name: string): Promise { - return await this.categoryRepository - .findOne({ where: { name: name } }); - } - - async findOneLike(name: string): Promise { - name = name.toLowerCase().trim(); - return await this.categoryRepository - .createQueryBuilder('categories') - .where(` - name like :name or - description like :name - `, { name: `%${name}%` }) - .getOne(); - } - - async findOrCreate(name: string, description?: string, categoryUrl?: string): Promise { - const category = await this.findOne(name); - if (!category) - return await this.insert(name); - return category; - } - - async findLikeOrCreate(name: string, description?: string, categoryUrl?: string): Promise { - const category = await this.findOneLike(name); - if (!category) - return await this.insert(name); - return category; - } -} diff --git a/src/categories/entities/category.entity.ts b/src/categories/entities/category.entity.ts deleted file mode 100644 index 7ef4fdb0..00000000 --- a/src/categories/entities/category.entity.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Product } from "src/products/entities/product.entity"; -import { BaseEntity, Column, Entity, OneToMany, PrimaryGeneratedColumn, Index } from 'typeorm'; - -@Entity('categories') -export class Category extends BaseEntity { - @Index({ unique: true }) - @PrimaryGeneratedColumn() - id: number; - - @Column() - name: string; - - @Column('text', { nullable: true }) - description: string; - - @Column() - categoryUrl: string; - - @OneToMany(() => Product, product => product.category) - products: Product[]; -} diff --git a/src/controllers/auth_controller.go b/src/controllers/auth_controller.go new file mode 100644 index 00000000..2e1a3721 --- /dev/null +++ b/src/controllers/auth_controller.go @@ -0,0 +1,53 @@ +package controllers + +import ( + "encoding/json" + "fmt" + "io" + "net/http" + + "github.com/giftxtrade/api/src/types" + "github.com/giftxtrade/api/src/utils" + "github.com/gofiber/fiber/v2" + "google.golang.org/api/oauth2/v2" +) + +// [GET] /auth/profile (authentication required) +func (ctr Controller) GetProfile(c *fiber.Ctx) error { + auth := GetAuthContext(c.UserContext()) + return utils.DataResponse(c, auth) +} + +func (ctr *Controller) GoogleVerify(c *fiber.Ctx) error { + access_token := c.Query("access_token", "") + if access_token == "" { + return utils.FailResponse(c, "no access token provided") + } + + res, err := http.Get(fmt.Sprintf("https://www.googleapis.com/oauth2/v2/userinfo?access_token=%s", access_token)) + if err != nil { + return utils.FailResponse(c, "invalid access token") + } + userDataRaw, err := io.ReadAll(res.Body) + if err != nil { + return utils.FailResponse(c, "could not read body") + } + var userData oauth2.Userinfo + if err := json.Unmarshal(userDataRaw, &userData); err != nil { + return utils.FailResponse(c, "could not parse response") + } + + check_user := types.CreateUser{ + Email: userData.Email, + Name: userData.Name, + ImageUrl: userData.Picture, + } + auth, created, err := ctr.Service.UserService.GenerateAuthUser(c.Context(), check_user) + if err != nil { + return utils.FailResponse(c, err.Error()) + } + if created { + return utils.DataResponseCreated(c, auth) + } + return utils.DataResponse(c, auth) +} diff --git a/src/controllers/controller.go b/src/controllers/controller.go new file mode 100644 index 00000000..babcd5cf --- /dev/null +++ b/src/controllers/controller.go @@ -0,0 +1,112 @@ +package controllers + +import ( + "context" + "fmt" + "strconv" + + "github.com/giftxtrade/api/src/database" + "github.com/giftxtrade/api/src/services" + "github.com/giftxtrade/api/src/types" + "github.com/giftxtrade/api/src/utils" + "github.com/gofiber/fiber/v2" +) + +type Controller struct { + types.AppContext + Service services.Service + Querier *database.Queries +} + +type IController interface { + New(app_ctx types.AppContext, service services.Service) Controller +} + +func New(app_ctx types.AppContext, querier *database.Queries, service services.Service) Controller { + c := Controller{ + AppContext: app_ctx, + Service: service, + Querier: querier, + } + server := app_ctx.Server + + // create routes + server.Get("/", func(c *fiber.Ctx) error { + return utils.JsonResponse(c, types.Response{ + Message: "GiftTrade REST API ⚡", + }) + }) + auth := server.Group("/auth") + { + auth.Get("/profile", c.UseJwtAuth, c.GetProfile) + auth.Get("/google/verify", c.GoogleVerify) + } + products := server.Group("/products") + { + products.Post("", c.UseAdminOnly, c.CreateProduct) + products.Get("", c.UseJwtAuth, c.FindAllProducts) + products.Get("/:id", c.UseJwtAuth, c.FindProduct) + } + events := server.Group("/events") + { + events.Get("/verify-invite-code/:invite_code", c.VerifyEventLinkCode) + events.Get("/join/:invite_code", c.UseJwtAuth, c.JoinEventViaInviteCode) + events.Post("", c.UseJwtAuth, c.CreateEvent) + events.Get("", c.UseJwtAuth, c.GetEvents) + events.Get("/invites", c.UseJwtAuth, c.GetInvites) + events.Get("/invites/accept/:event_id", c.UseJwtAuth, c.UseEventAuthWithParam, c.AcceptEventInvite) + events.Get("/invites/decline/:event_id", c.UseJwtAuth, c.UseEventAuthWithParam, c.DeclineEventInvite) + events.Get("/get-link/:event_id", c.UseJwtAuth, c.UseEventAuthWithParam, c.GetEventLink) + events.Get("/:event_id", c.UseJwtAuth, c.UseEventAuthWithParam, c.GetEventById) + events.Patch("/:event_id", c.UseJwtAuth, c.UseEventOrganizerAuthWithParam, c.UpdateProduct) + events.Delete("/:event_id", c.UseJwtAuth, c.UseEventOrganizerAuthWithParam, c.DeleteEvent) + } + participants := server.Group("/participants") + { + participants.Patch("/manage/:event_id", c.UseJwtAuth, c.UseEventOrganizerAuthWithParam, c.UseEventParticipantAuthWithQuery, c.ManageParticipantUpdate) + participants.Delete("/manage/:event_id", c.UseJwtAuth, c.UseEventOrganizerAuthWithParam, c.UseEventParticipantAuthWithQuery, c.ManageParticipantRemoval) + participants.Get("/:event_id/:participant_id", c.UseJwtAuth, c.UseEventAuthWithParam, c.UseEventParticipantAuthWithParam, c.GetParticipantById) + participants.Patch("/:event_id/:participant_id", c.UseJwtAuth, c.UseEventAuthWithParam, c.UseEventParticipantAuthWithParam, c.UpdateMeParticipant) + } + wishes := server.Group("/wishes") + { + wishes.Post("/:event_id", c.UseJwtAuth, c.UseEventAuthWithParam, c.CreateWish) + wishes.Delete("/:event_id", c.UseJwtAuth, c.UseEventAuthWithParam, c.DeleteWish) + wishes.Get("/:event_id/:participant_id", c.UseJwtAuth, c.UseEventAuthWithParam, c.UseEventParticipantAuthWithParam, c.GetWishes) + } + server.Get("*", func(c *fiber.Ctx) error { + return utils.ResponseWithStatusCode(c, fiber.ErrNotFound.Code, types.Errors{ + Errors: []string{"resource not found"}, + }) + }) + return c +} + +func SetUserContext(c *fiber.Ctx, key interface{}, value interface{}) { + c.SetUserContext(context.WithValue(c.UserContext(), key, value)) +} + +// Given a `fiber.Ctx.UserContext`, find and return the auth struct using the types.AuthKey key +func GetAuthContext(user_context context.Context) types.Auth { + auth := user_context.Value(AUTH_KEY).(types.Auth) + return auth +} + +// Returns the even_id based on the route `*/:event_id/*` param +func ParseEventIdFromRoute(c *fiber.Ctx) (event_id int64, error error) { + id_raw := c.Params("event_id") + id, err := strconv.ParseInt(id_raw, 10, 64) + if err != nil { + return 0, fmt.Errorf("invalid event id") + } + return id, nil +} + +func GetEventIdFromContext(user_context context.Context) int64 { + id := user_context.Value(EVENT_ID_PARAM_KEY).(int64) + return id +} + +func GetParticipantFromContext(user_context context.Context) database.Participant { + return user_context.Value(PARTICIPANT_OB_KEY).(database.Participant) +} diff --git a/src/controllers/events_controller.go b/src/controllers/events_controller.go new file mode 100644 index 00000000..df941f92 --- /dev/null +++ b/src/controllers/events_controller.go @@ -0,0 +1,260 @@ +package controllers + +import ( + "database/sql" + "fmt" + "time" + + "github.com/giftxtrade/api/src/database" + "github.com/giftxtrade/api/src/mappers" + "github.com/giftxtrade/api/src/types" + "github.com/giftxtrade/api/src/utils" + "github.com/gofiber/fiber/v2" +) + +const EVENT_LINK_CODE_LEN = 15 + +func (ctr *Controller) CreateEvent(c *fiber.Ctx) error { + auth_user := GetAuthContext(c.UserContext()) + var input types.CreateEvent + if c.BodyParser(&input) != nil { + return utils.FailResponse(c, "could not parse body data") + } + if err := ctr.Validator.Struct(input); err != nil { + return utils.FailResponse(c, err.Error()) + } + + event, err := ctr.Service.EventService.CreateEvent(c.Context(), &auth_user.User, input) + if err != nil { + return utils.FailResponse(c, "could not create event", err.Error()) + } + return utils.DataResponseCreated(c, event) +} + +func (ctr *Controller) GetEvents(c *fiber.Ctx) error { + auth_user := GetAuthContext(c.UserContext()) + events, err := ctr.Service.EventService.FindEventsForUser(c.Context(), auth_user.User) + if err != nil { + return utils.FailResponse(c, "could not return events") + } + return utils.DataResponse(c, events) +} + +func (ctr *Controller) GetEventById(c *fiber.Ctx) error { + auth := GetAuthContext(c.UserContext()) + event_id := GetEventIdFromContext(c.UserContext()) + + event, err := ctr.Service.EventService.FindEventById(c.Context(), auth.User, event_id) + if err != nil { + return utils.FailResponse(c, "could not load event") + } + return utils.DataResponse(c, event) +} + +func (ctr *Controller) GetInvites(c *fiber.Ctx) error { + auth := GetAuthContext(c.UserContext()) + rows, err := ctr.Querier.FindEventInvites(c.Context(), auth.User.Email) + if err != nil { + return utils.FailResponse(c, "could not fetch invites") + } + return utils.DataResponse(c, mappers.DbEventsToEventsSimple(rows)) +} + +func (ctr *Controller) AcceptEventInvite(c *fiber.Ctx) error { + auth := GetAuthContext(c.UserContext()) + event_id := GetEventIdFromContext(c.UserContext()) + + tx, err := ctr.DB.BeginTx(c.Context(), nil) + if err != nil { + tx.Rollback() + return utils.FailResponse(c, "transaction error. please try again") + } + q := ctr.Querier.WithTx(tx) + defer q.Close() + + participant, err := q.AcceptEventInvite(c.Context(), database.AcceptEventInviteParams{ + EventID: event_id, + UserID: sql.NullInt64{ + Valid: true, + Int64: auth.User.ID, + }, + Email: auth.User.Email, + }) + if err != nil { + tx.Rollback() + return utils.FailResponse(c, "could not accept invite for event") + } + + event_rows, err := q.FindEventById(c.Context(), participant.EventID) + if err != nil { + tx.Rollback() + return utils.FailResponse(c, "could not fetch event") + } + if err := tx.Commit(); err != nil { + tx.Rollback() + return utils.FailResponse(c, "could not save changes") + } + event := mappers.DbFindEventByIdToEvent(event_rows) + return utils.DataResponse(c, event) +} + +func (ctr *Controller) DeclineEventInvite(c *fiber.Ctx) error { + auth := GetAuthContext(c.UserContext()) + event_id := GetEventIdFromContext(c.UserContext()) + _, err := ctr.Querier.DeclineEventInvite(c.Context(), database.DeclineEventInviteParams{ + EventID: event_id, + Email: auth.User.Email, + }) + if err != nil { + return utils.FailResponse(c, "could not decline event invitation. please try again.") + } + return utils.DataResponse(c, types.DeleteStatus{ + Deleted: true, + }) +} + +// [PATCH] events/:event_id - Organizer Auth +func (ctr *Controller) UpdateProduct(c *fiber.Ctx) error { + event_id := GetEventIdFromContext(c.UserContext()) + var input types.UpdateEvent + if c.BodyParser(&input) != nil { + return utils.FailResponse(c, "could not parse body data") + } + if err := ctr.Validator.Struct(input); err != nil { + return utils.FailResponse(c, "validation errors with input", err.Error()) + } + + _, err := ctr.Querier.UpdateEvent(c.Context(), database.UpdateEventParams{ + ID: event_id, + Name: sql.NullString{ + Valid: input.Name != "", + String: input.Name, + }, + Description: sql.NullString{ + Valid: input.Description != "", + String: input.Description, + }, + Budget: sql.NullString{ + Valid: input.Budget != 0, + String: fmt.Sprintf("%f", input.Budget), + }, + DrawAt: sql.NullTime{ + Valid: !input.DrawAt.IsZero(), + Time: input.DrawAt, + }, + CloseAt: sql.NullTime{ + Valid: !input.CloseAt.IsZero(), + Time: input.CloseAt, + }, + }) + if err != nil { + return utils.FailResponse(c, "could not update event") + } + + event_row, err := ctr.Querier.FindEventById(c.Context(), event_id) + if err != nil { + return utils.FailResponse(c, "could not return event") + } + event := mappers.DbFindEventByIdToEvent(event_row) + return utils.DataResponse(c, event) +} + +// [DELETE] /events/:event_id - Uses organizer auth +func (ctr *Controller) DeleteEvent(c *fiber.Ctx) error { + event_id := GetEventIdFromContext(c.UserContext()) + _, err := ctr.Querier.DeleteEvent(c.Context(), event_id) + if err != nil { + return utils.FailResponse(c, "event could not be deleted. please try again.") + } + return utils.DataResponse(c, types.DeleteStatus{ + Deleted: true, + }) +} + +// [GET] /events/:event_id/get-link - Uses event participant auth +func (ctr *Controller) GetEventLink(c *fiber.Ctx) error { + event_id := GetEventIdFromContext(c.UserContext()) + event, _ := ctr.Querier.FindEventSimple(c.Context(), event_id) + code, _ := utils.GenerateRandomUrlEncodedString(EVENT_LINK_CODE_LEN) + link, err := ctr.Querier.CreateLink(c.Context(), database.CreateLinkParams{ + EventID: event_id, + Code: code, + ExpirationDate: event.DrawAt, + }) + if err != nil { + return utils.FailResponse(c, "could not create link for event") + } + return utils.DataResponseCreated(c, mappers.DbLinkToLink(link, nil)) +} + +func (Ctr *Controller) get_invite_code(c *fiber.Ctx) (code string, error error) { + invite_code := c.Params("invite_code") + if len(invite_code) != EVENT_LINK_CODE_LEN { + return "", fmt.Errorf("invalid invite code") + } + return invite_code, nil +} + +func (ctr *Controller) VerifyEventLinkCode(c *fiber.Ctx) error { + invite_code, err := ctr.get_invite_code(c) + if err != nil { + return utils.FailResponse(c, err.Error()) + } + res, err := ctr.Querier.FindLinkWithEventByCode(c.Context(), invite_code) + if err != nil { + return utils.FailResponse(c, "invite code expired or invalid") + } + return utils.DataResponse(c, mappers.DbLinkToLink(res.Link, &res.Event)) +} + +func (ctr *Controller) JoinEventViaInviteCode(c *fiber.Ctx) error { + invite_code, err := ctr.get_invite_code(c) + if err != nil { + return utils.FailResponse(c, err.Error()) + } + res, err := ctr.Querier.FindLinkByCode(c.Context(), invite_code) + if err != nil || res.ExpirationDate.Before(time.Now()) { + return utils.FailResponse(c, "invite code is expired or invalid") + } + + auth := GetAuthContext(c.UserContext()) + _, err = ctr.Querier.VerifyEventWithEmailOrUser(c.Context(), database.VerifyEventWithEmailOrUserParams{ + EventID: res.EventID, + UserID: sql.NullInt64{ + Valid: true, + Int64: auth.User.ID, + }, + Email: sql.NullString{ + Valid: true, + String: auth.User.Email, + }, + }) + // auth user is already a participant in the event + if err == nil { + p, _ := ctr.Querier.FindParticipantFromEventIdAndUser(c.Context(), database.FindParticipantFromEventIdAndUserParams{ + EventID: res.EventID, + UserID: sql.NullInt64{ + Valid: true, + Int64: auth.User.ID, + }, + }) + return utils.DataResponse(c, mappers.DbParticipantToParticipant(p, nil, nil)) + } + + participant, err := ctr.Querier.CreateParticipant(c.Context(), database.CreateParticipantParams{ + Name: auth.User.Name, + Email: auth.User.Email, + Organizer: false, + Participates: true, + Accepted: true, + EventID: res.EventID, + UserID: sql.NullInt64{ + Valid: true, + Int64: auth.User.ID, + }, + }) + if err != nil { + return utils.FailResponse(c, "could not join event") + } + return utils.DataResponseCreated(c, mappers.DbParticipantToParticipant(participant, nil, nil)) +} diff --git a/src/controllers/middleware.go b/src/controllers/middleware.go new file mode 100644 index 00000000..f83b683c --- /dev/null +++ b/src/controllers/middleware.go @@ -0,0 +1,180 @@ +package controllers + +import ( + "context" + "database/sql" + "fmt" + "strconv" + + "github.com/giftxtrade/api/src/database" + "github.com/giftxtrade/api/src/types" + "github.com/giftxtrade/api/src/utils" + "github.com/gofiber/fiber/v2" +) + +const AUTH_REQ string = "authorization required" +const AUTH_KEY types.AuthKeyType = "auth" +const AUTH_HEADER string = "Authorization" +const EVENT_ID_PARAM_KEY types.EventIdParamKeyType = "EVENT_ID_PARAM" +const PARTICIPANT_OB_KEY string = "PARTICIPANT_OB" + +// Authentication middleware. Saves user data in request user context with the `AUTH_KEY` key +func (ctx *Controller) UseJwtAuth(c *fiber.Ctx) error { + if err := ctx.authenticate_user(c); err != nil { + return utils.FailResponseUnauthorized(c, AUTH_REQ) + } + return c.Next() +} + +// Admin only access middleware (uses UseJwtAuth) +func (ctx *Controller) UseAdminOnly(c *fiber.Ctx) error { + if err := ctx.authenticate_user(c); err != nil { + return utils.FailResponseUnauthorized(c, AUTH_REQ) + } + + auth := GetAuthContext(c.UserContext()) + if !auth.User.Admin { + return utils.FailResponseUnauthorized(c, "access for admin users only") + } + return c.Next() +} + +func (ctx Controller) authenticate_user(c *fiber.Ctx) error { + authorization := c.Get(AUTH_HEADER) + // Parse bearer token + raw_token, err := utils.GetBearerToken(authorization) + if err != nil { + return err + } + + // Parse JWT + claims, err := utils.GetJwtClaims(raw_token, ctx.Tokens.JwtKey) + if err != nil { + return err + } + + // Get user from id, username, email + id_raw, email := claims["id"].(string), claims["email"].(string) + id, err := strconv.ParseInt(id_raw, 10, 64) + if err != nil { + return fmt.Errorf("invalid claim id") + } + user, err := ctx.Querier.FindUserByIdAndEmail(c.Context(), database.FindUserByIdAndEmailParams{ + ID: id, + Email: email, + }) + if err != nil { + return err + } + SetUserContext(c, AUTH_KEY, types.Auth{ + Token: raw_token, + User: types.User{ + ID: user.ID, + Name: user.Name, + Email: user.Email, + ImageUrl: user.ImageUrl, + Active: user.Active, + Phone: user.Phone.String, + Admin: user.Admin, + }, + }) + return nil +} + +// Verifies if auth user is a valid participant of an event +// based on the URL param `:event_id`. +// +// Saves the event_id (int64) in the request user context with the `EVENT_ID_PARAM_KEY` key +func (ctr *Controller) UseEventAuthWithParam(c *fiber.Ctx) error { + auth_user := GetAuthContext(c.UserContext()) + id, err := ParseEventIdFromRoute(c) + if err != nil { + return utils.FailResponse(c, err.Error()) + } + + event_id, err := ctr.Querier.VerifyEventWithEmailOrUser(c.Context(), database.VerifyEventWithEmailOrUserParams{ + EventID: id, + UserID: sql.NullInt64{ + Valid: true, + Int64: auth_user.User.ID, + }, + Email: sql.NullString{ + Valid: true, + String: auth_user.User.Email, + }, + }) + if err != nil || event_id != id { + return utils.FailResponseNotFound(c, "event not found") + } + SetUserContext(c, EVENT_ID_PARAM_KEY, event_id) + return c.Next() +} + +// Verifies if the auth user is a valid organizer of an event +// based on the URL param `:event_id`. +// +// Saves the event_id (int64) value in the request user context with the `EVENT_ID_PARAM_KEY` key +func (ctr *Controller) UseEventOrganizerAuthWithParam(c *fiber.Ctx) error { + auth_user := GetAuthContext(c.UserContext()) + id, err := ParseEventIdFromRoute(c) + if err != nil { + return utils.FailResponseNotFound(c, err.Error()) + } + + event_id, err := ctr.Querier.VerifyEventForUserAsOrganizer(c.Context(), database.VerifyEventForUserAsOrganizerParams{ + EventID: id, + UserID: auth_user.User.ID, + }) + if err != nil || event_id != id { + return utils.FailResponseNotFound(c, "event not found") + } + SetUserContext(c, EVENT_ID_PARAM_KEY, event_id) + return c.Next() +} + +func (ctr *Controller) handleParticipantFromId(context context.Context, event_id int64, participant_id_raw string) (database.Participant, error) { + participant_id, err := strconv.ParseInt(participant_id_raw, 10, 64) + if err != nil { + return database.Participant{}, fmt.Errorf("invalid participant id") + } + + // verify if participant exists in event + participant, err := ctr.Querier.FindParticipantWithIdAndEventId(context, database.FindParticipantWithIdAndEventIdParams{ + EventID: event_id, + ParticipantID: participant_id, + }) + if err != nil { + return database.Participant{}, fmt.Errorf("participant does not exist on the event") + } + return participant, nil +} + +// Verifies if the query param participantId (?participantId=int64) is a valid participant of an event +// based on the URL param `:event_id`. +// +// Saves the participant object (database.Participant) value in the request user context with the `PARTICIPANT_QUERY_KEY` key. +// NOTE: This middleware MUST only be used following either `UseEventAuthWithParam` or `UseEventOrganizerAuthWithParam` +func (ctr *Controller) UseEventParticipantAuthWithQuery(c *fiber.Ctx) error { + event_id := GetEventIdFromContext(c.UserContext()) + participant, err := ctr.handleParticipantFromId(c.Context(), event_id, c.Query("participantId")) + if err != nil { + return utils.FailResponse(c, err.Error()) + } + SetUserContext(c, PARTICIPANT_OB_KEY, participant) + return c.Next() +} + +// Verifies if the URL param participant_id (/:participant_id) is a valid participant of an event +// based on the URL param `:event_id`. +// +// Saves the participant object (database.Participant) value in the request user context with the `PARTICIPANT_QUERY_KEY` key. +// NOTE: This middleware MUST only be used following either `UseEventAuthWithParam` or `UseEventOrganizerAuthWithParam` +func (ctr *Controller) UseEventParticipantAuthWithParam(c *fiber.Ctx) error { + event_id := GetEventIdFromContext(c.UserContext()) + participant, err := ctr.handleParticipantFromId(c.Context(), event_id, c.Params("participant_id")) + if err != nil { + return utils.FailResponse(c, err.Error()) + } + SetUserContext(c, PARTICIPANT_OB_KEY, participant) + return c.Next() +} diff --git a/src/controllers/participants_controller.go b/src/controllers/participants_controller.go new file mode 100644 index 00000000..84ae7db6 --- /dev/null +++ b/src/controllers/participants_controller.go @@ -0,0 +1,122 @@ +package controllers + +import ( + "database/sql" + + "github.com/giftxtrade/api/src/database" + "github.com/giftxtrade/api/src/mappers" + "github.com/giftxtrade/api/src/types" + "github.com/giftxtrade/api/src/utils" + "github.com/gofiber/fiber/v2" +) + +func (ctr *Controller) ManageParticipantUpdate(c *fiber.Ctx) error { + auth := GetAuthContext(c.UserContext()) + event_id := GetEventIdFromContext(c.UserContext()) + participant := c.UserContext().Value(PARTICIPANT_OB_KEY).(database.Participant) + + // parse/validate body + input, err := utils.ParseAndValidateBody[types.PatchParticipant](ctr.Validator, c.Body()) + if err != nil { + return utils.FailResponse(c, err.Error()) + } + + patch_data := database.UpdateParticipantStatusParams{ + EventID: event_id, + ParticipantID: participant.ID, + } + if input.Organizer != nil { + if participant.UserID.Int64 == auth.User.ID { + return utils.FailResponse(c, "event organizer cannot modify their own 'organizer' status") + } + patch_data.Organizer = sql.NullBool{ + Valid: *input.Organizer != participant.Organizer, + Bool: *input.Organizer, + } + } + if input.Participates != nil { + patch_data.Participates = sql.NullBool{ + Valid: *input.Participates != participant.Participates, + Bool: *input.Participates, + } + } + patched_participant, err := ctr.Querier.UpdateParticipantStatus(c.Context(), patch_data) + if err != nil { + utils.FailResponse(c, "could not update participant") + } + return utils.DataResponse(c, mappers.DbParticipantToParticipant(patched_participant, nil, nil)) +} + +func (ctr *Controller) ManageParticipantRemoval(c *fiber.Ctx) error { + auth := GetAuthContext(c.UserContext()) + event_id := GetEventIdFromContext(c.UserContext()) + participant := c.UserContext().Value(PARTICIPANT_OB_KEY).(database.Participant) + if participant.UserID.Int64 == auth.User.ID { + utils.FailResponse(c, "event organizer cannot remove themselves") + } + _, err := ctr.Querier.DeleteParticipantByIdAndEventId(c.Context(), database.DeleteParticipantByIdAndEventIdParams{ + EventID: event_id, + ParticipantID: participant.ID, + }) + if err != nil { + return utils.FailResponse(c, "could not remove participant") + } + return utils.DataResponse(c, mappers.DbParticipantToParticipant(participant, nil, nil)) +} + +func (ctr *Controller) GetParticipantById(c *fiber.Ctx) error { + participant := c.UserContext().Value(PARTICIPANT_OB_KEY).(database.Participant) + rows, err := ctr.Querier.FindParticipantUserWithFullEventById(c.Context(), participant.ID) + if err != nil { + return utils.FailResponseNotFound(c, "could not find participant with the id", err.Error()) + } + if len(rows) <= 0 { + return utils.FailResponse(c, "result error") + } + mapped_participant := mappers.DbParticipantUserToParticipant(rows[0].ParticipantUser, &rows[0].Event) + participants := make([]types.Participant, len(rows)) + for i, row := range rows { + participants[i] = mappers.DbParticipantUserToParticipant(row.ParticipantUser_2, nil) + } + mapped_participant.Event.Participants = participants + return utils.DataResponse(c, mapped_participant) +} + +func (ctr *Controller) UpdateMeParticipant(c *fiber.Ctx) error { + auth := GetAuthContext(c.UserContext()) + participant := c.UserContext().Value(PARTICIPANT_OB_KEY).(database.Participant) + if !participant.UserID.Valid || participant.UserID.Int64 != auth.User.ID { + return utils.FailResponse(c, "action on participant not allowed") + } + input, err := utils.ParseAndValidateBody[types.PatchParticipant](ctr.Validator, c.Body()) + if err != nil { + return utils.FailResponse(c, err.Error()) + } + values := database.PatchParticipantParams{ + EventID: participant.EventID, + ParticipantID: participant.ID, + } + if input.Address != nil && input.Address != &participant.Address.String { + values.Address = sql.NullString{ + Valid: true, + String: *input.Address, + } + } + if input.Name != nil && input.Name != &participant.Name { + values.Name = sql.NullString{ + Valid: true, + String: *input.Name, + } + } + if input.Participates != nil && input.Participates != &participant.Participates { + values.Participates = sql.NullBool{ + Valid: true, + Bool: *input.Participates, + } + } + updated_participant, err := ctr.Querier.PatchParticipant(c.Context(), values) + if err != nil { + return utils.FailResponse(c, "could not update participant") + } + return utils.DataResponse(c, mappers.DbParticipantToParticipant(updated_participant, nil, nil)) +} diff --git a/src/controllers/products_controller.go b/src/controllers/products_controller.go new file mode 100644 index 00000000..f185a4db --- /dev/null +++ b/src/controllers/products_controller.go @@ -0,0 +1,77 @@ +package controllers + +import ( + "strconv" + "strings" + + "github.com/giftxtrade/api/src/mappers" + "github.com/giftxtrade/api/src/types" + "github.com/giftxtrade/api/src/utils" + "github.com/gofiber/fiber/v2" +) + +// [GET] /products +func (ctr Controller) FindAllProducts(c *fiber.Ctx) error { + search_query := c.Query("search") + filter := types.ProductFilter{ + Search: &search_query, + Limit: int32(c.QueryInt("limit")), + Page: int32(c.QueryInt("page")), + MinPrice: float32(c.QueryFloat("minPrice")), + MaxPrice: float32(c.QueryFloat("maxPrice")), + } + if sort := c.Query("sort"); sort != "" { + value := "" + switch sort { + case "price": + value = "price" + case "rating": + value = "rating" + default: + return utils.FailResponse(c, "invalid value for param 'sort'") + } + filter.Sort = &value + } + if err := ctr.Validator.Struct(filter); err != nil { + return utils.FailResponse(c, err.Error()) + } + + products, err := ctr.Service.ProductService.Search(c.Context(), filter) + if err != nil { + errors := strings.Split(err.Error(), "\n") + return utils.FailResponse(c, errors...) + } + return utils.DataResponse(c, products) +} + +// [POST] /products +func (ctr Controller) CreateProduct(c *fiber.Ctx) error { + var create_product types.CreateProduct + if c.BodyParser(&create_product) != nil { + return utils.FailResponse(c, "could not parse body data") + } + + product, created, err := ctr.Service.ProductService.UpdateOrCreate(c.Context(), create_product) + if err != nil { + return utils.FailResponse(c, "could not create/update product") + } + mapped_product := mappers.DbProductToProduct(product, nil) + if created { + return utils.DataResponseCreated(c, mapped_product) + } + return utils.DataResponse(c, mapped_product) +} + +// [GET] /products/:id +func (ctr Controller) FindProduct(c *fiber.Ctx) error { + id, err := strconv.Atoi(c.Params("id")) + if err != nil { + return utils.FailResponse(c, "invalid product id") + } + + product, err := ctr.Querier.FindProductById(c.Context(), int64(id)) + if err != nil { + return utils.FailResponse(c, "product not found") + } + return utils.DataResponse(c, mappers.DbProductToProduct(product, nil)) +} diff --git a/src/controllers/wishes_controller.go b/src/controllers/wishes_controller.go new file mode 100644 index 00000000..cd3f1fe0 --- /dev/null +++ b/src/controllers/wishes_controller.go @@ -0,0 +1,133 @@ +package controllers + +import ( + "database/sql" + + "github.com/giftxtrade/api/src/database" + "github.com/giftxtrade/api/src/mappers" + "github.com/giftxtrade/api/src/types" + "github.com/giftxtrade/api/src/utils" + "github.com/gofiber/fiber/v2" +) + +func (ctr *Controller) CreateWish(c *fiber.Ctx) error { + input, err := utils.ParseAndValidateBody[types.CreateWish](ctr.Validator, c.Body()) + if err != nil { + return utils.FailResponse(c, err.Error()) + } + + auth := GetAuthContext(c.UserContext()) + event_id := GetEventIdFromContext(c.UserContext()) + participant, err := ctr.Querier.FindParticipantFromEventIdAndUser(c.Context(), database.FindParticipantFromEventIdAndUserParams{ + EventID: event_id, + UserID: sql.NullInt64{ + Int64: auth.User.ID, + Valid: true, + }, + }) + if err != nil { + return utils.FailResponse(c, "participant does not exist on the event") + } + create_wish_params := database.CreateWishParams{ + UserID: auth.User.ID, + EventID: event_id, + ParticipantID: participant.ID, + } + var product *database.Product = nil + if input.ProductID != nil { + // check if product id is valid + product_id := *input.ProductID + p, err := ctr.Querier.FindProductById(c.Context(), product_id) + if err != nil { + return utils.FailResponse(c, "invalid product id") + } + product = &p + create_wish_params.ProductID = sql.NullInt64{ + Int64: product_id, + Valid: true, + } + + // check if wish with `product_id` already exists and update `quantity` + existing_wish, existing_wish_err := ctr.Querier.GetWishWithProductID(c.Context(), database.GetWishWithProductIDParams{ + UserID: auth.User.ID, + EventID: event_id, + ParticipantID: participant.ID, + ProductID: sql.NullInt64{ + Valid: true, + Int64: product_id, + }, + }) + if existing_wish_err == nil { + updated_wish, update_wish_err := ctr.Querier.UpdateWishQuantity(c.Context(), database.UpdateWishQuantityParams{ + ID: existing_wish.ID, + Quantity: existing_wish.Quantity + 1, + }) + if update_wish_err != nil { + return utils.FailResponse(c, "could not update wish quantity") + } + return utils.DataResponse(c, mappers.DbWishToWish(updated_wish, product)) + } + } + + wish, err := ctr.Querier.CreateWish(c.Context(), create_wish_params) + if err != nil { + return utils.FailResponse(c, "could not create wish") + } + return utils.DataResponseCreated(c, mappers.DbWishToWish(wish, product)) +} + +func (ctr *Controller) DeleteWish(c *fiber.Ctx) error { + input, err := utils.ParseAndValidateBody[types.DeleteWish](ctr.Validator, c.Body()) + if err != nil { + return utils.FailResponse(c, err.Error()) + } + + auth := GetAuthContext(c.UserContext()) + event_id := GetEventIdFromContext(c.UserContext()) + participant, err := ctr.Querier.FindParticipantFromEventIdAndUser(c.Context(), database.FindParticipantFromEventIdAndUserParams{ + EventID: event_id, + UserID: sql.NullInt64{ + Int64: auth.User.ID, + Valid: true, + }, + }) + if err != nil { + return utils.FailResponse(c, "participant does not exist on the event") + } + + wish, err := ctr.Querier.GetWishByAllIDs(c.Context(), database.GetWishByAllIDsParams{ + ID: input.WishID, + UserID: auth.User.ID, + ParticipantID: participant.ID, + EventID: event_id, + }) + if err != nil { + return utils.FailResponse(c, "could not find wish with the given inputs") + } + + _, err = ctr.Querier.DeleteWish(c.Context(), wish.ID) + if err != nil { + return utils.FailResponse(c, "could not delete wish") + } + return utils.DataResponse(c, mappers.DbWishToWish(wish, nil)) +} + +func (ctr *Controller) GetWishes(c *fiber.Ctx) error { + auth := GetAuthContext(c.UserContext()) + event_id := GetEventIdFromContext(c.UserContext()) + participant := GetParticipantFromContext(c.UserContext()) + wishes, err := ctr.Querier.GetAllWishesForUser(c.Context(), database.GetAllWishesForUserParams{ + UserID: auth.User.ID, + EventID: event_id, + ParticipantID: participant.ID, + }) + if err != nil { + return utils.FailResponse(c, "could not fetch wishes") + } + + mapped_wishes := make([]types.Wish, len(wishes)) + for i, w := range wishes { + mapped_wishes[i] = mappers.DbWishToWish(w.Wish, &w.Product) + } + return utils.DataResponse(c, mapped_wishes) +} diff --git a/src/database/category.sql.go b/src/database/category.sql.go new file mode 100644 index 00000000..aafbd99a --- /dev/null +++ b/src/database/category.sql.go @@ -0,0 +1,63 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.25.0 +// source: category.sql + +package database + +import ( + "context" + "database/sql" +) + +const createCategory = `-- name: CreateCategory :one +INSERT INTO "category" ( + "name", + "description", + "category_url" +) VALUES( + $1, + $2, + $3 +) +RETURNING id, name, description, category_url, created_at, updated_at +` + +type CreateCategoryParams struct { + Name string `db:"name" json:"name"` + Description sql.NullString `db:"description" json:"description"` + CategoryUrl sql.NullString `db:"category_url" json:"categoryUrl"` +} + +func (q *Queries) CreateCategory(ctx context.Context, arg CreateCategoryParams) (Category, error) { + row := q.queryRow(ctx, q.createCategoryStmt, createCategory, arg.Name, arg.Description, arg.CategoryUrl) + var i Category + err := row.Scan( + &i.ID, + &i.Name, + &i.Description, + &i.CategoryUrl, + &i.CreatedAt, + &i.UpdatedAt, + ) + return i, err +} + +const findCategoryByName = `-- name: FindCategoryByName :one +SELECT id, name, description, category_url, created_at, updated_at FROM "category" +WHERE "name" = $1 +` + +func (q *Queries) FindCategoryByName(ctx context.Context, name string) (Category, error) { + row := q.queryRow(ctx, q.findCategoryByNameStmt, findCategoryByName, name) + var i Category + err := row.Scan( + &i.ID, + &i.Name, + &i.Description, + &i.CategoryUrl, + &i.CreatedAt, + &i.UpdatedAt, + ) + return i, err +} diff --git a/src/database/db.go b/src/database/db.go new file mode 100644 index 00000000..2dc1f71a --- /dev/null +++ b/src/database/db.go @@ -0,0 +1,498 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.25.0 + +package database + +import ( + "context" + "database/sql" + "fmt" +) + +type DBTX interface { + ExecContext(context.Context, string, ...interface{}) (sql.Result, error) + PrepareContext(context.Context, string) (*sql.Stmt, error) + QueryContext(context.Context, string, ...interface{}) (*sql.Rows, error) + QueryRowContext(context.Context, string, ...interface{}) *sql.Row +} + +func New(db DBTX) *Queries { + return &Queries{db: db} +} + +func Prepare(ctx context.Context, db DBTX) (*Queries, error) { + q := Queries{db: db} + var err error + if q.acceptEventInviteStmt, err = db.PrepareContext(ctx, acceptEventInvite); err != nil { + return nil, fmt.Errorf("error preparing query AcceptEventInvite: %w", err) + } + if q.createCategoryStmt, err = db.PrepareContext(ctx, createCategory); err != nil { + return nil, fmt.Errorf("error preparing query CreateCategory: %w", err) + } + if q.createEventStmt, err = db.PrepareContext(ctx, createEvent); err != nil { + return nil, fmt.Errorf("error preparing query CreateEvent: %w", err) + } + if q.createLinkStmt, err = db.PrepareContext(ctx, createLink); err != nil { + return nil, fmt.Errorf("error preparing query CreateLink: %w", err) + } + if q.createParticipantStmt, err = db.PrepareContext(ctx, createParticipant); err != nil { + return nil, fmt.Errorf("error preparing query CreateParticipant: %w", err) + } + if q.createProductStmt, err = db.PrepareContext(ctx, createProduct); err != nil { + return nil, fmt.Errorf("error preparing query CreateProduct: %w", err) + } + if q.createUserStmt, err = db.PrepareContext(ctx, createUser); err != nil { + return nil, fmt.Errorf("error preparing query CreateUser: %w", err) + } + if q.createWishStmt, err = db.PrepareContext(ctx, createWish); err != nil { + return nil, fmt.Errorf("error preparing query CreateWish: %w", err) + } + if q.declineEventInviteStmt, err = db.PrepareContext(ctx, declineEventInvite); err != nil { + return nil, fmt.Errorf("error preparing query DeclineEventInvite: %w", err) + } + if q.deleteEventStmt, err = db.PrepareContext(ctx, deleteEvent); err != nil { + return nil, fmt.Errorf("error preparing query DeleteEvent: %w", err) + } + if q.deleteParticipantByIdAndEventIdStmt, err = db.PrepareContext(ctx, deleteParticipantByIdAndEventId); err != nil { + return nil, fmt.Errorf("error preparing query DeleteParticipantByIdAndEventId: %w", err) + } + if q.deleteWishStmt, err = db.PrepareContext(ctx, deleteWish); err != nil { + return nil, fmt.Errorf("error preparing query DeleteWish: %w", err) + } + if q.filterProductsStmt, err = db.PrepareContext(ctx, filterProducts); err != nil { + return nil, fmt.Errorf("error preparing query FilterProducts: %w", err) + } + if q.findAllEventsWithUserStmt, err = db.PrepareContext(ctx, findAllEventsWithUser); err != nil { + return nil, fmt.Errorf("error preparing query FindAllEventsWithUser: %w", err) + } + if q.findCategoryByNameStmt, err = db.PrepareContext(ctx, findCategoryByName); err != nil { + return nil, fmt.Errorf("error preparing query FindCategoryByName: %w", err) + } + if q.findEventByIdStmt, err = db.PrepareContext(ctx, findEventById); err != nil { + return nil, fmt.Errorf("error preparing query FindEventById: %w", err) + } + if q.findEventInvitesStmt, err = db.PrepareContext(ctx, findEventInvites); err != nil { + return nil, fmt.Errorf("error preparing query FindEventInvites: %w", err) + } + if q.findEventSimpleStmt, err = db.PrepareContext(ctx, findEventSimple); err != nil { + return nil, fmt.Errorf("error preparing query FindEventSimple: %w", err) + } + if q.findLinkByCodeStmt, err = db.PrepareContext(ctx, findLinkByCode); err != nil { + return nil, fmt.Errorf("error preparing query FindLinkByCode: %w", err) + } + if q.findLinkWithEventByCodeStmt, err = db.PrepareContext(ctx, findLinkWithEventByCode); err != nil { + return nil, fmt.Errorf("error preparing query FindLinkWithEventByCode: %w", err) + } + if q.findParticipantFromEventIdAndUserStmt, err = db.PrepareContext(ctx, findParticipantFromEventIdAndUser); err != nil { + return nil, fmt.Errorf("error preparing query FindParticipantFromEventIdAndUser: %w", err) + } + if q.findParticipantUserWithFullEventByIdStmt, err = db.PrepareContext(ctx, findParticipantUserWithFullEventById); err != nil { + return nil, fmt.Errorf("error preparing query FindParticipantUserWithFullEventById: %w", err) + } + if q.findParticipantWithIdAndEventIdStmt, err = db.PrepareContext(ctx, findParticipantWithIdAndEventId); err != nil { + return nil, fmt.Errorf("error preparing query FindParticipantWithIdAndEventId: %w", err) + } + if q.findProductByIdStmt, err = db.PrepareContext(ctx, findProductById); err != nil { + return nil, fmt.Errorf("error preparing query FindProductById: %w", err) + } + if q.findProductByProductKeyStmt, err = db.PrepareContext(ctx, findProductByProductKey); err != nil { + return nil, fmt.Errorf("error preparing query FindProductByProductKey: %w", err) + } + if q.findUserByEmailStmt, err = db.PrepareContext(ctx, findUserByEmail); err != nil { + return nil, fmt.Errorf("error preparing query FindUserByEmail: %w", err) + } + if q.findUserByIdStmt, err = db.PrepareContext(ctx, findUserById); err != nil { + return nil, fmt.Errorf("error preparing query FindUserById: %w", err) + } + if q.findUserByIdAndEmailStmt, err = db.PrepareContext(ctx, findUserByIdAndEmail); err != nil { + return nil, fmt.Errorf("error preparing query FindUserByIdAndEmail: %w", err) + } + if q.findUserByIdOrEmailStmt, err = db.PrepareContext(ctx, findUserByIdOrEmail); err != nil { + return nil, fmt.Errorf("error preparing query FindUserByIdOrEmail: %w", err) + } + if q.getAllWishesForUserStmt, err = db.PrepareContext(ctx, getAllWishesForUser); err != nil { + return nil, fmt.Errorf("error preparing query GetAllWishesForUser: %w", err) + } + if q.getWishByAllIDsStmt, err = db.PrepareContext(ctx, getWishByAllIDs); err != nil { + return nil, fmt.Errorf("error preparing query GetWishByAllIDs: %w", err) + } + if q.getWishWithProductIDStmt, err = db.PrepareContext(ctx, getWishWithProductID); err != nil { + return nil, fmt.Errorf("error preparing query GetWishWithProductID: %w", err) + } + if q.patchParticipantStmt, err = db.PrepareContext(ctx, patchParticipant); err != nil { + return nil, fmt.Errorf("error preparing query PatchParticipant: %w", err) + } + if q.setUserAsAdminStmt, err = db.PrepareContext(ctx, setUserAsAdmin); err != nil { + return nil, fmt.Errorf("error preparing query SetUserAsAdmin: %w", err) + } + if q.updateEventStmt, err = db.PrepareContext(ctx, updateEvent); err != nil { + return nil, fmt.Errorf("error preparing query UpdateEvent: %w", err) + } + if q.updateParticipantStatusStmt, err = db.PrepareContext(ctx, updateParticipantStatus); err != nil { + return nil, fmt.Errorf("error preparing query UpdateParticipantStatus: %w", err) + } + if q.updateProductStmt, err = db.PrepareContext(ctx, updateProduct); err != nil { + return nil, fmt.Errorf("error preparing query UpdateProduct: %w", err) + } + if q.updateWishQuantityStmt, err = db.PrepareContext(ctx, updateWishQuantity); err != nil { + return nil, fmt.Errorf("error preparing query UpdateWishQuantity: %w", err) + } + if q.verifyEventForUserAsOrganizerStmt, err = db.PrepareContext(ctx, verifyEventForUserAsOrganizer); err != nil { + return nil, fmt.Errorf("error preparing query VerifyEventForUserAsOrganizer: %w", err) + } + if q.verifyEventForUserAsParticipantStmt, err = db.PrepareContext(ctx, verifyEventForUserAsParticipant); err != nil { + return nil, fmt.Errorf("error preparing query VerifyEventForUserAsParticipant: %w", err) + } + if q.verifyEventWithEmailOrUserStmt, err = db.PrepareContext(ctx, verifyEventWithEmailOrUser); err != nil { + return nil, fmt.Errorf("error preparing query VerifyEventWithEmailOrUser: %w", err) + } + if q.verifyEventWithParticipantIdStmt, err = db.PrepareContext(ctx, verifyEventWithParticipantId); err != nil { + return nil, fmt.Errorf("error preparing query VerifyEventWithParticipantId: %w", err) + } + return &q, nil +} + +func (q *Queries) Close() error { + var err error + if q.acceptEventInviteStmt != nil { + if cerr := q.acceptEventInviteStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing acceptEventInviteStmt: %w", cerr) + } + } + if q.createCategoryStmt != nil { + if cerr := q.createCategoryStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing createCategoryStmt: %w", cerr) + } + } + if q.createEventStmt != nil { + if cerr := q.createEventStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing createEventStmt: %w", cerr) + } + } + if q.createLinkStmt != nil { + if cerr := q.createLinkStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing createLinkStmt: %w", cerr) + } + } + if q.createParticipantStmt != nil { + if cerr := q.createParticipantStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing createParticipantStmt: %w", cerr) + } + } + if q.createProductStmt != nil { + if cerr := q.createProductStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing createProductStmt: %w", cerr) + } + } + if q.createUserStmt != nil { + if cerr := q.createUserStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing createUserStmt: %w", cerr) + } + } + if q.createWishStmt != nil { + if cerr := q.createWishStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing createWishStmt: %w", cerr) + } + } + if q.declineEventInviteStmt != nil { + if cerr := q.declineEventInviteStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing declineEventInviteStmt: %w", cerr) + } + } + if q.deleteEventStmt != nil { + if cerr := q.deleteEventStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing deleteEventStmt: %w", cerr) + } + } + if q.deleteParticipantByIdAndEventIdStmt != nil { + if cerr := q.deleteParticipantByIdAndEventIdStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing deleteParticipantByIdAndEventIdStmt: %w", cerr) + } + } + if q.deleteWishStmt != nil { + if cerr := q.deleteWishStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing deleteWishStmt: %w", cerr) + } + } + if q.filterProductsStmt != nil { + if cerr := q.filterProductsStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing filterProductsStmt: %w", cerr) + } + } + if q.findAllEventsWithUserStmt != nil { + if cerr := q.findAllEventsWithUserStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing findAllEventsWithUserStmt: %w", cerr) + } + } + if q.findCategoryByNameStmt != nil { + if cerr := q.findCategoryByNameStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing findCategoryByNameStmt: %w", cerr) + } + } + if q.findEventByIdStmt != nil { + if cerr := q.findEventByIdStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing findEventByIdStmt: %w", cerr) + } + } + if q.findEventInvitesStmt != nil { + if cerr := q.findEventInvitesStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing findEventInvitesStmt: %w", cerr) + } + } + if q.findEventSimpleStmt != nil { + if cerr := q.findEventSimpleStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing findEventSimpleStmt: %w", cerr) + } + } + if q.findLinkByCodeStmt != nil { + if cerr := q.findLinkByCodeStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing findLinkByCodeStmt: %w", cerr) + } + } + if q.findLinkWithEventByCodeStmt != nil { + if cerr := q.findLinkWithEventByCodeStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing findLinkWithEventByCodeStmt: %w", cerr) + } + } + if q.findParticipantFromEventIdAndUserStmt != nil { + if cerr := q.findParticipantFromEventIdAndUserStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing findParticipantFromEventIdAndUserStmt: %w", cerr) + } + } + if q.findParticipantUserWithFullEventByIdStmt != nil { + if cerr := q.findParticipantUserWithFullEventByIdStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing findParticipantUserWithFullEventByIdStmt: %w", cerr) + } + } + if q.findParticipantWithIdAndEventIdStmt != nil { + if cerr := q.findParticipantWithIdAndEventIdStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing findParticipantWithIdAndEventIdStmt: %w", cerr) + } + } + if q.findProductByIdStmt != nil { + if cerr := q.findProductByIdStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing findProductByIdStmt: %w", cerr) + } + } + if q.findProductByProductKeyStmt != nil { + if cerr := q.findProductByProductKeyStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing findProductByProductKeyStmt: %w", cerr) + } + } + if q.findUserByEmailStmt != nil { + if cerr := q.findUserByEmailStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing findUserByEmailStmt: %w", cerr) + } + } + if q.findUserByIdStmt != nil { + if cerr := q.findUserByIdStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing findUserByIdStmt: %w", cerr) + } + } + if q.findUserByIdAndEmailStmt != nil { + if cerr := q.findUserByIdAndEmailStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing findUserByIdAndEmailStmt: %w", cerr) + } + } + if q.findUserByIdOrEmailStmt != nil { + if cerr := q.findUserByIdOrEmailStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing findUserByIdOrEmailStmt: %w", cerr) + } + } + if q.getAllWishesForUserStmt != nil { + if cerr := q.getAllWishesForUserStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing getAllWishesForUserStmt: %w", cerr) + } + } + if q.getWishByAllIDsStmt != nil { + if cerr := q.getWishByAllIDsStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing getWishByAllIDsStmt: %w", cerr) + } + } + if q.getWishWithProductIDStmt != nil { + if cerr := q.getWishWithProductIDStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing getWishWithProductIDStmt: %w", cerr) + } + } + if q.patchParticipantStmt != nil { + if cerr := q.patchParticipantStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing patchParticipantStmt: %w", cerr) + } + } + if q.setUserAsAdminStmt != nil { + if cerr := q.setUserAsAdminStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing setUserAsAdminStmt: %w", cerr) + } + } + if q.updateEventStmt != nil { + if cerr := q.updateEventStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing updateEventStmt: %w", cerr) + } + } + if q.updateParticipantStatusStmt != nil { + if cerr := q.updateParticipantStatusStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing updateParticipantStatusStmt: %w", cerr) + } + } + if q.updateProductStmt != nil { + if cerr := q.updateProductStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing updateProductStmt: %w", cerr) + } + } + if q.updateWishQuantityStmt != nil { + if cerr := q.updateWishQuantityStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing updateWishQuantityStmt: %w", cerr) + } + } + if q.verifyEventForUserAsOrganizerStmt != nil { + if cerr := q.verifyEventForUserAsOrganizerStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing verifyEventForUserAsOrganizerStmt: %w", cerr) + } + } + if q.verifyEventForUserAsParticipantStmt != nil { + if cerr := q.verifyEventForUserAsParticipantStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing verifyEventForUserAsParticipantStmt: %w", cerr) + } + } + if q.verifyEventWithEmailOrUserStmt != nil { + if cerr := q.verifyEventWithEmailOrUserStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing verifyEventWithEmailOrUserStmt: %w", cerr) + } + } + if q.verifyEventWithParticipantIdStmt != nil { + if cerr := q.verifyEventWithParticipantIdStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing verifyEventWithParticipantIdStmt: %w", cerr) + } + } + return err +} + +func (q *Queries) exec(ctx context.Context, stmt *sql.Stmt, query string, args ...interface{}) (sql.Result, error) { + switch { + case stmt != nil && q.tx != nil: + return q.tx.StmtContext(ctx, stmt).ExecContext(ctx, args...) + case stmt != nil: + return stmt.ExecContext(ctx, args...) + default: + return q.db.ExecContext(ctx, query, args...) + } +} + +func (q *Queries) query(ctx context.Context, stmt *sql.Stmt, query string, args ...interface{}) (*sql.Rows, error) { + switch { + case stmt != nil && q.tx != nil: + return q.tx.StmtContext(ctx, stmt).QueryContext(ctx, args...) + case stmt != nil: + return stmt.QueryContext(ctx, args...) + default: + return q.db.QueryContext(ctx, query, args...) + } +} + +func (q *Queries) queryRow(ctx context.Context, stmt *sql.Stmt, query string, args ...interface{}) *sql.Row { + switch { + case stmt != nil && q.tx != nil: + return q.tx.StmtContext(ctx, stmt).QueryRowContext(ctx, args...) + case stmt != nil: + return stmt.QueryRowContext(ctx, args...) + default: + return q.db.QueryRowContext(ctx, query, args...) + } +} + +type Queries struct { + db DBTX + tx *sql.Tx + acceptEventInviteStmt *sql.Stmt + createCategoryStmt *sql.Stmt + createEventStmt *sql.Stmt + createLinkStmt *sql.Stmt + createParticipantStmt *sql.Stmt + createProductStmt *sql.Stmt + createUserStmt *sql.Stmt + createWishStmt *sql.Stmt + declineEventInviteStmt *sql.Stmt + deleteEventStmt *sql.Stmt + deleteParticipantByIdAndEventIdStmt *sql.Stmt + deleteWishStmt *sql.Stmt + filterProductsStmt *sql.Stmt + findAllEventsWithUserStmt *sql.Stmt + findCategoryByNameStmt *sql.Stmt + findEventByIdStmt *sql.Stmt + findEventInvitesStmt *sql.Stmt + findEventSimpleStmt *sql.Stmt + findLinkByCodeStmt *sql.Stmt + findLinkWithEventByCodeStmt *sql.Stmt + findParticipantFromEventIdAndUserStmt *sql.Stmt + findParticipantUserWithFullEventByIdStmt *sql.Stmt + findParticipantWithIdAndEventIdStmt *sql.Stmt + findProductByIdStmt *sql.Stmt + findProductByProductKeyStmt *sql.Stmt + findUserByEmailStmt *sql.Stmt + findUserByIdStmt *sql.Stmt + findUserByIdAndEmailStmt *sql.Stmt + findUserByIdOrEmailStmt *sql.Stmt + getAllWishesForUserStmt *sql.Stmt + getWishByAllIDsStmt *sql.Stmt + getWishWithProductIDStmt *sql.Stmt + patchParticipantStmt *sql.Stmt + setUserAsAdminStmt *sql.Stmt + updateEventStmt *sql.Stmt + updateParticipantStatusStmt *sql.Stmt + updateProductStmt *sql.Stmt + updateWishQuantityStmt *sql.Stmt + verifyEventForUserAsOrganizerStmt *sql.Stmt + verifyEventForUserAsParticipantStmt *sql.Stmt + verifyEventWithEmailOrUserStmt *sql.Stmt + verifyEventWithParticipantIdStmt *sql.Stmt +} + +func (q *Queries) WithTx(tx *sql.Tx) *Queries { + return &Queries{ + db: tx, + tx: tx, + acceptEventInviteStmt: q.acceptEventInviteStmt, + createCategoryStmt: q.createCategoryStmt, + createEventStmt: q.createEventStmt, + createLinkStmt: q.createLinkStmt, + createParticipantStmt: q.createParticipantStmt, + createProductStmt: q.createProductStmt, + createUserStmt: q.createUserStmt, + createWishStmt: q.createWishStmt, + declineEventInviteStmt: q.declineEventInviteStmt, + deleteEventStmt: q.deleteEventStmt, + deleteParticipantByIdAndEventIdStmt: q.deleteParticipantByIdAndEventIdStmt, + deleteWishStmt: q.deleteWishStmt, + filterProductsStmt: q.filterProductsStmt, + findAllEventsWithUserStmt: q.findAllEventsWithUserStmt, + findCategoryByNameStmt: q.findCategoryByNameStmt, + findEventByIdStmt: q.findEventByIdStmt, + findEventInvitesStmt: q.findEventInvitesStmt, + findEventSimpleStmt: q.findEventSimpleStmt, + findLinkByCodeStmt: q.findLinkByCodeStmt, + findLinkWithEventByCodeStmt: q.findLinkWithEventByCodeStmt, + findParticipantFromEventIdAndUserStmt: q.findParticipantFromEventIdAndUserStmt, + findParticipantUserWithFullEventByIdStmt: q.findParticipantUserWithFullEventByIdStmt, + findParticipantWithIdAndEventIdStmt: q.findParticipantWithIdAndEventIdStmt, + findProductByIdStmt: q.findProductByIdStmt, + findProductByProductKeyStmt: q.findProductByProductKeyStmt, + findUserByEmailStmt: q.findUserByEmailStmt, + findUserByIdStmt: q.findUserByIdStmt, + findUserByIdAndEmailStmt: q.findUserByIdAndEmailStmt, + findUserByIdOrEmailStmt: q.findUserByIdOrEmailStmt, + getAllWishesForUserStmt: q.getAllWishesForUserStmt, + getWishByAllIDsStmt: q.getWishByAllIDsStmt, + getWishWithProductIDStmt: q.getWishWithProductIDStmt, + patchParticipantStmt: q.patchParticipantStmt, + setUserAsAdminStmt: q.setUserAsAdminStmt, + updateEventStmt: q.updateEventStmt, + updateParticipantStatusStmt: q.updateParticipantStatusStmt, + updateProductStmt: q.updateProductStmt, + updateWishQuantityStmt: q.updateWishQuantityStmt, + verifyEventForUserAsOrganizerStmt: q.verifyEventForUserAsOrganizerStmt, + verifyEventForUserAsParticipantStmt: q.verifyEventForUserAsParticipantStmt, + verifyEventWithEmailOrUserStmt: q.verifyEventWithEmailOrUserStmt, + verifyEventWithParticipantIdStmt: q.verifyEventWithParticipantIdStmt, + } +} diff --git a/src/database/db_config.go b/src/database/db_config.go new file mode 100644 index 00000000..e4f53972 --- /dev/null +++ b/src/database/db_config.go @@ -0,0 +1,53 @@ +package database + +import ( + "database/sql" + "fmt" + "strconv" + + "github.com/giftxtrade/api/src/utils" +) + +type DbConnection struct { + DbName string `json:"dbName"` + Username string `json:"username"` + Password string `json:"password"` + Host string `json:"host"` + Port uint16 `json:"port"` + SslMode bool `json:"sslMode"` +} + +func DbConnectionString(options DbConnection) string { + sslmode_val := "enable" + if !options.SslMode { + sslmode_val = "disable" + } + dns := fmt.Sprintf( + "host=%s user=%s password=%s dbname=%s port=%s sslmode=%s TimeZone=America/Chicago", + options.Host, + options.Username, + options.Password, + options.DbName, + strconv.Itoa(int(options.Port)), + sslmode_val, + ) + return dns +} + +func DbConfig() (DbConnection, error) { + var db_config DbConnection + err := utils.FileMapper("db_config.json", &db_config) + return db_config, err +} + +func CreateDbConnection(options DbConnection) (*sql.DB, error) { + return sql.Open("postgres", DbConnectionString(options)) +} + +func NewDbConnection() (*sql.DB, error) { + config, err := DbConfig() + if err != nil { + return nil, err + } + return CreateDbConnection(config) +} diff --git a/src/database/event.sql.go b/src/database/event.sql.go new file mode 100644 index 00000000..0cc37bf9 --- /dev/null +++ b/src/database/event.sql.go @@ -0,0 +1,426 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.25.0 +// source: event.sql + +package database + +import ( + "context" + "database/sql" + "time" +) + +const createEvent = `-- name: CreateEvent :one +INSERT INTO "event" ( + "name", + "description", + "budget", + "invitation_message", + "draw_at", + "close_at" +) VALUES ( + $1, $2, $3, $4, $5, $6 +) +RETURNING id, name, description, budget, invitation_message, draw_at, close_at, created_at, updated_at +` + +type CreateEventParams struct { + Name string `db:"name" json:"name"` + Description sql.NullString `db:"description" json:"description"` + Budget string `db:"budget" json:"budget"` + InvitationMessage string `db:"invitation_message" json:"invitationMessage"` + DrawAt time.Time `db:"draw_at" json:"drawAt"` + CloseAt time.Time `db:"close_at" json:"closeAt"` +} + +func (q *Queries) CreateEvent(ctx context.Context, arg CreateEventParams) (Event, error) { + row := q.queryRow(ctx, q.createEventStmt, createEvent, + arg.Name, + arg.Description, + arg.Budget, + arg.InvitationMessage, + arg.DrawAt, + arg.CloseAt, + ) + var i Event + err := row.Scan( + &i.ID, + &i.Name, + &i.Description, + &i.Budget, + &i.InvitationMessage, + &i.DrawAt, + &i.CloseAt, + &i.CreatedAt, + &i.UpdatedAt, + ) + return i, err +} + +const deleteEvent = `-- name: DeleteEvent :one +DELETE FROM "event" +WHERE "event"."id" = $1 +RETURNING id, name, description, budget, invitation_message, draw_at, close_at, created_at, updated_at +` + +func (q *Queries) DeleteEvent(ctx context.Context, id int64) (Event, error) { + row := q.queryRow(ctx, q.deleteEventStmt, deleteEvent, id) + var i Event + err := row.Scan( + &i.ID, + &i.Name, + &i.Description, + &i.Budget, + &i.InvitationMessage, + &i.DrawAt, + &i.CloseAt, + &i.CreatedAt, + &i.UpdatedAt, + ) + return i, err +} + +const findAllEventsWithUser = `-- name: FindAllEventsWithUser :many +SELECT + event.id, event.name, event.description, event.budget, event.invitation_message, event.draw_at, event.close_at, event.created_at, event.updated_at, + p.id, p.name, p.email, p.address, p.organizer, p.participates, p.accepted, p.event_id, p.user_id, p.created_at, p.updated_at, p.user_name, p.user_email, p.user_image_url +FROM "event" +JOIN "participant" "p1" ON "p1"."event_id" = "event"."id" +JOIN "participant_user" "p" ON "p"."event_id" = "event"."id" +WHERE + "p1"."user_id" = $1 +ORDER BY + "event"."draw_at" ASC, + "event"."close_at" ASC, + "p"."id" ASC +` + +type FindAllEventsWithUserRow struct { + Event Event `db:"event" json:"event"` + ParticipantUser ParticipantUser `db:"participant_user" json:"participantUser"` +} + +func (q *Queries) FindAllEventsWithUser(ctx context.Context, userID sql.NullInt64) ([]FindAllEventsWithUserRow, error) { + rows, err := q.query(ctx, q.findAllEventsWithUserStmt, findAllEventsWithUser, userID) + if err != nil { + return nil, err + } + defer rows.Close() + var items []FindAllEventsWithUserRow + for rows.Next() { + var i FindAllEventsWithUserRow + if err := rows.Scan( + &i.Event.ID, + &i.Event.Name, + &i.Event.Description, + &i.Event.Budget, + &i.Event.InvitationMessage, + &i.Event.DrawAt, + &i.Event.CloseAt, + &i.Event.CreatedAt, + &i.Event.UpdatedAt, + &i.ParticipantUser.ID, + &i.ParticipantUser.Name, + &i.ParticipantUser.Email, + &i.ParticipantUser.Address, + &i.ParticipantUser.Organizer, + &i.ParticipantUser.Participates, + &i.ParticipantUser.Accepted, + &i.ParticipantUser.EventID, + &i.ParticipantUser.UserID, + &i.ParticipantUser.CreatedAt, + &i.ParticipantUser.UpdatedAt, + &i.ParticipantUser.UserName, + &i.ParticipantUser.UserEmail, + &i.ParticipantUser.UserImageUrl, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + +const findEventById = `-- name: FindEventById :many +SELECT + event_link.id, event_link.name, event_link.description, event_link.budget, event_link.invitation_message, event_link.draw_at, event_link.close_at, event_link.created_at, event_link.updated_at, event_link.link_id, event_link.link_code, event_link.link_expiration_date, + p.id, p.name, p.email, p.address, p.organizer, p.participates, p.accepted, p.event_id, p.user_id, p.created_at, p.updated_at, p.user_name, p.user_email, p.user_image_url +FROM "event_link" +JOIN "participant_user" "p" ON "p"."event_id" = "event_link"."id" +WHERE "event_link"."id" = $1 +ORDER BY + "p"."organizer" DESC, + "p"."accepted" DESC, + "p"."created_at" DESC +` + +type FindEventByIdRow struct { + EventLink EventLink `db:"event_link" json:"eventLink"` + ParticipantUser ParticipantUser `db:"participant_user" json:"participantUser"` +} + +func (q *Queries) FindEventById(ctx context.Context, id int64) ([]FindEventByIdRow, error) { + rows, err := q.query(ctx, q.findEventByIdStmt, findEventById, id) + if err != nil { + return nil, err + } + defer rows.Close() + var items []FindEventByIdRow + for rows.Next() { + var i FindEventByIdRow + if err := rows.Scan( + &i.EventLink.ID, + &i.EventLink.Name, + &i.EventLink.Description, + &i.EventLink.Budget, + &i.EventLink.InvitationMessage, + &i.EventLink.DrawAt, + &i.EventLink.CloseAt, + &i.EventLink.CreatedAt, + &i.EventLink.UpdatedAt, + &i.EventLink.LinkID, + &i.EventLink.LinkCode, + &i.EventLink.LinkExpirationDate, + &i.ParticipantUser.ID, + &i.ParticipantUser.Name, + &i.ParticipantUser.Email, + &i.ParticipantUser.Address, + &i.ParticipantUser.Organizer, + &i.ParticipantUser.Participates, + &i.ParticipantUser.Accepted, + &i.ParticipantUser.EventID, + &i.ParticipantUser.UserID, + &i.ParticipantUser.CreatedAt, + &i.ParticipantUser.UpdatedAt, + &i.ParticipantUser.UserName, + &i.ParticipantUser.UserEmail, + &i.ParticipantUser.UserImageUrl, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + +const findEventInvites = `-- name: FindEventInvites :many +SELECT event.id, event.name, event.description, event.budget, event.invitation_message, event.draw_at, event.close_at, event.created_at, event.updated_at +FROM "event" +JOIN "participant" ON "participant"."event_id" = "event"."id" +WHERE + "participant"."accepted" = FALSE + AND + "participant"."email" = $1 +` + +func (q *Queries) FindEventInvites(ctx context.Context, email string) ([]Event, error) { + rows, err := q.query(ctx, q.findEventInvitesStmt, findEventInvites, email) + if err != nil { + return nil, err + } + defer rows.Close() + var items []Event + for rows.Next() { + var i Event + if err := rows.Scan( + &i.ID, + &i.Name, + &i.Description, + &i.Budget, + &i.InvitationMessage, + &i.DrawAt, + &i.CloseAt, + &i.CreatedAt, + &i.UpdatedAt, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + +const findEventSimple = `-- name: FindEventSimple :one +SELECT id, name, description, budget, invitation_message, draw_at, close_at, created_at, updated_at FROM "event" WHERE "event"."id" = $1 +` + +func (q *Queries) FindEventSimple(ctx context.Context, id int64) (Event, error) { + row := q.queryRow(ctx, q.findEventSimpleStmt, findEventSimple, id) + var i Event + err := row.Scan( + &i.ID, + &i.Name, + &i.Description, + &i.Budget, + &i.InvitationMessage, + &i.DrawAt, + &i.CloseAt, + &i.CreatedAt, + &i.UpdatedAt, + ) + return i, err +} + +const updateEvent = `-- name: UpdateEvent :one +UPDATE "event" +SET + "name" = COALESCE($2, "name"), + "description" = COALESCE($3, "description"), + "budget" = COALESCE($4, "budget"), + "draw_at" = COALESCE($5, "draw_at"), + "close_at" = COALESCE($6, "close_at"), + "updated_at" = now() +WHERE "event"."id" = $1 +RETURNING id, name, description, budget, invitation_message, draw_at, close_at, created_at, updated_at +` + +type UpdateEventParams struct { + ID int64 `db:"id" json:"id"` + Name sql.NullString `db:"name" json:"name"` + Description sql.NullString `db:"description" json:"description"` + Budget sql.NullString `db:"budget" json:"budget"` + DrawAt sql.NullTime `db:"draw_at" json:"drawAt"` + CloseAt sql.NullTime `db:"close_at" json:"closeAt"` +} + +func (q *Queries) UpdateEvent(ctx context.Context, arg UpdateEventParams) (Event, error) { + row := q.queryRow(ctx, q.updateEventStmt, updateEvent, + arg.ID, + arg.Name, + arg.Description, + arg.Budget, + arg.DrawAt, + arg.CloseAt, + ) + var i Event + err := row.Scan( + &i.ID, + &i.Name, + &i.Description, + &i.Budget, + &i.InvitationMessage, + &i.DrawAt, + &i.CloseAt, + &i.CreatedAt, + &i.UpdatedAt, + ) + return i, err +} + +const verifyEventForUserAsOrganizer = `-- name: VerifyEventForUserAsOrganizer :one +SELECT "event"."id" +FROM "event" +JOIN "participant" ON "participant"."event_id" = "event"."id" +JOIN "user" ON "user"."id" = "participant"."user_id" +WHERE + "event"."id" = $1 + AND + "participant"."organizer" = TRUE + AND + "user"."id" = $2 +` + +type VerifyEventForUserAsOrganizerParams struct { + EventID int64 `db:"event_id" json:"eventId"` + UserID int64 `db:"user_id" json:"userId"` +} + +func (q *Queries) VerifyEventForUserAsOrganizer(ctx context.Context, arg VerifyEventForUserAsOrganizerParams) (int64, error) { + row := q.queryRow(ctx, q.verifyEventForUserAsOrganizerStmt, verifyEventForUserAsOrganizer, arg.EventID, arg.UserID) + var id int64 + err := row.Scan(&id) + return id, err +} + +const verifyEventForUserAsParticipant = `-- name: VerifyEventForUserAsParticipant :one +SELECT "event"."id" +FROM "event" +JOIN "participant" ON "participant"."event_id" = "event"."id" +JOIN "user" ON "user"."id" = "participant"."user_id" +WHERE + "event"."id" = $1 + AND + "participant"."participates" = TRUE + AND + "user"."id" = $2 +` + +type VerifyEventForUserAsParticipantParams struct { + EventID int64 `db:"event_id" json:"eventId"` + UserID int64 `db:"user_id" json:"userId"` +} + +func (q *Queries) VerifyEventForUserAsParticipant(ctx context.Context, arg VerifyEventForUserAsParticipantParams) (int64, error) { + row := q.queryRow(ctx, q.verifyEventForUserAsParticipantStmt, verifyEventForUserAsParticipant, arg.EventID, arg.UserID) + var id int64 + err := row.Scan(&id) + return id, err +} + +const verifyEventWithEmailOrUser = `-- name: VerifyEventWithEmailOrUser :one + +SELECT "event"."id" +FROM "event" +JOIN "participant" ON "participant"."event_id" = "event"."id" +WHERE + "event"."id" = $1 + AND + ( + "participant"."user_id" = $2 OR "participant"."email" = $3 + ) +` + +type VerifyEventWithEmailOrUserParams struct { + EventID int64 `db:"event_id" json:"eventId"` + UserID sql.NullInt64 `db:"user_id" json:"userId"` + Email sql.NullString `db:"email" json:"email"` +} + +// event verification queries +func (q *Queries) VerifyEventWithEmailOrUser(ctx context.Context, arg VerifyEventWithEmailOrUserParams) (int64, error) { + row := q.queryRow(ctx, q.verifyEventWithEmailOrUserStmt, verifyEventWithEmailOrUser, arg.EventID, arg.UserID, arg.Email) + var id int64 + err := row.Scan(&id) + return id, err +} + +const verifyEventWithParticipantId = `-- name: VerifyEventWithParticipantId :one +SELECT "event"."id" +FROM "event" +JOIN "participant" ON "participant"."event_id" = "event"."id" +WHERE + "event"."id" = $1 + AND + "participant"."id" = $2 +` + +type VerifyEventWithParticipantIdParams struct { + EventID int64 `db:"event_id" json:"eventId"` + ParticipantID int64 `db:"participant_id" json:"participantId"` +} + +func (q *Queries) VerifyEventWithParticipantId(ctx context.Context, arg VerifyEventWithParticipantIdParams) (int64, error) { + row := q.queryRow(ctx, q.verifyEventWithParticipantIdStmt, verifyEventWithParticipantId, arg.EventID, arg.ParticipantID) + var id int64 + err := row.Scan(&id) + return id, err +} diff --git a/src/database/jet/postgres/public/enum/currency_type.go b/src/database/jet/postgres/public/enum/currency_type.go new file mode 100644 index 00000000..447cd669 --- /dev/null +++ b/src/database/jet/postgres/public/enum/currency_type.go @@ -0,0 +1,18 @@ +// +// Code generated by go-jet DO NOT EDIT. +// +// WARNING: Changes to this file may cause incorrect behavior +// and will be lost if the code is regenerated +// + +package enum + +import "github.com/go-jet/jet/v2/postgres" + +var CurrencyType = &struct { + Usd postgres.StringExpression + Cad postgres.StringExpression +}{ + Usd: postgres.NewEnumValue("USD"), + Cad: postgres.NewEnumValue("CAD"), +} diff --git a/src/database/jet/postgres/public/model/category.go b/src/database/jet/postgres/public/model/category.go new file mode 100644 index 00000000..4a2b52b3 --- /dev/null +++ b/src/database/jet/postgres/public/model/category.go @@ -0,0 +1,21 @@ +// +// Code generated by go-jet DO NOT EDIT. +// +// WARNING: Changes to this file may cause incorrect behavior +// and will be lost if the code is regenerated +// + +package model + +import ( + "time" +) + +type Category struct { + ID int64 `sql:"primary_key"` + Name string + Description *string + CategoryURL *string + CreatedAt time.Time + UpdatedAt time.Time +} diff --git a/src/database/jet/postgres/public/model/currency_type.go b/src/database/jet/postgres/public/model/currency_type.go new file mode 100644 index 00000000..8e8bbb44 --- /dev/null +++ b/src/database/jet/postgres/public/model/currency_type.go @@ -0,0 +1,44 @@ +// +// Code generated by go-jet DO NOT EDIT. +// +// WARNING: Changes to this file may cause incorrect behavior +// and will be lost if the code is regenerated +// + +package model + +import "errors" + +type CurrencyType string + +const ( + CurrencyType_Usd CurrencyType = "USD" + CurrencyType_Cad CurrencyType = "CAD" +) + +func (e *CurrencyType) Scan(value interface{}) error { + var enumValue string + switch val := value.(type) { + case string: + enumValue = val + case []byte: + enumValue = string(val) + default: + return errors.New("jet: Invalid scan value for AllTypesEnum enum. Enum value has to be of type string or []byte") + } + + switch enumValue { + case "USD": + *e = CurrencyType_Usd + case "CAD": + *e = CurrencyType_Cad + default: + return errors.New("jet: Invalid scan value '" + enumValue + "' for CurrencyType enum") + } + + return nil +} + +func (e CurrencyType) String() string { + return string(e) +} diff --git a/src/database/jet/postgres/public/model/draw.go b/src/database/jet/postgres/public/model/draw.go new file mode 100644 index 00000000..bccc7a30 --- /dev/null +++ b/src/database/jet/postgres/public/model/draw.go @@ -0,0 +1,21 @@ +// +// Code generated by go-jet DO NOT EDIT. +// +// WARNING: Changes to this file may cause incorrect behavior +// and will be lost if the code is regenerated +// + +package model + +import ( + "time" +) + +type Draw struct { + ID int64 `sql:"primary_key"` + DrawerID int64 + DraweeID int64 + EventID int64 + CreatedAt time.Time + UpdatedAt time.Time +} diff --git a/src/database/jet/postgres/public/model/event.go b/src/database/jet/postgres/public/model/event.go new file mode 100644 index 00000000..c7cf69a6 --- /dev/null +++ b/src/database/jet/postgres/public/model/event.go @@ -0,0 +1,24 @@ +// +// Code generated by go-jet DO NOT EDIT. +// +// WARNING: Changes to this file may cause incorrect behavior +// and will be lost if the code is regenerated +// + +package model + +import ( + "time" +) + +type Event struct { + ID int64 `sql:"primary_key"` + Name string + Description *string + Budget string + InvitationMessage string + DrawAt time.Time + CloseAt time.Time + CreatedAt time.Time + UpdatedAt time.Time +} diff --git a/src/database/jet/postgres/public/model/event_link.go b/src/database/jet/postgres/public/model/event_link.go new file mode 100644 index 00000000..516dd8df --- /dev/null +++ b/src/database/jet/postgres/public/model/event_link.go @@ -0,0 +1,27 @@ +// +// Code generated by go-jet DO NOT EDIT. +// +// WARNING: Changes to this file may cause incorrect behavior +// and will be lost if the code is regenerated +// + +package model + +import ( + "time" +) + +type EventLink struct { + ID *int64 + Name *string + Description *string + Budget *string + InvitationMessage *string + DrawAt *time.Time + CloseAt *time.Time + CreatedAt *time.Time + UpdatedAt *time.Time + LinkID *int64 + LinkCode *string + LinkExpirationDate *time.Time +} diff --git a/src/database/jet/postgres/public/model/link.go b/src/database/jet/postgres/public/model/link.go new file mode 100644 index 00000000..97e37d15 --- /dev/null +++ b/src/database/jet/postgres/public/model/link.go @@ -0,0 +1,21 @@ +// +// Code generated by go-jet DO NOT EDIT. +// +// WARNING: Changes to this file may cause incorrect behavior +// and will be lost if the code is regenerated +// + +package model + +import ( + "time" +) + +type Link struct { + ID int64 `sql:"primary_key"` + Code string + ExpirationDate time.Time + EventID int64 + CreatedAt time.Time + UpdatedAt time.Time +} diff --git a/src/database/jet/postgres/public/model/migration.go b/src/database/jet/postgres/public/model/migration.go new file mode 100644 index 00000000..e24cc921 --- /dev/null +++ b/src/database/jet/postgres/public/model/migration.go @@ -0,0 +1,18 @@ +// +// Code generated by go-jet DO NOT EDIT. +// +// WARNING: Changes to this file may cause incorrect behavior +// and will be lost if the code is regenerated +// + +package model + +import ( + "time" +) + +type Migration struct { + ID int64 + Name string + MigrationDate time.Time +} diff --git a/src/database/jet/postgres/public/model/participant.go b/src/database/jet/postgres/public/model/participant.go new file mode 100644 index 00000000..1e3ccc34 --- /dev/null +++ b/src/database/jet/postgres/public/model/participant.go @@ -0,0 +1,26 @@ +// +// Code generated by go-jet DO NOT EDIT. +// +// WARNING: Changes to this file may cause incorrect behavior +// and will be lost if the code is regenerated +// + +package model + +import ( + "time" +) + +type Participant struct { + ID int64 `sql:"primary_key"` + Name string + Email string + Address *string + Organizer bool + Participates bool + Accepted bool + EventID int64 + UserID *int64 + CreatedAt time.Time + UpdatedAt time.Time +} diff --git a/src/database/jet/postgres/public/model/participant_user.go b/src/database/jet/postgres/public/model/participant_user.go new file mode 100644 index 00000000..cd3e20ee --- /dev/null +++ b/src/database/jet/postgres/public/model/participant_user.go @@ -0,0 +1,29 @@ +// +// Code generated by go-jet DO NOT EDIT. +// +// WARNING: Changes to this file may cause incorrect behavior +// and will be lost if the code is regenerated +// + +package model + +import ( + "time" +) + +type ParticipantUser struct { + ID *int64 + Name *string + Email *string + Address *string + Organizer *bool + Participates *bool + Accepted *bool + EventID *int64 + UserID *int64 + CreatedAt *time.Time + UpdatedAt *time.Time + UserName *string + UserEmail *string + UserImageURL *string +} diff --git a/src/database/jet/postgres/public/model/product.go b/src/database/jet/postgres/public/model/product.go new file mode 100644 index 00000000..df23607a --- /dev/null +++ b/src/database/jet/postgres/public/model/product.go @@ -0,0 +1,30 @@ +// +// Code generated by go-jet DO NOT EDIT. +// +// WARNING: Changes to this file may cause incorrect behavior +// and will be lost if the code is regenerated +// + +package model + +import ( + "time" +) + +type Product struct { + ID int64 `sql:"primary_key"` + Title string + Description *string + ProductKey string + ImageURL string + TotalReviews int32 + Rating float32 + Price string + Currency CurrencyType + URL string + CategoryID *int64 + CreatedAt time.Time + UpdatedAt time.Time + ProductTs *string + Origin string +} diff --git a/src/database/jet/postgres/public/model/user.go b/src/database/jet/postgres/public/model/user.go new file mode 100644 index 00000000..b8c290d8 --- /dev/null +++ b/src/database/jet/postgres/public/model/user.go @@ -0,0 +1,24 @@ +// +// Code generated by go-jet DO NOT EDIT. +// +// WARNING: Changes to this file may cause incorrect behavior +// and will be lost if the code is regenerated +// + +package model + +import ( + "time" +) + +type User struct { + ID int64 `sql:"primary_key"` + Name string + Email string + ImageURL string + Phone *string + Admin bool + Active bool + CreatedAt time.Time + UpdatedAt time.Time +} diff --git a/src/database/jet/postgres/public/model/wish.go b/src/database/jet/postgres/public/model/wish.go new file mode 100644 index 00000000..f336b48a --- /dev/null +++ b/src/database/jet/postgres/public/model/wish.go @@ -0,0 +1,23 @@ +// +// Code generated by go-jet DO NOT EDIT. +// +// WARNING: Changes to this file may cause incorrect behavior +// and will be lost if the code is regenerated +// + +package model + +import ( + "time" +) + +type Wish struct { + ID int64 `sql:"primary_key"` + UserID int64 + ParticipantID int64 + ProductID *int64 + EventID int64 + CreatedAt time.Time + UpdatedAt time.Time + Quantity int32 +} diff --git a/src/database/jet/postgres/public/table/category.go b/src/database/jet/postgres/public/table/category.go new file mode 100644 index 00000000..17a5a666 --- /dev/null +++ b/src/database/jet/postgres/public/table/category.go @@ -0,0 +1,90 @@ +// +// Code generated by go-jet DO NOT EDIT. +// +// WARNING: Changes to this file may cause incorrect behavior +// and will be lost if the code is regenerated +// + +package table + +import ( + "github.com/go-jet/jet/v2/postgres" +) + +var Category = newCategoryTable("public", "category", "") + +type categoryTable struct { + postgres.Table + + // Columns + ID postgres.ColumnInteger + Name postgres.ColumnString + Description postgres.ColumnString + CategoryURL postgres.ColumnString + CreatedAt postgres.ColumnTimestampz + UpdatedAt postgres.ColumnTimestampz + + AllColumns postgres.ColumnList + MutableColumns postgres.ColumnList +} + +type CategoryTable struct { + categoryTable + + EXCLUDED categoryTable +} + +// AS creates new CategoryTable with assigned alias +func (a CategoryTable) AS(alias string) *CategoryTable { + return newCategoryTable(a.SchemaName(), a.TableName(), alias) +} + +// Schema creates new CategoryTable with assigned schema name +func (a CategoryTable) FromSchema(schemaName string) *CategoryTable { + return newCategoryTable(schemaName, a.TableName(), a.Alias()) +} + +// WithPrefix creates new CategoryTable with assigned table prefix +func (a CategoryTable) WithPrefix(prefix string) *CategoryTable { + return newCategoryTable(a.SchemaName(), prefix+a.TableName(), a.TableName()) +} + +// WithSuffix creates new CategoryTable with assigned table suffix +func (a CategoryTable) WithSuffix(suffix string) *CategoryTable { + return newCategoryTable(a.SchemaName(), a.TableName()+suffix, a.TableName()) +} + +func newCategoryTable(schemaName, tableName, alias string) *CategoryTable { + return &CategoryTable{ + categoryTable: newCategoryTableImpl(schemaName, tableName, alias), + EXCLUDED: newCategoryTableImpl("", "excluded", ""), + } +} + +func newCategoryTableImpl(schemaName, tableName, alias string) categoryTable { + var ( + IDColumn = postgres.IntegerColumn("id") + NameColumn = postgres.StringColumn("name") + DescriptionColumn = postgres.StringColumn("description") + CategoryURLColumn = postgres.StringColumn("category_url") + CreatedAtColumn = postgres.TimestampzColumn("created_at") + UpdatedAtColumn = postgres.TimestampzColumn("updated_at") + allColumns = postgres.ColumnList{IDColumn, NameColumn, DescriptionColumn, CategoryURLColumn, CreatedAtColumn, UpdatedAtColumn} + mutableColumns = postgres.ColumnList{NameColumn, DescriptionColumn, CategoryURLColumn, CreatedAtColumn, UpdatedAtColumn} + ) + + return categoryTable{ + Table: postgres.NewTable(schemaName, tableName, alias, allColumns...), + + //Columns + ID: IDColumn, + Name: NameColumn, + Description: DescriptionColumn, + CategoryURL: CategoryURLColumn, + CreatedAt: CreatedAtColumn, + UpdatedAt: UpdatedAtColumn, + + AllColumns: allColumns, + MutableColumns: mutableColumns, + } +} diff --git a/src/database/jet/postgres/public/table/draw.go b/src/database/jet/postgres/public/table/draw.go new file mode 100644 index 00000000..d9fdf6ea --- /dev/null +++ b/src/database/jet/postgres/public/table/draw.go @@ -0,0 +1,90 @@ +// +// Code generated by go-jet DO NOT EDIT. +// +// WARNING: Changes to this file may cause incorrect behavior +// and will be lost if the code is regenerated +// + +package table + +import ( + "github.com/go-jet/jet/v2/postgres" +) + +var Draw = newDrawTable("public", "draw", "") + +type drawTable struct { + postgres.Table + + // Columns + ID postgres.ColumnInteger + DrawerID postgres.ColumnInteger + DraweeID postgres.ColumnInteger + EventID postgres.ColumnInteger + CreatedAt postgres.ColumnTimestampz + UpdatedAt postgres.ColumnTimestampz + + AllColumns postgres.ColumnList + MutableColumns postgres.ColumnList +} + +type DrawTable struct { + drawTable + + EXCLUDED drawTable +} + +// AS creates new DrawTable with assigned alias +func (a DrawTable) AS(alias string) *DrawTable { + return newDrawTable(a.SchemaName(), a.TableName(), alias) +} + +// Schema creates new DrawTable with assigned schema name +func (a DrawTable) FromSchema(schemaName string) *DrawTable { + return newDrawTable(schemaName, a.TableName(), a.Alias()) +} + +// WithPrefix creates new DrawTable with assigned table prefix +func (a DrawTable) WithPrefix(prefix string) *DrawTable { + return newDrawTable(a.SchemaName(), prefix+a.TableName(), a.TableName()) +} + +// WithSuffix creates new DrawTable with assigned table suffix +func (a DrawTable) WithSuffix(suffix string) *DrawTable { + return newDrawTable(a.SchemaName(), a.TableName()+suffix, a.TableName()) +} + +func newDrawTable(schemaName, tableName, alias string) *DrawTable { + return &DrawTable{ + drawTable: newDrawTableImpl(schemaName, tableName, alias), + EXCLUDED: newDrawTableImpl("", "excluded", ""), + } +} + +func newDrawTableImpl(schemaName, tableName, alias string) drawTable { + var ( + IDColumn = postgres.IntegerColumn("id") + DrawerIDColumn = postgres.IntegerColumn("drawer_id") + DraweeIDColumn = postgres.IntegerColumn("drawee_id") + EventIDColumn = postgres.IntegerColumn("event_id") + CreatedAtColumn = postgres.TimestampzColumn("created_at") + UpdatedAtColumn = postgres.TimestampzColumn("updated_at") + allColumns = postgres.ColumnList{IDColumn, DrawerIDColumn, DraweeIDColumn, EventIDColumn, CreatedAtColumn, UpdatedAtColumn} + mutableColumns = postgres.ColumnList{DrawerIDColumn, DraweeIDColumn, EventIDColumn, CreatedAtColumn, UpdatedAtColumn} + ) + + return drawTable{ + Table: postgres.NewTable(schemaName, tableName, alias, allColumns...), + + //Columns + ID: IDColumn, + DrawerID: DrawerIDColumn, + DraweeID: DraweeIDColumn, + EventID: EventIDColumn, + CreatedAt: CreatedAtColumn, + UpdatedAt: UpdatedAtColumn, + + AllColumns: allColumns, + MutableColumns: mutableColumns, + } +} diff --git a/src/database/jet/postgres/public/table/event.go b/src/database/jet/postgres/public/table/event.go new file mode 100644 index 00000000..93c5f0a5 --- /dev/null +++ b/src/database/jet/postgres/public/table/event.go @@ -0,0 +1,99 @@ +// +// Code generated by go-jet DO NOT EDIT. +// +// WARNING: Changes to this file may cause incorrect behavior +// and will be lost if the code is regenerated +// + +package table + +import ( + "github.com/go-jet/jet/v2/postgres" +) + +var Event = newEventTable("public", "event", "") + +type eventTable struct { + postgres.Table + + // Columns + ID postgres.ColumnInteger + Name postgres.ColumnString + Description postgres.ColumnString + Budget postgres.ColumnString + InvitationMessage postgres.ColumnString + DrawAt postgres.ColumnTimestampz + CloseAt postgres.ColumnTimestampz + CreatedAt postgres.ColumnTimestampz + UpdatedAt postgres.ColumnTimestampz + + AllColumns postgres.ColumnList + MutableColumns postgres.ColumnList +} + +type EventTable struct { + eventTable + + EXCLUDED eventTable +} + +// AS creates new EventTable with assigned alias +func (a EventTable) AS(alias string) *EventTable { + return newEventTable(a.SchemaName(), a.TableName(), alias) +} + +// Schema creates new EventTable with assigned schema name +func (a EventTable) FromSchema(schemaName string) *EventTable { + return newEventTable(schemaName, a.TableName(), a.Alias()) +} + +// WithPrefix creates new EventTable with assigned table prefix +func (a EventTable) WithPrefix(prefix string) *EventTable { + return newEventTable(a.SchemaName(), prefix+a.TableName(), a.TableName()) +} + +// WithSuffix creates new EventTable with assigned table suffix +func (a EventTable) WithSuffix(suffix string) *EventTable { + return newEventTable(a.SchemaName(), a.TableName()+suffix, a.TableName()) +} + +func newEventTable(schemaName, tableName, alias string) *EventTable { + return &EventTable{ + eventTable: newEventTableImpl(schemaName, tableName, alias), + EXCLUDED: newEventTableImpl("", "excluded", ""), + } +} + +func newEventTableImpl(schemaName, tableName, alias string) eventTable { + var ( + IDColumn = postgres.IntegerColumn("id") + NameColumn = postgres.StringColumn("name") + DescriptionColumn = postgres.StringColumn("description") + BudgetColumn = postgres.StringColumn("budget") + InvitationMessageColumn = postgres.StringColumn("invitation_message") + DrawAtColumn = postgres.TimestampzColumn("draw_at") + CloseAtColumn = postgres.TimestampzColumn("close_at") + CreatedAtColumn = postgres.TimestampzColumn("created_at") + UpdatedAtColumn = postgres.TimestampzColumn("updated_at") + allColumns = postgres.ColumnList{IDColumn, NameColumn, DescriptionColumn, BudgetColumn, InvitationMessageColumn, DrawAtColumn, CloseAtColumn, CreatedAtColumn, UpdatedAtColumn} + mutableColumns = postgres.ColumnList{NameColumn, DescriptionColumn, BudgetColumn, InvitationMessageColumn, DrawAtColumn, CloseAtColumn, CreatedAtColumn, UpdatedAtColumn} + ) + + return eventTable{ + Table: postgres.NewTable(schemaName, tableName, alias, allColumns...), + + //Columns + ID: IDColumn, + Name: NameColumn, + Description: DescriptionColumn, + Budget: BudgetColumn, + InvitationMessage: InvitationMessageColumn, + DrawAt: DrawAtColumn, + CloseAt: CloseAtColumn, + CreatedAt: CreatedAtColumn, + UpdatedAt: UpdatedAtColumn, + + AllColumns: allColumns, + MutableColumns: mutableColumns, + } +} diff --git a/src/database/jet/postgres/public/table/link.go b/src/database/jet/postgres/public/table/link.go new file mode 100644 index 00000000..69286c75 --- /dev/null +++ b/src/database/jet/postgres/public/table/link.go @@ -0,0 +1,90 @@ +// +// Code generated by go-jet DO NOT EDIT. +// +// WARNING: Changes to this file may cause incorrect behavior +// and will be lost if the code is regenerated +// + +package table + +import ( + "github.com/go-jet/jet/v2/postgres" +) + +var Link = newLinkTable("public", "link", "") + +type linkTable struct { + postgres.Table + + // Columns + ID postgres.ColumnInteger + Code postgres.ColumnString + ExpirationDate postgres.ColumnTimestampz + EventID postgres.ColumnInteger + CreatedAt postgres.ColumnTimestampz + UpdatedAt postgres.ColumnTimestampz + + AllColumns postgres.ColumnList + MutableColumns postgres.ColumnList +} + +type LinkTable struct { + linkTable + + EXCLUDED linkTable +} + +// AS creates new LinkTable with assigned alias +func (a LinkTable) AS(alias string) *LinkTable { + return newLinkTable(a.SchemaName(), a.TableName(), alias) +} + +// Schema creates new LinkTable with assigned schema name +func (a LinkTable) FromSchema(schemaName string) *LinkTable { + return newLinkTable(schemaName, a.TableName(), a.Alias()) +} + +// WithPrefix creates new LinkTable with assigned table prefix +func (a LinkTable) WithPrefix(prefix string) *LinkTable { + return newLinkTable(a.SchemaName(), prefix+a.TableName(), a.TableName()) +} + +// WithSuffix creates new LinkTable with assigned table suffix +func (a LinkTable) WithSuffix(suffix string) *LinkTable { + return newLinkTable(a.SchemaName(), a.TableName()+suffix, a.TableName()) +} + +func newLinkTable(schemaName, tableName, alias string) *LinkTable { + return &LinkTable{ + linkTable: newLinkTableImpl(schemaName, tableName, alias), + EXCLUDED: newLinkTableImpl("", "excluded", ""), + } +} + +func newLinkTableImpl(schemaName, tableName, alias string) linkTable { + var ( + IDColumn = postgres.IntegerColumn("id") + CodeColumn = postgres.StringColumn("code") + ExpirationDateColumn = postgres.TimestampzColumn("expiration_date") + EventIDColumn = postgres.IntegerColumn("event_id") + CreatedAtColumn = postgres.TimestampzColumn("created_at") + UpdatedAtColumn = postgres.TimestampzColumn("updated_at") + allColumns = postgres.ColumnList{IDColumn, CodeColumn, ExpirationDateColumn, EventIDColumn, CreatedAtColumn, UpdatedAtColumn} + mutableColumns = postgres.ColumnList{CodeColumn, ExpirationDateColumn, EventIDColumn, CreatedAtColumn, UpdatedAtColumn} + ) + + return linkTable{ + Table: postgres.NewTable(schemaName, tableName, alias, allColumns...), + + //Columns + ID: IDColumn, + Code: CodeColumn, + ExpirationDate: ExpirationDateColumn, + EventID: EventIDColumn, + CreatedAt: CreatedAtColumn, + UpdatedAt: UpdatedAtColumn, + + AllColumns: allColumns, + MutableColumns: mutableColumns, + } +} diff --git a/src/database/jet/postgres/public/table/migration.go b/src/database/jet/postgres/public/table/migration.go new file mode 100644 index 00000000..72be6568 --- /dev/null +++ b/src/database/jet/postgres/public/table/migration.go @@ -0,0 +1,81 @@ +// +// Code generated by go-jet DO NOT EDIT. +// +// WARNING: Changes to this file may cause incorrect behavior +// and will be lost if the code is regenerated +// + +package table + +import ( + "github.com/go-jet/jet/v2/postgres" +) + +var Migration = newMigrationTable("public", "migration", "") + +type migrationTable struct { + postgres.Table + + // Columns + ID postgres.ColumnInteger + Name postgres.ColumnString + MigrationDate postgres.ColumnTimestamp + + AllColumns postgres.ColumnList + MutableColumns postgres.ColumnList +} + +type MigrationTable struct { + migrationTable + + EXCLUDED migrationTable +} + +// AS creates new MigrationTable with assigned alias +func (a MigrationTable) AS(alias string) *MigrationTable { + return newMigrationTable(a.SchemaName(), a.TableName(), alias) +} + +// Schema creates new MigrationTable with assigned schema name +func (a MigrationTable) FromSchema(schemaName string) *MigrationTable { + return newMigrationTable(schemaName, a.TableName(), a.Alias()) +} + +// WithPrefix creates new MigrationTable with assigned table prefix +func (a MigrationTable) WithPrefix(prefix string) *MigrationTable { + return newMigrationTable(a.SchemaName(), prefix+a.TableName(), a.TableName()) +} + +// WithSuffix creates new MigrationTable with assigned table suffix +func (a MigrationTable) WithSuffix(suffix string) *MigrationTable { + return newMigrationTable(a.SchemaName(), a.TableName()+suffix, a.TableName()) +} + +func newMigrationTable(schemaName, tableName, alias string) *MigrationTable { + return &MigrationTable{ + migrationTable: newMigrationTableImpl(schemaName, tableName, alias), + EXCLUDED: newMigrationTableImpl("", "excluded", ""), + } +} + +func newMigrationTableImpl(schemaName, tableName, alias string) migrationTable { + var ( + IDColumn = postgres.IntegerColumn("id") + NameColumn = postgres.StringColumn("name") + MigrationDateColumn = postgres.TimestampColumn("migration_date") + allColumns = postgres.ColumnList{IDColumn, NameColumn, MigrationDateColumn} + mutableColumns = postgres.ColumnList{IDColumn, NameColumn, MigrationDateColumn} + ) + + return migrationTable{ + Table: postgres.NewTable(schemaName, tableName, alias, allColumns...), + + //Columns + ID: IDColumn, + Name: NameColumn, + MigrationDate: MigrationDateColumn, + + AllColumns: allColumns, + MutableColumns: mutableColumns, + } +} diff --git a/src/database/jet/postgres/public/table/participant.go b/src/database/jet/postgres/public/table/participant.go new file mode 100644 index 00000000..bd45d769 --- /dev/null +++ b/src/database/jet/postgres/public/table/participant.go @@ -0,0 +1,105 @@ +// +// Code generated by go-jet DO NOT EDIT. +// +// WARNING: Changes to this file may cause incorrect behavior +// and will be lost if the code is regenerated +// + +package table + +import ( + "github.com/go-jet/jet/v2/postgres" +) + +var Participant = newParticipantTable("public", "participant", "") + +type participantTable struct { + postgres.Table + + // Columns + ID postgres.ColumnInteger + Name postgres.ColumnString + Email postgres.ColumnString + Address postgres.ColumnString + Organizer postgres.ColumnBool + Participates postgres.ColumnBool + Accepted postgres.ColumnBool + EventID postgres.ColumnInteger + UserID postgres.ColumnInteger + CreatedAt postgres.ColumnTimestampz + UpdatedAt postgres.ColumnTimestampz + + AllColumns postgres.ColumnList + MutableColumns postgres.ColumnList +} + +type ParticipantTable struct { + participantTable + + EXCLUDED participantTable +} + +// AS creates new ParticipantTable with assigned alias +func (a ParticipantTable) AS(alias string) *ParticipantTable { + return newParticipantTable(a.SchemaName(), a.TableName(), alias) +} + +// Schema creates new ParticipantTable with assigned schema name +func (a ParticipantTable) FromSchema(schemaName string) *ParticipantTable { + return newParticipantTable(schemaName, a.TableName(), a.Alias()) +} + +// WithPrefix creates new ParticipantTable with assigned table prefix +func (a ParticipantTable) WithPrefix(prefix string) *ParticipantTable { + return newParticipantTable(a.SchemaName(), prefix+a.TableName(), a.TableName()) +} + +// WithSuffix creates new ParticipantTable with assigned table suffix +func (a ParticipantTable) WithSuffix(suffix string) *ParticipantTable { + return newParticipantTable(a.SchemaName(), a.TableName()+suffix, a.TableName()) +} + +func newParticipantTable(schemaName, tableName, alias string) *ParticipantTable { + return &ParticipantTable{ + participantTable: newParticipantTableImpl(schemaName, tableName, alias), + EXCLUDED: newParticipantTableImpl("", "excluded", ""), + } +} + +func newParticipantTableImpl(schemaName, tableName, alias string) participantTable { + var ( + IDColumn = postgres.IntegerColumn("id") + NameColumn = postgres.StringColumn("name") + EmailColumn = postgres.StringColumn("email") + AddressColumn = postgres.StringColumn("address") + OrganizerColumn = postgres.BoolColumn("organizer") + ParticipatesColumn = postgres.BoolColumn("participates") + AcceptedColumn = postgres.BoolColumn("accepted") + EventIDColumn = postgres.IntegerColumn("event_id") + UserIDColumn = postgres.IntegerColumn("user_id") + CreatedAtColumn = postgres.TimestampzColumn("created_at") + UpdatedAtColumn = postgres.TimestampzColumn("updated_at") + allColumns = postgres.ColumnList{IDColumn, NameColumn, EmailColumn, AddressColumn, OrganizerColumn, ParticipatesColumn, AcceptedColumn, EventIDColumn, UserIDColumn, CreatedAtColumn, UpdatedAtColumn} + mutableColumns = postgres.ColumnList{NameColumn, EmailColumn, AddressColumn, OrganizerColumn, ParticipatesColumn, AcceptedColumn, EventIDColumn, UserIDColumn, CreatedAtColumn, UpdatedAtColumn} + ) + + return participantTable{ + Table: postgres.NewTable(schemaName, tableName, alias, allColumns...), + + //Columns + ID: IDColumn, + Name: NameColumn, + Email: EmailColumn, + Address: AddressColumn, + Organizer: OrganizerColumn, + Participates: ParticipatesColumn, + Accepted: AcceptedColumn, + EventID: EventIDColumn, + UserID: UserIDColumn, + CreatedAt: CreatedAtColumn, + UpdatedAt: UpdatedAtColumn, + + AllColumns: allColumns, + MutableColumns: mutableColumns, + } +} diff --git a/src/database/jet/postgres/public/table/product.go b/src/database/jet/postgres/public/table/product.go new file mode 100644 index 00000000..dfe463ff --- /dev/null +++ b/src/database/jet/postgres/public/table/product.go @@ -0,0 +1,117 @@ +// +// Code generated by go-jet DO NOT EDIT. +// +// WARNING: Changes to this file may cause incorrect behavior +// and will be lost if the code is regenerated +// + +package table + +import ( + "github.com/go-jet/jet/v2/postgres" +) + +var Product = newProductTable("public", "product", "") + +type productTable struct { + postgres.Table + + // Columns + ID postgres.ColumnInteger + Title postgres.ColumnString + Description postgres.ColumnString + ProductKey postgres.ColumnString + ImageURL postgres.ColumnString + TotalReviews postgres.ColumnInteger + Rating postgres.ColumnFloat + Price postgres.ColumnString + Currency postgres.ColumnString + URL postgres.ColumnString + CategoryID postgres.ColumnInteger + CreatedAt postgres.ColumnTimestampz + UpdatedAt postgres.ColumnTimestampz + ProductTs postgres.ColumnString + Origin postgres.ColumnString + + AllColumns postgres.ColumnList + MutableColumns postgres.ColumnList +} + +type ProductTable struct { + productTable + + EXCLUDED productTable +} + +// AS creates new ProductTable with assigned alias +func (a ProductTable) AS(alias string) *ProductTable { + return newProductTable(a.SchemaName(), a.TableName(), alias) +} + +// Schema creates new ProductTable with assigned schema name +func (a ProductTable) FromSchema(schemaName string) *ProductTable { + return newProductTable(schemaName, a.TableName(), a.Alias()) +} + +// WithPrefix creates new ProductTable with assigned table prefix +func (a ProductTable) WithPrefix(prefix string) *ProductTable { + return newProductTable(a.SchemaName(), prefix+a.TableName(), a.TableName()) +} + +// WithSuffix creates new ProductTable with assigned table suffix +func (a ProductTable) WithSuffix(suffix string) *ProductTable { + return newProductTable(a.SchemaName(), a.TableName()+suffix, a.TableName()) +} + +func newProductTable(schemaName, tableName, alias string) *ProductTable { + return &ProductTable{ + productTable: newProductTableImpl(schemaName, tableName, alias), + EXCLUDED: newProductTableImpl("", "excluded", ""), + } +} + +func newProductTableImpl(schemaName, tableName, alias string) productTable { + var ( + IDColumn = postgres.IntegerColumn("id") + TitleColumn = postgres.StringColumn("title") + DescriptionColumn = postgres.StringColumn("description") + ProductKeyColumn = postgres.StringColumn("product_key") + ImageURLColumn = postgres.StringColumn("image_url") + TotalReviewsColumn = postgres.IntegerColumn("total_reviews") + RatingColumn = postgres.FloatColumn("rating") + PriceColumn = postgres.StringColumn("price") + CurrencyColumn = postgres.StringColumn("currency") + URLColumn = postgres.StringColumn("url") + CategoryIDColumn = postgres.IntegerColumn("category_id") + CreatedAtColumn = postgres.TimestampzColumn("created_at") + UpdatedAtColumn = postgres.TimestampzColumn("updated_at") + ProductTsColumn = postgres.StringColumn("product_ts") + OriginColumn = postgres.StringColumn("origin") + allColumns = postgres.ColumnList{IDColumn, TitleColumn, DescriptionColumn, ProductKeyColumn, ImageURLColumn, TotalReviewsColumn, RatingColumn, PriceColumn, CurrencyColumn, URLColumn, CategoryIDColumn, CreatedAtColumn, UpdatedAtColumn, ProductTsColumn, OriginColumn} + mutableColumns = postgres.ColumnList{TitleColumn, DescriptionColumn, ProductKeyColumn, ImageURLColumn, TotalReviewsColumn, RatingColumn, PriceColumn, CurrencyColumn, URLColumn, CategoryIDColumn, CreatedAtColumn, UpdatedAtColumn, OriginColumn} + ) + + return productTable{ + Table: postgres.NewTable(schemaName, tableName, alias, allColumns...), + + //Columns + ID: IDColumn, + Title: TitleColumn, + Description: DescriptionColumn, + ProductKey: ProductKeyColumn, + ImageURL: ImageURLColumn, + TotalReviews: TotalReviewsColumn, + Rating: RatingColumn, + Price: PriceColumn, + Currency: CurrencyColumn, + URL: URLColumn, + CategoryID: CategoryIDColumn, + CreatedAt: CreatedAtColumn, + UpdatedAt: UpdatedAtColumn, + ProductTs: ProductTsColumn, + Origin: OriginColumn, + + AllColumns: allColumns, + MutableColumns: mutableColumns, + } +} diff --git a/src/database/jet/postgres/public/table/table_use_schema.go b/src/database/jet/postgres/public/table/table_use_schema.go new file mode 100644 index 00000000..974bf6b3 --- /dev/null +++ b/src/database/jet/postgres/public/table/table_use_schema.go @@ -0,0 +1,22 @@ +// +// Code generated by go-jet DO NOT EDIT. +// +// WARNING: Changes to this file may cause incorrect behavior +// and will be lost if the code is regenerated +// + +package table + +// UseSchema sets a new schema name for all generated table SQL builder types. It is recommended to invoke +// this method only once at the beginning of the program. +func UseSchema(schema string) { + Category = Category.FromSchema(schema) + Draw = Draw.FromSchema(schema) + Event = Event.FromSchema(schema) + Link = Link.FromSchema(schema) + Migration = Migration.FromSchema(schema) + Participant = Participant.FromSchema(schema) + Product = Product.FromSchema(schema) + User = User.FromSchema(schema) + Wish = Wish.FromSchema(schema) +} diff --git a/src/database/jet/postgres/public/table/user.go b/src/database/jet/postgres/public/table/user.go new file mode 100644 index 00000000..f01a3dbf --- /dev/null +++ b/src/database/jet/postgres/public/table/user.go @@ -0,0 +1,99 @@ +// +// Code generated by go-jet DO NOT EDIT. +// +// WARNING: Changes to this file may cause incorrect behavior +// and will be lost if the code is regenerated +// + +package table + +import ( + "github.com/go-jet/jet/v2/postgres" +) + +var User = newUserTable("public", "user", "") + +type userTable struct { + postgres.Table + + // Columns + ID postgres.ColumnInteger + Name postgres.ColumnString + Email postgres.ColumnString + ImageURL postgres.ColumnString + Phone postgres.ColumnString + Admin postgres.ColumnBool + Active postgres.ColumnBool + CreatedAt postgres.ColumnTimestampz + UpdatedAt postgres.ColumnTimestampz + + AllColumns postgres.ColumnList + MutableColumns postgres.ColumnList +} + +type UserTable struct { + userTable + + EXCLUDED userTable +} + +// AS creates new UserTable with assigned alias +func (a UserTable) AS(alias string) *UserTable { + return newUserTable(a.SchemaName(), a.TableName(), alias) +} + +// Schema creates new UserTable with assigned schema name +func (a UserTable) FromSchema(schemaName string) *UserTable { + return newUserTable(schemaName, a.TableName(), a.Alias()) +} + +// WithPrefix creates new UserTable with assigned table prefix +func (a UserTable) WithPrefix(prefix string) *UserTable { + return newUserTable(a.SchemaName(), prefix+a.TableName(), a.TableName()) +} + +// WithSuffix creates new UserTable with assigned table suffix +func (a UserTable) WithSuffix(suffix string) *UserTable { + return newUserTable(a.SchemaName(), a.TableName()+suffix, a.TableName()) +} + +func newUserTable(schemaName, tableName, alias string) *UserTable { + return &UserTable{ + userTable: newUserTableImpl(schemaName, tableName, alias), + EXCLUDED: newUserTableImpl("", "excluded", ""), + } +} + +func newUserTableImpl(schemaName, tableName, alias string) userTable { + var ( + IDColumn = postgres.IntegerColumn("id") + NameColumn = postgres.StringColumn("name") + EmailColumn = postgres.StringColumn("email") + ImageURLColumn = postgres.StringColumn("image_url") + PhoneColumn = postgres.StringColumn("phone") + AdminColumn = postgres.BoolColumn("admin") + ActiveColumn = postgres.BoolColumn("active") + CreatedAtColumn = postgres.TimestampzColumn("created_at") + UpdatedAtColumn = postgres.TimestampzColumn("updated_at") + allColumns = postgres.ColumnList{IDColumn, NameColumn, EmailColumn, ImageURLColumn, PhoneColumn, AdminColumn, ActiveColumn, CreatedAtColumn, UpdatedAtColumn} + mutableColumns = postgres.ColumnList{NameColumn, EmailColumn, ImageURLColumn, PhoneColumn, AdminColumn, ActiveColumn, CreatedAtColumn, UpdatedAtColumn} + ) + + return userTable{ + Table: postgres.NewTable(schemaName, tableName, alias, allColumns...), + + //Columns + ID: IDColumn, + Name: NameColumn, + Email: EmailColumn, + ImageURL: ImageURLColumn, + Phone: PhoneColumn, + Admin: AdminColumn, + Active: ActiveColumn, + CreatedAt: CreatedAtColumn, + UpdatedAt: UpdatedAtColumn, + + AllColumns: allColumns, + MutableColumns: mutableColumns, + } +} diff --git a/src/database/jet/postgres/public/table/wish.go b/src/database/jet/postgres/public/table/wish.go new file mode 100644 index 00000000..54efc024 --- /dev/null +++ b/src/database/jet/postgres/public/table/wish.go @@ -0,0 +1,96 @@ +// +// Code generated by go-jet DO NOT EDIT. +// +// WARNING: Changes to this file may cause incorrect behavior +// and will be lost if the code is regenerated +// + +package table + +import ( + "github.com/go-jet/jet/v2/postgres" +) + +var Wish = newWishTable("public", "wish", "") + +type wishTable struct { + postgres.Table + + // Columns + ID postgres.ColumnInteger + UserID postgres.ColumnInteger + ParticipantID postgres.ColumnInteger + ProductID postgres.ColumnInteger + EventID postgres.ColumnInteger + CreatedAt postgres.ColumnTimestampz + UpdatedAt postgres.ColumnTimestampz + Quantity postgres.ColumnInteger + + AllColumns postgres.ColumnList + MutableColumns postgres.ColumnList +} + +type WishTable struct { + wishTable + + EXCLUDED wishTable +} + +// AS creates new WishTable with assigned alias +func (a WishTable) AS(alias string) *WishTable { + return newWishTable(a.SchemaName(), a.TableName(), alias) +} + +// Schema creates new WishTable with assigned schema name +func (a WishTable) FromSchema(schemaName string) *WishTable { + return newWishTable(schemaName, a.TableName(), a.Alias()) +} + +// WithPrefix creates new WishTable with assigned table prefix +func (a WishTable) WithPrefix(prefix string) *WishTable { + return newWishTable(a.SchemaName(), prefix+a.TableName(), a.TableName()) +} + +// WithSuffix creates new WishTable with assigned table suffix +func (a WishTable) WithSuffix(suffix string) *WishTable { + return newWishTable(a.SchemaName(), a.TableName()+suffix, a.TableName()) +} + +func newWishTable(schemaName, tableName, alias string) *WishTable { + return &WishTable{ + wishTable: newWishTableImpl(schemaName, tableName, alias), + EXCLUDED: newWishTableImpl("", "excluded", ""), + } +} + +func newWishTableImpl(schemaName, tableName, alias string) wishTable { + var ( + IDColumn = postgres.IntegerColumn("id") + UserIDColumn = postgres.IntegerColumn("user_id") + ParticipantIDColumn = postgres.IntegerColumn("participant_id") + ProductIDColumn = postgres.IntegerColumn("product_id") + EventIDColumn = postgres.IntegerColumn("event_id") + CreatedAtColumn = postgres.TimestampzColumn("created_at") + UpdatedAtColumn = postgres.TimestampzColumn("updated_at") + QuantityColumn = postgres.IntegerColumn("quantity") + allColumns = postgres.ColumnList{IDColumn, UserIDColumn, ParticipantIDColumn, ProductIDColumn, EventIDColumn, CreatedAtColumn, UpdatedAtColumn, QuantityColumn} + mutableColumns = postgres.ColumnList{UserIDColumn, ParticipantIDColumn, ProductIDColumn, EventIDColumn, CreatedAtColumn, UpdatedAtColumn, QuantityColumn} + ) + + return wishTable{ + Table: postgres.NewTable(schemaName, tableName, alias, allColumns...), + + //Columns + ID: IDColumn, + UserID: UserIDColumn, + ParticipantID: ParticipantIDColumn, + ProductID: ProductIDColumn, + EventID: EventIDColumn, + CreatedAt: CreatedAtColumn, + UpdatedAt: UpdatedAtColumn, + Quantity: QuantityColumn, + + AllColumns: allColumns, + MutableColumns: mutableColumns, + } +} diff --git a/src/database/jet/postgres/public/view/event_link.go b/src/database/jet/postgres/public/view/event_link.go new file mode 100644 index 00000000..3fe89fc1 --- /dev/null +++ b/src/database/jet/postgres/public/view/event_link.go @@ -0,0 +1,108 @@ +// +// Code generated by go-jet DO NOT EDIT. +// +// WARNING: Changes to this file may cause incorrect behavior +// and will be lost if the code is regenerated +// + +package view + +import ( + "github.com/go-jet/jet/v2/postgres" +) + +var EventLink = newEventLinkTable("public", "event_link", "") + +type eventLinkTable struct { + postgres.Table + + // Columns + ID postgres.ColumnInteger + Name postgres.ColumnString + Description postgres.ColumnString + Budget postgres.ColumnString + InvitationMessage postgres.ColumnString + DrawAt postgres.ColumnTimestampz + CloseAt postgres.ColumnTimestampz + CreatedAt postgres.ColumnTimestampz + UpdatedAt postgres.ColumnTimestampz + LinkID postgres.ColumnInteger + LinkCode postgres.ColumnString + LinkExpirationDate postgres.ColumnTimestampz + + AllColumns postgres.ColumnList + MutableColumns postgres.ColumnList +} + +type EventLinkTable struct { + eventLinkTable + + EXCLUDED eventLinkTable +} + +// AS creates new EventLinkTable with assigned alias +func (a EventLinkTable) AS(alias string) *EventLinkTable { + return newEventLinkTable(a.SchemaName(), a.TableName(), alias) +} + +// Schema creates new EventLinkTable with assigned schema name +func (a EventLinkTable) FromSchema(schemaName string) *EventLinkTable { + return newEventLinkTable(schemaName, a.TableName(), a.Alias()) +} + +// WithPrefix creates new EventLinkTable with assigned table prefix +func (a EventLinkTable) WithPrefix(prefix string) *EventLinkTable { + return newEventLinkTable(a.SchemaName(), prefix+a.TableName(), a.TableName()) +} + +// WithSuffix creates new EventLinkTable with assigned table suffix +func (a EventLinkTable) WithSuffix(suffix string) *EventLinkTable { + return newEventLinkTable(a.SchemaName(), a.TableName()+suffix, a.TableName()) +} + +func newEventLinkTable(schemaName, tableName, alias string) *EventLinkTable { + return &EventLinkTable{ + eventLinkTable: newEventLinkTableImpl(schemaName, tableName, alias), + EXCLUDED: newEventLinkTableImpl("", "excluded", ""), + } +} + +func newEventLinkTableImpl(schemaName, tableName, alias string) eventLinkTable { + var ( + IDColumn = postgres.IntegerColumn("id") + NameColumn = postgres.StringColumn("name") + DescriptionColumn = postgres.StringColumn("description") + BudgetColumn = postgres.StringColumn("budget") + InvitationMessageColumn = postgres.StringColumn("invitation_message") + DrawAtColumn = postgres.TimestampzColumn("draw_at") + CloseAtColumn = postgres.TimestampzColumn("close_at") + CreatedAtColumn = postgres.TimestampzColumn("created_at") + UpdatedAtColumn = postgres.TimestampzColumn("updated_at") + LinkIDColumn = postgres.IntegerColumn("link_id") + LinkCodeColumn = postgres.StringColumn("link_code") + LinkExpirationDateColumn = postgres.TimestampzColumn("link_expiration_date") + allColumns = postgres.ColumnList{IDColumn, NameColumn, DescriptionColumn, BudgetColumn, InvitationMessageColumn, DrawAtColumn, CloseAtColumn, CreatedAtColumn, UpdatedAtColumn, LinkIDColumn, LinkCodeColumn, LinkExpirationDateColumn} + mutableColumns = postgres.ColumnList{IDColumn, NameColumn, DescriptionColumn, BudgetColumn, InvitationMessageColumn, DrawAtColumn, CloseAtColumn, CreatedAtColumn, UpdatedAtColumn, LinkIDColumn, LinkCodeColumn, LinkExpirationDateColumn} + ) + + return eventLinkTable{ + Table: postgres.NewTable(schemaName, tableName, alias, allColumns...), + + //Columns + ID: IDColumn, + Name: NameColumn, + Description: DescriptionColumn, + Budget: BudgetColumn, + InvitationMessage: InvitationMessageColumn, + DrawAt: DrawAtColumn, + CloseAt: CloseAtColumn, + CreatedAt: CreatedAtColumn, + UpdatedAt: UpdatedAtColumn, + LinkID: LinkIDColumn, + LinkCode: LinkCodeColumn, + LinkExpirationDate: LinkExpirationDateColumn, + + AllColumns: allColumns, + MutableColumns: mutableColumns, + } +} diff --git a/src/database/jet/postgres/public/view/participant_user.go b/src/database/jet/postgres/public/view/participant_user.go new file mode 100644 index 00000000..745a8cce --- /dev/null +++ b/src/database/jet/postgres/public/view/participant_user.go @@ -0,0 +1,114 @@ +// +// Code generated by go-jet DO NOT EDIT. +// +// WARNING: Changes to this file may cause incorrect behavior +// and will be lost if the code is regenerated +// + +package view + +import ( + "github.com/go-jet/jet/v2/postgres" +) + +var ParticipantUser = newParticipantUserTable("public", "participant_user", "") + +type participantUserTable struct { + postgres.Table + + // Columns + ID postgres.ColumnInteger + Name postgres.ColumnString + Email postgres.ColumnString + Address postgres.ColumnString + Organizer postgres.ColumnBool + Participates postgres.ColumnBool + Accepted postgres.ColumnBool + EventID postgres.ColumnInteger + UserID postgres.ColumnInteger + CreatedAt postgres.ColumnTimestampz + UpdatedAt postgres.ColumnTimestampz + UserName postgres.ColumnString + UserEmail postgres.ColumnString + UserImageURL postgres.ColumnString + + AllColumns postgres.ColumnList + MutableColumns postgres.ColumnList +} + +type ParticipantUserTable struct { + participantUserTable + + EXCLUDED participantUserTable +} + +// AS creates new ParticipantUserTable with assigned alias +func (a ParticipantUserTable) AS(alias string) *ParticipantUserTable { + return newParticipantUserTable(a.SchemaName(), a.TableName(), alias) +} + +// Schema creates new ParticipantUserTable with assigned schema name +func (a ParticipantUserTable) FromSchema(schemaName string) *ParticipantUserTable { + return newParticipantUserTable(schemaName, a.TableName(), a.Alias()) +} + +// WithPrefix creates new ParticipantUserTable with assigned table prefix +func (a ParticipantUserTable) WithPrefix(prefix string) *ParticipantUserTable { + return newParticipantUserTable(a.SchemaName(), prefix+a.TableName(), a.TableName()) +} + +// WithSuffix creates new ParticipantUserTable with assigned table suffix +func (a ParticipantUserTable) WithSuffix(suffix string) *ParticipantUserTable { + return newParticipantUserTable(a.SchemaName(), a.TableName()+suffix, a.TableName()) +} + +func newParticipantUserTable(schemaName, tableName, alias string) *ParticipantUserTable { + return &ParticipantUserTable{ + participantUserTable: newParticipantUserTableImpl(schemaName, tableName, alias), + EXCLUDED: newParticipantUserTableImpl("", "excluded", ""), + } +} + +func newParticipantUserTableImpl(schemaName, tableName, alias string) participantUserTable { + var ( + IDColumn = postgres.IntegerColumn("id") + NameColumn = postgres.StringColumn("name") + EmailColumn = postgres.StringColumn("email") + AddressColumn = postgres.StringColumn("address") + OrganizerColumn = postgres.BoolColumn("organizer") + ParticipatesColumn = postgres.BoolColumn("participates") + AcceptedColumn = postgres.BoolColumn("accepted") + EventIDColumn = postgres.IntegerColumn("event_id") + UserIDColumn = postgres.IntegerColumn("user_id") + CreatedAtColumn = postgres.TimestampzColumn("created_at") + UpdatedAtColumn = postgres.TimestampzColumn("updated_at") + UserNameColumn = postgres.StringColumn("user_name") + UserEmailColumn = postgres.StringColumn("user_email") + UserImageURLColumn = postgres.StringColumn("user_image_url") + allColumns = postgres.ColumnList{IDColumn, NameColumn, EmailColumn, AddressColumn, OrganizerColumn, ParticipatesColumn, AcceptedColumn, EventIDColumn, UserIDColumn, CreatedAtColumn, UpdatedAtColumn, UserNameColumn, UserEmailColumn, UserImageURLColumn} + mutableColumns = postgres.ColumnList{IDColumn, NameColumn, EmailColumn, AddressColumn, OrganizerColumn, ParticipatesColumn, AcceptedColumn, EventIDColumn, UserIDColumn, CreatedAtColumn, UpdatedAtColumn, UserNameColumn, UserEmailColumn, UserImageURLColumn} + ) + + return participantUserTable{ + Table: postgres.NewTable(schemaName, tableName, alias, allColumns...), + + //Columns + ID: IDColumn, + Name: NameColumn, + Email: EmailColumn, + Address: AddressColumn, + Organizer: OrganizerColumn, + Participates: ParticipatesColumn, + Accepted: AcceptedColumn, + EventID: EventIDColumn, + UserID: UserIDColumn, + CreatedAt: CreatedAtColumn, + UpdatedAt: UpdatedAtColumn, + UserName: UserNameColumn, + UserEmail: UserEmailColumn, + UserImageURL: UserImageURLColumn, + + AllColumns: allColumns, + MutableColumns: mutableColumns, + } +} diff --git a/src/database/jet/postgres/public/view/view_use_schema.go b/src/database/jet/postgres/public/view/view_use_schema.go new file mode 100644 index 00000000..26ec156b --- /dev/null +++ b/src/database/jet/postgres/public/view/view_use_schema.go @@ -0,0 +1,15 @@ +// +// Code generated by go-jet DO NOT EDIT. +// +// WARNING: Changes to this file may cause incorrect behavior +// and will be lost if the code is regenerated +// + +package view + +// UseSchema sets a new schema name for all generated view SQL builder types. It is recommended to invoke +// this method only once at the beginning of the program. +func UseSchema(schema string) { + EventLink = EventLink.FromSchema(schema) + ParticipantUser = ParticipantUser.FromSchema(schema) +} diff --git a/src/database/link.sql.go b/src/database/link.sql.go new file mode 100644 index 00000000..b0cdd489 --- /dev/null +++ b/src/database/link.sql.go @@ -0,0 +1,96 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.25.0 +// source: link.sql + +package database + +import ( + "context" + "time" +) + +const createLink = `-- name: CreateLink :one +INSERT INTO "link" ( + code, + expiration_date, + event_id +) VALUES ( + $1, $2, $3 +) RETURNING id, code, expiration_date, event_id, created_at, updated_at +` + +type CreateLinkParams struct { + Code string `db:"code" json:"code"` + ExpirationDate time.Time `db:"expiration_date" json:"expirationDate"` + EventID int64 `db:"event_id" json:"eventId"` +} + +func (q *Queries) CreateLink(ctx context.Context, arg CreateLinkParams) (Link, error) { + row := q.queryRow(ctx, q.createLinkStmt, createLink, arg.Code, arg.ExpirationDate, arg.EventID) + var i Link + err := row.Scan( + &i.ID, + &i.Code, + &i.ExpirationDate, + &i.EventID, + &i.CreatedAt, + &i.UpdatedAt, + ) + return i, err +} + +const findLinkByCode = `-- name: FindLinkByCode :one +SELECT id, code, expiration_date, event_id, created_at, updated_at FROM "link" WHERE code = $1 +` + +func (q *Queries) FindLinkByCode(ctx context.Context, code string) (Link, error) { + row := q.queryRow(ctx, q.findLinkByCodeStmt, findLinkByCode, code) + var i Link + err := row.Scan( + &i.ID, + &i.Code, + &i.ExpirationDate, + &i.EventID, + &i.CreatedAt, + &i.UpdatedAt, + ) + return i, err +} + +const findLinkWithEventByCode = `-- name: FindLinkWithEventByCode :one +SELECT + link.id, link.code, link.expiration_date, link.event_id, link.created_at, link.updated_at, + event.id, event.name, event.description, event.budget, event.invitation_message, event.draw_at, event.close_at, event.created_at, event.updated_at +FROM "link" +JOIN "event" ON "event"."id" = "link"."event_id" +WHERE code = $1 +` + +type FindLinkWithEventByCodeRow struct { + Link Link `db:"link" json:"link"` + Event Event `db:"event" json:"event"` +} + +func (q *Queries) FindLinkWithEventByCode(ctx context.Context, code string) (FindLinkWithEventByCodeRow, error) { + row := q.queryRow(ctx, q.findLinkWithEventByCodeStmt, findLinkWithEventByCode, code) + var i FindLinkWithEventByCodeRow + err := row.Scan( + &i.Link.ID, + &i.Link.Code, + &i.Link.ExpirationDate, + &i.Link.EventID, + &i.Link.CreatedAt, + &i.Link.UpdatedAt, + &i.Event.ID, + &i.Event.Name, + &i.Event.Description, + &i.Event.Budget, + &i.Event.InvitationMessage, + &i.Event.DrawAt, + &i.Event.CloseAt, + &i.Event.CreatedAt, + &i.Event.UpdatedAt, + ) + return i, err +} diff --git a/src/database/migrations/1677972510226184_InitialMigration.sql b/src/database/migrations/1677972510226184_InitialMigration.sql new file mode 100644 index 00000000..4e356233 --- /dev/null +++ b/src/database/migrations/1677972510226184_InitialMigration.sql @@ -0,0 +1,128 @@ +-- +-- Table structure for table category +-- +CREATE TABLE "category" ( + "id" BIGSERIAL UNIQUE PRIMARY KEY, + "name" VARCHAR(255) NOT NULL, + "description" TEXT, + "category_url" TEXT, + + "created_at" TIMESTAMPTZ NOT NULL DEFAULT now(), + "updated_at" TIMESTAMPTZ NOT NULL DEFAULT now() +); + +-- +-- Table structure for table product +-- +CREATE TYPE "currency_type" AS ENUM ( + 'USD', + 'CAD' +); + +CREATE TABLE "product" ( + "id" BIGSERIAL UNIQUE PRIMARY KEY, + "title" TEXT NOT NULL, + "description" TEXT, + "product_key" VARCHAR(255) UNIQUE NOT NULL, + "image_url" TEXT NOT NULL, + "total_reviews" INT NOT NULL, + "rating" REAL NOT NULL, + "price" MONEY NOT NULL, + "currency" "currency_type" NOT NULL DEFAULT 'USD', + "modified" TIMESTAMPTZ NOT NULL, + "website" TEXT NOT NULL, + "category_id" BIGINT REFERENCES "category"("id") ON DELETE SET NULL, + + "created_at" TIMESTAMPTZ NOT NULL DEFAULT now(), + "updated_at" TIMESTAMPTZ NOT NULL DEFAULT now() +); + +-- +-- Table structure for table user +-- +CREATE TABLE "user" ( + "id" BIGSERIAL UNIQUE PRIMARY KEY, + "name" VARCHAR(255) NOT NULL, + "email" VARCHAR(255) UNIQUE NOT NULL, + "image_url" VARCHAR(255) NOT NULL, + "phone" VARCHAR(255), + "admin" BOOLEAN NOT NULL DEFAULT false, + "active" BOOLEAN NOT NULL DEFAULT false, + + "created_at" TIMESTAMPTZ NOT NULL DEFAULT now(), + "updated_at" TIMESTAMPTZ NOT NULL DEFAULT now() +); + +-- +-- Table structure for table event +-- +CREATE TABLE "event" ( + "id" BIGSERIAL UNIQUE PRIMARY KEY, + "name" VARCHAR(255) NOT NULL, + "description" TEXT, + "budget" MONEY NOT NULL, + "invitation_message" TEXT NOT NULL, + "draw_at" TIMESTAMPTZ NOT NULL, + "close_at" TIMESTAMPTZ NOT NULL, + + "created_at" TIMESTAMPTZ NOT NULL DEFAULT now(), + "updated_at" TIMESTAMPTZ NOT NULL DEFAULT now() +); + +-- +-- Table structure for table link +-- +CREATE TABLE "link" ( + "id" BIGSERIAL UNIQUE PRIMARY KEY, + "code" VARCHAR(255) NOT NULL, + "expiration_date" TIMESTAMPTZ NOT NULL, + "event_id" BIGINT REFERENCES "event"("id") ON DELETE CASCADE NOT NULL, + + "created_at" TIMESTAMPTZ NOT NULL DEFAULT now(), + "updated_at" TIMESTAMPTZ NOT NULL DEFAULT now() +); + +-- +-- Table structure for table participant +-- +CREATE TABLE "participant" ( + "id" BIGSERIAL UNIQUE PRIMARY KEY, + "name" VARCHAR(255) NOT NULL, + "email" VARCHAR(255) NOT NULL, + "address" VARCHAR(255) NOT NULL, + "organizer" BOOLEAN NOT NULL DEFAULT false, + "participates" BOOLEAN NOT NULL DEFAULT true, + "accepted" BOOLEAN NOT NULL DEFAULT false, + "event_id" BIGINT REFERENCES "event"("id") ON DELETE CASCADE NOT NULL, + "user_id" BIGINT REFERENCES "user"("id") ON DELETE SET NULL, + + "created_at" TIMESTAMPTZ NOT NULL DEFAULT now(), + "updated_at" TIMESTAMPTZ NOT NULL DEFAULT now() +); + +-- +-- Table structure for table draw +-- +CREATE TABLE "draw" ( + "id" BIGSERIAL UNIQUE PRIMARY KEY, + "drawer_id" BIGINT REFERENCES "participant"("id") ON DELETE CASCADE NOT NULL, + "drawee_id" BIGINT REFERENCES "participant"("id") ON DELETE CASCADE NOT NULL, + "event_id" BIGINT REFERENCES "event"("id") NOT NULL, + + "created_at" TIMESTAMPTZ NOT NULL DEFAULT now(), + "updated_at" TIMESTAMPTZ NOT NULL DEFAULT now() +); + +-- +-- Table structure for table wish +-- +CREATE TABLE "wish" ( + "id" BIGSERIAL UNIQUE PRIMARY KEY, + "user_id" BIGINT REFERENCES "user"("id") ON DELETE CASCADE NOT NULL, + "participant_id" BIGINT REFERENCES "participant"("id") ON DELETE CASCADE NOT NULL, + "product_id" BIGINT REFERENCES "product"("id") ON DELETE SET NULL, + "event_id" BIGINT REFERENCES "event"("id") ON DELETE CASCADE NOT NULL, + + "created_at" TIMESTAMPTZ NOT NULL DEFAULT now(), + "updated_at" TIMESTAMPTZ NOT NULL DEFAULT now() +); diff --git a/src/database/migrations/1702348288671587_AddFullText.sql b/src/database/migrations/1702348288671587_AddFullText.sql new file mode 100644 index 00000000..38f022a8 --- /dev/null +++ b/src/database/migrations/1702348288671587_AddFullText.sql @@ -0,0 +1,6 @@ +ALTER TABLE "product" +ADD COLUMN "product_ts" tsvector + GENERATED ALWAYS AS ( + setweight(to_tsvector('english', coalesce("title", '')), 'A') || + setweight(to_tsvector('english', coalesce("description", '')), 'B') + ) STORED; diff --git a/src/database/migrations/1702417351662711_AddProductOriginColumn.sql b/src/database/migrations/1702417351662711_AddProductOriginColumn.sql new file mode 100644 index 00000000..b1195199 --- /dev/null +++ b/src/database/migrations/1702417351662711_AddProductOriginColumn.sql @@ -0,0 +1,5 @@ +ALTER TABLE "product" + RENAME COLUMN "website" TO "url"; + +ALTER TABLE "product" + ADD COLUMN "origin" VARCHAR(50) NOT NULL; \ No newline at end of file diff --git a/src/database/migrations/1703017175290949_SeedProductData.sql b/src/database/migrations/1703017175290949_SeedProductData.sql new file mode 100644 index 00000000..7f04dcf9 --- /dev/null +++ b/src/database/migrations/1703017175290949_SeedProductData.sql @@ -0,0 +1,1675 @@ +INSERT INTO public.category (id,"name",description,category_url,created_at,updated_at) VALUES + (43,'kitchen',NULL,NULL,'2023-12-19 15:12:00.513551-06','2023-12-19 15:12:00.513551-06'), + (44,'health',NULL,NULL,'2023-12-19 15:12:17.566556-06','2023-12-19 15:12:17.566556-06'), + (45,'dental',NULL,NULL,'2023-12-19 15:12:33.040871-06','2023-12-19 15:12:33.040871-06'), + (46,'men''s clothing',NULL,NULL,'2023-12-19 15:12:50.714064-06','2023-12-19 15:12:50.714064-06'), + (47,'women''s clothing',NULL,NULL,'2023-12-19 15:13:05.856557-06','2023-12-19 15:13:05.856557-06'), + (48,'iphone cases',NULL,NULL,'2023-12-19 15:13:21.550653-06','2023-12-19 15:13:21.550653-06'), + (49,'samsung cases',NULL,NULL,'2023-12-19 15:13:38.209896-06','2023-12-19 15:13:38.209896-06'), + (50,'oneplus cases',NULL,NULL,'2023-12-19 15:13:56.513981-06','2023-12-19 15:13:56.513981-06'), + (51,'pixel cases',NULL,NULL,'2023-12-19 15:14:11.661281-06','2023-12-19 15:14:11.661281-06'), + (52,'computer accessories',NULL,NULL,'2023-12-19 15:14:28.231941-06','2023-12-19 15:14:28.231941-06'); +INSERT INTO public.category (id,"name",description,category_url,created_at,updated_at) VALUES + (53,'men''s shoes',NULL,NULL,'2023-12-19 15:14:44.6195-06','2023-12-19 15:14:44.6195-06'), + (54,'women''s shoes',NULL,NULL,'2023-12-19 15:15:01.944376-06','2023-12-19 15:15:01.944376-06'), + (55,'outdoor',NULL,NULL,'2023-12-19 15:15:18.463727-06','2023-12-19 15:15:18.463727-06'), + (56,'manga',NULL,NULL,'2023-12-19 15:17:45.942091-06','2023-12-19 15:17:45.942091-06'), + (57,'travel accessories',NULL,NULL,'2023-12-19 15:18:00.372836-06','2023-12-19 15:18:00.372836-06'), + (58,'decoration',NULL,NULL,'2023-12-19 15:18:16.034732-06','2023-12-19 15:18:16.034732-06'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3168,'VAL CUCINA Retro Style Infrared Heating Air Fryer Toaster Oven, Extra Large Countertop Convection Oven 10-in-1 Combo, 6-Slice Toast, Enamel Baking Pan Easy Clean with Recipe Book, Green Color',NULL,'B0BTN5QMBJ','https://m.media-amazon.com/images/I/61cWwI1bSrL._AC_UL320_.jpg',236,4.6,'$249.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4NTQwNTc4MTAxNDQzNzE3OjE3MDMwMjAzMTk6c3BfYXRmOjIwMDE3NjAxMTc3MTA5ODo6MDo6&url=%2FVAL-CUCINA-Ultra-Quick-Multifunctional-Accessories%2Fdp%2FB0BTN5QMBJ%2Fref%3Dsr_1_1_sspa%3Fkeywords%3Dkitchen%26qid%3D1703020319%26sr%3D8-1-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGY%26psc%3D1',43,'2023-12-19 15:12:00.528294-06','2023-12-19 15:12:00.528294-06','www.amazon.com'), + (3169,'JoyJolt JoyFul 24pc(12 Airtight, Freezer Safe Food Storage Containers and 12 Lids), Pantry Kitchen Storage Containers, Glass Meal Prep Container for Lunch, Glass Storage Containers with Lids',NULL,'B09N4ZKCH6','https://m.media-amazon.com/images/I/917BTSQCT6L._AC_UL320_.jpg',8541,4.6,'$38.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/JoyJolt-Borosilicate-Containers-Airtight-Container/dp/B09N4ZKCH6/ref=sr_1_2?keywords=kitchen&qid=1703020319&sr=8-2',43,'2023-12-19 15:12:00.54123-06','2023-12-19 15:12:00.54123-06','www.amazon.com'), + (3170,'NutriChef Non-Stick Kitchen Oven Baking Pans-Deluxe & Stylish Nonstick Gray Coating Inside Outside, Commercial Grade Restaurant Quality Metal Bakeware with Red Silicone Handles NCSBS3S, 3 Piece Set',NULL,'B089N57JGS','https://m.media-amazon.com/images/I/71+8ct7NbAL._AC_UL320_.jpg',15574,4.5,'$19.44','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Nutrichef-Pans-Deluxe-Nonstick-Bakeware-Silicone/dp/B089N57JGS/ref=sr_1_4?keywords=kitchen&qid=1703020319&sr=8-4',43,'2023-12-19 15:12:00.547664-06','2023-12-19 15:12:00.547664-06','www.amazon.com'), + (4553,'DDgro Travel Accessories Organizer Electronics Pouch for Keeping Certificates Charger/Power Bank/Cables/Mouse/Earphone (Medium, Black)',NULL,'B09J4CT232','https://m.media-amazon.com/images/I/81cPf-LxaJL._AC_UL320_.jpg',4595,4.5,'$11.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxNTk3Mjk0NjM0MzQ4NzE3OjE3MDMwMjA2ODY6c3BfYXRmX25leHQ6MjAwMDgxMDM4MTI1NTk4OjowOjo&url=%2FDDgro-Accessories-Electronics-Certificates-Stationeries%2Fdp%2FB09J4CT232%2Fref%3Dsr_1_49_sspa%3Fkeywords%3Dtravel%2Baccessories%26qid%3D1703020686%26sr%3D8-49-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGZfbmV4dA%26psc%3D1',57,'2023-12-19 15:18:07.856631-06','2023-12-19 15:18:07.856631-06','www.amazon.com'), + (3172,'SodaStream Art Sparkling Water Maker Bundle (Misty Blue), with CO2, DWS Bottles, and Bubly Drops Flavors',NULL,'B09SN3DYY6','https://m.media-amazon.com/images/I/61DxklhkvfL._AC_UL320_.jpg',2009,4.6,'$145.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo0NzExMDUwMDQzMTYwNzE3OjE3MDMwMjAzMTk6c3Bfc2VhcmNoX3RoZW1hdGljOjMwMDA2NTMyODk4NDQwMjo6MDo6&url=%2FSodaStream-Sparkling-Bundle-Bottles-Flavors%2Fdp%2FB09SN3DYY6%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.882a4bd1-3fd3-4961-90f6-8abc45a77ab4%253Aamzn1.sym.882a4bd1-3fd3-4961-90f6-8abc45a77ab4%26cv_ct_cx%3Dkitchen%26keywords%3Dkitchen%26pd_rd_i%3DB09SN3DYY6%26pd_rd_r%3D0608adb7-b7e3-4d7a-bd56-8a24ad8d3cfe%26pd_rd_w%3DpToBV%26pd_rd_wg%3DvZvxb%26pf_rd_p%3D882a4bd1-3fd3-4961-90f6-8abc45a77ab4%26pf_rd_r%3DHHR7054K8QZ4XP50CHQ1%26qid%3D1703020319%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-1-957b5332-dff9-4ebb-812a-1c4282368112-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',43,'2023-12-19 15:12:00.561406-06','2023-12-19 15:12:00.561406-06','www.amazon.com'), + (3173,'Wanbasion Black Stainless Steel Knife Set, Sharp Kitchen Knife Set Professional, Kitchen Knife Set Dishwasher Safe with Covers for Cooking',NULL,'B07GH3KQS5','https://m.media-amazon.com/images/I/61T+gxwFNfL._AC_UL320_.jpg',15301,4.3,'$22.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo0NzExMDUwMDQzMTYwNzE3OjE3MDMwMjAzMTk6c3Bfc2VhcmNoX3RoZW1hdGljOjMwMDA1MDA4OTMwOTEwMjo6MTo6&url=%2FWanbasion-TK-80812-Stainless-Professional-Dishwasher%2Fdp%2FB07GH3KQS5%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.882a4bd1-3fd3-4961-90f6-8abc45a77ab4%253Aamzn1.sym.882a4bd1-3fd3-4961-90f6-8abc45a77ab4%26cv_ct_cx%3Dkitchen%26keywords%3Dkitchen%26pd_rd_i%3DB07GH3KQS5%26pd_rd_r%3D0608adb7-b7e3-4d7a-bd56-8a24ad8d3cfe%26pd_rd_w%3DpToBV%26pd_rd_wg%3DvZvxb%26pf_rd_p%3D882a4bd1-3fd3-4961-90f6-8abc45a77ab4%26pf_rd_r%3DHHR7054K8QZ4XP50CHQ1%26qid%3D1703020319%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-2-957b5332-dff9-4ebb-812a-1c4282368112-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',43,'2023-12-19 15:12:00.570062-06','2023-12-19 15:12:00.570062-06','www.amazon.com'), + (3174,'Knife Set, 15 Pieces Kitchen Knife Block Set with Built in Knife Sharpener Block, Dishwasher Safe, German Stainless Steel, Best Gift, Silver',NULL,'B0CL4FRXL3','https://m.media-amazon.com/images/I/71gkdQWY05L._AC_UL320_.jpg',48,4.7,'$196.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo0NzExMDUwMDQzMTYwNzE3OjE3MDMwMjAzMTk6c3Bfc2VhcmNoX3RoZW1hdGljOjMwMDA5OTA2OTk1NDYwMjo6Mzo6&url=%2FPieces-Kitchen-Sharpener-Dishwasher-Stainless%2Fdp%2FB0CL4FRXL3%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.882a4bd1-3fd3-4961-90f6-8abc45a77ab4%253Aamzn1.sym.882a4bd1-3fd3-4961-90f6-8abc45a77ab4%26cv_ct_cx%3Dkitchen%26keywords%3Dkitchen%26pd_rd_i%3DB0CL4FRXL3%26pd_rd_r%3D0608adb7-b7e3-4d7a-bd56-8a24ad8d3cfe%26pd_rd_w%3DpToBV%26pd_rd_wg%3DvZvxb%26pf_rd_p%3D882a4bd1-3fd3-4961-90f6-8abc45a77ab4%26pf_rd_r%3DHHR7054K8QZ4XP50CHQ1%26qid%3D1703020319%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-4-957b5332-dff9-4ebb-812a-1c4282368112-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',43,'2023-12-19 15:12:00.576444-06','2023-12-19 15:12:00.576444-06','www.amazon.com'), + (3171,'imarku 16-Piece Knife Set with Block, Kitchen Knife Set, Professional German Stainless Steel Knife Set with 6 Steak Knives and Knife Sharpener, Unique Hammered Design, Christmas Gifts for Women Men',NULL,'B09LCLH556','https://m.media-amazon.com/images/I/71dMxM4h4TL._AC_UL320_.jpg',1713,4.7,'$149.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo0NzExMDUwMDQzMTYwNzE3OjE3MDMwMjAzMTk6c3Bfc2VhcmNoX3RoZW1hdGljOjMwMDEwMzE5NjE0MTEwMjo6NDo6&url=%2Fimarku-16-Piece-Professional-Stainless-Sharpener%2Fdp%2FB09LCLH556%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.882a4bd1-3fd3-4961-90f6-8abc45a77ab4%253Aamzn1.sym.882a4bd1-3fd3-4961-90f6-8abc45a77ab4%26cv_ct_cx%3Dkitchen%26keywords%3Dkitchen%26pd_rd_i%3DB09LCLH556%26pd_rd_r%3D0608adb7-b7e3-4d7a-bd56-8a24ad8d3cfe%26pd_rd_w%3DpToBV%26pd_rd_wg%3DvZvxb%26pf_rd_p%3D882a4bd1-3fd3-4961-90f6-8abc45a77ab4%26pf_rd_r%3DHHR7054K8QZ4XP50CHQ1%26qid%3D1703020319%26sbo%3DTc8eqSFhUl4VwMzbE4fw%252Fw%253D%253D%26sr%3D1-5-957b5332-dff9-4ebb-812a-1c4282368112-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',43,'2023-12-19 15:12:00.554156-06','2023-12-19 15:12:00.582932-06','www.amazon.com'), + (3175,'Fullstar Vegetable Chopper - Spiralizer Vegetable Slicer - Onion Chopper with Container - Pro Food Chopper - Slicer Dicer Cutter - (4 in 1, White)',NULL,'B0764HS4SL','https://m.media-amazon.com/images/I/81m5GFr6aeL._AC_UL320_.jpg',112698,4.5,'$32.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Vegetable-Chopper-Spiralizer-Slicer-Choppers/dp/B0764HS4SL/ref=sr_1_5?keywords=kitchen&qid=1703020319&sr=8-5',43,'2023-12-19 15:12:00.589022-06','2023-12-19 15:12:00.589022-06','www.amazon.com'), + (3176,'MuellerLiving Hand Blender, Immersion Blender, Hand Mixer with Attachments: Stainless Steel Blade, Whisk, Milk Frother',NULL,'B075X1KPLZ','https://m.media-amazon.com/images/I/61FOvMLDbbL._AC_UL320_.jpg',48820,4.4,'$34.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/MuellerLiving-Blender-Immersion-Mixer-Attachments/dp/B075X1KPLZ/ref=sr_1_6?keywords=kitchen&qid=1703020319&sr=8-6',43,'2023-12-19 15:12:00.596828-06','2023-12-19 15:12:00.596828-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3177,'Ninja BC151EM Blast Portable Blender, Cordless, 18oz. Vessel, Personal Blender-for Shakes & Smoothies, BPA Free, Leakproof-Lid & Sip Spout, USB-C Rechargeable, Dishwasher Safe Parts, Forest Green',NULL,'B0C2FP4XNJ','https://m.media-amazon.com/images/I/71M8L+rzNML._AC_UL320_.jpg',923,4.3,'$59.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Ninja-BC151EM-Smoothies-Rechargeable-Dishwasher/dp/B0C2FP4XNJ/ref=sr_1_7?keywords=kitchen&qid=1703020319&sr=8-7',43,'2023-12-19 15:12:00.607454-06','2023-12-19 15:12:00.607454-06','www.amazon.com'), + (3178,'Ninja MC1101 Foodi Everyday Possible Cooker Pro, 8-in-1 Versatility, 6.5 QT, One-Pot Cooking, Replaces 10 Cooking Tools, Faster Cooking, Family-Sized Capacity, Adjustable Temp Control, Midnight Blue',NULL,'B0CDHP76FP','https://m.media-amazon.com/images/I/71GhytEjuYL._AC_UL320_.jpg',32,4.8,'$119.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Ninja-MC1101-Versatility-Family-Sized-Adjustable/dp/B0CDHP76FP/ref=sr_1_8?keywords=kitchen&qid=1703020319&sr=8-8',43,'2023-12-19 15:12:00.616445-06','2023-12-19 15:12:00.616445-06','www.amazon.com'), + (3179,'Silicone Faucet Handle Drip Catcher Tray Mat, Silicone Faucet Mat Dish Soap Sponge Holder for Kitchen Sink Accessories Gadgets, Drying Mat for Kitchen Counter Bathroom Kitchen Sink Splash Guard -Grey',NULL,'B09XJ1Z8CV','https://m.media-amazon.com/images/I/71Id74T3vNL._AC_UL320_.jpg',2789,4.0,'$9.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Silicone-Catcher-Kitchen-Accessories-Bathroom/dp/B09XJ1Z8CV/ref=sr_1_9?keywords=kitchen&qid=1703020319&sr=8-9',43,'2023-12-19 15:12:00.625833-06','2023-12-19 15:12:00.625833-06','www.amazon.com'), + (3180,'Zulay Kitchen 9-Piece Teak Wooden Utensils for Cooking - Smooth Finish Natural Teak Utensil Set - Non-Stick Wooden Spoons for Cooking - Kitchen Gift Set - Comfortable Grip Wooden Utensil Set',NULL,'B0C6YM8GDJ','https://m.media-amazon.com/images/I/81zxX05QaiL._AC_UL320_.jpg',3252,4.7,'$33.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Zulay-Kitchen-9-Piece-Utensils-Cooking/dp/B0C6YM8GDJ/ref=sr_1_10?keywords=kitchen&qid=1703020319&sr=8-10',43,'2023-12-19 15:12:00.634899-06','2023-12-19 15:12:00.634899-06','www.amazon.com'), + (3181,'Airthereal Revive Electric Kitchen Composter, 2.5L Capacity with SHARKSDEN Tri-Blade, Turn Food Waste and Scraps into Dry Compost Fertilizer for Plants',NULL,'B0BQYMQYTY','https://m.media-amazon.com/images/I/61TW-KiJk3L._AC_UL320_.jpg',254,4.3,'$349.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4NTQwNTc4MTAxNDQzNzE3OjE3MDMwMjAzMTk6c3BfbXRmOjIwMDEyNTM2NjEyMDA5ODo6MDo6&url=%2FAirthereal-Revive-Composter-SHARKSDEN%25C2%25AE-Fertilizer%2Fdp%2FB0BQYMQYTY%2Fref%3Dsr_1_11_sspa%3Fkeywords%3Dkitchen%26qid%3D1703020319%26sr%3D8-11-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',43,'2023-12-19 15:12:00.641893-06','2023-12-19 15:12:00.641893-06','www.amazon.com'), + (3227,'Roll Up Dish Drying Rack, Roll Over The Sink Dish Drying Rack Kitchen Rolling Dish Drainer, Foldable Sink Rack Mat Stainless Steel Wire Dish Drying Rack for Kitchen Sink Counter (17.5''''x11.8'''')',NULL,'B08S6M3NXV','https://m.media-amazon.com/images/I/71PuaIFVAIL._AC_UL320_.jpg',35253,4.6,'$6.82','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Seropy-Kitchen-Foldable-Stainless-17-8x11-8/dp/B08S6M3NXV/ref=sr_1_59?keywords=kitchen&qid=1703020319&sr=8-59',43,'2023-12-19 15:12:01.031102-06','2023-12-19 15:12:01.031102-06','www.amazon.com'), + (3182,'WILDMOK Chef Knife,8 inch Damascus Japanese kitchen knives,VG10 Steel&Resin Handle Chef Knife,Hammered Finish chef''s knives,Japanese damascus knife Including Gift Box',NULL,'B09L86M7SD','https://m.media-amazon.com/images/I/81PJmHmVCjL._AC_UL320_.jpg',43,4.5,'$84.14','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4NTQwNTc4MTAxNDQzNzE3OjE3MDMwMjAzMTk6c3BfbXRmOjIwMDE2MzQwNjc3ODY5ODo6MDo6&url=%2FWILDMOK-Damascus-Orange-Hammered-Yellow-green%2Fdp%2FB09L86M7SD%2Fref%3Dsr_1_13_sspa%3Fkeywords%3Dkitchen%26qid%3D1703020319%26sr%3D8-13-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',43,'2023-12-19 15:12:00.649496-06','2023-12-19 15:12:00.649496-06','www.amazon.com'), + (3183,'VaeFae Bamboo Silverware Drawer Organizer Kitchen, Expandable Utensil Holder and Cutlery Tray with Divider, Flatware Storage and Removable Knife Block',NULL,'B083HTHL5T','https://m.media-amazon.com/images/I/81FWOOqBJUL._AC_UL320_.jpg',7757,4.7,'$30.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4NTQwNTc4MTAxNDQzNzE3OjE3MDMwMjAzMTk6c3BfbXRmOjIwMDA1MDk3ODcxOTQ2MTo6MDo6&url=%2FOrganizer-Expandable-Flatware-Removable-Supplies%2Fdp%2FB083HTHL5T%2Fref%3Dsr_1_14_sspa%3Fkeywords%3Dkitchen%26qid%3D1703020319%26sr%3D8-14-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',43,'2023-12-19 15:12:00.656533-06','2023-12-19 15:12:00.656533-06','www.amazon.com'), + (3185,'Utopia Kitchen Clear Soda Can Organizer - Fridge Organizer Bins - Set of 4 Drink Organizer For Fridge or Countertop - Soda Can Dispenser For Refrigerator Organizing - Fridge Organization and Storage',NULL,'B0BBRF3MPM','https://m.media-amazon.com/images/I/91O3aNfoPgL._AC_UL320_.jpg',2266,4.7,'$16.85','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Utopia-Kitchen-Organizer-Pantry-Pack/dp/B0BBRF3MPM/ref=sr_1_15?keywords=kitchen&qid=1703020319&sr=8-15',43,'2023-12-19 15:12:00.673924-06','2023-12-19 15:12:00.673924-06','www.amazon.com'), + (3186,'CAROTE Pots and Pans Set Nonstick, White Granite Induction Kitchen Cookware Sets, 10 Pcs Non Stick Cooking Set w/Frying Pans & Saucepans(PFOS, PFOA Free)',NULL,'B09KHBBCKW','https://m.media-amazon.com/images/I/71wGpsLN4ZL._AC_UL320_.jpg',14489,4.5,'$79.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Nonstick-Granite-Cookware-Kitchen-Induction/dp/B09KHBBCKW/ref=sr_1_16?keywords=kitchen&qid=1703020319&sr=8-16',43,'2023-12-19 15:12:00.682528-06','2023-12-19 15:12:00.682528-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3187,'Farberware 22-Piece Never Needs Sharpening Triple Rivet High-Carbon Stainless Steel Knife Block and Kitchen Tool Set, Black',NULL,'B01DB285NW','https://m.media-amazon.com/images/I/71OYg-qNW6L._AC_UL320_.jpg',24059,4.4,'$18.39','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Farberware-5152501-Sharpening-High-Carbon-Stainless/dp/B01DB285NW/ref=sr_1_17?keywords=kitchen&qid=1703020319&sr=8-17',43,'2023-12-19 15:12:00.691392-06','2023-12-19 15:12:00.691392-06','www.amazon.com'), + (3188,'Fullstar All-in-1 Vegetable Chopper, Mandoline Slicer & Cheese Grater - Multi Blade French Fry Cutter & Veggie Dicer - Includes Bonus Handheld Spiralizer & Kitchen Gadgets (5 in 1, Black/White)',NULL,'B07VG4S38C','https://m.media-amazon.com/images/I/91FaDhyATZL._AC_UL320_.jpg',23444,4.6,'$49.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Fullstar-Mandoline-Slicer-Spiralizer-Vegetable/dp/B07VG4S38C/ref=sr_1_18?keywords=kitchen&qid=1703020319&sr=8-18',43,'2023-12-19 15:12:00.699201-06','2023-12-19 15:12:00.699201-06','www.amazon.com'), + (3189,'Baking Pan 10 Piece Set Nonstick Carbon Steel Gray Oven Bakeware Kitchen Set, 2 Cookie Sheets, 2 Round Cake Pans, Square Pan, Roasting Pan, Loaf Pan, Crisp Pan, Pizza Crisper, & Muffin Pan by PERLLI',NULL,'B01KVZYI2Y','https://m.media-amazon.com/images/I/81jyaXNwmqL._AC_UL320_.jpg',1077,4.5,'$54.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4NTQwNTc4MTAxNDQzNzE3OjE3MDMwMjAzMTk6c3BfbXRmOjIwMDAzMTYwNjAwNzY0MTo6MDo6&url=%2FNonstick-Bakeware-Kitchen-Roasting-PERLLI%2Fdp%2FB01KVZYI2Y%2Fref%3Dsr_1_19_sspa%3Fkeywords%3Dkitchen%26qid%3D1703020319%26sr%3D8-19-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',43,'2023-12-19 15:12:00.706737-06','2023-12-19 15:12:00.706737-06','www.amazon.com'), + (3299,'The CBT Workbook for Mental Health: Evidence-Based Exercises to Transform Negative Thoughts and Manage Your Well-Being',NULL,'B09BBHZV2N','https://m.media-amazon.com/images/I/61LzrdlkQGL._AC_UL320_.jpg',1060,4.7,'$11.34','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/CBT-Workbook-Mental-Health-Evidence-Based/dp/B09BBHZV2N/ref=sr_1_13?keywords=health&qid=1703020336&sr=8-13',44,'2023-12-19 15:12:17.679991-06','2023-12-19 15:12:17.679991-06','www.amazon.com'), + (3300,'Bloom Nutrition Super Greens Powder Smoothie & Juice Mix - Probiotics for Digestive Health & Bloating Relief for Women, Digestive Enzymes with Superfoods Spirulina & Chlorella for Gut Health (Mango)',NULL,'B0B3D6TMKS','https://m.media-amazon.com/images/I/51bcP+2jGnL._AC_UL320_.jpg',1154,4.3,'$39.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Bloom-Nutrition-Super-Greens-Powder-Smoothie-Juice-Mix/dp/B0B3D6TMKS/ref=sr_1_15?keywords=health&qid=1703020336&rdc=1&sr=8-15',44,'2023-12-19 15:12:17.687472-06','2023-12-19 15:12:17.687472-06','www.amazon.com'), + (3453,'Dental Herb Company - Tooth & Gums Tonic (18 oz.) Mouthwash',NULL,'B01C5YB7LE','https://m.media-amazon.com/images/I/61Ba+I5zpGL._AC_UL320_.jpg',3221,4.7,'$38.72','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Dental-Herb-Company-Tooth-Bottle/dp/B01C5YB7LE/ref=sr_1_61?keywords=dental&qid=1703020360&sr=8-61',45,'2023-12-19 15:12:42.121164-06','2023-12-19 15:12:42.121164-06','www.amazon.com'), + (3190,'Vtopmart Airtight Food Storage Containers with Lids, 24 pcs Plastic Kitchen and Pantry Organization Canisters for Cereal, Dry Food, Flour and Sugar, BPA Free, Includes 24 Labels',NULL,'B08ZK5WDWN','https://m.media-amazon.com/images/I/A1VmA3GVSiL._AC_UL320_.jpg',15058,4.7,'$37.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4NTQwNTc4MTAxNDQzNzE3OjE3MDMwMjAzMTk6c3BfbXRmOjIwMDAyNDU2MjM0Mjg5ODo6MDo6&url=%2FAirtight-Containers-Vtopmart-Organization-Canisters%2Fdp%2FB08ZK5WDWN%2Fref%3Dsr_1_20_sspa%3Fkeywords%3Dkitchen%26qid%3D1703020319%26sr%3D8-20-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',43,'2023-12-19 15:12:00.71534-06','2023-12-19 15:12:00.71534-06','www.amazon.com'), + (3191,'SUMMUE Wooden Cutting Boards for Kitchen - 19" x 15" Set of 4 Acacia Wood Large Charcuterie Boards Set with Puzzle Handles Chopping Boards for Meat, Cheese, Fruits, Vegetables, Bread, Charcuterie',NULL,'B0C65SJF7J','https://m.media-amazon.com/images/I/61y-eSRpLXL._AC_UL320_.jpg',38,4.6,'$35.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4NTQwNTc4MTAxNDQzNzE3OjE3MDMwMjAzMTk6c3BfbXRmOjMwMDA1NzM2NDM1OTQwMjo6MDo6&url=%2FSUMMUE-Wooden-Cutting-Boards-Kitchen%2Fdp%2FB0C65SJF7J%2Fref%3Dsr_1_21_sspa%3Fkeywords%3Dkitchen%26qid%3D1703020319%26sr%3D8-21-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',43,'2023-12-19 15:12:00.723663-06','2023-12-19 15:12:00.723663-06','www.amazon.com'), + (3192,'LEVOIT Air Purifiers for Home Large Room with Washable Filter, 3-Channel Air Quality Monitor, Smart WiFi and Filter for Pets, Allergies, Smoke, Dust, Pollen, Alexa Control, 1395 Ft², EverestAir',NULL,'B0B252LDH7','https://m.media-amazon.com/images/I/81ktS7yuyBL._AC_UL320_.jpg',16172,4.7,'$499.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4NTQwNTc4MTAxNDQzNzE3OjE3MDMwMjAzMTk6c3BfbXRmOjIwMDExMDg5NTczNjY5ODo6MDo6&url=%2FLEVOIT-Purifiers-Captures-Particles-Allergies%2Fdp%2FB0B252LDH7%2Fref%3Dsr_1_22_sspa%3Fkeywords%3Dkitchen%26qid%3D1703020319%26sr%3D8-22-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',43,'2023-12-19 15:12:00.732049-06','2023-12-19 15:12:00.732049-06','www.amazon.com'), + (3193,'Mixing Bowls with Airtight Lids Set, 26PCS Stainless Steel Khaki Bowls with Grater Attachments, Non-Slip Bottoms & Kitchen Gadgets Set, Size 7, 4, 2.5, 2.0,1.5, 1QT, Great for Mixing & Serving',NULL,'B0BWHJ1FNK','https://m.media-amazon.com/images/I/71CS445b7eL._AC_UL320_.jpg',539,4.6,'$47.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Airtight-Stainless-Attachments-Non-Slip-Bottoms/dp/B0BWHJ1FNK/ref=sr_1_23?keywords=kitchen&qid=1703020319&sr=8-23',43,'2023-12-19 15:12:00.739729-06','2023-12-19 15:12:00.739729-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3194,'Magic Bullet Blender, Small, Silver, 11 Piece Set',NULL,'B012T634SM','https://m.media-amazon.com/images/I/61w2Tj7r0BL._AC_UL320_.jpg',102329,4.5,'$39.88','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Magic-Bullet-Blender-Small-Silver/dp/B012T634SM/ref=sr_1_24?keywords=kitchen&qid=1703020319&sr=8-24',43,'2023-12-19 15:12:00.747908-06','2023-12-19 15:12:00.747908-06','www.amazon.com'), + (3195,'HuggieGems 4 Pack Magnetic Spice Storage Rack Organizer for Refrigerator and Oven, Black Fridge Organizers and Storage',NULL,'B0C3H9MJQV','https://m.media-amazon.com/images/I/51imrSup74L._AC_UL320_.jpg',575,4.8,'$18.39','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/HuggieGems-Magnetic-Organizer-Refrigerator-Organizers/dp/B0C3H9MJQV/ref=sr_1_25?keywords=kitchen&qid=1703020319&sr=8-25',43,'2023-12-19 15:12:00.756893-06','2023-12-19 15:12:00.756893-06','www.amazon.com'), + (3196,'StepRite Kitchen Mats, 2PCS Kitchen Rugs, Cushioned Anti Fatigue Kitchen Mats for Floor, Non-Slip Standing Desk Mat, Waterproof Kitchen Rug Set for Kitchen, Floor, Office,17.3"×30"+17.3"×47",Black',NULL,'B0C2Y3T5LN','https://m.media-amazon.com/images/I/81NRhd43iAL._AC_UL320_.jpg',687,4.5,'$24.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/StepRite-Cushioned-Non-Slip-Standing-Waterproof/dp/B0C2Y3T5LN/ref=sr_1_26?keywords=kitchen&qid=1703020319&sr=8-26',43,'2023-12-19 15:12:00.764923-06','2023-12-19 15:12:00.764923-06','www.amazon.com'), + (4554,'NISHEL Travel Toiletry Bag for Women Large Capacity, Travel Essentials Organizer, Hanging Makeup Case for Accessories, Cosmetics, Toiletries, Pink',NULL,'B08JTPNQP1','https://m.media-amazon.com/images/I/71ZVoI4DDRL._AC_UL320_.jpg',11632,4.8,'$22.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxNTk3Mjk0NjM0MzQ4NzE3OjE3MDMwMjA2ODY6c3BfYXRmX25leHQ6MjAwMDU4OTk2NTAzODk4OjowOjo&url=%2FNISHEL-Sections-Toiletry-Organizer-Resistant%2Fdp%2FB08JTPNQP1%2Fref%3Dsr_1_50_sspa%3Fkeywords%3Dtravel%2Baccessories%26qid%3D1703020686%26sr%3D8-50-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGZfbmV4dA%26psc%3D1',57,'2023-12-19 15:18:07.874772-06','2023-12-19 15:18:07.874772-06','www.amazon.com'), + (3198,'BRODARK Japanese Chef Knife, Damascus Chef Knife 8 inch with Japanese VG-10 Steel Core, Ultra-Sharp Professional Kitchen Knife, Handcrafted with Ebony Wood Handle, Holiday Gifts',NULL,'B09PVB1HYR','https://m.media-amazon.com/images/I/71lI+G5-xxL._AC_UL320_.jpg',187,4.6,'$115.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4NTQwNTc4MTAxNDQzNzE3OjE3MDMwMjAzMTk6c3BfbXRmOjIwMDExNDQ2MDQ3NjU5ODo6MDo6&url=%2FBRODARK-Damascus-Japanese-Professional-Ergonomic%2Fdp%2FB09PVB1HYR%2Fref%3Dsr_1_28_sspa%3Fkeywords%3Dkitchen%26qid%3D1703020319%26sr%3D8-28-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',43,'2023-12-19 15:12:00.779791-06','2023-12-19 15:12:00.779791-06','www.amazon.com'), + (3199,'Schmidt Brothers 12-Piece Kitchen Knife Set, High-Carbon German Stainless Steel Cutlery Two-stage Knife Sharpener and Clear Acrylic Magnetic Knife Block',NULL,'B09D8NWX3D','https://m.media-amazon.com/images/I/71fQGsye62L._AC_UL320_.jpg',137,4.4,'$169.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4NTQwNTc4MTAxNDQzNzE3OjE3MDMwMjAzMTk6c3BfbXRmOjIwMDA2MTg2NDk2MTM5ODo6MDo6&url=%2FSchmidt-High-Carbon-Stainless-Two-stage-Sharpener%2Fdp%2FB09D8NWX3D%2Fref%3Dsr_1_29_sspa%3Fkeywords%3Dkitchen%26qid%3D1703020319%26sr%3D8-29-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',43,'2023-12-19 15:12:00.788304-06','2023-12-19 15:12:00.788304-06','www.amazon.com'), + (3200,'Kitchen Utensils Set- 34PCS Silicone Cooking Utensils with Holder, Umite Chef Heat Resistant Kitchen Utensil Spatula Set for Nonstick Cookware, Black Wooden Handles Kitchen Gadgets Tools Set',NULL,'B0C98ZRDVK','https://m.media-amazon.com/images/I/7189iDV4TYL._AC_UL320_.jpg',214,4.4,'$35.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Utensils-Silicone-Umite-Chef-Resistant/dp/B0C98ZRDVK/ref=sr_1_30?keywords=kitchen&qid=1703020319&sr=8-30',43,'2023-12-19 15:12:00.795792-06','2023-12-19 15:12:00.795792-06','www.amazon.com'), + (3201,'Herb Scissors, Kitchen Herb Shears Cutter with 5 Blades and Cover, Sharp Dishwasher Safe Kitchen Gadget - Green',NULL,'B07DPCCBZT','https://m.media-amazon.com/images/I/81-N0JsOEPL._AC_UL320_.jpg',2542,4.4,'$17.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Scissors-Stainless-Cleaning-Multipurpose-Dishwasher/dp/B07DPCCBZT/ref=sr_1_31?keywords=kitchen&qid=1703020319&sr=8-31',43,'2023-12-19 15:12:00.804144-06','2023-12-19 15:12:00.804144-06','www.amazon.com'), + (3202,'Powerful Immersion Blender, Electric Hand Blender 500 Watt with Turbo Mode, Detachable Base. Handheld Kitchen Gadget Blender Stick for Soup, Smoothie, Puree, Baby Food, 304 Stainless Steel Blades',NULL,'B09WF796VW','https://m.media-amazon.com/images/I/81A6emwYQGL._AC_UL320_.jpg',4288,4.5,'$21.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Powerful-Immersion-Electric-Detachable-Stainless/dp/B09WF796VW/ref=sr_1_32?keywords=kitchen&qid=1703020319&sr=8-32',43,'2023-12-19 15:12:00.811808-06','2023-12-19 15:12:00.811808-06','www.amazon.com'), + (3203,'Oil Sprayer, 100ml Olive Oil Dispenser, Cooking Oil Spray Bottle, Vinegar Soy Sauce Dispenser, Oil Mister for air fryer kitchen gadgets accessories, for Cooking Baking Roasting Frying Use',NULL,'B09SW7TPCR','https://m.media-amazon.com/images/I/71D6yJai6LL._AC_UL320_.jpg',1850,4.2,'$9.49','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/MISSOLO-Sprayer-Dispenser-Stainless-Roasting/dp/B09SW7TPCR/ref=sr_1_33?keywords=kitchen&qid=1703020319&sr=8-33',43,'2023-12-19 15:12:00.820323-06','2023-12-19 15:12:00.820323-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3204,'Butter Dish with Lid and Knife for Countertop, Airtight Butter Keeper for Counter or Fridge, Ceramic Butter Container with Thick Acacia Wood Lid, for Modern Kitchen Decor and Accessories, White',NULL,'B09YH5XWQ1','https://m.media-amazon.com/images/I/61fxv8Hg3QL._AC_UL320_.jpg',1074,4.7,'$16.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Farmhouse-Butter-Countertop-Container-Accessories/dp/B09YH5XWQ1/ref=sr_1_34?keywords=kitchen&qid=1703020319&sr=8-34',43,'2023-12-19 15:12:00.827485-06','2023-12-19 15:12:00.827485-06','www.amazon.com'), + (3205,'KitchenClouds Kitchen Mat Cushioned Anti Fatigue Rug 17.3"x28" Waterproof, Non Slip, Standing and Comfort Desk/Floor Mats for House Sink Office (Black)',NULL,'B09CYDRFWQ','https://m.media-amazon.com/images/I/71nVT-klNdL._AC_UL320_.jpg',12899,4.4,'$15.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/KitchenClouds-Kitchen-Cushioned-Waterproof-Standing/dp/B09CYDRFWQ/ref=sr_1_35?keywords=kitchen&qid=1703020319&sr=8-35',43,'2023-12-19 15:12:00.836109-06','2023-12-19 15:12:00.836109-06','www.amazon.com'), + (3206,'Umite Chef Silicone Kitchen Cooking Utensil Set, 43 pcs Spatula Set with Stainless Steel Handle, Non-stick Heat Resistant - Best Cookware Set-(Khaki)',NULL,'B096NRHF4D','https://m.media-amazon.com/images/I/61wuDX+nqaL._AC_UL320_.jpg',2459,4.6,'$32.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Umite-Chef-Silicone-Non-stick-Resistant/dp/B096NRHF4D/ref=sr_1_36?keywords=kitchen&qid=1703020319&sr=8-36',43,'2023-12-19 15:12:00.844228-06','2023-12-19 15:12:00.844228-06','www.amazon.com'), + (3207,'Meat Chopper for Hamburger, Premium Heat Resistant Masher and Smasher for Ground Beef, Ground Turkey and More, Nylon Ground Beef Chopper Tool and Meat Fork, Non Stick Mix Chopper',NULL,'B08JKXDFQ9','https://m.media-amazon.com/images/I/61qZUr2m6UL._AC_UL320_.jpg',8887,4.7,'$7.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Chopper-Hamburger-Premium-Resistant-Smasher/dp/B08JKXDFQ9/ref=sr_1_37?keywords=kitchen&qid=1703020319&sr=8-37',43,'2023-12-19 15:12:00.853381-06','2023-12-19 15:12:00.853381-06','www.amazon.com'), + (3208,'AUOON Clip On Strainer Silicone for All Pots and Pans, Pasta Strainer Clip on Food Strainer for Meat Vegetables Fruit Silicone Kitchen Colander',NULL,'B0775GR18G','https://m.media-amazon.com/images/I/61rEjqHxCXL._AC_UL320_.jpg',9120,4.5,'$11.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Strainer-Spaghetti-Silicone-Colander-Approved/dp/B0775GR18G/ref=sr_1_38?keywords=kitchen&qid=1703020319&sr=8-38',43,'2023-12-19 15:12:00.861263-06','2023-12-19 15:12:00.861263-06','www.amazon.com'), + (3209,'PRAKI Airtight Food Storage Container Set, 16 Pcs BPA Free Plastic Dry Food Canisters for Kitchen Pantry Organization and Storage Ideal for Cereal, Flour & Sugar - Labels, Marker(Black)',NULL,'B08TWBX7KT','https://m.media-amazon.com/images/I/91VyrAJPgkL._AC_UL320_.jpg',6921,4.7,'$24.59','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/PRAKI-Airtight-Food-Storage-Container/dp/B08TWBX7KT/ref=sr_1_39?keywords=kitchen&qid=1703020319&sr=8-39',43,'2023-12-19 15:12:00.870193-06','2023-12-19 15:12:00.870193-06','www.amazon.com'), + (3210,'Homaxy 100% Cotton Terry Kitchen Towels(Black, 13 x 28 inches), Checkered Designed, Soft and Super Absorbent Dish Towels, 4 Pack',NULL,'B08R6VYDSP','https://m.media-amazon.com/images/I/716ccrKz9BL._AC_UL320_.jpg',4426,4.5,'$9.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Homaxy-Kitchen-Checkered-Designed-Absorbent/dp/B08R6VYDSP/ref=sr_1_40?keywords=kitchen&qid=1703020319&sr=8-40',43,'2023-12-19 15:12:00.878599-06','2023-12-19 15:12:00.878599-06','www.amazon.com'), + (3211,'KOCWELL Bag Organizer and Plastic Wrap Dispenser with Cutter, 6 In 1 Bamboo Foil and Plastic Wrap Organizer for Kitchen Drawer, Food Storage Bag Organizer for Gallon,Quart,Sandwich,Snack',NULL,'B0B1ZLVFKJ','https://m.media-amazon.com/images/I/71GjE5Xq7qL._AC_UL320_.jpg',786,4.5,'$29.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/KOCWELL-Ziplock-Organizer-Dispenser-Sandwich/dp/B0B1ZLVFKJ/ref=sr_1_41?keywords=kitchen&qid=1703020319&sr=8-41',43,'2023-12-19 15:12:00.887144-06','2023-12-19 15:12:00.887144-06','www.amazon.com'), + (3197,'KEGOUU Oven Mitts and Pot Holders 6pcs Set, Kitchen Oven Glove High Heat Resistant 500 Degree Extra Long Oven Mitts and Potholder with Non-Slip Silicone Surface for Cooking (Grey)',NULL,'B085VQDL5T','https://m.media-amazon.com/images/I/812+0savvKL._AC_UL320_.jpg',9314,4.7,'$17.59','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4NTQwNTc4MTAxNDQzNzE3OjE3MDMwMjAzMTk6c3BfbXRmOjIwMDE3MTU4ODUyOTE5ODo6MDo6&url=%2FKEGOUU-Resistant-Potholder-Non-Slip-Silicone%2Fdp%2FB085VQDL5T%2Fref%3Dsr_1_27_sspa%3Fkeywords%3Dkitchen%26qid%3D1703020319%26sr%3D8-27-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',43,'2023-12-19 15:12:00.771952-06','2023-12-19 15:12:00.894168-06','www.amazon.com'), + (3212,'Silicone Utensil Rest with Drip Pad for Multiple Utensils, Heat-Resistant, BPA-Free Spoon Rest & Spoon Holder for Stove Top, Kitchen Utensil Holder for Spoons, Ladles, Tongs & More - by Zulay',NULL,'B07PVBS863','https://m.media-amazon.com/images/I/71X6sn0-cNL._AC_UL320_.jpg',36372,4.7,'$7.89','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Silicone-Utensil-Rest-Multiple-Heat-Resistant/dp/B07PVBS863/ref=sr_1_43?keywords=kitchen&qid=1703020319&sr=8-43',43,'2023-12-19 15:12:00.902988-06','2023-12-19 15:12:00.902988-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3213,'Rubbermaid Microfiber Reveal Spray Mop Floor Cleaning Kit with 3 Microfiber Wet Pads, 1 Solution Refillable Bottles for Wet & Dry Use, Washable & Reusable Pads, Cordless, for All Floor Types',NULL,'B0CK552X5T','https://m.media-amazon.com/images/I/519DZsv+P7L._AC_UL320_.jpg',12312,4.5,'$39.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Rubbermaid-Microfiber-Cleaning-Solution-Refillable/dp/B0CK552X5T/ref=sr_1_44?keywords=kitchen&qid=1703020319&sr=8-44',43,'2023-12-19 15:12:00.910676-06','2023-12-19 15:12:00.910676-06','www.amazon.com'), + (3214,'Under Cabinet Lights,40 LED Rechargeable Battery Operated Motion Sensor Light Indoor, 2 Pack Magnetic Dimmable Closet Lights, Wireless Under Counter Lights for Kitchen, Stairs (White Light)',NULL,'B0BDF8CVBN','https://m.media-amazon.com/images/I/61Yz671PUuL._AC_UL320_.jpg',6105,4.4,'$24.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Rechargeable-Operated-Magnetic-Dimmable-Wireless/dp/B0BDF8CVBN/ref=sr_1_45?keywords=kitchen&qid=1703020319&sr=8-45',43,'2023-12-19 15:12:00.919686-06','2023-12-19 15:12:00.919686-06','www.amazon.com'), + (3215,'Electric Salt and Pepper Grinder Set (2 Pack), Rechargeable - No Battery Needed - Automatic Salt Pepper Mill Grinder, Adjustable Coarseness, LED Light, One-Hand Operation for Kitchen BBQ',NULL,'B0BQYVNKRV','https://m.media-amazon.com/images/I/81y8zGlpJWL._AC_UL320_.jpg',2339,4.7,'$33.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Electric-Salt-Pepper-Grinder-Rechargeable/dp/B0BQYVNKRV/ref=sr_1_46?keywords=kitchen&qid=1703020319&sr=8-46',43,'2023-12-19 15:12:00.927585-06','2023-12-19 15:12:00.927585-06','www.amazon.com'), + (3216,'KIMIUP Kitchen Cutting Board (Set of 3),Professional Chopping Boards Sets,Dishwasher Safe Cutting Boards With Juice Grooves & Carrying Handle & No BPA',NULL,'B08PB36KQ8','https://m.media-amazon.com/images/I/81R6Gd-mtzL._AC_UL320_.jpg',5694,4.7,'$13.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/KIMIUP-Professional-Chopping-Dishwasher-Carrying/dp/B08PB36KQ8/ref=sr_1_47?keywords=kitchen&qid=1703020319&sr=8-47',43,'2023-12-19 15:12:00.935169-06','2023-12-19 15:12:00.935169-06','www.amazon.com'), + (3301,'Mental Health Journal: Daily Check-In: 70 Days of Reflection Space to Track Your Moods, Intentions, and Well-Being',NULL,'B0B92D3DBM','https://m.media-amazon.com/images/I/71R5lJXXI0L._AC_UL320_.jpg',73,4.5,'$10.80','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Mental-Health-Journal-Check-Reflection/dp/B0B92D3DBM/ref=sr_1_16?keywords=health&qid=1703020336&sr=8-16',44,'2023-12-19 15:12:17.694718-06','2023-12-19 15:12:17.694718-06','www.amazon.com'), + (3217,'24 Pack Airtight Food Storage Container Set - BPA Free Clear Plastic Kitchen and Pantry Organization Canisters with Durable Lids for Cereal, Dry Food Flour & Sugar - Labels, Marker & Spoon Set',NULL,'B091V74W4N','https://m.media-amazon.com/images/I/811MHr1Pz4L._AC_UL320_.jpg',12057,4.7,'$34.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Pack-Airtight-Food-Storage-Container/dp/B091V74W4N/ref=sr_1_48?keywords=kitchen&qid=1703020319&sr=8-48',43,'2023-12-19 15:12:00.94442-06','2023-12-19 15:12:00.94442-06','www.amazon.com'), + (3218,'Hoenart 4 Pack Magnetic Spice Rack for Refrigerator, Moveable Magnetic Spice Organizer, Black Metal Strong Magnetic Shelf for Fridge and Microwave Oven, Space Saving for Kitchen',NULL,'B0C9QKV33P','https://m.media-amazon.com/images/I/81ls2I8LEUL._AC_UL320_.jpg',139,4.8,'$26.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Hoenart-Magnetic-Refrigerator-Organizer-Microwave/dp/B0C9QKV33P/ref=sr_1_49?keywords=kitchen&qid=1703020319&sr=8-49',43,'2023-12-19 15:12:00.953394-06','2023-12-19 15:12:00.953394-06','www.amazon.com'), + (3219,'4-in-1 longzon [4 stage] Knife Sharpener with a Pair of Cut-Resistant Glove, Original Premium Polish Blades, Best Kitchen Knife Sharpener Really Works for Ceramic and Steel Knives, Scissors.',NULL,'B08FWNCNH9','https://m.media-amazon.com/images/I/71EhinXcQoL._AC_UL320_.jpg',27557,4.3,'$13.89','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/longzon-Sharpener-Cut-Resistant-Original-Scissors/dp/B08FWNCNH9/ref=sr_1_50?keywords=kitchen&qid=1703020319&sr=8-50',43,'2023-12-19 15:12:00.962765-06','2023-12-19 15:12:00.962765-06','www.amazon.com'), + (3220,'REALINN Under Sink Organizer, Pull Out Cabinet Organizer 2 Tier Slide Out Sink Shelf Cabinet Storage Shelves, Under Sink Storage for Kitchen Bathroom Cabinet',NULL,'B0B6TK767D','https://m.media-amazon.com/images/I/81Pzdi+8KWL._AC_UL320_.jpg',2308,4.4,'$34.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/REALINN-Organizer-Cabinet-Storage-Bathroom/dp/B0B6TK767D/ref=sr_1_51?keywords=kitchen&qid=1703020319&sr=8-51',43,'2023-12-19 15:12:00.971549-06','2023-12-19 15:12:00.971549-06','www.amazon.com'), + (3221,'Sevenblue 2 Pack Under Sink Organizers and Storage, 2 Tier Sliding Bathroom organizer,Multi-Use Under Kitchen Cabinet Storage Shelf (Black 2Pack)',NULL,'B0BQHPHS5W','https://m.media-amazon.com/images/I/715W1ep-DqL._AC_UL320_.jpg',1472,4.6,'$24.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/SevenBlue-Organizers-Bathroom-organizer-Multi-Use/dp/B0BQHPHS5W/ref=sr_1_52?keywords=kitchen&qid=1703020319&sr=8-52',43,'2023-12-19 15:12:00.979544-06','2023-12-19 15:12:00.979544-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3222,'HENCKELS Premium Quality 15-Piece Knife Set with Block, Razor-Sharp, German Engineered Knife Informed by over 100 Years of Masterful Knife Making, Lightweight and Strong, Dishwasher Safe',NULL,'B00GHX5HGG','https://m.media-amazon.com/images/I/71FtjejRbvL._AC_UL320_.jpg',14709,4.6,'$129.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/HENCKELS-Razor-Sharp-Engineered-Lightweight-Dishwasher/dp/B00GHX5HGG/ref=sr_1_53?keywords=kitchen&qid=1703020319&sr=8-53',43,'2023-12-19 15:12:00.987774-06','2023-12-19 15:12:00.987774-06','www.amazon.com'), + (3223,'Home Hero 54 Pcs Kitchen Utensils Set - Cooking Utensils Set with Spatula - First Home Essentials Utensil Sets - Household Essentials - Kitchen Gadgets & Kitchen Gift (54 Pcs Set - Stainless Steel)',NULL,'B077BG4T9C','https://m.media-amazon.com/images/I/81VNMj39EwL._AC_UL320_.jpg',5536,4.4,'$69.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Home-Hero-Stainless-Utensil-Set/dp/B077BG4T9C/ref=sr_1_54?keywords=kitchen&qid=1703020319&sr=8-54',43,'2023-12-19 15:12:00.996055-06','2023-12-19 15:12:00.996055-06','www.amazon.com'), + (3224,'Vegetable Chopper, Pro Onion Chopper, Multifunctional 13 in 1 Food Chopper, Kitchen Vegetable Slicer Dicer Cutter,Veggie Chopper With 8 Blades,Carrot and Garlic Chopper With Container…',NULL,'B09YH5CPQP','https://m.media-amazon.com/images/I/81tV-nZg9-L._AC_UL320_.jpg',16888,4.3,'$23.97','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Vegetable-Chopper-Multifunctional-Kitchen-Container/dp/B09YH5CPQP/ref=sr_1_55?keywords=kitchen&qid=1703020319&sr=8-55',43,'2023-12-19 15:12:01.004914-06','2023-12-19 15:12:01.004914-06','www.amazon.com'), + (3225,'BLACK+DECKER PowerCrush Multi-Function Blender with 6-Cup Glass Jar, 4 Speed Settings, Silver',NULL,'B07RQVL8D5','https://m.media-amazon.com/images/I/711rlNbZmkL._AC_UL320_.jpg',6338,4.4,'$34.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/BLACK-DECKER-BL1230SG-PowerCrush-Multi-Function/dp/B07RQVL8D5/ref=sr_1_57?keywords=kitchen&qid=1703020319&sr=8-57',43,'2023-12-19 15:12:01.013517-06','2023-12-19 15:12:01.013517-06','www.amazon.com'), + (3226,'Vegetable , Food Chopper, Pro 12 in1 Multifunctional Onion/Veggie Chopper With Container, Vegetable Dicer Cutter,Mandoline Slicer,Salad,Garlic Chopper (12 in1)',NULL,'B0CB7QR48D','https://m.media-amazon.com/images/I/81BP24KakHL._AC_UL320_.jpg',1294,4.4,'$21.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Vegetable-Chopper-Multifunctional-Container-Mandoline/dp/B0CB7QR48D/ref=sr_1_58?keywords=kitchen&qid=1703020319&sr=8-58',43,'2023-12-19 15:12:01.022728-06','2023-12-19 15:12:01.022728-06','www.amazon.com'), + (3608,'Hanes',NULL,'B0BKLPPXBS','https://m.media-amazon.com/images/I/91dfC5eeR9L._AC_UL320_.jpg',287,4.5,'$10.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Hanes-Originals-Tri-Blend-Athletic-Heather/dp/B0BKLPPXBS/ref=sr_1_92?keywords=men%27s+clothing&qid=1703020378&sr=8-92',46,'2023-12-19 15:12:59.506297-06','2023-12-19 15:12:59.506297-06','www.amazon.com'), + (3228,'T-fal Ultimate EZ Clean Stainless Steel Deep Fryer with Basket 3.5 Liter Oil and 2.6 Pound Food Capacity 1700 Watts Oil Filtration, Temp Control, Digital Timer, Dishwasher Safe Parts Stainless Steel',NULL,'B00NQ7QFGM','https://m.media-amazon.com/images/I/713j2j371bL._AC_UL320_.jpg',16134,4.6,'$90.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/T-fal-Ultimate-Stainless-Filtration-Dishwasher/dp/B00NQ7QFGM/ref=sr_1_60?keywords=kitchen&qid=1703020319&sr=8-60',43,'2023-12-19 15:12:01.041492-06','2023-12-19 15:12:01.041492-06','www.amazon.com'), + (4555,'PAVILIA Travel Blanket Pillow in Soft Bag with Pockets, Airplane Blanket Set, Plane Blanket Compact Packable, Flight Essentials Car Pillow, Travelers Accessories Gifts, Luggage Strap, Turquoise',NULL,'B0C6BJL66R','https://m.media-amazon.com/images/I/915Un5Kn5dL._AC_UL320_.jpg',138,4.8,'$20.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxNTk3Mjk0NjM0MzQ4NzE3OjE3MDMwMjA2ODY6c3BfYXRmX25leHQ6MjAwMTcyODg1MjAzNzk4OjowOjo&url=%2FPAVILIA-Essentials-Travelers-Accessories-Turquoise%2Fdp%2FB0C6BJL66R%2Fref%3Dsr_1_51_sspa%3Fkeywords%3Dtravel%2Baccessories%26qid%3D1703020686%26sr%3D8-51-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGZfbmV4dA%26psc%3D1',57,'2023-12-19 15:18:07.880074-06','2023-12-19 15:18:07.880074-06','www.amazon.com'), + (3229,'Collive Boho Anti Fatigue Kitchen Mats Sets 2 Piece Non Skid Kitchen Mats for Floor Cushioned Kitchen Rugs and Mats Waterproof Ergonomic Comfort Standing Mat Runner for Kitchen,Home,Office,Laundry',NULL,'B0CGTZRSL8','https://m.media-amazon.com/images/I/811osHjw5CL._AC_UL320_.jpg',38,4.3,'$29.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4NDAxNzUxOTY4OTY3NzE3OjE3MDMwMjAzMjY6c3BfYXRmX25leHQ6MzAwMDkyNDMxNTMxNTAyOjowOjo&url=%2FCollive-Cushioned-Waterproof-Ergonomic-Standing%2Fdp%2FB0CGTZRSL8%2Fref%3Dsr_1_49_sspa%3Fkeywords%3Dkitchen%26qid%3D1703020326%26sr%3D8-49-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGZfbmV4dA%26psc%3D1',43,'2023-12-19 15:12:07.467414-06','2023-12-19 15:12:07.467414-06','www.amazon.com'), + (3230,'Breadman 2-Pound Bread Maker, Stainless Steel, BK1200SS',NULL,'B0C5NYCT51','https://m.media-amazon.com/images/I/71CIwOWF0cL._AC_UL320_.jpg',1355,4.2,'$179.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4NDAxNzUxOTY4OTY3NzE3OjE3MDMwMjAzMjY6c3BfYXRmX25leHQ6MzAwMDkwODQ4ODM5NzAyOjowOjo&url=%2FBreadman-2-Pound-Bread-Stainless-BK1200SS%2Fdp%2FB0C5NYCT51%2Fref%3Dsr_1_50_sspa%3Fkeywords%3Dkitchen%26qid%3D1703020326%26sr%3D8-50-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGZfbmV4dA%26psc%3D1',43,'2023-12-19 15:12:07.491316-06','2023-12-19 15:12:07.491316-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3231,'Sunnecko Heavy Duty Kitchen Scissors - Stainless Steel Kitchen Shears,Ultra Sharp Micro Serrated Poultry Shears,Cooking Scissors for Meat,Fish,Chicken,Vegetable,Open Jars&Nut Cracker,Dishwasher Safe',NULL,'B0BN1M6FHZ','https://m.media-amazon.com/images/I/61Sw4O74-+L._AC_UL320_.jpg',214,4.6,'$32.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4NDAxNzUxOTY4OTY3NzE3OjE3MDMwMjAzMjY6c3BfYXRmX25leHQ6MzAwMDcyMzE5ODg4MDAyOjowOjo&url=%2FSunnecko-Heavy-Duty-Kitchen-Scissors%2Fdp%2FB0BN1M6FHZ%2Fref%3Dsr_1_51_sspa%3Fkeywords%3Dkitchen%26qid%3D1703020326%26sr%3D8-51-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGZfbmV4dA%26psc%3D1',43,'2023-12-19 15:12:07.500235-06','2023-12-19 15:12:07.500235-06','www.amazon.com'), + (3232,'EUNA Kitchen Knife Set With Block, 7 Pieces Knife Block Set with Wooden Handle, Japanese Stainless Steel Chef Knife Set Professional Cooking Knive, Silver',NULL,'B0B9GWQN4W','https://m.media-amazon.com/images/I/815VLWpQGlL._AC_UL320_.jpg',29,4.7,'$127.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4NDAxNzUxOTY4OTY3NzE3OjE3MDMwMjAzMjY6c3BfYXRmX25leHQ6MzAwMDk0NDQyNTY4OTAyOjowOjo&url=%2FEUNA-Kitchen-Japanese-Stainless-Professional%2Fdp%2FB0B9GWQN4W%2Fref%3Dsr_1_52_sspa%3Fkeywords%3Dkitchen%26qid%3D1703020326%26sr%3D8-52-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGZfbmV4dA%26psc%3D1',43,'2023-12-19 15:12:07.508727-06','2023-12-19 15:12:07.508727-06','www.amazon.com'), + (3233,'Refrigerator Deodorizer,Lasts for 10 Years,Refrigerator Odor Eliminator,Fridge Deodorizer,Beats Baking Soda and Bamboo Charcoal Air Purifying Bags',NULL,'B09VZ11WHK','https://m.media-amazon.com/images/I/71Yk6yF+UsL._AC_UL320_.jpg',3175,4.4,'$22.39','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Refrigerator-Deodorizer-Eliminator-Charcoal-Purifying/dp/B09VZ11WHK/ref=sr_1_53?keywords=kitchen&qid=1703020326&sr=8-53',43,'2023-12-19 15:12:07.51736-06','2023-12-19 15:12:07.51736-06','www.amazon.com'), + (3234,'Mattitude Kitchen Mat [2 PCS] Cushioned Anti-Fatigue Non-Skid Waterproof Rugs Ergonomic Comfort Standing Mat for Kitchen, Floor, Office, Sink, Laundry, Black and Gray',NULL,'B09B6TZ5J2','https://m.media-amazon.com/images/I/810fh1ps0PL._AC_UL320_.jpg',18345,4.2,'$32.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Mattitude-Cushioned-Anti-Fatigue-Waterproof-Ergonomic/dp/B09B6TZ5J2/ref=sr_1_54?keywords=kitchen&qid=1703020326&sr=8-54',43,'2023-12-19 15:12:07.528545-06','2023-12-19 15:12:07.528545-06','www.amazon.com'), + (3235,'Extra Large Cutting Boards, Plastic Cutting Boards for Kitchen (Set of 3), Dark Grey',NULL,'B09XQR4HTH','https://m.media-amazon.com/images/I/812M9V2sbtL._AC_UL320_.jpg',2564,4.7,'$26.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Extra-Cutting-Boards-Plastic-Kitchen/dp/B09XQR4HTH/ref=sr_1_55?keywords=kitchen&qid=1703020326&sr=8-55',43,'2023-12-19 15:12:07.537841-06','2023-12-19 15:12:07.537841-06','www.amazon.com'), + (3236,'Skroam 36 Pack Food Storage Containers with lids (18 Airtight Kitchen Storage Containers & 18 Lids), Plastic BPA-Free Meal Prep Container for Pantry Organizers and Storage with Free Labels & Marker',NULL,'B0C5M9W2G5','https://m.media-amazon.com/images/I/81mYgk0KBEL._AC_UL320_.jpg',583,4.4,'$26.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Skroam-Containers-Airtight-Container-Organizers/dp/B0C5M9W2G5/ref=sr_1_56?keywords=kitchen&qid=1703020326&sr=8-56',43,'2023-12-19 15:12:07.546556-06','2023-12-19 15:12:07.546556-06','www.amazon.com'), + (3237,'LANE LINEN Kitchen Towels Set - Pack of 6 Cotton Dish Towels for Drying Dishes, 18”x 28”, Kitchen Hand Towels, Absorbent Tea Towels, Dish Towels for Kitchen, Quick Drying Kitchen Towel Set - Olive',NULL,'B0BN5PBY7G','https://m.media-amazon.com/images/I/91l1gmc0wPL._AC_UL320_.jpg',2184,4.6,'$11.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/LANE-LINEN-Kitchen-Towels-Set/dp/B0BN5PBY7G/ref=sr_1_57?keywords=kitchen&qid=1703020326&sr=8-57',43,'2023-12-19 15:12:07.558641-06','2023-12-19 15:12:07.558641-06','www.amazon.com'), + (3238,'TEMI Pretend Food Kitchen Toys for Kids Ages 4-8, Kitchen Set for Toddlers 1-3, Play Kitchen Accessories w/Real Sounds Light, for Boys, Girls',NULL,'B0B9N6S6DN','https://m.media-amazon.com/images/I/714VCiExu7L._AC_UL320_.jpg',652,3.4,'$79.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/TEMI-Play-Kitchen-Girls-Pretend/dp/B0B9N6S6DN/ref=sr_1_58?keywords=kitchen&qid=1703020326&sr=8-58',43,'2023-12-19 15:12:07.570198-06','2023-12-19 15:12:07.570198-06','www.amazon.com'), + (3239,'Homergy Anti Fatigue Kitchen Mats for Floor 2 PCS, Memory Foam Cushioned Rugs, Comfort Standing Desk Mats for Office, Home, Laundry Room, Waterproof & Ergonomic, 17.3×30.3 & 17.3×59, Fabric Grey',NULL,'B0BMM1FDK4','https://m.media-amazon.com/images/I/91xf7opfvOL._AC_UL320_.jpg',4355,4.4,'$27.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4NDAxNzUxOTY4OTY3NzE3OjE3MDMwMjAzMjY6c3BfbXRmOjIwMDEyNzAzMDY4NjA5ODo6MDo6&url=%2FHomergy-Cushioned-Waterproof-Ergonomic-17-3x30-3%2Fdp%2FB0BMM1FDK4%2Fref%3Dsr_1_59_sspa%3Fkeywords%3Dkitchen%26qid%3D1703020326%26sr%3D8-59-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',43,'2023-12-19 15:12:07.577962-06','2023-12-19 15:12:07.577962-06','www.amazon.com'), + (3240,'SZFIXEZ Electric Spin Scrubber with 3 Speeds & LED Display, Shower Scrubber for Cleaning, Cordless Cleaning Brush with Adjustable & Detachable, 9 Replaceable Brush Heads for Tile Tub Bathroom TD-8136',NULL,'B0CBRGTZ51','https://m.media-amazon.com/images/I/81o0a8o-VqL._AC_UL320_.jpg',34,4.3,'$49.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4NDAxNzUxOTY4OTY3NzE3OjE3MDMwMjAzMjY6c3BfbXRmOjMwMDA2NDg0ODUxNDcwMjo6MDo6&url=%2FSZFIXEZ-Adjustable-Detachable-Replaceable-TD-8136%2Fdp%2FB0CBRGTZ51%2Fref%3Dsr_1_60_sspa%3Fkeywords%3Dkitchen%26qid%3D1703020326%26sr%3D8-60-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',43,'2023-12-19 15:12:07.587426-06','2023-12-19 15:12:07.587426-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3241,'kelamayi Broom and Dustpan Set for Home, Office, Indoor&Outdoor Sweeping, Stand Up Broom and Dustpan (Black&Gray)',NULL,'B0BRK83JY7','https://m.media-amazon.com/images/I/61F-EPvYxLL._AC_UL320_.jpg',25692,4.3,'$21.59','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4NDAxNzUxOTY4OTY3NzE3OjE3MDMwMjAzMjY6c3BfbXRmOjIwMDE1MjE4Njg3ODY5ODo6MDo6&url=%2Fkelamayi-Broom-Dustpan-Office-Stand%2Fdp%2FB0BRK83JY7%2Fref%3Dsr_1_61_sspa%3Fkeywords%3Dkitchen%26qid%3D1703020326%26sr%3D8-61-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',43,'2023-12-19 15:12:07.599705-06','2023-12-19 15:12:07.599705-06','www.amazon.com'), + (3242,'Pipishell Bamboo Expandable Drawer Organizer for Utensils Holder, Adjustable Cutlery Tray, Wood Drawer Dividers Organizer for Silverware, Flatware, Knives in Kitchen, Bedroom, Living Room',NULL,'B07SRV3SN8','https://m.media-amazon.com/images/I/71GOS3L3BML._AC_UL320_.jpg',38152,4.7,'$29.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4NDAxNzUxOTY4OTY3NzE3OjE3MDMwMjAzMjY6c3BfbXRmOjIwMDA2MzgxMDIxMzE5ODo6MDo6&url=%2FExpandable-Organizer-Adjustable-Silverware-Pipishell%2Fdp%2FB07SRV3SN8%2Fref%3Dsr_1_62_sspa%3Fkeywords%3Dkitchen%26qid%3D1703020326%26sr%3D8-62-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',43,'2023-12-19 15:12:07.611538-06','2023-12-19 15:12:07.611538-06','www.amazon.com'), + (3243,'Plastic Cutting Coards for Kitchen, 3-Piece Large Cutting Board Set Dishwasher Safe Chopping Boards with Non-slip Feet and Juice Grooves, Kikcoin',NULL,'B0CCTNBJYD','https://m.media-amazon.com/images/I/81t0h7wskjL._AC_UL320_.jpg',2697,4.7,'$17.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Plastic-Dishwasher-Chopping-Non-slip-Kikcoin/dp/B0CCTNBJYD/ref=sr_1_63?keywords=kitchen&qid=1703020326&sr=8-63',43,'2023-12-19 15:12:07.621422-06','2023-12-19 15:12:07.621422-06','www.amazon.com'), + (3244,'Step2 Modern Metro Kitchen Set for Kids – Includes 30+ Toy Kitchen Accessories, Interactive Features for Pretend Play – Indoor/Outdoor Toddler Playset – Dimensions 44.75" H x 46.5" W x 13.5" D',NULL,'B073FWDJ5B','https://m.media-amazon.com/images/I/71juHyi1E1S._AC_UL320_.jpg',510,4.8,'$189.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Step2-Modern-Metro-Kitchen-Play/dp/B073FWDJ5B/ref=sr_1_64?keywords=kitchen&qid=1703020326&sr=8-64',43,'2023-12-19 15:12:07.630263-06','2023-12-19 15:12:07.630263-06','www.amazon.com'), + (3245,'Etekcity Food Scale, Digital Kitchen Scale, 304 Stainless Steel, Weight in Grams and Ounces for Baking, Cooking, and Meal Prep, LCD Display, Medium',NULL,'B0113UZJE2','https://m.media-amazon.com/images/I/7157x4p8zTL._AC_UL320_.jpg',149935,4.6,'$13.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Etekcity-Multifunction-Stainless-Batteries-Included/dp/B0113UZJE2/ref=sr_1_65?keywords=kitchen&qid=1703020326&sr=8-65',43,'2023-12-19 15:12:07.639131-06','2023-12-19 15:12:07.639131-06','www.amazon.com'), + (3246,'24-Piece Black Silverware Set with Steak Knives, Black Flatware Set for 4, Food-Grade Stainless Steel Tableware Cutlery Set, Mirror Finished Utensil Sets for Home Restaurant',NULL,'B0BYX1XT81','https://m.media-amazon.com/images/I/71vZ7TGZW1L._AC_UL320_.jpg',1189,4.6,'$16.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Silverware-Food-Grade-Stainless-Tableware-Restaurant/dp/B0BYX1XT81/ref=sr_1_66?keywords=kitchen&qid=1703020326&sr=8-66',43,'2023-12-19 15:12:07.651274-06','2023-12-19 15:12:07.651274-06','www.amazon.com'), + (3247,'WEZVIX Non-Skid Kitchen Rugs and Mats Waterproof, Anti Fatigue Mat 2 PCS, 1/2 Inch Thick Floor Mat, Ergonomic Comfort Foam Standing for Floor, Office, Sink, Laundry - Grey',NULL,'B0BRZRJRY2','https://m.media-amazon.com/images/I/61yoCOOHOAL._AC_UL320_.jpg',340,4.5,'$29.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4NDAxNzUxOTY4OTY3NzE3OjE3MDMwMjAzMjY6c3BfbXRmOjMwMDAyMzM0MjM5MzIwMjo6MDo6&url=%2FWEZVIX-Non-Skid-Waterproof-Ergonomic-Standing%2Fdp%2FB0BRZRJRY2%2Fref%3Dsr_1_67_sspa%3Fkeywords%3Dkitchen%26qid%3D1703020326%26sr%3D8-67-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',43,'2023-12-19 15:12:07.661606-06','2023-12-19 15:12:07.661606-06','www.amazon.com'), + (3248,'ComfiLife Anti Fatigue Floor Mat – 3/4 Inch Thick Perfect Kitchen Mat, Standing Desk Mat – Comfort at Home, Office, Garage – Durable – Stain Resistant – Non-Slip Bottom (20" x 32", Black)',NULL,'B0797Q5HL7','https://m.media-amazon.com/images/I/81GvNnbHEhL._AC_UL320_.jpg',34744,4.8,'$45.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4NDAxNzUxOTY4OTY3NzE3OjE3MDMwMjAzMjY6c3BfbXRmOjIwMDA5NDQ2NjQxNTA5ODo6MDo6&url=%2FComfiLife-Anti-Fatigue-Floor-Mat%2Fdp%2FB0797Q5HL7%2Fref%3Dsr_1_68_sspa%3Fkeywords%3Dkitchen%26qid%3D1703020326%26sr%3D8-68-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',43,'2023-12-19 15:12:07.671865-06','2023-12-19 15:12:07.671865-06','www.amazon.com'), + (3249,'IRONCK Rolling Kitchen Island Table on Wheels with Drop Leaf, Storage Cabinet, Drawer, Spice Rack, Towel Rack, Kitchen Cart, White',NULL,'B09P3KT1MK','https://m.media-amazon.com/images/I/711YwBcNOZL._AC_UL320_.jpg',669,4.4,'$159.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4NDAxNzUxOTY4OTY3NzE3OjE3MDMwMjAzMjY6c3BfbXRmOjMwMDA2MDQyNjM2NjUwMjo6MDo6&url=%2FIRONCK-Kitchen-Storage-Rolling-Cabinet%2Fdp%2FB09P3KT1MK%2Fref%3Dsr_1_69_sspa%3Fkeywords%3Dkitchen%26qid%3D1703020326%26sr%3D8-69-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',43,'2023-12-19 15:12:07.686352-06','2023-12-19 15:12:07.686352-06','www.amazon.com'), + (3250,'HOSHANHO Kitchen Knife Set with Block 18-Piece, Super Sharp German High Carbon Stainless Steel Chef Knife Set, Professional Cutlery Knife Set with Sharpener',NULL,'B0CD7FMZ67','https://m.media-amazon.com/images/I/81us0U61d-L._AC_UL320_.jpg',27,4.7,'$189.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4NDAxNzUxOTY4OTY3NzE3OjE3MDMwMjAzMjY6c3BfbXRmOjMwMDEwMDAyMDk0NjUwMjo6MDo6&url=%2FHOSHANHO-Knife-Set-Stainless-Professional%2Fdp%2FB0CD7FMZ67%2Fref%3Dsr_1_70_sspa%3Fkeywords%3Dkitchen%26qid%3D1703020326%26sr%3D8-70-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',43,'2023-12-19 15:12:07.696833-06','2023-12-19 15:12:07.696833-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3251,'Joined Cheese Grater with Container - Box Grater Cheese Shredder Lemon Zester - Cheese Grater with Handle - Graters for Kitchen Stainless Steel Food Grater - Garlic Mincer Tool and Vegetable Peeler',NULL,'B0BVPRC8B6','https://m.media-amazon.com/images/I/81gcyKUxYFL._AC_UL320_.jpg',355,4.7,'$15.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Joined-Cheese-Grater-Container-Stainless/dp/B0BVPRC8B6/ref=sr_1_71?keywords=kitchen&qid=1703020326&sr=8-71',43,'2023-12-19 15:12:07.706619-06','2023-12-19 15:12:07.706619-06','www.amazon.com'), + (3252,'Rubbermaid Brilliance BPA Free Food Storage Containers with Lids, Airtight, for Lunch, Meal Prep, and Leftovers, Set of 22',NULL,'B07X64Z8RM','https://m.media-amazon.com/images/I/91rRZWaom+L._AC_UL320_.jpg',80248,4.7,'$113.50','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Rubbermaid-2108389-Brilliance-44-Piece-Container/dp/B07X64Z8RM/ref=sr_1_72?keywords=kitchen&qid=1703020326&sr=8-72',43,'2023-12-19 15:12:07.715693-06','2023-12-19 15:12:07.715693-06','www.amazon.com'), + (3253,'OXO Good Grips Stainless Steel Scraper & Chopper,Silver/Black',NULL,'B00004OCNJ','https://m.media-amazon.com/images/I/71gLUMMtFmL._AC_UL320_.jpg',15723,4.8,'$11.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/OXO-Multi-purpose-Stainless-Scraper-Chopper/dp/B00004OCNJ/ref=sr_1_73?keywords=kitchen&qid=1703020326&sr=8-73',43,'2023-12-19 15:12:07.727735-06','2023-12-19 15:12:07.727735-06','www.amazon.com'), + (3416,'GUM - 6504R6 Soft-Picks Advanced Dental Picks, 60 Count (Pack of 6)',NULL,'B07B91ZNT5','https://m.media-amazon.com/images/I/71dbbThsRFL._AC_UL320_.jpg',706,4.7,'$21.54','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Sunstar-6504R-Soft-Picks-Advanced-Pack/dp/B07B91ZNT5/ref=sr_1_34?keywords=dental&qid=1703020352&sr=8-34',45,'2023-12-19 15:12:33.317288-06','2023-12-19 15:12:33.317288-06','www.amazon.com'), + (3254,'COOK WITH COLOR Prep Bowls - Wide Mixing Bowls Nesting Plastic Meal Prep Bowl Set with Lids - Small Bowls Food Containers in Multiple Sizes (Blue Ombre)',NULL,'B08L6XRCFS','https://m.media-amazon.com/images/I/51JeHs8rEGL._AC_UL320_.jpg',5223,4.6,'$18.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Cook-Color-Mixing-Bowls-Nesting/dp/B08L6XRCFS/ref=sr_1_74?keywords=kitchen&qid=1703020326&sr=8-74',43,'2023-12-19 15:12:07.739913-06','2023-12-19 15:12:07.739913-06','www.amazon.com'), + (3255,'Amazon Basics Flextra Tall Kitchen Drawstring Trash Bags, Fresh Scent, 13 Gallon, 90 Count',NULL,'B092VQDGWL','https://m.media-amazon.com/images/I/711F2roOZ3L._AC_UL320_.jpg',12662,4.5,'$13.36','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Amazon-Basics-Flextra-Kitchen-Drawstring/dp/B092VQDGWL/ref=sr_1_75?keywords=kitchen&qid=1703020326&sr=8-75',43,'2023-12-19 15:12:07.748918-06','2023-12-19 15:12:07.748918-06','www.amazon.com'), + (3256,'Umite Chef Kitchen Cooking Utensils Set, 33 pcs Non-Stick Silicone Cooking Kitchen Utensils Spatula Set with Holder, Wooden Handle Silicone Kitchen Gadgets Utensil Set (Khaki)',NULL,'B08573DQ39','https://m.media-amazon.com/images/I/71fk8luIIaL._AC_UL320_.jpg',22637,4.5,'$23.75','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Umite-Chef-Utensils-Non-stick-Resistant/dp/B08573DQ39/ref=sr_1_76?keywords=kitchen&qid=1703020326&sr=8-76',43,'2023-12-19 15:12:07.761049-06','2023-12-19 15:12:07.761049-06','www.amazon.com'), + (3257,'2 Pcs Oven Mitts for Kitchen Heat Resistant Oven Gloves, Soft Cotton Lining, Anti-Slip Silicone Stripe Oven Mitts Heat Resistant Oven Mits, Kitchen Mitt Pair Protect Hands, Cooking Baking BBQ Gloves',NULL,'B0CDWLXC22','https://m.media-amazon.com/images/I/719UqulabpL._AC_UL320_.jpg',52,4.3,'$8.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Kitchen-Resistant-Anti-Slip-Silicone-Protect/dp/B0CDWLXC22/ref=sr_1_77?keywords=kitchen&qid=1703020326&sr=8-77',43,'2023-12-19 15:12:07.773301-06','2023-12-19 15:12:07.773301-06','www.amazon.com'), + (3258,'Infinitee Xclusives Premium Kitchen Towels – Pack of 3, 100% Cotton 15 x 25 Inches Absorbent Dish Towels - Terry Kitchen Dishcloth Towels - Grey Dish Cloth for Household Cleaning',NULL,'B0BX9PRWT1','https://m.media-amazon.com/images/I/71jhJ0LkQuL._AC_UL320_.jpg',5295,4.7,'$7.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Infinitee-Xclusives-Premium-Kitchen-Towels/dp/B0BX9PRWT1/ref=sr_1_78?keywords=kitchen&qid=1703020326&sr=8-78',43,'2023-12-19 15:12:07.782545-06','2023-12-19 15:12:07.782545-06','www.amazon.com'), + (3259,'Glad ForceFlex Tall Kitchen Drawstring Trash Bags, 13 Gallon Trash Bag, Gain Lavender with Febreze Freshness, 110 Count',NULL,'B09QDZM9N5','https://m.media-amazon.com/images/I/81Sd34rKtML._AC_UL320_.jpg',712,4.7,'$21.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Glad-ForceFlex-Drawstring-Lavender-Freshness/dp/B09QDZM9N5/ref=sr_1_79?keywords=kitchen&qid=1703020326&sr=8-79',43,'2023-12-19 15:12:07.792754-06','2023-12-19 15:12:07.792754-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3260,'Dealusy 4 Set Glass Cups with Lids and Straws 16 oz, Glasses Drinking Set, Iced Coffee Cup with Bamboo Lids, Drinking Glasses Tumbler with Straw and Lid, Glass Can Drinking Glassware, 2 Brushes',NULL,'B0CBQJ8KN8','https://m.media-amazon.com/images/I/719q3kfsQAL._AC_UL320_.jpg',385,4.6,'$16.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Dealusy-Glasses-Drinking-Tumbler-Glassware/dp/B0CBQJ8KN8/ref=sr_1_80?keywords=kitchen&qid=1703020326&sr=8-80',43,'2023-12-19 15:12:07.801423-06','2023-12-19 15:12:07.801423-06','www.amazon.com'), + (3261,'Walfos Silicone Trivet Mats - 4 Heat Resistant Pot Holders, Multipurpose Non-Slip Hot Pads for Kitchen Potholders, Hot Dishers, Jar Opener, Spoon Holder, Food Grade Silicone & BPA Free (Black)',NULL,'B08JLB2PQ2','https://m.media-amazon.com/images/I/71CAGFBE5hL._AC_UL320_.jpg',5292,4.7,'$9.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Walfos-Silicone-Trivet-Mats-Multipurpose/dp/B08JLB2PQ2/ref=sr_1_81?keywords=kitchen&qid=1703020326&sr=8-81',43,'2023-12-19 15:12:07.813898-06','2023-12-19 15:12:07.813898-06','www.amazon.com'), + (3262,'Copco KitchenAid All Purpose Kitchen Shears with Protective Sheath for Everyday use, Dishwasher Safe Stainless Steel Scissors with Comfort Grip, 8.72-Inch, Black',NULL,'B07PZF3QS3','https://m.media-amazon.com/images/I/51Byq+vTy1L._AC_UL320_.jpg',54672,4.8,'$8.44','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/KitchenAid-Protective-Dishwasher-Stainless-8-72-Inch/dp/B07PZF3QS3/ref=sr_1_82?keywords=kitchen&qid=1703020326&sr=8-82',43,'2023-12-19 15:12:07.823023-06','2023-12-19 15:12:07.823023-06','www.amazon.com'), + (3263,'Pyrex 3 Piece Glass Measuring Cup Set, Includes 1-Cup, 2-Cup, and 4-Cup Tempered Glass Liquid Measuring Cups, Dishwasher, Freezer, Microwave, and Preheated Oven Safe, Essential Kitchen Tools',NULL,'B00M2J7PCI','https://m.media-amazon.com/images/I/71ygLu2o0OL._AC_UL320_.jpg',56372,4.8,'$22.69','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Pyrex-Measuring-Cups-3-Piece-Clear/dp/B00M2J7PCI/ref=sr_1_83?keywords=kitchen&qid=1703020326&sr=8-83',43,'2023-12-19 15:12:07.831607-06','2023-12-19 15:12:07.831607-06','www.amazon.com'), + (3505,'Champion',NULL,'B078GFYJKL','https://m.media-amazon.com/images/I/51IYUl2w5AL._AC_UL320_.jpg',66264,4.7,'$27.50','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Champion-Graphic-Powerblend-Fleece-Scarlet/dp/B078GFYJKL/ref=sr_1_5?keywords=men%27s+clothing&qid=1703020369&sr=8-5',46,'2023-12-19 15:12:50.805433-06','2023-12-19 15:12:50.805433-06','www.amazon.com'), + (3264,'Sakugi Dish Drying Rack - X-Large Stainless Steel Dish Rack for Kitchen Counter, Kitchen Organizers and Storage for Dishes, Bowls, Cutlery, Black',NULL,'B0CBS79SCD','https://m.media-amazon.com/images/I/819zf0AMM2L._AC_UL320_.jpg',1747,4.4,'$25.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Sakugi-Dish-X-Large-Stainless-Kitchen-Kitchen-Organizers/dp/B0CBS79SCD/ref=sr_1_84?keywords=kitchen&qid=1703020326&sr=8-84',43,'2023-12-19 15:12:07.842594-06','2023-12-19 15:12:07.842594-06','www.amazon.com'), + (3265,'ROYAL CRAFT WOOD Wooden Cutting Boards for Kitchen Meal Prep & Serving - Bamboo Wood Serving Board Set with Deep Juice Groove Side Handles - Charcuterie & Chopping Butcher Block for Meat (3 Pcs)',NULL,'B0CJ2YTKSY','https://m.media-amazon.com/images/I/81Bf+stbPPL._AC_UL320_.jpg',27738,4.6,'$27.87','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/ROYAL-CRAFT-WOOD-Cutting-Kitchen/dp/B0CJ2YTKSY/ref=sr_1_85?keywords=kitchen&qid=1703020326&sr=8-85',43,'2023-12-19 15:12:07.853414-06','2023-12-19 15:12:07.853414-06','www.amazon.com'), + (3266,'Kitchen Shears - QtoiKce Kitchen Scissors Heavy Duty Stainless Steel Food Shears for Cutting Meat, Fish, Poultry Shears Multipurpose Utility Scissors',NULL,'B0CKTKT59V','https://m.media-amazon.com/images/I/512fx2754mL._AC_UL320_.jpg',2,5.0,'$3.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Kitchen-Shears-Scissors-Stainless-Multipurpose/dp/B0CKTKT59V/ref=sr_1_87?keywords=kitchen&qid=1703020326&sr=8-87',43,'2023-12-19 15:12:07.862716-06','2023-12-19 15:12:07.862716-06','www.amazon.com'), + (3267,'Meat Chopper, Hamburger Chopper Utensil, Professional Heat Resistant Nylon, Masher & Smasher Meat, Potato Masher Ground Beef & Turkey -Non Stick Mix Chopper for Kitchen Tool',NULL,'B092J886NK','https://m.media-amazon.com/images/I/516PFlbwTML._AC_UL320_.jpg',4063,4.6,'$5.30','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/hamburger-Professional-Multifunctional-Resistant-Non-Stick/dp/B092J886NK/ref=sr_1_88?keywords=kitchen&qid=1703020326&sr=8-88',43,'2023-12-19 15:12:07.872525-06','2023-12-19 15:12:07.872525-06','www.amazon.com'), + (3268,'WISELIFE Dish Drying Mat Coffee Mat Super Absorbent Drying Mat Large Dish Drying Mats for Kitchen Counter Easy clean Dish Mat Kitchen Drying Mat 15" x 18" Grey',NULL,'B0C77R396Q','https://m.media-amazon.com/images/I/71Oj3y8SdWL._AC_UL320_.jpg',340,4.4,'$9.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/WISELIFE-Drying-Absorbent-Kitchen-Counter/dp/B0C77R396Q/ref=sr_1_89?keywords=kitchen&qid=1703020326&sr=8-89',43,'2023-12-19 15:12:07.882419-06','2023-12-19 15:12:07.882419-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3269,'Glad ForceFlex Tall Kitchen Drawstring Trash Bags, 13 Gal, Unscented, 120 Ct (Packaging May Vary)',NULL,'B087NN1L8W','https://m.media-amazon.com/images/I/71TmWKgkg5L._AC_UL320_.jpg',67381,4.7,'$20.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Glad-ForceFlex-Kitchen-Drawstring-Unscented/dp/B087NN1L8W/ref=sr_1_90?keywords=kitchen&qid=1703020326&sr=8-90',43,'2023-12-19 15:12:07.89541-06','2023-12-19 15:12:07.89541-06','www.amazon.com'), + (3270,'Cuisinart Large Spin Stop Salad Spinner- Wash, Spin & Dry Salad Greens, Fruits & Vegetables, 5qt, CTG-00-SAS1',NULL,'B0CCB7HTN8','https://m.media-amazon.com/images/I/71gjdE47JNL._AC_UL320_.jpg',9505,4.5,'$24.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Cuisinart-Spinner-Greens-Vegetables-CTG-00-SAS1/dp/B0CCB7HTN8/ref=sr_1_91?keywords=kitchen&qid=1703020326&sr=8-91',43,'2023-12-19 15:12:07.905981-06','2023-12-19 15:12:07.905981-06','www.amazon.com'), + (3271,'TrendPlain 16oz Oil Dispenser Bottle for Kitchen - 2 in 1 Olive Oil Dispenser and Oil Sprayer - 470ml Olive Oil Bottle - Oil Sprayer for Cooking, Kitchen, Salad, Barbecue Black',NULL,'B0CJF94M8J','https://m.media-amazon.com/images/I/81PRchbqh2L._AC_UL320_.jpg',17,4.9,'$9.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/TrendPlain-16oz-Dispenser-Bottle-Kitchen/dp/B0CJF94M8J/ref=sr_1_92?keywords=kitchen&qid=1703020326&sr=8-92',43,'2023-12-19 15:12:07.915834-06','2023-12-19 15:12:07.915834-06','www.amazon.com'), + (3272,'Runnatal Large Dish Drying Rack with Drainboard Set, Detachable 2-in-1 Large-Capacity 2-Tier Over The Sink and Drainer for Kitchen Counter',NULL,'B0BTYQYDJB','https://m.media-amazon.com/images/I/81+-p1KjCmL._AC_UL320_.jpg',287,4.4,'$33.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Runnatal-Drainboard-Detachable-Large-Capacity-Drainer/dp/B0BTYQYDJB/ref=sr_1_93?keywords=kitchen&qid=1703020326&sr=8-93',43,'2023-12-19 15:12:07.927605-06','2023-12-19 15:12:07.927605-06','www.amazon.com'), + (3273,'EyeVac Home Touchless Vacuum Automatic Dustpan - Great for Sweeping Salon Pet Hair Food Dirt Kitchen - Ultra Fast & Powerful, Corded Canister Vacuum, Bagless, Automatic Sensors, 1000 Watt (White)',NULL,'B00RVMC58U','https://m.media-amazon.com/images/I/519GnS9rODL._AC_UL320_.jpg',10830,4.7,'$149.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/EyeVac-Touchless-Stationary-Filtration-Automatic/dp/B00RVMC58U/ref=sr_1_94?keywords=kitchen&qid=1703020326&sr=8-94',43,'2023-12-19 15:12:07.937209-06','2023-12-19 15:12:07.937209-06','www.amazon.com'), + (3274,'Glad ForceFlex Tall Kitchen Drawstring Trash Bags, 13 Gal, Fresh Clean Scent with Febreze, 110 Ct',NULL,'B00FQT4LX2','https://m.media-amazon.com/images/I/81sSgUhdALL._AC_UL320_.jpg',93293,4.7,'$21.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Glad-Tall-Kitchen-Drawstring-Trash/dp/B00FQT4LX2/ref=sr_1_95?keywords=kitchen&qid=1703020326&rdc=1&sr=8-95',43,'2023-12-19 15:12:07.947398-06','2023-12-19 15:12:07.947398-06','www.amazon.com'), + (3275,'Kitchen Utensils Set- 35 PCs Cooking Utensils with Grater,Tongs, Spoon Spatula &Turner Made of Heat Resistant Food Grade Silicone and Wooden Handles Kitchen Gadgets Tools Set for Nonstick Cookware',NULL,'B094PTSRP9','https://m.media-amazon.com/images/I/71yxPx0ekLS._AC_UL320_.jpg',1981,4.5,'$34.39','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Utensils-Resistant-Silicone-Nonstick-Cookware/dp/B094PTSRP9/ref=sr_1_96?keywords=kitchen&qid=1703020326&sr=8-96',43,'2023-12-19 15:12:07.95826-06','2023-12-19 15:12:07.95826-06','www.amazon.com'), + (3276,'HuggieGems 4 Pack Magnetic Spice Rack Organizer for Refrigerator and Microwave Oven, Metal Fridge Shelf for Kitchen, Black',NULL,'B0BV76WW86','https://m.media-amazon.com/images/I/81qpfcwwKkL._AC_UL320_.jpg',364,4.7,'$26.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/HuggieGems-Magnetic-Organizer-Refrigerator-Microwave/dp/B0BV76WW86/ref=sr_1_97?keywords=kitchen&qid=1703020326&sr=8-97',43,'2023-12-19 15:12:07.968439-06','2023-12-19 15:12:07.968439-06','www.amazon.com'), + (3277,'Rotating Spice Rack with Free 20 Seasoning Jars,Revolving Tower Organizer Stainless Steel for Kitchen Storage,with Reusable Labels and Funnel complete set',NULL,'B0991RD875','https://m.media-amazon.com/images/I/71slT2UOz3L._AC_UL320_.jpg',551,4.6,'$26.79','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Organizer-Seasoning-Revolving-Stainless-Kitchen-Storage/dp/B0991RD875/ref=sr_1_98?keywords=kitchen&qid=1703020326&sr=8-98',43,'2023-12-19 15:12:07.979446-06','2023-12-19 15:12:07.979446-06','www.amazon.com'), + (3278,'Pots and Pans Organizer Under Cabinet - 8-Tier Adjustable Pan Organizer Rack for Cabinet - Heavy-Duty Pot & Pan Organizer - Perfect to Store Pots, Pans, Lids - Easy Kitchen Organization and Storage',NULL,'B0C1N9SWDZ','https://m.media-amazon.com/images/I/718uB7VNk8L._AC_UL320_.jpg',64,4.6,'$22.97','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Pots-Pans-Organizer-Cabinet-Adjustable/dp/B0C1N9SWDZ/ref=sr_1_99?keywords=kitchen&qid=1703020326&sr=8-99',43,'2023-12-19 15:12:07.993173-06','2023-12-19 15:12:07.993173-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3279,'Joined Cheese Grater with Container - Box Grater Cheese Shredder Lemon Zester Grater - Cheese Grater with Handle - Graters for Kitchen Stainless Steel Food Grater - Hand Grater and Vegetable Peeler',NULL,'B0B1MCRR88','https://m.media-amazon.com/images/I/91Ty2ymWINL._AC_UL320_.jpg',1225,4.6,'$14.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Joined-Cheese-Grater-Container-Stainless/dp/B0B1MCRR88/ref=sr_1_100?keywords=kitchen&qid=1703020326&sr=8-100',43,'2023-12-19 15:12:08.004369-06','2023-12-19 15:12:08.004369-06','www.amazon.com'), + (3280,'3-In-1 Sponge Holder for Kitchen Sink, 2 Suspension Options(Suction Cups & Adhesive Hook), Hanging Sink Caddy Organizer Rack - Sponge, Dish Cloth, Brush, Scrubber, Soap Tray, 304 Stainless Steel',NULL,'B0BFPQBKJ5','https://m.media-amazon.com/images/I/81VfuNGFXUL._AC_UL320_.jpg',1086,4.4,'$9.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Kitchen-Suspension-Options-Adhesive-Organizer/dp/B0BFPQBKJ5/ref=sr_1_101?keywords=kitchen&qid=1703020326&sr=8-101',43,'2023-12-19 15:12:08.014417-06','2023-12-19 15:12:08.014417-06','www.amazon.com'), + (3281,'Kitchen Mama Auto Electric Can Opener Christmas Gift Ideas: Open Your Cans with A Simple Press of Button - Automatic, Hands Free, Smooth Edge, Food-Safe, Battery Operated, YES YOU CAN (Red)',NULL,'B07FVQLBL3','https://m.media-amazon.com/images/I/61eqNRPW8mL._AC_UL320_.jpg',92204,4.3,'$29.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Kitchen-Mama-Automatic-Electric-Opener/dp/B07FVQLBL3/ref=sr_1_102?keywords=kitchen&qid=1703020326&sr=8-102',43,'2023-12-19 15:12:08.026947-06','2023-12-19 15:12:08.026947-06','www.amazon.com'), + (3282,'Cuisinart TOB-40FR Custom Classic Toaster Oven Broiler, Silver (Renewed)',NULL,'B00M13RBBU','https://m.media-amazon.com/images/I/61OazbjpleL._AC_UL320_.jpg',279,4.1,'$69.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Cuisinart-TOB-40FR-Classic-Toaster-Broiler/dp/B00M13RBBU/ref=sr_1_104?keywords=kitchen&qid=1703020326&sr=8-104',43,'2023-12-19 15:12:08.037815-06','2023-12-19 15:12:08.037815-06','www.amazon.com'), + (3283,'BLACK+DECKER 10-Speed Countertop Blender with 48oz Glass Jar and 4-point Stainless Steel Blade',NULL,'B00OW16ZR0','https://m.media-amazon.com/images/I/81n-9sDsr6L._AC_UL320_.jpg',18728,4.2,'$32.79','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/BLACK-DECKER-Countertop-10-Speed-BL2010BG/dp/B00OW16ZR0/ref=sr_1_105?keywords=kitchen&qid=1703020326&sr=8-105',43,'2023-12-19 15:12:08.046975-06','2023-12-19 15:12:08.046975-06','www.amazon.com'), + (3284,'SpaceAid Glass Spice Drawer Organizer with 28 Spice Jars, 386 Labels and Chalk Marker, 4 Tier Seasoning Rack Tray Insert for Kitchen Drawers, 13" Wide x 17.5" Deep, Black',NULL,'B09GB35JP1','https://m.media-amazon.com/images/I/81xRAYijFhL._AC_UL320_.jpg',3785,4.8,'$32.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/SpaceAid-Organizer-Seasoning-Kitchen-Drawers/dp/B09GB35JP1/ref=sr_1_106?keywords=kitchen&qid=1703020326&sr=8-106',43,'2023-12-19 15:12:08.055901-06','2023-12-19 15:12:08.055901-06','www.amazon.com'), + (3506,'Lexiart',NULL,'B07Y9MBKSN','https://m.media-amazon.com/images/I/71eCUo9NGUL._AC_UL320_.jpg',29464,4.1,'$23.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/lexiart-Fashion-Athletic-Sweatshirt-Pullover/dp/B07Y9MBKSN/ref=sr_1_6?keywords=men%27s+clothing&qid=1703020369&sr=8-6',46,'2023-12-19 15:12:50.811868-06','2023-12-19 15:12:50.811868-06','www.amazon.com'), + (3285,'HIWARE 48-Piece Silverware Set with Steak Knives for 8, Stainless Steel Flatware Cutlery Set For Home Kitchen Restaurant Hotel, Kitchen Utensils Set, Mirror Polished, Dishwasher Safe',NULL,'B07ZVC6DMM','https://m.media-amazon.com/images/I/71f6drMnaaL._AC_UL320_.jpg',18746,4.5,'$25.49','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/40-Piece-Silverware-Stainless-Restaurant-Dishwasher/dp/B07ZVC6DMM/ref=sr_1_107?keywords=kitchen&qid=1703020326&sr=8-107',43,'2023-12-19 15:12:08.066869-06','2023-12-19 15:12:08.066869-06','www.amazon.com'), + (3286,'PrepNaturals Vegetable Chopper with Container, Veggie Chopper - Chopper Vegetable Cutter, Food Chopper & Onion Chopper - Onion Chopper Dicers, Choppers, Mandoline Slicer for Kitchen (2-in-1 Black)',NULL,'B0BNJ7FCJM','https://m.media-amazon.com/images/I/71hWyc5qkkL._AC_UL320_.jpg',2421,4.4,'$14.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Vegetable-Chopper-Veggie-Container-Choppers/dp/B0BNJ7FCJM/ref=sr_1_108?keywords=kitchen&qid=1703020326&sr=8-108',43,'2023-12-19 15:12:08.078536-06','2023-12-19 15:12:08.078536-06','www.amazon.com'), + (3184,'Geedel Rotary Cheese Grater, Kitchen Mandoline Vegetable Slicer with 3 Interchangeable Blades, Easy to Clean Grater for Fruit, Vegetables, Nuts',NULL,'B07P6G5L35','https://aax-us-iad.amazon.com/e/loi/imp?b=JJu1CqlJUWfxfb9bRVKFWpUAAAGMg-vveQEAAAH2AQBvbm9fdHhuX2JpZDQgICBvbm9fdHhuX2ltcDEgICDr6Kgs',18670,4.6,'$28.97','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.comhttps://aax-us-iad.amazon.com/x/c/RM2YpADWcwUWD2PSZSD1xXEAAAGMg-vTnAEAAAH2AQBvbm9fdHhuX2JpZDEgICBvbm9fdHhuX2ltcDEgICByGBlM/https://www.amazon.com/Geedel-Graters-Mandoline-Interchangeable-Vegetables/dp/B07P6G5L35/ref=sxin_23_sbv_search_btf?content-id=amzn1.sym.6ca944f8-539c-499e-a3a4-26a566d1de59%3Aamzn1.sym.6ca944f8-539c-499e-a3a4-26a566d1de59&cv_ct_cx=kitchen&keywords=kitchen&pd_rd_i=B07P6G5L35&pd_rd_r=0608adb7-b7e3-4d7a-bd56-8a24ad8d3cfe&pd_rd_w=7HnFq&pd_rd_wg=vZvxb&pf_rd_p=6ca944f8-539c-499e-a3a4-26a566d1de59&pf_rd_r=HHR7054K8QZ4XP50CHQ1&qid=1703020319&sbo=RZvfv%2F%2FHxDF%2BO5021pAnSA%3D%3D&sr=1-1-5190daf0-67e3-427c-bea6-c72c1df98776',43,'2023-12-19 15:12:00.664628-06','2023-12-19 15:12:08.087139-06','www.amazon.comhttps:'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3287,'Hooga Red Light Therapy Device, 660nm 850nm Near Infrared Light Therapy with Timer, Built in Stand, Clinical Grade High Power Output for Skin Health, Pain Relief, Muscle Recovery, Performance.',NULL,'B092BCWQMK','https://m.media-amazon.com/images/I/61Y2BlzPLpL._AC_UL320_.jpg',142,4.5,'$119.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToyNzI2MjQ2MzQyMjM1NzE3OjE3MDMwMjAzMzY6c3BfYXRmOjIwMDA3MDY1NTE3NDU4MTo6MDo6&url=%2FTherapy-Built-Performance-Recovery-Relief%2Fdp%2FB092BCWQMK%2Fref%3Dsr_1_1_sspa%3Fkeywords%3Dhealth%26qid%3D1703020336%26sr%3D8-1-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGY%26psc%3D1',44,'2023-12-19 15:12:17.576345-06','2023-12-19 15:12:17.576345-06','www.amazon.com'), + (3288,'The Mind-Gut Connection: How the Hidden Conversation Within Our Bodies Impacts Our Mood, Our Choices, and Our Overall Health',NULL,'B09GCWZ5SV','https://m.media-amazon.com/images/I/71aBnlgaJbL._AC_UL320_.jpg',3013,4.5,'$11.29','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Mind-Gut-Connection-Conversation-Impacts-Choices/dp/B09GCWZ5SV/ref=sr_1_3?keywords=health&qid=1703020336&sr=8-3',44,'2023-12-19 15:12:17.589079-06','2023-12-19 15:12:17.589079-06','www.amazon.com'), + (3289,'Albatross Health New England Sleep Mask for Men Women, Upgraded 3D Contoured Cup Eye mask with Adjustable Strap, Breathable & Soft for Sleeping, Yoga, Traveling (Black)',NULL,'B095C7H62X','https://m.media-amazon.com/images/I/61wWSFWoqrL._AC_UL320_.jpg',9028,4.6,'$8.97','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Adjustable-Blocking-Breathable-Comfortable-Traveling/dp/B095C7H62X/ref=sr_1_4?keywords=health&qid=1703020336&sr=8-4',44,'2023-12-19 15:12:17.597057-06','2023-12-19 15:12:17.597057-06','www.amazon.com'), + (3290,'Sunny Health & Fitness Magnetic Sitting Under Desk Elliptical Peddler, Portable Foot & Leg Pedal Exerciser for Gym, Home or Work, Adults to Seniors, Fully Assembled',NULL,'B07MWV1JD7','https://m.media-amazon.com/images/I/61D7vcriVAL._AC_UL320_.jpg',10928,4.4,'$110.48','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo1MDE2MzU3NDAwMjU4NzE3OjE3MDMwMjAzMzY6c3Bfc2VhcmNoX3RoZW1hdGljOjIwMDAxOTk4OTk2Mzc3MTo6MTo6&url=%2FSunny-Health-Fitness-Assembled-Elliptical%2Fdp%2FB07MWV1JD7%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.d0d6e7d3-c9f1-480b-9f2a-893b95951bfb%253Aamzn1.sym.d0d6e7d3-c9f1-480b-9f2a-893b95951bfb%26cv_ct_cx%3Dhealth%26keywords%3Dhealth%26pd_rd_i%3DB07MWV1JD7%26pd_rd_r%3D6d704826-48bf-4eb2-ac2c-8658c441c714%26pd_rd_w%3D7oJJa%26pd_rd_wg%3Dhup23%26pf_rd_p%3Dd0d6e7d3-c9f1-480b-9f2a-893b95951bfb%26pf_rd_r%3D400JBE22NEZD00Z7QY0Y%26qid%3D1703020336%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-2-2c727eeb-987f-452f-86bd-c2978cc9d8b9-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',44,'2023-12-19 15:12:17.605-06','2023-12-19 15:12:17.605-06','www.amazon.com'), + (3302,'Digital Hearing Amplifier - Next Generation In the Ear Personal Sound Device w/Noise Reduction - Rechargeable ITE 2 Piece Set, Portable Charging Case Sound Assist for Adults and Seniors, Black',NULL,'B08SZ4MHYV','https://m.media-amazon.com/images/I/71ysmb+cX8L._AC_UL320_.jpg',179,3.4,'$87.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToyNzI2MjQ2MzQyMjM1NzE3OjE3MDMwMjAzMzY6c3BfbXRmOjMwMDA5ODQ2MDk0ODEwMjo6MDo6&url=%2FDigital-Hearing-Amplifier-Generation-Rechargeable%2Fdp%2FB08SZ4MHYV%2Fref%3Dsr_1_18_sspa%3Fkeywords%3Dhealth%26qid%3D1703020336%26sr%3D8-18-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',44,'2023-12-19 15:12:17.702151-06','2023-12-19 15:12:17.702151-06','www.amazon.com'), + (3291,'Further Food Best Collagen Peptides Powder Vanilla Flavored Keto Grass-Fed Collagen Type 1 & 3, Joint Support Gut Health + Hair Skin Nails Beauty Tremella Mushroom Paleo Keto Sugar-Free (70 Servings)',NULL,'B09LK4SSWJ','https://m.media-amazon.com/images/I/61edsA8ZsGL._AC_UL320_.jpg',1225,4.5,'$48.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo1MDE2MzU3NDAwMjU4NzE3OjE3MDMwMjAzMzY6c3Bfc2VhcmNoX3RoZW1hdGljOjMwMDA0NDk0NDI2ODAwMjo6Mjo6&url=%2FFurther-Food-Collagen-Grass-Fed-Sugar-Free%2Fdp%2FB09LK4SSWJ%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.d0d6e7d3-c9f1-480b-9f2a-893b95951bfb%253Aamzn1.sym.d0d6e7d3-c9f1-480b-9f2a-893b95951bfb%26cv_ct_cx%3Dhealth%26keywords%3Dhealth%26pd_rd_i%3DB09LK4SSWJ%26pd_rd_r%3D6d704826-48bf-4eb2-ac2c-8658c441c714%26pd_rd_w%3D7oJJa%26pd_rd_wg%3Dhup23%26pf_rd_p%3Dd0d6e7d3-c9f1-480b-9f2a-893b95951bfb%26pf_rd_r%3D400JBE22NEZD00Z7QY0Y%26qid%3D1703020336%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-3-2c727eeb-987f-452f-86bd-c2978cc9d8b9-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',44,'2023-12-19 15:12:17.615158-06','2023-12-19 15:12:17.615158-06','www.amazon.com'), + (3292,'NATURELO One Daily Multivitamin for Men 50+ - with Vitamins & Minerals + Organic Whole Foods - Supplement to Boost Energy, General Health - Non-GMO - 120 Capsules - 4 Month Supply',NULL,'B09TCNJHN8','https://m.media-amazon.com/images/I/71USZit69lL._AC_UL320_.jpg',100,4.7,'$39.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo1MDE2MzU3NDAwMjU4NzE3OjE3MDMwMjAzMzY6c3Bfc2VhcmNoX3RoZW1hdGljOjIwMDE0NzE5NzA3NzE5ODo6Mzo6&url=%2FNATURELO-One-Daily-Multivitamin-Men%2Fdp%2FB09TCNJHN8%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.d0d6e7d3-c9f1-480b-9f2a-893b95951bfb%253Aamzn1.sym.d0d6e7d3-c9f1-480b-9f2a-893b95951bfb%26cv_ct_cx%3Dhealth%26keywords%3Dhealth%26pd_rd_i%3DB09TCNJHN8%26pd_rd_r%3D6d704826-48bf-4eb2-ac2c-8658c441c714%26pd_rd_w%3D7oJJa%26pd_rd_wg%3Dhup23%26pf_rd_p%3Dd0d6e7d3-c9f1-480b-9f2a-893b95951bfb%26pf_rd_r%3D400JBE22NEZD00Z7QY0Y%26qid%3D1703020336%26rdc%3D1%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-4-2c727eeb-987f-452f-86bd-c2978cc9d8b9-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',44,'2023-12-19 15:12:17.625501-06','2023-12-19 15:12:17.625501-06','www.amazon.com'), + (3293,'Zesty Paws Multivitamin Treats for Dogs - Glucosamine Chondroitin for Joint Support + Digestive Enzymes & Probiotics - Grain Free Dog Vitamin for Skin & Coat + Immune Health - Chicken Flavor - 90ct',NULL,'B07121B839','https://m.media-amazon.com/images/I/7183A1-ljvL._AC_UL320_.jpg',45831,4.5,'$29.97','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Zesty-Paws-Dog-Multivitamin-Chew/dp/B07121B839/ref=sr_1_6?keywords=health&qid=1703020336&sr=8-6',44,'2023-12-19 15:12:17.633834-06','2023-12-19 15:12:17.633834-06','www.amazon.com'), + (3294,'OLLY Probiotic + Prebiotic Gummy, Digestive Support and Gut Health, 500 Million CFUs, Fiber, Adult Chewable Supplement for Men and Women, Peach, 30 Day Supply - 30 Count',NULL,'B012RFVHSO','https://m.media-amazon.com/images/I/616k5WKNFJL._AC_UL320_.jpg',20379,4.5,'$12.88','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Balanced-Supplement-Prebiotic-Probiotic-Packaging/dp/B012RFVHSO/ref=sr_1_7?keywords=health&qid=1703020336&sr=8-7',44,'2023-12-19 15:12:17.641348-06','2023-12-19 15:12:17.641348-06','www.amazon.com'), + (3295,'Ayurveda for Women: The Power of Food as Medicine with Recipes for Health and Wellness',NULL,'B0B5M3WHL6','https://m.media-amazon.com/images/I/915f33RFL1L._AC_UL320_.jpg',239,4.5,'$17.09','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Ayurveda-Women-Medicine-Recipes-Wellness/dp/B0B5M3WHL6/ref=sr_1_8?keywords=health&qid=1703020336&sr=8-8',44,'2023-12-19 15:12:17.648414-06','2023-12-19 15:12:17.648414-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3296,'52-Week Mental Health Journal: Guided Prompts and Self-Reflection to Reduce Stress and Improve Wellbeing',NULL,'1648767699','https://m.media-amazon.com/images/I/617C8gLMdqL._AC_UL320_.jpg',1453,4.6,'$13.49','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/52-Week-Mental-Health-Journal-Self-Reflection/dp/1648767699/ref=sr_1_10?keywords=health&qid=1703020336&sr=8-10',44,'2023-12-19 15:12:17.659442-06','2023-12-19 15:12:17.659442-06','www.amazon.com'), + (3297,'Force Factor Total Beets Soft Chews with Beetroot, Nitrates, L-Citrulline, Grapeseed Extract, and Antioxidants, Healthy Energy Supplement with Elite Ingredients, Heart Health Superfood, 60 Chews',NULL,'B095WNBLMN','https://m.media-amazon.com/images/I/81xNUjg3luL._AC_UL320_.jpg',9252,4.5,'$14.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/L-Citrulline-Antioxidants-Ingredients-Force-Factor/dp/B095WNBLMN/ref=sr_1_11?keywords=health&qid=1703020336&sr=8-11',44,'2023-12-19 15:12:17.666601-06','2023-12-19 15:12:17.666601-06','www.amazon.com'), + (3298,'Health By Habit Collagen Supplement (60 Capsules) - Vitamin C & Vitamin E, 2000mg, Collagen Peptides, Superior Absorption, Support Your Skin, Non-GMO, Sugar Free (1 Pack)',NULL,'B0B44PMG97','https://m.media-amazon.com/images/I/61-VFZbjZXL._AC_UL320_.jpg',499,4.6,'$7.88','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Health-Habit-Collagen-Supplement-Capsules/dp/B0B44PMG97/ref=sr_1_12?keywords=health&qid=1703020336&sr=8-12',44,'2023-12-19 15:12:17.673469-06','2023-12-19 15:12:17.673469-06','www.amazon.com'), + (3507,'Amazon Essentials',NULL,'B07BJKSJ8R','https://m.media-amazon.com/images/I/91uVLtKK8mL._AC_UL320_.jpg',12288,4.4,'$16.10','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Amazon-Essentials-Regular-Fit-Long-Sleeve-Heather/dp/B07BJKSJ8R/ref=sr_1_7?keywords=men%27s+clothing&qid=1703020369&sr=8-7',46,'2023-12-19 15:12:50.819568-06','2023-12-19 15:12:50.819568-06','www.amazon.com'), + (3303,'Sunny Health & Fitness Mini Stepper for Exercise Low-Impact Stair Step Cardio Equipment with Resistance Bands, Digital Monitor, Optional Twist Motion Stepper',NULL,'B0016BQFSS','https://m.media-amazon.com/images/I/61vNQX1dyML._AC_UL320_.jpg',33052,4.4,'$69.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Sunny-Health-Fitness-Stepper-Resistance/dp/B0016BQFSS/ref=sr_1_21?keywords=health&qid=1703020336&sr=8-21',44,'2023-12-19 15:12:17.712591-06','2023-12-19 15:12:17.712591-06','www.amazon.com'), + (3304,'Health By Habit Womens Multi Supplement 2 Pack (120 Capsules) - 23 Essential Vitamins and Minerals, Supports General Health & Wellness, Non-GMO, Sugar Free (2 Pack)',NULL,'B0BB9T88BD','https://m.media-amazon.com/images/I/61Yu9FYhZqL._AC_UL320_.jpg',1242,4.7,'$15.76','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Health-Habit-Womens-Supplement-Capsules/dp/B0BB9T88BD/ref=sr_1_23?keywords=health&qid=1703020336&sr=8-23',44,'2023-12-19 15:12:17.720647-06','2023-12-19 15:12:17.720647-06','www.amazon.com'), + (3305,'Healthyline Advanced Infrared Heating Pad - FSA HSA Eligible - Amethyst, Tourmaline and Jade Gemstones - Heated Mat with LED Red Lights, Negative Ions - 72 x 24 inches',NULL,'B079RRQ9P3','https://m.media-amazon.com/images/I/81AFqe9NCHL._AC_UL320_.jpg',128,4.2,'$1.045','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToyNzI2MjQ2MzQyMjM1NzE3OjE3MDMwMjAzMzY6c3BfbXRmOjMwMDAwMjUwNDc1NDcwMjo6MDo6&url=%2FHealthyLine-Advanced-Multi-Purpose-Gemstone-Heating%2Fdp%2FB079RRQ9P3%2Fref%3Dsr_1_26_sspa%3Fkeywords%3Dhealth%26qid%3D1703020336%26sr%3D8-26-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',44,'2023-12-19 15:12:17.727421-06','2023-12-19 15:12:17.727421-06','www.amazon.com'), + (3306,'Think, Learn, Succeed Curriculum Kit: Understanding and Using Your Mind to Thrive at School, the Workplace, and Life',NULL,'0801093562','https://m.media-amazon.com/images/I/817d4qbD7ML._AC_UL320_.jpg',1338,4.7,'$48.91','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToyNzI2MjQ2MzQyMjM1NzE3OjE3MDMwMjAzMzY6c3BfbXRmOjIwMDEzNDUzMTYwNDk5ODo6MDo6&url=%2FThink-Learn-Succeed-Curriculum-Understanding%2Fdp%2F0801093562%2Fref%3Dsr_1_27_sspa%3Fkeywords%3Dhealth%26qid%3D1703020336%26sr%3D8-27-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',44,'2023-12-19 15:12:17.736443-06','2023-12-19 15:12:17.736443-06','www.amazon.com'), + (3307,'Health By Habit Libido Blend (60 Capsules) - Natural Aphrodisiac Blend with Maca, Ashwagandha, Vegan, Non-GMO, Sugar-Free (1 Pack)',NULL,'B0BL1MXV78','https://m.media-amazon.com/images/I/61G-8O7yrJL._AC_UL320_.jpg',715,3.9,'$7.88','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Health-Habit-Libido-Blend-Capsules/dp/B0BL1MXV78/ref=sr_1_29?keywords=health&qid=1703020336&sr=8-29',44,'2023-12-19 15:12:17.748027-06','2023-12-19 15:12:17.748027-06','www.amazon.com'), + (3308,'African Holistic Health',NULL,'1617590312','https://m.media-amazon.com/images/I/61A5sOEMQCL._AC_UL320_.jpg',5958,4.8,'$16.20','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/African-Holistic-Health-Llaila-Afrika/dp/1617590312/ref=sr_1_30?keywords=health&qid=1703020336&sr=8-30',44,'2023-12-19 15:12:17.755345-06','2023-12-19 15:12:17.755345-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3309,'Phillips'' Colon Health Daily Probiotic Capsules, 4-in-1 Symptom Defense to help defend against Occasional Gas, Bloating, Constipation, and Diarrhea, Daily Supplement, 60 Count',NULL,'B007RA0ZAQ','https://m.media-amazon.com/images/I/711dBMr7tpL._AC_UL320_.jpg',10749,4.6,'$22.20','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Phillips-Colon-Health-Probiotics-Constipation/dp/B007RA0ZAQ/ref=sr_1_31?keywords=health&qid=1703020336&rdc=1&sr=8-31',44,'2023-12-19 15:12:17.761425-06','2023-12-19 15:12:17.761425-06','www.amazon.com'), + (3310,'Outlive: The Science and Art of Longevity',NULL,'B0C5FZQSTG','https://m.media-amazon.com/images/I/71IQ8lCksdL._AC_UL320_.jpg',9754,4.6,'$0.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Outlive-Longevity-Peter-Attia-MD/dp/B0C5FZQSTG/ref=sr_1_32?keywords=health&qid=1703020336&sr=8-32',44,'2023-12-19 15:12:17.767727-06','2023-12-19 15:12:17.767727-06','www.amazon.com'), + (3311,'Colon Relief by VitaRange- Fast Constipation and Bloating Relief with Sunfiber Prebiotic Fiber and Pre + Probiotics for Digestive Health - 60 Chewable Strawberry Tablets – Doctor Formulated Probiotics',NULL,'B0CDN3G813','https://m.media-amazon.com/images/I/61bVY7RRI1L._AC_UL320_.jpg',24,3.9,'$27.85','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToyNzI2MjQ2MzQyMjM1NzE3OjE3MDMwMjAzMzY6c3BfbXRmOjMwMDA3ODk4OTE3NzMwMjo6MDo6&url=%2FVitaRange-Constipation-Prebiotic-Probiotics-Digestive%2Fdp%2FB0CDN3G813%2Fref%3Dsr_1_33_sspa%3Fkeywords%3Dhealth%26qid%3D1703020336%26sr%3D8-33-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',44,'2023-12-19 15:12:17.775758-06','2023-12-19 15:12:17.775758-06','www.amazon.com'), + (3312,'PURE ESSENCE LABS MyPure Lions Mane 4X Mushroom Supplement, 100% Real Mushroom Extract for Immune Support, Combat Stress and Build Energy, Immune Booster for Men and Women, 60 Capsules',NULL,'B07FKWV4GY','https://m.media-amazon.com/images/I/61SLGTVW2wL._AC_UL320_.jpg',133,4.6,'$48.12','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToyNzI2MjQ2MzQyMjM1NzE3OjE3MDMwMjAzMzY6c3BfbXRmOjIwMDE1NjgzNDg3NTM5ODo6MDo6&url=%2FMushroom-Extract-Supplement-Pure-Essence%2Fdp%2FB07FKWV4GY%2Fref%3Dsr_1_34_sspa%3Fkeywords%3Dhealth%26qid%3D1703020336%26sr%3D8-34-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',44,'2023-12-19 15:12:17.787411-06','2023-12-19 15:12:17.787411-06','www.amazon.com'), + (3724,'JUST MY SIZE',NULL,'B016LJ79XE','https://m.media-amazon.com/images/I/71JJ9VBUYTL._AC_UL320_.jpg',17263,4.1,'$12.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Just-My-Size-Womens-Jersey/dp/B016LJ79XE/ref=sr_1_81?keywords=women%27s+clothing&qid=1703020392&sr=8-81',47,'2023-12-19 15:13:13.857938-06','2023-12-19 15:13:13.857938-06','www.amazon.com'), + (3313,'Sireck 3D Sleep Mask,100% Light Blocking Travel Sleep Eye Mask for Men Women,15MM Depth Zero Pressure Night Eye Cover for Yoga Nap, Shift Work, Includes Black Travel Pouch',NULL,'B0C58PL75X','https://m.media-amazon.com/images/I/71ikzX6OzbL._AC_UL320_.jpg',27,4.6,'$13.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToyNzI2MjQ2MzQyMjM1NzE3OjE3MDMwMjAzMzY6c3BfbXRmOjMwMDA3NjE1MTk0MzYwMjo6MDo6&url=%2FSireck-Sleep-Blocking-Travel-Pressure%2Fdp%2FB0C58PL75X%2Fref%3Dsr_1_35_sspa%3Fkeywords%3Dhealth%26qid%3D1703020336%26sr%3D8-35-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',44,'2023-12-19 15:12:17.794643-06','2023-12-19 15:12:17.794643-06','www.amazon.com'), + (3314,'Heal',NULL,'B077TY9GYL','https://m.media-amazon.com/images/I/61B09yEYbiL._AC_UL320_.jpg',1579,4.5,'$2.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Heal-Dr-Deepak-Chopra/dp/B077TY9GYL/ref=sr_1_36?keywords=health&qid=1703020336&sr=8-36',44,'2023-12-19 15:12:17.803978-06','2023-12-19 15:12:17.803978-06','www.amazon.com'), + (3315,'Atomic Habits: An Easy & Proven Way to Build Good Habits & Break Bad Ones',NULL,'B0BT2Q64JW','https://m.media-amazon.com/images/I/81YkqyaFVEL._AC_UL320_.jpg',120082,4.8,'$13.79','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Atomic-Habits-Proven-Build-Break/dp/B0BT2Q64JW/ref=sr_1_37?keywords=health&qid=1703020336&sr=8-37',44,'2023-12-19 15:12:17.811399-06','2023-12-19 15:12:17.811399-06','www.amazon.com'), + (3316,'Hidden Potential: The Science of Achieving Greater Things',NULL,'B0CNBGY59W','https://m.media-amazon.com/images/I/71Pgrm3PqjL._AC_UL320_.jpg',714,4.6,'$0.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Hidden-Potential-Science-Achieving-Greater/dp/B0CNBGY59W/ref=sr_1_39?keywords=health&qid=1703020336&sr=8-39',44,'2023-12-19 15:12:17.819485-06','2023-12-19 15:12:17.819485-06','www.amazon.com'), + (3317,'The 48 Laws of Power',NULL,'1665182768','https://m.media-amazon.com/images/I/61XUtQ7NTgL._AC_UL320_.jpg',71972,4.7,'$13.82','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/48-Laws-Power-Robert-Greene/dp/1665182768/ref=sr_1_41?keywords=health&qid=1703020336&sr=8-41',44,'2023-12-19 15:12:17.833913-06','2023-12-19 15:12:17.833913-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3318,'How to Be the Love You Seek: Break Cycles, Find Peace, and Heal Your Relationships',NULL,'B0CDZYFHV6','https://m.media-amazon.com/images/I/81os+EMaFaL._AC_UL320_.jpg',100,4.8,'$20.11','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/How-Love-You-Seek-Relationships/dp/B0CDZYFHV6/ref=sr_1_43?keywords=health&qid=1703020336&sr=8-43',44,'2023-12-19 15:12:17.841737-06','2023-12-19 15:12:17.841737-06','www.amazon.com'), + (3319,'The Best Minds: A Story of Friendship, Madness, and the Tragedy of Good Intentions',NULL,'B0B6ZC3S47','https://m.media-amazon.com/images/I/91D-QntwiDL._AC_UL320_.jpg',840,4.4,'$0.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Best-Minds-Friendship-Madness-Intentions-ebook/dp/B0B6ZC3S47/ref=sr_1_44?keywords=health&qid=1703020336&sr=8-44',44,'2023-12-19 15:12:17.848656-06','2023-12-19 15:12:17.848656-06','www.amazon.com'), + (3320,'The In-Between: Unforgettable Encounters During Life''s Final Moments',NULL,'B0C9F236WJ','https://m.media-amazon.com/images/I/81DIvrwrapL._AC_UL320_.jpg',5758,4.8,'$15.89','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Between-Unforgettable-Encounters-During-Moments/dp/B0C9F236WJ/ref=sr_1_45?keywords=health&qid=1703020336&sr=8-45',44,'2023-12-19 15:12:17.857722-06','2023-12-19 15:12:17.857722-06','www.amazon.com'), + (3321,'Herbs for Children''s Health: How to Make and Use Gentle Herbal Remedies for Soothing Common Ailments. A Storey BASICS® Title',NULL,'B00W4HAFSO','https://m.media-amazon.com/images/I/81szRUqGzeL._AC_UL320_.jpg',809,4.8,'$8.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Herbs-Childrens-Health-Remedies-Ailments-ebook/dp/B00W4HAFSO/ref=sr_1_46?keywords=health&qid=1703020336&sr=8-46',44,'2023-12-19 15:12:17.865154-06','2023-12-19 15:12:17.865154-06','www.amazon.com'), + (3322,'Black Seed Oil - 120 Softgel Capsules Skin Health (Non-GMO & Vegan) Cold-Pressed Nigella Sativa Producing Pure Black Cumin Seed Oil with Vitamin E - 500mg Each, 1000mg Per 2 Capsule Serving',NULL,'B0714PK8VV','https://m.media-amazon.com/images/I/71rYU6DwzPL._AC_UL320_.jpg',47413,4.5,'$18.97','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Black-Seed-Oil-Vegetarian-Cold-Pressed/dp/B0714PK8VV/ref=sr_1_47?keywords=health&qid=1703020336&sr=8-47',44,'2023-12-19 15:12:17.875051-06','2023-12-19 15:12:17.875051-06','www.amazon.com'), + (3323,'Fast Like a Girl: A Woman''s Guide to Using the Healing Power of Fasting to Burn Fat, Boost Energy, and Balance Hormones',NULL,'B0BSM5H8XF','https://m.media-amazon.com/images/I/61czCs8Z6iL._AC_UL320_.jpg',3378,4.7,'$15.55','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Fast-Like-Girl-Healing-Hormones/dp/B0BSM5H8XF/ref=sr_1_48?keywords=health&qid=1703020336&sr=8-48',44,'2023-12-19 15:12:17.881453-06','2023-12-19 15:12:17.881453-06','www.amazon.com'), + (3324,'Blue Buffalo Health Bars Natural Crunchy Dog Treats Biscuits, Bacon, Egg & Cheese 56-oz Box',NULL,'B08XY8RGNJ','https://m.media-amazon.com/images/I/81LX2YUWqDL._AC_UL320_.jpg',24841,4.7,'$14.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Blue-Buffalo-Natural-Crunchy-Biscuits/dp/B08XY8RGNJ/ref=sr_1_49?keywords=health&qid=1703020336&sr=8-49',44,'2023-12-19 15:12:17.88893-06','2023-12-19 15:12:17.88893-06','www.amazon.com'), + (3325,'Mental Health Is Health Self Care Coloring Book: Anxiety Stress Relief Self Help Coloring Book for Adults and Kids with Motivational And Inspirational Quotes (Mental Health Coloring)',NULL,'B0B9VTCTMX','https://m.media-amazon.com/images/I/71ufsDHsZuL._AC_UL320_.jpg',180,4.7,'$9.14','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Mental-Health-Self-Care-Coloring/dp/B0B9VTCTMX/ref=sr_1_50?keywords=health&qid=1703020336&sr=8-50',44,'2023-12-19 15:12:17.898361-06','2023-12-19 15:12:17.898361-06','www.amazon.com'), + (3326,'Health By Habit Energy Supplement 2 Pack (120 Capsules) - Natual Caffeine Blend, Vitamins B & C, Supports Energy Levels, Promotes Mental Alertness and Focus, Vegan, Non-GMO, Sugar Free (2 Pack)',NULL,'B0BB9TYMMY','https://m.media-amazon.com/images/I/619gD1eYowL._AC_UL320_.jpg',570,4.3,'$15.76','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Health-Habit-Energy-Supplement-Capsules/dp/B0BB9TYMMY/ref=sr_1_52?keywords=health&qid=1703020336&sr=8-52',44,'2023-12-19 15:12:17.905748-06','2023-12-19 15:12:17.905748-06','www.amazon.com'), + (3327,'Adult Children of Emotionally Immature Parents: How to Heal from Distant, Rejecting, or Self-Involved Parents',NULL,'1799980030','https://m.media-amazon.com/images/I/71HlOZwhjSL._AC_UL320_.jpg',21313,4.8,'$14.15','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Adult-Children-Emotionally-Immature-Parents/dp/1799980030/ref=sr_1_53?keywords=health&qid=1703020336&sr=8-53',44,'2023-12-19 15:12:17.916049-06','2023-12-19 15:12:17.916049-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3328,'23andMe Health + Ancestry Service: Personal Genetic DNA Test Including Health Predispositions, Carrier Status, Wellness, and Trait Reports (Before You Buy See Important Test Info Below)',NULL,'B01G7PYQTM','https://m.media-amazon.com/images/I/61VmiBwkp2L._AC_UL320_.jpg',35483,4.7,'$129.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/23andMe-DNA-Test-Ancestry-Personal/dp/B01G7PYQTM/ref=sr_1_55?keywords=health&qid=1703020336&sr=8-55',44,'2023-12-19 15:12:17.922884-06','2023-12-19 15:12:17.922884-06','www.amazon.com'), + (3329,'The Ultimate Pet Health Guide: Breakthrough Nutrition and Integrative Care for Dogs and Cats',NULL,'B096X3Y2Z8','https://m.media-amazon.com/images/I/714DmUlYdOL._AC_UL320_.jpg',3022,4.4,'$14.19','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Ultimate-Pet-Health-Guide-Breakthrough/dp/B096X3Y2Z8/ref=sr_1_56?keywords=health&qid=1703020336&sr=8-56',44,'2023-12-19 15:12:17.929308-06','2023-12-19 15:12:17.929308-06','www.amazon.com'), + (3330,'Nutramax Cosequin Maximum Strength Joint Health Supplement for Dogs - With Glucosamine, Chondroitin, and MSM, 132 Chewable Tablets',NULL,'B003ULL1NQ','https://m.media-amazon.com/images/I/71EIMIILiML._AC_UL320_.jpg',71444,4.7,'$29.22','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Cosequin-DS-Maximum-Strength-Chewable/dp/B003ULL1NQ/ref=sr_1_57?keywords=health&qid=1703020336&sr=8-57',44,'2023-12-19 15:12:17.93963-06','2023-12-19 15:12:17.93963-06','www.amazon.com'), + (3331,'Man''s Search for Meaning',NULL,'B001I8P5SA','https://m.media-amazon.com/images/I/91x-lhVENfL._AC_UL320_.jpg',84895,4.7,'$12.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Mans-Search-Meaning-Viktor-Frankl/dp/B001I8P5SA/ref=sr_1_58?keywords=health&qid=1703020336&sr=8-58',44,'2023-12-19 15:12:17.94945-06','2023-12-19 15:12:17.94945-06','www.amazon.com'), + (3332,'Mental Health Journal for Men: Creative Prompts, Practices, and Exercises to Bolster Wellness',NULL,'1647396255','https://m.media-amazon.com/images/I/81gqs3itPkL._AC_UL320_.jpg',777,4.6,'$14.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Mental-Health-Journal-Men-Practices/dp/1647396255/ref=sr_1_59?keywords=health&qid=1703020336&sr=8-59',44,'2023-12-19 15:12:17.958712-06','2023-12-19 15:12:17.958712-06','www.amazon.com'), + (3333,'Vital Proteins Collagen Peptides Powder, Promotes Hair, Nail, Skin, Bone and Joint Health - Bonus Size, Zero Sugar, Unflavored 11.4 OZ',NULL,'B0CMJPTH54','https://m.media-amazon.com/images/I/71gVNS-IqbL._AC_UL320_.jpg',43529,4.5,'$25.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Vital-Proteins-Collagen-Peptides-Promotes/dp/B0CMJPTH54/ref=sr_1_60?keywords=health&qid=1703020336&sr=8-60',44,'2023-12-19 15:12:17.965532-06','2023-12-19 15:12:17.965532-06','www.amazon.com'), + (3334,'Digital Hearing Amplifier - Next Generation in The Ear Personal Sound Device w/Noise Reduction - Rechargeable ITE 2 Piece Set, Portable Charging Case Sound Assist for Adults and Seniors, White',NULL,'B08SZVL494','https://m.media-amazon.com/images/I/610UyoX4uOL._AC_UL320_.jpg',179,3.4,'$87.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxOTI2NDkxNTAzNTk0NzE3OjE3MDMwMjAzNDQ6c3BfYXRmX25leHQ6MzAwMDk4NDYwOTQ4MDAyOjowOjo&url=%2FDigital-Hearing-Amplifier-Generation-Rechargeable%2Fdp%2FB08SZVL494%2Fref%3Dsr_1_49_sspa%3Fkeywords%3Dhealth%26qid%3D1703020344%26sr%3D8-49-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGZfbmV4dA%26psc%3D1',44,'2023-12-19 15:12:26.959828-06','2023-12-19 15:12:26.959828-06','www.amazon.com'), + (3335,'Basepaws Dog DNA Test: Comprehensive Breed, Trait, & Most Accurate Genetic Health Screening for Dogs - Reveal Over 300+ Breeds, 280+ Health Risks, and 30+ Traits',NULL,'B0CJXHW7XX','https://m.media-amazon.com/images/I/71+729-qvPL._AC_UL320_.jpg',1582,4.4,'$85.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxOTI2NDkxNTAzNTk0NzE3OjE3MDMwMjAzNDQ6c3BfYXRmX25leHQ6MzAwMDY5MzkxMzcwMTAyOjowOjo&url=%2FBasepaws-Dog-DNA-Test-Comprehensive%2Fdp%2FB0CJXHW7XX%2Fref%3Dsr_1_51_sspa%3Fkeywords%3Dhealth%26qid%3D1703020344%26sr%3D8-51-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGZfbmV4dA%26psc%3D1',44,'2023-12-19 15:12:26.983172-06','2023-12-19 15:12:26.983172-06','www.amazon.com'), + (3369,'Super Gut: A Four-Week Plan to Reprogram Your Microbiome, Restore Health, and Lose Weight',NULL,'166860082X','https://m.media-amazon.com/images/I/71RP6wDST7L._AC_UL320_.jpg',1381,4.6,'$14.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Super-Gut-Four-Week-Reprogram-Microbiome/dp/166860082X/ref=sr_1_95?keywords=health&qid=1703020344&sr=8-95',44,'2023-12-19 15:12:27.286795-06','2023-12-19 15:12:27.286795-06','www.amazon.com'), + (4057,'ASICS',NULL,'B091KJKPQX','https://m.media-amazon.com/images/I/610-4jTqVvL._AC_UL320_.jpg',21467,4.5,'$42.01','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/ASICS-Gel-Venture-Running-Shoes-Habanero/dp/B091KJKPQX/ref=sr_1_48?keywords=men%27s+shoes&qid=1703020483&sr=8-48',53,'2023-12-19 15:14:45.063222-06','2023-12-19 15:14:45.063222-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3336,'RTBLE 28 OZ Irish Sea Moss Gel | (Family Value Size) Wildcrafted Seamoss Gel with 102 Minerals & Vitamins for Thyroid Support & Energy Recovery | Strawberry Flavor',NULL,'B0CJ95ZYCD','https://m.media-amazon.com/images/I/71Kiyzcs+AL._AC_UL320_.jpg',22,4.4,'$39.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxOTI2NDkxNTAzNTk0NzE3OjE3MDMwMjAzNDQ6c3BfYXRmX25leHQ6MzAwMDkxMjAzNjUxODAyOjowOjo&url=%2FRTBLE-Wildcrafted-Minerals-Vitamins-Strawberry%2Fdp%2FB0CJ95ZYCD%2Fref%3Dsr_1_52_sspa%3Fkeywords%3Dhealth%26qid%3D1703020344%26sr%3D8-52-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGZfbmV4dA%26psc%3D1',44,'2023-12-19 15:12:26.990511-06','2023-12-19 15:12:26.990511-06','www.amazon.com'), + (3337,'Doctor''s Best High Absorption CoQ10 with BioPerine, Gluten Free, Naturally Fermented, Heart Health, Energy Production, 100 mg, 120 Count',NULL,'B0019GW3G8','https://m.media-amazon.com/images/I/61V2ccZ5zWL._AC_UL320_.jpg',29554,4.6,'$18.04','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Doctors-Best-Absorption-BioPerine-Production/dp/B0019GW3G8/ref=sr_1_53?keywords=health&qid=1703020344&sr=8-53',44,'2023-12-19 15:12:26.998685-06','2023-12-19 15:12:26.998685-06','www.amazon.com'), + (3338,'Zenwise Digestive Enzymes - Probiotic Multi Enzyme with Probiotics and Prebiotics for Digestive Health and Bloating Relief for Women and Men, Enzymes for Gut Health - 180 Count',NULL,'B00RH5K26I','https://m.media-amazon.com/images/I/71nTyfxit3L._AC_UL320_.jpg',65226,4.4,'$37.97','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Zenwise-Health-Digestive-Prebiotics-Probiotics/dp/B00RH5K26I/ref=sr_1_55?keywords=health&qid=1703020344&rdc=1&sr=8-55',44,'2023-12-19 15:12:27.010194-06','2023-12-19 15:12:27.010194-06','www.amazon.com'), + (3339,'Forever Strong: A New, Science-Based Strategy for Aging Well',NULL,'1797169041','https://m.media-amazon.com/images/I/81R4yeXggkL._AC_UL320_.jpg',447,4.5,'$20.51','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Forever-Strong-Science-Based-Strategy-Aging/dp/1797169041/ref=sr_1_56?keywords=health&qid=1703020344&sr=8-56',44,'2023-12-19 15:12:27.022286-06','2023-12-19 15:12:27.022286-06','www.amazon.com'), + (3340,'The Good Gut: Taking Control of Your Weight, Your Mood, and Your Long-term Health',NULL,'1611764386','https://m.media-amazon.com/images/I/61jDhEAqywL._AC_UL320_.jpg',1043,4.5,'$15.49','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Good-Gut-Taking-Control-Long-Term/dp/1611764386/ref=sr_1_57?keywords=health&qid=1703020344&sr=8-57',44,'2023-12-19 15:12:27.029688-06','2023-12-19 15:12:27.029688-06','www.amazon.com'), + (3341,'AZO Cranberry Urinary Tract Health Supplement, 1 Serving = 1 Glass of Cranberry Juice, Sugar Free Cranberry Pills, Non-GMO 100 Softgels',NULL,'B004RR1FF6','https://m.media-amazon.com/images/I/71YozjE1DqL._AC_UL320_.jpg',59285,4.7,'$12.07','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Cranberry-Urinary-Dietary-Supplement-Softgels/dp/B004RR1FF6/ref=sr_1_58?keywords=health&qid=1703020344&sr=8-58',44,'2023-12-19 15:12:27.038076-06','2023-12-19 15:12:27.038076-06','www.amazon.com'), + (3342,'Men''s Health: 15 Minute Workout [DVD]',NULL,'B000LXHJUU','https://m.media-amazon.com/images/I/51piUV0VBML._AC_UL320_.jpg',49,3.8,'$8.88','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Mens-Health-15-Minute-Workout/dp/B000LXHJUU/ref=sr_1_59?keywords=health&qid=1703020344&sr=8-59',44,'2023-12-19 15:12:27.050387-06','2023-12-19 15:12:27.050387-06','www.amazon.com'), + (3343,'Probiotics for Women & Men - 300 Billion CFU & 24 Strains Probiotic with 15 Organic Herbs Prebiotics Blend, for Overall Digestive Health, Immune, Constipation, Gut & Bloating Health - 2 Month Supply',NULL,'B0CKXT2Q76','https://m.media-amazon.com/images/I/71ZBquYac4L._AC_UL320_.jpg',121,4.8,'$19.31','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Probiotics-Women-Men-Prebiotics-Constipation/dp/B0CKXT2Q76/ref=sr_1_60?keywords=health&qid=1703020344&sr=8-60',44,'2023-12-19 15:12:27.061102-06','2023-12-19 15:12:27.061102-06','www.amazon.com'), + (3344,'Crying in H Mart: A Memoir',NULL,'0525657746','https://m.media-amazon.com/images/I/81bSQ9N8VLL._AC_UL320_.jpg',21019,4.4,'$9.85','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Crying-Mart-Memoir-Michelle-Zauner/dp/0525657746/ref=sr_1_61?keywords=health&qid=1703020344&sr=8-61',44,'2023-12-19 15:12:27.070175-06','2023-12-19 15:12:27.070175-06','www.amazon.com'), + (4650,'Shindel 30PCS Christmas Miniature Figurines, Mini Christmas Figurines 3D Resin Christmas Ornaments Decorations for Crafts Fairy Garden Advent Calendar Fillers',NULL,'B0CC1TM686','https://m.media-amazon.com/images/I/71pbyVfDDtL._AC_UL320_.jpg',2,2.9,'$3.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Shindel-Christmas-Miniature-Figurines-Decorations/dp/B0CC1TM686/ref=sr_1_64?keywords=decoration&qid=1703020701&sr=8-64',58,'2023-12-19 15:18:22.87859-06','2023-12-19 15:18:22.87859-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3346,'My Child''s Health Record Keeper (Log Book)',NULL,'1441313842','https://m.media-amazon.com/images/I/81eJujuIVRL._AC_UL320_.jpg',4028,4.8,'$7.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Childs-Health-Record-Keeper-Book/dp/1441313842/ref=sr_1_63?keywords=health&qid=1703020344&sr=8-63',44,'2023-12-19 15:12:27.090273-06','2023-12-19 15:12:27.090273-06','www.amazon.com'), + (3347,'OLLY Women''s Multivitamin Gummy, Overall Health and Immune Support, Vitamins A, D, C, E, Biotin, Folic Acid, Adult Chewable Vitamin, Berry, 45 Day Supply - 90 Count (Pack of 1)',NULL,'B014G4AY1A','https://m.media-amazon.com/images/I/618p8n-DwAL._AC_UL320_.jpg',35058,4.6,'$11.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Multivitamin-Blissful-Vitamins-Chewable-Supplement/dp/B014G4AY1A/ref=sr_1_64?keywords=health&qid=1703020344&sr=8-64',44,'2023-12-19 15:12:27.101711-06','2023-12-19 15:12:27.101711-06','www.amazon.com'), + (3348,'GLX3 Green Lipped Mussel Oil for Dogs - Joint & Hip Support Omega-3 Supplement - Supports Mobility and Joint Health, Ideal for All Dog Breeds and Ages - 60 Soft Chews - Natural Ingredients',NULL,'B071G1M69L','https://m.media-amazon.com/images/I/719TRw1BzAL._AC_UL320_.jpg',30,3.8,'$54.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxOTI2NDkxNTAzNTk0NzE3OjE3MDMwMjAzNDQ6c3BfbXRmOjIwMDE2MDMzODQ2ODk5ODo6MDo6&url=%2FJoint-Pain-Relief-Supplement-Dogs%2Fdp%2FB071G1M69L%2Fref%3Dsr_1_66_sspa%3Fkeywords%3Dhealth%26qid%3D1703020344%26rdc%3D1%26sr%3D8-66-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',44,'2023-12-19 15:12:27.109314-06','2023-12-19 15:12:27.109314-06','www.amazon.com'), + (3349,'Attached: The New Science of Adult Attachment and How It Can Help YouFind - and Keep - Love',NULL,'1529059305','https://m.media-amazon.com/images/I/71kpAWQz7EL._AC_UL320_.jpg',19343,4.7,'$15.30','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Attached/dp/1529059305/ref=sr_1_68?keywords=health&qid=1703020344&sr=8-68',44,'2023-12-19 15:12:27.117159-06','2023-12-19 15:12:27.117159-06','www.amazon.com'), + (3350,'Gaia Herbs Adrenal Health Daily Support - with Ashwagandha, Holy Basil & Schisandra - Herbal Supplement to Help Maintain Healthy Energy and Stress Levels - 120 Liquid Phyto-Capsules (120 Count)',NULL,'B0036THML2','https://m.media-amazon.com/images/I/71Y2VQoQ+cL._AC_UL320_.jpg',4822,4.6,'$47.80','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Gaia-Herbs-Adrenal-Support-Capsules/dp/B0036THML2/ref=sr_1_70?keywords=health&qid=1703020344&sr=8-70',44,'2023-12-19 15:12:27.127967-06','2023-12-19 15:12:27.127967-06','www.amazon.com'), + (3351,'Under The Weather Pet Disc & Spine Health Chews for Dog | Vet Formulated Dog Chews Spinal Disc Support Supplement | Great for Dachshunds & Long Back Breeds with IVDD, Back & Joint Arthritis',NULL,'B0BWKJD1FL','https://m.media-amazon.com/images/I/71xio0ED56L._AC_UL320_.jpg',41,4.2,'$31.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxOTI2NDkxNTAzNTk0NzE3OjE3MDMwMjAzNDQ6c3BfbXRmOjMwMDA1NTY4NTUxMDAwMjo6MDo6&url=%2FUnder-Weather-Formulated-Supplement-Dachshunds%2Fdp%2FB0BWKJD1FL%2Fref%3Dsr_1_71_sspa%3Fkeywords%3Dhealth%26qid%3D1703020344%26sr%3D8-71-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',44,'2023-12-19 15:12:27.135885-06','2023-12-19 15:12:27.135885-06','www.amazon.com'), + (3352,'Natren Healthy Trinity Probiotics Supplement - 90 Dairy and Gluten Free Gel Capsules - Improve Gut and Digestive Health, - 30 Billion CFU - Lactobacillus Acidophilus, Bifidobacterium, Bulgaricus',NULL,'B003E6ORTM','https://m.media-amazon.com/images/I/71OQi7AGgGL._AC_UL320_.jpg',196,4.5,'$132.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxOTI2NDkxNTAzNTk0NzE3OjE3MDMwMjAzNDQ6c3BfbXRmOjIwMDAxNzM2NTAzNjQyMTo6MDo6&url=%2FNatren-Healthy-Trinity-Dairy-Free-capsules%2Fdp%2FB003E6ORTM%2Fref%3Dsr_1_73_sspa%3Fkeywords%3Dhealth%26qid%3D1703020344%26sr%3D8-73-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',44,'2023-12-19 15:12:27.148353-06','2023-12-19 15:12:27.148353-06','www.amazon.com'), + (3353,'Ele Chocolates Dark Chocolate Daily Probiotic Supplement Bites 3 Billion CFUs for Digestive Gut Health, Immune Support for Women, Men and Kids, 100% Natural and Organic, Gluten-Free, 30 Days Supply',NULL,'B0BXQMXDT7','https://m.media-amazon.com/images/I/71zghisTjHL._AC_UL320_.jpg',13,5.0,'$49.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxOTI2NDkxNTAzNTk0NzE3OjE3MDMwMjAzNDQ6c3BfbXRmOjMwMDA2MTgzMzQ0MjgwMjo6MDo6&url=%2FEle-Chocolates-Chocolate-Supplement-Gluten-Free%2Fdp%2FB0BXQMXDT7%2Fref%3Dsr_1_74_sspa%3Fkeywords%3Dhealth%26qid%3D1703020344%26sr%3D8-74-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',44,'2023-12-19 15:12:27.15685-06','2023-12-19 15:12:27.15685-06','www.amazon.com'), + (3354,'The Chicken Health Handbook, 2nd Edition: A Complete Guide to Maximizing Flock Health and Dealing with Disease',NULL,'B09WWYX9YT','https://m.media-amazon.com/images/I/81RJijkUwXL._AC_UL320_.jpg',1306,4.8,'$17.93','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Chicken-Health-Handbook-2nd-Maximizing/dp/B09WWYX9YT/ref=sr_1_75?keywords=health&qid=1703020344&sr=8-75',44,'2023-12-19 15:12:27.164783-06','2023-12-19 15:12:27.164783-06','www.amazon.com'), + (3355,'12 Rules for Life: An Antidote to Chaos',NULL,'B0B53XTL4G','https://m.media-amazon.com/images/I/71PXmc5BgAL._AC_UL320_.jpg',59523,4.7,'$0.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/12-Rules-Life-Antidote-Chaos/dp/B0B53XTL4G/ref=sr_1_77?keywords=health&qid=1703020344&sr=8-77',44,'2023-12-19 15:12:27.175913-06','2023-12-19 15:12:27.175913-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3356,'Prostate Support Supplement for Men''s Health (120 Capsules) One Serving per Day for 30 Days Supports Prostate Function and Urinary Control (Saw Palmetto, Pumpkin Seed Oil, Selenium) by Double Wood',NULL,'B0CGMF8HCQ','https://m.media-amazon.com/images/I/81vwLQLm5GL._AC_UL320_.jpg',96,4.6,'$9.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Prostate-Supplement-Capsules-Double-Wood/dp/B0CGMF8HCQ/ref=sr_1_78?keywords=health&qid=1703020344&sr=8-78',44,'2023-12-19 15:12:27.182689-06','2023-12-19 15:12:27.182689-06','www.amazon.com'), + (3415,'DenTek Easy Brush Advanced Clean Interdental Cleaners, Standard, 16 Count, 6 Pack',NULL,'B00CD2922A','https://m.media-amazon.com/images/I/71IwAkjgGKL._AC_UL320_.jpg',2468,4.7,'$20.76','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/DenTek-Interdental-Cleaners-Brushes-Standard/dp/B00CD2922A/ref=sr_1_33?keywords=dental&qid=1703020352&sr=8-33',45,'2023-12-19 15:12:33.309819-06','2023-12-19 15:12:33.309819-06','www.amazon.com'), + (3357,'Collagen Pills 1000mg Biotin 10000mcg Keratin Saw Palmetto 2500mg Hyaluronic Acid - Hair Skin and Nails Vitamins and DHT Blocker with Vitamin E Folic Acid Pumpkin Seed MSM Made in USA - 90 Count',NULL,'B0B3GBJJGW','https://m.media-amazon.com/images/I/81ooaO+kxRL._AC_UL320_.jpg',4138,4.4,'$29.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxOTI2NDkxNTAzNTk0NzE3OjE3MDMwMjAzNDQ6c3BfbXRmOjIwMDA2ODk0ODEwMzA5ODo6MDo6&url=%2FCollagen-10000mcg-Keratin-Palmetto-Hyaluronic%2Fdp%2FB0B3GBJJGW%2Fref%3Dsr_1_79_sspa%3Fkeywords%3Dhealth%26qid%3D1703020344%26rdc%3D1%26sr%3D8-79-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',44,'2023-12-19 15:12:27.19143-06','2023-12-19 15:12:27.19143-06','www.amazon.com'), + (3358,'Dr. Harvey''s Canine Health Miracle Dog Food, Human Grade Dehydrated Base Mix for Dogs with Organic Whole Grains and Vegetables (5 Pounds)',NULL,'B001B185I6','https://m.media-amazon.com/images/I/71Thbd+SxAL._AC_UL320_.jpg',4208,4.5,'$47.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxOTI2NDkxNTAzNTk0NzE3OjE3MDMwMjAzNDQ6c3BfbXRmOjMwMDA0NTI4MDA4NTcwMjo6MDo6&url=%2FDr-HarveyS-Canine-Health-Miracle%2Fdp%2FB001B185I6%2Fref%3Dsr_1_80_sspa%3Fkeywords%3Dhealth%26qid%3D1703020344%26rdc%3D1%26sr%3D8-80-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',44,'2023-12-19 15:12:27.198962-06','2023-12-19 15:12:27.198962-06','www.amazon.com'), + (3359,'How to Win Friends & Influence People (Dale Carnegie Books)',NULL,'1797140825','https://m.media-amazon.com/images/I/71vK0WVQ4rL._AC_UL320_.jpg',30624,4.7,'$10.29','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/How-Win-Friends-Influence-People/dp/1797140825/ref=sr_1_82?keywords=health&qid=1703020344&sr=8-82',44,'2023-12-19 15:12:27.206365-06','2023-12-19 15:12:27.206365-06','www.amazon.com'), + (3360,'The Health Anxiety Workbook: Practical Exercises to Overcome Your Health Worries',NULL,'B09LZ6CTKC','https://m.media-amazon.com/images/I/61LKEVIo4KL._AC_UL320_.jpg',128,4.5,'$16.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Health-Anxiety-Workbook-Practical-Exercises-ebook/dp/B09LZ6CTKC/ref=sr_1_85?keywords=health&qid=1703020344&sr=8-85',44,'2023-12-19 15:12:27.217264-06','2023-12-19 15:12:27.217264-06','www.amazon.com'), + (3361,'NOW Supplements, Prostate Health, Clinical Strength Saw Palmetto, Beta-Sitosterol & Lycopene, 180 Softgels',NULL,'B003P7YWDG','https://m.media-amazon.com/images/I/81SG-as3nZL._AC_UL320_.jpg',4133,4.3,'$37.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/NOW-Supplements-Prostate-Clinical-Beta-Sitosterol/dp/B003P7YWDG/ref=sr_1_86?keywords=health&qid=1703020344&sr=8-86',44,'2023-12-19 15:12:27.22459-06','2023-12-19 15:12:27.22459-06','www.amazon.com'), + (3362,'AncestryDNA Genetic Test Kit: Personalized Genetic Results, DNA Ethnicity Test, Origins & Ethnicities, Complete DNA Test',NULL,'B00TRLVKW0','https://m.media-amazon.com/images/I/617BGIO5IoL._AC_UL320_.jpg',82132,4.6,'$59.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/AncestryDNA-Genetic-Ethnicity-Test/dp/B00TRLVKW0/ref=sr_1_87?keywords=health&qid=1703020344&sr=8-87',44,'2023-12-19 15:12:27.230779-06','2023-12-19 15:12:27.230779-06','www.amazon.com'), + (3363,'Physician''s Choice Probiotics for Women - PH Balance, Digestive, UT, & Feminine Health - 50 Billion CFU - 6 Unique Strains for Women - Organic Prebiotics, Cranberry Extract+ - Women Probiotic - 30 CT',NULL,'B07B8BSGPL','https://m.media-amazon.com/images/I/811xX0k4AmL._AC_UL320_.jpg',39519,4.5,'$21.97','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Physicians-Choice-Probiotics-Women-Prebiotics/dp/B07B8BSGPL/ref=sr_1_88?keywords=health&qid=1703020344&rdc=1&sr=8-88',44,'2023-12-19 15:12:27.238194-06','2023-12-19 15:12:27.238194-06','www.amazon.com'), + (3364,'Dr. A''s Habits of Health: The Path to Permanent Weight Control and Optimal Health',NULL,'0981914640','https://m.media-amazon.com/images/I/61GJzcYE6PL._AC_UL320_.jpg',1098,4.5,'$8.22','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Dr-As-Habits-Health-Permanent/dp/0981914640/ref=sr_1_89?keywords=health&qid=1703020344&sr=8-89',44,'2023-12-19 15:12:27.245923-06','2023-12-19 15:12:27.245923-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3365,'Culturelle Pro Strength Daily Probiotic, Digestive Health Capsules, Supports Occasional Diarrhea, Gas & Bloating, Gluten and Soy Free, 60 Count',NULL,'B08Y66H6B7','https://m.media-amazon.com/images/I/71EPvEtquhL._AC_UL320_.jpg',19226,4.7,'$35.18','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Culturelle-Strength-Probiotic-Digestive-Naturally/dp/B08Y66H6B7/ref=sr_1_91?keywords=health&qid=1703020344&sr=8-91',44,'2023-12-19 15:12:27.253913-06','2023-12-19 15:12:27.253913-06','www.amazon.com'), + (3366,'Do-It-Yourself Herbal Medicine: Home-Crafted Remedies for Health and Beauty',NULL,'194241109X','https://m.media-amazon.com/images/I/91aXvJ1tsNL._AC_UL320_.jpg',644,4.7,'$14.40','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Do-Yourself-Herbal-Medicine-Home-Crafted/dp/194241109X/ref=sr_1_92?keywords=health&qid=1703020344&sr=8-92',44,'2023-12-19 15:12:27.263752-06','2023-12-19 15:12:27.263752-06','www.amazon.com'), + (3367,'The Magic Pill',NULL,'B078HFGJHV','https://m.media-amazon.com/images/I/71NkcRx0WmL._AC_UL320_.jpg',894,4.1,'$2.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Magic-Pill-Pete-Evans/dp/B078HFGJHV/ref=sr_1_93?keywords=health&qid=1703020344&sr=8-93',44,'2023-12-19 15:12:27.272363-06','2023-12-19 15:12:27.272363-06','www.amazon.com'), + (3368,'Everything I Know About Love: A Memoir',NULL,'1094114863','https://m.media-amazon.com/images/I/71rx1nvV+rL._AC_UL320_.jpg',23384,4.2,'$11.39','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Everything-Know-About-Love-Memoir/dp/1094114863/ref=sr_1_94?keywords=health&qid=1703020344&sr=8-94',44,'2023-12-19 15:12:27.279237-06','2023-12-19 15:12:27.279237-06','www.amazon.com'), + (3508,'Real Essentials',NULL,'B07NWZ6PBF','https://m.media-amazon.com/images/I/81+O6GnEKyL._AC_UL320_.jpg',46350,4.4,'$33.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/T-Shirt-Athletic-Essentials-Clothing-Undershirt/dp/B07NWZ6PBF/ref=sr_1_8?keywords=men%27s+clothing&qid=1703020369&sr=8-8',46,'2023-12-19 15:12:50.826881-06','2023-12-19 15:12:50.826881-06','www.amazon.com'), + (3370,'Nature''s Bounty Cranberry 4200mg With Vitamin C, Urinary Health & Immune Support, Cranberry Concentrate, 250 Rapid Release Softgels',NULL,'B002Y27JRE','https://m.media-amazon.com/images/I/71U4oblZFyL._AC_UL320_.jpg',20108,4.7,'$22.43','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Natures-Bounty-Cranberry-Supplement-Supports/dp/B002Y27JRE/ref=sr_1_96?keywords=health&qid=1703020344&sr=8-96',44,'2023-12-19 15:12:27.295012-06','2023-12-19 15:12:27.295012-06','www.amazon.com'), + (3371,'Breath: The New Science of a Lost Art',NULL,'B09F6ZNL3H','https://m.media-amazon.com/images/I/81NygdDiGRL._AC_UL320_.jpg',26421,4.7,'$14.68','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Breath-New-Science-Lost-Art/dp/B09F6ZNL3H/ref=sr_1_97?keywords=health&qid=1703020344&sr=8-97',44,'2023-12-19 15:12:27.305749-06','2023-12-19 15:12:27.305749-06','www.amazon.com'), + (3372,'Health By Habit Stress Relief Supplement (60 Capsules) - Vitamin B, Zen, Lemon Balm, Supports Relaxation, Mood Balance, Reduce Stress, Non-GMO, Sugar Free (1 Pack)',NULL,'B0BL1Q5LZT','https://m.media-amazon.com/images/I/61nNYO94SgL._AC_UL320_.jpg',290,4.5,'$8.88','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Health-Habit-Stress-Supplement-Capsules/dp/B0BL1Q5LZT/ref=sr_1_98?keywords=health&qid=1703020344&sr=8-98',44,'2023-12-19 15:12:27.313075-06','2023-12-19 15:12:27.313075-06','www.amazon.com'), + (3373,'Mastery',NULL,'0670024961','https://m.media-amazon.com/images/I/71B5yWb5t7L._AC_UL320_.jpg',9179,4.7,'$0.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Mastery-Robert-Greene/dp/0670024961/ref=sr_1_100?keywords=health&qid=1703020344&sr=8-100',44,'2023-12-19 15:12:27.320317-06','2023-12-19 15:12:27.320317-06','www.amazon.com'), + (3374,'Thinking, Fast and Slow',NULL,'B09WJJQLXN','https://m.media-amazon.com/images/I/61fdrEuPJwL._AC_UL320_.jpg',41723,4.6,'$11.29','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Thinking-Fast-and-Slow/dp/B09WJJQLXN/ref=sr_1_101?keywords=health&qid=1703020344&sr=8-101',44,'2023-12-19 15:12:27.32712-06','2023-12-19 15:12:27.32712-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3375,'Prescription for Nutritional Healing, Sixth Edition: A Practical A-to-Z Reference to Drug-Free Remedies Using Vitamins, Minerals, Herbs, & Food Supplements',NULL,'B0C5RYF1LC','https://m.media-amazon.com/images/I/81AP3bwRliL._AC_UL320_.jpg',427,4.4,'$25.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Prescription-Nutritional-Healing-Supplements-Everything/dp/B0C5RYF1LC/ref=sr_1_102?keywords=health&qid=1703020344&sr=8-102',44,'2023-12-19 15:12:27.337375-06','2023-12-19 15:12:27.337375-06','www.amazon.com'), + (3376,'Etekcity Scale for Body Weight FSA HSA Store Eligible, Smart Bathroom Digital Weighing Machine for Fat BMI Muscle Composition, Accurate Bluetooth Home Use Health and Fitness Equipment for People',NULL,'B095YJW56C','https://m.media-amazon.com/images/I/91w5FDNyXNL._AC_UL320_.jpg',93557,4.7,'$19.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Etekcity-Bathroom-Weighing-Bluetooth-Electronic/dp/B095YJW56C/ref=sr_1_103?keywords=health&qid=1703020344&sr=8-103',44,'2023-12-19 15:12:27.348333-06','2023-12-19 15:12:27.348333-06','www.amazon.com'), + (3377,'The Laws of Human Nature',NULL,'B0CLSDV7VQ','https://m.media-amazon.com/images/I/71eXzhnrpbL._AC_UL320_.jpg',13665,4.8,'$0.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Laws-Human-Nature-Robert-Greene/dp/B0CLSDV7VQ/ref=sr_1_104?keywords=health&qid=1703020344&sr=8-104',44,'2023-12-19 15:12:27.357324-06','2023-12-19 15:12:27.357324-06','www.amazon.com'), + (3378,'ZO SKIN HEALTH Exfoliating Polish (formerly Offects Exfoliating Polish), 2.3 Ounce (Pack of 1), (22228834)',NULL,'B07MG7TR4S','https://m.media-amazon.com/images/I/71TaRzCCnZL._AC_UL320_.jpg',1170,4.6,'$53.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/ZO-Skin-Health-Exfoliating-formerly/dp/B07MG7TR4S/ref=sr_1_105?keywords=health&qid=1703020344&sr=8-105',44,'2023-12-19 15:12:27.364427-06','2023-12-19 15:12:27.364427-06','www.amazon.com'), + (3379,'52 Weeks to Better Mental Health: A Guided Workbook for Self-Exploration and Growth (Volume 5) (Guided Workbooks, 4)',NULL,'078584189X','https://m.media-amazon.com/images/I/91aW9Q6rRqL._AC_UL320_.jpg',16,4.8,'$9.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Weeks-Better-Mental-Health-Self-Exploration/dp/078584189X/ref=sr_1_106?keywords=health&qid=1703020344&sr=8-106',44,'2023-12-19 15:12:27.375272-06','2023-12-19 15:12:27.375272-06','www.amazon.com'), + (3380,'The Seven Principles for Making Marriage Work: A Practical Guide from the Country''s Foremost Relationship Expert',NULL,'1665204443','https://m.media-amazon.com/images/I/81565Tx88KL._AC_UL320_.jpg',13385,4.7,'$13.74','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Seven-Principles-Making-Marriage-Work/dp/1665204443/ref=sr_1_107?keywords=health&qid=1703020344&sr=8-107',44,'2023-12-19 15:12:27.381891-06','2023-12-19 15:12:27.381891-06','www.amazon.com'), + (3381,'Bronson Milk Thistle Silymarin Marianum & Dandelion Root Liver Health Support, Antioxidant Support, Detox, 360 Capsules',NULL,'B0C9V6YH16','https://m.media-amazon.com/images/I/71YaVRqRvbL._AC_UL320_.jpg',24221,4.7,'$21.97','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Bronson-Silymarin-Marianum-Dandelion-Antioxidant/dp/B0C9V6YH16/ref=sr_1_108?keywords=health&qid=1703020344&sr=8-108',44,'2023-12-19 15:12:27.393264-06','2023-12-19 15:12:27.393264-06','www.amazon.com'), + (3382,'Amazon Basics Extra Comfort Mint Dental Floss, 40 M, 1 Pack (Previously Solimo)',NULL,'B08QWZ4W24','https://m.media-amazon.com/images/I/61hEuEAjQFL._AC_UL320_.jpg',9776,4.4,'$3.49','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozMjM2NTQ0NjgyNjE2NzE3OjE3MDMwMjAzNTI6c3BfYXRmOjIwMDA0NjE1MzAwNzQ0MTo6MDo6&url=%2FAmazon-Basics-Extra-Comfort-Dental%2Fdp%2FB08QWZ4W24%2Fref%3Dsr_1_1_ffob_sspa%3Fkeywords%3Ddental%26qid%3D1703020352%26sr%3D8-1-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGY%26psc%3D1',45,'2023-12-19 15:12:33.055034-06','2023-12-19 15:12:33.055034-06','www.amazon.com'), + (3383,'Beauty Full Electrical 4 Motor Podiatry Chair Facial Massage Dental Aesthetic Reclining Chair All Purpose Bed - PAVO -White',NULL,'B01N4GOEVE','https://m.media-amazon.com/images/I/51AHhGO5KYL._AC_UL320_.jpg',88,4.8,'$2.299','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozMjM2NTQ0NjgyNjE2NzE3OjE3MDMwMjAzNTI6c3BfYXRmOjIwMDAxMzY2MDIzNDUyMTo6MDo6&url=%2FElectrical-Podiatry-Massage-Aesthetic-Reclining%2Fdp%2FB01N4GOEVE%2Fref%3Dsr_1_2_sspa%3Fkeywords%3Ddental%26qid%3D1703020352%26sr%3D8-2-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGY%26psc%3D1',45,'2023-12-19 15:12:33.064297-06','2023-12-19 15:12:33.064297-06','www.amazon.com'), + (3384,'Dental Tools, Teeth Cleaning Tools, Professional Dental Hygiene Kit, Plaque Remover for Teeth, Stainless Steel Tooth Scraper Plaque Tartar Cleaner, Dental Scaler - with Case, Unflavored',NULL,'B078R7ZX1W','https://m.media-amazon.com/images/I/71ynkCPsX9L._AC_UL320_.jpg',54431,4.6,'$7.96','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Dental-Tools-Cleaning-Stainless-Remover/dp/B078R7ZX1W/ref=sr_1_4?keywords=dental&qid=1703020352&sr=8-4',45,'2023-12-19 15:12:33.071311-06','2023-12-19 15:12:33.071311-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3385,'GUM Soft-Picks Original, Easy to Use Dental Picks for Teeth Cleaning and Gum Health, Disposable Interdental Brushes with Convenient Carry Case, Dentist Recommended Dental Floss Picks, 100ct',NULL,'B079K5JTMZ','https://m.media-amazon.com/images/I/81Dbf8Ji6WL._AC_UL320_.jpg',20989,4.6,'$4.85','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/GUM-Soft-Picks-Disposable-Interdental-Recommended/dp/B079K5JTMZ/ref=sr_1_5?keywords=dental&qid=1703020352&sr=8-5',45,'2023-12-19 15:12:33.077678-06','2023-12-19 15:12:33.077678-06','www.amazon.com'), + (3386,'Dental Tools, 10 Pack Professional Plaque Remover Teeth Cleaning Tools Set, Stainless Steel dental Hygiene Kit with Dental picks, Tartar Scraper, Tooth Scaler, Tongue Scraper, Dental Mirror- with Case',NULL,'B07PN9VVVG','https://m.media-amazon.com/images/I/71bRJWDb-4L._AC_UL320_.jpg',11918,4.6,'$9.97','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Cleaning-Professional-Stainless-Tweezer-Personal/dp/B07PN9VVVG/ref=sr_1_6?keywords=dental&qid=1703020352&sr=8-6',45,'2023-12-19 15:12:33.084452-06','2023-12-19 15:12:33.084452-06','www.amazon.com'), + (4556,'OlarHike 6 Set Packing Cubes for Travel, 4 Various Sizes and 6 Color Options, Luggage Organizer Bags for Travel Accessories, Travel Cubes for Suitcases (Black)',NULL,'B09HGX7VV5','https://m.media-amazon.com/images/I/81OTZhP6deL._AC_UL320_.jpg',4310,4.7,'$24.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxNTk3Mjk0NjM0MzQ4NzE3OjE3MDMwMjA2ODY6c3BfYXRmX25leHQ6MjAwMTUwNDI1Njg4NTk4OjowOjo&url=%2FSet-Packing-Cubes-Various-Sizes-Color-Options-Luggage-Organizer-Bags-Travel-Accessories%2Fdp%2FB09HGX7VV5%2Fref%3Dsr_1_52_sspa%3Fkeywords%3Dtravel%2Baccessories%26qid%3D1703020686%26sr%3D8-52-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGZfbmV4dA%26psc%3D1',57,'2023-12-19 15:18:07.885434-06','2023-12-19 15:18:07.885434-06','www.amazon.com'), + (3388,'The Humble Co. Floss Picks (200 Count) – Plant Based Dental Floss Picks for Superior Oral Care, Dental Hygiene, and Gum Health, Cruelty Free Tooth Floss Picks (Charcoal, Double Thread)',NULL,'B07NSBLN5J','https://m.media-amazon.com/images/I/71upWFgOIOL._AC_UL320_.jpg',2611,4.7,'$15.90','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozOTk1NzQ3NzY4MDE0NzE3OjE3MDMwMjAzNTI6c3Bfc2VhcmNoX3RoZW1hdGljOjIwMDA0OTMyNTc1NzM3MTo6MDo6&url=%2FNatural-Dental-Floss-Picks-4pk%2Fdp%2FB07NSBLN5J%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.d0d6e7d3-c9f1-480b-9f2a-893b95951bfb%253Aamzn1.sym.d0d6e7d3-c9f1-480b-9f2a-893b95951bfb%26cv_ct_cx%3Ddental%26keywords%3Ddental%26pd_rd_i%3DB07NSBLN5J%26pd_rd_r%3Db4082be5-3659-4c04-95e1-c9c990733d67%26pd_rd_w%3DnVgTD%26pd_rd_wg%3DkNaLO%26pf_rd_p%3Dd0d6e7d3-c9f1-480b-9f2a-893b95951bfb%26pf_rd_r%3D6BDACS52YWZ77X2S2NB1%26qid%3D1703020352%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-1-2c727eeb-987f-452f-86bd-c2978cc9d8b9-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',45,'2023-12-19 15:12:33.0982-06','2023-12-19 15:12:33.0982-06','www.amazon.com'), + (3389,'NatureWise Oral Health Chewable Probiotics | Supports Healthy Teeth, Gums, & Better Breath | Ear, Nose, Throat Immunity for Kids & Adults | Sugar-Free Natural Mint Flavor [2 Month Supply - 50 Tablets]',NULL,'B01E6C4H6U','https://m.media-amazon.com/images/I/71daFgxd60L._AC_UL320_.jpg',3040,4.2,'$26.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozOTk1NzQ3NzY4MDE0NzE3OjE3MDMwMjAzNTI6c3Bfc2VhcmNoX3RoZW1hdGljOjIwMDA5NTcwODM4MDY0MTo6MTo6&url=%2FNatureWise-Chewable-Probiotics-Supports-Sugar-Free%2Fdp%2FB01E6C4H6U%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.d0d6e7d3-c9f1-480b-9f2a-893b95951bfb%253Aamzn1.sym.d0d6e7d3-c9f1-480b-9f2a-893b95951bfb%26cv_ct_cx%3Ddental%26keywords%3Ddental%26pd_rd_i%3DB01E6C4H6U%26pd_rd_r%3Db4082be5-3659-4c04-95e1-c9c990733d67%26pd_rd_w%3DnVgTD%26pd_rd_wg%3DkNaLO%26pf_rd_p%3Dd0d6e7d3-c9f1-480b-9f2a-893b95951bfb%26pf_rd_r%3D6BDACS52YWZ77X2S2NB1%26qid%3D1703020352%26rdc%3D1%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-2-2c727eeb-987f-452f-86bd-c2978cc9d8b9-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',45,'2023-12-19 15:12:33.10449-06','2023-12-19 15:12:33.10449-06','www.amazon.com'), + (3390,'Cocofloss Woven Dental Floss, Dentist-Designed Oral Care, Mint, Waxed, Expanding, Vegan, Kid-Friendly String Floss with Coconut Oil, 4 Spools (33 yd Each)',NULL,'B084RSJZY6','https://m.media-amazon.com/images/I/71c5dUFt9-L._AC_UL320_.jpg',7951,4.4,'$36.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozOTk1NzQ3NzY4MDE0NzE3OjE3MDMwMjAzNTI6c3Bfc2VhcmNoX3RoZW1hdGljOjIwMDE2NDk4MTE3NzE5ODo6Mjo6&url=%2FCOCOFLOSS-Coconut-Oil-Infused-Dentist-Designed-Cruelty-Free%2Fdp%2FB084RSJZY6%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.d0d6e7d3-c9f1-480b-9f2a-893b95951bfb%253Aamzn1.sym.d0d6e7d3-c9f1-480b-9f2a-893b95951bfb%26cv_ct_cx%3Ddental%26keywords%3Ddental%26pd_rd_i%3DB084RSJZY6%26pd_rd_r%3Db4082be5-3659-4c04-95e1-c9c990733d67%26pd_rd_w%3DnVgTD%26pd_rd_wg%3DkNaLO%26pf_rd_p%3Dd0d6e7d3-c9f1-480b-9f2a-893b95951bfb%26pf_rd_r%3D6BDACS52YWZ77X2S2NB1%26qid%3D1703020352%26rdc%3D1%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-3-2c727eeb-987f-452f-86bd-c2978cc9d8b9-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',45,'2023-12-19 15:12:33.110298-06','2023-12-19 15:12:33.110298-06','www.amazon.com'), + (4557,'Plush Velvet Travel Jewelry Case, Travel Jewelry Organizer, Jewelry Travel Case, Travel Jewelry Box, Small Jewelry Case for Women, Jewelry Travel Box, Earring Organizer with Mirror - Emerald Green',NULL,'B0C28CS8Q4','https://m.media-amazon.com/images/I/71kybmXExyL._AC_UL320_.jpg',74,4.7,'$12.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Plush-Velvet-Travel-Jewelry-Case/dp/B0C28CS8Q4/ref=sr_1_53?keywords=travel+accessories&qid=1703020686&sr=8-53',57,'2023-12-19 15:18:07.891788-06','2023-12-19 15:18:07.891788-06','www.amazon.com'), + (3392,'Plackers Micro Mint Dental Floss Picks, 90 Count (Pack of 3)',NULL,'B078XYC6R3','https://m.media-amazon.com/images/I/71Yq16QeN2L._AC_UL320_.jpg',51975,4.7,'$6.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Plackers-Micro-Dental-Floss-Picks/dp/B078XYC6R3/ref=sr_1_7?keywords=dental&qid=1703020352&sr=8-7',45,'2023-12-19 15:12:33.129039-06','2023-12-19 15:12:33.129039-06','www.amazon.com'), + (3393,'DenTek Professional Oral Care Kit, Advanced Clean- Portable, Multiple Tips, Dental Pick, Scaler, Stimulator, and Dental Mirror, White',NULL,'B07LGSYTLM','https://m.media-amazon.com/images/I/612eGtNOYqL._AC_UL320_.jpg',29572,4.5,'$6.49','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/DenTek-Professional-Oral-Care-Kit/dp/B07LGSYTLM/ref=sr_1_8?keywords=dental&qid=1703020352&rdc=1&sr=8-8',45,'2023-12-19 15:12:33.136851-06','2023-12-19 15:12:33.136851-06','www.amazon.com'), + (3394,'Plackers Micro Line Dental Floss Picks, Fold-Out FlipPick, Tuffloss, Easy Storage with Sure-Zip Seal, Fresh Mint Flavor, 300 Count',NULL,'B085YL4HR7','https://m.media-amazon.com/images/I/71tvWE9UFWL._AC_UL320_.jpg',18069,4.7,'$7.68','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Plackers-Flossers-Fold-Out-Toothpick-Tuffloss/dp/B085YL4HR7/ref=sr_1_10?keywords=dental&qid=1703020352&sr=8-10',45,'2023-12-19 15:12:33.144048-06','2023-12-19 15:12:33.144048-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3395,'Amazon Basics Mint Dental Flossers, 90 Count, 1 Pack (Previously Solimo)',NULL,'B08QWYMGRR','https://m.media-amazon.com/images/I/61Lu42O2+ML._AC_UL320_.jpg',14297,4.6,'$3.49','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozMjM2NTQ0NjgyNjE2NzE3OjE3MDMwMjAzNTI6c3BfbXRmOjIwMDA1Mjg5NDI0ODUxMTo6MDo6&url=%2FAmazon-Basics-Dental-Flosses-Count%2Fdp%2FB08QWYMGRR%2Fref%3Dsr_1_11_ffob_sspa%3Fkeywords%3Ddental%26qid%3D1703020352%26sr%3D8-11-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',45,'2023-12-19 15:12:33.151445-06','2023-12-19 15:12:33.151445-06','www.amazon.com'), + (4558,'4pcs Hair Tie Organizer,Portable Travel Qtip Holder,Bathroom Storage Organizer Qtip Dispenser Cotton Swabs Dispenser Kids Hair Accessory Box with Lid for Bathroom,Desktop Organizer (4 Pcs White)',NULL,'B0BZMJ33S4','https://m.media-amazon.com/images/I/71zmVid0nzL._AC_UL320_.jpg',64,4.4,'$13.88','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Hair-Tie-Organizer-Dispenser-Accessory/dp/B0BZMJ33S4/ref=sr_1_54?keywords=travel+accessories&qid=1703020686&sr=8-54',57,'2023-12-19 15:18:07.896887-06','2023-12-19 15:18:07.896887-06','www.amazon.com'), + (3387,'Cocofloss Woven Dental Floss, Dentist-Designed Oral Care, Waxed, Vegan, Kid-Friendly, with Coconut Oil, 4-Pack of Mint, Coconut, Orange, Strawberry (33 yd Each)',NULL,'B0B64QN5NR','https://m.media-amazon.com/images/I/61RiWjVusBL._AC_UL320_.jpg',1325,4.6,'$36.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozOTk1NzQ3NzY4MDE0NzE3OjE3MDMwMjAzNTI6c3Bfc2VhcmNoX3RoZW1hdGljOjIwMDE3Mjc2NTk1NzM5ODo6NDo6&url=%2FCOCOFLOSS-Coconut-Oil-Fragrances-Dentist-Designed-Cruelty-Free%2Fdp%2FB0B64QN5NR%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.d0d6e7d3-c9f1-480b-9f2a-893b95951bfb%253Aamzn1.sym.d0d6e7d3-c9f1-480b-9f2a-893b95951bfb%26cv_ct_cx%3Ddental%26keywords%3Ddental%26pd_rd_i%3DB0B64QN5NR%26pd_rd_r%3Db4082be5-3659-4c04-95e1-c9c990733d67%26pd_rd_w%3DnVgTD%26pd_rd_wg%3DkNaLO%26pf_rd_p%3Dd0d6e7d3-c9f1-480b-9f2a-893b95951bfb%26pf_rd_r%3D6BDACS52YWZ77X2S2NB1%26qid%3D1703020352%26rdc%3D1%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-5-2c727eeb-987f-452f-86bd-c2978cc9d8b9-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',45,'2023-12-19 15:12:33.092209-06','2023-12-19 15:12:42.42729-06','www.amazon.com'), + (3509,'Wrangler Authentics',NULL,'B01L7B4VGY','https://m.media-amazon.com/images/I/61J2YWfGrXL._AC_UL320_.jpg',46816,4.6,'$30.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Wrangler-Authentics-Quilted-Flannel-Eclipse/dp/B01L7B4VGY/ref=sr_1_9?keywords=men%27s+clothing&qid=1703020369&sr=8-9',46,'2023-12-19 15:12:50.833444-06','2023-12-19 15:12:50.833444-06','www.amazon.com'), + (3510,'Amazon Essentials',NULL,'B085YVCGDP','https://m.media-amazon.com/images/I/91mNiXLT64L._AC_UL320_.jpg',5210,4.5,'$23.90','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Amazon-Essentials-Long-Sleeve-Charcoal-Heather/dp/B085YVCGDP/ref=sr_1_10?keywords=men%27s+clothing&qid=1703020369&sr=8-10',46,'2023-12-19 15:12:50.840779-06','2023-12-19 15:12:50.840779-06','www.amazon.com'), + (3397,'COSLUS Water Dental Flosser Teeth Pick: Portable Cordless Oral Irrigator 300ML Rechargeable Travel Irrigation Cleaner IPX7 Waterproof Electric Waterflosser Flossing Machine for Teeth Cleaning F5020E',NULL,'B0BG52SJ5N','https://m.media-amazon.com/images/I/71Ya0PuPwzL._AC_UL320_.jpg',7588,4.4,'$29.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Water-Dental-Flosser-Teeth-Pick/dp/B0BG52SJ5N/ref=sr_1_13?keywords=dental&qid=1703020352&sr=8-13',45,'2023-12-19 15:12:33.165085-06','2023-12-19 15:12:33.165085-06','www.amazon.com'), + (3398,'DenTek Triple Clean Advanced Clean Floss Picks, No Break & No Shred Floss, 150 Count',NULL,'B003K01BMI','https://m.media-amazon.com/images/I/71DiH1kJ+yL._AC_UL320_.jpg',68568,4.7,'$3.69','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/DenTek-Triple-Clean-Floss-Picks/dp/B003K01BMI/ref=sr_1_14?keywords=dental&qid=1703020352&sr=8-14',45,'2023-12-19 15:12:33.172579-06','2023-12-19 15:12:33.172579-06','www.amazon.com'), + (4559,'VENTURE 4TH Travel Money Belt - Slim Passport Holder RFID Blocking Travel Pouch to Protect Cash, Credit Cards and Travel Documents',NULL,'B00WBMQ89C','https://m.media-amazon.com/images/I/71b2k2fa30L._AC_UL320_.jpg',8878,4.5,'$21.20','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Minimalist-Design-Money-Blocking-Women/dp/B00WBMQ89C/ref=sr_1_55?keywords=travel+accessories&qid=1703020686&sr=8-55',57,'2023-12-19 15:18:07.901915-06','2023-12-19 15:18:07.901915-06','www.amazon.com'), + (3401,'Oral-B Glide Pro-Health Comfort Plus Dental Floss, Mint',NULL,'B07FLBBWJR','https://m.media-amazon.com/images/I/71yywhxAdzL._AC_UL320_.jpg',15666,4.8,'$9.97','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Oral-B-Glide-Pro-Health-Comfort-Dental/dp/B07FLBBWJR/ref=sr_1_16?keywords=dental&qid=1703020352&sr=8-16',45,'2023-12-19 15:12:33.193609-06','2023-12-19 15:12:33.193609-06','www.amazon.com'), + (3402,'H2ofloss® Dental Water Flosser for Teeth Cleaning with 12 Multifunctional Tips&800ml Capacity, Professional Countertop Oral Irrigator Quiet Design(HF-9)',NULL,'B010NNIZQE','https://m.media-amazon.com/images/I/71Gqix5LAJL._AC_UL320_.jpg',15647,4.3,'$38.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozMjM2NTQ0NjgyNjE2NzE3OjE3MDMwMjAzNTI6c3BfbXRmOjMwMDAxMjcxODE3NDcwMjo6MDo6&url=%2FH2ofloss-Multifunctional-Professional-Countertop-Irrigator%2Fdp%2FB010NNIZQE%2Fref%3Dsr_1_17_sspa%3Fkeywords%3Ddental%26qid%3D1703020352%26sr%3D8-17-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',45,'2023-12-19 15:12:33.200493-06','2023-12-19 15:12:33.200493-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3403,'FAMILIFE Floss Picks, 240 Count Mint Dental Floss Picks, Tooth Picks Flossers with 4 Travel Handy Cases, Helps to Fight Tooth Decay and Keep Your Teeth Clean, Floss Sticks for Family',NULL,'B075RXXKFQ','https://m.media-amazon.com/images/I/71AA06ctzEL._AC_UL320_.jpg',3307,4.6,'$13.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozMjM2NTQ0NjgyNjE2NzE3OjE3MDMwMjAzNTI6c3BfbXRmOjIwMDEzMjI4NDA2NDM5ODo6MDo6&url=%2FFAMILIFE-Dental-Travel-Counts-Flossers%2Fdp%2FB075RXXKFQ%2Fref%3Dsr_1_18_sspa%3Fkeywords%3Ddental%26qid%3D1703020352%26rdc%3D1%26sr%3D8-18-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',45,'2023-12-19 15:12:33.207583-06','2023-12-19 15:12:33.207583-06','www.amazon.com'), + (3400,'Plaque/Tartar Remover for Teeth, Dental Calculus Remover Teeth Cleaning Kit with LED Light & 5 Adjustable Modes',NULL,'B0B8H6LWRQ','https://m.media-amazon.com/images/I/71Cxz23-i7L._AC_UL320_.jpg',3046,4.4,'$49.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Plaque-Remover-Calculus-Cleaning-Adjustable/dp/B0B8H6LWRQ/ref=sr_1_15?keywords=dental&qid=1703020352&sr=8-15',45,'2023-12-19 15:12:33.187096-06','2023-12-19 15:12:33.213986-06','www.amazon.com'), + (3404,'Oral-B Complete Glide Floss Picks, Scope Outlast, 75-ct',NULL,'B00UB7BO16','https://m.media-amazon.com/images/I/6188pq9210L._AC_UL320_.jpg',4819,4.6,'$3.96','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Oral-B-Glide-Complete-Outlast-Dental/dp/B00UB7BO16/ref=sr_1_21?keywords=dental&qid=1703020352&sr=8-21',45,'2023-12-19 15:12:33.222686-06','2023-12-19 15:12:33.222686-06','www.amazon.com'), + (3405,'DenTek Mouth Guard for Nighttime Teeth Grinding, Professional-Fit Dental Guard, 1 Count',NULL,'B008YEMVSI','https://m.media-amazon.com/images/I/71rdf467R4L._AC_UL320_.jpg',16946,3.9,'$18.23','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/DenTek-Professional-Fit-Protection-Nightime-Packaging/dp/B008YEMVSI/ref=sr_1_22?keywords=dental&qid=1703020352&rdc=1&sr=8-22',45,'2023-12-19 15:12:33.229387-06','2023-12-19 15:12:33.229387-06','www.amazon.com'), + (3526,'Hanes',NULL,'B010277HJW','https://m.media-amazon.com/images/I/61Mup1lPC8L._AC_UL320_.jpg',81796,4.5,'$12.40','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Hanes-Long-Sleeve-Beefy-Henley-T-Shirt/dp/B010277HJW/ref=sr_1_25?keywords=men%27s+clothing&qid=1703020369&sr=8-25',46,'2023-12-19 15:12:50.969891-06','2023-12-19 15:12:50.969891-06','www.amazon.com'), + (3527,'Amazon Essentials',NULL,'B079RPS46G','https://m.media-amazon.com/images/I/81IeHROT22L._AC_UL320_.jpg',23748,4.5,'$21.50','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Amazon-Essentials-V-Neck-Sweater-Heather/dp/B079RPS46G/ref=sr_1_26?keywords=men%27s+clothing&qid=1703020369&sr=8-26',46,'2023-12-19 15:12:50.976383-06','2023-12-19 15:12:50.976383-06','www.amazon.com'), + (4560,'Hair Tools Travel Bag and Heat Resistant Mat for Flat Irons, Straighteners, Curling Iron, and Haircare Accessories, 2-in-1 design, with Interior Pockets, Portable Organizer, Neoprene (Black)',NULL,'B0BS3GBLNY','https://m.media-amazon.com/images/I/71W0TYBZmXL._AC_UL320_.jpg',272,4.5,'$32.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Resistant-Straighteners-Haircare-Accessories-Organizer/dp/B0BS3GBLNY/ref=sr_1_56?keywords=travel+accessories&qid=1703020686&sr=8-56',57,'2023-12-19 15:18:07.908146-06','2023-12-19 15:18:07.908146-06','www.amazon.com'), + (3406,'Dental Tools, 6 Pack Teeth Cleaning Tools Stainless Steel Dental Scraper, Pick Hygiene Set with Mouth Mirror, Tweezer Kit for Dentist, Personal Using, Pets - Tooth Tartar Plaque Scraper Remover',NULL,'B08PD99T5H','https://m.media-amazon.com/images/I/71OPYgB933S._AC_UL320_.jpg',3699,4.5,'$6.96','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Cleaning-Stainless-Scraper-Hygiene-Personal/dp/B08PD99T5H/ref=sr_1_23?keywords=dental&qid=1703020352&sr=8-23',45,'2023-12-19 15:12:33.23672-06','2023-12-19 15:12:33.23672-06','www.amazon.com'), + (3396,'Plaque Remover for Teeth - Tartar Remover for Teeth, Dental Calculus Remover Teeth Cleaning Kit',NULL,'B0BK8WN8QK','https://m.media-amazon.com/images/I/719IMDQ-zlL._AC_UL320_.jpg',1315,4.5,'$42.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozMjM2NTQ0NjgyNjE2NzE3OjE3MDMwMjAzNTI6c3BfbXRmOjMwMDA1MzI4NzAwMzEwMjo6MDo6&url=%2FPlaque-Remover-Teeth-Calculus-Cleaning%2Fdp%2FB0BK8WN8QK%2Fref%3Dsr_1_12_sspa%3Fkeywords%3Ddental%26qid%3D1703020352%26sr%3D8-12-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',45,'2023-12-19 15:12:33.15834-06','2023-12-19 15:12:33.243821-06','www.amazon.com'), + (3407,'ducalmoral Dental Implant Prosthetic Universal Wrench kit 10-70NCM Ratchet Drivers Dental Implant Repair Tool Kits Wrench Kit With Drivers Hand Use (16 Drivers B Type)',NULL,'B0BJ2638PW','https://m.media-amazon.com/images/I/51y6wfWbdEL._AC_UL320_.jpg',8,4.4,'$159.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozMjM2NTQ0NjgyNjE2NzE3OjE3MDMwMjAzNTI6c3BfbXRmOjIwMDEyMDk2ODM2NzM5ODo6MDo6&url=%2Fducalmoral-Implant-Prosthetic-Universal-10-70NCM%2Fdp%2FB0BJ2638PW%2Fref%3Dsr_1_25_sspa%3Fkeywords%3Ddental%26qid%3D1703020352%26sr%3D8-25-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',45,'2023-12-19 15:12:33.251964-06','2023-12-19 15:12:33.251964-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4561,'LIV3D Travel Belt for Luggage - Adjustable and Trendy - Luggage Strap for Bag Attachment Carrying Bag - Effortless Travel - Travel Smarter with Airport, Train Travel Accessories',NULL,'B0CJRK92HT','https://m.media-amazon.com/images/I/71Z+b+IHjAL._AC_UL320_.jpg',44,4.7,'$17.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/LIV3D-Travel-Belt-Luggage-Accessories/dp/B0CJRK92HT/ref=sr_1_57?keywords=travel+accessories&qid=1703020686&sr=8-57',57,'2023-12-19 15:18:07.913397-06','2023-12-19 15:18:07.913397-06','www.amazon.com'), + (3409,'Dental Mirror Stainless Steel with Handle 6.5", Dentist Tool for Teeth Cleaning Plaque, Mouth Inspection, Lash Extension Mirror, Eyelash Extensions Dental Mirror Inspect Instrument Makeup - Pack of 2',NULL,'B09JFLLTVX','https://m.media-amazon.com/images/I/71Gh1DmOrgL._AC_UL320_.jpg',624,4.3,'$6.96','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozMjM2NTQ0NjgyNjE2NzE3OjE3MDMwMjAzNTI6c3BfbXRmOjIwMDAyNjkxMDY2MzY5ODo6MDo6&url=%2FStainless-Inspection-Extension-Extensions-Instrument%2Fdp%2FB09JFLLTVX%2Fref%3Dsr_1_27_sspa%3Fkeywords%3Ddental%26qid%3D1703020352%26sr%3D8-27-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',45,'2023-12-19 15:12:33.265586-06','2023-12-19 15:12:33.265586-06','www.amazon.com'), + (3410,'Dental Anatomy Coloring Book: Fun and Easy Adult Coloring Book for Dental Assistants, Dental Students, Dental Hygienists, Dental Therapists, Periodontists and Dentists. Essential of Dental Assisting.',NULL,'B08NVVWGDM','https://m.media-amazon.com/images/I/71FtJYcfQaL._AC_UL320_.jpg',13,3.7,'$7.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Dental-Anatomy-Coloring-Book-Periodontists/dp/B08NVVWGDM/ref=sr_1_28?keywords=dental&qid=1703020352&sr=8-28',45,'2023-12-19 15:12:33.272627-06','2023-12-19 15:12:33.272627-06','www.amazon.com'), + (3411,'Plackers Twin-Line Dental Flossers, Cool Mint Flavor, Dual Action Flossing System, Easy Storage, Super Tuffloss, 2X The Clean, 75 Count',NULL,'B003N2DXPG','https://m.media-amazon.com/images/I/71NI64ESUEL._AC_UL320_.jpg',29246,4.7,'$2.42','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Plackers-Twin-Line-Dental-Floss-Picks/dp/B003N2DXPG/ref=sr_1_29?keywords=dental&qid=1703020352&sr=8-29',45,'2023-12-19 15:12:33.279123-06','2023-12-19 15:12:33.279123-06','www.amazon.com'), + (3412,'PEDIGREE DENTASTIX Large Dog Dental Treats Original Flavor Dental Bones, 1.66 lb. Pack (32 Treats)',NULL,'B0042GLVDI','https://m.media-amazon.com/images/I/81KzjTyldcL._AC_UL320_.jpg',43181,4.8,'$14.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Pedigree-Dentastix-Halloween-Dental-Original/dp/B0042GLVDI/ref=sr_1_30?keywords=dental&qid=1703020352&sr=8-30',45,'2023-12-19 15:12:33.287682-06','2023-12-19 15:12:33.287682-06','www.amazon.com'), + (3413,'Dental Tools, Dental Pick, Plaque Remover [6 Pack] for Teeth Cleaning Kit , Tooth Cleaner, Tartar Remover - Dentist Kit',NULL,'B0BNM3KPFH','https://m.media-amazon.com/images/I/81Rmdh9n9gL._AC_UL320_.jpg',1242,4.6,'$8.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Dental-Plaque-Remover-Cleaning-Cleaner/dp/B0BNM3KPFH/ref=sr_1_31?keywords=dental&qid=1703020352&sr=8-31',45,'2023-12-19 15:12:33.295005-06','2023-12-19 15:12:33.295005-06','www.amazon.com'), + (3414,'Reach Waxed Dental Floss | Effective Plaque Removal, Extra Wide Cleaning Surface | Shred Resistance & Tension, Slides Smoothly & Easily , PFAS FREE | Mint Flavored, 55 Yards, 1 Pack',NULL,'B013OKRGWW','https://m.media-amazon.com/images/I/71TQAj9zjOL._AC_UL320_.jpg',4796,4.7,'$0.97','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Reach-Dental-Plaque-Removal-Refreshing/dp/B013OKRGWW/ref=sr_1_32?keywords=dental&qid=1703020352&sr=8-32',45,'2023-12-19 15:12:33.302903-06','2023-12-19 15:12:33.302903-06','www.amazon.com'), + (3417,'Oral-B Statin Tape Dental Floss 25m (12 Units) by Oral-B Satin Tape Mint',NULL,'B013L7GNQI','https://m.media-amazon.com/images/I/71-hwVX0gyL._AC_UL320_.jpg',2020,4.7,'$21.80','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Oral-B-Statin-Dental-Floss-Units/dp/B013L7GNQI/ref=sr_1_35?keywords=dental&qid=1703020352&sr=8-35',45,'2023-12-19 15:12:33.324798-06','2023-12-19 15:12:33.324798-06','www.amazon.com'), + (3418,'ffresiss Dental Mirror with Light,Teeth Inspection LED Mirror,Anti-Fog Mouth Mirror,Dentist Oral Care Tool',NULL,'B08GSQWY5S','https://m.media-amazon.com/images/I/41pnRyr7qLL._AC_UL320_.jpg',3943,4.5,'$9.88','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/ffresiss-Dental-Inspection-Anti-Fog-Dentist/dp/B08GSQWY5S/ref=sr_1_36?keywords=dental&qid=1703020352&sr=8-36',45,'2023-12-19 15:12:33.331947-06','2023-12-19 15:12:33.331947-06','www.amazon.com'), + (3419,'Virbac CET Veggiedent FR3SH Tartar Control Chews for Dogs, Medium (Pack of 30)Beef,1.6 pounds',NULL,'B07FJQYVZ6','https://m.media-amazon.com/images/I/81rRmTjm5GL._AC_UL320_.jpg',10015,4.7,'$29.57','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Virbac-VEGGIEDENT-Control-Healthy-Solution/dp/B07FJQYVZ6/ref=sr_1_38?keywords=dental&qid=1703020352&sr=8-38',45,'2023-12-19 15:12:33.339026-06','2023-12-19 15:12:33.339026-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3420,'FELINE GREENIES Natural Dental Care Cat Treats Savory Salmon Flavor, 21 oz. Tub',NULL,'B07C3F891B','https://m.media-amazon.com/images/I/817aHDDiBBL._AC_UL320_.jpg',60056,4.8,'$22.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/FELINE-GREENIES-Dental-Natural-Treats/dp/B07C3F891B/ref=sr_1_39?keywords=dental&qid=1703020352&sr=8-39',45,'2023-12-19 15:12:33.34523-06','2023-12-19 15:12:33.34523-06','www.amazon.com'), + (3421,'Ark Naturals Brushless Toothpaste, Dog Dental Chews for Small Breeds, Freshens Breath, Helps Reduce Plaque & Tartar, 12oz, 1 Pack',NULL,'B00626UCAY','https://m.media-amazon.com/images/I/71bj1TCVUCL._AC_UL320_.jpg',14750,4.2,'$11.87','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Naturals-Breath-less-Brushless-Toothpaste-Recommended/dp/B00626UCAY/ref=sr_1_40?keywords=dental&qid=1703020352&sr=8-40',45,'2023-12-19 15:12:33.351435-06','2023-12-19 15:12:33.351435-06','www.amazon.com'), + (3408,'Ultrassist Transparent Disease Teeth Model with Dental Implant Bridge, Dental Model for Patient and Dental Student Education',NULL,'B095NVLS4Z','https://m.media-amazon.com/images/I/61v4KxSONWL._AC_UL320_.jpg',22,4.1,'$22.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozMjM2NTQ0NjgyNjE2NzE3OjE3MDMwMjAzNTI6c3BfbXRmOjIwMDA2MTE0MjgyMjg5ODo6MDo6&url=%2FUltrassist-Transparent-Disease-Teeth-Model%2Fdp%2FB095NVLS4Z%2Fref%3Dsr_1_26_sspa%3Fkeywords%3Ddental%26qid%3D1703020352%26sr%3D8-26-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',45,'2023-12-19 15:12:33.258942-06','2023-12-19 15:12:33.358225-06','www.amazon.com'), + (3422,'Dental Gift - Tooth Journal: dentist gift, dental hygenist gift, dental assistant gift, dental hygienist gift, dental hygiene gift, dental technician ... gift, dental notebook, dental journal',NULL,'1687225206','https://m.media-amazon.com/images/I/51COepJSofL._AC_UL320_.jpg',41,4.5,'$7.24','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Dental-Gift-assistant-hygienist-technician/dp/1687225206/ref=sr_1_42?keywords=dental&qid=1703020352&sr=8-42',45,'2023-12-19 15:12:33.364493-06','2023-12-19 15:12:33.364493-06','www.amazon.com'), + (3423,'Amazon Basics - Dental Flossers Fold-Away Pick ,Helps Remove Plaque, Mint Flavor, 540 Count (6 Packs of 90), (Previously Solimo)',NULL,'B08QWZ3Q41','https://m.media-amazon.com/images/I/61sV4bfnJsL._AC_UL320_.jpg',14297,4.6,'$10.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Amazon-Basics-Dental-Flosses-Count/dp/B08QWZ3Q41/ref=sr_1_43?keywords=dental&qid=1703020352&sr=8-43',45,'2023-12-19 15:12:33.371869-06','2023-12-19 15:12:33.371869-06','www.amazon.com'), + (3424,'GUM Soft-Picks Advanced, Easy to Use Dental Picks for Teeth Cleaning and Gum Health, Disposable Interdental Brushes with Convenient Carry Case, Dentist Recommended Dental Floss Picks, 90ct (4pk)',NULL,'B07B91ZQ49','https://m.media-amazon.com/images/I/5149fxCE2DL._AC_UL320_.jpg',1537,4.8,'$38.03','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Soft-Picks-Dental-Picks-Advanced-Count/dp/B07B91ZQ49/ref=sr_1_44?keywords=dental&qid=1703020352&sr=8-44',45,'2023-12-19 15:12:33.378728-06','2023-12-19 15:12:33.378728-06','www.amazon.com'), + (3425,'GREENIES Original Large Natural Dog Dental Care Chews Oral Health Dog Treats, 36 oz. Pack (24 Treats)',NULL,'B006W6YHV4','https://m.media-amazon.com/images/I/81R+GPsYs+L._AC_UL320_.jpg',76868,4.8,'$37.56','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Greenies-Original-Dental-Treats-Holiday/dp/B006W6YHV4/ref=sr_1_45?keywords=dental&qid=1703020352&sr=8-45',45,'2023-12-19 15:12:33.386592-06','2023-12-19 15:12:33.386592-06','www.amazon.com'), + (3426,'Polident 3 Minute Denture Cleanser Tablets - 120 Count',NULL,'B000GGKPWQ','https://m.media-amazon.com/images/I/812Ka-+jNtL._AC_UL320_.jpg',21885,4.8,'$6.44','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Polident-Antibacterial-Denture-Cleanser-Effervescent/dp/B000GGKPWQ/ref=sr_1_46?keywords=dental&qid=1703020352&sr=8-46',45,'2023-12-19 15:12:33.393582-06','2023-12-19 15:12:33.393582-06','www.amazon.com'), + (3427,'GUM - 10070942002438 Proxabrush Go-Betweens Interdental Brushes, Ultra Tight, Plaque Removal, 10 Count, (Pack of 6)',NULL,'B07KQBJ1V5','https://m.media-amazon.com/images/I/71bb30pzTuL._AC_UL320_.jpg',3462,4.7,'$20.34','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/GUM-Proxabrush-Go-Betweens-Interdental-Brushes/dp/B07KQBJ1V5/ref=sr_1_47?keywords=dental&qid=1703020352&sr=8-47',45,'2023-12-19 15:12:33.401888-06','2023-12-19 15:12:33.401888-06','www.amazon.com'), + (3428,'Milk-Bone Original Brushing Chews, 6 Large Daily Dental Dog Treats (Pack of 5)',NULL,'B07MNTFRFL','https://m.media-amazon.com/images/I/81DxC0THtTL._AC_UL320_.jpg',11127,4.7,'$26.40','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Milk-Bone-Brushing-Chews-Dental-Treats/dp/B07MNTFRFL/ref=sr_1_48?keywords=dental&qid=1703020352&sr=8-48',45,'2023-12-19 15:12:33.408776-06','2023-12-19 15:12:33.408776-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3429,'Anbesol Maximum Strength Oral Anesthetic Liquid - 0.41 fl oz (Packaging May Vary)',NULL,'B0BQN9RNY5','https://m.media-amazon.com/images/I/816SaOH2RiL._AC_UL320_.jpg',723,4.6,'$6.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Anbesol-Maximum-Strength-Anesthetic-Liquid/dp/B0BQN9RNY5/ref=sr_1_49?keywords=dental&qid=1703020352&rdc=1&sr=8-49',45,'2023-12-19 15:12:33.415403-06','2023-12-19 15:12:33.415403-06','www.amazon.com'), + (3430,'GUM - 6324A Soft-Picks Original Dental Picks, 320 Count',NULL,'B06XQSG36Q','https://m.media-amazon.com/images/I/712DwRhg8aL._AC_UL320_.jpg',11325,4.7,'$21.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/GUM-Soft-Picks-Original-Dental-Picks/dp/B06XQSG36Q/ref=sr_1_50?keywords=dental&qid=1703020352&sr=8-50',45,'2023-12-19 15:12:33.423395-06','2023-12-19 15:12:33.423395-06','www.amazon.com'), + (3431,'Johnson & Johnson Reach Mint Waxed Dental Floss, 5 Count',NULL,'B00FZNMHZS','https://m.media-amazon.com/images/I/71VeX+GALyL._AC_UL320_.jpg',6921,4.7,'$9.87','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Johnson-Reach-Waxed-Dental-Floss/dp/B00FZNMHZS/ref=sr_1_51?keywords=dental&qid=1703020352&sr=8-51',45,'2023-12-19 15:12:33.429984-06','2023-12-19 15:12:33.429984-06','www.amazon.com'), + (3345,'GREENIES Original TEENIE Natural Dog Dental Care Chews Oral Health Dog Treats, 36 oz. Pack (130 Treats)',NULL,'B006W6YHYQ','https://m.media-amazon.com/images/I/91WYcbT7uQL._AC_UL320_.jpg',68103,4.8,'$39.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Greenies-Original-Teenie-Dental-Holiday/dp/B006W6YHYQ/ref=sr_1_62?keywords=health&qid=1703020344&sr=8-62',44,'2023-12-19 15:12:27.078732-06','2023-12-19 15:12:33.437441-06','www.amazon.com'), + (3432,'Dental Fresh Advanced Plaque and Tartar Water Additive, 17oz – Dog Teeth Cleaning Formula to Freshen Breath and Improve Overall Oral Health',NULL,'B0006DQHQM','https://m.media-amazon.com/images/I/71sghJOu2ML._AC_UL320_.jpg',21144,4.3,'$10.79','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Dental-Fresh-Water-Additive-Clinically/dp/B0006DQHQM/ref=sr_1_53?keywords=dental&qid=1703020352&sr=8-53',45,'2023-12-19 15:12:33.443978-06','2023-12-19 15:12:33.443978-06','www.amazon.com'), + (3433,'Oral-B Glide Pro-Health Dental Floss, Deep Clean, Mint, 40m, Pack of 6',NULL,'B01KZOTTSO','https://m.media-amazon.com/images/I/61xcsiSxu4L._AC_UL320_.jpg',23973,4.8,'$18.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Glide-Oral-B-Pro-Health-Clean-Floss/dp/B01KZOTTSO/ref=sr_1_54?keywords=dental&qid=1703020352&sr=8-54',45,'2023-12-19 15:12:33.450457-06','2023-12-19 15:12:33.450457-06','www.amazon.com'), + (3434,'GUM Soft-Picks Advanced, Easy to Use Dental Picks for Teeth Cleaning and Gum Health, Disposable Interdental Brushes with Convenient Carry Case, Dentist Recommended Dental Floss Picks, 90ct (3pk)',NULL,'B07GHFTKT4','https://m.media-amazon.com/images/I/81WJ7GCQl-L._AC_UL320_.jpg',10200,4.7,'$24.23','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Sunstar-6505A-Soft-Picks-Advanced-Pack/dp/B07GHFTKT4/ref=sr_1_56?keywords=dental&qid=1703020352&sr=8-56',45,'2023-12-19 15:12:33.458475-06','2023-12-19 15:12:33.458475-06','www.amazon.com'), + (3435,'TANAVE Plaque Remover for Teeth, Teeth Cleaning Kit with Ultrasonic Tooth Cleaner and Dental Tools, Dental Picks for Teeth Cleaning and Rechargeable Plaque Blaster with LED, Tartar Remover, 4 Heads',NULL,'B0BR3K5LT3','https://m.media-amazon.com/images/I/716XBzLWcLL._AC_UL320_.jpg',811,4.5,'$39.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/TANAVE-Cleaning-Ultrasonic-Rechargeable-Portable/dp/B0BR3K5LT3/ref=sr_1_57?keywords=dental&qid=1703020352&sr=8-57',45,'2023-12-19 15:12:33.465704-06','2023-12-19 15:12:33.465704-06','www.amazon.com'), + (3436,'GuruNanda Dental Mint Floss Picks - Non- Shred Thread with Angled Pick for Effective Plaque Removal - Dentist Recommened - Travel Friendly for Adults & Kids - 100 Pack',NULL,'B0CGRTY1GW','https://m.media-amazon.com/images/I/71hqnhzEjXL._AC_UL320_.jpg',53,4.2,'$1.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/GuruNanda-Dental-Mint-Floss-Picks/dp/B0CGRTY1GW/ref=sr_1_59?keywords=dental&qid=1703020352&sr=8-59',45,'2023-12-19 15:12:33.47358-06','2023-12-19 15:12:33.47358-06','www.amazon.com'), + (3437,'Disposable Dental Bibs 13"x18" - 3 Ply Waterproof Tattoo Bib Sheet for Patients - Dentist or Medical Tray Cover and Nail Table Cover Supplies, Black',NULL,'B07HLDFCSX','https://m.media-amazon.com/images/I/61VmxIytcnL._AC_UL320_.jpg',9516,4.7,'$12.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Disposable-Piercing-Waterproof-Patient-Measuring/dp/B07HLDFCSX/ref=sr_1_60?keywords=dental&qid=1703020352&sr=8-60',45,'2023-12-19 15:12:33.480852-06','2023-12-19 15:12:33.480852-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3451,'Fixodent Complete Original Denture Adhesive Cream, 2.4 Ounce (Pack of 3)',NULL,'B07FL52N66','https://m.media-amazon.com/images/I/61hr9OnQRUL._AC_UL320_.jpg',11185,4.7,'$14.44','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Fixodent-Complete-Original-Denture-Adhesive/dp/B07FL52N66/ref=sr_1_59?keywords=dental&qid=1703020360&sr=8-59',45,'2023-12-19 15:12:42.105652-06','2023-12-19 15:12:42.105652-06','www.amazon.com'), + (3399,'BASIC CONCEPTS Tongue Scraper for Adults (2 Pack), Reduce Bad Breath (Travel Cases Included), Stainless Steel Tongue Cleaners, 100% Metal Tongue Scraper with Case Fresh Breath Tongue Cleaner Oral',NULL,'B07QRX886L','https://aax-us-iad.amazon.com/e/loi/imp?b=JPiduN6ezNUHOnm7HV6Qwd4AAAGMg-xSngEAAAH2AQBvbm9fdHhuX2JpZDcgICBvbm9fdHhuX2ltcDEgICDVpAON',100106,4.6,'$9.89','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.comhttps://aax-us-iad.amazon.com/x/c/RIJbauAC73NMIF3qwGU2mG0AAAGMg-xSUAEAAAH2AQBvbm9fdHhuX2JpZDcgICBvbm9fdHhuX2ltcDEgICBMh40v/https://www.amazon.com/Tongue-Scraper-Adults-Cleaner-Metal-Tounge-Scrapper/dp/B07QRX886L/ref=sxin_23_sbv_search_btf?content-id=amzn1.sym.6ca944f8-539c-499e-a3a4-26a566d1de59%3Aamzn1.sym.6ca944f8-539c-499e-a3a4-26a566d1de59&cv_ct_cx=dental&keywords=dental&pd_rd_i=B07QRX886L&pd_rd_r=b4082be5-3659-4c04-95e1-c9c990733d67&pd_rd_w=u4dfD&pd_rd_wg=kNaLO&pf_rd_p=6ca944f8-539c-499e-a3a4-26a566d1de59&pf_rd_r=6BDACS52YWZ77X2S2NB1&qid=1703020352&sbo=RZvfv%2F%2FHxDF%2BO5021pAnSA%3D%3D&sr=1-1-5190daf0-67e3-427c-bea6-c72c1df98776',45,'2023-12-19 15:12:33.179048-06','2023-12-19 15:12:33.488318-06','www.amazon.comhttps:'), + (3438,'Water Dental Flosser Cordless with Magnetic Charging for Teeth Cleaning, Nursal 7 Clean Settings Portable Rechargeable Oral Irrigator, IPX8 Waterproof Water Dental Picks for Home Travel',NULL,'B0BVBJ75W2','https://m.media-amazon.com/images/I/71NTPyO7BnL._AC_UL320_.jpg',341,4.3,'$34.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3NjY4OTc0OTQ3MDI3NzE3OjE3MDMwMjAzNjA6c3BfYXRmX25leHQ6MzAwMDE3ODYzNjkxMDAyOjowOjo&url=%2FCordless-Magnetic-Rechargeable-Irrigator-Waterproof%2Fdp%2FB0BVBJ75W2%2Fref%3Dsr_1_50_sspa%3Fkeywords%3Ddental%26qid%3D1703020360%26sr%3D8-50-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGZfbmV4dA%26psc%3D1',45,'2023-12-19 15:12:41.978939-06','2023-12-19 15:12:41.978939-06','www.amazon.com'), + (3440,'JS Dental Lab Night Guard for Teeth Grinding and Clenching - One Unit for Upper or Lower Teeth',NULL,'B07X8DXZFR','https://m.media-amazon.com/images/I/51OjOrrKjaL._AC_UL320_.jpg',496,4.5,'$139.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3NjY4OTc0OTQ3MDI3NzE3OjE3MDMwMjAzNjA6c3BfYXRmX25leHQ6MjAwMTIzNjgwMzg4MDk4OjowOjo&url=%2FDental-Lab-Night-Grinding-Bruxism%2Fdp%2FB07X8DXZFR%2Fref%3Dsr_1_52_sspa%3Fkeywords%3Ddental%26qid%3D1703020360%26sr%3D8-52-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGZfbmV4dA%26psc%3D1',45,'2023-12-19 15:12:42.009631-06','2023-12-19 15:12:42.009631-06','www.amazon.com'), + (3441,'Arm & Hammer Complete Care Fresh Dental Water Additive for Dogs and Cats - Dog Water Additive, Dog Mouth Wash, Dog Dental Rinse, PetWater Additive, Cat Dental Care Bad Breath, Cat Supplies',NULL,'B08QJMZPNH','https://m.media-amazon.com/images/I/719JYF6FWZL._AC_UL320_.jpg',2564,4.3,'$6.31','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Arm-Hammer-Complete-Flavorless-Brushless/dp/B08QJMZPNH/ref=sr_1_53?keywords=dental&qid=1703020360&sr=8-53',45,'2023-12-19 15:12:42.016093-06','2023-12-19 15:12:42.016093-06','www.amazon.com'), + (3442,'20 Pcs Dental Resin Fiber Post & 4 Tools Screw Glass Endo Thread 1.0/1.2/1.4/1.6MM',NULL,'B0B993Z974','https://m.media-amazon.com/images/I/51yG4Wf4tPL._AC_UL320_.jpg',8,5.0,'$19.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Dental-Resin-Fiber-Drills-Thread/dp/B0B993Z974/ref=sr_1_54?keywords=dental&qid=1703020360&sr=8-54',45,'2023-12-19 15:12:42.02346-06','2023-12-19 15:12:42.02346-06','www.amazon.com'), + (3443,'Vet''s Best Dental Care Finger Wipes - Reduces Plaque & Freshens Breath - Teeth Cleaning Finger Wipes for Dogs & Cats - 50 Count',NULL,'B08T23MHWX','https://m.media-amazon.com/images/I/71ZlhGsDyqL._AC_UL320_.jpg',5487,4.3,'$11.63','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Vets-Best-Freshens-Cleaning-Disposable/dp/B08T23MHWX/ref=sr_1_55?keywords=dental&qid=1703020360&sr=8-55',45,'2023-12-19 15:12:42.029687-06','2023-12-19 15:12:42.029687-06','www.amazon.com'), + (4513,'riemot Luggage Travel Cup Holder Free Hand Drink Carrier - Hold Two Coffee Mugs - Fits Roll on Suitcase Handles - Gifts for Flight Attendants Travelers Accessories',NULL,'B07TXCCQGP','https://m.media-amazon.com/images/I/71DWCLPKJPL._AC_UL320_.jpg',6161,4.5,'$15.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/riemot-Luggage-Travel-Holder-Drink/dp/B07TXCCQGP/ref=sr_1_15?keywords=travel+accessories&qid=1703020679&sr=8-15',57,'2023-12-19 15:18:00.507939-06','2023-12-19 15:18:07.918644-06','www.amazon.com'), + (3439,'Water Flosser, Mornwell Water Flossers for Teeth - 330ML Tank USB Rechargeable Dental Flosser, IPX7 Waterproof 3 Modes & 4 Jet Tips Portable Dental Oral Irrigator,Professional Water Flosser',NULL,'B08TWRPDQ4','https://m.media-amazon.com/images/I/71gUxSosOLL._AC_UL320_.jpg',2490,4.4,'$20.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3NjY4OTc0OTQ3MDI3NzE3OjE3MDMwMjAzNjA6c3BfYXRmX25leHQ6MjAwMTE0NzkxNjE2MDk4OjowOjo&url=%2FMornwell-Cordless-Capacity-Rechargeable-Waterproof%2Fdp%2FB08TWRPDQ4%2Fref%3Dsr_1_51_sspa%3Fkeywords%3Ddental%26qid%3D1703020360%26sr%3D8-51-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGZfbmV4dA%26psc%3D1',45,'2023-12-19 15:12:42.001608-06','2023-12-19 15:12:42.073943-06','www.amazon.com'), + (3452,'Dentalife DentaLife Made in USA Facilities Toy Breed Dog Dental Chews, Daily Mini - 58 ct. Pouch',NULL,'B01EYAQXJ8','https://m.media-amazon.com/images/I/81pMUc4Fe8L._AC_UL320_.jpg',8273,4.7,'$10.79','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Purina-Dentalife-Daily-Oral-Treats/dp/B01EYAQXJ8/ref=sr_1_60?keywords=dental&qid=1703020360&sr=8-60',45,'2023-12-19 15:12:42.11379-06','2023-12-19 15:12:42.11379-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3444,'Hangsun Water Flossers Professional for Teeth Cordless Portable Dental Oral Irrigator HOC760 300ML Rechargeable IPX7 Waterproof Water Teeth Cleaner Picks for Home Travel with 8 Jet Tips',NULL,'B0BLVM69CW','https://m.media-amazon.com/images/I/71v+ehYT48L._AC_UL320_.jpg',5795,4.4,'$29.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxMDgwMzM2NDA2NTkwNzE3OjE3MDMwMjAzNjA6c3Bfc2VhcmNoX3RoZW1hdGljOjMwMDA5ODg2MjU2OTgwMjo6MDo6&url=%2FHangsun-Professional-HOC760-Rechargeable-Waterproof%2Fdp%2FB0BLVM69CW%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%253Aamzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%26cv_ct_cx%3Ddental%26keywords%3Ddental%26pd_rd_i%3DB0BLVM69CW%26pd_rd_r%3D095a232b-6501-4dc9-8a20-260beeb8a18b%26pd_rd_w%3DYev3x%26pd_rd_wg%3DNHEcB%26pf_rd_p%3D0c4cbb48-e433-4698-bba6-b3a5297e3e20%26pf_rd_r%3D38F7DVYQ8SPJY0SR99Z8%26qid%3D1703020360%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-49-f853d353-bf33-45e7-b5c2-2cb2b31abc9b-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',45,'2023-12-19 15:12:42.044809-06','2023-12-19 15:12:42.044809-06','www.amazon.com'), + (3445,'Cordless Water Dental Flosser-H2ofloss Portable Oral Irrigator for Teeth Cleaning,Rechargeable Water Dental Picks with 5 Modes, IPX7 Waterproof and Powerful Battery for Home Travel Black',NULL,'B09DSYFKN3','https://m.media-amazon.com/images/I/712dzzfge4L._AC_UL320_.jpg',1062,4.2,'$42.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxMDgwMzM2NDA2NTkwNzE3OjE3MDMwMjAzNjA6c3Bfc2VhcmNoX3RoZW1hdGljOjIwMDE0MjQ0NDg2NTc5ODo6MTo6&url=%2FH2ofloss-Cordless-Rechargeable-IPX7Waterproof-Irrigator%2Fdp%2FB09DSYFKN3%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%253Aamzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%26cv_ct_cx%3Ddental%26keywords%3Ddental%26pd_rd_i%3DB09DSYFKN3%26pd_rd_r%3D095a232b-6501-4dc9-8a20-260beeb8a18b%26pd_rd_w%3DYev3x%26pd_rd_wg%3DNHEcB%26pf_rd_p%3D0c4cbb48-e433-4698-bba6-b3a5297e3e20%26pf_rd_r%3D38F7DVYQ8SPJY0SR99Z8%26qid%3D1703020360%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-50-f853d353-bf33-45e7-b5c2-2cb2b31abc9b-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',45,'2023-12-19 15:12:42.050699-06','2023-12-19 15:12:42.050699-06','www.amazon.com'), + (3446,'FAMILIFE Floss Picks, 200 Count Unflavored Dental Floss Picks, Tooth Picks Flossers with 4 Travel Handy Cases, Helps to Fight Tooth Decay and Keep Your Teeth Clean, Floss Sticks for Family',NULL,'B0CK1V8WKV','https://m.media-amazon.com/images/I/71Fs8+pHcqL._AC_UL320_.jpg',3307,4.6,'$13.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxMDgwMzM2NDA2NTkwNzE3OjE3MDMwMjAzNjA6c3Bfc2VhcmNoX3RoZW1hdGljOjMwMDA4MjU2MDg3MTQwMjo6Mjo6&url=%2FFAMILIFE-Unflavored-Dental-Flossers-Travel%2Fdp%2FB0CK1V8WKV%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%253Aamzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%26cv_ct_cx%3Ddental%26keywords%3Ddental%26pd_rd_i%3DB0CK1V8WKV%26pd_rd_r%3D095a232b-6501-4dc9-8a20-260beeb8a18b%26pd_rd_w%3DYev3x%26pd_rd_wg%3DNHEcB%26pf_rd_p%3D0c4cbb48-e433-4698-bba6-b3a5297e3e20%26pf_rd_r%3D38F7DVYQ8SPJY0SR99Z8%26qid%3D1703020360%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-51-f853d353-bf33-45e7-b5c2-2cb2b31abc9b-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',45,'2023-12-19 15:12:42.056619-06','2023-12-19 15:12:42.056619-06','www.amazon.com'), + (3447,'Dental Tools, 10 Pack Stainless Steel Plaque Remover Teeth Cleaning Tools Set, Oral Care Hygiene Kit with Meta Plaque Cleaner, Tartar Picks, Tooth, Tongue Scraper for Dentist, Personal, Family',NULL,'B09WCYDDLS','https://m.media-amazon.com/images/I/81ZnOoWiCqL._AC_UL320_.jpg',1431,4.6,'$9.89','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxMDgwMzM2NDA2NTkwNzE3OjE3MDMwMjAzNjA6c3Bfc2VhcmNoX3RoZW1hdGljOjIwMDA1OTI4NjMzNTY5ODo6Mzo6&url=%2FStainless-Remover-Cleaning-Hygiene-Personal%2Fdp%2FB09WCYDDLS%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%253Aamzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%26cv_ct_cx%3Ddental%26keywords%3Ddental%26pd_rd_i%3DB09WCYDDLS%26pd_rd_r%3D095a232b-6501-4dc9-8a20-260beeb8a18b%26pd_rd_w%3DYev3x%26pd_rd_wg%3DNHEcB%26pf_rd_p%3D0c4cbb48-e433-4698-bba6-b3a5297e3e20%26pf_rd_r%3D38F7DVYQ8SPJY0SR99Z8%26qid%3D1703020360%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-52-f853d353-bf33-45e7-b5c2-2cb2b31abc9b-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',45,'2023-12-19 15:12:42.066705-06','2023-12-19 15:12:42.066705-06','www.amazon.com'), + (3448,'Minties Dental Chews for Dogs, Vet-Recommended Mint-Flavored Dental Treats for Tiny/Small Dogs 5-39 lbs, Dental Bones Clean Teeth, Fight Bad Breath, and Removes Plaque and Tartar, 40 Count',NULL,'B076YLYVW8','https://m.media-amazon.com/images/I/81a6BKcviML._AC_UL320_.jpg',27202,4.5,'$9.94','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Mintes-Dental-Vet-Recommended-Mint-Flavored-Removes/dp/B076YLYVW8/ref=sr_1_56?keywords=dental&qid=1703020360&sr=8-56',45,'2023-12-19 15:12:42.081014-06','2023-12-19 15:12:42.081014-06','www.amazon.com'), + (3449,'Dingo Tartar And Breath Dental Sticks For All Dogs, 48-Count',NULL,'B0075WQMOO','https://m.media-amazon.com/images/I/81OND81yaPL._AC_UL320_.jpg',8385,4.5,'$8.29','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Dingo-Tartar-Breath-Dental-48-Count/dp/B0075WQMOO/ref=sr_1_57?keywords=dental&qid=1703020360&sr=8-57',45,'2023-12-19 15:12:42.091162-06','2023-12-19 15:12:42.091162-06','www.amazon.com'), + (3450,'Virbac CET Enzymatic Oral Hygiene Chews for Dogs, beef ,12.8 oz',NULL,'B0812LTR6B','https://m.media-amazon.com/images/I/71QVOJWorPL._AC_UL320_.jpg',8542,4.4,'$25.25','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Virbac-Enzymatic-Hygiene-Chews-Medium/dp/B0812LTR6B/ref=sr_1_58?keywords=dental&qid=1703020360&sr=8-58',45,'2023-12-19 15:12:42.098634-06','2023-12-19 15:12:42.098634-06','www.amazon.com'), + (3454,'Oral-B Glide Pro-Health Dental Floss, Deep Clean Cool Mint Flavor, 40 M, 3 Count',NULL,'B01NBRH9TF','https://m.media-amazon.com/images/I/51k7AY+gTWL._AC_UL320_.jpg',306,4.8,'$9.97','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Oral-Glide-Pro-Health-Clean-Flavor/dp/B01NBRH9TF/ref=sr_1_62?keywords=dental&qid=1703020360&sr=8-62',45,'2023-12-19 15:12:42.126987-06','2023-12-19 15:12:42.126987-06','www.amazon.com'), + (3455,'Dental Hygiene Kit - Calculus & Plaque Remover Dental Tool Set - Stainless Steel Tarter Scraper, Tooth Pick, and Mouth Mirror - Dentist Instrument Set for Teeth Cleaning (Blue)',NULL,'B01LOM4ISM','https://m.media-amazon.com/images/I/713MgYnb4qL._AC_UL320_.jpg',24805,4.6,'$14.97','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Professional-Dental-Stainless-Instruments-Hygienist/dp/B01LOM4ISM/ref=sr_1_63?keywords=dental&qid=1703020360&sr=8-63',45,'2023-12-19 15:12:42.13702-06','2023-12-19 15:12:42.13702-06','www.amazon.com'), + (3456,'PetLab Co. ProBright Dental Powder - Dog Teeth Cleaning Made Easy – Plaque & Bad Breath - Formulated for Small Dogs',NULL,'B0C5Y6MBCR','https://m.media-amazon.com/images/I/614gk3QnonL._AC_UL320_.jpg',937,3.8,'$35.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/PetLab-Co-ProBright-Dental-Powder/dp/B0C5Y6MBCR/ref=sr_1_64?keywords=dental&qid=1703020360&rdc=1&sr=8-64',45,'2023-12-19 15:12:42.143929-06','2023-12-19 15:12:42.143929-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3457,'H2ofloss Water Flosser Portable Dental Oral Irrigator with 5 Modes, 6 Replaceable Jet Tips, Rechargeable Waterproof Teeth Cleaner for Home and Travel -300ml Detachable Reservoir Black',NULL,'B08PFLQDF8','https://m.media-amazon.com/images/I/61so6UPDy0L._AC_UL320_.jpg',2822,4.1,'$29.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3NjY4OTc0OTQ3MDI3NzE3OjE3MDMwMjAzNjA6c3BfbXRmOjMwMDAxMjcxODE3NDgwMjo6MDo6&url=%2FH2ofloss-Replaceable-Rechargeable-Waterproof-Detachable%2Fdp%2FB08PFLQDF8%2Fref%3Dsr_1_65_sspa%3Fkeywords%3Ddental%26qid%3D1703020360%26sr%3D8-65-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',45,'2023-12-19 15:12:42.150516-06','2023-12-19 15:12:42.150516-06','www.amazon.com'), + (3458,'Water Dental Flosser Cordless for Teeth, Portable Oral Irrigator Rechargeable Water Flosser for Teeth Cleaning with Travel Case, 4 Modes & 5 Jet Tips Electric Flosser IPX7 Waterproof for Home Travel',NULL,'B07FS7WF3K','https://m.media-amazon.com/images/I/71TREq5aH3L._AC_UL320_.jpg',2328,4.2,'$35.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3NjY4OTc0OTQ3MDI3NzE3OjE3MDMwMjAzNjA6c3BfbXRmOjMwMDEwMzYxMDk1MTcwMjo6MDo6&url=%2FCordless-KOOVON-Rechargeable-Irrigator-Waterproof%2Fdp%2FB07FS7WF3K%2Fref%3Dsr_1_66_sspa%3Fkeywords%3Ddental%26qid%3D1703020360%26sr%3D8-66-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',45,'2023-12-19 15:12:42.159866-06','2023-12-19 15:12:42.159866-06','www.amazon.com'), + (3459,'H2ofloss Water Flosser Portable Dental Oral Irrigator with 5 Modes, 6 Replaceable Jet Tips, Rechargeable Waterproof Teeth Cleaner for Home and Travel -300ml Detachable Reservoir (HF-6)',NULL,'B07T7M2VT2','https://m.media-amazon.com/images/I/71CV0weRkpL._AC_UL320_.jpg',22633,4.2,'$23.79','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3NjY4OTc0OTQ3MDI3NzE3OjE3MDMwMjAzNjA6c3BfbXRmOjIwMDE3NjAyODQzNDg5ODo6MDo6&url=%2FH2ofloss-Replaceable-Rechargeable-Waterproof-HF-6%2Fdp%2FB07T7M2VT2%2Fref%3Dsr_1_67_sspa%3Fkeywords%3Ddental%26qid%3D1703020360%26sr%3D8-67-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',45,'2023-12-19 15:12:42.16778-06','2023-12-19 15:12:42.16778-06','www.amazon.com'), + (3460,'tinsay Electric Dental Mouth Mirror Photography Mirrors Automatic Defogging LED Photographic Reflector with 4 Interchangeable Mirrors',NULL,'B0BZHTQ3C3','https://m.media-amazon.com/images/I/41PStfLhNhL._AC_UL320_.jpg',3,3.8,'$38.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3NjY4OTc0OTQ3MDI3NzE3OjE3MDMwMjAzNjA6c3BfbXRmOjMwMDA0MjM0MzY3NzMwMjo6MDo6&url=%2Ftinsay-Photography-Automatic-Photographic-Interchangeable%2Fdp%2FB0BZHTQ3C3%2Fref%3Dsr_1_68_sspa%3Fkeywords%3Ddental%26qid%3D1703020360%26sr%3D8-68-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',45,'2023-12-19 15:12:42.175683-06','2023-12-19 15:12:42.175683-06','www.amazon.com'), + (3461,'Reach Dentotape Waxed Dental Floss | Effective Plaque Removal, Extra Wide Cleaning Surface | Shred Resistance & Tension, Slides Smoothly & Easily, PFAS Free | Unflavored, 100 Yards, 1 Pack',NULL,'B000052YAN','https://m.media-amazon.com/images/I/71rhsNslNrL._AC_UL320_.jpg',8903,4.6,'$7.48','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Reach-Dentotape-Cleaning-Surface-Unflavored/dp/B000052YAN/ref=sr_1_69?keywords=dental&qid=1703020360&sr=8-69',45,'2023-12-19 15:12:42.183088-06','2023-12-19 15:12:42.183088-06','www.amazon.com'), + (3462,'Oral-B EssentialFloss Cavity Defense Dental Floss, 50 M, 2 Pack',NULL,'B074F5NNCP','https://m.media-amazon.com/images/I/61UJ3pvD9kS._AC_UL320_.jpg',7107,4.6,'$3.96','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Oral-B-EssentialFloss-Cavity-Defense-Dental/dp/B074F5NNCP/ref=sr_1_70?keywords=dental&qid=1703020360&sr=8-70',45,'2023-12-19 15:12:42.190983-06','2023-12-19 15:12:42.190983-06','www.amazon.com'), + (3474,'Plax Advanced PreBrushing Dental Rinse, Soft Mint, 24 Ounce',NULL,'B0012DVJM2','https://m.media-amazon.com/images/I/81GQqdubYWL._AC_UL320_.jpg',1255,4.8,'$6.32','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Plax-Advanced-PreBrushing-Dental-Rinse/dp/B0012DVJM2/ref=sr_1_83?keywords=dental&qid=1703020360&sr=8-83',45,'2023-12-19 15:12:42.281774-06','2023-12-19 15:12:42.281774-06','www.amazon.com'), + (3463,'ProDen PlaqueOff System Dental Care Bones - Dog Teeth Cleaning Bones for Oral Hygiene -Medium/Large Canine Formula - Bacon Flavor -17 oz(Packaging May Vary)',NULL,'B0778ZMW66','https://m.media-amazon.com/images/I/71CdxhQvA4L._AC_UL320_.jpg',2589,4.4,'$18.49','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/ProDen-PlaqueOff-Dental-Bones-Bacon/dp/B0778ZMW66/ref=sr_1_71?keywords=dental&qid=1703020360&sr=8-71',45,'2023-12-19 15:12:42.199567-06','2023-12-19 15:12:42.199567-06','www.amazon.com'), + (3464,'Future Dental Hygienist: Cute Dental Hygiene Student Journal Notebook',NULL,'B08KLT4R54','https://m.media-amazon.com/images/I/61C7eeAo33L._AC_UL320_.jpg',9,4.4,'$8.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Future-Dental-Hygienist-Hygiene-Notebook/dp/B08KLT4R54/ref=sr_1_72?keywords=dental&qid=1703020360&sr=8-72',45,'2023-12-19 15:12:42.207376-06','2023-12-19 15:12:42.207376-06','www.amazon.com'), + (3465,'Pruvade Disposable Dental Headrest Covers 14" x 10" | Pack of 250 | X-Large Clear Plastic Headrest Cover for Tattoo, Piercing and Dental Chairs, Professional Waterproof Clear Sleeves for Headrests',NULL,'B0B1L4B5LT','https://m.media-amazon.com/images/I/818lo2eLXJL._AC_UL320_.jpg',12,4.2,'$32.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3NjY4OTc0OTQ3MDI3NzE3OjE3MDMwMjAzNjA6c3BfbXRmOjMwMDAxNjI3NDAxMjUwMjo6MDo6&url=%2FPruvade-Disposable-Professional-Waterproof-Headrests%2Fdp%2FB0B1L4B5LT%2Fref%3Dsr_1_73_sspa%3Fkeywords%3Ddental%26qid%3D1703020360%26sr%3D8-73-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',45,'2023-12-19 15:12:42.214958-06','2023-12-19 15:12:42.214958-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3466,'Pevor New Dental Teeth Model Dental Caries Tooth Model Patient Education Teeth Model 6 Times Caries',NULL,'B07585C8N5','https://m.media-amazon.com/images/I/51NaPb39mVL._AC_UL320_.jpg',24,4.4,'$23.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3NjY4OTc0OTQ3MDI3NzE3OjE3MDMwMjAzNjA6c3BfbXRmOjIwMDEyOTk2Njk0MjQ5ODo6MDo6&url=%2FPevor-Dental-Patient-Education-Comparation%2Fdp%2FB07585C8N5%2Fref%3Dsr_1_74_sspa%3Fkeywords%3Ddental%26qid%3D1703020360%26sr%3D8-74-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',45,'2023-12-19 15:12:42.222354-06','2023-12-19 15:12:42.222354-06','www.amazon.com'), + (3467,'Tooth Neon Sign LED Teeth Sign for Dental Office Decor Wall Hanging Lights for Dentistry Wall Decor Business Sign Gift for Dentist, Dental Student Gift, Dentist Retirement Gift, Dentist Sign',NULL,'B09XQNZC44','https://m.media-amazon.com/images/I/91yAxknP12L._AC_UL320_.jpg',315,4.7,'$35.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3NjY4OTc0OTQ3MDI3NzE3OjE3MDMwMjAzNjA6c3BfbXRmOjMwMDAwNTEzNjAxNjIwMjo6MDo6&url=%2FHangings-Dentistry-Business-Decoration-Retirement%2Fdp%2FB09XQNZC44%2Fref%3Dsr_1_75_sspa%3Fkeywords%3Ddental%26qid%3D1703020360%26sr%3D8-75-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',45,'2023-12-19 15:12:42.230312-06','2023-12-19 15:12:42.230312-06','www.amazon.com'), + (3468,'faruijie Dental Typodont Teeth Model - Removable Tooth Teach Practice Model Teaching Study Typodont Demonstration Model Come with a Small Screwdriver…',NULL,'B09M2V2RWX','https://m.media-amazon.com/images/I/61C-xus1EdL._AC_UL320_.jpg',2,5.0,'$43.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3NjY4OTc0OTQ3MDI3NzE3OjE3MDMwMjAzNjA6c3BfbXRmOjIwMDAyODU1NzA2NTM5ODo6MDo6&url=%2Ffaruijie-Dental-Typodont-Teeth-Model%2Fdp%2FB09M2V2RWX%2Fref%3Dsr_1_76_sspa%3Fkeywords%3Ddental%26qid%3D1703020360%26sr%3D8-76-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',45,'2023-12-19 15:12:42.237772-06','2023-12-19 15:12:42.237772-06','www.amazon.com'), + (3469,'Cocofloss Woven Dental Floss, Dentist-Designed Oral Care, Mint, Waxed, Expanding, Vegan, Kid-Friendly String Floss with Coconut Oil, 1 Spool (33 yd)',NULL,'B082BF4TYW','https://m.media-amazon.com/images/I/61ZK+H3em5L._AC_UL320_.jpg',7951,4.4,'$10.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/COCOFLOSS-Coconut-Oil-Delicious-Dentist-Designed-Cruelty-Free/dp/B082BF4TYW/ref=sr_1_77?keywords=dental&qid=1703020360&sr=8-77',45,'2023-12-19 15:12:42.245219-06','2023-12-19 15:12:42.245219-06','www.amazon.com'), + (3470,'Fixodent Ultra Max Hold Denture Adhesive, 2.2 Oz (Pack of 2)',NULL,'B07S97JQRV','https://m.media-amazon.com/images/I/61q-JrnWyaL._AC_UL320_.jpg',12832,4.6,'$11.47','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Fixodent-Ultra-Denture-Adhesive-Ounce/dp/B07S97JQRV/ref=sr_1_78?keywords=dental&qid=1703020360&sr=8-78',45,'2023-12-19 15:12:42.253029-06','2023-12-19 15:12:42.253029-06','www.amazon.com'), + (3471,'ORAVET Dental Chews for Dogs, Oral Care and Hygiene Chews (Medium Dogs, 25-50 lbs.) Purple Pouch, 30 Count',NULL,'B07GC96344','https://m.media-amazon.com/images/I/813A3Jz4GGL._AC_UL320_.jpg',5588,4.6,'$38.49','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Oravet-Dental-Hygiene-Medium-Treats/dp/B07GC96344/ref=sr_1_79?keywords=dental&qid=1703020360&sr=8-79',45,'2023-12-19 15:12:42.260295-06','2023-12-19 15:12:42.260295-06','www.amazon.com'), + (3472,'Oral-B Glide Pro-Health Dental Floss, Original Floss, 50m, Pack of 6',NULL,'B001F51RAG','https://m.media-amazon.com/images/I/71xQbC01wwL._AC_UL320_.jpg',6100,4.7,'$18.01','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Oral-B-Glide-Pro-Health-Dental-Original/dp/B001F51RAG/ref=sr_1_80?keywords=dental&qid=1703020360&sr=8-80',45,'2023-12-19 15:12:42.267165-06','2023-12-19 15:12:42.267165-06','www.amazon.com'), + (3473,'DenTek Ultimate Guard for Nighttime Teeth Grinding',NULL,'B07M9Z6ZMN','https://m.media-amazon.com/images/I/71+FYv6VtcL._AC_UL320_.jpg',6566,3.4,'$21.72','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/DenTek-Ultimate-Nighttime-Grinding-Fitting/dp/B07M9Z6ZMN/ref=sr_1_82?keywords=dental&qid=1703020360&rdc=1&sr=8-82',45,'2023-12-19 15:12:42.274444-06','2023-12-19 15:12:42.274444-06','www.amazon.com'), + (3475,'GUM - 6325A Soft-Picks Original Dental Picks, 270 Count',NULL,'B073C6LMJD','https://m.media-amazon.com/images/I/71lPrUcBNbL._AC_UL320_.jpg',10273,4.7,'$13.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/GUM-Soft-Picks-Original-Dental-Picks/dp/B073C6LMJD/ref=sr_1_84?keywords=dental&qid=1703020360&sr=8-84',45,'2023-12-19 15:12:42.289165-06','2023-12-19 15:12:42.289165-06','www.amazon.com'), + (3476,'SleepRight Ultra-Comfort Dental Guard',NULL,'B000EJPNJU','https://m.media-amazon.com/images/I/81kfPlLCklS._AC_UL320_.jpg',1130,3.7,'$23.76','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/SleepRight-SRNGLP-Ultra-Comfort-Dental-Guard/dp/B000EJPNJU/ref=sr_1_86?keywords=dental&qid=1703020360&sr=8-86',45,'2023-12-19 15:12:42.297889-06','2023-12-19 15:12:42.297889-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3477,'Amazon Basics Extra Comfort Mint Dental Floss, 40 M, 131.2 Foot (Pack of 6) (Previously Solimo)',NULL,'B08QWYC3MG','https://m.media-amazon.com/images/I/81CuqtXe86L._AC_UL320_.jpg',9776,4.4,'$13.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Amazon-Basics-Extra-Comfort-Dental/dp/B08QWYC3MG/ref=sr_1_87?keywords=dental&qid=1703020360&sr=8-87',45,'2023-12-19 15:12:42.304718-06','2023-12-19 15:12:42.304718-06','www.amazon.com'), + (3478,'ORAVET Dental Chews for Dogs, Oral Care and Hygiene Chews (Small Dogs, 10-24 lbs.) Blue Pouch, 30 Count',NULL,'B07GC4WP3Z','https://m.media-amazon.com/images/I/81pCfoVrViL._AC_UL320_.jpg',12139,4.5,'$30.49','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Merial-Oravet-Dental-Hygiene-Treats/dp/B07GC4WP3Z/ref=sr_1_88?keywords=dental&qid=1703020360&sr=8-88',45,'2023-12-19 15:12:42.312241-06','2023-12-19 15:12:42.312241-06','www.amazon.com'), + (3479,'DenTek Temparin Max Lost Filling and Loose Cap Repair Kit | One Step Formula | 5+ Repairs | 0.04 Ounces | 2-Pack',NULL,'B07DR95HZP','https://m.media-amazon.com/images/I/71O6WuFOICL._AC_UL320_.jpg',7652,4.1,'$5.79','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/DenTek-Temparin-Filling-Formula-Repairs/dp/B07DR95HZP/ref=sr_1_89?keywords=dental&qid=1703020360&sr=8-89',45,'2023-12-19 15:12:42.321167-06','2023-12-19 15:12:42.321167-06','www.amazon.com'), + (3480,'Whitebite Pro Teeth Whitening Kit for Sensitive Teeth with LED Light, 35% Carbamide Peroxide, (4) 3ml Gel Syringes, (2) Remineralization Gel and Mouth Tray',NULL,'B08XZYMMXH','https://m.media-amazon.com/images/I/71H5zuXao6L._AC_UL320_.jpg',6511,4.4,'$19.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Whitebite-Pro-Whitening-Sensitive-Remineralization/dp/B08XZYMMXH/ref=sr_1_90?keywords=dental&qid=1703020360&sr=8-90',45,'2023-12-19 15:12:42.328929-06','2023-12-19 15:12:42.328929-06','www.amazon.com'), + (3481,'ProDen PlaqueOff Dental Care for Dogs and Cats, 60gm',NULL,'B0047VWPNI','https://m.media-amazon.com/images/I/61Apc4te9BL._AC_UL320_.jpg',23089,4.1,'$21.40','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Proden-PlaqueOff-Dental-Care-Dogs/dp/B0047VWPNI/ref=sr_1_91?keywords=dental&qid=1703020360&sr=8-91',45,'2023-12-19 15:12:42.337208-06','2023-12-19 15:12:42.337208-06','www.amazon.com'), + (3482,'Oral-B Super Floss Pre-Cut Strands Dental Floss, Mint, 50 Count',NULL,'B0000530R6','https://m.media-amazon.com/images/I/61d1+ZFJOPL._AC_UL320_.jpg',10626,4.6,'$3.97','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Oral-B-Super-Dental-Pre-Cut-Strands/dp/B0000530R6/ref=sr_1_92?keywords=dental&qid=1703020360&sr=8-92',45,'2023-12-19 15:12:42.344674-06','2023-12-19 15:12:42.344674-06','www.amazon.com'), + (3483,'Plaque Remover for Teeth, Tartar Remover for Teeth with LED Light, Dental Calculus Remover Teeth Cleaning Kit',NULL,'B0BWXJSV57','https://m.media-amazon.com/images/I/71CrdFLoTcL._AC_UL320_.jpg',310,4.5,'$39.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Plaque-Remover-Tartar-Calculus-Cleaning/dp/B0BWXJSV57/ref=sr_1_93?keywords=dental&qid=1703020360&sr=8-93',45,'2023-12-19 15:12:42.351747-06','2023-12-19 15:12:42.351747-06','www.amazon.com'), + (3484,'JMU 125 Pack Dental Bibs, Pink Dental Bibs Disposable 3-Ply for Dental Tattoo Nail Medical Tray Covers 13" x 18"',NULL,'B08SCBT6DF','https://m.media-amazon.com/images/I/81ZdxgbO0yL._AC_UL320_.jpg',4178,4.7,'$13.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/JMU-Dental-Disposable-Patient-Waterproof/dp/B08SCBT6DF/ref=sr_1_94?keywords=dental&qid=1703020360&sr=8-94',45,'2023-12-19 15:12:42.359904-06','2023-12-19 15:12:42.359904-06','www.amazon.com'), + (3485,'Dental Anatomy Coloring Book: Fun and Easy Kids & Adult Coloring Book for Dental Assistants, Dental Students, Dental Hygienists, Dental Therapists, ... Questions and Answers for Dental Assisting.',NULL,'B08NVVWGDX','https://m.media-amazon.com/images/I/713-+GGkR9L._AC_UL320_.jpg',4,5.0,'$7.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Dental-Anatomy-Coloring-Book-Assistants/dp/B08NVVWGDX/ref=sr_1_95?keywords=dental&qid=1703020360&sr=8-95',45,'2023-12-19 15:12:42.367376-06','2023-12-19 15:12:42.367376-06','www.amazon.com'), + (3391,'Oral B Glide Dental Floss Picks, Complete With Scope Outlast, Mint, 75 Count, Pack Of 6',NULL,'B0922T53XY','https://m.media-amazon.com/images/I/61GgCBAKZFL._AC_UL320_.jpg',13421,4.7,'$24.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozOTk1NzQ3NzY4MDE0NzE3OjE3MDMwMjAzNTI6c3Bfc2VhcmNoX3RoZW1hdGljOjMwMDAzMjg0ODEyNjYwMjo6Mzo6&url=%2FGlide-Complete-Scope-Outlast-Dental%2Fdp%2FB0922T53XY%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.d0d6e7d3-c9f1-480b-9f2a-893b95951bfb%253Aamzn1.sym.d0d6e7d3-c9f1-480b-9f2a-893b95951bfb%26cv_ct_cx%3Ddental%26keywords%3Ddental%26pd_rd_i%3DB0922T53XY%26pd_rd_r%3Db4082be5-3659-4c04-95e1-c9c990733d67%26pd_rd_w%3DnVgTD%26pd_rd_wg%3DkNaLO%26pf_rd_p%3Dd0d6e7d3-c9f1-480b-9f2a-893b95951bfb%26pf_rd_r%3D6BDACS52YWZ77X2S2NB1%26qid%3D1703020352%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-4-2c727eeb-987f-452f-86bd-c2978cc9d8b9-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',45,'2023-12-19 15:12:33.116595-06','2023-12-19 15:12:42.373455-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3486,'Anbesol Maximum Strength Oral Pain Relief Gel, Instant Pain Relief For Toothache Pain, Canker Sores, Sore Gums, Mouth Sores, Denture Pain, and Aligner Pain, ADA Accepted, 0.33 oz (packaging may vary)',NULL,'B0006GBEJ4','https://m.media-amazon.com/images/I/81i05eaGTJL._AC_UL320_.jpg',14494,4.6,'$6.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Anbesol-Gel-Maximum-Strength-0-33/dp/B0006GBEJ4/ref=sr_1_97?keywords=dental&qid=1703020360&sr=8-97',45,'2023-12-19 15:12:42.380044-06','2023-12-19 15:12:42.380044-06','www.amazon.com'), + (3487,'DenTek Complete Clean Easy Reach Floss Picks, Advanced Fluoride Coating, Mouthwash Blast Flavor, 75 ct. (Pack of 2)',NULL,'B00NFUFUJ8','https://m.media-amazon.com/images/I/61fvoEgcpiL._AC_UL320_.jpg',13317,4.6,'$7.81','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Dentek-Floss-Picks-Complete-Clean/dp/B00NFUFUJ8/ref=sr_1_98?keywords=dental&qid=1703020360&sr=8-98',45,'2023-12-19 15:12:42.388218-06','2023-12-19 15:12:42.388218-06','www.amazon.com'), + (3488,'ORAVET Dental Chews for Dogs, Oral Care and Hygiene Chews (Extra Small Dogs, 3.5-9 lbs.) Yellow Pouch, 30 Count',NULL,'B07GBVL31W','https://m.media-amazon.com/images/I/81G0NjpLw2L._AC_UL320_.jpg',3802,4.5,'$24.49','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/OraVet-Dental-Hygiene-Chews-Dogs/dp/B07GBVL31W/ref=sr_1_99?keywords=dental&qid=1703020360&sr=8-99',45,'2023-12-19 15:12:42.395452-06','2023-12-19 15:12:42.395452-06','www.amazon.com'), + (3489,'ORAVET Dental Chews for Dogs, Oral Care and Hygiene Chews (Large Dogs, Over 50 lbs.) Pink Pouch, 30 Count',NULL,'B07GC96BCN','https://m.media-amazon.com/images/I/81q6VHUgGEL._AC_UL320_.jpg',5262,4.6,'$47.26','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Merial-Oravet-Dental-Hygiene-Treats/dp/B07GC96BCN/ref=sr_1_100?keywords=dental&qid=1703020360&sr=8-100',45,'2023-12-19 15:12:42.401987-06','2023-12-19 15:12:42.401987-06','www.amazon.com'), + (3490,'VETRISCIENCE Perio Support Teeth Cleaning Dental Powder for Dogs and Cats, Up to 192 Servings – Clinically Proven to Reduce Plaque and Tartar',NULL,'B000IZPY3K','https://m.media-amazon.com/images/I/61z9HTXsLEL._AC_UL320_.jpg',6070,4.2,'$20.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/VetriScience-Laboratories-Support-Dental-Health/dp/B000IZPY3K/ref=sr_1_101?keywords=dental&qid=1703020360&sr=8-101',45,'2023-12-19 15:12:42.412988-06','2023-12-19 15:12:42.412988-06','www.amazon.com'), + (3491,'TropiClean Fresh Breath Original | Dog Oral Care Water Additive | Dog Breath Freshener Additive for Dental Health | VOHC Certified | Made in the USA | 33.8 oz.',NULL,'B0054WTPBY','https://m.media-amazon.com/images/I/71jKjm87k4L._AC_UL320_.jpg',25679,4.3,'$19.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/TropiClean-Breath-Plaque-Remover-Additive/dp/B0054WTPBY/ref=sr_1_103?keywords=dental&qid=1703020360&rdc=1&sr=8-103',45,'2023-12-19 15:12:42.420446-06','2023-12-19 15:12:42.420446-06','www.amazon.com'), + (3492,'Arm & Hammer For Pets Nubbies Dental Treats for Dogs | Dental Chews Fight Bad Breath, Plaque & Tartar without Brushing | Baking Soda Enhanced Chicken Flavor Dog Treats, 20 Pcs (Packaging may vary)',NULL,'B01AZIWX92','https://m.media-amazon.com/images/I/71eVjlkNhbL._AC_UL320_.jpg',9358,4.4,'$6.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Arm-Hammer-Original-Nubbies-Brushing/dp/B01AZIWX92/ref=sr_1_105?keywords=dental&qid=1703020360&sr=8-105',45,'2023-12-19 15:12:42.434456-06','2023-12-19 15:12:42.434456-06','www.amazon.com'), + (3493,'Tooth Stickers Decals[100Pack], Vinyl Dental Stickers Tooth Fairy Stickers Decals for Laptop Water Bottle Bumper Luggage Computer Skateboard Snowboard. Gift for Kids Girls Teens Adult',NULL,'B0CGVDP98L','https://m.media-amazon.com/images/I/81gYc6kTfpL._AC_UL320_.jpg',168,4.8,'$7.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Stickers-100Pack-Computer-Skateboard-Snowboard/dp/B0CGVDP98L/ref=sr_1_107?keywords=dental&qid=1703020360&sr=8-107',45,'2023-12-19 15:12:42.442347-06','2023-12-19 15:12:42.442347-06','www.amazon.com'), + (3494,'Sensodyne Pronamel Intensive Enamel Repair Toothpaste for Sensitive Teeth, to Reharden and Strengthen Enamel, Extra Fresh - 3.4 Ounces',NULL,'B07JYNPTMG','https://m.media-amazon.com/images/I/71FsiWhEROL._AC_UL320_.jpg',45978,4.7,'$6.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Sensodyne-Pronamel-Intensive-Toothpaste-Strengthening/dp/B07JYNPTMG/ref=sr_1_108?keywords=dental&qid=1703020360&sr=8-108',45,'2023-12-19 15:12:42.44992-06','2023-12-19 15:12:42.44992-06','www.amazon.com'), + (3495,'Colgate 360 Advanced Floss Tip Toothbrush, Soft Toothbrush for Adults, 4 Pack',NULL,'B01LTHYW92','https://aax-us-iad.amazon.com/e/loi/imp?b=JG-2NSXEdH0_Bza4YcSvFP8AAAGMg-x1AgEAAAH2AQBvbm9fdHhuX2JpZDUgICBvbm9fdHhuX2ltcDEgICCzU_Nq',4094,4.6,'$12.56','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.comhttps://aax-us-iad.amazon.com/x/c/RG-2NSXEdH0_Bza4YcSvFP8AAAGMg-x0zAEAAAH2AQBvbm9fdHhuX2JpZDUgICBvbm9fdHhuX2ltcDEgICCzU_Nq/https://www.amazon.com/Colgate-Advanced-Floss-Tip-Bristles-Toothbrush/dp/B01LTHYW92/ref=sxbs_sbv_search_btf?content-id=amzn1.sym.2066ba78-527e-4aed-9de4-3ba096deb87b%3Aamzn1.sym.2066ba78-527e-4aed-9de4-3ba096deb87b&cv_ct_cx=dental&keywords=dental&pd_rd_i=B01LTHYW92&pd_rd_r=85761f6f-8859-479a-a258-bc1084165e0c&pd_rd_w=Y354y&pd_rd_wg=kpWI3&pf_rd_p=2066ba78-527e-4aed-9de4-3ba096deb87b&pf_rd_r=38F7DVYQ8SPJY0SR99Z8&qid=1703020360&sbo=RZvfv%2F%2FHxDF%2BO5021pAnSA%3D%3D&sr=1-49-48f7baba-8e26-45f3-8811-e1a601ad20bf',45,'2023-12-19 15:12:42.457251-06','2023-12-19 15:12:42.457251-06','www.amazon.comhttps:'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3496,'Amazon Essentials',NULL,'B07X8XL78L','https://m.media-amazon.com/images/I/71wbpbWc-OL._AC_UL320_.jpg',14492,4.3,'$28.70','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxOTM0ODI0MzAzNTUzNzE3OjE3MDMwMjAzNjk6c3BfYXRmOjIwMDA0NDA0ODczNzIzMTo6MDo6&url=%2FAmazon-Essentials-Standard-Skinny-Fit-Stretch%2Fdp%2FB07X8XL78L%2Fref%3Dsr_1_1_ffob_sspa%3Fkeywords%3Dmen%2527s%2Bclothing%26qid%3D1703020369%26sr%3D8-1-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGY%26psc%3D1',46,'2023-12-19 15:12:50.73094-06','2023-12-19 15:12:50.73094-06','www.amazon.com'), + (3497,'Gildan',NULL,'B077ZJXCTS','https://m.media-amazon.com/images/I/710o0VupScL._AC_UL320_.jpg',276286,4.6,'$18.87','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Gildan-Mens-T-Shirt-Assortment-X-Large/dp/B077ZJXCTS/ref=sr_1_2?keywords=men%27s+clothing&qid=1703020369&sr=8-2',46,'2023-12-19 15:12:50.739806-06','2023-12-19 15:12:50.739806-06','www.amazon.com'), + (3498,'Wrangler Authentics',NULL,'B01L0KQTIK','https://m.media-amazon.com/images/I/A1X74ZCjO+L._AC_UL320_.jpg',22888,4.5,'$25.72','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Wrangler-Authentics-Sweater-Quarter-Zip-Heather/dp/B01L0KQTIK/ref=sr_1_3?keywords=men%27s+clothing&qid=1703020369&sr=8-3',46,'2023-12-19 15:12:50.746798-06','2023-12-19 15:12:50.746798-06','www.amazon.com'), + (3499,'Legendary Whitetails',NULL,'B01K0ETB6E','https://m.media-amazon.com/images/I/917xzOZDnPL._AC_UL320_.jpg',79946,4.6,'$26.60','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Legendary-Whitetails-Flannels-Cedarwood-Plaid/dp/B01K0ETB6E/ref=sr_1_4?keywords=men%27s+clothing&qid=1703020369&sr=8-4',46,'2023-12-19 15:12:50.756138-06','2023-12-19 15:12:50.756138-06','www.amazon.com'), + (3500,'CANGHPGIN',NULL,'B09W91FGSH','https://m.media-amazon.com/images/I/61gQVDClZRL._AC_UL320_.jpg',1437,4.3,'$25.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3NjY5NzY4OTk1MjY3NzE3OjE3MDMwMjAzNjk6c3Bfc2VhcmNoX3RoZW1hdGljOjMwMDA5NTU5NTgyNjgwMjo6NDo6&url=%2FCANGHPGIN-Shirts-Sleeve-Muscle-Casual%2Fdp%2FB09W91FGSH%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.cbead6fc-f00c-4cd7-8558-497bc91856e7%253Aamzn1.sym.cbead6fc-f00c-4cd7-8558-497bc91856e7%26cv_ct_cx%3Dmen%2527s%2Bclothing%26keywords%3Dmen%2527s%2Bclothing%26pd_rd_i%3DB09W91FGSH%26pd_rd_r%3Dc9e42231-867f-47e7-90ce-da936a0b8ad5%26pd_rd_w%3DW4kFr%26pd_rd_wg%3DhZLmR%26pf_rd_p%3Dcbead6fc-f00c-4cd7-8558-497bc91856e7%26pf_rd_r%3DBW4K1RYC2PKGWM2H077Y%26qid%3D1703020369%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-5-183302c6-8dec-4386-8e58-6031e7be5ad8-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',46,'2023-12-19 15:12:50.763443-06','2023-12-19 15:12:50.798316-06','www.amazon.com'), + (3503,'Real Essentials',NULL,'B09P21993P','https://m.media-amazon.com/images/I/619e0FxOsmL._AC_UL320_.jpg',14305,4.2,'$30.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3NjY5NzY4OTk1MjY3NzE3OjE3MDMwMjAzNjk6c3Bfc2VhcmNoX3RoZW1hdGljOjIwMDAzODYzMTAzODc5ODo6Mjo6&url=%2FPack-Clothing-Athletic-Performance-Essentials%2Fdp%2FB09P21993P%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.cbead6fc-f00c-4cd7-8558-497bc91856e7%253Aamzn1.sym.cbead6fc-f00c-4cd7-8558-497bc91856e7%26cv_ct_cx%3Dmen%2527s%2Bclothing%26keywords%3Dmen%2527s%2Bclothing%26pd_rd_i%3DB09P21993P%26pd_rd_r%3Dc9e42231-867f-47e7-90ce-da936a0b8ad5%26pd_rd_w%3DW4kFr%26pd_rd_wg%3DhZLmR%26pf_rd_p%3Dcbead6fc-f00c-4cd7-8558-497bc91856e7%26pf_rd_r%3DBW4K1RYC2PKGWM2H077Y%26qid%3D1703020369%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-3-183302c6-8dec-4386-8e58-6031e7be5ad8-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',46,'2023-12-19 15:12:50.78466-06','2023-12-19 15:12:51.224049-06','www.amazon.com'), + (3501,'NAVISKIN',NULL,'B07GZN49N8','https://m.media-amazon.com/images/I/61qA3e+2V0L._AC_UL320_.jpg',2849,4.5,'$35.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3NjY5NzY4OTk1MjY3NzE3OjE3MDMwMjAzNjk6c3Bfc2VhcmNoX3RoZW1hdGljOjIwMDA5Mzc5OTk1NDg5ODo6MDo6&url=%2FNAVISKIN-Protection-Lightweight-Quick-Dry-Bluebell%2Fdp%2FB07GZN49N8%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.cbead6fc-f00c-4cd7-8558-497bc91856e7%253Aamzn1.sym.cbead6fc-f00c-4cd7-8558-497bc91856e7%26cv_ct_cx%3Dmen%2527s%2Bclothing%26keywords%3Dmen%2527s%2Bclothing%26pd_rd_i%3DB07GZN49N8%26pd_rd_r%3Dc9e42231-867f-47e7-90ce-da936a0b8ad5%26pd_rd_w%3DW4kFr%26pd_rd_wg%3DhZLmR%26pf_rd_p%3Dcbead6fc-f00c-4cd7-8558-497bc91856e7%26pf_rd_r%3DBW4K1RYC2PKGWM2H077Y%26qid%3D1703020369%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-1-183302c6-8dec-4386-8e58-6031e7be5ad8-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',46,'2023-12-19 15:12:50.770536-06','2023-12-19 15:12:59.22397-06','www.amazon.com'), + (3502,'NELEUS',NULL,'B08RYQXJPK','https://m.media-amazon.com/images/I/71wJmHTEtlL._AC_UL320_.jpg',3396,4.6,'$29.86','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3NjY5NzY4OTk1MjY3NzE3OjE3MDMwMjAzNjk6c3Bfc2VhcmNoX3RoZW1hdGljOjIwMDA4ODc4MTY1ODQ4MTo6MTo6&url=%2FNeleus-Workout-Sleeveless-Running-Shirts%2Fdp%2FB08RYQXJPK%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.cbead6fc-f00c-4cd7-8558-497bc91856e7%253Aamzn1.sym.cbead6fc-f00c-4cd7-8558-497bc91856e7%26cv_ct_cx%3Dmen%2527s%2Bclothing%26keywords%3Dmen%2527s%2Bclothing%26pd_rd_i%3DB08RYQXJPK%26pd_rd_r%3Dc9e42231-867f-47e7-90ce-da936a0b8ad5%26pd_rd_w%3DW4kFr%26pd_rd_wg%3DhZLmR%26pf_rd_p%3Dcbead6fc-f00c-4cd7-8558-497bc91856e7%26pf_rd_r%3DBW4K1RYC2PKGWM2H077Y%26qid%3D1703020369%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-2-183302c6-8dec-4386-8e58-6031e7be5ad8-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',46,'2023-12-19 15:12:50.777579-06','2023-12-19 15:12:59.230392-06','www.amazon.com'), + (3504,'NELEUS',NULL,'B07WTSQ55M','https://m.media-amazon.com/images/I/714FMMJBNxL._AC_UL320_.jpg',8993,4.5,'$36.89','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3NjY5NzY4OTk1MjY3NzE3OjE3MDMwMjAzNjk6c3Bfc2VhcmNoX3RoZW1hdGljOjIwMDAyODA3MjMwNjk4MTo6Mzo6&url=%2FNeleus-Running-Shirt-Workout-Athletic%2Fdp%2FB07WTSQ55M%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.cbead6fc-f00c-4cd7-8558-497bc91856e7%253Aamzn1.sym.cbead6fc-f00c-4cd7-8558-497bc91856e7%26cv_ct_cx%3Dmen%2527s%2Bclothing%26keywords%3Dmen%2527s%2Bclothing%26pd_rd_i%3DB07WTSQ55M%26pd_rd_r%3Dc9e42231-867f-47e7-90ce-da936a0b8ad5%26pd_rd_w%3DW4kFr%26pd_rd_wg%3DhZLmR%26pf_rd_p%3Dcbead6fc-f00c-4cd7-8558-497bc91856e7%26pf_rd_r%3DBW4K1RYC2PKGWM2H077Y%26qid%3D1703020369%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-4-183302c6-8dec-4386-8e58-6031e7be5ad8-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',46,'2023-12-19 15:12:50.7926-06','2023-12-19 15:12:59.648617-06','www.amazon.com'), + (4562,'deweisn Magnifying Mirror 10X/1X,Double Sided Tabletop Mirror with Adjustable Folding Handle, Cosmetic Mirror with Lights for Makeup Travel,3 Colors Light',NULL,'B08XK6QRJL','https://m.media-amazon.com/images/I/6196eYEtYYL._AC_UL320_.jpg',1774,4.3,'$19.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxNTk3Mjk0NjM0MzQ4NzE3OjE3MDMwMjA2ODY6c3BfbXRmOjIwMDA1NzE0ODQ0MDE1MTo6MDo6&url=%2Fdeweisn-Magnifying-Adjustable-Blackhead-Removal-3%2Fdp%2FB08XK6QRJL%2Fref%3Dsr_1_60_sspa%3Fkeywords%3Dtravel%2Baccessories%26qid%3D1703020686%26sr%3D8-60-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',57,'2023-12-19 15:18:07.924248-06','2023-12-19 15:18:07.924248-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3511,'Amazon Essentials',NULL,'B07BJL9YWN','https://m.media-amazon.com/images/I/71oF5-0Kl8L._AC_UL320_.jpg',22513,4.3,'$35.10','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxOTM0ODI0MzAzNTUzNzE3OjE3MDMwMjAzNjk6c3BfbXRmOjIwMDAxMTk2ODc4ODEzMTo6MDo6&url=%2FAmazon-Essentials-Athletic-Fit-Stretch-Black%2Fdp%2FB07BJL9YWN%2Fref%3Dsr_1_11_ffob_sspa%3Fkeywords%3Dmen%2527s%2Bclothing%26qid%3D1703020369%26sr%3D8-11-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',46,'2023-12-19 15:12:50.847966-06','2023-12-19 15:12:50.847966-06','www.amazon.com'), + (3512,'Sailwind',NULL,'B09FPV9Y9J','https://m.media-amazon.com/images/I/61HGXB+AUhL._AC_UL320_.jpg',1505,4.5,'$29.88','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxOTM0ODI0MzAzNTUzNzE3OjE3MDMwMjAzNjk6c3BfbXRmOjIwMDA4OTM3MjI0MzQ3MTo6MDo6&url=%2FSailwind-Crewneck-Sweater-Sweaters-Pullover%2Fdp%2FB09FPV9Y9J%2Fref%3Dsr_1_12_sspa%3Fkeywords%3Dmen%2527s%2Bclothing%26qid%3D1703020369%26sr%3D8-12-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',46,'2023-12-19 15:12:50.855087-06','2023-12-19 15:12:50.855087-06','www.amazon.com'), + (3513,'MACHLAB',NULL,'B093FCWXHN','https://m.media-amazon.com/images/I/71+8LKmVCbS._AC_UL320_.jpg',13364,4.4,'$42.89','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxOTM0ODI0MzAzNTUzNzE3OjE3MDMwMjAzNjk6c3BfbXRmOjIwMDA5NDkyMzczNzQ5ODo6MDo6&url=%2FMACHLAB-Pullover-Workout-Jackets-BlackKhaki%2Fdp%2FB093FCWXHN%2Fref%3Dsr_1_13_sspa%3Fkeywords%3Dmen%2527s%2Bclothing%26qid%3D1703020369%26sr%3D8-13-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',46,'2023-12-19 15:12:50.861498-06','2023-12-19 15:12:50.861498-06','www.amazon.com'), + (3514,'Vcansion',NULL,'B099W94S3H','https://m.media-amazon.com/images/I/81qBgG6ysxL._AC_UL320_.jpg',1321,4.1,'$49.89','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxOTM0ODI0MzAzNTUzNzE3OjE3MDMwMjAzNjk6c3BfbXRmOjIwMDAzMjcxODU1NTY5ODo6MDo6&url=%2FVcansion-Winter-Cotton-Breasted-Outerwear%2Fdp%2FB099W94S3H%2Fref%3Dsr_1_14_sspa%3Fkeywords%3Dmen%2527s%2Bclothing%26qid%3D1703020369%26sr%3D8-14-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',46,'2023-12-19 15:12:50.870501-06','2023-12-19 15:12:50.870501-06','www.amazon.com'), + (3515,'INTO THE AM',NULL,'B08XTWF6DH','https://aax-us-iad.amazon.com/e/loi/imp?b=JFWD5_PsqfkWXAHLZRQkXmIAAAGMg-yVkgEAAAH2AQBvbm9fdHhuX2JpZDYgICBvbm9fdHhuX2ltcDEgICBOIbft',7802,4.3,'$23.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.comhttps://aax-us-iad.amazon.com/x/c/RFWD5_PsqfkWXAHLZRQkXmIAAAGMg-yVTwEAAAH2AQBvbm9fdHhuX2JpZDYgICBvbm9fdHhuX2ltcDEgICBOIbft/https://www.amazon.com/INTO-AM-Mens-Fitted-Essential/dp/B08XTWF6DH/ref=sxin_23_sbv_search_btf?content-id=amzn1.sym.6ca944f8-539c-499e-a3a4-26a566d1de59%3Aamzn1.sym.6ca944f8-539c-499e-a3a4-26a566d1de59&cv_ct_cx=men%27s+clothing&keywords=men%27s+clothing&pd_rd_i=B08XTWF6DH&pd_rd_r=c9e42231-867f-47e7-90ce-da936a0b8ad5&pd_rd_w=K5Kh8&pd_rd_wg=hZLmR&pf_rd_p=6ca944f8-539c-499e-a3a4-26a566d1de59&pf_rd_r=BW4K1RYC2PKGWM2H077Y&qid=1703020369&sbo=RZvfv%2F%2FHxDF%2BO5021pAnSA%3D%3D&sr=1-1-5190daf0-67e3-427c-bea6-c72c1df98776',46,'2023-12-19 15:12:50.878703-06','2023-12-19 15:12:50.878703-06','www.amazon.comhttps:'), + (3516,'Fruit of the Loom',NULL,'B09R868D6F','https://m.media-amazon.com/images/I/61RhsrWDHEL._AC_UL320_.jpg',4399,4.3,'$15.74','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Fruit-Loom-Eversoft-Sweatpants-Bottom-Black/dp/B09R868D6F/ref=sr_1_15?keywords=men%27s+clothing&qid=1703020369&sr=8-15',46,'2023-12-19 15:12:50.886105-06','2023-12-19 15:12:50.886105-06','www.amazon.com'), + (3517,'Amazon Essentials',NULL,'B08X2CP1ML','https://m.media-amazon.com/images/I/71n1ICl0BRL._AC_UL320_.jpg',5133,4.4,'$19.90','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Amazon-Essentials-Long-Sleeve-Quarter-Zip-Sweatshirt/dp/B08X2CP1ML/ref=sr_1_16?keywords=men%27s+clothing&qid=1703020369&sr=8-16',46,'2023-12-19 15:12:50.893986-06','2023-12-19 15:12:50.893986-06','www.amazon.com'), + (3518,'Southpole',NULL,'B07BRGL8JS','https://m.media-amazon.com/images/I/714w59JZieL._AC_UL320_.jpg',75793,4.4,'$15.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Southpole-Active-Jogger-Heather-X-Large/dp/B07BRGL8JS/ref=sr_1_17?keywords=men%27s+clothing&qid=1703020369&sr=8-17',46,'2023-12-19 15:12:50.905014-06','2023-12-19 15:12:50.905014-06','www.amazon.com'), + (3519,'PURE CHAMP',NULL,'B09ZD82V6S','https://m.media-amazon.com/images/I/91XUMIlN-fL._AC_UL320_.jpg',6119,4.3,'$39.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/PURE-CHAMP-Athletic-Sweatpants-Drawstring/dp/B09ZD82V6S/ref=sr_1_18?keywords=men%27s+clothing&qid=1703020369&sr=8-18',46,'2023-12-19 15:12:50.916198-06','2023-12-19 15:12:50.916198-06','www.amazon.com'), + (3520,'EKLENTSON',NULL,'B07XB6HN5R','https://m.media-amazon.com/images/I/71swy0maS4L._AC_UL320_.jpg',919,4.4,'$65.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxOTM0ODI0MzAzNTUzNzE3OjE3MDMwMjAzNjk6c3BfbXRmOjMwMDA5MzgwODY0NDgwMjo6MDo6&url=%2FCotton-Jacket-Winter-Windbreaker-Tactical%2Fdp%2FB07XB6HN5R%2Fref%3Dsr_1_19_sspa%3Fkeywords%3Dmen%2527s%2Bclothing%26qid%3D1703020369%26sr%3D8-19-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',46,'2023-12-19 15:12:50.92327-06','2023-12-19 15:12:50.92327-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3521,'Zaitun',NULL,'B0CJ599KGD','https://m.media-amazon.com/images/I/81+ejMFdaxL._AC_UL320_.jpg',28,4.6,'$34.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxOTM0ODI0MzAzNTUzNzE3OjE3MDMwMjAzNjk6c3BfbXRmOjMwMDA3MzM3OTYwNjMwMjo6MDo6&url=%2FZaitun-Sleeve-Lightweight-Collared-Sweater%2Fdp%2FB0CJ599KGD%2Fref%3Dsr_1_20_sspa%3Fkeywords%3Dmen%2527s%2Bclothing%26qid%3D1703020369%26sr%3D8-20-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',46,'2023-12-19 15:12:50.930157-06','2023-12-19 15:12:50.930157-06','www.amazon.com'), + (3522,'NITAGUT',NULL,'B097QVD4M2','https://m.media-amazon.com/images/I/61TWiYLHxSL._AC_UL320_.jpg',814,4.5,'$29.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxOTM0ODI0MzAzNTUzNzE3OjE3MDMwMjAzNjk6c3BfbXRmOjIwMDA4NTIxMjE3MTc1MTo6MDo6&url=%2FNITAGUT-Quarter-Sweater-Turtleneck-Pullover%2Fdp%2FB097QVD4M2%2Fref%3Dsr_1_21_sspa%3Fkeywords%3Dmen%2527s%2Bclothing%26qid%3D1703020369%26sr%3D8-21-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',46,'2023-12-19 15:12:50.939647-06','2023-12-19 15:12:50.939647-06','www.amazon.com'), + (3523,'EKLENTSON',NULL,'B07ZGJGXPC','https://m.media-amazon.com/images/I/61FUELmGZ1L._AC_UL320_.jpg',799,4.4,'$65.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxOTM0ODI0MzAzNTUzNzE3OjE3MDMwMjAzNjk6c3BfbXRmOjMwMDA4OTc5MTI5MjEwMjo6MDo6&url=%2FBomber-Jacket-Jackets-Military-Lightweight%2Fdp%2FB07ZGJGXPC%2Fref%3Dsr_1_22_sspa%3Fkeywords%3Dmen%2527s%2Bclothing%26qid%3D1703020369%26sr%3D8-22-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',46,'2023-12-19 15:12:50.946381-06','2023-12-19 15:12:50.946381-06','www.amazon.com'), + (3524,'COOFANDY',NULL,'B07LCF3V1X','https://m.media-amazon.com/images/I/71lDM4MATuL._AC_UL320_.jpg',14169,4.4,'$33.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/COOFANDY-Sweatshirt-Drawstring-Jacquard-Pullover/dp/B07LCF3V1X/ref=sr_1_23?keywords=men%27s+clothing&qid=1703020369&sr=8-23',46,'2023-12-19 15:12:50.954594-06','2023-12-19 15:12:50.954594-06','www.amazon.com'), + (3525,'Carhartt',NULL,'B00FXPSP6S','https://m.media-amazon.com/images/I/51K+yl97NJL._AC_UL320_.jpg',22861,4.8,'$64.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Carhartt-Defender-Heavyweight-Sweatshirt-XX-Large/dp/B00FXPSP6S/ref=sr_1_24?keywords=men%27s+clothing&qid=1703020369&sr=8-24',46,'2023-12-19 15:12:50.962061-06','2023-12-19 15:12:50.962061-06','www.amazon.com'), + (3528,'COOFANDY',NULL,'B0CLRKQ77N','https://m.media-amazon.com/images/I/71Tnh3q0MxL._AC_UL320_.jpg',2,5.0,'$23.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxOTM0ODI0MzAzNTUzNzE3OjE3MDMwMjAzNjk6c3BfbXRmOjMwMDEwMzM1MDA0MzcwMjo6MDo6&url=%2FCOOFANDY-Casual-Button-Shirts-Clothing%2Fdp%2FB0CLRKQ77N%2Fref%3Dsr_1_28_sspa%3Fkeywords%3Dmen%2527s%2Bclothing%26qid%3D1703020369%26sr%3D8-28-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',46,'2023-12-19 15:12:50.98588-06','2023-12-19 15:12:50.98588-06','www.amazon.com'), + (3529,'Sailwind',NULL,'B099M9764X','https://m.media-amazon.com/images/I/71PT8HtewjL._AC_UL320_.jpg',3684,4.5,'$25.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxOTM0ODI0MzAzNTUzNzE3OjE3MDMwMjAzNjk6c3BfbXRmOjIwMDA5NDkwODc5Mzc3MTo6MDo6&url=%2FSailwind-Henley-T-Shirt-XX-Large-Navy%2Fdp%2FB099M9764X%2Fref%3Dsr_1_29_sspa%3Fkeywords%3Dmen%2527s%2Bclothing%26qid%3D1703020369%26sr%3D8-29-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',46,'2023-12-19 15:12:50.992845-06','2023-12-19 15:12:50.992845-06','www.amazon.com'), + (3530,'Under Armour',NULL,'B0785VMVF4','https://m.media-amazon.com/images/I/61Eq6uGx22L._AC_UL320_.jpg',88429,4.5,'$12.07','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Under-Armour-Sleeve-T-Shirt-Graphite/dp/B0785VMVF4/ref=sr_1_30?keywords=men%27s+clothing&qid=1703020369&sr=8-30',46,'2023-12-19 15:12:50.999542-06','2023-12-19 15:12:50.999542-06','www.amazon.com'), + (3531,'COOFANDY',NULL,'B075WRSH3N','https://m.media-amazon.com/images/I/61DSf-iLZML._AC_UL320_.jpg',14851,4.2,'$35.97','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Coofandy-Casual-Dress-Button-Shirts/dp/B075WRSH3N/ref=sr_1_31?keywords=men%27s+clothing&qid=1703020369&sr=8-31',46,'2023-12-19 15:12:51.008698-06','2023-12-19 15:12:51.008698-06','www.amazon.com'), + (3532,'PARREN',NULL,'B0CLYC9N8R','https://m.media-amazon.com/images/I/61e9vNm0X8L._AC_UL320_.jpg',2,3.0,'$19.39','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Tactical-Sweatshirt-Quarter-Pullover-Drawstring/dp/B0CLYC9N8R/ref=sr_1_32?keywords=men%27s+clothing&qid=1703020369&sr=8-32',46,'2023-12-19 15:12:51.015605-06','2023-12-19 15:12:51.015605-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3533,'Hanes',NULL,'B00JUM4IPW','https://m.media-amazon.com/images/I/817e39xUn-L._AC_UL320_.jpg',121453,4.6,'$15.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Hanes-EcoSmart-Fleece-Hoodie-Large/dp/B00JUM4IPW/ref=sr_1_33?keywords=men%27s+clothing&qid=1703020369&sr=8-33',46,'2023-12-19 15:12:51.02285-06','2023-12-19 15:12:51.02285-06','www.amazon.com'), + (3534,'CQR',NULL,'B07MFK1P36','https://m.media-amazon.com/images/I/81j7AOD3KrL._AC_UL320_.jpg',17555,4.6,'$36.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/CQR-Flannel-Sleeved-Button-Up-All-Cotton/dp/B07MFK1P36/ref=sr_1_34?keywords=men%27s+clothing&qid=1703020369&sr=8-34',46,'2023-12-19 15:12:51.031078-06','2023-12-19 15:12:51.031078-06','www.amazon.com'), + (3535,'Amazon Essentials',NULL,'B08J94NG29','https://m.media-amazon.com/images/I/81FzQXFc8yL._MCnd_AC_UL320_.jpg',23337,4.4,'$14.60','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Amazon-Essentials-Straight-Fit-Pajama-Medium/dp/B08J94NG29/ref=sr_1_35?keywords=men%27s+clothing&qid=1703020369&sr=8-35',46,'2023-12-19 15:12:51.038706-06','2023-12-19 15:12:51.038706-06','www.amazon.com'), + (3536,'Lavnis',NULL,'B07J456Z3B','https://m.media-amazon.com/images/I/61KrwOOylUL._AC_UL320_.jpg',5858,4.0,'$40.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Vogstyle-Tracksuit-Running-Jogging-Athletic/dp/B07J456Z3B/ref=sr_1_36?keywords=men%27s+clothing&qid=1703020369&sr=8-36',46,'2023-12-19 15:12:51.045951-06','2023-12-19 15:12:51.045951-06','www.amazon.com'), + (3537,'Hanes',NULL,'B0BVMVZGC7','https://m.media-amazon.com/images/I/81fFK0WIgXL._AC_UL320_.jpg',18127,4.6,'$21.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Hanes-Originals-Pullover-Crewneck-Sweatshirts/dp/B0BVMVZGC7/ref=sr_1_37?keywords=men%27s+clothing&qid=1703020369&sr=8-37',46,'2023-12-19 15:12:51.054116-06','2023-12-19 15:12:51.054116-06','www.amazon.com'), + (3538,'Alimens & Gentle',NULL,'B07CY3X5HS','https://m.media-amazon.com/images/I/819wcaoF7FL._AC_UL320_.jpg',58894,4.6,'$22.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Alimens-Gentle-Button-Regular-Flannel/dp/B07CY3X5HS/ref=sr_1_39?keywords=men%27s+clothing&qid=1703020369&sr=8-39',46,'2023-12-19 15:12:51.060878-06','2023-12-19 15:12:51.060878-06','www.amazon.com'), + (3539,'Amazon Essentials',NULL,'B07YDYGSQX','https://m.media-amazon.com/images/I/71Ot1aDXYOL._AC_UL320_.jpg',25985,4.3,'$8.90','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Amazon-Essentials-Standard-Loose-Fit-Crewneck/dp/B07YDYGSQX/ref=sr_1_40?keywords=men%27s+clothing&qid=1703020369&sr=8-40',46,'2023-12-19 15:12:51.069957-06','2023-12-19 15:12:51.069957-06','www.amazon.com'), + (3540,'Champion',NULL,'B01NAFW5O0','https://m.media-amazon.com/images/I/81sXWS93m-L._AC_UL320_.jpg',31487,4.5,'$12.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Champion-Classic-T-Shirt-Granite-Heather/dp/B01NAFW5O0/ref=sr_1_41?keywords=men%27s+clothing&qid=1703020369&sr=8-41',46,'2023-12-19 15:12:51.078293-06','2023-12-19 15:12:51.078293-06','www.amazon.com'), + (3541,'Wrangler Authentics',NULL,'B01L7B4FHE','https://m.media-amazon.com/images/I/71y+bkTiOdL._AC_UL320_.jpg',40122,4.6,'$22.20','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Wrangler-Authentics-Sleeve-Fleece-Buffalo/dp/B01L7B4FHE/ref=sr_1_42?keywords=men%27s+clothing&qid=1703020369&sr=8-42',46,'2023-12-19 15:12:51.08567-06','2023-12-19 15:12:51.08567-06','www.amazon.com'), + (3542,'COOFANDY',NULL,'B0CBKYNND3','https://m.media-amazon.com/images/I/819yyi6OtpL._AC_UL320_.jpg',114,4.4,'$39.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/COOFANDY-Quarter-Corduroy-Pullover-Sweatshirt/dp/B0CBKYNND3/ref=sr_1_43?keywords=men%27s+clothing&qid=1703020369&sr=8-43',46,'2023-12-19 15:12:51.092188-06','2023-12-19 15:12:51.092188-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3543,'Columbia',NULL,'B0076R6MFM','https://m.media-amazon.com/images/I/61P45VyvJrL._AC_UL320_.jpg',41126,4.7,'$34.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Columbia-Steens-Mountain-Fleece-Classic/dp/B0076R6MFM/ref=sr_1_44?keywords=men%27s+clothing&qid=1703020369&sr=8-44',46,'2023-12-19 15:12:51.100677-06','2023-12-19 15:12:51.100677-06','www.amazon.com'), + (3544,'Carhartt',NULL,'B002DESA4E','https://m.media-amazon.com/images/I/81BMS9sa84L._AC_UL320_.jpg',31382,4.7,'$29.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Carhartt-Signature-T-Shirt-Original-XX-Large/dp/B002DESA4E/ref=sr_1_45?keywords=men%27s+clothing&qid=1703020369&sr=8-45',46,'2023-12-19 15:12:51.108014-06','2023-12-19 15:12:51.108014-06','www.amazon.com'), + (3545,'Carhartt',NULL,'B002GHC1KC','https://m.media-amazon.com/images/I/7153peVzzCL._AC_UL320_.jpg',22026,4.7,'$34.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Carhartt-Workwear-Pocket-Henley-Regular/dp/B002GHC1KC/ref=sr_1_46?keywords=men%27s+clothing&qid=1703020369&sr=8-46',46,'2023-12-19 15:12:51.115308-06','2023-12-19 15:12:51.115308-06','www.amazon.com'), + (3546,'Lee',NULL,'B01LI4IDLO','https://m.media-amazon.com/images/I/817qC6rtrHS._AC_UL320_.jpg',30525,4.6,'$25.01','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Modern-Extreme-Motion-Straight-Tapered/dp/B01LI4IDLO/ref=sr_1_47?keywords=men%27s+clothing&qid=1703020369&sr=8-47',46,'2023-12-19 15:12:51.122024-06','2023-12-19 15:12:51.122024-06','www.amazon.com'), + (3547,'Under Armour',NULL,'B0BGWDJJ7G','https://m.media-amazon.com/images/I/51yQCEnwNLL._AC_UL320_.jpg',32799,4.6,'$29.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Under-Armour-Grove-Green-X-Large/dp/B0BGWDJJ7G/ref=sr_1_48?keywords=men%27s+clothing&qid=1703020369&sr=8-48',46,'2023-12-19 15:12:51.128665-06','2023-12-19 15:12:51.128665-06','www.amazon.com'), + (3548,'Under Armour',NULL,'B082BDDLS3','https://m.media-amazon.com/images/I/51WvCEEGitL._AC_UL320_.jpg',12920,4.3,'$27.86','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Under-Armour-Woven-Workout-XX-Large/dp/B082BDDLS3/ref=sr_1_49?keywords=men%27s+clothing&qid=1703020369&sr=8-49',46,'2023-12-19 15:12:51.13607-06','2023-12-19 15:12:51.13607-06','www.amazon.com'), + (3549,'Amazon Essentials',NULL,'B079P8RVPP','https://m.media-amazon.com/images/I/81JIBLEDxbL._AC_UL320_.jpg',27402,4.6,'$28.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Amazon-Essentials-Full-Zip-Sweatshirt-Charcoal/dp/B079P8RVPP/ref=sr_1_50?keywords=men%27s+clothing&qid=1703020369&sr=8-50',46,'2023-12-19 15:12:51.145626-06','2023-12-19 15:12:51.145626-06','www.amazon.com'), + (3550,'adidas',NULL,'B08MKSR82B','https://m.media-amazon.com/images/I/51I9fgiIogL._AC_UL320_.jpg',4110,4.6,'$14.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/adidas-Standard-Essentials-3-Stripes-Tracksuit/dp/B08MKSR82B/ref=sr_1_52?keywords=men%27s+clothing&qid=1703020369&sr=8-52',46,'2023-12-19 15:12:51.153781-06','2023-12-19 15:12:51.153781-06','www.amazon.com'), + (3551,'Nike',NULL,'B0CMYCHMFH','https://m.media-amazon.com/images/I/81PTFhxgEwL._AC_UL320_.jpg',13,4.7,'$28.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Nike-Unisex-Performance-Cushion-Socks/dp/B0CMYCHMFH/ref=sr_1_53_mod_primary_new?keywords=men%27s+clothing&qid=1703020369&sbo=RZvfv%2F%2FHxDF%2BO5021pAnSA%3D%3D&sr=8-53',46,'2023-12-19 15:12:51.161046-06','2023-12-19 15:12:51.161046-06','www.amazon.com'), + (3552,'Jerzees',NULL,'B00T7TXS54','https://m.media-amazon.com/images/I/71c7eRazT8S._AC_UL320_.jpg',56018,4.5,'$11.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Jerzees-Dri-Power-Moisture-Protection-3X-Large/dp/B00T7TXS54/ref=sr_1_54?keywords=men%27s+clothing&qid=1703020369&sr=8-54',46,'2023-12-19 15:12:51.168725-06','2023-12-19 15:12:51.168725-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3553,'Yeokou',NULL,'B074W1FNNZ','https://m.media-amazon.com/images/I/81cA3ubtXwL._AC_UL320_.jpg',10785,4.3,'$38.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Yeokou-Knitted-Cardigan-Sweaters-Pockets/dp/B074W1FNNZ/ref=sr_1_55?keywords=men%27s+clothing&qid=1703020369&sr=8-55',46,'2023-12-19 15:12:51.175366-06','2023-12-19 15:12:51.175366-06','www.amazon.com'), + (3554,'Amazon Essentials',NULL,'B075JWCR4M','https://m.media-amazon.com/images/I/7121M9UBAPL._AC_UL320_.jpg',45144,4.5,'$15.90','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Amazon-Essentials-Fleece-Sweatpants-X-Large/dp/B075JWCR4M/ref=sr_1_56?keywords=men%27s+clothing&qid=1703020369&sr=8-56',46,'2023-12-19 15:12:51.182429-06','2023-12-19 15:12:51.182429-06','www.amazon.com'), + (3555,'THE GYM PEOPLE',NULL,'B07YHK1L7T','https://m.media-amazon.com/images/I/71RnJfwBHoL._AC_UL320_.jpg',6105,4.5,'$31.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/GYM-PEOPLE-Loose-fit-Sweatpants-Lined-Black/dp/B07YHK1L7T/ref=sr_1_57?keywords=men%27s+clothing&qid=1703020369&sr=8-57',46,'2023-12-19 15:12:51.189859-06','2023-12-19 15:12:51.189859-06','www.amazon.com'), + (3556,'Amazon Essentials',NULL,'B08X5C4S38','https://m.media-amazon.com/images/I/91XyiNxemAL._AC_UL320_.jpg',8632,4.6,'$19.90','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Amazon-Essentials-Regular-fit-Long-Sleeve-Flannel/dp/B08X5C4S38/ref=sr_1_59?keywords=men%27s+clothing&qid=1703020369&sr=8-59',46,'2023-12-19 15:12:51.202031-06','2023-12-19 15:12:51.202031-06','www.amazon.com'), + (3557,'Amazon Essentials',NULL,'B07QGKXWCP','https://m.media-amazon.com/images/I/81I2qjL2arL._AC_UL320_.jpg',2475,4.5,'$19.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Amazon-Essentials-Standard-Regular-Fit-Long-Sleeve/dp/B07QGKXWCP/ref=sr_1_60?keywords=men%27s+clothing&qid=1703020369&sr=8-60',46,'2023-12-19 15:12:51.209721-06','2023-12-19 15:12:51.209721-06','www.amazon.com'), + (4563,'FYY Travel Cable Organizer Pouch Electronic Accessories Carry Case Portable Waterproof Double Layers All-in-One Storage Bag for Cord, Charger, Phone, Hard Drive, Black',NULL,'B09XB27Z9Q','https://m.media-amazon.com/images/I/71UZMDj-cLL._AC_UL320_.jpg',202,4.5,'$14.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxNTk3Mjk0NjM0MzQ4NzE3OjE3MDMwMjA2ODY6c3BfbXRmOjIwMDE0Njc5MTIyMzE5ODo6MDo6&url=%2FFYY-Electronic-Organizer-Accessories-Waterproof%2Fdp%2FB09XB27Z9Q%2Fref%3Dsr_1_61_sspa%3Fkeywords%3Dtravel%2Baccessories%26qid%3D1703020686%26sr%3D8-61-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',57,'2023-12-19 15:18:07.92968-06','2023-12-19 15:18:07.92968-06','www.amazon.com'), + (3559,'Real Essentials',NULL,'B0C31N9R4V','https://m.media-amazon.com/images/I/91oSoS5KOzL._AC_UL320_.jpg',517,4.0,'$32.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToyNjM4OTM5MTE1MDcxNzoxNzAzMDIwMzY5OnNwX3NlYXJjaF90aGVtYXRpY19idGY6MjAwMTU5NDQwODU2Njk4OjoxOjo&url=%2FPack-Collared-Clothing-Athletic-Performance%2Fdp%2FB0C31N9R4V%2Fref%3Dsxbs_pa_sp_search_thematic_btf_sspa%3Fcontent-id%3Damzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%253Aamzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%26cv_ct_cx%3Dmen%2527s%2Bclothing%26keywords%3Dmen%2527s%2Bclothing%26pd_rd_i%3DB0C31N9R4V%26pd_rd_r%3Df8f189cf-4b51-4505-b749-7f64ff127835%26pd_rd_w%3DfO2UT%26pd_rd_wg%3D1E6pb%26pf_rd_p%3Dc950d26b-f218-41e6-a496-534825ce2131%26pf_rd_r%3DBW4K1RYC2PKGWM2H077Y%26qid%3D1703020369%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-2-50a2b317-b617-44c1-b7a6-daec194a2368-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWNfYnRm%26psc%3D1',46,'2023-12-19 15:12:51.23097-06','2023-12-19 15:12:51.23097-06','www.amazon.com'), + (3560,'Real Essentials',NULL,'B07NWZ85D8','https://m.media-amazon.com/images/I/81+O6GnEKyL._AC_UL320_.jpg',46350,4.4,'$33.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToyNjM4OTM5MTE1MDcxNzoxNzAzMDIwMzY5OnNwX3NlYXJjaF90aGVtYXRpY19idGY6MjAwMDE5OTU1MTM5MzMxOjoyOjo&url=%2FT-Shirt-Athletic-Essentials-Clothing-Undershirt%2Fdp%2FB07NWZ85D8%2Fref%3Dsxbs_pa_sp_search_thematic_btf_sspa%3Fcontent-id%3Damzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%253Aamzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%26cv_ct_cx%3Dmen%2527s%2Bclothing%26keywords%3Dmen%2527s%2Bclothing%26pd_rd_i%3DB07NWZ85D8%26pd_rd_r%3Df8f189cf-4b51-4505-b749-7f64ff127835%26pd_rd_w%3DfO2UT%26pd_rd_wg%3D1E6pb%26pf_rd_p%3Dc950d26b-f218-41e6-a496-534825ce2131%26pf_rd_r%3DBW4K1RYC2PKGWM2H077Y%26qid%3D1703020369%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-3-50a2b317-b617-44c1-b7a6-daec194a2368-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWNfYnRm%26psc%3D1',46,'2023-12-19 15:12:51.238269-06','2023-12-19 15:12:51.238269-06','www.amazon.com'), + (3585,'H2H',NULL,'B0BNL2M92L','https://m.media-amazon.com/images/I/614G5NaWPRL._AC_UL320_.jpg',2652,4.5,'$29.50','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToyNDc5NjA4ODI1NjYxNzE3OjE3MDMwMjAzNzg6c3BfbXRmOjMwMDA3MjM2MTE5MzYwMjo6MDo6&url=%2FH2H-Formal-Hoodie-SMOKEGRAY-CMOHOL091%2Fdp%2FB0BNL2M92L%2Fref%3Dsr_1_69_sspa%3Fkeywords%3Dmen%2527s%2Bclothing%26qid%3D1703020378%26sr%3D8-69-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',46,'2023-12-19 15:12:59.3511-06','2023-12-19 15:12:59.3511-06','www.amazon.com'), + (3644,'Dokotoo',NULL,'B09B413K33','https://m.media-amazon.com/images/I/61jizvyzfcL._AC_UL320_.jpg',1566,4.3,'$29.88','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Dokotoo-Ladiess-Sweatshirt-Drawstring-Pullover/dp/B09B413K33/ref=sr_1_11?keywords=women%27s+clothing&qid=1703020384&sr=8-11',47,'2023-12-19 15:13:06.007073-06','2023-12-19 15:13:06.007073-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3561,'Boladeci',NULL,'B0BFH8L1NB','https://m.media-amazon.com/images/I/71pVd81oIbL._AC_UL320_.jpg',385,4.4,'$29.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToyNjM4OTM5MTE1MDcxNzoxNzAzMDIwMzY5OnNwX3NlYXJjaF90aGVtYXRpY19idGY6MzAwMDY1NzQxNjU4MDAyOjozOjo&url=%2FBoladeci-Pullover-Thermal-Moisture-Sweatshirts%2Fdp%2FB0BFH8L1NB%2Fref%3Dsxbs_pa_sp_search_thematic_btf_sspa%3Fcontent-id%3Damzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%253Aamzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%26cv_ct_cx%3Dmen%2527s%2Bclothing%26keywords%3Dmen%2527s%2Bclothing%26pd_rd_i%3DB0BFH8L1NB%26pd_rd_r%3Df8f189cf-4b51-4505-b749-7f64ff127835%26pd_rd_w%3DfO2UT%26pd_rd_wg%3D1E6pb%26pf_rd_p%3Dc950d26b-f218-41e6-a496-534825ce2131%26pf_rd_r%3DBW4K1RYC2PKGWM2H077Y%26qid%3D1703020369%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-4-50a2b317-b617-44c1-b7a6-daec194a2368-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWNfYnRm%26psc%3D1',46,'2023-12-19 15:12:51.245044-06','2023-12-19 15:12:51.245044-06','www.amazon.com'), + (3558,'Real Essentials',NULL,'B07J4YJZNW','https://m.media-amazon.com/images/I/71LPdu26vxL._AC_UL320_.jpg',85464,4.3,'$33.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToyNjM4OTM5MTE1MDcxNzoxNzAzMDIwMzY5OnNwX3NlYXJjaF90aGVtYXRpY19idGY6MjAwMTAzMTQ3MDI0MDMxOjo0Ojo&url=%2FDri-Fit-Training-Athletic-Essentials-Undershirt%2Fdp%2FB07J4YJZNW%2Fref%3Dsxbs_pa_sp_search_thematic_btf_sspa%3Fcontent-id%3Damzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%253Aamzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%26cv_ct_cx%3Dmen%2527s%2Bclothing%26keywords%3Dmen%2527s%2Bclothing%26pd_rd_i%3DB07J4YJZNW%26pd_rd_r%3Df8f189cf-4b51-4505-b749-7f64ff127835%26pd_rd_w%3DfO2UT%26pd_rd_wg%3D1E6pb%26pf_rd_p%3Dc950d26b-f218-41e6-a496-534825ce2131%26pf_rd_r%3DBW4K1RYC2PKGWM2H077Y%26qid%3D1703020369%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-5-50a2b317-b617-44c1-b7a6-daec194a2368-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWNfYnRm%26psc%3D1',46,'2023-12-19 15:12:51.21782-06','2023-12-19 15:12:51.252278-06','www.amazon.com'), + (3562,'NITAGUT',NULL,'B08GLDBPWQ','https://m.media-amazon.com/images/I/813U20E4s3L._AC_UL320_.jpg',3907,4.4,'$32.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToyNDc5NjA4ODI1NjYxNzE3OjE3MDMwMjAzNzg6c3BfYXRmX25leHQ6MjAwMDMyOTEzOTcyNzUxOjowOjo&url=%2FNITAGUT-Cardigan-Knitted-Sweater-Closure%25EF%25BC%258CGrey%25EF%25BC%258CXX-Large%2Fdp%2FB08GLDBPWQ%2Fref%3Dsr_1_49_sspa%3Fkeywords%3Dmen%2527s%2Bclothing%26qid%3D1703020378%26sr%3D8-49-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGZfbmV4dA%26psc%3D1',46,'2023-12-19 15:12:59.157479-06','2023-12-19 15:12:59.157479-06','www.amazon.com'), + (3563,'ThxToms',NULL,'B0CD26HFMG','https://m.media-amazon.com/images/I/81lCPug4mHL._AC_UL320_.jpg',26,4.3,'$59.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToyNDc5NjA4ODI1NjYxNzE3OjE3MDMwMjAzNzg6c3BfYXRmX25leHQ6MzAwMDY5NjEyMTMyMDAyOjowOjo&url=%2FThxToms-Rechargeable-Waterproof-Touchscreen-Motorcycle%2Fdp%2FB0CD26HFMG%2Fref%3Dsr_1_50_sspa%3Fkeywords%3Dmen%2527s%2Bclothing%26qid%3D1703020378%26sr%3D8-50-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGZfbmV4dA%26psc%3D1',46,'2023-12-19 15:12:59.175306-06','2023-12-19 15:12:59.175306-06','www.amazon.com'), + (3564,'LQHHYLYX',NULL,'B09JZDCG19','https://m.media-amazon.com/images/I/61dgTkEkQyL._AC_UL320_.jpg',444,4.0,'$26.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToyNDc5NjA4ODI1NjYxNzE3OjE3MDMwMjAzNzg6c3BfYXRmX25leHQ6MzAwMDk4ODQ0MDM5ODAyOjowOjo&url=%2FLQHHYLYX-Multicolor-Stitching-Comfortable-Sweatshirt%2Fdp%2FB09JZDCG19%2Fref%3Dsr_1_51_sspa%3Fkeywords%3Dmen%2527s%2Bclothing%26qid%3D1703020378%26sr%3D8-51-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGZfbmV4dA%26psc%3D1',46,'2023-12-19 15:12:59.182285-06','2023-12-19 15:12:59.182285-06','www.amazon.com'), + (3565,'Yeokou',NULL,'B07KMR7VR4','https://m.media-amazon.com/images/I/71sXADKyfhL._AC_UL320_.jpg',10785,4.3,'$38.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToyNDc5NjA4ODI1NjYxNzE3OjE3MDMwMjAzNzg6c3BfYXRmX25leHQ6MzAwMDkyNDk2MjcwODAyOjowOjo&url=%2FYeokou-Knitted-Cardigan-Sweaters-Z-12-Dark%2Fdp%2FB07KMR7VR4%2Fref%3Dsr_1_52_sspa%3Fkeywords%3Dmen%2527s%2Bclothing%26qid%3D1703020378%26sr%3D8-52-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGZfbmV4dA%26psc%3D1',46,'2023-12-19 15:12:59.188801-06','2023-12-19 15:12:59.188801-06','www.amazon.com'), + (3566,'Champion',NULL,'B0B9T52G3B','https://m.media-amazon.com/images/I/81CotVuF5xL._AC_UL320_.jpg',627,4.6,'$13.46','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Champion-Crewneck-Mid-Weight-Triangle-XX-Large/dp/B0B9T52G3B/ref=sr_1_53?keywords=men%27s+clothing&qid=1703020378&sr=8-53',46,'2023-12-19 15:12:59.195431-06','2023-12-19 15:12:59.195431-06','www.amazon.com'), + (3567,'Gildan',NULL,'B07682H9BX','https://m.media-amazon.com/images/I/715bY3uEYgL._AC_UL320_.jpg',137369,4.5,'$15.19','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Gildan-Cotton-Sleeve-T-Shirt-X-Large/dp/B07682H9BX/ref=sr_1_54?keywords=men%27s+clothing&qid=1703020378&sr=8-54',46,'2023-12-19 15:12:59.203559-06','2023-12-19 15:12:59.203559-06','www.amazon.com'), + (3568,'Under Armour',NULL,'B077ZXV38Y','https://m.media-amazon.com/images/I/51LWeqBz9xL._AC_UL320_.jpg',8819,4.6,'$15.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Under-Armour-V-Neck-Academy-XX-Large/dp/B077ZXV38Y/ref=sr_1_55?keywords=men%27s+clothing&qid=1703020378&sr=8-55',46,'2023-12-19 15:12:59.210351-06','2023-12-19 15:12:59.210351-06','www.amazon.com'), + (4564,'Luggage Cup Holder Free Hand Travel Drink Caddy Luggage Straps for Suitcases add a Bag Fits Roll on Suitcase Handles Gifts for Flight Attendants Travelers Accessories Black',NULL,'B0C2PMQ66H','https://m.media-amazon.com/images/I/716AmPh6+sL._AC_UL320_.jpg',6,3.7,'$19.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxNTk3Mjk0NjM0MzQ4NzE3OjE3MDMwMjA2ODY6c3BfbXRmOjMwMDEwNzM0ODQxMDIwMjo6MDo6&url=%2FLuggage-Shoulder-Thermal-Insulated-Suitcase%2Fdp%2FB0C2PMQ66H%2Fref%3Dsr_1_62_sspa%3Fkeywords%3Dtravel%2Baccessories%26qid%3D1703020686%26sr%3D8-62-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',57,'2023-12-19 15:18:07.93565-06','2023-12-19 15:18:07.93565-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3570,'MOHEEN',NULL,'B0BRPZTPR2','https://m.media-amazon.com/images/I/71TwcymUfbL._AC_UL320_.jpg',412,4.4,'$26.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3MjIzNDc0ODIyNjQyNzE3OjE3MDMwMjAzNzg6c3Bfc2VhcmNoX3RoZW1hdGljOjIwMDEzMTUzMTUzNzQ5ODo6Mjo6&url=%2FSleeve-Clothing-Athletic-Performance-Essentials%2Fdp%2FB0BRPZTPR2%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%253Aamzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%26cv_ct_cx%3Dmen%2527s%2Bclothing%26keywords%3Dmen%2527s%2Bclothing%26pd_rd_i%3DB0BRPZTPR2%26pd_rd_r%3Db65c4afb-52e6-46b9-99b8-4141e8e5cbbd%26pd_rd_w%3DTBemn%26pd_rd_wg%3DUSxqD%26pf_rd_p%3D0c4cbb48-e433-4698-bba6-b3a5297e3e20%26pf_rd_r%3DFQHKW173JTZNJ5WSG2CN%26qid%3D1703020378%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-51-f853d353-bf33-45e7-b5c2-2cb2b31abc9b-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',46,'2023-12-19 15:12:59.238786-06','2023-12-19 15:12:59.238786-06','www.amazon.com'), + (3607,'Amazon Essentials',NULL,'B07P8WX9RG','https://m.media-amazon.com/images/I/91zUfADtx4L._AC_UL320_.jpg',13587,4.5,'$15.90','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Amazon-Essentials-Standard-Full-Zip-Sweatshirt/dp/B07P8WX9RG/ref=sr_1_91?keywords=men%27s+clothing&qid=1703020378&sr=8-91',46,'2023-12-19 15:12:59.499277-06','2023-12-19 15:12:59.499277-06','www.amazon.com'), + (3571,'NITAGUT',NULL,'B0B8ZGKJWH','https://m.media-amazon.com/images/I/61H4q-uLFrL._AC_UL320_.jpg',314,4.6,'$25.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3MjIzNDc0ODIyNjQyNzE3OjE3MDMwMjAzNzg6c3Bfc2VhcmNoX3RoZW1hdGljOjIwMDEyODEwMTIyMzg5ODo6Mzo6&url=%2FNITAGUT-Shirts-Performance-Stretch-XX-Large%2Fdp%2FB0B8ZGKJWH%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%253Aamzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%26cv_ct_cx%3Dmen%2527s%2Bclothing%26keywords%3Dmen%2527s%2Bclothing%26pd_rd_i%3DB0B8ZGKJWH%26pd_rd_r%3Db65c4afb-52e6-46b9-99b8-4141e8e5cbbd%26pd_rd_w%3DTBemn%26pd_rd_wg%3DUSxqD%26pf_rd_p%3D0c4cbb48-e433-4698-bba6-b3a5297e3e20%26pf_rd_r%3DFQHKW173JTZNJ5WSG2CN%26qid%3D1703020378%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-52-f853d353-bf33-45e7-b5c2-2cb2b31abc9b-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',46,'2023-12-19 15:12:59.245223-06','2023-12-19 15:12:59.245223-06','www.amazon.com'), + (3569,'MIER',NULL,'B09TP1QYRP','https://m.media-amazon.com/images/I/71ofkD1VvSL._AC_UL320_.jpg',152,4.5,'$24.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3MjIzNDc0ODIyNjQyNzE3OjE3MDMwMjAzNzg6c3Bfc2VhcmNoX3RoZW1hdGljOjMwMDA5NjQ5NjM3ODUwMjo6NDo6&url=%2FMIER-Shirts-Sleeve-Collared-Moisture-Wicking%2Fdp%2FB09TP1QYRP%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%253Aamzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%26cv_ct_cx%3Dmen%2527s%2Bclothing%26keywords%3Dmen%2527s%2Bclothing%26pd_rd_i%3DB09TP1QYRP%26pd_rd_r%3Db65c4afb-52e6-46b9-99b8-4141e8e5cbbd%26pd_rd_w%3DTBemn%26pd_rd_wg%3DUSxqD%26pf_rd_p%3D0c4cbb48-e433-4698-bba6-b3a5297e3e20%26pf_rd_r%3DFQHKW173JTZNJ5WSG2CN%26qid%3D1703020378%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-53-f853d353-bf33-45e7-b5c2-2cb2b31abc9b-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',46,'2023-12-19 15:12:59.217662-06','2023-12-19 15:12:59.252726-06','www.amazon.com'), + (3572,'Under Armour',NULL,'B077XQ5QM7','https://m.media-amazon.com/images/I/51sfHbqw-iL._AC_UL320_.jpg',66147,4.7,'$18.75','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Under-Armour-Graphic-Shorts-Academy/dp/B077XQ5QM7/ref=sr_1_56?keywords=men%27s+clothing&qid=1703020378&sr=8-56',46,'2023-12-19 15:12:59.259874-06','2023-12-19 15:12:59.259874-06','www.amazon.com'), + (3573,'Hanes',NULL,'B07FN49S63','https://m.media-amazon.com/images/I/71n1CQQB-zL._AC_UL320_.jpg',50731,4.4,'$13.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Hanes-EcoSmart-Sweatpant-Pockets-Charcoal/dp/B07FN49S63/ref=sr_1_57?keywords=men%27s+clothing&qid=1703020378&sr=8-57',46,'2023-12-19 15:12:59.265763-06','2023-12-19 15:12:59.265763-06','www.amazon.com'), + (3574,'Amazon Essentials',NULL,'B079RNTRT2','https://m.media-amazon.com/images/I/91HhhwfQLtL._AC_UL320_.jpg',21222,4.5,'$25.50','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Amazon-Essentials-Crewneck-Sweater-Heather/dp/B079RNTRT2/ref=sr_1_58?keywords=men%27s+clothing&qid=1703020378&sr=8-58',46,'2023-12-19 15:12:59.272943-06','2023-12-19 15:12:59.272943-06','www.amazon.com'), + (3575,'Vcansion',NULL,'B01M9F7K7B','https://m.media-amazon.com/images/I/816MjmH6DtL._AC_UL320_.jpg',3111,4.2,'$39.69','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToyNDc5NjA4ODI1NjYxNzE3OjE3MDMwMjAzNzg6c3BfbXRmOjMwMDA4NjE4NjAxODEwMjo6MDo6&url=%2FVcansion-Classic-Knitted-Cardigan-Sweaters%2Fdp%2FB01M9F7K7B%2Fref%3Dsr_1_59_sspa%3Fkeywords%3Dmen%2527s%2Bclothing%26qid%3D1703020378%26sr%3D8-59-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',46,'2023-12-19 15:12:59.279828-06','2023-12-19 15:12:59.279828-06','www.amazon.com'), + (3576,'Yuccalley',NULL,'B07VPHBWBM','https://m.media-amazon.com/images/I/61pIIlKCMIL._AC_UL320_.jpg',1466,4.4,'$25.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToyNDc5NjA4ODI1NjYxNzE3OjE3MDMwMjAzNzg6c3BfbXRmOjIwMDA5MTEzMDQyNTE5ODo6MDo6&url=%2FYuccalley-Fashion-Hoodies-Sweatshirts-Pullover%2Fdp%2FB07VPHBWBM%2Fref%3Dsr_1_60_sspa%3Fkeywords%3Dmen%2527s%2Bclothing%26qid%3D1703020378%26sr%3D8-60-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',46,'2023-12-19 15:12:59.286795-06','2023-12-19 15:12:59.286795-06','www.amazon.com'), + (3578,'URBANFIND',NULL,'B06XK97JQP','https://m.media-amazon.com/images/I/519kCnvDE7L._AC_UL320_.jpg',7970,4.5,'$31.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToyNDc5NjA4ODI1NjYxNzE3OjE3MDMwMjAzNzg6c3BfbXRmOjIwMDA5NzU2OTc4NTA5ODo6MDo6&url=%2FURBANFIND-Lightweight-Sportswear-Jacket-Casual%2Fdp%2FB06XK97JQP%2Fref%3Dsr_1_62_sspa%3Fkeywords%3Dmen%2527s%2Bclothing%26qid%3D1703020378%26sr%3D8-62-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',46,'2023-12-19 15:12:59.299899-06','2023-12-19 15:12:59.299899-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3579,'Under Armour',NULL,'B07815RQKP','https://m.media-amazon.com/images/I/61ZF21bFTUL._AC_UL320_.jpg',28777,4.6,'$17.50','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Under-Armour-sportstyle-T-Shirt-Heather/dp/B07815RQKP/ref=sr_1_63?keywords=men%27s+clothing&qid=1703020378&sr=8-63',46,'2023-12-19 15:12:59.307701-06','2023-12-19 15:12:59.307701-06','www.amazon.com'), + (3580,'Under Armour',NULL,'B01M7S6LUP','https://m.media-amazon.com/images/I/41ST5qtPI2L._AC_UL320_.jpg',13338,4.7,'$33.75','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Under-Armour-Sportstyle-Jogger-Heather/dp/B01M7S6LUP/ref=sr_1_64?keywords=men%27s+clothing&qid=1703020378&sr=8-64',46,'2023-12-19 15:12:59.315047-06','2023-12-19 15:12:59.315047-06','www.amazon.com'), + (3581,'Amazon Essentials',NULL,'B075JV8PDN','https://m.media-amazon.com/images/I/81XXxfg1XuL._AC_UL320_.jpg',46803,4.5,'$21.60','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Amazon-Essentials-Full-Zip-Sweatshirt-XX-Large/dp/B075JV8PDN/ref=sr_1_65?keywords=men%27s+clothing&qid=1703020378&sr=8-65',46,'2023-12-19 15:12:59.32269-06','2023-12-19 15:12:59.32269-06','www.amazon.com'), + (3582,'Fruit of the Loom',NULL,'B0B9CF88TZ','https://m.media-amazon.com/images/I/81ETJ+wSNdL._AC_UL320_.jpg',43764,4.5,'$34.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Fruit-Loom-Mens-Extended-Jersey-Heather/dp/B0B9CF88TZ/ref=sr_1_66?keywords=men%27s+clothing&qid=1703020378&sr=8-66',46,'2023-12-19 15:12:59.330192-06','2023-12-19 15:12:59.330192-06','www.amazon.com'), + (3583,'Lehmanlin',NULL,'B0BY88NZ19','https://m.media-amazon.com/images/I/61ApDOm4n1L._AC_UL320_.jpg',51,4.4,'$26.59','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToyNDc5NjA4ODI1NjYxNzE3OjE3MDMwMjAzNzg6c3BfbXRmOjMwMDA4MzcyNzYwMzcwMjo6MDo6&url=%2FLehmanlin-Muscle-Lightweight-Fashion-T-Shirts%2Fdp%2FB0BY88NZ19%2Fref%3Dsr_1_67_sspa%3Fkeywords%3Dmen%2527s%2Bclothing%26qid%3D1703020378%26sr%3D8-67-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',46,'2023-12-19 15:12:59.337881-06','2023-12-19 15:12:59.337881-06','www.amazon.com'), + (3584,'COOFANDY',NULL,'B0BHYJ7DW9','https://m.media-amazon.com/images/I/61UXA3yl88L._AC_UL320_.jpg',996,4.2,'$46.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToyNDc5NjA4ODI1NjYxNzE3OjE3MDMwMjAzNzg6c3BfbXRmOjMwMDEwMzQzMzQwOTQwMjo6MDo6&url=%2FCOOFANDY-Pieces-Cotton-Pockets-Outfits%2Fdp%2FB0BHYJ7DW9%2Fref%3Dsr_1_68_sspa%3Fkeywords%3Dmen%2527s%2Bclothing%26qid%3D1703020378%26sr%3D8-68-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',46,'2023-12-19 15:12:59.344608-06','2023-12-19 15:12:59.344608-06','www.amazon.com'), + (3586,'NELEUS',NULL,'B09K63ZJYN','https://m.media-amazon.com/images/I/71zPAqEPoGL._AC_UL320_.jpg',1457,4.5,'$28.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToyNDc5NjA4ODI1NjYxNzE3OjE3MDMwMjAzNzg6c3BfbXRmOjIwMDAzNTMyODEwMDM5ODo6MDo6&url=%2FNeleus-Running-Sleeve-Workout-Shirts%2Fdp%2FB09K63ZJYN%2Fref%3Dsr_1_70_sspa%3Fkeywords%3Dmen%2527s%2Bclothing%26qid%3D1703020378%26sr%3D8-70-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',46,'2023-12-19 15:12:59.358505-06','2023-12-19 15:12:59.358505-06','www.amazon.com'), + (3587,'Under Armour',NULL,'B08NWJL7VX','https://m.media-amazon.com/images/I/51EIx4-hmuL._AC_UL320_.jpg',10992,4.7,'$21.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Under-Armour-Freedom-T-Shirt-Marine/dp/B08NWJL7VX/ref=sr_1_71?keywords=men%27s+clothing&qid=1703020378&sr=8-71',46,'2023-12-19 15:12:59.364772-06','2023-12-19 15:12:59.364772-06','www.amazon.com'), + (3588,'Under Armour',NULL,'B07YXNNRVW','https://m.media-amazon.com/images/I/61bD0xr19ZL._AC_UL320_.jpg',13901,4.7,'$27.88','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Under-Armour-Fleece-Heather-X-Large/dp/B07YXNNRVW/ref=sr_1_72?keywords=men%27s+clothing&qid=1703020378&sr=8-72',46,'2023-12-19 15:12:59.371156-06','2023-12-19 15:12:59.371156-06','www.amazon.com'), + (3589,'Champion',NULL,'B078LGFCHX','https://m.media-amazon.com/images/I/51sKBZQHbSL._AC_UL320_.jpg',9698,4.6,'$22.50','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Champion-Assorted-Essential-Long-Sleeve-Black-Y06794/dp/B078LGFCHX/ref=sr_1_73?keywords=men%27s+clothing&qid=1703020378&sr=8-73',46,'2023-12-19 15:12:59.376759-06','2023-12-19 15:12:59.376759-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3590,'Dokotoo Men',NULL,'B0CGZ7N7J4','https://m.media-amazon.com/images/I/71te2DSMK8L._AC_UL320_.jpg',125,4.4,'$25.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Dokotoo-Men-Sweatshirts-Lightweight-Crewneck/dp/B0CGZ7N7J4/ref=sr_1_74?keywords=men%27s+clothing&qid=1703020378&sr=8-74',46,'2023-12-19 15:12:59.383588-06','2023-12-19 15:12:59.383588-06','www.amazon.com'), + (3591,'Nike',NULL,'B0CFFPHZVF','https://m.media-amazon.com/images/I/81jodkS0wlL._AC_UL320_.jpg',1,5.0,'$24.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Nike-Sportswear-Swoosh-X-Large-Pistachio/dp/B0CFFPHZVF/ref=sr_1_75?keywords=men%27s+clothing&qid=1703020378&sr=8-75',46,'2023-12-19 15:12:59.390712-06','2023-12-19 15:12:59.390712-06','www.amazon.com'), + (3592,'adidas',NULL,'B081R33LK2','https://m.media-amazon.com/images/I/91PSe6qy8PL._AC_UL320_.jpg',37280,4.6,'$20.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/adidas-Athletic-Socks-6-Pair-Black/dp/B081R33LK2/ref=sr_1_76?keywords=men%27s+clothing&qid=1703020378&sr=8-76',46,'2023-12-19 15:12:59.39743-06','2023-12-19 15:12:59.39743-06','www.amazon.com'), + (3593,'Amazon Essentials',NULL,'B07P3N64SM','https://m.media-amazon.com/images/I/91+fzAlmztL._AC_UL320_.jpg',11077,4.5,'$16.70','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Amazon-Essentials-Standard-Quarter-Zip-Heather/dp/B07P3N64SM/ref=sr_1_77?keywords=men%27s+clothing&qid=1703020378&sr=8-77',46,'2023-12-19 15:12:59.404441-06','2023-12-19 15:12:59.404441-06','www.amazon.com'), + (3594,'Under Armour',NULL,'B01GH5GSLG','https://m.media-amazon.com/images/I/513HWlYAMPL._AC_UL320_.jpg',49563,4.7,'$30.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Under-Armour-White-Graphite-Large/dp/B01GH5GSLG/ref=sr_1_78?keywords=men%27s+clothing&qid=1703020378&sr=8-78',46,'2023-12-19 15:12:59.410991-06','2023-12-19 15:12:59.410991-06','www.amazon.com'), + (3595,'Gildan',NULL,'B01LZQACF4','https://m.media-amazon.com/images/I/91+PtsHS5jL._AC_UL320_.jpg',65561,4.6,'$12.97','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Gildan-Heavy-Blend-Crewneck-Sweatshirt/dp/B01LZQACF4/ref=sr_1_79?keywords=men%27s+clothing&qid=1703020378&sr=8-79',46,'2023-12-19 15:12:59.418518-06','2023-12-19 15:12:59.418518-06','www.amazon.com'), + (3596,'Hanes',NULL,'B072MR4NQ8','https://m.media-amazon.com/images/I/81M-7VvFZ0L._AC_UL320_.jpg',117436,4.4,'$16.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Hanes-Comfortsoft-T-Shirt-charcoal-heather/dp/B072MR4NQ8/ref=sr_1_80?keywords=men%27s+clothing&qid=1703020378&sr=8-80',46,'2023-12-19 15:12:59.424948-06','2023-12-19 15:12:59.424948-06','www.amazon.com'), + (3597,'adidas',NULL,'B0BJ6DM1TT','https://m.media-amazon.com/images/I/815j7Qq98mL._AC_UL320_.jpg',42,4.7,'$6.89','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/adidas-Essentials-Single-Jersey-Embroidered/dp/B0BJ6DM1TT/ref=sr_1_81?keywords=men%27s+clothing&qid=1703020378&sr=8-81',46,'2023-12-19 15:12:59.431652-06','2023-12-19 15:12:59.431652-06','www.amazon.com'), + (3598,'Amazon Essentials',NULL,'B08J9232PY','https://m.media-amazon.com/images/I/71BAyc9xQ2L._AC_UL320_.jpg',3178,4.4,'$25.40','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Amazon-Essentials-Fleece-Sweatpant-Indigo/dp/B08J9232PY/ref=sr_1_82?keywords=men%27s+clothing&qid=1703020378&sr=8-82',46,'2023-12-19 15:12:59.43901-06','2023-12-19 15:12:59.43901-06','www.amazon.com'), + (3599,'Hanes',NULL,'B01L9H85RM','https://m.media-amazon.com/images/I/719NiYxL4rL._AC_UL320_.jpg',18232,4.3,'$14.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Hanes-Performance-Training-Pockets-Stealth/dp/B01L9H85RM/ref=sr_1_83?keywords=men%27s+clothing&qid=1703020378&sr=8-83',46,'2023-12-19 15:12:59.444999-06','2023-12-19 15:12:59.444999-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3600,'Champion',NULL,'B0BRQZB3QF','https://m.media-amazon.com/images/I/41Je-BDG-8L._AC_UL320_.jpg',14259,4.6,'$18.75','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Champion-Moisture-Wicking-Athletic-3X-Large/dp/B0BRQZB3QF/ref=sr_1_84?keywords=men%27s+clothing&qid=1703020378&sr=8-84',46,'2023-12-19 15:12:59.452216-06','2023-12-19 15:12:59.452216-06','www.amazon.com'), + (3601,'Real Essentials',NULL,'B07DRNTL8K','https://m.media-amazon.com/images/I/91FcSGFvMFL._AC_UL320_.jpg',85464,4.3,'$33.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Dri-Fit-Training-Athletic-Essentials-T-Shirt/dp/B07DRNTL8K/ref=sr_1_85?keywords=men%27s+clothing&qid=1703020378&sr=8-85',46,'2023-12-19 15:12:59.458574-06','2023-12-19 15:12:59.458574-06','www.amazon.com'), + (3602,'Nautica',NULL,'B07BR17PD1','https://m.media-amazon.com/images/I/81J8AFcFMjL._AC_UL320_.jpg',12327,4.4,'$13.12','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Nautica-Short-Sleeve-T-Shirt-Medium/dp/B07BR17PD1/ref=sr_1_86?keywords=men%27s+clothing&qid=1703020378&sr=8-86',46,'2023-12-19 15:12:59.464958-06','2023-12-19 15:12:59.464958-06','www.amazon.com'), + (3603,'Champion',NULL,'B078GLLX3W','https://m.media-amazon.com/images/I/51Fo6N7xDKL._AC_UL320_.jpg',8891,4.6,'$25.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Champion-Packable-Jacket-Black-XX-Large/dp/B078GLLX3W/ref=sr_1_87?keywords=men%27s+clothing&qid=1703020378&sr=8-87',46,'2023-12-19 15:12:59.471791-06','2023-12-19 15:12:59.471791-06','www.amazon.com'), + (3604,'TELALEO',NULL,'B0C6GPWV32','https://m.media-amazon.com/images/I/613bajxed1L._AC_UL320_.jpg',1555,4.6,'$35.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Compression-Athletic-Weather-Undershirt-Workout/dp/B0C6GPWV32/ref=sr_1_88?keywords=men%27s+clothing&qid=1703020378&sr=8-88',46,'2023-12-19 15:12:59.478231-06','2023-12-19 15:12:59.478231-06','www.amazon.com'), + (3605,'Amazon Essentials',NULL,'B08617BXR4','https://m.media-amazon.com/images/I/91bxX3N6hhL._AC_UL320_.jpg',5468,4.6,'$29.50','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Amazon-Essentials-Long-Sleeve-Fisherman-Off-White/dp/B08617BXR4/ref=sr_1_89?keywords=men%27s+clothing&qid=1703020378&sr=8-89',46,'2023-12-19 15:12:59.485448-06','2023-12-19 15:12:59.485448-06','www.amazon.com'), + (3606,'Wrangler',NULL,'B01MRO342O','https://m.media-amazon.com/images/I/61f6UoPavoL._AC_UL320_.jpg',6754,4.4,'$44.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Wrangler-Mens-Retro-Relaxed-Jackson/dp/B01MRO342O/ref=sr_1_90?keywords=men%27s+clothing&qid=1703020378&sr=8-90',46,'2023-12-19 15:12:59.492477-06','2023-12-19 15:12:59.492477-06','www.amazon.com'), + (3577,'Zaitun',NULL,'B08VWYBKYH','https://m.media-amazon.com/images/I/912avsuBEdL._AC_UL320_.jpg',3514,4.5,'$32.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToyNDc5NjA4ODI1NjYxNzE3OjE3MDMwMjAzNzg6c3BfbXRmOjIwMDA3ODQ3MzcyODc5ODo6MDo6&url=%2FZaitun-Sweatshirt-Knitted-Pullover-Sweater%2Fdp%2FB08VWYBKYH%2Fref%3Dsr_1_61_sspa%3Fkeywords%3Dmen%2527s%2Bclothing%26qid%3D1703020378%26sr%3D8-61-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',46,'2023-12-19 15:12:59.29299-06','2023-12-19 15:12:59.512378-06','www.amazon.com'), + (3609,'Amazon Essentials',NULL,'B079LPNXHF','https://m.media-amazon.com/images/I/91qK9c1Vx1L._AC_UL320_.jpg',16869,4.5,'$14.90','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Amazon-Essentials-Full-Zip-Charcoal-XX-Large/dp/B079LPNXHF/ref=sr_1_94?keywords=men%27s+clothing&qid=1703020378&sr=8-94',46,'2023-12-19 15:12:59.520549-06','2023-12-19 15:12:59.520549-06','www.amazon.com'), + (3610,'Hanes',NULL,'B0BB8B8ZJW','https://m.media-amazon.com/images/I/91txowOolNL._AC_UL320_.jpg',290,4.3,'$13.11','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Hanes-Crewneck-Sweatshirt-Tri-Blend-Heather/dp/B0BB8B8ZJW/ref=sr_1_95?keywords=men%27s+clothing&qid=1703020378&sr=8-95',46,'2023-12-19 15:12:59.52711-06','2023-12-19 15:12:59.52711-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3611,'adidas',NULL,'B0BJ622M57','https://m.media-amazon.com/images/I/413ueX2CoXL._AC_UL320_.jpg',78,4.6,'$11.96','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/adidas-Essentials-Embroidered-T-Shirt-X-Large/dp/B0BJ622M57/ref=sr_1_96?keywords=men%27s+clothing&qid=1703020378&sr=8-96',46,'2023-12-19 15:12:59.53424-06','2023-12-19 15:12:59.53424-06','www.amazon.com'), + (3612,'Champion',NULL,'B073R28JZY','https://m.media-amazon.com/images/I/811MN2qiz9S._AC_UL320_.jpg',37903,4.4,'$19.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Champion-Jersey-Jogger-Granite-Heather/dp/B073R28JZY/ref=sr_1_97?keywords=men%27s+clothing&qid=1703020378&sr=8-97',46,'2023-12-19 15:12:59.541471-06','2023-12-19 15:12:59.541471-06','www.amazon.com'), + (3613,'Body Glove',NULL,'B0CLQWTLMS','https://m.media-amazon.com/images/I/71lZnzTHJoL._AC_UL320_.jpg',8,3.8,'$17.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Body-Glove-Mens-Socks-Performance/dp/B0CLQWTLMS/ref=sr_1_98?keywords=men%27s+clothing&qid=1703020378&sr=8-98',46,'2023-12-19 15:12:59.547798-06','2023-12-19 15:12:59.547798-06','www.amazon.com'), + (3614,'Amazon Essentials',NULL,'B0BRKB598K','https://m.media-amazon.com/images/I/81TkFI1D1mL._AC_UL320_.jpg',10849,4.4,'$14.20','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Amazon-Essentials-Performance-Cushioned-Athletic/dp/B0BRKB598K/ref=sr_1_99?keywords=men%27s+clothing&qid=1703020378&sr=8-99',46,'2023-12-19 15:12:59.555211-06','2023-12-19 15:12:59.555211-06','www.amazon.com'), + (3615,'COOFANDY',NULL,'B07486N4SR','https://m.media-amazon.com/images/I/713qaHeOnDL._AC_UL320_.jpg',9337,4.5,'$36.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Coofandy-Knitted-Sweaters-Pullover-Knitwear/dp/B07486N4SR/ref=sr_1_100?keywords=men%27s+clothing&qid=1703020378&sr=8-100',46,'2023-12-19 15:12:59.561403-06','2023-12-19 15:12:59.561403-06','www.amazon.com'), + (3616,'Under Armour',NULL,'B09WD3815Q','https://m.media-amazon.com/images/I/51GvrUVWNfL._AC_UL320_.jpg',82,4.7,'$28.20','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Under-Armour-Standard-Playoff-X-Large/dp/B09WD3815Q/ref=sr_1_101?keywords=men%27s+clothing&qid=1703020378&sr=8-101',46,'2023-12-19 15:12:59.569263-06','2023-12-19 15:12:59.569263-06','www.amazon.com'), + (3617,'Amazon Essentials',NULL,'B08J922PNN','https://m.media-amazon.com/images/I/81EStL-+1UL._AC_UL320_.jpg',2515,4.4,'$23.70','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Amazon-Essentials-Sweatpant-Charcoal-Heather/dp/B08J922PNN/ref=sr_1_102?keywords=men%27s+clothing&qid=1703020378&sr=8-102',46,'2023-12-19 15:12:59.5759-06','2023-12-19 15:12:59.5759-06','www.amazon.com'), + (3618,'Fruit of the Loom',NULL,'B08D2SCWLL','https://m.media-amazon.com/images/I/71HqeAgY0cL._AC_UL320_.jpg',3012,4.5,'$21.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Fruit-Loom-Recycled-Thermal-Underwear/dp/B08D2SCWLL/ref=sr_1_103?keywords=men%27s+clothing&qid=1703020378&sr=8-103',46,'2023-12-19 15:12:59.582789-06','2023-12-19 15:12:59.582789-06','www.amazon.com'), + (3619,'PUMA',NULL,'B0BGMDWD9N','https://m.media-amazon.com/images/I/51G+5i9++FL._AC_UL320_.jpg',22,4.2,'$9.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/PUMA-Short-Sleeve-T-Shirt-Casual/dp/B0BGMDWD9N/ref=sr_1_104?keywords=men%27s+clothing&qid=1703020378&sr=8-104',46,'2023-12-19 15:12:59.590155-06','2023-12-19 15:12:59.590155-06','www.amazon.com'), + (3620,'POLO',NULL,'B07FN4GHN8','https://m.media-amazon.com/images/I/71R3uFTAVTL._AC_UL320_.jpg',11588,4.5,'$45.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/POLO-RALPH-LAUREN-Classic-Andover/dp/B07FN4GHN8/ref=sr_1_105?keywords=men%27s+clothing&qid=1703020378&sr=8-105',46,'2023-12-19 15:12:59.597132-06','2023-12-19 15:12:59.597132-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3621,'Nike',NULL,'B087LWNKFB','https://m.media-amazon.com/images/I/41I-ttZRMtL._AC_UL320_.jpg',7198,4.1,'$25.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Nike-Soccer-Shorts-Small-Black/dp/B087LWNKFB/ref=sr_1_106?keywords=men%27s+clothing&qid=1703020378&sr=8-106',46,'2023-12-19 15:12:59.604187-06','2023-12-19 15:12:59.604187-06','www.amazon.com'), + (3622,'adidas',NULL,'B09YBCVSJB','https://m.media-amazon.com/images/I/61fWnEQgr7L._AC_UL320_.jpg',523,4.6,'$16.13','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/adidas-Essentials-Embroidered-T-Shirt-Heather/dp/B09YBCVSJB/ref=sr_1_107?keywords=men%27s+clothing&qid=1703020378&sr=8-107',46,'2023-12-19 15:12:59.611236-06','2023-12-19 15:12:59.611236-06','www.amazon.com'), + (3623,'Amazon Essentials',NULL,'B08TVKTC2L','https://m.media-amazon.com/images/I/91QdspqvVhL._AC_UL320_.jpg',982,4.4,'$29.60','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Amazon-Essentials-Long-Sleeve-Sweater-X-Large/dp/B08TVKTC2L/ref=sr_1_108?keywords=men%27s+clothing&qid=1703020378&sr=8-108',46,'2023-12-19 15:12:59.620352-06','2023-12-19 15:12:59.620352-06','www.amazon.com'), + (4565,'CIXVOEMK Silicone Headphone Organizer-Data Cable Storage Case-Mini Key Box-Portable Wired Headphone Organizer(Red-Grey-Green-3PCS)',NULL,'B0BG5277LY','https://m.media-amazon.com/images/I/61jAeUQNzOL._AC_UL320_.jpg',456,4.3,'$6.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Silicone-Headphone-Organizer-Lipstick-Red-Grey-Green-3PCS/dp/B0BG5277LY/ref=sr_1_63?keywords=travel+accessories&qid=1703020686&sr=8-63',57,'2023-12-19 15:18:07.942339-06','2023-12-19 15:18:07.942339-06','www.amazon.com'), + (3645,'LILLUSORY',NULL,'B0C65Z4WXF','https://m.media-amazon.com/images/I/711YLR04gNL._AC_UL320_.jpg',334,4.3,'$49.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/LILLUSORY-Cardigans-Sweater-Fashion-Clothes/dp/B0C65Z4WXF/ref=sr_1_12?keywords=women%27s+clothing&qid=1703020384&sr=8-12',47,'2023-12-19 15:13:06.014089-06','2023-12-19 15:13:06.014089-06','www.amazon.com'), + (3646,'Hanes',NULL,'B00ZUNH1WW','https://m.media-amazon.com/images/I/81CRymSaWcL._AC_UL320_.jpg',61242,4.3,'$10.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Hanes-Ecosmart-Crewneck-athletic-sweatshirts/dp/B00ZUNH1WW/ref=sr_1_13?keywords=women%27s+clothing&qid=1703020384&sr=8-13',47,'2023-12-19 15:13:06.02227-06','2023-12-19 15:13:06.02227-06','www.amazon.com'), + (3625,'Real Essentials',NULL,'B07VF89R18','https://m.media-amazon.com/images/I/61YpUEEQENL._AC_UL320_.jpg',14305,4.2,'$30.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozNzE5NjY3MDY4Mzk4NzE3OjE3MDMwMjAzNzg6c3Bfc2VhcmNoX3RoZW1hdGljX2J0ZjoyMDAwMzIyOTE1NTczMzE6OjA6Og&url=%2FPack-Mens-Active-Dry-Polo%2Fdp%2FB07VF89R18%2Fref%3Dsxbs_pa_sp_search_thematic_btf_sspa%3Fcontent-id%3Damzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%253Aamzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%26cv_ct_cx%3Dmen%2527s%2Bclothing%26keywords%3Dmen%2527s%2Bclothing%26pd_rd_i%3DB07VF89R18%26pd_rd_r%3D5489a068-5462-495e-96ad-0af4b49b7857%26pd_rd_w%3DAVi5P%26pd_rd_wg%3DpUAsn%26pf_rd_p%3Dc950d26b-f218-41e6-a496-534825ce2131%26pf_rd_r%3DFQHKW173JTZNJ5WSG2CN%26qid%3D1703020378%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-49-50a2b317-b617-44c1-b7a6-daec194a2368-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWNfYnRm%26psc%3D1',46,'2023-12-19 15:12:59.635449-06','2023-12-19 15:12:59.635449-06','www.amazon.com'), + (3626,'Real Essentials',NULL,'B08FXSHQVB','https://m.media-amazon.com/images/I/714xFtOU6mL._AC_UL320_.jpg',46350,4.4,'$33.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozNzE5NjY3MDY4Mzk4NzE3OjE3MDMwMjAzNzg6c3Bfc2VhcmNoX3RoZW1hdGljX2J0ZjoyMDAxMDMxNTEzNTUwMzE6OjE6Og&url=%2FT-Shirt-Athletic-Essentials-Clothing-Undershirt%2Fdp%2FB08FXSHQVB%2Fref%3Dsxbs_pa_sp_search_thematic_btf_sspa%3Fcontent-id%3Damzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%253Aamzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%26cv_ct_cx%3Dmen%2527s%2Bclothing%26keywords%3Dmen%2527s%2Bclothing%26pd_rd_i%3DB08FXSHQVB%26pd_rd_r%3D5489a068-5462-495e-96ad-0af4b49b7857%26pd_rd_w%3DAVi5P%26pd_rd_wg%3DpUAsn%26pf_rd_p%3Dc950d26b-f218-41e6-a496-534825ce2131%26pf_rd_r%3DFQHKW173JTZNJ5WSG2CN%26qid%3D1703020378%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-50-50a2b317-b617-44c1-b7a6-daec194a2368-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWNfYnRm%26psc%3D1',46,'2023-12-19 15:12:59.642385-06','2023-12-19 15:12:59.642385-06','www.amazon.com'), + (3627,'Real Essentials',NULL,'B07DRN7P8J','https://m.media-amazon.com/images/I/71LPdu26vxL._AC_UL320_.jpg',85464,4.3,'$33.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozNzE5NjY3MDY4Mzk4NzE3OjE3MDMwMjAzNzg6c3Bfc2VhcmNoX3RoZW1hdGljX2J0ZjoyMDAwMjEwNTE3Nzk2MzE6OjM6Og&url=%2FDri-Fit-Training-Athletic-Essentials-T-Shirt%2Fdp%2FB07DRN7P8J%2Fref%3Dsxbs_pa_sp_search_thematic_btf_sspa%3Fcontent-id%3Damzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%253Aamzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%26cv_ct_cx%3Dmen%2527s%2Bclothing%26keywords%3Dmen%2527s%2Bclothing%26pd_rd_i%3DB07DRN7P8J%26pd_rd_r%3D5489a068-5462-495e-96ad-0af4b49b7857%26pd_rd_w%3DAVi5P%26pd_rd_wg%3DpUAsn%26pf_rd_p%3Dc950d26b-f218-41e6-a496-534825ce2131%26pf_rd_r%3DFQHKW173JTZNJ5WSG2CN%26qid%3D1703020378%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-52-50a2b317-b617-44c1-b7a6-daec194a2368-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWNfYnRm%26psc%3D1',46,'2023-12-19 15:12:59.656237-06','2023-12-19 15:12:59.656237-06','www.amazon.com'), + (3624,'Merino.tech',NULL,'B0BHZMH9TQ','https://m.media-amazon.com/images/I/81W9x5Ag7WL._AC_UL320_.jpg',189,4.4,'$59.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozNzE5NjY3MDY4Mzk4NzE3OjE3MDMwMjAzNzg6c3Bfc2VhcmNoX3RoZW1hdGljX2J0ZjoyMDAxNDA0NDk5OTQxOTg6OjQ6Og&url=%2FMerino-Wool-Polo-Shirt-Men%2Fdp%2FB0BHZMH9TQ%2Fref%3Dsxbs_pa_sp_search_thematic_btf_sspa%3Fcontent-id%3Damzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%253Aamzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%26cv_ct_cx%3Dmen%2527s%2Bclothing%26keywords%3Dmen%2527s%2Bclothing%26pd_rd_i%3DB0BHZMH9TQ%26pd_rd_r%3D5489a068-5462-495e-96ad-0af4b49b7857%26pd_rd_w%3DAVi5P%26pd_rd_wg%3DpUAsn%26pf_rd_p%3Dc950d26b-f218-41e6-a496-534825ce2131%26pf_rd_r%3DFQHKW173JTZNJ5WSG2CN%26qid%3D1703020378%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-53-50a2b317-b617-44c1-b7a6-daec194a2368-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWNfYnRm%26psc%3D1',46,'2023-12-19 15:12:59.628215-06','2023-12-19 15:12:59.66325-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3628,'Dokotoo',NULL,'B08QJPJ3RB','https://m.media-amazon.com/images/I/71L34zwlHrL._AC_UL320_.jpg',3347,4.3,'$28.88','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Dokotoo-Womens-Spring-Fashion-Blouses/dp/B08QJPJ3RB/ref=sr_1_1?keywords=women%27s+clothing&qid=1703020384&sr=8-1',47,'2023-12-19 15:13:05.872953-06','2023-12-19 15:13:05.872953-06','www.amazon.com'), + (3629,'AUTOMET',NULL,'B09HC6DFMS','https://m.media-amazon.com/images/I/614VXl7BjqL._AC_UL320_.jpg',13368,4.4,'$36.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/AUTOMET-Oversized-Flannel-Shacket-Apricot/dp/B09HC6DFMS/ref=sr_1_2?keywords=women%27s+clothing&qid=1703020384&sr=8-2',47,'2023-12-19 15:13:05.881269-06','2023-12-19 15:13:05.881269-06','www.amazon.com'), + (3630,'Bestshe',NULL,'B07XDNX9VH','https://m.media-amazon.com/images/I/61vYA7oMTIL._AC_UL320_.jpg',1941,4.5,'$26.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Womens-Tassel-Oversized-Cardigan-Sweater/dp/B07XDNX9VH/ref=sr_1_3?keywords=women%27s+clothing&qid=1703020384&sr=8-3',47,'2023-12-19 15:13:05.889203-06','2023-12-19 15:13:05.889203-06','www.amazon.com'), + (4566,'MLVOC Travel Pillow 100% Pure Memory Foam Neck Pillow, Comfortable & Breathable Cover, Machine Washable, Airplane Travel Kit with 3D Contoured Eye Masks, Earplugs, and Luxury Bag, Standard (Black)',NULL,'B082K8ZNQ1','https://m.media-amazon.com/images/I/81Fy+yZT+xL._AC_UL320_.jpg',32618,4.3,'$19.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/MLVOC-Comfortable-Breathable-Washable-Contoured/dp/B082K8ZNQ1/ref=sr_1_64?keywords=travel+accessories&qid=1703020686&sr=8-64',57,'2023-12-19 15:18:07.947965-06','2023-12-19 15:18:07.947965-06','www.amazon.com'), + (3632,'Aloodor',NULL,'B099JXF8VL','https://m.media-amazon.com/images/I/616ZjG4+MoL._AC_UL320_.jpg',6335,4.3,'$38.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo1NzUwMjU5NzMxMzYyNzE3OjE3MDMwMjAzODQ6c3Bfc2VhcmNoX3RoZW1hdGljOjIwMDA4OTEzNDU5OTE2MTo6MDo6&url=%2FAloodor-Lounge-Loungewear-Casual-Stripe%2Fdp%2FB099JXF8VL%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.cbead6fc-f00c-4cd7-8558-497bc91856e7%253Aamzn1.sym.cbead6fc-f00c-4cd7-8558-497bc91856e7%26cv_ct_cx%3Dwomen%2527s%2Bclothing%26keywords%3Dwomen%2527s%2Bclothing%26pd_rd_i%3DB099JXF8VL%26pd_rd_r%3D10422572-eda9-4d87-a28b-f619124611c6%26pd_rd_w%3DmQKWm%26pd_rd_wg%3DlOmzq%26pf_rd_p%3Dcbead6fc-f00c-4cd7-8558-497bc91856e7%26pf_rd_r%3DJR3DAAPTHKG1YTW8QGKZ%26qid%3D1703020384%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-1-183302c6-8dec-4386-8e58-6031e7be5ad8-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',47,'2023-12-19 15:13:05.90487-06','2023-12-19 15:13:05.90487-06','www.amazon.com'), + (3647,'LILLUSORY',NULL,'B0B51197P4','https://m.media-amazon.com/images/I/51n1zQVJIAL._AC_UL320_.jpg',4222,4.3,'$42.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/LILLUSORY-Turtleneck-Oversized-Sweaters-Pullover/dp/B0B51197P4/ref=sr_1_14?keywords=women%27s+clothing&qid=1703020384&sr=8-14',47,'2023-12-19 15:13:06.029138-06','2023-12-19 15:13:06.029138-06','www.amazon.com'), + (3633,'MoFiz',NULL,'B08YJ58BS5','https://m.media-amazon.com/images/I/51KDGAAZUvL._AC_UL320_.jpg',1965,4.4,'$36.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo1NzUwMjU5NzMxMzYyNzE3OjE3MDMwMjAzODQ6c3Bfc2VhcmNoX3RoZW1hdGljOjIwMDA4NTM0NDg1Nzk5ODo6MTo6&url=%2FMoFiz-Outdoor-Athletic-Boating-Camping%2Fdp%2FB08YJ58BS5%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.cbead6fc-f00c-4cd7-8558-497bc91856e7%253Aamzn1.sym.cbead6fc-f00c-4cd7-8558-497bc91856e7%26cv_ct_cx%3Dwomen%2527s%2Bclothing%26keywords%3Dwomen%2527s%2Bclothing%26pd_rd_i%3DB08YJ58BS5%26pd_rd_r%3D10422572-eda9-4d87-a28b-f619124611c6%26pd_rd_w%3DmQKWm%26pd_rd_wg%3DlOmzq%26pf_rd_p%3Dcbead6fc-f00c-4cd7-8558-497bc91856e7%26pf_rd_r%3DJR3DAAPTHKG1YTW8QGKZ%26qid%3D1703020384%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-2-183302c6-8dec-4386-8e58-6031e7be5ad8-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',47,'2023-12-19 15:13:05.910938-06','2023-12-19 15:13:05.910938-06','www.amazon.com'), + (3634,'AJISAI',NULL,'B08PVH71KL','https://m.media-amazon.com/images/I/61ZK-UBckeS._AC_UL320_.jpg',9625,4.5,'$32.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo1NzUwMjU5NzMxMzYyNzE3OjE3MDMwMjAzODQ6c3Bfc2VhcmNoX3RoZW1hdGljOjIwMDExMTYyNTM3MDA5ODo6Mjo6&url=%2FAJISAI-Joggers-Drawstring-Running-Sweatpants%2Fdp%2FB08PVH71KL%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.cbead6fc-f00c-4cd7-8558-497bc91856e7%253Aamzn1.sym.cbead6fc-f00c-4cd7-8558-497bc91856e7%26cv_ct_cx%3Dwomen%2527s%2Bclothing%26keywords%3Dwomen%2527s%2Bclothing%26pd_rd_i%3DB08PVH71KL%26pd_rd_r%3D10422572-eda9-4d87-a28b-f619124611c6%26pd_rd_w%3DmQKWm%26pd_rd_wg%3DlOmzq%26pf_rd_p%3Dcbead6fc-f00c-4cd7-8558-497bc91856e7%26pf_rd_r%3DJR3DAAPTHKG1YTW8QGKZ%26qid%3D1703020384%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-3-183302c6-8dec-4386-8e58-6031e7be5ad8-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',47,'2023-12-19 15:13:05.922021-06','2023-12-19 15:13:05.922021-06','www.amazon.com'), + (3635,'Zeagoo',NULL,'B09NNGMCM1','https://m.media-amazon.com/images/I/71plNVGGYgL._AC_UL320_.jpg',2092,4.1,'$39.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo1NzUwMjU5NzMxMzYyNzE3OjE3MDMwMjAzODQ6c3Bfc2VhcmNoX3RoZW1hdGljOjIwMDA3ODk2NjM5Nzg5ODo6Mzo6&url=%2FZeagoo-Outfit-Summer-Sleeve-Sweatsuit%2Fdp%2FB09NNGMCM1%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.cbead6fc-f00c-4cd7-8558-497bc91856e7%253Aamzn1.sym.cbead6fc-f00c-4cd7-8558-497bc91856e7%26cv_ct_cx%3Dwomen%2527s%2Bclothing%26keywords%3Dwomen%2527s%2Bclothing%26pd_rd_i%3DB09NNGMCM1%26pd_rd_r%3D10422572-eda9-4d87-a28b-f619124611c6%26pd_rd_w%3DmQKWm%26pd_rd_wg%3DlOmzq%26pf_rd_p%3Dcbead6fc-f00c-4cd7-8558-497bc91856e7%26pf_rd_r%3DJR3DAAPTHKG1YTW8QGKZ%26qid%3D1703020384%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-4-183302c6-8dec-4386-8e58-6031e7be5ad8-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',47,'2023-12-19 15:13:05.929822-06','2023-12-19 15:13:05.929822-06','www.amazon.com'), + (3631,'Yeokou',NULL,'B07QTPTF1G','https://m.media-amazon.com/images/I/518PFzFvGjL._AC_UL320_.jpg',25021,4.4,'$38.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo1NzUwMjU5NzMxMzYyNzE3OjE3MDMwMjAzODQ6c3Bfc2VhcmNoX3RoZW1hdGljOjMwMDA3MTQ2Mzg3MTkwMjo6NDo6&url=%2FYeokou-Womens-Athletic-Sweatpants-Black001%2Fdp%2FB07QTPTF1G%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.cbead6fc-f00c-4cd7-8558-497bc91856e7%253Aamzn1.sym.cbead6fc-f00c-4cd7-8558-497bc91856e7%26cv_ct_cx%3Dwomen%2527s%2Bclothing%26keywords%3Dwomen%2527s%2Bclothing%26pd_rd_i%3DB07QTPTF1G%26pd_rd_r%3D10422572-eda9-4d87-a28b-f619124611c6%26pd_rd_w%3DmQKWm%26pd_rd_wg%3DlOmzq%26pf_rd_p%3Dcbead6fc-f00c-4cd7-8558-497bc91856e7%26pf_rd_r%3DJR3DAAPTHKG1YTW8QGKZ%26qid%3D1703020384%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-5-183302c6-8dec-4386-8e58-6031e7be5ad8-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',47,'2023-12-19 15:13:05.89762-06','2023-12-19 15:13:05.937235-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3636,'Sunzel',NULL,'B0BB7STYJL','https://m.media-amazon.com/images/I/61aUZQs50XL._AC_UL320_.jpg',11461,4.3,'$19.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Sunzel-Leggings-Crossover-Control-High-Waisted/dp/B0BB7STYJL/ref=sr_1_4?keywords=women%27s+clothing&qid=1703020384&sr=8-4',47,'2023-12-19 15:13:05.945425-06','2023-12-19 15:13:05.945425-06','www.amazon.com'), + (3637,'Dokotoo',NULL,'B0B4JSJ8F4','https://m.media-amazon.com/images/I/61BhGJ3b3hL._AC_UL320_.jpg',2115,4.2,'$31.88','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Dokotoo-Crewneck-Sweatshirt-Pullover-Sweatshirts/dp/B0B4JSJ8F4/ref=sr_1_5?keywords=women%27s+clothing&qid=1703020384&sr=8-5',47,'2023-12-19 15:13:05.953251-06','2023-12-19 15:13:05.953251-06','www.amazon.com'), + (3638,'WallFlower',NULL,'B073177R9Q','https://m.media-amazon.com/images/I/71Biyy-urSL._AC_UL320_.jpg',50592,4.4,'$34.67','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/WallFlower-Juniors-Instastretch-Luscious-Bootcut/dp/B073177R9Q/ref=sr_1_6?keywords=women%27s+clothing&qid=1703020384&sr=8-6',47,'2023-12-19 15:13:05.960527-06','2023-12-19 15:13:05.960527-06','www.amazon.com'), + (3639,'Dokotoo',NULL,'B0C7VZHDM1','https://m.media-amazon.com/images/I/71ROuD9s7jL._AC_UL320_.jpg',401,4.5,'$39.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Dokotoo-Sweaters-Striped-Pullover-Drawstring/dp/B0C7VZHDM1/ref=sr_1_7?keywords=women%27s+clothing&qid=1703020384&sr=8-7',47,'2023-12-19 15:13:05.967999-06','2023-12-19 15:13:05.967999-06','www.amazon.com'), + (3640,'Legendary Whitetails',NULL,'B012XF4GUY','https://m.media-amazon.com/images/I/81bX5sLjTAS._AC_UL320_.jpg',13382,4.4,'$25.79','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Legendary-Whitetails-Cottage-Flannel-X-Large/dp/B012XF4GUY/ref=sr_1_8?keywords=women%27s+clothing&qid=1703020384&sr=8-8',47,'2023-12-19 15:13:05.975751-06','2023-12-19 15:13:05.975751-06','www.amazon.com'), + (3641,'PRETTYGARDEN',NULL,'B08DTFW6Y8','https://m.media-amazon.com/images/I/71B5I2AfVaL._AC_UL320_.jpg',10051,4.3,'$43.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/PRETTYGARDEN-Knitted-Cardigan-Sweater-Outwear/dp/B08DTFW6Y8/ref=sr_1_9?keywords=women%27s+clothing&qid=1703020384&sr=8-9',47,'2023-12-19 15:13:05.982219-06','2023-12-19 15:13:05.982219-06','www.amazon.com'), + (3642,'Amazon Essentials',NULL,'B08T7QWZRN','https://m.media-amazon.com/images/I/81Wrx4qX+kL._AC_UL320_.jpg',2880,4.4,'$33.20','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Amazon-Essentials-Womens-Sweater-Heather/dp/B08T7QWZRN/ref=sr_1_10?keywords=women%27s+clothing&qid=1703020384&sr=8-10',47,'2023-12-19 15:13:05.992021-06','2023-12-19 15:13:05.992021-06','www.amazon.com'), + (3643,'Sunzel',NULL,'B0BWH7LTLJ','https://aax-us-iad.amazon.com/e/loi/imp?b=JOjCjlCdAEBH1MRdEWmZti4AAAGMg-zR6gEAAAH2AQBvbm9fdHhuX2JpZDQgICBvbm9fdHhuX2ltcDEgICAvflLR',2937,4.3,'$22.39','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.comhttps://aax-us-iad.amazon.com/x/c/ROjCjlCdAEBH1MRdEWmZti4AAAGMg-zRsgEAAAH2AQBvbm9fdHhuX2JpZDQgICBvbm9fdHhuX2ltcDEgICAvflLR/https://www.amazon.com/Sunzel-Leggings-Crossover-Control-Waisted/dp/B0BWH7LTLJ/ref=sxin_23_sbv_search_btf?content-id=amzn1.sym.6ca944f8-539c-499e-a3a4-26a566d1de59%3Aamzn1.sym.6ca944f8-539c-499e-a3a4-26a566d1de59&cv_ct_cx=women%27s+clothing&keywords=women%27s+clothing&pd_rd_i=B0BWH7LTLJ&pd_rd_r=10422572-eda9-4d87-a28b-f619124611c6&pd_rd_w=oLVU6&pd_rd_wg=lOmzq&pf_rd_p=6ca944f8-539c-499e-a3a4-26a566d1de59&pf_rd_r=JR3DAAPTHKG1YTW8QGKZ&qid=1703020384&sbo=RZvfv%2F%2FHxDF%2BO5021pAnSA%3D%3D&sr=1-1-5190daf0-67e3-427c-bea6-c72c1df98776',47,'2023-12-19 15:13:05.999419-06','2023-12-19 15:13:05.999419-06','www.amazon.comhttps:'), + (3648,'Beaully',NULL,'B09H4G83H1','https://m.media-amazon.com/images/I/61LSELYQ26L._AC_UL320_.jpg',9924,4.4,'$34.89','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Beaully-Brushed-Flannel-Pocketed-Shacket/dp/B09H4G83H1/ref=sr_1_15?keywords=women%27s+clothing&qid=1703020384&sr=8-15',47,'2023-12-19 15:13:06.039262-06','2023-12-19 15:13:06.039262-06','www.amazon.com'), + (3649,'MANGOPOP',NULL,'B07KW7PDFJ','https://m.media-amazon.com/images/I/51jZphBMMmL._AC_UL320_.jpg',48987,4.3,'$26.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Mangopop-Womens-Sleeve-Bodysuits-Jumpsuits/dp/B07KW7PDFJ/ref=sr_1_16?keywords=women%27s+clothing&qid=1703020384&sr=8-16',47,'2023-12-19 15:13:06.046011-06','2023-12-19 15:13:06.046011-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3650,'Amazon Essentials',NULL,'B079RQ7VW3','https://m.media-amazon.com/images/I/91f9q2VrtdL._AC_UL320_.jpg',21316,4.4,'$19.90','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Amazon-Essentials-Womens-Sweater-Heather/dp/B079RQ7VW3/ref=sr_1_17?keywords=women%27s+clothing&qid=1703020384&sr=8-17',47,'2023-12-19 15:13:06.053989-06','2023-12-19 15:13:06.053989-06','www.amazon.com'), + (3651,'Amazon Essentials',NULL,'B07BJ8CBZG','https://m.media-amazon.com/images/I/619KpiRJWWL._AC_UL320_.jpg',39680,4.3,'$19.90','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Amazon-Essentials-Womens-Sweatpant-X-Large/dp/B07BJ8CBZG/ref=sr_1_18?keywords=women%27s+clothing&qid=1703020384&sr=8-18',47,'2023-12-19 15:13:06.060478-06','2023-12-19 15:13:06.060478-06','www.amazon.com'), + (3652,'Dokotoo',NULL,'B0C9SKX7JR','https://m.media-amazon.com/images/I/81dQW+EgP0L._AC_UL320_.jpg',122,3.8,'$20.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Dokotoo-Shirts-Sleeve-Fashion-Tshirts/dp/B0C9SKX7JR/ref=sr_1_19?keywords=women%27s+clothing&qid=1703020384&sr=8-19',47,'2023-12-19 15:13:06.06655-06','2023-12-19 15:13:06.06655-06','www.amazon.com'), + (3653,'Columbia',NULL,'B076VHNYHJ','https://m.media-amazon.com/images/I/610wZP7f+-L._AC_UL320_.jpg',55035,4.6,'$34.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Columbia-Womens-Springs-Classic-Heather/dp/B076VHNYHJ/ref=sr_1_20?keywords=women%27s+clothing&qid=1703020384&sr=8-20',47,'2023-12-19 15:13:06.074022-06','2023-12-19 15:13:06.074022-06','www.amazon.com'), + (3654,'Amazon Essentials',NULL,'B08R99V6KP','https://m.media-amazon.com/images/I/71PHuNqQeuS._AC_UL320_.jpg',149125,4.4,'$15.20','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Amazon-Essentials-Stretch-Classic-Assorted/dp/B08R99V6KP/ref=sr_1_21?keywords=women%27s+clothing&qid=1703020384&sr=8-21',47,'2023-12-19 15:13:06.080958-06','2023-12-19 15:13:06.080958-06','www.amazon.com'), + (3655,'YOUNGCHARM',NULL,'B098LCQRGP','https://m.media-amazon.com/images/I/717JYMI8wwL._AC_UL320_.jpg',20499,4.6,'$39.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/YOUNGCHARM-Leggings-Pockets-Women%EF%BC%8CHigh-BlackDGrayNavyBurgundy-L/dp/B098LCQRGP/ref=sr_1_22?keywords=women%27s+clothing&qid=1703020384&sr=8-22',47,'2023-12-19 15:13:06.088015-06','2023-12-19 15:13:06.088015-06','www.amazon.com'), + (3656,'Under Armour',NULL,'B0711M1S7S','https://m.media-amazon.com/images/I/71s1L8bOKTL._AC_UL320_.jpg',1445,4.6,'$23.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Under-Armour-Womens-Metallic-Silver/dp/B0711M1S7S/ref=sr_1_23?keywords=women%27s+clothing&qid=1703020384&sr=8-23',47,'2023-12-19 15:13:06.0941-06','2023-12-19 15:13:06.0941-06','www.amazon.com'), + (3657,'U.S. Polo Assn.',NULL,'B0C6RCDDKK','https://m.media-amazon.com/images/I/71ZmgDS8a9L._AC_UL320_.jpg',145,4.4,'$26.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/U-S-Polo-Assn-Sweatpants-Charcoal/dp/B0C6RCDDKK/ref=sr_1_24?keywords=women%27s+clothing&qid=1703020384&sr=8-24',47,'2023-12-19 15:13:06.101076-06','2023-12-19 15:13:06.101076-06','www.amazon.com'), + (3658,'Dokotoo',NULL,'B08NDVQZLP','https://m.media-amazon.com/images/I/713pXx0rKZL._AC_UL320_.jpg',14331,4.4,'$35.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Dokotoo-Womens-Corduroy-Shirts-Pockets/dp/B08NDVQZLP/ref=sr_1_25?keywords=women%27s+clothing&qid=1703020384&sr=8-25',47,'2023-12-19 15:13:06.108461-06','2023-12-19 15:13:06.108461-06','www.amazon.com'), + (3659,'PRETTYGARDEN',NULL,'B08HLSZ9K9','https://m.media-amazon.com/images/I/61yici4R5IL._AC_UL320_.jpg',19827,4.1,'$40.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/PRETTYGARDEN-Crewneck-Pullover-Sweatsuits-Tracksuits/dp/B08HLSZ9K9/ref=sr_1_26?keywords=women%27s+clothing&qid=1703020384&sr=8-26',47,'2023-12-19 15:13:06.115219-06','2023-12-19 15:13:06.115219-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3660,'Trendy Queen',NULL,'B0B75658TP','https://m.media-amazon.com/images/I/71mszxK76vL._AC_UL320_.jpg',333,3.7,'$21.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Trendy-Queen-Blouses-Crochet-Fashion/dp/B0B75658TP/ref=sr_1_27?keywords=women%27s+clothing&qid=1703020384&sr=8-27',47,'2023-12-19 15:13:06.123068-06','2023-12-19 15:13:06.123068-06','www.amazon.com'), + (3661,'Amazon Essentials',NULL,'B07CMDMT69','https://m.media-amazon.com/images/I/81JVnj7aO4L._AC_UL320_.jpg',14221,4.2,'$16.10','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Amazon-Essentials-Womens-Stretch-Jegging/dp/B07CMDMT69/ref=sr_1_28?keywords=women%27s+clothing&qid=1703020384&sr=8-28',47,'2023-12-19 15:13:06.130641-06','2023-12-19 15:13:06.130641-06','www.amazon.com'), + (3662,'Kissfix',NULL,'B09BF8NMHQ','https://m.media-amazon.com/images/I/61lE-5VL9sL._AC_UL320_.jpg',7443,4.2,'$21.97','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Kissfix-Fashion-Sleeve-Shirts-Clothes/dp/B09BF8NMHQ/ref=sr_1_29?keywords=women%27s+clothing&qid=1703020384&sr=8-29',47,'2023-12-19 15:13:06.138882-06','2023-12-19 15:13:06.138882-06','www.amazon.com'), + (3663,'Warner''s',NULL,'B01NARXN9F','https://m.media-amazon.com/images/I/91aBPAJ5XfL._AC_UL320_.jpg',42673,4.4,'$21.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Warners-Underarm-Smoothing-Seamless-RM3911A/dp/B01NARXN9F/ref=sr_1_30?keywords=women%27s+clothing&qid=1703020384&sr=8-30',47,'2023-12-19 15:13:06.145482-06','2023-12-19 15:13:06.145482-06','www.amazon.com'), + (3664,'AUTOMET',NULL,'B09Z2PXL9C','https://m.media-amazon.com/images/I/61zcpw4yQyL._AC_UL320_.jpg',5904,4.4,'$23.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/AUTOMET-Sweatpants-Pockets-Lounge-Pants-Womens-BlackGrey/dp/B09Z2PXL9C/ref=sr_1_31?keywords=women%27s+clothing&qid=1703020384&sr=8-31',47,'2023-12-19 15:13:06.153304-06','2023-12-19 15:13:06.153304-06','www.amazon.com'), + (3665,'ZESICA',NULL,'B0CBTVYL8X','https://m.media-amazon.com/images/I/71FJisKWczL._AC_UL320_.jpg',158,4.4,'$41.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/ZESICA-Striped-Knitted-Oversized-Pullover/dp/B0CBTVYL8X/ref=sr_1_32?keywords=women%27s+clothing&qid=1703020384&sr=8-32',47,'2023-12-19 15:13:06.159819-06','2023-12-19 15:13:06.159819-06','www.amazon.com'), + (3666,'LILLUSORY',NULL,'B0B51TJV4N','https://m.media-amazon.com/images/I/61DUXE1c43L._AC_UL320_.jpg',1574,4.3,'$42.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Sweater-Slouchy-Cardigans-Oversized-Outwear/dp/B0B51TJV4N/ref=sr_1_33?keywords=women%27s+clothing&qid=1703020384&sr=8-33',47,'2023-12-19 15:13:06.1668-06','2023-12-19 15:13:06.1668-06','www.amazon.com'), + (3667,'PRETTYGARDEN',NULL,'B09GM76N8N','https://m.media-amazon.com/images/I/71GyXu0I3iL._AC_UL320_.jpg',5907,4.3,'$42.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/PRETTYGARDEN-Flannel-Boyfriend-Shacket-B_Plaid/dp/B09GM76N8N/ref=sr_1_34?keywords=women%27s+clothing&qid=1703020384&sr=8-34',47,'2023-12-19 15:13:06.174156-06','2023-12-19 15:13:06.174156-06','www.amazon.com'), + (3668,'Under Armour',NULL,'B0872F71ZV','https://m.media-amazon.com/images/I/4157-oK4IPL._AC_UL320_.jpg',2555,4.5,'$23.82','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Under-Armour-HeatGear-Leggings-Midnight/dp/B0872F71ZV/ref=sr_1_35?keywords=women%27s+clothing&qid=1703020384&sr=8-35',47,'2023-12-19 15:13:06.180763-06','2023-12-19 15:13:06.180763-06','www.amazon.com'), + (3669,'morhuduck',NULL,'B09BVM5MB3','https://m.media-amazon.com/images/I/713VJLfVoCL._AC_UL320_.jpg',2215,4.1,'$28.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Morhuduck-Hoodies-Sweatshirt-Drawstring-Pullover/dp/B09BVM5MB3/ref=sr_1_36?keywords=women%27s+clothing&qid=1703020384&sr=8-36',47,'2023-12-19 15:13:06.188618-06','2023-12-19 15:13:06.188618-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3670,'Dokotoo',NULL,'B08MT2ZPYM','https://m.media-amazon.com/images/I/61CZwYbH6pL._AC_UL320_.jpg',2352,3.9,'$39.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Dokotoo-Crewneck-Sweaters-Oversized-Pullover/dp/B08MT2ZPYM/ref=sr_1_37?keywords=women%27s+clothing&qid=1703020384&sr=8-37',47,'2023-12-19 15:13:06.196185-06','2023-12-19 15:13:06.196185-06','www.amazon.com'), + (3671,'THE GYM PEOPLE',NULL,'B07ZP7BZMD','https://m.media-amazon.com/images/I/615YipeumnL._AC_UL320_.jpg',21403,4.3,'$28.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/GYM-PEOPLE-Athletic-Leggings-Training/dp/B07ZP7BZMD/ref=sr_1_38?keywords=women%27s+clothing&qid=1703020384&sr=8-38',47,'2023-12-19 15:13:06.204089-06','2023-12-19 15:13:06.204089-06','www.amazon.com'), + (3672,'Dokotoo',NULL,'B0CCTLQJJH','https://m.media-amazon.com/images/I/71v2mI40CtL._AC_UL320_.jpg',277,4.3,'$23.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Dokotoo-Tshirts-Shirts-Fashion-T-Shirts/dp/B0CCTLQJJH/ref=sr_1_39?keywords=women%27s+clothing&qid=1703020384&sr=8-39',47,'2023-12-19 15:13:06.211076-06','2023-12-19 15:13:06.211076-06','www.amazon.com'), + (3673,'ODODOS',NULL,'B0B3M6K9JJ','https://m.media-amazon.com/images/I/81ZBjcfQTsL._AC_UL320_.jpg',10645,4.4,'$28.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/ODODOS-Lightweight-Rib-Knit-Camisole-Taupe/dp/B0B3M6K9JJ/ref=sr_1_40?keywords=women%27s+clothing&qid=1703020384&sr=8-40',47,'2023-12-19 15:13:06.221603-06','2023-12-19 15:13:06.221603-06','www.amazon.com'), + (3674,'Hanes',NULL,'B0169P8PBK','https://m.media-amazon.com/images/I/71slb+CkbuL._AC_UL320_.jpg',65320,3.9,'$12.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Hanes-Womens-Middle-Sweatpant-Heather/dp/B0169P8PBK/ref=sr_1_41?keywords=women%27s+clothing&qid=1703020384&sr=8-41',47,'2023-12-19 15:13:06.227964-06','2023-12-19 15:13:06.227964-06','www.amazon.com'), + (3675,'Roxy',NULL,'B0BMWDBBB7','https://m.media-amazon.com/images/I/612VGyYVGKL._AC_UL320_.jpg',294,4.4,'$9.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Roxy-Womens-3-Pack-Tonal-Heather/dp/B0BMWDBBB7/ref=sr_1_42?keywords=women%27s+clothing&qid=1703020384&sr=8-42',47,'2023-12-19 15:13:06.234775-06','2023-12-19 15:13:06.234775-06','www.amazon.com'), + (3676,'Amazon Essentials',NULL,'B07QF68HG2','https://m.media-amazon.com/images/I/91aDiyJr4tS._AC_UL320_.jpg',19597,4.4,'$28.60','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Amazon-Essentials-Standard-Lightweight-Crewneck/dp/B07QF68HG2/ref=sr_1_43?keywords=women%27s+clothing&qid=1703020384&sr=8-43',47,'2023-12-19 15:13:06.241967-06','2023-12-19 15:13:06.241967-06','www.amazon.com'), + (3677,'ZAFUL',NULL,'B098XK6DLM','https://m.media-amazon.com/images/I/71UzN3SnA7S._AC_UL320_.jpg',750,4.0,'$29.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/ZAFUL-Knitwear-Bohemian-Pullover-Shoulder/dp/B098XK6DLM/ref=sr_1_44?keywords=women%27s+clothing&qid=1703020384&sr=8-44',47,'2023-12-19 15:13:06.249064-06','2023-12-19 15:13:06.249064-06','www.amazon.com'), + (3678,'AUTOMET',NULL,'B0C7KC3Z9D','https://m.media-amazon.com/images/I/61hDQfyQtrL._AC_UL320_.jpg',1094,4.5,'$38.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/AUTOMET-Sweatshirts-Pullover-Oversized-Sweaters/dp/B0C7KC3Z9D/ref=sr_1_45?keywords=women%27s+clothing&qid=1703020384&sr=8-45',47,'2023-12-19 15:13:06.25645-06','2023-12-19 15:13:06.25645-06','www.amazon.com'), + (3679,'Dockers',NULL,'B09YCRG1BD','https://m.media-amazon.com/images/I/51-WLcWtz7L._AC_UL320_.jpg',30,4.4,'$4.11','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Dockers-Womens-Beautiful-Black-Medium/dp/B09YCRG1BD/ref=sr_1_46?keywords=women%27s+clothing&qid=1703020384&sr=8-46',47,'2023-12-19 15:13:06.264632-06','2023-12-19 15:13:06.264632-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3680,'Hanes',NULL,'B0170AD284','https://m.media-amazon.com/images/I/81GZlWz-bIL._AC_UL320_.jpg',11987,4.2,'$14.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Hanes-Womens-French-Charcoal-Heather/dp/B0170AD284/ref=sr_1_47?keywords=women%27s+clothing&qid=1703020384&sr=8-47',47,'2023-12-19 15:13:06.272557-06','2023-12-19 15:13:06.272557-06','www.amazon.com'), + (3681,'AUROLA',NULL,'B0B7GCP25D','https://m.media-amazon.com/images/I/61if9N2mdfL._AC_UL320_.jpg',4734,4.4,'$32.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/AUROLA-Collection-Workout-Shorts-Women/dp/B0B7GCP25D/ref=sr_1_48?keywords=women%27s+clothing&qid=1703020384&sr=8-48',47,'2023-12-19 15:13:06.280799-06','2023-12-19 15:13:06.280799-06','www.amazon.com'), + (4567,'SPECIAL MADE Collapsible Water Bottles Cups Leakproof Valve Reusable BPA Free Silicone Foldable Travel Water Bottle Cup for Gym Camping Hiking Travel Sports Lightweight Durable',NULL,'B08QJ53Y5G','https://m.media-amazon.com/images/I/51EUDKOg1qS._AC_UL320_.jpg',7765,4.1,'$7.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/SPECIAL-MADE-Collapsible-Leakproof-Lightweight/dp/B08QJ53Y5G/ref=sr_1_65?keywords=travel+accessories&qid=1703020686&sr=8-65',57,'2023-12-19 15:18:07.953211-06','2023-12-19 15:18:07.953211-06','www.amazon.com'), + (3683,'Ovanviso',NULL,'B09MJV8MLV','https://m.media-amazon.com/images/I/61sbg+nwfLL._AC_UL320_.jpg',651,4.3,'$25.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo2Njg1MTczMDYwMjk5NzE3OjE3MDMwMjAzODQ6c3Bfc2VhcmNoX3RoZW1hdGljX2J0ZjoyMDAwNjYyNjk2NDU1OTg6OjA6Og&url=%2FOvanviso-Sweatshirt-Crewneck-Pullover-Lightweight%2Fdp%2FB09MJV8MLV%2Fref%3Dsxbs_pa_sp_search_thematic_btf_sspa%3Fcontent-id%3Damzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%253Aamzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%26cv_ct_cx%3Dwomen%2527s%2Bclothing%26keywords%3Dwomen%2527s%2Bclothing%26pd_rd_i%3DB09MJV8MLV%26pd_rd_r%3D1a4e0cdd-725b-4703-b68f-7afa0223949d%26pd_rd_w%3Dc0y9E%26pd_rd_wg%3DZDlhD%26pf_rd_p%3Dc950d26b-f218-41e6-a496-534825ce2131%26pf_rd_r%3DJR3DAAPTHKG1YTW8QGKZ%26qid%3D1703020384%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-1-50a2b317-b617-44c1-b7a6-daec194a2368-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWNfYnRm%26psc%3D1',47,'2023-12-19 15:13:06.297763-06','2023-12-19 15:13:06.297763-06','www.amazon.com'), + (3684,'G Gradual',NULL,'B09ZV32BMQ','https://m.media-amazon.com/images/I/71OXp1ea4uL._AC_UL320_.jpg',328,4.2,'$29.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo2Njg1MTczMDYwMjk5NzE3OjE3MDMwMjAzODQ6c3Bfc2VhcmNoX3RoZW1hdGljX2J0ZjoyMDAxNjA1NzM2MzY0OTg6OjE6Og&url=%2FGradual-Womens-Skorts-White-Small%2Fdp%2FB09ZV32BMQ%2Fref%3Dsxbs_pa_sp_search_thematic_btf_sspa%3Fcontent-id%3Damzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%253Aamzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%26cv_ct_cx%3Dwomen%2527s%2Bclothing%26keywords%3Dwomen%2527s%2Bclothing%26pd_rd_i%3DB09ZV32BMQ%26pd_rd_r%3D1a4e0cdd-725b-4703-b68f-7afa0223949d%26pd_rd_w%3Dc0y9E%26pd_rd_wg%3DZDlhD%26pf_rd_p%3Dc950d26b-f218-41e6-a496-534825ce2131%26pf_rd_r%3DJR3DAAPTHKG1YTW8QGKZ%26qid%3D1703020384%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-2-50a2b317-b617-44c1-b7a6-daec194a2368-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWNfYnRm%26psc%3D1',47,'2023-12-19 15:13:06.306496-06','2023-12-19 15:13:06.306496-06','www.amazon.com'), + (3685,'LuckyMore',NULL,'B0C8SHL68Q','https://m.media-amazon.com/images/I/71ESOHBk2YL._AC_UL320_.jpg',69,4.2,'$25.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo2Njg1MTczMDYwMjk5NzE3OjE3MDMwMjAzODQ6c3Bfc2VhcmNoX3RoZW1hdGljX2J0ZjozMDAxMDYxNTA2OTg0MDI6OjI6Og&url=%2FLuckyMore-Womens-Lightweight-Underwear-Apricot%2Fdp%2FB0C8SHL68Q%2Fref%3Dsxbs_pa_sp_search_thematic_btf_sspa%3Fcontent-id%3Damzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%253Aamzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%26cv_ct_cx%3Dwomen%2527s%2Bclothing%26keywords%3Dwomen%2527s%2Bclothing%26pd_rd_i%3DB0C8SHL68Q%26pd_rd_r%3D1a4e0cdd-725b-4703-b68f-7afa0223949d%26pd_rd_w%3Dc0y9E%26pd_rd_wg%3DZDlhD%26pf_rd_p%3Dc950d26b-f218-41e6-a496-534825ce2131%26pf_rd_r%3DJR3DAAPTHKG1YTW8QGKZ%26qid%3D1703020384%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-3-50a2b317-b617-44c1-b7a6-daec194a2368-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWNfYnRm%26psc%3D1',47,'2023-12-19 15:13:06.314986-06','2023-12-19 15:13:06.314986-06','www.amazon.com'), + (3686,'ANRABESS',NULL,'B0C69DCX7J','https://m.media-amazon.com/images/I/61jxmL7ny9L._MCnd_AC_UL320_.jpg',443,4.2,'$26.39','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo2Njg1MTczMDYwMjk5NzE3OjE3MDMwMjAzODQ6c3Bfc2VhcmNoX3RoZW1hdGljX2J0ZjozMDAwOTg5OTUxNTQ3MDI6OjM6Og&url=%2FANRABESS-Athletic-Exercise-Everyday-1125qianka-M%2Fdp%2FB0C69DCX7J%2Fref%3Dsxbs_pa_sp_search_thematic_btf_sspa%3Fcontent-id%3Damzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%253Aamzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%26cv_ct_cx%3Dwomen%2527s%2Bclothing%26keywords%3Dwomen%2527s%2Bclothing%26pd_rd_i%3DB0C69DCX7J%26pd_rd_r%3D1a4e0cdd-725b-4703-b68f-7afa0223949d%26pd_rd_w%3Dc0y9E%26pd_rd_wg%3DZDlhD%26pf_rd_p%3Dc950d26b-f218-41e6-a496-534825ce2131%26pf_rd_r%3DJR3DAAPTHKG1YTW8QGKZ%26qid%3D1703020384%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-4-50a2b317-b617-44c1-b7a6-daec194a2368-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWNfYnRm%26psc%3D1',47,'2023-12-19 15:13:06.32318-06','2023-12-19 15:13:06.32318-06','www.amazon.com'), + (3682,'DSPSAM',NULL,'B0CGVSGYGL','https://m.media-amazon.com/images/I/71rh7CA214L._AC_UL320_.jpg',142,4.3,'$13.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo2Njg1MTczMDYwMjk5NzE3OjE3MDMwMjAzODQ6c3Bfc2VhcmNoX3RoZW1hdGljX2J0ZjozMDAwODAyNjc0OTg1MDI6OjQ6Og&url=%2FDSPSAM-Turtle-Academia-Clothing-Turtleneck%2Fdp%2FB0CGVSGYGL%2Fref%3Dsxbs_pa_sp_search_thematic_btf_sspa%3Fcontent-id%3Damzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%253Aamzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%26cv_ct_cx%3Dwomen%2527s%2Bclothing%26keywords%3Dwomen%2527s%2Bclothing%26pd_rd_i%3DB0CGVSGYGL%26pd_rd_r%3D1a4e0cdd-725b-4703-b68f-7afa0223949d%26pd_rd_w%3Dc0y9E%26pd_rd_wg%3DZDlhD%26pf_rd_p%3Dc950d26b-f218-41e6-a496-534825ce2131%26pf_rd_r%3DJR3DAAPTHKG1YTW8QGKZ%26qid%3D1703020384%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-5-50a2b317-b617-44c1-b7a6-daec194a2368-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWNfYnRm%26psc%3D1',47,'2023-12-19 15:13:06.289517-06','2023-12-19 15:13:06.330435-06','www.amazon.com'), + (3687,'MAYAMANG',NULL,'B08JYMLP47','https://m.media-amazon.com/images/I/71LZZEYdJ2L._AC_UL320_.jpg',4259,4.0,'$24.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxODMxMzU0Nzg5MzEwNzE3OjE3MDMwMjAzOTI6c3BfYXRmX25leHQ6MjAwMTA5NTA4NzYwMTk4OjowOjo&url=%2FMAYAMANG-Womens-Buttons-T-Shirts-sleeve-white%2Fdp%2FB08JYMLP47%2Fref%3Dsr_1_49_sspa%3Fkeywords%3Dwomen%2527s%2Bclothing%26qid%3D1703020392%26sr%3D8-49-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGZfbmV4dA%26psc%3D1',47,'2023-12-19 15:13:13.564576-06','2023-12-19 15:13:13.564576-06','www.amazon.com'), + (3688,'Ficerd',NULL,'B0CC96Z47F','https://m.media-amazon.com/images/I/91mEbAinWTL._AC_UL320_.jpg',708,4.5,'$25.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxODMxMzU0Nzg5MzEwNzE3OjE3MDMwMjAzOTI6c3BfYXRmX25leHQ6MzAwMTAyNDI2ODU2NDAyOjowOjo&url=%2FFicerd-Womens-Pleated-Blouses-T-Shirts%2Fdp%2FB0CC96Z47F%2Fref%3Dsr_1_50_sspa%3Fkeywords%3Dwomen%2527s%2Bclothing%26qid%3D1703020392%26sr%3D8-50-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGZfbmV4dA%26psc%3D1',47,'2023-12-19 15:13:13.584572-06','2023-12-19 15:13:13.584572-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3689,'Lotusmile',NULL,'B09BZBWZRZ','https://m.media-amazon.com/images/I/61KwE3X3NfL._AC_UL320_.jpg',2126,4.4,'$31.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxODMxMzU0Nzg5MzEwNzE3OjE3MDMwMjAzOTI6c3BfYXRmX25leHQ6MzAwMDUyNDk5NDY3OTAyOjowOjo&url=%2FSweaters-Leggings-Lotusmile-Pullover-Clothes%2Fdp%2FB09BZBWZRZ%2Fref%3Dsr_1_51_sspa%3Fkeywords%3Dwomen%2527s%2Bclothing%26qid%3D1703020392%26sr%3D8-51-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGZfbmV4dA%26psc%3D1',47,'2023-12-19 15:13:13.593454-06','2023-12-19 15:13:13.593454-06','www.amazon.com'), + (3690,'Kancystore',NULL,'B0991XC8W6','https://m.media-amazon.com/images/I/71VB8ApcQpL._AC_UL320_.jpg',3226,4.2,'$24.85','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxODMxMzU0Nzg5MzEwNzE3OjE3MDMwMjAzOTI6c3BfYXRmX25leHQ6MjAwMDI0MDIyODMyNDk4OjowOjo&url=%2FKancystore-Womens-Ribbed-Sweaters-Blouses%2Fdp%2FB0991XC8W6%2Fref%3Dsr_1_52_sspa%3Fkeywords%3Dwomen%2527s%2Bclothing%26qid%3D1703020392%26sr%3D8-52-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGZfbmV4dA%26psc%3D1',47,'2023-12-19 15:13:13.6005-06','2023-12-19 15:13:13.6005-06','www.amazon.com'), + (3691,'Dokotoo',NULL,'B099J6JVM1','https://m.media-amazon.com/images/I/51oZ6Di38QL._AC_UL320_.jpg',3287,4.4,'$39.88','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Dokotoo-Fashion-Sweatshirts-Drawstring-Pullovers/dp/B099J6JVM1/ref=sr_1_53?keywords=women%27s+clothing&qid=1703020392&sr=8-53',47,'2023-12-19 15:13:13.607975-06','2023-12-19 15:13:13.607975-06','www.amazon.com'), + (3692,'AUTOMET',NULL,'B0CBDGZ9WV','https://m.media-amazon.com/images/I/51Cah0oW-iL._AC_UL320_.jpg',221,4.1,'$50.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/AUTOMET-Thanksgiving-Sweatsuits-Sweatshirts-Sweatpants/dp/B0CBDGZ9WV/ref=sr_1_54?keywords=women%27s+clothing&qid=1703020392&sr=8-54',47,'2023-12-19 15:13:13.616879-06','2023-12-19 15:13:13.616879-06','www.amazon.com'), + (3693,'OQQ',NULL,'B0BR5JKBR4','https://m.media-amazon.com/images/I/81miroNz5XL._AC_UL320_.jpg',5527,4.3,'$31.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/OQQ-Womens-Seamless-Workout-Exercise/dp/B0BR5JKBR4/ref=sr_1_55?keywords=women%27s+clothing&qid=1703020392&sr=8-55',47,'2023-12-19 15:13:13.624576-06','2023-12-19 15:13:13.624576-06','www.amazon.com'), + (4568,'Longang 110 Lbs Digital Hanging Luggage Scale with Backlit for Travel, Rubber Paint Handle and Battery Included (Gold, 1 Pc)',NULL,'B0BX4CZMP4','https://m.media-amazon.com/images/I/610izMpd8ZL._AC_UL320_.jpg',5751,4.7,'$7.19','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Longang-Digital-Hanging-Included-Gold/dp/B0BX4CZMP4/ref=sr_1_66?keywords=travel+accessories&qid=1703020686&sr=8-66',57,'2023-12-19 15:18:07.958869-06','2023-12-19 15:18:07.958869-06','www.amazon.com'), + (3723,'YESNO',NULL,'B07Z1YVCP4','https://m.media-amazon.com/images/I/71KBWxoKKfL._AC_UL320_.jpg',13791,4.5,'$44.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/YESNO-Sweaters-Knitted-Pullover-Printed/dp/B07Z1YVCP4/ref=sr_1_80?keywords=women%27s+clothing&qid=1703020392&sr=8-80',47,'2023-12-19 15:13:13.850625-06','2023-12-19 15:13:13.850625-06','www.amazon.com'), + (3695,'Vldnery',NULL,'B0BD7KG9MP','https://m.media-amazon.com/images/I/811RV48Ox6L._AC_UL320_.jpg',751,4.2,'$28.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozMTkxMDkxMDYzNDQyNzE3OjE3MDMwMjAzOTI6c3Bfc2VhcmNoX3RoZW1hdGljOjMwMDA1NTI5Mjc3NDgwMjo6MDo6&url=%2FVldnery-Moisture-Wicking-Workout-YogaTops%2Fdp%2FB0BD7KG9MP%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%253Aamzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%26cv_ct_cx%3Dwomen%2527s%2Bclothing%26keywords%3Dwomen%2527s%2Bclothing%26pd_rd_i%3DB0BD7KG9MP%26pd_rd_r%3Da384ddd6-6c41-4d1c-9add-a416c284aba8%26pd_rd_w%3DgxKCt%26pd_rd_wg%3DT4ydM%26pf_rd_p%3D0c4cbb48-e433-4698-bba6-b3a5297e3e20%26pf_rd_r%3D16TG4SMFWXF632KBRZJ9%26qid%3D1703020392%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-49-f853d353-bf33-45e7-b5c2-2cb2b31abc9b-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',47,'2023-12-19 15:13:13.639439-06','2023-12-19 15:13:13.639439-06','www.amazon.com'), + (3696,'Vldnery',NULL,'B099PCH25S','https://m.media-amazon.com/images/I/81-Fk2L21ZL._AC_UL320_.jpg',327,4.2,'$25.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozMTkxMDkxMDYzNDQyNzE3OjE3MDMwMjAzOTI6c3Bfc2VhcmNoX3RoZW1hdGljOjIwMDExMzg5NTIyNDg5ODo6MTo6&url=%2FWorkout-Exercise-Clothes-Clothing-Moisture%2Fdp%2FB099PCH25S%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%253Aamzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%26cv_ct_cx%3Dwomen%2527s%2Bclothing%26keywords%3Dwomen%2527s%2Bclothing%26pd_rd_i%3DB099PCH25S%26pd_rd_r%3Da384ddd6-6c41-4d1c-9add-a416c284aba8%26pd_rd_w%3DgxKCt%26pd_rd_wg%3DT4ydM%26pf_rd_p%3D0c4cbb48-e433-4698-bba6-b3a5297e3e20%26pf_rd_r%3D16TG4SMFWXF632KBRZJ9%26qid%3D1703020392%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-50-f853d353-bf33-45e7-b5c2-2cb2b31abc9b-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',47,'2023-12-19 15:13:13.646305-06','2023-12-19 15:13:13.646305-06','www.amazon.com'), + (3697,'Soneven',NULL,'B0BBRJK7WZ','https://m.media-amazon.com/images/I/81vgfHlwOdL._AC_UL320_.jpg',463,4.5,'$26.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozMTkxMDkxMDYzNDQyNzE3OjE3MDMwMjAzOTI6c3Bfc2VhcmNoX3RoZW1hdGljOjMwMDA2Njg0MDg5MTUwMjo6Mjo6&url=%2FThermal-Shirts-Sleeve-Winter-Undershirt%2Fdp%2FB0BBRJK7WZ%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%253Aamzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%26cv_ct_cx%3Dwomen%2527s%2Bclothing%26keywords%3Dwomen%2527s%2Bclothing%26pd_rd_i%3DB0BBRJK7WZ%26pd_rd_r%3Da384ddd6-6c41-4d1c-9add-a416c284aba8%26pd_rd_w%3DgxKCt%26pd_rd_wg%3DT4ydM%26pf_rd_p%3D0c4cbb48-e433-4698-bba6-b3a5297e3e20%26pf_rd_r%3D16TG4SMFWXF632KBRZJ9%26qid%3D1703020392%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-51-f853d353-bf33-45e7-b5c2-2cb2b31abc9b-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',47,'2023-12-19 15:13:13.653115-06','2023-12-19 15:13:13.653115-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3698,'Soneven',NULL,'B09P7XV9NZ','https://m.media-amazon.com/images/I/71wxuETW3AL._AC_UL320_.jpg',716,4.3,'$28.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozMTkxMDkxMDYzNDQyNzE3OjE3MDMwMjAzOTI6c3Bfc2VhcmNoX3RoZW1hdGljOjMwMDA3NDk1NTM0NDIwMjo6Mzo6&url=%2FWomens-Shirts-Moisture-Wicking-Apparel%2Fdp%2FB09P7XV9NZ%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%253Aamzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%26cv_ct_cx%3Dwomen%2527s%2Bclothing%26keywords%3Dwomen%2527s%2Bclothing%26pd_rd_i%3DB09P7XV9NZ%26pd_rd_r%3Da384ddd6-6c41-4d1c-9add-a416c284aba8%26pd_rd_w%3DgxKCt%26pd_rd_wg%3DT4ydM%26pf_rd_p%3D0c4cbb48-e433-4698-bba6-b3a5297e3e20%26pf_rd_r%3D16TG4SMFWXF632KBRZJ9%26qid%3D1703020392%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-52-f853d353-bf33-45e7-b5c2-2cb2b31abc9b-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',47,'2023-12-19 15:13:13.66012-06','2023-12-19 15:13:13.66012-06','www.amazon.com'), + (3694,'Aloodor',NULL,'B099JHWQC1','https://m.media-amazon.com/images/I/61wbeA7LG2L._AC_UL320_.jpg',6335,4.3,'$38.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozMTkxMDkxMDYzNDQyNzE3OjE3MDMwMjAzOTI6c3Bfc2VhcmNoX3RoZW1hdGljOjIwMDA4OTEzNDU5NjU2MTo6NDo6&url=%2FLounge-Sweatsuits-Casual-Loungewear-Clothing%2Fdp%2FB099JHWQC1%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%253Aamzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%26cv_ct_cx%3Dwomen%2527s%2Bclothing%26keywords%3Dwomen%2527s%2Bclothing%26pd_rd_i%3DB099JHWQC1%26pd_rd_r%3Da384ddd6-6c41-4d1c-9add-a416c284aba8%26pd_rd_w%3DgxKCt%26pd_rd_wg%3DT4ydM%26pf_rd_p%3D0c4cbb48-e433-4698-bba6-b3a5297e3e20%26pf_rd_r%3D16TG4SMFWXF632KBRZJ9%26qid%3D1703020392%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-53-f853d353-bf33-45e7-b5c2-2cb2b31abc9b-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',47,'2023-12-19 15:13:13.632187-06','2023-12-19 15:13:13.666096-06','www.amazon.com'), + (3699,'Trendy Queen',NULL,'B0B5H33HTJ','https://m.media-amazon.com/images/I/81O6ERy19CL._AC_UL320_.jpg',6141,4.4,'$36.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Trendy-Queen-Oversized-Pullover-Sweatshirts/dp/B0B5H33HTJ/ref=sr_1_56?keywords=women%27s+clothing&qid=1703020392&sr=8-56',47,'2023-12-19 15:13:13.674101-06','2023-12-19 15:13:13.674101-06','www.amazon.com'), + (3700,'MixShe',NULL,'B09C89F9LN','https://m.media-amazon.com/images/I/71-u82AOLmL._AC_UL320_.jpg',4446,4.5,'$24.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Sweatshirts-Lightweight-Sweaters-Sudaderas-Playeras/dp/B09C89F9LN/ref=sr_1_57?keywords=women%27s+clothing&qid=1703020392&sr=8-57',47,'2023-12-19 15:13:13.680402-06','2023-12-19 15:13:13.680402-06','www.amazon.com'), + (3701,'LILLUSORY',NULL,'B0BFL2XLY5','https://m.media-amazon.com/images/I/61CvT1de7IL._AC_UL320_.jpg',1682,4.4,'$48.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/LILLUSORY-Crewneck-Batwing-Oversized-Pullover/dp/B0BFL2XLY5/ref=sr_1_58?keywords=women%27s+clothing&qid=1703020392&sr=8-58',47,'2023-12-19 15:13:13.688619-06','2023-12-19 15:13:13.688619-06','www.amazon.com'), + (3702,'Bluetime',NULL,'B09HH7NLFX','https://m.media-amazon.com/images/I/71FeqQ717ZL._AC_UL320_.jpg',3889,4.3,'$29.85','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxODMxMzU0Nzg5MzEwNzE3OjE3MDMwMjAzOTI6c3BfbXRmOjMwMDA3MDU1NzkzNTMwMjo6MDo6&url=%2FWomens-Sleeve-Business-Casual-Clothes%2Fdp%2FB09HH7NLFX%2Fref%3Dsr_1_59_sspa%3Fkeywords%3Dwomen%2527s%2Bclothing%26qid%3D1703020392%26sr%3D8-59-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',47,'2023-12-19 15:13:13.696297-06','2023-12-19 15:13:13.696297-06','www.amazon.com'), + (3703,'CHICGAL',NULL,'B09KNVP72Z','https://m.media-amazon.com/images/I/81cjonvNR8L._AC_UL320_.jpg',61474,4.4,'$15.19','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxODMxMzU0Nzg5MzEwNzE3OjE3MDMwMjAzOTI6c3BfbXRmOjIwMDAzMjczMTQ2MzM5ODo6MDo6&url=%2FKimono-Cardigan-Coverup-Chiffon-WhiteXL%2Fdp%2FB09KNVP72Z%2Fref%3Dsr_1_60_sspa%3Fkeywords%3Dwomen%2527s%2Bclothing%26qid%3D1703020392%26sr%3D8-60-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',47,'2023-12-19 15:13:13.704298-06','2023-12-19 15:13:13.704298-06','www.amazon.com'), + (3704,'Halife',NULL,'B08DCH43FM','https://m.media-amazon.com/images/I/61M2JcSni3L._AC_UL320_.jpg',4040,4.4,'$25.88','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxODMxMzU0Nzg5MzEwNzE3OjE3MDMwMjAzOTI6c3BfbXRmOjIwMDA3NTE2Nzg2Mzk3MTo6MDo6&url=%2FColor-Sleeve-Shirts-Leggings-Cotton%2Fdp%2FB08DCH43FM%2Fref%3Dsr_1_61_sspa%3Fkeywords%3Dwomen%2527s%2Bclothing%26qid%3D1703020392%26sr%3D8-61-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',47,'2023-12-19 15:13:13.710863-06','2023-12-19 15:13:13.710863-06','www.amazon.com'), + (3705,'EVALESS',NULL,'B0C9DQNKVP','https://m.media-amazon.com/images/I/61P3PrQXtPL._AC_UL320_.jpg',54,4.3,'$25.19','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxODMxMzU0Nzg5MzEwNzE3OjE3MDMwMjAzOTI6c3BfbXRmOjMwMDA2OTQ4OTM2NDcwMjo6MDo6&url=%2FEVALESS-Lantern-Sweaters-Lightweight-Pullover%2Fdp%2FB0C9DQNKVP%2Fref%3Dsr_1_62_sspa%3Fkeywords%3Dwomen%2527s%2Bclothing%26qid%3D1703020392%26sr%3D8-62-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',47,'2023-12-19 15:13:13.720501-06','2023-12-19 15:13:13.720501-06','www.amazon.com'), + (3706,'Limerose',NULL,'B08TBHXNT5','https://m.media-amazon.com/images/I/71OiTUtElUL._AC_UL320_.jpg',3430,4.2,'$23.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Limerose-Womens-Sleeve-Button-X-Large/dp/B08TBHXNT5/ref=sr_1_63?keywords=women%27s+clothing&qid=1703020392&sr=8-63',47,'2023-12-19 15:13:13.727531-06','2023-12-19 15:13:13.727531-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3707,'Amazon Essentials',NULL,'B07XLLKJPJ','https://m.media-amazon.com/images/I/81gCrqutl3L._AC_UL320_.jpg',3251,4.1,'$17.10','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Amazon-Essentials-Classic-Fit-Long-Sleeve-Crewneck/dp/B07XLLKJPJ/ref=sr_1_64?keywords=women%27s+clothing&qid=1703020392&sr=8-64',47,'2023-12-19 15:13:13.73466-06','2023-12-19 15:13:13.73466-06','www.amazon.com'), + (3708,'Jockey',NULL,'B0C6DLDGB2','https://m.media-amazon.com/images/I/71V82yLoypL._AC_UL320_.jpg',29,4.6,'$3.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Jockey-Womens-Activewear-Tank-Rose/dp/B0C6DLDGB2/ref=sr_1_65?keywords=women%27s+clothing&qid=1703020392&sr=8-65',47,'2023-12-19 15:13:13.743573-06','2023-12-19 15:13:13.743573-06','www.amazon.com'), + (3709,'AUTOMET',NULL,'B0CCDXT9Y9','https://m.media-amazon.com/images/I/71SsIFvL0kL._AC_UL320_.jpg',112,4.1,'$33.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/AUTOMET-Shacket-Clothes-Fashion-Oversized/dp/B0CCDXT9Y9/ref=sr_1_66?keywords=women%27s+clothing&qid=1703020392&sr=8-66',47,'2023-12-19 15:13:13.749729-06','2023-12-19 15:13:13.749729-06','www.amazon.com'), + (3710,'Mystry Zone',NULL,'B09CMDWZ13','https://m.media-amazon.com/images/I/71Xi2wm-nVL._AC_UL320_.jpg',12330,4.3,'$19.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxODMxMzU0Nzg5MzEwNzE3OjE3MDMwMjAzOTI6c3BfbXRmOjMwMDA0MzIxMjc0MTEwMjo6MDo6&url=%2FWomen-Vintage-Floral-Sleeve-Clothing%2Fdp%2FB09CMDWZ13%2Fref%3Dsr_1_67_sspa%3Fkeywords%3Dwomen%2527s%2Bclothing%26qid%3D1703020392%26sr%3D8-67-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1%26smid%3DA3OS1FJCMX3WDK',47,'2023-12-19 15:13:13.756553-06','2023-12-19 15:13:13.756553-06','www.amazon.com'), + (3711,'BETTE BOUTIK',NULL,'B0BYDNVGM2','https://m.media-amazon.com/images/I/71PVxtxo0cL._AC_UL320_.jpg',1066,4.4,'$26.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxODMxMzU0Nzg5MzEwNzE3OjE3MDMwMjAzOTI6c3BfbXRmOjIwMDE1NjIyNzA5NzA5ODo6MDo6&url=%2FWomens-Blouse-Shirts-WRCosmos-Medium%2Fdp%2FB0BYDNVGM2%2Fref%3Dsr_1_68_sspa%3Fkeywords%3Dwomen%2527s%2Bclothing%26qid%3D1703020392%26sr%3D8-68-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',47,'2023-12-19 15:13:13.763208-06','2023-12-19 15:13:13.763208-06','www.amazon.com'), + (3712,'BeadChica',NULL,'B0C7QJNMP5','https://m.media-amazon.com/images/I/611K3tKNaaL._AC_UL320_.jpg',281,3.9,'$23.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxODMxMzU0Nzg5MzEwNzE3OjE3MDMwMjAzOTI6c3BfbXRmOjMwMDA1OTIwMTk5MTAwMjo6MDo6&url=%2FBeadChica-Womens-Sweatshirt-Pullover-Fit-Gradient-L%2Fdp%2FB0C7QJNMP5%2Fref%3Dsr_1_69_sspa%3Fkeywords%3Dwomen%2527s%2Bclothing%26qid%3D1703020392%26sr%3D8-69-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',47,'2023-12-19 15:13:13.770675-06','2023-12-19 15:13:13.770675-06','www.amazon.com'), + (3713,'Bluetime',NULL,'B0BCD5SCRX','https://m.media-amazon.com/images/I/719VsEyJIgL._AC_UL320_.jpg',679,4.3,'$29.85','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxODMxMzU0Nzg5MzEwNzE3OjE3MDMwMjAzOTI6c3BfbXRmOjMwMDAyNTQ2NzY1NTMwMjo6MDo6&url=%2FWomens-Outfits-Juniors-Clothing-Caramel%2Fdp%2FB0BCD5SCRX%2Fref%3Dsr_1_70_sspa%3Fkeywords%3Dwomen%2527s%2Bclothing%26qid%3D1703020392%26sr%3D8-70-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',47,'2023-12-19 15:13:13.777315-06','2023-12-19 15:13:13.777315-06','www.amazon.com'), + (3714,'Amazon Essentials',NULL,'B07RMMHMRY','https://m.media-amazon.com/images/I/815C+WHOQhL._AC_UL320_.jpg',17858,4.2,'$27.60','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Amazon-Essentials-Womens-Jegging-Regular/dp/B07RMMHMRY/ref=sr_1_71?keywords=women%27s+clothing&qid=1703020392&sr=8-71',47,'2023-12-19 15:13:13.783596-06','2023-12-19 15:13:13.783596-06','www.amazon.com'), + (3715,'Newshows',NULL,'B08DHCFCYP','https://m.media-amazon.com/images/I/61poqbMYtkL._AC_UL320_.jpg',3340,4.5,'$32.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Newshows-Womens-Stretch-Pullover-Sweater/dp/B08DHCFCYP/ref=sr_1_72?keywords=women%27s+clothing&qid=1703020392&sr=8-72',47,'2023-12-19 15:13:13.790702-06','2023-12-19 15:13:13.790702-06','www.amazon.com'), + (3716,'Trendy Queen',NULL,'B0BGM47VD7','https://m.media-amazon.com/images/I/71nSvRRNe0L._AC_UL320_.jpg',231,3.9,'$28.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Trendy-Queen-Crochet-Clothes-Fashion/dp/B0BGM47VD7/ref=sr_1_73?keywords=women%27s+clothing&qid=1703020392&sr=8-73',47,'2023-12-19 15:13:13.796691-06','2023-12-19 15:13:13.796691-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3717,'MANGOPOP',NULL,'B07VQVKXCM','https://m.media-amazon.com/images/I/61h2b+725SL._AC_UL320_.jpg',9979,4.3,'$26.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/MANGOPOP-Bodysuits-Women-Sleeve-Square/dp/B07VQVKXCM/ref=sr_1_74?keywords=women%27s+clothing&qid=1703020392&sr=8-74',47,'2023-12-19 15:13:13.804451-06','2023-12-19 15:13:13.804451-06','www.amazon.com'), + (3718,'Trendy Queen',NULL,'B0C65QBS2B','https://m.media-amazon.com/images/I/61vTPJCGCjL._AC_UL320_.jpg',1396,4.6,'$36.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Trendy-Queen-Oversized-Sweatshirts-Sweaters/dp/B0C65QBS2B/ref=sr_1_75?keywords=women%27s+clothing&qid=1703020392&sr=8-75',47,'2023-12-19 15:13:13.81355-06','2023-12-19 15:13:13.81355-06','www.amazon.com'), + (3719,'ANRABESS',NULL,'B0BCPJH5LW','https://m.media-amazon.com/images/I/81TmhuoMY+L._AC_UL320_.jpg',2237,4.5,'$39.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/ANRABESS-Cardigan-Sweater-715kaqi-L-Apricot/dp/B0BCPJH5LW/ref=sr_1_76?keywords=women%27s+clothing&qid=1703020392&sr=8-76',47,'2023-12-19 15:13:13.822248-06','2023-12-19 15:13:13.822248-06','www.amazon.com'), + (3720,'WDIRARA',NULL,'B07LC6K21T','https://m.media-amazon.com/images/I/71koXSiH7IL._AC_UL320_.jpg',8452,4.1,'$27.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/WDIRARA-Stretchy-Regular-Fashion-Leggings/dp/B07LC6K21T/ref=sr_1_77?keywords=women%27s+clothing&qid=1703020392&sr=8-77',47,'2023-12-19 15:13:13.82848-06','2023-12-19 15:13:13.82848-06','www.amazon.com'), + (3721,'SHAPERX',NULL,'B0B1LVKJ4Q','https://m.media-amazon.com/images/I/71EPHz3fArL._AC_UL320_.jpg',26928,4.1,'$35.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/SHAPERX-Shapewear-Sculpting-SZ5215-Black-XXS-XS/dp/B0B1LVKJ4Q/ref=sr_1_78?keywords=women%27s+clothing&qid=1703020392&sr=8-78',47,'2023-12-19 15:13:13.836912-06','2023-12-19 15:13:13.836912-06','www.amazon.com'), + (3722,'Amazon Essentials',NULL,'B07R763XGR','https://m.media-amazon.com/images/I/91uhfZPLaCL._AC_UL320_.jpg',13754,4.3,'$20.70','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Amazon-Essentials-Womens-Crewneck-Sweatshirt/dp/B07R763XGR/ref=sr_1_79?keywords=women%27s+clothing&qid=1703020392&sr=8-79',47,'2023-12-19 15:13:13.843773-06','2023-12-19 15:13:13.843773-06','www.amazon.com'), + (3725,'BALEAF',NULL,'B07WYDKY2Z','https://m.media-amazon.com/images/I/51SIUwwT6wL._AC_UL320_.jpg',29895,4.4,'$34.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/BALEAF-Leggings-Thermal-Waisted-Pocketed/dp/B07WYDKY2Z/ref=sr_1_82?keywords=women%27s+clothing&qid=1703020392&sr=8-82',47,'2023-12-19 15:13:13.865138-06','2023-12-19 15:13:13.865138-06','www.amazon.com'), + (3726,'Trendy Queen',NULL,'B0B63YDB9F','https://m.media-amazon.com/images/I/61MQqc51uOL._AC_UL320_.jpg',3114,4.4,'$34.97','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Womens-Corduroy-Shacket-Shackets-Outfits/dp/B0B63YDB9F/ref=sr_1_83?keywords=women%27s+clothing&qid=1703020392&sr=8-83',47,'2023-12-19 15:13:13.872212-06','2023-12-19 15:13:13.872212-06','www.amazon.com'), + (3727,'Warner''s',NULL,'B0948V78CW','https://m.media-amazon.com/images/I/71FK7qTJtpL._AC_UL320_.jpg',14272,4.4,'$12.96','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Warners-Blissful-Benefits-Hipster-Panties/dp/B0948V78CW/ref=sr_1_84?keywords=women%27s+clothing&qid=1703020392&sr=8-84',47,'2023-12-19 15:13:13.880406-06','2023-12-19 15:13:13.880406-06','www.amazon.com'), + (3728,'GOLDPKF',NULL,'B07WR54MJ9','https://m.media-amazon.com/images/I/71gb9B5QmnL._AC_UL320_.jpg',2976,4.2,'$28.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/GOLDPKF-Lightweight-Patchwork-Pullover-Sweatshirts/dp/B07WR54MJ9/ref=sr_1_85?keywords=women%27s+clothing&qid=1703020392&sr=8-85',47,'2023-12-19 15:13:13.887805-06','2023-12-19 15:13:13.887805-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3729,'Fruit of the Loom',NULL,'B0BTB663JT','https://m.media-amazon.com/images/I/71HDoeA3xaL._AC_UL320_.jpg',72828,4.4,'$15.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Fruit-Loom-Spaghetti-Heather-Charcoal/dp/B0BTB663JT/ref=sr_1_86?keywords=women%27s+clothing&qid=1703020392&sr=8-86',47,'2023-12-19 15:13:13.894848-06','2023-12-19 15:13:13.894848-06','www.amazon.com'), + (3730,'BTFBM',NULL,'B08CL2KGGV','https://m.media-amazon.com/images/I/71EmSxCBAcL._AC_UL320_.jpg',4916,4.1,'$28.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/BTFBM-Slouchy-Blouses-Lightweight-Pullover/dp/B08CL2KGGV/ref=sr_1_87?keywords=women%27s+clothing&qid=1703020392&sr=8-87',47,'2023-12-19 15:13:13.903549-06','2023-12-19 15:13:13.903549-06','www.amazon.com'), + (3731,'Amazon Essentials',NULL,'B097RRK44H','https://m.media-amazon.com/images/I/91H7QtkhtKL._AC_UL320_.jpg',8674,4.2,'$10.70','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Amazon-Essentials-Relaxed-Fit-Short-Sleeve-XX-Large/dp/B097RRK44H/ref=sr_1_88?keywords=women%27s+clothing&qid=1703020392&sr=8-88',47,'2023-12-19 15:13:13.911523-06','2023-12-19 15:13:13.911523-06','www.amazon.com'), + (3732,'Dokotoo',NULL,'B0C9DJRRC7','https://m.media-amazon.com/images/I/81BqZfPoLhL._AC_UL320_.jpg',324,4.3,'$49.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Dokotoo-Shacket-Oversized-Pocketed-Outerwear/dp/B0C9DJRRC7/ref=sr_1_89?keywords=women%27s+clothing&qid=1703020392&sr=8-89',47,'2023-12-19 15:13:13.918742-06','2023-12-19 15:13:13.918742-06','www.amazon.com'), + (3733,'Amazon Essentials',NULL,'B08XCC2DC2','https://m.media-amazon.com/images/I/81EkMQiiG+L._MCnd_AC_UL320_.jpg',16419,4.5,'$14.90','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Amazon-Essentials-Full-Zip-Buffalo-X-Large/dp/B08XCC2DC2/ref=sr_1_90?keywords=women%27s+clothing&qid=1703020392&sr=8-90',47,'2023-12-19 15:13:13.926861-06','2023-12-19 15:13:13.926861-06','www.amazon.com'), + (3734,'SimpleFun',NULL,'B0CBQJPYFC','https://m.media-amazon.com/images/I/81a5rmLIRDL._AC_UL320_.jpg',63,4.4,'$19.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/SimpleFun-Sweaters-Square-Sleeve-Clothing/dp/B0CBQJPYFC/ref=sr_1_91?keywords=women%27s+clothing&qid=1703020392&sr=8-91',47,'2023-12-19 15:13:13.934461-06','2023-12-19 15:13:13.934461-06','www.amazon.com'), + (3735,'Dimur',NULL,'B0CBP663HN','https://m.media-amazon.com/images/I/8112lWIa8tL._AC_UL320_.jpg',169,4.2,'$23.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Dimur-Dressy-Sweaters-Fashion-Apricot/dp/B0CBP663HN/ref=sr_1_92?keywords=women%27s+clothing&qid=1703020392&sr=8-92',47,'2023-12-19 15:13:13.942278-06','2023-12-19 15:13:13.942278-06','www.amazon.com'), + (3736,'OQQ',NULL,'B0C8J2QCQV','https://m.media-amazon.com/images/I/81KR9xBxJeL._AC_UL320_.jpg',269,4.2,'$34.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/OQQ-Leggings-Seamless-Athletic-Exercise/dp/B0C8J2QCQV/ref=sr_1_93?keywords=women%27s+clothing&qid=1703020392&sr=8-93',47,'2023-12-19 15:13:13.949827-06','2023-12-19 15:13:13.949827-06','www.amazon.com'), + (3737,'Amazon Essentials',NULL,'B08CJ3QK6N','https://m.media-amazon.com/images/I/91anSLv1BGL._AC_UL320_.jpg',50719,4.5,'$17.90','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Amazon-Essentials-Full-Zip-Burgundy-Heather/dp/B08CJ3QK6N/ref=sr_1_94?keywords=women%27s+clothing&qid=1703020392&sr=8-94',47,'2023-12-19 15:13:13.957718-06','2023-12-19 15:13:13.957718-06','www.amazon.com'), + (3738,'BALEAF',NULL,'B08JYCDHK8','https://m.media-amazon.com/images/I/61rBrCB-jTL._AC_UL320_.jpg',9476,4.5,'$36.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/BALEAF-Resistant-Legging-Waisted-Thermal/dp/B08JYCDHK8/ref=sr_1_95?keywords=women%27s+clothing&qid=1703020392&sr=8-95',47,'2023-12-19 15:13:13.964307-06','2023-12-19 15:13:13.964307-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3739,'ANRABESS',NULL,'B09H42JVYP','https://m.media-amazon.com/images/I/612gMNDkbcL._AC_UL320_.jpg',4892,4.2,'$49.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/ANRABESS-Crewneck-Oversize-Maternity-412baixing-L/dp/B09H42JVYP/ref=sr_1_96?keywords=women%27s+clothing&qid=1703020392&sr=8-96',47,'2023-12-19 15:13:13.975996-06','2023-12-19 15:13:13.975996-06','www.amazon.com'), + (3740,'Trendy Queen',NULL,'B0BMKQSM2N','https://m.media-amazon.com/images/I/618toxLwQtL._AC_UL320_.jpg',322,4.2,'$38.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Trendy-Queen-Oversized-Sweatshirts-Lightweight/dp/B0BMKQSM2N/ref=sr_1_97?keywords=women%27s+clothing&qid=1703020392&sr=8-97',47,'2023-12-19 15:13:13.983586-06','2023-12-19 15:13:13.983586-06','www.amazon.com'), + (3741,'AUROLA',NULL,'B0B12LP1XW','https://m.media-amazon.com/images/I/411WWHX5cAL._AC_UL320_.jpg',14686,4.3,'$27.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Seamless-Scrunch-Legging-Legging-25%EF%BC%88S-Chestnut/dp/B0B12LP1XW/ref=sr_1_98?keywords=women%27s+clothing&qid=1703020392&sr=8-98',47,'2023-12-19 15:13:13.990755-06','2023-12-19 15:13:13.990755-06','www.amazon.com'), + (3742,'Signature by Levi Strauss & Co. Gold Label',NULL,'B07QKP39P9','https://m.media-amazon.com/images/I/61Uav7ZbUdL._AC_UL320_.jpg',23561,4.4,'$27.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Signature-Levi-Strauss-Totally-Shaping/dp/B07QKP39P9/ref=sr_1_99?keywords=women%27s+clothing&qid=1703020392&sr=8-99',47,'2023-12-19 15:13:13.998854-06','2023-12-19 15:13:13.998854-06','www.amazon.com'), + (3743,'EVALESS',NULL,'B0C7WMPJWW','https://m.media-amazon.com/images/I/71X76vwqDcL._AC_UL320_.jpg',368,4.1,'$36.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/EVALESS-Sweaters-Shoulder-Oversized-Pullover/dp/B0C7WMPJWW/ref=sr_1_100?keywords=women%27s+clothing&qid=1703020392&sr=8-100',47,'2023-12-19 15:13:14.007007-06','2023-12-19 15:13:14.007007-06','www.amazon.com'), + (3744,'ANRABESS',NULL,'B0C3QS2K65','https://m.media-amazon.com/images/I/51RqYmL9tML._AC_UL320_.jpg',1035,4.2,'$55.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/ANRABESS-Sweatsuit-Oversized-Sweatshirt-1088heise-M/dp/B0C3QS2K65/ref=sr_1_101?keywords=women%27s+clothing&qid=1703020392&sr=8-101',47,'2023-12-19 15:13:14.015086-06','2023-12-19 15:13:14.015086-06','www.amazon.com'), + (3745,'AUTOMET',NULL,'B0BJ1FX58G','https://m.media-amazon.com/images/I/61-x8RRmL9L._AC_UL320_.jpg',156,3.9,'$29.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/AUTOMET-Cropped-Lightweight-Sleeveless-Outerwear/dp/B0BJ1FX58G/ref=sr_1_102?keywords=women%27s+clothing&qid=1703020392&sr=8-102',47,'2023-12-19 15:13:14.023468-06','2023-12-19 15:13:14.023468-06','www.amazon.com'), + (3746,'SOLY HUX',NULL,'B08RD3RWDD','https://m.media-amazon.com/images/I/61C55c4m+-L._AC_UL320_.jpg',1779,4.4,'$18.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/SOLY-HUX-Cartoon-Lettuce-Sleepwear/dp/B08RD3RWDD/ref=sr_1_103?keywords=women%27s+clothing&qid=1703020392&sr=8-103',47,'2023-12-19 15:13:14.030822-06','2023-12-19 15:13:14.030822-06','www.amazon.com'), + (3747,'Trendy Queen',NULL,'B0BW8ZCGFQ','https://m.media-amazon.com/images/I/61RcVUDHeYL._AC_UL320_.jpg',640,4.2,'$23.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Trendy-Queen-Fashion-Crewneck-Clothing/dp/B0BW8ZCGFQ/ref=sr_1_104?keywords=women%27s+clothing&qid=1703020392&sr=8-104',47,'2023-12-19 15:13:14.037846-06','2023-12-19 15:13:14.037846-06','www.amazon.com'), + (3748,'adidas',NULL,'B08M6HZ5R9','https://m.media-amazon.com/images/I/51SBv8O8JGL._MCnd_AC_UL320_.jpg',2910,4.5,'$36.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Adidas-Womens-Essentials-Warm-Up-3-Stripes/dp/B08M6HZ5R9/ref=sr_1_105?keywords=women%27s+clothing&qid=1703020392&sr=8-105',47,'2023-12-19 15:13:14.044017-06','2023-12-19 15:13:14.044017-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3749,'Trendy Queen',NULL,'B0C8SZT66V','https://m.media-amazon.com/images/I/61IWp0oC9zL._AC_UL320_.jpg',433,4.3,'$36.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Trendy-Queen-Sweatshirts-Oversized-Sweaters/dp/B0C8SZT66V/ref=sr_1_106?keywords=women%27s+clothing&qid=1703020392&sr=8-106',47,'2023-12-19 15:13:14.051428-06','2023-12-19 15:13:14.051428-06','www.amazon.com'), + (3750,'Hanes',NULL,'B0BVMXNYKB','https://m.media-amazon.com/images/I/71d94DxEudL._AC_UL320_.jpg',129,3.8,'$9.59','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Hanes-Originals-V-Neck-T-Shirt-V-Neckline/dp/B0BVMXNYKB/ref=sr_1_107?keywords=women%27s+clothing&qid=1703020392&sr=8-107',47,'2023-12-19 15:13:14.05811-06','2023-12-19 15:13:14.05811-06','www.amazon.com'), + (3751,'Real Essentials',NULL,'B0CJHNWF4M','https://m.media-amazon.com/images/I/91D9ZmDzKSL._AC_UL320_.jpg',38,4.1,'$29.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/4-Pack-Athletic-Clothing-Activewear-Exercise/dp/B0CJHNWF4M/ref=sr_1_108?keywords=women%27s+clothing&qid=1703020392&sr=8-108',47,'2023-12-19 15:13:14.065563-06','2023-12-19 15:13:14.065563-06','www.amazon.com'), + (4569,'Large Makeup Mirror with Round 10X Magnifying Mirror for Travel, 3 Color Lighting, Rechargeable 2000mAh Batteries, Portable Ultra Slim Vanity Mirror for Women',NULL,'B0C1FZLKZ8','https://m.media-amazon.com/images/I/51bQ9JmsfNL._AC_UL320_.jpg',581,4.3,'$25.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxNTk3Mjk0NjM0MzQ4NzE3OjE3MDMwMjA2ODY6c3BfbXRmOjMwMDA0OTE3NzI2OTAwMjo6MDo6&url=%2FMagnifying-Lighting-Rechargeable-Batteries-Essential%2Fdp%2FB0C1FZLKZ8%2Fref%3Dsr_1_67_sspa%3Fkeywords%3Dtravel%2Baccessories%26qid%3D1703020686%26sr%3D8-67-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',57,'2023-12-19 15:18:07.964388-06','2023-12-19 15:18:07.964388-06','www.amazon.com'), + (3753,'Real Essentials',NULL,'B0C24ZPVVV','https://m.media-amazon.com/images/I/71mgsyPM6VL._AC_UL320_.jpg',175,4.3,'$44.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozNzQ3MzE3MjYxNzU3NzE3OjE3MDMwMjAzOTI6c3Bfc2VhcmNoX3RoZW1hdGljX2J0ZjoyMDAxNzEwNzg2NDI5OTg6OjA6Og&url=%2FPack-Leggings-Clothing-Compression-Exercise%2Fdp%2FB0C24ZPVVV%2Fref%3Dsxbs_pa_sp_search_thematic_btf_sspa%3Fcontent-id%3Damzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%253Aamzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%26cv_ct_cx%3Dwomen%2527s%2Bclothing%26keywords%3Dwomen%2527s%2Bclothing%26pd_rd_i%3DB0C24ZPVVV%26pd_rd_r%3Deed870d0-d99b-45e2-9917-d491a40cd66d%26pd_rd_w%3DlR2J2%26pd_rd_wg%3DPN6I9%26pf_rd_p%3Dc950d26b-f218-41e6-a496-534825ce2131%26pf_rd_r%3D16TG4SMFWXF632KBRZJ9%26qid%3D1703020392%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-49-50a2b317-b617-44c1-b7a6-daec194a2368-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWNfYnRm%26psc%3D1',47,'2023-12-19 15:13:14.08135-06','2023-12-19 15:13:14.08135-06','www.amazon.com'), + (3754,'THE GYM PEOPLE',NULL,'B0BD6RKHRZ','https://m.media-amazon.com/images/I/71THYRRxv5L._AC_UL320_.jpg',1029,4.5,'$38.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozNzQ3MzE3MjYxNzU3NzE3OjE3MDMwMjAzOTI6c3Bfc2VhcmNoX3RoZW1hdGljX2J0ZjoyMDAwOTM2OTU4Nzk1OTg6OjE6Og&url=%2FWomens-Pullover-Sweatshirt-Fleece-Pockets%2Fdp%2FB0BD6RKHRZ%2Fref%3Dsxbs_pa_sp_search_thematic_btf_sspa%3Fcontent-id%3Damzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%253Aamzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%26cv_ct_cx%3Dwomen%2527s%2Bclothing%26keywords%3Dwomen%2527s%2Bclothing%26pd_rd_i%3DB0BD6RKHRZ%26pd_rd_r%3Deed870d0-d99b-45e2-9917-d491a40cd66d%26pd_rd_w%3DlR2J2%26pd_rd_wg%3DPN6I9%26pf_rd_p%3Dc950d26b-f218-41e6-a496-534825ce2131%26pf_rd_r%3D16TG4SMFWXF632KBRZJ9%26qid%3D1703020392%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-50-50a2b317-b617-44c1-b7a6-daec194a2368-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWNfYnRm%26psc%3D1',47,'2023-12-19 15:13:14.088925-06','2023-12-19 15:13:14.088925-06','www.amazon.com'), + (3755,'NOOYME',NULL,'B0B5F1S3FZ','https://m.media-amazon.com/images/I/6188-J6MGgL._AC_UL320_.jpg',3463,4.4,'$29.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozNzQ3MzE3MjYxNzU3NzE3OjE3MDMwMjAzOTI6c3Bfc2VhcmNoX3RoZW1hdGljX2J0ZjoyMDAwOTEwMzIxODg1OTg6OjI6Og&url=%2FNOOYME-Thermal-Underwear-Weather-Black-camouflage%2Fdp%2FB0B5F1S3FZ%2Fref%3Dsxbs_pa_sp_search_thematic_btf_sspa%3Fcontent-id%3Damzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%253Aamzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%26cv_ct_cx%3Dwomen%2527s%2Bclothing%26keywords%3Dwomen%2527s%2Bclothing%26pd_rd_i%3DB0B5F1S3FZ%26pd_rd_r%3Deed870d0-d99b-45e2-9917-d491a40cd66d%26pd_rd_w%3DlR2J2%26pd_rd_wg%3DPN6I9%26pf_rd_p%3Dc950d26b-f218-41e6-a496-534825ce2131%26pf_rd_r%3D16TG4SMFWXF632KBRZJ9%26qid%3D1703020392%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-51-50a2b317-b617-44c1-b7a6-daec194a2368-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWNfYnRm%26psc%3D1',47,'2023-12-19 15:13:14.097132-06','2023-12-19 15:13:14.097132-06','www.amazon.com'), + (3756,'ANRABESS',NULL,'B0C69GXHBC','https://m.media-amazon.com/images/I/61jxmL7ny9L._MCnd_AC_UL320_.jpg',443,4.2,'$26.39','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozNzQ3MzE3MjYxNzU3NzE3OjE3MDMwMjAzOTI6c3Bfc2VhcmNoX3RoZW1hdGljX2J0ZjozMDAwOTg5NDY3MjU1MDI6OjM6Og&url=%2FANRABESS-Athletic-Exercise-Everyday-1125qianka-S%2Fdp%2FB0C69GXHBC%2Fref%3Dsxbs_pa_sp_search_thematic_btf_sspa%3Fcontent-id%3Damzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%253Aamzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%26cv_ct_cx%3Dwomen%2527s%2Bclothing%26keywords%3Dwomen%2527s%2Bclothing%26pd_rd_i%3DB0C69GXHBC%26pd_rd_r%3Deed870d0-d99b-45e2-9917-d491a40cd66d%26pd_rd_w%3DlR2J2%26pd_rd_wg%3DPN6I9%26pf_rd_p%3Dc950d26b-f218-41e6-a496-534825ce2131%26pf_rd_r%3D16TG4SMFWXF632KBRZJ9%26qid%3D1703020392%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-52-50a2b317-b617-44c1-b7a6-daec194a2368-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWNfYnRm%26psc%3D1',47,'2023-12-19 15:13:14.105108-06','2023-12-19 15:13:14.105108-06','www.amazon.com'), + (4053,'New Balance',NULL,'B09XRGRSS6','https://m.media-amazon.com/images/I/81hXfSf1eWL._AC_UL320_.jpg',2491,4.4,'$49.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/New-Balance-Fresh-Arishi-Running/dp/B09XRGRSS6/ref=sr_1_43?keywords=men%27s+shoes&qid=1703020483&sr=8-43',53,'2023-12-19 15:14:45.027807-06','2023-12-19 15:14:45.027807-06','www.amazon.com'), + (3752,'Natural Feelings',NULL,'B07X6L22HH','https://m.media-amazon.com/images/I/71BSA4GtsAL._AC_UL320_.jpg',11692,4.4,'$33.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozNzQ3MzE3MjYxNzU3NzE3OjE3MDMwMjAzOTI6c3Bfc2VhcmNoX3RoZW1hdGljX2J0ZjoyMDAwOTY4MDY3NTQ5OTg6OjQ6Og&url=%2FNatural-Feelings-Waisted-Leggings-Athletic%2Fdp%2FB07X6L22HH%2Fref%3Dsxbs_pa_sp_search_thematic_btf_sspa%3Fcontent-id%3Damzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%253Aamzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%26cv_ct_cx%3Dwomen%2527s%2Bclothing%26keywords%3Dwomen%2527s%2Bclothing%26pd_rd_i%3DB07X6L22HH%26pd_rd_r%3Deed870d0-d99b-45e2-9917-d491a40cd66d%26pd_rd_w%3DlR2J2%26pd_rd_wg%3DPN6I9%26pf_rd_p%3Dc950d26b-f218-41e6-a496-534825ce2131%26pf_rd_r%3D16TG4SMFWXF632KBRZJ9%26qid%3D1703020392%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-53-50a2b317-b617-44c1-b7a6-daec194a2368-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWNfYnRm%26psc%3D1',47,'2023-12-19 15:13:14.073704-06','2023-12-19 15:13:14.111881-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3757,'Caseative Water Ripple Pattern Curly Wave Frame Soft Compatible with iPhone Case (White,iPhone 12)',NULL,'B0BPWYTYH4','https://m.media-amazon.com/images/I/71HpnsBJJAL._AC_UY218_.jpg',948,4.4,'$12.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo1NDY5NDc4MDk0NTMzNzE3OjE3MDMwMjA0MDA6c3BfYXRmOjIwMDEzMzA1MjQ5OTM5ODo6MDo6&url=%2FCaseative-Ripple-Pattern-Compatible-iPhone%2Fdp%2FB0BPWYTYH4%2Fref%3Dsr_1_1_sspa%3Fkeywords%3Diphone%2Bcases%26qid%3D1703020400%26sr%3D8-1-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGY%26psc%3D1',48,'2023-12-19 15:13:21.554027-06','2023-12-19 15:13:21.554027-06','www.amazon.com'), + (3758,'Gyizho fits iPhone 15 Phone Case [Compatible with MagSafe] [10FT Drop Resistant] Non-Yellowing Cover for iPhone 15 Magnetic Case (Clear)',NULL,'B0CCS6SN17','https://m.media-amazon.com/images/I/71BwGW4VwSL._AC_UY218_.jpg',623,4.5,'$13.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo1NDY5NDc4MDk0NTMzNzE3OjE3MDMwMjA0MDA6c3BfYXRmOjMwMDA3NjE4NzkyMjYwMjo6MDo6&url=%2FGyizho-iPhone-15-Compatible-Non-Yellowing%2Fdp%2FB0CCS6SN17%2Fref%3Dsr_1_2_sspa%3Fkeywords%3Diphone%2Bcases%26qid%3D1703020400%26sr%3D8-2-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGY%26psc%3D1',48,'2023-12-19 15:13:21.560916-06','2023-12-19 15:13:21.560916-06','www.amazon.com'), + (3759,'elago Liquid Silicone Case Compatible with iPhone 13 Pro Case (6.1"), Premium Silicone, Full Body Protection - 3 Layer Shockproof Phone Cover, Anti-Scratch Soft Microfiber Lining (Stone)',NULL,'B09D2Z7HX4','https://m.media-amazon.com/images/I/51crrpCJ16L._AC_UY218_.jpg',10086,4.4,'$12.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/elago-Compatible-Protective-Shockproof-Anti-Scratch/dp/B09D2Z7HX4/ref=cs_sr_dp_n?keywords=iphone+cases&qid=1703020400&sr=8-3',48,'2023-12-19 15:13:21.568002-06','2023-12-19 15:13:21.568002-06','www.amazon.com'), + (3760,'Sayoaho Designed for iPhone 14 Pro Max Phone Case, Soft PU Leather TPU and Cute Art Wavy Painted for Women Girls, Slim Protective Shockproof Compatible with iPhone Case (Beige, iPhone 14 Pro Max)',NULL,'B0CHS7SPN3','https://m.media-amazon.com/images/I/71UQvBiGwDL._AC_UY218_.jpg',120,4.5,'$11.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Sayoaho-Designed-Protective-Shockproof-Compatible/dp/B0CHS7SPN3/ref=cs_sr_dp_4?keywords=iphone+cases&qid=1703020400&sr=8-5',48,'2023-12-19 15:13:21.575841-06','2023-12-19 15:13:21.575841-06','www.amazon.com'), + (4570,'Universal Travel Adapter,International Plug Adapter with Dual USB Charging (2 USB C Port & 2 USB A Ports), Worldwide Power Adaptor Travel Essentials Charger for Europe EU UK AUS(Type G/C/I/A)',NULL,'B0CM2XV78Y','https://m.media-amazon.com/images/I/61o0Gm+RC9L._AC_UL320_.jpg',2,5.0,'$16.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxNTk3Mjk0NjM0MzQ4NzE3OjE3MDMwMjA2ODY6c3BfbXRmOjMwMDEwMjc1MDA3NjQwMjo6MDo6&url=%2FUniversal-International-Charging-Worldwide-Essentials%2Fdp%2FB0CM2XV78Y%2Fref%3Dsr_1_69_sspa%3Fkeywords%3Dtravel%2Baccessories%26qid%3D1703020686%26sr%3D8-69-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',57,'2023-12-19 15:18:07.97052-06','2023-12-19 15:18:07.97052-06','www.amazon.com'), + (3762,'EWA for iPhone 15 Phone Case [Compatible with Magsafe] with Ring Stand, Silicone Strap Grip, Dual Magnet Backsnap, Rugged Drop Protection 2023 (Black)',NULL,'B0CD3M14G7','https://m.media-amazon.com/images/I/71YviXg62mL._AC_UL320_.jpg',418,4.2,'$34.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToyMDM2MTYzNzI1ODgwNzE3OjE3MDMwMjA0MDA6c3Bfc2VhcmNoX3RoZW1hdGljOjMwMDA2NjA3ODY3ODAwMjo6MDo6&url=%2FEWA-Compatible-Silicone-Backsnap-Protection%2Fdp%2FB0CD3M14G7%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.d17ca69f-1a39-4f7d-a62f-e5dff4cfd6d8%253Aamzn1.sym.d17ca69f-1a39-4f7d-a62f-e5dff4cfd6d8%26cv_ct_cx%3Diphone%2Bcases%26keywords%3Diphone%2Bcases%26pd_rd_i%3DB0CD3M14G7%26pd_rd_r%3De992da54-6e9c-4686-acdd-1b511cf9780f%26pd_rd_w%3D6v6gK%26pd_rd_wg%3DhpLM1%26pf_rd_p%3Dd17ca69f-1a39-4f7d-a62f-e5dff4cfd6d8%26pf_rd_r%3DB0TWQZWWBHGKAEAPVJ7Q%26qid%3D1703020400%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-1-364cf978-ce2a-480a-9bb0-bdb96faa0f61-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',48,'2023-12-19 15:13:21.590264-06','2023-12-19 15:13:21.590264-06','www.amazon.com'), + (3975,'LENRUE G11 Computer Speakers for Desktop, Touch Lights PC Speakers with Surge Clear Sound, USB C/USB Powered for Computer Desktop PC Laptop Monitor',NULL,'B0BRFN13S9','https://m.media-amazon.com/images/I/715MdMHfsJL._AC_UY218_.jpg',766,4.3,'$18.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/LENRUE-Computer-Speakers-Desktop-AUX_Black/dp/B0BRFN13S9/ref=sr_1_15?keywords=computer+accessories&qid=1703020467&sr=8-15',52,'2023-12-19 15:14:28.353204-06','2023-12-19 15:14:28.353204-06','www.amazon.com'), + (3763,'Diary iPhone Case [iPhone 15, Etoupe] BODT15-ET',NULL,'B0CJ25L1TC','https://m.media-amazon.com/images/I/61GR-Qz0atL._AC_UL320_.jpg',456,4.0,'$170.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToyMDM2MTYzNzI1ODgwNzE3OjE3MDMwMjA0MDA6c3Bfc2VhcmNoX3RoZW1hdGljOjMwMDA2NzQ2Mjc1NzQwMjo6MTo6&url=%2FDiary-iPhone-Case-Etoupe-BODT15%2Fdp%2FB0CJ25L1TC%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.d17ca69f-1a39-4f7d-a62f-e5dff4cfd6d8%253Aamzn1.sym.d17ca69f-1a39-4f7d-a62f-e5dff4cfd6d8%26cv_ct_cx%3Diphone%2Bcases%26keywords%3Diphone%2Bcases%26pd_rd_i%3DB0CJ25L1TC%26pd_rd_r%3De992da54-6e9c-4686-acdd-1b511cf9780f%26pd_rd_w%3D6v6gK%26pd_rd_wg%3DhpLM1%26pf_rd_p%3Dd17ca69f-1a39-4f7d-a62f-e5dff4cfd6d8%26pf_rd_r%3DB0TWQZWWBHGKAEAPVJ7Q%26qid%3D1703020400%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-2-364cf978-ce2a-480a-9bb0-bdb96faa0f61-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',48,'2023-12-19 15:13:21.597992-06','2023-12-19 15:13:21.597992-06','www.amazon.com'), + (3764,'Anuck iPhone 8 Plus Case, iPhone 7 Plus Case, Soft Silicone Gel Rubber Bumper Case Microfiber Lining Hard Shell Shockproof Full-Body Protective Case Cover for iPhone 7 Plus /8 Plus 5.5" - T Black',NULL,'B07K3TFC6X','https://m.media-amazon.com/images/I/61x-cbZZEdL._AC_UL320_.jpg',27175,4.6,'$9.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToyMDM2MTYzNzI1ODgwNzE3OjE3MDMwMjA0MDA6c3Bfc2VhcmNoX3RoZW1hdGljOjMwMDA3OTYxMjc0NjkwMjo6Mjo6&url=%2FAnuck-Microfiber-Shockproof-Full-Body-Protective%2Fdp%2FB07K3TFC6X%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.d17ca69f-1a39-4f7d-a62f-e5dff4cfd6d8%253Aamzn1.sym.d17ca69f-1a39-4f7d-a62f-e5dff4cfd6d8%26cv_ct_cx%3Diphone%2Bcases%26keywords%3Diphone%2Bcases%26pd_rd_i%3DB07K3TFC6X%26pd_rd_r%3De992da54-6e9c-4686-acdd-1b511cf9780f%26pd_rd_w%3D6v6gK%26pd_rd_wg%3DhpLM1%26pf_rd_p%3Dd17ca69f-1a39-4f7d-a62f-e5dff4cfd6d8%26pf_rd_r%3DB0TWQZWWBHGKAEAPVJ7Q%26qid%3D1703020400%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-3-364cf978-ce2a-480a-9bb0-bdb96faa0f61-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',48,'2023-12-19 15:13:21.606719-06','2023-12-19 15:13:21.606719-06','www.amazon.com'), + (3765,'NGB Compatible for iPhone 6 6S 7 8 Case, iPhone SE 3 2022/iPhone SE 2 2020 Case with Tempered Glass Screen Protector, Ring Holder, Girls Women Kids Liquid Glitter TPU Cute Case (Pink/Purple)',NULL,'B0973KLTMG','https://m.media-amazon.com/images/I/814R9Zhn2FL._AC_UL320_.jpg',2921,4.5,'$13.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToyMDM2MTYzNzI1ODgwNzE3OjE3MDMwMjA0MDA6c3Bfc2VhcmNoX3RoZW1hdGljOjIwMDA2Njg0MDQ5Nzk5ODo6Mzo6&url=%2FNGB-Compatible-Tempered-Protector-Quicksand%2Fdp%2FB0973KLTMG%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.d17ca69f-1a39-4f7d-a62f-e5dff4cfd6d8%253Aamzn1.sym.d17ca69f-1a39-4f7d-a62f-e5dff4cfd6d8%26cv_ct_cx%3Diphone%2Bcases%26keywords%3Diphone%2Bcases%26pd_rd_i%3DB0973KLTMG%26pd_rd_r%3De992da54-6e9c-4686-acdd-1b511cf9780f%26pd_rd_w%3D6v6gK%26pd_rd_wg%3DhpLM1%26pf_rd_p%3Dd17ca69f-1a39-4f7d-a62f-e5dff4cfd6d8%26pf_rd_r%3DB0TWQZWWBHGKAEAPVJ7Q%26qid%3D1703020400%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-4-364cf978-ce2a-480a-9bb0-bdb96faa0f61-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',48,'2023-12-19 15:13:21.614497-06','2023-12-19 15:13:21.614497-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3761,'KUMTZO Designed for iPhone 15 Black Leopard Case, Heavy Duty Protection Shockproof Dropproof Case, Cute Black Leopard Cheetah Cover for Women Girls iPhone 15 6.1 inch',NULL,'B0CM8SD8K6','https://m.media-amazon.com/images/I/61nFMen6zwL._AC_UL320_.jpg',195,4.7,'$12.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToyMDM2MTYzNzI1ODgwNzE3OjE3MDMwMjA0MDA6c3Bfc2VhcmNoX3RoZW1hdGljOjMwMDA5NzY5MzUxMDEwMjo6NDo6&url=%2FKUMTZO-Designed-Protection-Shockproof-Dropproof%2Fdp%2FB0CM8SD8K6%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.d17ca69f-1a39-4f7d-a62f-e5dff4cfd6d8%253Aamzn1.sym.d17ca69f-1a39-4f7d-a62f-e5dff4cfd6d8%26cv_ct_cx%3Diphone%2Bcases%26keywords%3Diphone%2Bcases%26pd_rd_i%3DB0CM8SD8K6%26pd_rd_r%3De992da54-6e9c-4686-acdd-1b511cf9780f%26pd_rd_w%3D6v6gK%26pd_rd_wg%3DhpLM1%26pf_rd_p%3Dd17ca69f-1a39-4f7d-a62f-e5dff4cfd6d8%26pf_rd_r%3DB0TWQZWWBHGKAEAPVJ7Q%26qid%3D1703020400%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-5-364cf978-ce2a-480a-9bb0-bdb96faa0f61-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',48,'2023-12-19 15:13:21.583285-06','2023-12-19 15:13:21.62171-06','www.amazon.com'), + (3766,'OtterBox IPhone SE 3rd & 2nd Gen, IPhone 8 & IPhone 7 (Not Compatible with Plus Sized Models) Commuter Series Case - BLACK, Slim & Tough, Pocket-friendly, with Port Protection',NULL,'B00Z7S48W6','https://m.media-amazon.com/images/I/41UhTjBRSXL._AC_UY218_.jpg',35995,4.6,'$22.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/OtterBox-IPhone-Compatible-Models-Commuter/dp/B00Z7S48W6/ref=cs_sr_dp_2?keywords=iphone+cases&qid=1703020400&sr=8-6',48,'2023-12-19 15:13:21.629183-06','2023-12-19 15:13:21.629183-06','www.amazon.com'), + (3767,'JETech Silicone Case for iPhone 13 6.1-Inch, Silky-Soft Touch Full-Body Protective Phone Case, Shockproof Cover with Microfiber Lining (Black)',NULL,'B09BVHH3F6','https://m.media-amazon.com/images/I/51RdsD4WKbL._AC_UY218_.jpg',6410,4.5,'$11.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/JETech-Compatible-Silky-Soft-Protective-Shockproof/dp/B09BVHH3F6/ref=cs_sr_dp_n?keywords=iphone+cases&qid=1703020400&sr=8-7',48,'2023-12-19 15:13:21.637194-06','2023-12-19 15:13:21.637194-06','www.amazon.com'), + (3768,'TAURI 5-in-1 Magnetic for iPhone 13 Case for iPhone 14 Case [Designed for Magsafe], with 2X Screen Protectors +2X Camera Lens Protectors, [Not-Yellowing] Phone Case, Clear',NULL,'B0BR9V7CCN','https://m.media-amazon.com/images/I/71qqcc5TKGL._AC_UY218_.jpg',27924,4.6,'$16.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/TAURI-Magnetic-14-Protectors-Not-Yellowing/dp/B0BR9V7CCN/ref=cs_sr_dp_n?keywords=iphone+cases&qid=1703020400&sr=8-8',48,'2023-12-19 15:13:21.645286-06','2023-12-19 15:13:21.645286-06','www.amazon.com'), + (3769,'Diaclara Designed for iPhone 13 Case, Full Body Rugged Case with Built-in Touch Sensitive Anti-Scratch Screen Protector, Soft TPU Bumper Case for iPhone 13 6.1" (Crystal Pink)',NULL,'B09T5HCMTQ','https://m.media-amazon.com/images/I/71qY1lCtbqL._AC_UY218_.jpg',7583,4.4,'$11.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Diaclara-Designed-Sensitive-Anti-Scratch-Protector/dp/B09T5HCMTQ/ref=cs_sr_dp_n?keywords=iphone+cases&qid=1703020400&sr=8-9',48,'2023-12-19 15:13:21.65306-06','2023-12-19 15:13:21.65306-06','www.amazon.com'), + (3770,'ESR for iPhone 15 Pro Max Case, Compatible with MagSafe, Military-Grade Protection, Yellowing Resistant, Scratch-Resistant Back, Magnetic Phone Case for iPhone 15 Pro Max, Classic Series, Clear',NULL,'B0CC1F4V7Q','https://m.media-amazon.com/images/I/71D3d+Eq6cL._AC_UY218_.jpg',3108,4.7,'$18.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/ESR-Compatible-Military-Grade-Protection-Scratch-Resistant/dp/B0CC1F4V7Q/ref=cs_sr_dp?keywords=iphone+cases&qid=1703020400&sr=8-10',48,'2023-12-19 15:13:21.659887-06','2023-12-19 15:13:21.659887-06','www.amazon.com'), + (3771,'ORNARTO Compatible with iPhone 13 Case 6.1, Slim Liquid Silicone 3 Layers Full Covered Soft Gel Rubber Case Cover 6.1 inch-Chalk Pink',NULL,'B09F3MNSTP','https://m.media-amazon.com/images/I/51H7ButiKrL._AC_UY218_.jpg',15347,4.5,'$13.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/ORNARTO-Compatible-Silicone-Covered-inch-Chalk/dp/B09F3MNSTP/ref=cs_sr_dp_n?keywords=iphone+cases&qid=1703020400&sr=8-11',48,'2023-12-19 15:13:21.66803-06','2023-12-19 15:13:21.66803-06','www.amazon.com'), + (3772,'CASETiFY Impact iPhone 14 Pro Case [4X Military Grade Drop Tested / 8.2ft Drop Protection/Compatible with Magsafe] - matt Darling Sticker Collage - Glossy Black',NULL,'B0B8S7J8W5','https://m.media-amazon.com/images/I/611qNt5978L._AC_UY218_.jpg',263,4.5,'$65.60','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo1NDY5NDc4MDk0NTMzNzE3OjE3MDMwMjA0MDA6c3BfbXRmOjMwMDA4NDA2MDkxNTcwMjo6MDo6&url=%2FCASETiFY-Impact-MagSafe-Compatible-iPhone%2Fdp%2FB0B8S7J8W5%2Fref%3Dsr_1_12_sspa%3Fkeywords%3Diphone%2Bcases%26qid%3D1703020400%26sr%3D8-12-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',48,'2023-12-19 15:13:21.675003-06','2023-12-19 15:13:21.675003-06','www.amazon.com'), + (4571,'SAUNORCH Travel Adapter Worldwide, Universal International Power Plug Adapter W/2.4A 3xUSB-A and 3.0A Type-C Wall Charger, European Travel Plug Adapter for Europe UK EU US CA AU Italy Asia-Blue',NULL,'B07D81J56M','https://m.media-amazon.com/images/I/61ZpCo3bieL._AC_UL320_.jpg',3503,4.6,'$19.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxNTk3Mjk0NjM0MzQ4NzE3OjE3MDMwMjA2ODY6c3BfbXRmOjIwMDEwNTk3NDUwNjQ5ODo6MDo6&url=%2FSAUNORCH-Universal-International-Worldwide-Asia-Blue%2Fdp%2FB07D81J56M%2Fref%3Dsr_1_70_sspa%3Fkeywords%3Dtravel%2Baccessories%26qid%3D1703020686%26sr%3D8-70-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',57,'2023-12-19 15:18:07.976138-06','2023-12-19 15:18:07.976138-06','www.amazon.com'), + (3774,'Mkeke for iPhone 15 Case Clear, [Not Yellowing] [Military Grade Protection] Slim Shockproof Phone Cases for iPhone 15 2023',NULL,'B0CBRW995T','https://m.media-amazon.com/images/I/71KRqvrHdML._AC_UY218_.jpg',42363,4.7,'$9.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Mkeke-Yellowing-Military-Protection-Shockproof/dp/B0CBRW995T/ref=cs_sr_dp_n?keywords=iphone+cases&qid=1703020400&sr=8-13',48,'2023-12-19 15:13:21.690939-06','2023-12-19 15:13:21.690939-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3775,'elago Compatible with iPhone 13 Pro Max Case, Liquid Silicone Case, Full Body Screen Camera Protective Cover, Shockproof, Slim Phone Case, Anti-Scratch Soft Microfiber Lining, 6.7 inch (Stone)',NULL,'B09D339LSQ','https://m.media-amazon.com/images/I/61699w-K68L._AC_UY218_.jpg',14846,4.5,'$12.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/elago-Compatible-Protective-Shockproof-Anti-Scratch/dp/B09D339LSQ/ref=cs_sr_dp_n?keywords=iphone+cases&qid=1703020400&sr=8-14',48,'2023-12-19 15:13:21.69895-06','2023-12-19 15:13:21.69895-06','www.amazon.com'), + (3776,'Cordking Designed for iPhone 12 Case, Designed for iPhone 12 Pro Case, Silicone Shockproof Phone Case with [Soft Anti-Scratch Microfiber Lining] 6.1 inch, Midnight Green',NULL,'B08CXZ3342','https://m.media-amazon.com/images/I/61oWnf6oO7L._AC_UY218_.jpg',38238,4.5,'$9.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Cordking-Designed-Shockproof-Anti-Scratch-Microfiber/dp/B08CXZ3342/ref=cs_sr_dp_n?keywords=iphone+cases&qid=1703020400&sr=8-15',48,'2023-12-19 15:13:21.707258-06','2023-12-19 15:13:21.707258-06','www.amazon.com'), + (3821,'Dahkoiz for Samsung Galaxy S23 Case, with Dust-Proof Port Cover, Full Body Protection Rubber Cover Phone Case for Samsung Galaxy S23 5G 6.1-Inch, Black/Black',NULL,'B0BLYF6RST','https://m.media-amazon.com/images/I/71meGT7puqL._AC_UY218_.jpg',234,4.4,'$11.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Dahkoiz-Galaxy-S23-Case-Black/dp/B0BLYF6RST/ref=cs_sr_dp_n?keywords=samsung+cases&qid=1703020417&sr=8-15',49,'2023-12-19 15:13:38.369037-06','2023-12-19 15:13:38.369037-06','www.amazon.com'), + (3777,'GVIEWIN Designed for iPhone 13 Case 6.1 Inch, with Tempered Glass Screen Protector + Camera Lens Protector Clear Flower Soft & Flexible Shockproof Floral Women Phone Cover(Magnolia/White)',NULL,'B09CH43LPY','https://m.media-amazon.com/images/I/71yaSPrkZwL._AC_UY218_.jpg',8031,4.7,'$9.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/GVIEWIN-Designed-Shockproof-Protective-Case%EF%BC%88Magnolia/dp/B09CH43LPY/ref=cs_sr_dp_n?keywords=iphone+cases&qid=1703020400&sr=8-16',48,'2023-12-19 15:13:21.714288-06','2023-12-19 15:13:21.714288-06','www.amazon.com'), + (3778,'Idocolors Cute Funny Face Phone Case for iPhone 12/12 Pro,White Liquid Silicone Girly Cases,Cartoon Soft Gel Rubber Full-Body Protective Microfiber Lining Shockproof Coffee Cover',NULL,'B09SPJK229','https://m.media-amazon.com/images/I/61+2kA-lgUL._AC_UY218_.jpg',692,4.4,'$14.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Idocolors-Full-Body-Protective-Microfiber-Shockproof/dp/B09SPJK229/ref=cs_sr_dp_n?keywords=iphone+cases&qid=1703020400&sr=8-18',48,'2023-12-19 15:13:21.722384-06','2023-12-19 15:13:21.722384-06','www.amazon.com'), + (3779,'OtterBox IPhone 11 Commuter Series Case - BESPOKE WAY (BLAZER BLUE/STORMY SEAS BLUE), Slim & Tough, Pocket-Friendly, with Port Protection',NULL,'B07W3Q2HLX','https://m.media-amazon.com/images/I/514Ds6hlcYL._AC_UY218_.jpg',47380,4.7,'$27.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/IPhone-OtterBox-Commuter-Pocket-Friendly-Protection/dp/B07W3Q2HLX/ref=cs_sr_dp_4?keywords=iphone+cases&qid=1703020400&sr=8-19',48,'2023-12-19 15:13:21.729683-06','2023-12-19 15:13:21.729683-06','www.amazon.com'), + (3780,'JETech Case for iPhone 15 6.1-Inch, Non-Yellowing Shockproof Phone Bumper Cover, Anti-Scratch Clear Back (Clear)',NULL,'B0CCCZ7MM9','https://m.media-amazon.com/images/I/71JVfFHOi7L._AC_UY218_.jpg',763,4.7,'$9.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/JETech-6-1-Inch-Non-Yellowing-Shockproof-Anti-Scratch/dp/B0CCCZ7MM9/ref=cs_sr_dp_n?keywords=iphone+cases&qid=1703020400&sr=8-20',48,'2023-12-19 15:13:21.738863-06','2023-12-19 15:13:21.738863-06','www.amazon.com'), + (3781,'CASETiFY Ultra Impact iPhone 14 Pro Case [5X Military Grade Drop Tested / 11.5ft Drop Protection/Compatible with Magsafe] - Fun Friends by Jon Burgerman - Glossy Black',NULL,'B0B8SFJCVL','https://m.media-amazon.com/images/I/61wjdoHtkLL._AC_UY218_.jpg',118,4.5,'$73.60','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo1NDY5NDc4MDk0NTMzNzE3OjE3MDMwMjA0MDA6c3BfYnRmOjMwMDA4NDA2MDg5NzgwMjo6MDo6&url=%2FCASETiFY-Impact-Protective-MagSafe-Compatible%2Fdp%2FB0B8SFJCVL%2Fref%3Dsr_1_21_sspa%3Fkeywords%3Diphone%2Bcases%26qid%3D1703020400%26sr%3D8-21-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9idGY%26psc%3D1',48,'2023-12-19 15:13:21.745993-06','2023-12-19 15:13:21.745993-06','www.amazon.com'), + (3782,'Casely iPhone 13 Pro Max Case | Wild West Adventure | Desert Western | Compatible with MagSafe',NULL,'B09RQBL824','https://m.media-amazon.com/images/I/81n7rgkAaLL._AC_UY218_.jpg',716,4.7,'$30.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo1NDY5NDc4MDk0NTMzNzE3OjE3MDMwMjA0MDA6c3BfYnRmOjIwMDEzMTIyNDg5MzA5ODo6MDo6&url=%2FCasely-iPhone-Adventure-Compatible-MagSafe%2Fdp%2FB09RQBL824%2Fref%3Dsr_1_22_sspa%3Fkeywords%3Diphone%2Bcases%26qid%3D1703020400%26sr%3D8-22-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9idGY%26psc%3D1%26smid%3DA2EEZJUJM5N8DK',48,'2023-12-19 15:13:21.753689-06','2023-12-19 15:13:21.753689-06','www.amazon.com'), + (3773,'Velvet Caviar Designed for iPhone 13 Case for Women [10ft Drop Tested] Compatible with MagSafe - Cute Magnetic Phone Cover - Protective Microfiber Lining (Holographic Blue Marble)',NULL,'B09H3LXV35','https://aax-us-iad.amazon.com/e/loi/imp?b=JN-pnMARyjp9AYbv0gh3QCUAAAGMg-0QJgEAAAH2AQBvbm9fdHhuX2JpZDQgICBvbm9fdHhuX2ltcDEgICCT2nZW',866,4.6,'$29.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.comhttps://aax-us-iad.amazon.com/x/c/RMYNNyE23g54w8f-tbVLSakAAAGMg-0P3wEAAAH2AQBvbm9fdHhuX2JpZDMgICBvbm9fdHhuX2ltcDEgICDwBlGT/https://www.amazon.com/Velvet-Caviar-Designed-Compatible-MagSafe/dp/B09H3LXV35/ref=sxin_23_sbv_search_btf?content-id=amzn1.sym.6ca944f8-539c-499e-a3a4-26a566d1de59%3Aamzn1.sym.6ca944f8-539c-499e-a3a4-26a566d1de59&cv_ct_cx=iphone+cases&keywords=iphone+cases&pd_rd_i=B09H3LXV35&pd_rd_r=e992da54-6e9c-4686-acdd-1b511cf9780f&pd_rd_w=b85cF&pd_rd_wg=hpLM1&pf_rd_p=6ca944f8-539c-499e-a3a4-26a566d1de59&pf_rd_r=B0TWQZWWBHGKAEAPVJ7Q&qid=1703020400&sbo=RZvfv%2F%2FHxDF%2BO5021pAnSA%3D%3D&sr=1-1-5190daf0-67e3-427c-bea6-c72c1df98776',48,'2023-12-19 15:13:21.681995-06','2023-12-19 15:13:21.761097-06','www.amazon.comhttps:'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3783,'Anuck for iPhone 12 Case Wavy Edge Water Ripple Pattern Design, Cute Wave Curly Frame Shape Soft Flexible TPU Shockproof Full-Body Protective Phone Case Cover for Women Girls, Shiny Silver',NULL,'B0CKYJ1D4J','https://m.media-amazon.com/images/I/61KUYm4R3kL._AC_UY218_.jpg',23,4.7,'$10.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxNzkxMjMwNjE0MTE3MTc6MTcwMzAyMDQwODpzcF9hdGZfbmV4dDozMDAxMDM4MjgyNjY0MDI6OjA6Og&url=%2FAnuck-iPhone-12-Shockproof-Protective%2Fdp%2FB0CKYJ1D4J%2Fref%3Dsr_1_17_sspa%3Fkeywords%3Diphone%2Bcases%26qid%3D1703020408%26sr%3D8-17-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGZfbmV4dA%26psc%3D1',48,'2023-12-19 15:13:29.28116-06','2023-12-19 15:13:29.28116-06','www.amazon.com'), + (4054,'Reebok',NULL,'B08LFWBDQS','https://m.media-amazon.com/images/I/71NB9Z-bTUL._AC_UL320_.jpg',283,4.3,'$29.97','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Reebok-Flexagon-Force-Cross-Trainer/dp/B08LFWBDQS/ref=sr_1_45?keywords=men%27s+shoes&qid=1703020483&sr=8-45',53,'2023-12-19 15:14:45.040312-06','2023-12-19 15:14:45.040312-06','www.amazon.com'), + (3784,'Jonwelsy Case for iPhone 15, 360 Degree Front and Back Clear Tempered Glass Full Protection Magnetic Adsorption Metal Bumper Frame with Safety Lock Flip Cover for iPhone 15 6.1" (Silver)',NULL,'B0CJ7RQ3XS','https://m.media-amazon.com/images/I/71DhVR237vL._AC_UY218_.jpg',1,5.0,'$22.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxNzkxMjMwNjE0MTE3MTc6MTcwMzAyMDQwODpzcF9hdGZfbmV4dDozMDAwODIzMDg0ODQwMDI6OjA6Og&url=%2FJonwelsy-Tempered-Protection-Magnetic-Adsorption%2Fdp%2FB0CJ7RQ3XS%2Fref%3Dsr_1_18_sspa%3Fkeywords%3Diphone%2Bcases%26qid%3D1703020408%26sr%3D8-18-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGZfbmV4dA%26psc%3D1',48,'2023-12-19 15:13:29.300913-06','2023-12-19 15:13:29.300913-06','www.amazon.com'), + (3785,'ESR for iPhone 14 Case/iPhone 13 Case, Military-Grade Protection, Shockproof Air-Guard Corners, Yellowing-Resistant Acrylic Back, Phone Case for iPhone 14/iPhone 13, Air Armor Case, Clear',NULL,'B099NK6QVY','https://m.media-amazon.com/images/I/71F5gFxzTBL._AC_UY218_.jpg',18867,4.7,'$12.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/ESR-Compatible-Military-Grade-Shock-Absorbing-Yellowing-Resistant/dp/B099NK6QVY/ref=cs_sr_dp_6?keywords=iphone+cases&qid=1703020408&sr=8-19',48,'2023-12-19 15:13:29.308107-06','2023-12-19 15:13:29.308107-06','www.amazon.com'), + (3786,'Nvollnoe for iPhone 13 Case with Card Holder Heavy Duty Protective Dual Layer Shockproof Hidden Card Slot Slim Wallet Case for iPhone 13 for Women&Men(Rose Gold)',NULL,'B09YH4W1D8','https://m.media-amazon.com/images/I/719TAjBGgNL._AC_UY218_.jpg',2695,4.2,'$12.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Nvollnoe-iPhone-Holder-Protective-Shockproof/dp/B09YH4W1D8/ref=cs_sr_dp_n?keywords=iphone+cases&qid=1703020408&sr=8-22',48,'2023-12-19 15:13:29.3144-06','2023-12-19 15:13:29.3144-06','www.amazon.com'), + (3787,'Pelican Ranger Series - iPhone 15 Plus Case 6.7" [Compatible with MagSafe] [Anti-Yellow] Magnetic Phone Case with Anti-Scratch Tech [12ft MIL-Grade Drop Protection] Cover for 15 Plus - Clear',NULL,'B0CC3W21TD','https://m.media-amazon.com/images/I/61sVSjOQM5L._AC_UY218_.jpg',6,5.0,'$16.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Pelican-Ranger-Compatible-Anti-Yellow-Anti-Scratch/dp/B0CC3W21TD/ref=cs_sr_dp_2?keywords=iphone+cases&qid=1703020408&sr=8-23',48,'2023-12-19 15:13:29.321642-06','2023-12-19 15:13:29.321642-06','www.amazon.com'), + (3788,'GONEZ for iPhone 15 Case, Liquid Silicone Case [with 2 Screen Protectors + 2 Camera Lens Proctetors], Anti-Scratch Soft Microfiber Lining Shockproof Full Body Protective Phone Cover 6.1", Pastel Pink',NULL,'B0CC5BH45J','https://m.media-amazon.com/images/I/61i36P31rBL._AC_UY218_.jpg',172,4.5,'$9.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/GONEZ-Protectors-Proctetors-Anti-Scratch-Microfiber/dp/B0CC5BH45J/ref=cs_sr_dp_n?keywords=iphone+cases&qid=1703020408&sr=8-24',48,'2023-12-19 15:13:29.32847-06','2023-12-19 15:13:29.32847-06','www.amazon.com'), + (3789,'JETech Case for iPhone 15 Pro Max 6.7-Inch, Shockproof Phone Bumper Cover, Solid Color Matte TPU Frame, Anti-Scratch Clear Back (Natural Titanium)',NULL,'B0CKTJLLB3','https://m.media-amazon.com/images/I/71v+hk94GKL._AC_UY218_.jpg',10,4.2,'$11.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/JETech-6-7-Inch-Shockproof-Anti-Scratch-Titanium/dp/B0CKTJLLB3/ref=cs_sr_dp_n?keywords=iphone+cases&qid=1703020408&sr=8-25',48,'2023-12-19 15:13:29.333994-06','2023-12-19 15:13:29.333994-06','www.amazon.com'), + (3790,'BaHaHoues for iPhone 13 Case iPhone 14 Case with Slide Camera Cover iPhone 14 Phone Case with Magnetic Kickstand Ring, Military Grade Shockproof Protective Case for iPhone 14 & iPhone 13 (Red)',NULL,'B0C7KTHKRJ','https://m.media-amazon.com/images/I/81JyQ5w06rL._AC_UY218_.jpg',406,4.3,'$13.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/BaHaHoues-Magnetic-Kickstand-Shockproof-Protective/dp/B0C7KTHKRJ/ref=cs_sr_dp_n?keywords=iphone+cases&qid=1703020408&sr=8-26',48,'2023-12-19 15:13:29.340087-06','2023-12-19 15:13:29.340087-06','www.amazon.com'), + (3791,'Myrauv for iPhone SE 2020/7/8 Love Heart Printed Case Girls Women Aesthetic Cute Shockproof Protective Case Soft TPU Hard Back Anti-Scratch Cover for iPhone SE 2020/7/8',NULL,'B0B68BSBMR','https://m.media-amazon.com/images/I/61OQpChtczL._AC_UY218_.jpg',13,3.4,'$12.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxNzkxMjMwNjE0MTE3MTc6MTcwMzAyMDQwODpzcF9tdGY6MzAwMDUwNjc4Mzc2ODAyOjowOjo&url=%2FMyrauv-Aesthetic-Shockproof-Protective-Anti-Scratch%2Fdp%2FB0B68BSBMR%2Fref%3Dsr_1_28_sspa%3Fkeywords%3Diphone%2Bcases%26qid%3D1703020408%26sr%3D8-28-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',48,'2023-12-19 15:13:29.346044-06','2023-12-19 15:13:29.346044-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3859,'OtterBox OnePlus Nord N200 5G Commuter Series Lite Case - BLACK, slim & tough, pocket-friendly, with open access to ports and speakers (no port covers),',NULL,'B094Q4DNW1','https://m.media-amazon.com/images/I/511epBw4bkS._AC_UY218_.jpg',1126,4.6,'$12.80','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/OtterBox-Commuter-LITE-Case-OnePlus/dp/B094Q4DNW1/ref=sr_1_4?keywords=oneplus+cases&qid=1703020435&sr=8-4',50,'2023-12-19 15:13:56.556504-06','2023-12-19 15:13:56.556504-06','www.amazon.com'), + (3792,'BUYDOT Designed for iPhone 15 Case, Silicone Phone Case [Military Grade Drop Protection] [Anti-Scratch Microfiber Lining] Silicone Ultra Slim Cover Shockproof Phone Cases 6.1 inch, Black',NULL,'B0CFV5V5LS','https://m.media-amazon.com/images/I/61bVy4KXFZL._AC_UY218_.jpg',529,4.5,'$9.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/BUYDOT-Protection-Anti-Scratch-Microfiber-Shockproof/dp/B0CFV5V5LS/ref=cs_sr_dp_n?keywords=iphone+cases&qid=1703020408&sr=8-29',48,'2023-12-19 15:13:29.353707-06','2023-12-19 15:13:29.353707-06','www.amazon.com'), + (3793,'TORRAS Strong Magnetic & Seamless Stand for iPhone 15 Pro Max Case, Fit for MagSafe, Mil-Grade Drop Protection, Adjustable Kickstand for iPhone 15 ProMax Case for Work/Video, Slim Diamond Clear',NULL,'B0CK2LHX5Y','https://m.media-amazon.com/images/I/71nvgnJjeyL._AC_UY218_.jpg',1028,4.6,'$29.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/TORRAS-iPhone-15-Pro-Max/dp/B0CK2LHX5Y/ref=cs_sr_dp_n?keywords=iphone+cases&qid=1703020408&sr=8-30',48,'2023-12-19 15:13:29.360429-06','2023-12-19 15:13:29.360429-06','www.amazon.com'), + (3794,'OtterBox iPhone 13 Pro Max & iPhone 12 Pro Max Commuter Series Case - BLACK, slim & tough, pocket-friendly, with port protection',NULL,'B09D5V5PV2','https://m.media-amazon.com/images/I/61+zVoLJ9DL._AC_UY218_.jpg',8130,4.6,'$30.52','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/iPhone-OtterBox-Commuter-pocket-friendly-protection/dp/B09D5V5PV2/ref=cs_sr_dp_4?keywords=iphone+cases&qid=1703020408&sr=8-31',48,'2023-12-19 15:13:29.367649-06','2023-12-19 15:13:29.367649-06','www.amazon.com'), + (3795,'JETech Case for iPhone 13 6.1-Inch, Shockproof Phone Bumper Cover, Solid Color Matte TPU Frame, Anti-Scratch Clear Back (Pink)',NULL,'B0CKTJKRYT','https://m.media-amazon.com/images/I/61-kPnbxW+L._AC_UY218_.jpg',4,4.5,'$11.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/JETech-iPhone-6-1-Inch-Shockproof-Anti-Scratch/dp/B0CKTJKRYT/ref=cs_sr_dp?keywords=iphone+cases&qid=1703020408&sr=8-32',48,'2023-12-19 15:13:29.374619-06','2023-12-19 15:13:29.374619-06','www.amazon.com'), + (3796,'FireNova Designed for iPhone 15 Pro Case, Silicone Upgraded [Camera Protection] Phone Case with [2 Screen Protectors], Soft Anti-Scratch Microfiber Lining Inside, 6.1 inch, Pink Pomelo',NULL,'B0CGXHVJYY','https://m.media-amazon.com/images/I/613Q02jbjZL._AC_UY218_.jpg',749,4.6,'$16.97','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/FireNova-iPhone-15-Pro-Anti-Scratch/dp/B0CGXHVJYY/ref=cs_sr_dp_n?keywords=iphone+cases&qid=1703020408&sr=8-33',48,'2023-12-19 15:13:29.381904-06','2023-12-19 15:13:29.381904-06','www.amazon.com'), + (3797,'Caseative Water Ripple Pattern Curly Wave Frame Soft Compatible with iPhone Case (Silver,iPhone 12)',NULL,'B0BPWS653K','https://m.media-amazon.com/images/I/71fZxfAdrWL._AC_UY218_.jpg',948,4.4,'$12.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Caseative-Ripple-Pattern-Compatible-iPhone/dp/B0BPWS653K/ref=cs_sr_dp_n?keywords=iphone+cases&qid=1703020408&sr=8-34',48,'2023-12-19 15:13:29.388986-06','2023-12-19 15:13:29.388986-06','www.amazon.com'), + (3798,'ZIYE Magnetic Case for iPhone 14 Pro Max Case [Compatible with MagSafe] Camera Lens Protector Plating Luxury Cover for Women Men Clear Soft TPU Shockproof Protective Phone Case - Purple',NULL,'B0BLK3MKJV','https://m.media-amazon.com/images/I/61EpXFFOr1L._AC_UY218_.jpg',1086,4.3,'$17.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/ZIYE-Compatible-Protector-Shockproof-Protective/dp/B0BLK3MKJV/ref=cs_sr_dp_6?keywords=iphone+cases&qid=1703020408&sr=8-35',48,'2023-12-19 15:13:29.395397-06','2023-12-19 15:13:29.395397-06','www.amazon.com'), + (3799,'FireNova Designed for iPhone 15 Case, Silicone Upgraded [Camera Protection] Phone Case with [2 Screen Protectors], Soft Anti-Scratch Microfiber Lining Inside, 6.1 inch, Light Brown',NULL,'B0CBP8NQ34','https://m.media-amazon.com/images/I/711BCCAg52L._AC_UY218_.jpg',357,4.6,'$14.97','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/FireNova-iPhone-15-Protection-Anti-Scratch/dp/B0CBP8NQ34/ref=cs_sr_dp_n?keywords=iphone+cases&qid=1703020408&sr=8-36',48,'2023-12-19 15:13:29.402283-06','2023-12-19 15:13:29.402283-06','www.amazon.com'), + (3800,'Fiyart Compatible with iPhone 13 Pro Max Case,Compatible with MagSafe Love Heart Plating Camera Protection Clear Phone Case, Magnetic Glitter for Women Girls Shockproof Back Bumper 6.7"-Gold',NULL,'B0C38H5LP7','https://aax-us-iad.amazon.com/e/loi/imp?b=JO6_fYifp0EsB3LMHOm26EEAAAGMg-0unAEAAAH2AQBvbm9fdHhuX2JpZDYgICBvbm9fdHhuX2ltcDEgICA2yP0I',542,4.5,'$16.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.comhttps://aax-us-iad.amazon.com/x/c/RO6_fYifp0EsB3LMHOm26EEAAAGMg-0uXwEAAAH2AQBvbm9fdHhuX2JpZDYgICBvbm9fdHhuX2ltcDEgICA2yP0I/https://www.amazon.com/Fiyart-Compatible-Protection-Magnetic-Shockproof/dp/B0C38H5LP7/ref=sxbs_sbv_search_btf?content-id=amzn1.sym.2066ba78-527e-4aed-9de4-3ba096deb87b%3Aamzn1.sym.2066ba78-527e-4aed-9de4-3ba096deb87b&cv_ct_cx=iphone+cases&keywords=iphone+cases&pd_rd_i=B0C38H5LP7&pd_rd_r=9ba73305-7cd1-4a30-a0e6-03532d8f80a3&pd_rd_w=84v1e&pd_rd_wg=rtxEl&pf_rd_p=2066ba78-527e-4aed-9de4-3ba096deb87b&pf_rd_r=STF1Q0QC8QTD492084ZQ&qid=1703020408&sbo=RZvfv%2F%2FHxDF%2BO5021pAnSA%3D%3D&sr=1-17-48f7baba-8e26-45f3-8811-e1a601ad20bf',48,'2023-12-19 15:13:29.410111-06','2023-12-19 15:13:29.410111-06','www.amazon.comhttps:'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3801,'LEIAU for Samsung Galaxy z-Fold-4 Case: Transparent Electroplating Protective Phone Case with Full Cover Hinge Protection, Clear Case with Built-in Screen Protector & Kickstand for Z Fold 4 5G (Gold)',NULL,'B0BYJXX7KC','https://m.media-amazon.com/images/I/61buaT77rJL._AC_UY218_.jpg',153,3.7,'$39.86','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxNjY2OTUwOTk0NzA1NzE3OjE3MDMwMjA0MTc6c3BfYXRmOjMwMDA5NjExNzM2MjEwMjo6MDo6&url=%2FLEIAU-Samsung-Galaxy-z-Fold-4-Built%2Fdp%2FB0BYJXX7KC%2Fref%3Dsr_1_1_sspa%3Fkeywords%3Dsamsung%2Bcases%26qid%3D1703020417%26sr%3D8-1-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGY%26psc%3D1',49,'2023-12-19 15:13:38.224314-06','2023-12-19 15:13:38.224314-06','www.amazon.com'), + (3802,'i-Blason Armorbox Designed for Samsung Galaxy S23 FE Case with Kickstand & Belt Clip, Full-Body Rugged Bumper Case with Built-in Screen Protector (Black)',NULL,'B0CH82KKK4','https://m.media-amazon.com/images/I/71HeecLGNvL._AC_UY218_.jpg',35,4.3,'$23.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxNjY2OTUwOTk0NzA1NzE3OjE3MDMwMjA0MTc6c3BfYXRmOjMwMDA2NDk5NTI3MjMwMjo6MDo6&url=%2Fi-Blason-Armorbox-Kickstand-Full-Body-Protector%2Fdp%2FB0CH82KKK4%2Fref%3Dsr_1_2_sspa%3Fkeywords%3Dsamsung%2Bcases%26qid%3D1703020417%26sr%3D8-2-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGY%26psc%3D1',49,'2023-12-19 15:13:38.234491-06','2023-12-19 15:13:38.234491-06','www.amazon.com'), + (3803,'SKTGSLAMY for Galaxy S22 Case,Samsung Galaxy S22 Case with Screen Protectors and Camera Cover,[Military Grade] 16ft.Drop Tested Cover with Magnetic Kickstand Protective Case for S22 (TC-Blue)',NULL,'B0CBS9GRYN','https://m.media-amazon.com/images/I/71uT4C5HZ+L._AC_UY218_.jpg',823,4.4,'$6.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/SKTGSLAMY-Protectors-16ft-Drop-Kickstand-Protective/dp/B0CBS9GRYN/ref=cs_sr_dp_n?keywords=samsung+cases&qid=1703020417&sr=8-3',49,'2023-12-19 15:13:38.241827-06','2023-12-19 15:13:38.241827-06','www.amazon.com'), + (3804,'SPIDERCASE Designed for Samsung Galaxy S23 Case, [10 FT Military Grade Drop Protection], 2 Pack [Tempered Glass Screen Protector+Camera Lens Protector] Heavy Duty Shockproof Case, Black',NULL,'B0BPHLRYY8','https://m.media-amazon.com/images/I/81ehY09b0yL._AC_UY218_.jpg',1450,4.5,'$16.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/SPIDERCASE-S23-Protection-Protector-Shockproof/dp/B0BPHLRYY8/ref=cs_sr_dp_n?keywords=samsung+cases&qid=1703020417&sr=8-4',49,'2023-12-19 15:13:38.248772-06','2023-12-19 15:13:38.248772-06','www.amazon.com'), + (3805,'Warsia for Samsung Galaxy A03S Case, Galaxy A03S Case with Screen Protector [Military Grade Drop Tested] Heavy-Duty Tough Rugged Shockproof Protective Case for Samsung A03S, Black',NULL,'B09WRJ9MHZ','https://m.media-amazon.com/images/I/71nQBko0b+L._AC_UY218_.jpg',1485,4.6,'$8.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Warsia-Protector-Heavy-Duty-Shockproof-Protective/dp/B09WRJ9MHZ/ref=cs_sr_dp_n?keywords=samsung+cases&qid=1703020417&sr=8-5',49,'2023-12-19 15:13:38.257168-06','2023-12-19 15:13:38.257168-06','www.amazon.com'), + (4572,'BAGSMART Toiletry Bag for Men, Large Travel Toiletry Organizer, Dopp Kit Water-resistant Shaving Bag for Toiletries Accessories - Black',NULL,'B0BL339917','https://m.media-amazon.com/images/I/71TteFJ2wvL._AC_UL320_.jpg',456,4.6,'$26.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/BAGSMART-Organizer-Water-resistant-Toiletries-Accessories/dp/B0BL339917/ref=sr_1_71?keywords=travel+accessories&qid=1703020686&sr=8-71',57,'2023-12-19 15:18:07.982082-06','2023-12-19 15:18:07.982082-06','www.amazon.com'), + (3807,'LeYi for Galaxy A14-5G Case: Samsung A 14 Case with 2 Pack Screen Protectors, Heavy Duty Case with Slide Camera Cover, Magnetic Rotatable Ring Kickstand for Samsung Galaxy A14 5G, Black',NULL,'B0BQ674PN5','https://m.media-amazon.com/images/I/8173+GO7LhL._AC_UL320_.jpg',620,4.6,'$6.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo2NjQwNTM2NzgzNjEyNzE3OjE3MDMwMjA0MTc6c3Bfc2VhcmNoX3RoZW1hdGljOjIwMDE2NTc3NjY3OTE5ODo6MDo6&url=%2FLeYi-Galaxy-A14-5G-Phone-Case%2Fdp%2FB0BQ674PN5%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.882a4bd1-3fd3-4961-90f6-8abc45a77ab4%253Aamzn1.sym.882a4bd1-3fd3-4961-90f6-8abc45a77ab4%26cv_ct_cx%3Dsamsung%2Bcases%26keywords%3Dsamsung%2Bcases%26pd_rd_i%3DB0BQ674PN5%26pd_rd_r%3D75a43227-955e-4b7d-898f-2ee721d0e18e%26pd_rd_w%3D1SxEC%26pd_rd_wg%3D7aNQs%26pf_rd_p%3D882a4bd1-3fd3-4961-90f6-8abc45a77ab4%26pf_rd_r%3D8HAVK4VBYP3JPTD9JHDP%26qid%3D1703020417%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-1-957b5332-dff9-4ebb-812a-1c4282368112-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',49,'2023-12-19 15:13:38.271869-06','2023-12-19 15:13:38.271869-06','www.amazon.com'), + (4055,'ASICS',NULL,'B08RXWR9LB','https://m.media-amazon.com/images/I/71tb156++dL._AC_UL320_.jpg',2238,4.5,'$39.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/ASICS-Mens-Black-Graphite-X-Wide/dp/B08RXWR9LB/ref=sr_1_46?keywords=men%27s+shoes&qid=1703020483&sr=8-46',53,'2023-12-19 15:14:45.047637-06','2023-12-19 15:14:45.047637-06','www.amazon.com'), + (4573,'[20Park]UMUST Silicone Cable Ties,Reusable Cable Management Organizer, Multipurpose Elastic Cord Organizer for Bundling and Fastening Cable Cords Wires(black,white,pink,green)',NULL,'B0B2CD4881','https://m.media-amazon.com/images/I/717w3xj1oJL._AC_UL320_.jpg',2030,4.7,'$9.29','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/UMUST-Management-Organizer-Multipurpose-Fastening/dp/B0B2CD4881/ref=sr_1_72?keywords=travel+accessories&qid=1703020686&sr=8-72',57,'2023-12-19 15:18:07.987469-06','2023-12-19 15:18:07.987469-06','www.amazon.com'), + (3808,'SOiOS for Samsung Galaxy A03S Phone Case: Built in Hard Kickstand & Touch Protector Military Shockproof TPU Durable Soft Rugged Heavy Duty Armor Full Body Protection Grade Phone Cover - Black',NULL,'B09PG2J7CR','https://m.media-amazon.com/images/I/817mJLFTDgL._AC_UL320_.jpg',1585,4.6,'$16.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo2NjQwNTM2NzgzNjEyNzE3OjE3MDMwMjA0MTc6c3Bfc2VhcmNoX3RoZW1hdGljOjIwMDA0MjU3NzM4NjE5ODo6MTo6&url=%2FSamsung-Galaxy-A03S-Phone-Case%2Fdp%2FB09PG2J7CR%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.882a4bd1-3fd3-4961-90f6-8abc45a77ab4%253Aamzn1.sym.882a4bd1-3fd3-4961-90f6-8abc45a77ab4%26cv_ct_cx%3Dsamsung%2Bcases%26keywords%3Dsamsung%2Bcases%26pd_rd_i%3DB09PG2J7CR%26pd_rd_r%3D75a43227-955e-4b7d-898f-2ee721d0e18e%26pd_rd_w%3D1SxEC%26pd_rd_wg%3D7aNQs%26pf_rd_p%3D882a4bd1-3fd3-4961-90f6-8abc45a77ab4%26pf_rd_r%3D8HAVK4VBYP3JPTD9JHDP%26qid%3D1703020417%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-2-957b5332-dff9-4ebb-812a-1c4282368112-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',49,'2023-12-19 15:13:38.278484-06','2023-12-19 15:13:38.278484-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3809,'Encased DuraClip Designed for Samsung Galaxy S23 Belt Clip Case with Phone Holster and Kickstand (Matte Black)',NULL,'B0BSN89L3N','https://m.media-amazon.com/images/I/81O7PDkQqPL._AC_UL320_.jpg',157,4.6,'$18.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo2NjQwNTM2NzgzNjEyNzE3OjE3MDMwMjA0MTc6c3Bfc2VhcmNoX3RoZW1hdGljOjIwMDEyNTQ5OTM4Mzg5ODo6Mjo6&url=%2FEncased-DuraClip-Designed-Samsung-Kickstand%2Fdp%2FB0BSN89L3N%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.882a4bd1-3fd3-4961-90f6-8abc45a77ab4%253Aamzn1.sym.882a4bd1-3fd3-4961-90f6-8abc45a77ab4%26cv_ct_cx%3Dsamsung%2Bcases%26keywords%3Dsamsung%2Bcases%26pd_rd_i%3DB0BSN89L3N%26pd_rd_r%3D75a43227-955e-4b7d-898f-2ee721d0e18e%26pd_rd_w%3D1SxEC%26pd_rd_wg%3D7aNQs%26pf_rd_p%3D882a4bd1-3fd3-4961-90f6-8abc45a77ab4%26pf_rd_r%3D8HAVK4VBYP3JPTD9JHDP%26qid%3D1703020417%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-3-957b5332-dff9-4ebb-812a-1c4282368112-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',49,'2023-12-19 15:13:38.284334-06','2023-12-19 15:13:38.284334-06','www.amazon.com'), + (3810,'SINIANL Samsung Galaxy S23 Wallet Case with RFID Blocking, Samsung S23 Case Wallet for Women Men with Card Holder Magnetic Clasp Kickstand Leather Book Folio Case for Galaxy S23 Black',NULL,'B0C6F2TDCT','https://m.media-amazon.com/images/I/81j4AxE9E-L._AC_UL320_.jpg',34,4.7,'$12.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo2NjQwNTM2NzgzNjEyNzE3OjE3MDMwMjA0MTc6c3Bfc2VhcmNoX3RoZW1hdGljOjMwMDAxODQyNDczNjQwMjo6Mzo6&url=%2FSINIANL-Samsung-Blocking-Magnetic-Kickstand%2Fdp%2FB0C6F2TDCT%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.882a4bd1-3fd3-4961-90f6-8abc45a77ab4%253Aamzn1.sym.882a4bd1-3fd3-4961-90f6-8abc45a77ab4%26cv_ct_cx%3Dsamsung%2Bcases%26keywords%3Dsamsung%2Bcases%26pd_rd_i%3DB0C6F2TDCT%26pd_rd_r%3D75a43227-955e-4b7d-898f-2ee721d0e18e%26pd_rd_w%3D1SxEC%26pd_rd_wg%3D7aNQs%26pf_rd_p%3D882a4bd1-3fd3-4961-90f6-8abc45a77ab4%26pf_rd_r%3D8HAVK4VBYP3JPTD9JHDP%26qid%3D1703020417%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-4-957b5332-dff9-4ebb-812a-1c4282368112-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',49,'2023-12-19 15:13:38.290029-06','2023-12-19 15:13:38.290029-06','www.amazon.com'), + (3806,'Jshru for Galaxy S20 Case, Military-Grade Protective Heavy Duty Phone Case, Shockproof Drop/Dust Proof 3-Layer Heavy Duty Protection Case for Samsung Galaxy S20 5G 6.2 Inch, Black',NULL,'B0BW3QT1VX','https://m.media-amazon.com/images/I/818kqDZl5iL._AC_UL320_.jpg',148,4.4,'$13.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo2NjQwNTM2NzgzNjEyNzE3OjE3MDMwMjA0MTc6c3Bfc2VhcmNoX3RoZW1hdGljOjMwMDA5NjEwMDU2ODIwMjo6NDo6&url=%2FJshru-Military-Grade-Protective-Shockproof-Protection%2Fdp%2FB0BW3QT1VX%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.882a4bd1-3fd3-4961-90f6-8abc45a77ab4%253Aamzn1.sym.882a4bd1-3fd3-4961-90f6-8abc45a77ab4%26cv_ct_cx%3Dsamsung%2Bcases%26keywords%3Dsamsung%2Bcases%26pd_rd_i%3DB0BW3QT1VX%26pd_rd_r%3D75a43227-955e-4b7d-898f-2ee721d0e18e%26pd_rd_w%3D1SxEC%26pd_rd_wg%3D7aNQs%26pf_rd_p%3D882a4bd1-3fd3-4961-90f6-8abc45a77ab4%26pf_rd_r%3D8HAVK4VBYP3JPTD9JHDP%26qid%3D1703020417%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-5-957b5332-dff9-4ebb-812a-1c4282368112-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',49,'2023-12-19 15:13:38.264488-06','2023-12-19 15:13:38.295982-06','www.amazon.com'), + (3811,'Raelmila Shockproof for Samsung Galaxy S23 Case, 12FT Military Grade Drop Tested, Anti-Fingerprint Anti-Scratch Semi-Clear Back with Silicone Slim Thin Protective Phone Case for Galaxy S23, Black',NULL,'B0CCNG573H','https://m.media-amazon.com/images/I/61VcjToXcQL._AC_UY218_.jpg',213,4.6,'$9.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Raelmila-Samsung-Galaxy-S23-Anti-Fingerprint/dp/B0CCNG573H/ref=cs_sr_dp_4?keywords=samsung+cases&qid=1703020417&sr=8-6',49,'2023-12-19 15:13:38.303065-06','2023-12-19 15:13:38.303065-06','www.amazon.com'), + (3812,'Crave Dual Guard for Samsung Galaxy S23 , Shockproof Protection Layer Case - Forest Green',NULL,'B0BRJ8RQS8','https://aax-us-iad.amazon.com/e/loi/imp?b=JBosSj5JJUiI7dJyEAf-kvIAAAGMg-105wEAAAH2AQBvbm9fdHhuX2JpZDEgICBvbm9fdHhuX2ltcDEgICCcg1s3',1566,4.7,'$17.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Crave-Samsung-Galaxy-Shockproof-Protection/dp/B0BRJ8RQS8/ref=cs_sr_dp_n?keywords=samsung+cases&qid=1703020417&sr=8-7',49,'2023-12-19 15:13:38.309648-06','2023-12-19 15:13:47.446325-06','www.amazon.com'), + (3813,'SURITCH for Samsung Galaxy S23 6.1 Inch Case, [Built-in Screen Protector] [Dual-Layer Protection ] Full Shockproof Rugged Bumper Phone Protective Cover - Purple Cosmos',NULL,'B0BRRM8WRS','https://m.media-amazon.com/images/I/81xPmjR8wnL._AC_UY218_.jpg',405,4.3,'$17.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/SURITCH-Samsung-Galaxy-S23-Dual-Layer/dp/B0BRRM8WRS/ref=cs_sr_dp_n?keywords=samsung+cases&qid=1703020417&sr=8-8',49,'2023-12-19 15:13:38.316107-06','2023-12-19 15:13:38.316107-06','www.amazon.com'), + (3814,'TORRAS Shockproof for Samsung Galaxy S23 Case, [Military Grade Drop Tested] Translucent Matte Hard Back & Soft Edge Slim Protective Compatible for Samsung S23 Case 5G Guardian Series, Black',NULL,'B0BMLMPSH7','https://m.media-amazon.com/images/I/61-06Ht-t7L._AC_UY218_.jpg',12961,4.6,'$19.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/TORRAS-Military-Translucent-Protective-Compatible/dp/B0BMLMPSH7/ref=cs_sr_dp_5?keywords=samsung+cases&qid=1703020417&sr=8-9',49,'2023-12-19 15:13:38.323666-06','2023-12-19 15:13:38.323666-06','www.amazon.com'), + (3815,'FNTCASE for Samsung Galaxy S23 Phone Case: Protective Rugged S23 5G Mobile Cover with Kickstand | Military Grade Drop Protection Shockproof TPU Durable Matte Textured Sturdy Bumper Cases 6.1''''',NULL,'B0BQHZJ93G','https://m.media-amazon.com/images/I/81gt-WP+6tL._AC_UY218_.jpg',2381,4.4,'$17.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/FNTCASE-Samsung-Galaxy-S23-Case/dp/B0BQHZJ93G/ref=cs_sr_dp?keywords=samsung+cases&qid=1703020417&sr=8-10',49,'2023-12-19 15:13:38.330152-06','2023-12-19 15:13:38.330152-06','www.amazon.com'), + (3816,'FNTCASE for Samsung Galaxy A23 5G Case: (Samsung Galaxy A23 4G LTE) Dual Layer Protective Heavy Duty Cell Phone Cover Shockproof Rugged with Non Slip Textured Back - Bumper - 6.6inch (Matte Black)',NULL,'B0BC1HN2WN','https://m.media-amazon.com/images/I/71b2Yv5YuCL._AC_UY218_.jpg',1080,4.4,'$8.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Samsung-Galaxy-A23-Case-Shockproof/dp/B0BC1HN2WN/ref=cs_sr_dp_n?keywords=samsung+cases&qid=1703020417&sr=8-11',49,'2023-12-19 15:13:38.336635-06','2023-12-19 15:13:38.336635-06','www.amazon.com'), + (3817,'Gear4 ZAGG Copenhagen - Black Case - That Highlights The D3O Protection Material for Samsung Galaxy S22',NULL,'B09RQ9VVXR','https://m.media-amazon.com/images/I/51dK46bUB-L._AC_UY218_.jpg',1,3.0,'$18.22','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxNjY2OTUwOTk0NzA1NzE3OjE3MDMwMjA0MTc6c3BfbXRmOjMwMDA4NTgzMDU4MjQwMjo6MDo6&url=%2FZAGG-Gear4-Copenhagen-Highlights-Protection%2Fdp%2FB09RQ9VVXR%2Fref%3Dsr_1_12_sspa%3Fkeywords%3Dsamsung%2Bcases%26qid%3D1703020417%26sr%3D8-12-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',49,'2023-12-19 15:13:38.342594-06','2023-12-19 15:13:38.342594-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3818,'Guzhthi for Samsung Galaxy A04 Case: with Cell Phone Screen Protector Glass and Camera Back Cover Protective Heavy Duty Shockproof Rugged - Military Protection Bumper - Black Jc',NULL,'B0C6F3XRZG','https://aax-us-iad.amazon.com/e/loi/imp?b=JF7WXEXt70Tm4hylddORcz4AAAGMg-1RJAEAAAH2AQBvbm9fdHhuX2JpZDMgICBvbm9fdHhuX2ltcDEgICCLxaPr',2,5.0,'$11.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.comhttps://aax-us-iad.amazon.com/x/c/RF7WXEXt70Tm4hylddORcz4AAAGMg-1Q9AEAAAH2AQBvbm9fdHhuX2JpZDMgICBvbm9fdHhuX2ltcDEgICCLxaPr/https://www.amazon.com/Guzhthi-Samsung-Galaxy-A04-Case/dp/B0C6F3XRZG/ref=sxin_23_sbv_search_btf?content-id=amzn1.sym.6ca944f8-539c-499e-a3a4-26a566d1de59%3Aamzn1.sym.6ca944f8-539c-499e-a3a4-26a566d1de59&cv_ct_cx=samsung+cases&keywords=samsung+cases&pd_rd_i=B0C6F3XRZG&pd_rd_r=75a43227-955e-4b7d-898f-2ee721d0e18e&pd_rd_w=rFPcj&pd_rd_wg=7aNQs&pf_rd_p=6ca944f8-539c-499e-a3a4-26a566d1de59&pf_rd_r=8HAVK4VBYP3JPTD9JHDP&qid=1703020417&sbo=RZvfv%2F%2FHxDF%2BO5021pAnSA%3D%3D&sr=1-1-5190daf0-67e3-427c-bea6-c72c1df98776',49,'2023-12-19 15:13:38.349276-06','2023-12-19 15:13:38.349276-06','www.amazon.comhttps:'), + (3819,'Rancase for Galaxy A13 5G Case,Three Layer Heavy Duty Shockproof Protection Hard Plastic Bumper +Soft Silicone Rubber Protective Case for Samsung Galaxy A13 5G,Purple Butterfly',NULL,'B0CDLHRHK6','https://m.media-amazon.com/images/I/71f7JAYOHiL._AC_UY218_.jpg',1219,4.4,'$13.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Rancase-Shockproof-Protection-Protective-Butterfly/dp/B0CDLHRHK6/ref=cs_sr_dp_n?keywords=samsung+cases&qid=1703020417&sr=8-13',49,'2023-12-19 15:13:38.356032-06','2023-12-19 15:13:38.356032-06','www.amazon.com'), + (3820,'LeYi for Samsung Galaxy A14 5G Case: with 2 Pack Tempered Glass Screen Protector and 360° Rotatable Ring Holder Magnetic Kickstand, Plating Rose Gold Edge Protective Samsung A 14 5G Case, Black',NULL,'B0BTBHGRXN','https://m.media-amazon.com/images/I/71Zp+ThwPKL._AC_UY218_.jpg',912,4.6,'$8.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/LeYi-Samsung-Galaxy-A14-Case/dp/B0BTBHGRXN/ref=cs_sr_dp_n?keywords=samsung+cases&qid=1703020417&sr=8-14',49,'2023-12-19 15:13:38.362229-06','2023-12-19 15:13:38.362229-06','www.amazon.com'), + (3860,'Spigen Tough Armor OnePlus 11 Case (2023) - Black, Shock-Absorbent, Kickstand',NULL,'B0BJ7LKC8L','https://m.media-amazon.com/images/I/618bTkDoo1L._AC_UY218_.jpg',528,4.2,'$16.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Spigen-Tough-Armor-Designed-OnePlus/dp/B0BJ7LKC8L/ref=cs_sr_dp_2?keywords=oneplus+cases&qid=1703020435&sr=8-5',50,'2023-12-19 15:13:56.564379-06','2023-12-19 15:13:56.564379-06','www.amazon.com'), + (3822,'for Samsung Galaxy A03s Phone Case: Shockproof Silicone Slim Covers Hybrid Pretty Protective Cell Cases - Durable TPU Dual Layer Drop-Proof Girl&Boy Cute Cover (Lavender Purple)',NULL,'B09PV8LNQJ','https://m.media-amazon.com/images/I/61HkoK0mbuL._AC_UY218_.jpg',2742,4.6,'$8.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Samsung-Galaxy-A03s-Phone-Case/dp/B09PV8LNQJ/ref=cs_sr_dp_6?keywords=samsung+cases&qid=1703020417&sr=8-16',49,'2023-12-19 15:13:38.376864-06','2023-12-19 15:13:38.376864-06','www.amazon.com'), + (3823,'Androgate for Samsung Galaxy S9 Case with HD Screen Protectors, Military-Grade Metal Ring Holder Kickstand 15ft Drop Tested Shockproof Cover Case for Samsung Galaxy S9 (2018), Black',NULL,'B08HRM5KHV','https://m.media-amazon.com/images/I/711qAUiz61L._AC_UY218_.jpg',5918,4.3,'$9.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxNjY2OTUwOTk0NzA1NzE3OjE3MDMwMjA0MTc6c3BfbXRmOjIwMDA2NDk5MDU5NzY0MTo6MDo6&url=%2FGalaxy-Case-Androgate-Military-Grade-Black%2Fdp%2FB08HRM5KHV%2Fref%3Dsr_1_17_sspa%3Fkeywords%3Dsamsung%2Bcases%26qid%3D1703020417%26sr%3D8-17-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',49,'2023-12-19 15:13:38.383714-06','2023-12-19 15:13:38.383714-06','www.amazon.com'), + (3824,'NZND Compatible with Samsung Galaxy A03S Case with Tempered Glass Screen Protector, Ring Holder/Wrist Strap, Glitter Liquid Floating Waterfall Durable Girls Women Kids Cute Case (Aqua/Purple)',NULL,'B09QFPPYXX','https://m.media-amazon.com/images/I/81nUyClxCAL._AC_UY218_.jpg',738,4.5,'$13.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/NZND-Tempered-Protector-Coverage-Waterfall/dp/B09QFPPYXX/ref=cs_sr_dp?keywords=samsung+cases&qid=1703020417&sr=8-18',49,'2023-12-19 15:13:38.390844-06','2023-12-19 15:13:38.390844-06','www.amazon.com'), + (3825,'Mous for Samsung Galaxy S23 Ultra Case MagSafe Compatible - Limitless 5.0 - Walnut - Protective S23 Ultra Case - Shockproof Phone Cover',NULL,'B0BSXQXCH8','https://m.media-amazon.com/images/I/710HPmw5WbL._AC_UY218_.jpg',657,4.5,'$64.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Mous-Compatible-Limitless-Superior-Protection/dp/B0BSXQXCH8/ref=cs_sr_dp_4?keywords=samsung+cases&qid=1703020417&sr=8-19',49,'2023-12-19 15:13:38.396873-06','2023-12-19 15:13:38.396873-06','www.amazon.com'), + (3826,'i-Blason Armorbox for Samsung Galaxy S23 Case with Built-in Screen Protector, [2 Front Frames] Full-Body Rugged Anti-Slip Bumper Case with Kickstand & Belt Clip Holster (Green)',NULL,'B0BQLRKXLJ','https://m.media-amazon.com/images/I/71wuEYFNgyL._AC_UY218_.jpg',408,4.1,'$25.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/i-Blason-Protector-Full-Body-Anti-Slip-Kickstand/dp/B0BQLRKXLJ/ref=cs_sr_dp?keywords=samsung+cases&qid=1703020417&sr=8-20',49,'2023-12-19 15:13:38.404491-06','2023-12-19 15:13:38.404491-06','www.amazon.com'), + (3827,'ZAGG Gear4 Denali Samsung Galaxy S23 Series Phone Case (Textured), D30 Drop Protection up to 16ft / 5m, Works with Wireless Charging Systems, Reinforced Backplate with Edge-to-Edge Protection Black',NULL,'B0BS4BC8Y2','https://m.media-amazon.com/images/I/418cP6e5pFL._AC_UY218_.jpg',10,4.5,'$42.50','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxNjY2OTUwOTk0NzA1NzE3OjE3MDMwMjA0MTc6c3BfYnRmOjMwMDA4Nzg3MTcwNzEwMjo6MDo6&url=%2FZAGG-Textured-Protection-Reinforced-Backplate%2Fdp%2FB0BS4BC8Y2%2Fref%3Dsr_1_22_sspa%3Fkeywords%3Dsamsung%2Bcases%26qid%3D1703020417%26sr%3D8-22-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9idGY%26psc%3D1',49,'2023-12-19 15:13:38.411204-06','2023-12-19 15:13:38.411204-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3828,'Esdot Compatible with Samsung Galaxy S20 FE Case with Built-in Screen Protector,with Fashionable Designs for Women Girls,Protective Phone Case for Galaxy S20 FE 6.5" Agate Stone',NULL,'B09HTC7FJM','https://aax-us-iad.amazon.com/e/loi/imp?b=JFmUBOAup3H_XibwvFTkghgAAAGMg-1ROQEAAAH2AQBvbm9fdHhuX2JpZDYgICBvbm9fdHhuX2ltcDEgICD3-DoP',3045,4.4,'$18.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.comhttps://aax-us-iad.amazon.com/x/c/RFmUBOAup3H_XibwvFTkghgAAAGMg-1RDwEAAAH2AQBvbm9fdHhuX2JpZDYgICBvbm9fdHhuX2ltcDEgICD3-DoP/https://www.amazon.com/Samsung-Galaxy-S20-Fashionable-6-5/dp/B09HTC7FJM/ref=sxbs_sbv_search_btf?content-id=amzn1.sym.e3e25c3f-be9c-4043-8c05-6ebb65e75e4b%3Aamzn1.sym.e3e25c3f-be9c-4043-8c05-6ebb65e75e4b&cv_ct_cx=samsung+cases&keywords=samsung+cases&pd_rd_i=B09HTC7FJM&pd_rd_r=9752060f-f0c6-415d-8a3b-ca13a1a2a766&pd_rd_w=MXggE&pd_rd_wg=bR4Zc&pf_rd_p=e3e25c3f-be9c-4043-8c05-6ebb65e75e4b&pf_rd_r=8HAVK4VBYP3JPTD9JHDP&qid=1703020417&sbo=RZvfv%2F%2FHxDF%2BO5021pAnSA%3D%3D&sr=1-1-a61ee601-6e56-4862-a8a2-1d3da5a5406f',49,'2023-12-19 15:13:38.417771-06','2023-12-19 15:13:38.417771-06','www.amazon.comhttps:'), + (3829,'DEFBSC Compatible with Samsung Galaxy S23 Plus Case with Gold Heart, Luxury Plating Edge Bumper Cute Case with Full Camera Protection for Women Girls, Anti-Scratch Shockproof Phone Cover,White',NULL,'B0BTHQZZQQ','https://m.media-amazon.com/images/I/71lB0Fw3A6L._AC_UY218_.jpg',34,4.3,'$11.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo0OTA5NjM0ODQ4MjU3NzE3OjE3MDMwMjA0MjY6c3BfYXRmX25leHQ6MjAwMTI5ODUwMzExNjk4OjowOjo&url=%2FDEFBSC-Compatible-Protection-Anti-Scratch-Shockproof%2Fdp%2FB0BTHQZZQQ%2Fref%3Dsr_1_17_sspa%3Fkeywords%3Dsamsung%2Bcases%26qid%3D1703020426%26sr%3D8-17-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGZfbmV4dA%26psc%3D1',49,'2023-12-19 15:13:47.204203-06','2023-12-19 15:13:47.204203-06','www.amazon.com'), + (3830,'Androgate for Samsung Galaxy S9 Case with HD Screen Protectors, Military-Grade Metal Ring Holder Kickstand 15ft Drop Tested Shockproof Cover Case for Samsung Galaxy S9 (2018), Blue',NULL,'B08HRL5ZK1','https://m.media-amazon.com/images/I/71oGL8IJPXL._AC_UY218_.jpg',5918,4.3,'$10.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo0OTA5NjM0ODQ4MjU3NzE3OjE3MDMwMjA0MjY6c3BfYXRmX25leHQ6MjAwMDY0OTkwNTk3NTQxOjowOjo&url=%2FGalaxy-Case-Androgate-Military-Grade-Blue%2Fdp%2FB08HRL5ZK1%2Fref%3Dsr_1_18_sspa%3Fkeywords%3Dsamsung%2Bcases%26qid%3D1703020426%26sr%3D8-18-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGZfbmV4dA%26psc%3D1',49,'2023-12-19 15:13:47.226167-06','2023-12-19 15:13:47.226167-06','www.amazon.com'), + (3831,'FNTCASE for Samsung Galaxy A14-5G Case: Dual-Layer Protective Textured Shockproof Rugged TPU Cover with Kickstand | Military Grade Drop Protection | Heavy Duty Cell Phone Protector - Black',NULL,'B0BVYZFP75','https://m.media-amazon.com/images/I/71gLoagBbwL._AC_UY218_.jpg',832,4.5,'$15.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/FNTCASE-Samsung-Galaxy-A14-5G-Case/dp/B0BVYZFP75/ref=cs_sr_dp_n?keywords=samsung+cases&qid=1703020426&sr=8-19',49,'2023-12-19 15:13:47.233173-06','2023-12-19 15:13:47.233173-06','www.amazon.com'), + (3832,'TISOOG Compatible with Samsung Galaxy S23 Case 6.1 inch-Silicone Full Cover Shockproof Protective Case with Soft Microfiber Lining Support Wireless Charging Phone Case for Samsung S23,Hot Pink',NULL,'B0BNCZBNNP','https://m.media-amazon.com/images/I/71KfUF6Cs+L._AC_UY218_.jpg',681,4.4,'$13.96','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/TISOOG-Compatible-inch-Silicone-Shockproof-Protective/dp/B0BNCZBNNP/ref=cs_sr_dp_n?keywords=samsung+cases&qid=1703020426&sr=8-20',49,'2023-12-19 15:13:47.239704-06','2023-12-19 15:13:47.239704-06','www.amazon.com'), + (3833,'ZTOFERA Designed for Samsung Galaxy S20 FE 5G Case,Luxury Plating Edge Love Hearts Pattern with Wristband Kickstand Camera Lens Protection,Soft Shockproof Cover for Girls Women,White',NULL,'B0BLC5S6B4','https://m.media-amazon.com/images/I/91bs7-e+xoL._AC_UY218_.jpg',207,4.2,'$13.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/ZTOFERA-Wristband-Kickstand-Protection-Shockproof/dp/B0BLC5S6B4/ref=cs_sr_dp_3?keywords=samsung+cases&qid=1703020426&sr=8-21',49,'2023-12-19 15:13:47.247077-06','2023-12-19 15:13:47.247077-06','www.amazon.com'), + (4574,'Passport Holder Cover Wallet Travel Essentials RFID Blocking Leather Card Case International Travel Must Haves Travel Accessories for Women Men(101#Coffee Grey)',NULL,'B0759HJL1M','https://m.media-amazon.com/images/I/81-1-O9PeCL._AC_UL320_.jpg',13950,4.7,'$9.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Passport-Blocking-Leather-Document-Organizer/dp/B0759HJL1M/ref=sr_1_75?keywords=travel+accessories&qid=1703020686&sr=8-75',57,'2023-12-19 15:18:07.992843-06','2023-12-19 15:18:07.992843-06','www.amazon.com'), + (3835,'Dexnor for Samsung Galaxy S10 Case, [Built in Screen Protector and Kickstand] Heavy Duty Military Grade Protection Shockproof Protective Cover for Samsung Galaxy S10 Black',NULL,'B098DZTZLD','https://m.media-amazon.com/images/I/71+GaWmqTtS._AC_UL320_.jpg',2288,4.3,'$17.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo2NjQ0OTc0MTA2NjU2NzE3OjE3MDMwMjA0MjY6c3Bfc2VhcmNoX3RoZW1hdGljOjIwMDA1NTc1MjI5OTI5ODo6MDo6&url=%2FDexnor-S10-Protection-Shockproof-Protective%2Fdp%2FB098DZTZLD%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%253Aamzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%26cv_ct_cx%3Dsamsung%2Bcases%26keywords%3Dsamsung%2Bcases%26pd_rd_i%3DB098DZTZLD%26pd_rd_r%3D571ec157-fea8-4649-aa2a-8407f9ddadc3%26pd_rd_w%3D73xXx%26pd_rd_wg%3DASIBy%26pf_rd_p%3D0c4cbb48-e433-4698-bba6-b3a5297e3e20%26pf_rd_r%3DFTZDZZSDRH1HGW2NNS80%26qid%3D1703020426%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-17-f853d353-bf33-45e7-b5c2-2cb2b31abc9b-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',49,'2023-12-19 15:13:47.261851-06','2023-12-19 15:13:47.261851-06','www.amazon.com'), + (3836,'Dexnor for Samsung Galaxy S10+ Plus Case, [Built in Screen Protector and Kickstand] Heavy Duty Military Grade Protection Shockproof Protective Cover for Samsung Galaxy S10 Plus Black',NULL,'B098F1MZLL','https://m.media-amazon.com/images/I/71m0f6JtFJS._AC_UL320_.jpg',2812,4.4,'$17.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo2NjQ0OTc0MTA2NjU2NzE3OjE3MDMwMjA0MjY6c3Bfc2VhcmNoX3RoZW1hdGljOjIwMDA1NTc1MzM3MjA5ODo6MTo6&url=%2FDexnor-S10-Plus-Protection-Shockproof%2Fdp%2FB098F1MZLL%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%253Aamzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%26cv_ct_cx%3Dsamsung%2Bcases%26keywords%3Dsamsung%2Bcases%26pd_rd_i%3DB098F1MZLL%26pd_rd_r%3D571ec157-fea8-4649-aa2a-8407f9ddadc3%26pd_rd_w%3D73xXx%26pd_rd_wg%3DASIBy%26pf_rd_p%3D0c4cbb48-e433-4698-bba6-b3a5297e3e20%26pf_rd_r%3DFTZDZZSDRH1HGW2NNS80%26qid%3D1703020426%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-18-f853d353-bf33-45e7-b5c2-2cb2b31abc9b-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',49,'2023-12-19 15:13:47.270557-06','2023-12-19 15:13:47.270557-06','www.amazon.com'), + (3837,'KSWOUS for Samsung S23 FE Case with 2 Pack Screen Protector, Liquid Silicone with Soft Anti-Scratch Microfiber Lining Shockproof Protective Cover for Galaxy S23 FE 5G Silicone Phone Case Black',NULL,'B0CKW6P1PQ','https://m.media-amazon.com/images/I/61bYTu7MI+L._AC_UL320_.jpg',15,4.9,'$11.59','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo2NjQ0OTc0MTA2NjU2NzE3OjE3MDMwMjA0MjY6c3Bfc2VhcmNoX3RoZW1hdGljOjMwMDA3NzAwNDU0ODEwMjo6Mjo6&url=%2FKSWOUS-Anti-Scratch-Microfiber-Shockproof-Protective%2Fdp%2FB0CKW6P1PQ%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%253Aamzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%26cv_ct_cx%3Dsamsung%2Bcases%26keywords%3Dsamsung%2Bcases%26pd_rd_i%3DB0CKW6P1PQ%26pd_rd_r%3D571ec157-fea8-4649-aa2a-8407f9ddadc3%26pd_rd_w%3D73xXx%26pd_rd_wg%3DASIBy%26pf_rd_p%3D0c4cbb48-e433-4698-bba6-b3a5297e3e20%26pf_rd_r%3DFTZDZZSDRH1HGW2NNS80%26qid%3D1703020426%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-19-f853d353-bf33-45e7-b5c2-2cb2b31abc9b-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',49,'2023-12-19 15:13:47.277384-06','2023-12-19 15:13:47.277384-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3838,'SINIANL Samsung Galaxy S23 Plus Case, Galaxy S23 Plus Leather Case, Vintage Wallet Case Book Folding Flip Case with Kickstand Card Holders Slots Protective Cover for Galaxy S23 Plus / S23+ Black',NULL,'B0BX932SK9','https://m.media-amazon.com/images/I/81ll-jnF43L._AC_UL320_.jpg',58,4.4,'$13.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo2NjQ0OTc0MTA2NjU2NzE3OjE3MDMwMjA0MjY6c3Bfc2VhcmNoX3RoZW1hdGljOjIwMDE1MDA5MjY1NDk5ODo6Mzo6&url=%2FSINIANL-Samsung-Leather-Kickstand-Protective%2Fdp%2FB0BX932SK9%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%253Aamzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%26cv_ct_cx%3Dsamsung%2Bcases%26keywords%3Dsamsung%2Bcases%26pd_rd_i%3DB0BX932SK9%26pd_rd_r%3D571ec157-fea8-4649-aa2a-8407f9ddadc3%26pd_rd_w%3D73xXx%26pd_rd_wg%3DASIBy%26pf_rd_p%3D0c4cbb48-e433-4698-bba6-b3a5297e3e20%26pf_rd_r%3DFTZDZZSDRH1HGW2NNS80%26qid%3D1703020426%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-20-f853d353-bf33-45e7-b5c2-2cb2b31abc9b-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',49,'2023-12-19 15:13:47.28485-06','2023-12-19 15:13:47.28485-06','www.amazon.com'), + (3834,'Dexnor for Samsung Galaxy S20 FE Case, [Built in Screen Protector and Kickstand] Heavy Duty Military Grade Protection Shockproof Protective Cover for Samsung Galaxy S20 FE 5G, 6.5 inch Black',NULL,'B08V4B9359','https://m.media-amazon.com/images/I/71fE6clV0tL._AC_UL320_.jpg',4276,4.4,'$16.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo2NjQ0OTc0MTA2NjU2NzE3OjE3MDMwMjA0MjY6c3Bfc2VhcmNoX3RoZW1hdGljOjIwMDA3MzY2MDQwNjA5ODo6NDo6&url=%2FDexnor-Samsung-Galaxy-S20-Case%2Fdp%2FB08V4B9359%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%253Aamzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%26cv_ct_cx%3Dsamsung%2Bcases%26keywords%3Dsamsung%2Bcases%26pd_rd_i%3DB08V4B9359%26pd_rd_r%3D571ec157-fea8-4649-aa2a-8407f9ddadc3%26pd_rd_w%3D73xXx%26pd_rd_wg%3DASIBy%26pf_rd_p%3D0c4cbb48-e433-4698-bba6-b3a5297e3e20%26pf_rd_r%3DFTZDZZSDRH1HGW2NNS80%26qid%3D1703020426%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-21-f853d353-bf33-45e7-b5c2-2cb2b31abc9b-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',49,'2023-12-19 15:13:47.254904-06','2023-12-19 15:13:47.291068-06','www.amazon.com'), + (3839,'Crave Dual Guard for Samsung Galaxy S23 FE Case, Shockproof Protection Dual Layer Case for Samsung Galaxy S23 FE - Lilac',NULL,'B0CCBPPCTH','https://m.media-amazon.com/images/I/81mbVkr4+NL._AC_UY218_.jpg',88,4.7,'$15.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Crave-Samsung-Galaxy-Shockproof-Protection/dp/B0CCBPPCTH/ref=cs_sr_dp_n?keywords=samsung+cases&qid=1703020426&sr=8-22',49,'2023-12-19 15:13:47.29827-06','2023-12-19 15:13:47.29827-06','www.amazon.com'), + (3840,'Hocase for Samsung Galaxy A54 5G Case 2023, Shockproof Heavy Duty Protection Soft Silicone Rubber Bumper+Hard Plastic Hybrid Protective Case for Women, Girls & Kids - When Purple Meets Blue',NULL,'B0BZNLRJ6Z','https://m.media-amazon.com/images/I/71GxNWsn83L._AC_UY218_.jpg',454,4.6,'$12.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Hocase-Shockproof-Protection-Silicone-Protective/dp/B0BZNLRJ6Z/ref=cs_sr_dp_n?keywords=samsung+cases&qid=1703020426&sr=8-23',49,'2023-12-19 15:13:47.305906-06','2023-12-19 15:13:47.305906-06','www.amazon.com'), + (3841,'SKMY for Samsung Galaxy S23 Ultra Case,S23 Ultra Case,with Camera Cover,[Military Grade] 16ft.Drop Tested Cover with Magnetic Kickstand Protective Case for Galaxy S23 Ultra 6.8 inch, Blue',NULL,'B0C5WQTWR6','https://m.media-amazon.com/images/I/81yUt1Y76kL._AC_UY218_.jpg',133,4.2,'$7.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/SKMY-Ultra-16ft-Drop-Kickstand-Protective/dp/B0C5WQTWR6/ref=cs_sr_dp_6?keywords=samsung+cases&qid=1703020426&sr=8-24',49,'2023-12-19 15:13:47.312231-06','2023-12-19 15:13:47.312231-06','www.amazon.com'), + (3842,'Plakill for Galaxy A14 5G Phone Case 3 in 1 Protective Designer Cute Strawberry Drop Tested Cute Cases for Women Girls Shockproof Protection Rugged Heavy Duty Cover for Samsung Galaxy A14 4G/5G',NULL,'B0C2VLG9GG','https://m.media-amazon.com/images/I/91RFvhJQ33L._AC_UY218_.jpg',106,4.6,'$14.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Plakill-A14-5G-Protective-Cases/dp/B0C2VLG9GG/ref=cs_sr_dp_n?keywords=samsung+cases&qid=1703020426&sr=8-25',49,'2023-12-19 15:13:47.321721-06','2023-12-19 15:13:47.321721-06','www.amazon.com'), + (4056,'Sperry',NULL,'B008TT8P5Q','https://m.media-amazon.com/images/I/71nFgTVa5qL._AC_UL320_.jpg',2505,4.6,'$36.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Sperry-Mens-Bahama-Boat-Shoe/dp/B008TT8P5Q/ref=sr_1_47?keywords=men%27s+shoes&qid=1703020483&sr=8-47',53,'2023-12-19 15:14:45.055505-06','2023-12-19 15:14:45.055505-06','www.amazon.com'), + (3843,'SAMSUNG Galaxy Z Flip5 Silicone Phone Case with Ring, Clear Protective Cover with Soft Matte Finish, Secure Finger Grip, Stylish, Smooth Design, US Version, EF-PF731TOEGUS, Apricot',NULL,'B0C7CY6LQ8','https://m.media-amazon.com/images/I/61eV1jK+ZjL._AC_UY218_.jpg',19,3.9,'$39.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/SAMSUNG-Silicone-Protective-Stylish-EF-PF731TOEGUS/dp/B0C7CY6LQ8/ref=cs_sr_dp?keywords=samsung+cases&qid=1703020426&sr=8-26',49,'2023-12-19 15:13:47.332693-06','2023-12-19 15:13:47.332693-06','www.amazon.com'), + (3844,'ZTOFERA for Samsung Galaxy A54 5G Case, Galaxy A54 5G Phone Case Butterfly Electroplated Gold Edge Cute Case for A54 Samsung Phone Case for Women Girls,Black',NULL,'B0C5D51NW1','https://m.media-amazon.com/images/I/91dr8NwS-hL._AC_UY218_.jpg',70,4.4,'$12.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo0OTA5NjM0ODQ4MjU3NzE3OjE3MDMwMjA0MjY6c3BfbXRmOjMwMDAwODc3NTEwNzAwMjo6MDo6&url=%2FZTOFERA-Samsung-Galaxy-Butterfly-Electroplated%2Fdp%2FB0C5D51NW1%2Fref%3Dsr_1_27_sspa%3Fkeywords%3Dsamsung%2Bcases%26qid%3D1703020426%26sr%3D8-27-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',49,'2023-12-19 15:13:47.343849-06','2023-12-19 15:13:47.343849-06','www.amazon.com'), + (3845,'ZTOFERA Compatible with Samsung Galaxy S20 FE 5G Case,Unique Curly Wave Frame Aesthetic Design Soft Liquid Silicone Anti-Fingerprint Shockproof Full Coverage Case for Samsung S20 FE - Black',NULL,'B0CM8XHDMC','https://m.media-amazon.com/images/I/71sn-ugeY7L._AC_UY218_.jpg',3,4.6,'$9.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo0OTA5NjM0ODQ4MjU3NzE3OjE3MDMwMjA0MjY6c3BfbXRmOjMwMDA5NDg3OTc0NzQwMjo6MDo6&url=%2FZTOFERA-Compatible-Aesthetic-Anti-Fingerprint-Shockproof%2Fdp%2FB0CM8XHDMC%2Fref%3Dsr_1_28_sspa%3Fkeywords%3Dsamsung%2Bcases%26qid%3D1703020426%26sr%3D8-28-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',49,'2023-12-19 15:13:47.350852-06','2023-12-19 15:13:47.350852-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3846,'CASEKOO Genuine Official for Samsung Galaxy S23 Ultra case (10FT Military Drop Protection) (Zero-Smudge Tech) Translucent Hard Back & Soft Bumper, Protective Slim Thin S23 Ultra Case 6.8'''' 2023, Black',NULL,'B0BNNS7XMM','https://m.media-amazon.com/images/I/712ny7r8QgL._AC_UY218_.jpg',2013,4.5,'$16.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/CASEKOO-Samsung-Galaxy-Ultra-case/dp/B0BNNS7XMM/ref=cs_sr_dp_n?keywords=samsung+cases&qid=1703020426&sr=8-29',49,'2023-12-19 15:13:47.36019-06','2023-12-19 15:13:47.36019-06','www.amazon.com'), + (3847,'FNTCASE for Samsung Galaxy S23 Case: Heavy Duty Rugged Shockproof Protective Cover with Belt-Clip Holster & Kickstand | Military Grade Protection Durable Phone Case for Galaxy S23 6.1 inch (Orange)',NULL,'B0BPRZBFPG','https://m.media-amazon.com/images/I/71p3tPZG1dL._AC_UY218_.jpg',582,4.2,'$23.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/FNTCASE-Samsung-Galaxy-S23-Case/dp/B0BPRZBFPG/ref=cs_sr_dp?keywords=samsung+cases&qid=1703020426&sr=8-30',49,'2023-12-19 15:13:47.368511-06','2023-12-19 15:13:47.368511-06','www.amazon.com'), + (3848,'FNTCASE for Samsung Galaxy A14 5G Case: Shockproof Silicone Protective Phone Case with Built-in Screen Protector - Slim Dual Layer Rugged Durable Drop Proof TPU Protection Cover (Periwinkle Blue)',NULL,'B0BPL6SH8S','https://m.media-amazon.com/images/I/71kbwceLNXL._AC_UY218_.jpg',1861,4.6,'$8.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/FNTCASE-Samsung-Galaxy-A14-Case/dp/B0BPL6SH8S/ref=cs_sr_dp_n?keywords=samsung+cases&qid=1703020426&sr=8-31',49,'2023-12-19 15:13:47.376383-06','2023-12-19 15:13:47.376383-06','www.amazon.com'), + (3849,'Casetego Compatible with Galaxy A54 5G Case,Marble Design Shockproof Dual Layer Full Body Rugged Hard PC Bumper Silicone Drop Protective Cover Case for Samsung Galaxy A54 5G(2023),Deep Purple',NULL,'B0BZYM5JVH','https://m.media-amazon.com/images/I/81d7oeBZDBL._AC_UY218_.jpg',18,3.8,'$4.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Casetego-Compatible-Shockproof-Silicone-Protective/dp/B0BZYM5JVH/ref=cs_sr_dp?keywords=samsung+cases&qid=1703020426&sr=8-32',49,'2023-12-19 15:13:47.384001-06','2023-12-19 15:13:47.384001-06','www.amazon.com'), + (3850,'Rancase for Galaxy A14 5G Case,[2 Tempered Glass Screen Protector + 2 Camera Lens Protector ] Three Layer Heavy Duty Shockproof Hard Plastic+Soft Protective Case for Samsung Galaxy A14 5G,Purple',NULL,'B0BRK812Q7','https://m.media-amazon.com/images/I/81PPeyaD90L._AC_UY218_.jpg',495,4.6,'$9.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Rancase-Tempered-Protector-Shockproof-Protective/dp/B0BRK812Q7/ref=cs_sr_dp_n?keywords=samsung+cases&qid=1703020426&sr=8-33',49,'2023-12-19 15:13:47.393-06','2023-12-19 15:13:47.393-06','www.amazon.com'), + (4023,'Hetohec',NULL,'B08TZYZPQZ','https://m.media-amazon.com/images/I/81IhLdSyI-L._AC_UL320_.jpg',1248,4.3,'$25.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4ODM4Mjc3OTMzNzI1NzE3OjE3MDMwMjA0ODM6c3BfbXRmOjIwMDEyNTM3MjU0MDE5ODo6MDo6&url=%2FLoafers-Athletic-Sneakers-Lightweight-Breathable%2Fdp%2FB08TZYZPQZ%2Fref%3Dsr_1_14_sspa%3Fkeywords%3Dmen%2527s%2Bshoes%26qid%3D1703020483%26sr%3D8-14-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',53,'2023-12-19 15:14:44.781396-06','2023-12-19 15:14:44.781396-06','www.amazon.com'), + (3851,'TOCOL for Samsung Galaxy S23 Case, with 2 Pack Screen Protector [Upgraded Full Camera Protection] [Military Grade Drop Tested] Translucent Matte Hard Back, Non-Slip Case for S23 6.1'''', Frosted Black',NULL,'B0BNVJSWWH','https://m.media-amazon.com/images/I/71Z4U8x5X4L._AC_UY218_.jpg',3183,4.4,'$15.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/TOCOL-Samsung-Galaxy-S23-Translucent/dp/B0BNVJSWWH/ref=cs_sr_dp_n?keywords=samsung+cases&qid=1703020426&sr=8-34',49,'2023-12-19 15:13:47.403669-06','2023-12-19 15:13:47.403669-06','www.amazon.com'), + (3852,'LeYi for Samsung-Galaxy-A03S-Case: Samsung AO3S Phone Case with [2 Pack] Tempered Glass Screen Protectors, Dual Layer Hard PC Textured Back Soft Bumper Phone Case for Samsung A03S (Not Fit A03), Black',NULL,'B0BGMY687R','https://m.media-amazon.com/images/I/71CZlhQ7+PL._AC_UY218_.jpg',780,4.6,'$6.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/LeYi-Samsung-Galaxy-A03S-Phone-Case/dp/B0BGMY687R/ref=cs_sr_dp_n?keywords=samsung+cases&qid=1703020426&sr=8-35',49,'2023-12-19 15:13:47.411677-06','2023-12-19 15:13:47.411677-06','www.amazon.com'), + (3853,'MOZOTER for Samsung Galaxy S23 Case with[2 Pcs Glass Screen Protector+2 Pcs Camera Lens Protector][Military Grade Drop Protection] Heavy Duty Shockproof Phone Case Cover 6.1'''' Black',NULL,'B0C2YV7F7J','https://m.media-amazon.com/images/I/81N85mgBaWL._AC_UY218_.jpg',331,4.5,'$14.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/MOZOTER-Samsung-Galaxy-S23-Protection-Shockproof-Black/dp/B0C2YV7F7J/ref=cs_sr_dp_6?keywords=samsung+cases&qid=1703020426&sr=8-36',49,'2023-12-19 15:13:47.420511-06','2023-12-19 15:13:47.420511-06','www.amazon.com'), + (3854,'ANTSHARE for Galaxy Z Fold 5 Case with S Pen Holder, [Built-in Screen Protector] [Foldable Hidden Kickstand], Shockproof Rugged Hinge Protection Armor Case for Samsung Galaxy Z Fold 5- Black',NULL,'B0CCTYNBYZ','https://m.media-amazon.com/images/I/81xhu+r8adL._AC_UY218_.jpg',278,3.9,'$39.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo0OTA5NjM0ODQ4MjU3NzE3OjE3MDMwMjA0MjY6c3BfYnRmOjMwMDA5NTE3MTA2OTAwMjo6MDo6&url=%2FANTSHARE-Protector-Kickstand-Shockproof-Protection%2Fdp%2FB0CCTYNBYZ%2Fref%3Dsr_1_37_sspa%3Fkeywords%3Dsamsung%2Bcases%26qid%3D1703020426%26sr%3D8-37-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9idGY%26psc%3D1',49,'2023-12-19 15:13:47.431608-06','2023-12-19 15:13:47.431608-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3855,'SHIEID Galaxy Z Fold 4 Case with Hinge Protection, Armour Case for Samsung Galaxy Z Fold 4 Full-Body Dual Layer Rugged Case with Built-in Screen Protector & Kickstand & S Pen Slot, Orange',NULL,'B0C8FYJCB2','https://m.media-amazon.com/images/I/715vOUOYZTL._AC_UY218_.jpg',68,3.8,'$59.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo0OTA5NjM0ODQ4MjU3NzE3OjE3MDMwMjA0MjY6c3BfYnRmOjMwMDAwODM0MDk3NDYwMjo6MDo6&url=%2FSHIEID-Galaxy-Protection-Samsung-Full-Body%2Fdp%2FB0C8FYJCB2%2Fref%3Dsr_1_38_sspa%3Fkeywords%3Dsamsung%2Bcases%26qid%3D1703020426%26sr%3D8-38-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9idGY%26psc%3D1',49,'2023-12-19 15:13:47.439275-06','2023-12-19 15:13:47.439275-06','www.amazon.com'), + (3856,'Encased DuraClip for OnePlus 10 Pro 5G Case with Belt Clip Holster (Slim Fit with Kickstand/Wireless Charging Compatible)',NULL,'B09XBMVZ4H','https://m.media-amazon.com/images/I/71UiaymjRHL._AC_UY218_.jpg',74,4.4,'$14.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo2NDEzMTcyMjQ1OTE3MTc6MTcwMzAyMDQzNTpzcF9hdGY6MjAwMDUxNDMzNDEwOTk4OjowOjo&url=%2FEncased-OnePlus-Case-Belt-Holster%2Fdp%2FB09XBMVZ4H%2Fref%3Dsr_1_1_sspa%3Fkeywords%3Doneplus%2Bcases%26qid%3D1703020435%26sr%3D8-1-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGY%26psc%3D1',50,'2023-12-19 15:13:56.531366-06','2023-12-19 15:13:56.531366-06','www.amazon.com'), + (4575,'LeakLocks® Toiletry Skins™ Elastic Sleeve for Leak Proofing Travel Container in Luggage. For Standard and Travel Sized Toiletries. Reusable Accessory for Travel Bag Suitcase and Carry-on Luggage',NULL,'B0CGZ28DKB','https://m.media-amazon.com/images/I/71Nc-AfwM-L._AC_UL320_.jpg',2392,4.4,'$11.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/LeakLocks%C2%AE-Toiletry-Container-Toiletries-Accessory/dp/B0CGZ28DKB/ref=sr_1_77?keywords=travel+accessories&qid=1703020686&sr=8-77',57,'2023-12-19 15:18:08.005058-06','2023-12-19 15:18:08.005058-06','www.amazon.com'), + (3858,'JXVM for OnePlus Nord N200 5G Case: Dual Layer Protective Heavy Duty Cell Phone Cover Shockproof Rugged with Non Slip Textured Back - Military Protection Bumper - 6.49inch (Black Black)',NULL,'B097ZRFRQL','https://m.media-amazon.com/images/I/71bTOXS8nuL._AC_UY218_.jpg',2036,4.6,'$7.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/OnePlus-Nord-N200-Case-Protectors/dp/B097ZRFRQL/ref=cs_sr_dp_4?keywords=oneplus+cases&qid=1703020435&sr=8-3',50,'2023-12-19 15:13:56.546245-06','2023-12-19 15:13:56.546245-06','www.amazon.com'), + (4041,'Rockport',NULL,'B005UF9VB4','https://m.media-amazon.com/images/I/71Y2sS7K-+L._AC_UL320_.jpg',9847,4.2,'$64.79','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Rockport-Mens-Chranson-Brown-Black/dp/B005UF9VB4/ref=sr_1_31?keywords=men%27s+shoes&qid=1703020483&sr=8-31',53,'2023-12-19 15:14:44.933949-06','2023-12-19 15:14:44.933949-06','www.amazon.com'), + (4576,'Lewis N. Clark RFID Blocking Stash Neck Wallet, Travel Pouch + Passport Holder for Women & Men, Taupe, One Size',NULL,'B0082C62BO','https://m.media-amazon.com/images/I/81LqTqU+iVL._AC_UL320_.jpg',11072,4.5,'$19.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Lewis-N-Clark-RFID-Blocking-Anti-Theft/dp/B0082C62BO/ref=sr_1_79?keywords=travel+accessories&qid=1703020686&sr=8-79',57,'2023-12-19 15:18:08.016584-06','2023-12-19 15:18:08.016584-06','www.amazon.com'), + (3857,'Poetic Revolution Case for OnePlus 7, [20FT Mil-Grade Drop Tested], Full-Body Rugged Dual-Layer Shockproof Protective Cover with Kickstand and Built-in-Screen Protector, Black',NULL,'B07QXGLDKQ','https://m.media-amazon.com/images/I/718P+asQQHL._AC_UL320_.jpg',1810,4.4,'$16.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo2NDEzMTcyMjQ1OTE3MTc6MTcwMzAyMDQzNTpzcF9hdGY6MjAwMDc1NDk3MjEzNjMxOjowOjo&url=%2FPoetic-Dual-Layer-Shockproof-Protective-Revolution%2Fdp%2FB07QXGLDKQ%2Fref%3Dsr_1_2_sspa%3Fkeywords%3Doneplus%2Bcases%26qid%3D1703020435%26sr%3D8-2-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGY%26psc%3D1',50,'2023-12-19 15:13:56.540028-06','2023-12-19 15:13:56.580692-06','www.amazon.com'), + (3862,'Dionsibei Military Grade Drop Impact for Oneplus 9 Pro Case Oneplus 9 Pro 5G Case 360 Metal Rotating Ring Kickstand Holder Armor Heavy Duty Shockproof Case for Oneplus 9 Pro Phone Case (Rose Gold)',NULL,'B09889TD9R','https://m.media-amazon.com/images/I/710ETJXZEWS._AC_UL320_.jpg',430,4.3,'$9.88','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxMDMyNTU2MDA4MzU3NzE3OjE3MDMwMjA0MzU6c3Bfc2VhcmNoX3RoZW1hdGljOjIwMDA0MTczNTkyNzQ5ODo6MTo6&url=%2FMilitary-Oneplus-Rotating-Kickstand-Shockproof%2Fdp%2FB09889TD9R%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.d17ca69f-1a39-4f7d-a62f-e5dff4cfd6d8%253Aamzn1.sym.d17ca69f-1a39-4f7d-a62f-e5dff4cfd6d8%26cv_ct_cx%3Doneplus%2Bcases%26keywords%3Doneplus%2Bcases%26pd_rd_i%3DB09889TD9R%26pd_rd_r%3Dc6833ca7-9b03-4026-9582-6bd0013c9ed9%26pd_rd_w%3Difx0E%26pd_rd_wg%3DhC8sQ%26pf_rd_p%3Dd17ca69f-1a39-4f7d-a62f-e5dff4cfd6d8%26pf_rd_r%3DWAJNVSCDP3AC2CAJYC32%26qid%3D1703020435%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-2-364cf978-ce2a-480a-9bb0-bdb96faa0f61-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',50,'2023-12-19 15:13:56.588387-06','2023-12-19 15:13:56.588387-06','www.amazon.com'), + (3863,'Puxssul for OnePlus 10T Case 5G, Soft TPU Artificial Leather case,Extremely Light Ultra-Light Camera Protection Leather Cover Case for OnePlus 10T 5G.(Orange)',NULL,'B0BPPJ3B5R','https://m.media-amazon.com/images/I/710q3e4V9vL._AC_UL320_.jpg',44,4.5,'$10.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxMDMyNTU2MDA4MzU3NzE3OjE3MDMwMjA0MzU6c3Bfc2VhcmNoX3RoZW1hdGljOjIwMDExNzMzNzg1NzY5ODo6Mjo6&url=%2FPuxssul-OnePlus-Artificial-Ultra-Light-Protection%2Fdp%2FB0BPPJ3B5R%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.d17ca69f-1a39-4f7d-a62f-e5dff4cfd6d8%253Aamzn1.sym.d17ca69f-1a39-4f7d-a62f-e5dff4cfd6d8%26cv_ct_cx%3Doneplus%2Bcases%26keywords%3Doneplus%2Bcases%26pd_rd_i%3DB0BPPJ3B5R%26pd_rd_r%3Dc6833ca7-9b03-4026-9582-6bd0013c9ed9%26pd_rd_w%3Difx0E%26pd_rd_wg%3DhC8sQ%26pf_rd_p%3Dd17ca69f-1a39-4f7d-a62f-e5dff4cfd6d8%26pf_rd_r%3DWAJNVSCDP3AC2CAJYC32%26qid%3D1703020435%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-3-364cf978-ce2a-480a-9bb0-bdb96faa0f61-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',50,'2023-12-19 15:13:56.595129-06','2023-12-19 15:13:56.595129-06','www.amazon.com'), + (3872,'for OnePlus Nord N200 5G Case with HD Screen Protector with Slide Camera Cover, Atump 360° Rotation Ring Kickstand [Military Grade] Shockproof Protective Case for OnePlus Nord N200 5G,Black',NULL,'B0B214VLS8','https://m.media-amazon.com/images/I/81a-r8tw-fL._AC_UY218_.jpg',1048,4.3,'$8.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Protector-Rotation-Kickstand-Shockproof-Protective/dp/B0B214VLS8/ref=cs_sr_dp?keywords=oneplus+cases&qid=1703020435&sr=8-13',50,'2023-12-19 15:13:56.672653-06','2023-12-19 15:13:56.672653-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3864,'Aozuoton Oneplus Nord N200 5G Case: Military Grade 16ft Drop Tested, Ring Shockproof Protective Cover with HD Screen Protector, Blue',NULL,'B0B4FYJLST','https://m.media-amazon.com/images/I/61uS6xK-MEL._AC_UY218_.jpg',280,4.5,'$8.69','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxMDMyNTU2MDA4MzU3NzE3OjE3MDMwMjA0MzU6c3Bfc2VhcmNoX3RoZW1hdGljOjMwMDA0OTY4NDU1MTAwMjo6Mzo6&url=%2FAozuoton-Oneplus-Nord-N200-5G%2Fdp%2FB0B4FYJLST%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.d17ca69f-1a39-4f7d-a62f-e5dff4cfd6d8%253Aamzn1.sym.d17ca69f-1a39-4f7d-a62f-e5dff4cfd6d8%26cv_ct_cx%3Doneplus%2Bcases%26keywords%3Doneplus%2Bcases%26pd_rd_i%3DB0B4FYJLST%26pd_rd_r%3Dc6833ca7-9b03-4026-9582-6bd0013c9ed9%26pd_rd_w%3Difx0E%26pd_rd_wg%3DhC8sQ%26pf_rd_p%3Dd17ca69f-1a39-4f7d-a62f-e5dff4cfd6d8%26pf_rd_r%3DWAJNVSCDP3AC2CAJYC32%26qid%3D1703020435%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-4-364cf978-ce2a-480a-9bb0-bdb96faa0f61-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',50,'2023-12-19 15:13:56.603278-06','2023-12-19 15:14:04.897794-06','www.amazon.com'), + (4577,'6000mah Ultra Slim Built in Cables Power Bank, Card Size Built in USB C Cords Battery Pack Portable Charger for Phones, 3 Output External Battery Pack Compatible with iPhone, Samsung, Google, Green',NULL,'B0BY8PDQV1','https://m.media-amazon.com/images/I/81heYm0AdHL._AC_UL320_.jpg',16618,4.3,'$28.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/6000mah-Battery-Portable-External-Compatible/dp/B0BY8PDQV1/ref=sr_1_80?keywords=travel+accessories&qid=1703020686&sr=8-80',57,'2023-12-19 15:18:08.022829-06','2023-12-19 15:18:08.022829-06','www.amazon.com'), + (3861,'TUDIA DualShield Grip Designed for OnePlus 11 Case 5G (2023), [MergeGrip] Dual Layer Shockproof Slim Military Grade Non-Slip Tough Heavy Duty Protective Phone Case Cover (Gray)',NULL,'B0BVT3V8MX','https://m.media-amazon.com/images/I/71JscUvnSUL._AC_UL320_.jpg',288,4.6,'$15.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxMDMyNTU2MDA4MzU3NzE3OjE3MDMwMjA0MzU6c3Bfc2VhcmNoX3RoZW1hdGljOjMwMDAwNTE3MTg3NzgwMjo6NDo6&url=%2FTUDIA-DualShield-MergeGrip-Shockproof-Protective%2Fdp%2FB0BVT3V8MX%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.d17ca69f-1a39-4f7d-a62f-e5dff4cfd6d8%253Aamzn1.sym.d17ca69f-1a39-4f7d-a62f-e5dff4cfd6d8%26cv_ct_cx%3Doneplus%2Bcases%26keywords%3Doneplus%2Bcases%26pd_rd_i%3DB0BVT3V8MX%26pd_rd_r%3Dc6833ca7-9b03-4026-9582-6bd0013c9ed9%26pd_rd_w%3Difx0E%26pd_rd_wg%3DhC8sQ%26pf_rd_p%3Dd17ca69f-1a39-4f7d-a62f-e5dff4cfd6d8%26pf_rd_r%3DWAJNVSCDP3AC2CAJYC32%26qid%3D1703020435%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-5-364cf978-ce2a-480a-9bb0-bdb96faa0f61-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',50,'2023-12-19 15:13:56.572151-06','2023-12-19 15:13:56.60999-06','www.amazon.com'), + (3865,'SKTGSLAMY for OnePlus Nord N200 5G Case,with Screen Protector,[Military Grade] 16ft. Drop Tested Cover with Magnetic Kickstand Car Mount Protective Case for OnePlus Nord N200 5G, Blue',NULL,'B09QRVS11D','https://m.media-amazon.com/images/I/712dwocppxL._AC_UY218_.jpg',1544,4.5,'$7.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/SKTGSLAMY-Protector-Military-Kickstand-Protective/dp/B09QRVS11D/ref=cs_sr_dp_6?keywords=oneplus+cases&qid=1703020435&sr=8-6',50,'2023-12-19 15:13:56.616531-06','2023-12-19 15:13:56.616531-06','www.amazon.com'), + (3866,'kwmobile Case Compatible with OnePlus Nord N10 5G Case - TPU Silicone Phone Cover with Soft Finish - Green Tomato',NULL,'B09CD5KLDP','https://m.media-amazon.com/images/I/61Bw8te4s6L._AC_UY218_.jpg',628,4.4,'$9.09','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/kwmobile-Silicone-Case-Compatible-OnePlus/dp/B09CD5KLDP/ref=cs_sr_dp_n?keywords=oneplus+cases&qid=1703020435&sr=8-8',50,'2023-12-19 15:13:56.626047-06','2023-12-19 15:13:56.626047-06','www.amazon.com'), + (3867,'TJS Compatible for OnePlus Nord N30 5G Case, with Tempered Glass Screen Protector Dual Layer Hybrid (Magnetic Mount Friendly) Shockproof Drop Protection Impact Phone Case (Black)',NULL,'B0C7KG9HJK','https://m.media-amazon.com/images/I/61ewM8sPb0L._AC_UY218_.jpg',114,4.5,'$8.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/TJS-Compatible-Protector-Shockproof-Protection/dp/B0C7KG9HJK/ref=cs_sr_dp_6?keywords=oneplus+cases&qid=1703020435&sr=8-9',50,'2023-12-19 15:13:56.633381-06','2023-12-19 15:13:56.633381-06','www.amazon.com'), + (3868,'Spigen Tough Armor Designed for OnePlus 7 Pro Case (2019) - Black',NULL,'B07RY67KWY','https://m.media-amazon.com/images/I/51R95YhL-IL._AC_UY218_.jpg',4139,4.7,'$14.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Spigen-Tough-Armor-Designed-OnePlus/dp/B07RY67KWY/ref=sr_1_10?keywords=oneplus+cases&qid=1703020435&sr=8-10',50,'2023-12-19 15:13:56.64185-06','2023-12-19 15:13:56.64185-06','www.amazon.com'), + (3869,'Military Grade Drop Impact for Oneplus Nord N200 5G Case Oneplus Nord N200 5G Case 360 Metal Rotating Ring Kickstand Holder Armor Heavy Duty Shockproof Case for Oneplus Nord N200 5G Phone Case (Black)',NULL,'B09F71Y49P','https://m.media-amazon.com/images/I/71dBfjzf3NL._AC_UY218_.jpg',657,4.4,'$8.88','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Military-Oneplus-Rotating-Kickstand-Shockproof/dp/B09F71Y49P/ref=cs_sr_dp_6?keywords=oneplus+cases&qid=1703020435&sr=8-11',50,'2023-12-19 15:13:56.650042-06','2023-12-19 15:13:56.650042-06','www.amazon.com'), + (3870,'Encased Falcon Armor Designed for OnePlus Nord N20 5G Case, Heavy Duty Protection (Black)',NULL,'B0B3GGVHVN','https://m.media-amazon.com/images/I/81ytK20J7GL._AC_UY218_.jpg',3,4.3,'$9.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo2NDEzMTcyMjQ1OTE3MTc6MTcwMzAyMDQzNTpzcF9tdGY6MjAwMDYzMTkwNDQwODk4OjowOjo&url=%2FEncased-Falcon-Designed-OnePlus-Protection%2Fdp%2FB0B3GGVHVN%2Fref%3Dsr_1_12_sspa%3Fkeywords%3Doneplus%2Bcases%26qid%3D1703020435%26sr%3D8-12-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',50,'2023-12-19 15:13:56.657501-06','2023-12-19 15:13:56.657501-06','www.amazon.com'), + (3871,'QUIETIP Case Compatible with OnePlus 10T 5G,Magnetic Thin Body Metal Frame Double Sided ClearTempered Glass Shockproof with Lens Camera Protector Cover,Green',NULL,'B0BBN1PF7J','https://aax-us-iad.amazon.com/e/loi/imp?b=JFc399QfDknO57TXNZLD5XgAAAGMg-2YggEAAAH2AQBvbm9fdHhuX2JpZDEgICBvbm9fdHhuX2ltcDEgICBpghwe',45,3.0,'$17.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.comhttps://aax-us-iad.amazon.com/x/c/RFc399QfDknO57TXNZLD5XgAAAGMg-2YXAEAAAH2AQBvbm9fdHhuX2JpZDEgICBvbm9fdHhuX2ltcDEgICBpghwe/https://www.amazon.com/QUIETIP-Compatible-10T-ClearTempered-Shockproof/dp/B0BBN1PF7J/ref=sxin_23_sbv_search_btf?content-id=amzn1.sym.6ca944f8-539c-499e-a3a4-26a566d1de59%3Aamzn1.sym.6ca944f8-539c-499e-a3a4-26a566d1de59&cv_ct_cx=oneplus+cases&keywords=oneplus+cases&pd_rd_i=B0BBN1PF7J&pd_rd_r=c6833ca7-9b03-4026-9582-6bd0013c9ed9&pd_rd_w=yu56w&pd_rd_wg=hC8sQ&pf_rd_p=6ca944f8-539c-499e-a3a4-26a566d1de59&pf_rd_r=WAJNVSCDP3AC2CAJYC32&qid=1703020435&sbo=RZvfv%2F%2FHxDF%2BO5021pAnSA%3D%3D&sr=1-1-5190daf0-67e3-427c-bea6-c72c1df98776',50,'2023-12-19 15:13:56.665293-06','2023-12-19 15:13:56.665293-06','www.amazon.comhttps:'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3873,'kwmobile Case Compatible with OnePlus 7T Case - TPU Silicone Phone Cover with Soft Finish - Gray Green',NULL,'B08H7YPHCG','https://m.media-amazon.com/images/I/711byd7YcfL._AC_UY218_.jpg',1053,4.3,'$10.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/kwmobile-Silicone-Case-Compatible-OnePlus/dp/B08H7YPHCG/ref=cs_sr_dp_n?keywords=oneplus+cases&qid=1703020435&sr=8-14',50,'2023-12-19 15:13:56.678988-06','2023-12-19 15:13:56.678988-06','www.amazon.com'), + (3874,'ATUMP for OnePlus Nord N300 5G Case with HD Screen Protector, Heavy Duty Shockproof with 360° Rotation Metal Kickstand [Military Grade] Protective Case for OnePlus Nord N300 5G, Black',NULL,'B0BMVLP1NB','https://m.media-amazon.com/images/I/81PPbUWF8JL._AC_UY218_.jpg',123,4.1,'$9.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/ATUMP-Protector-Shockproof-Kickstand-Protective/dp/B0BMVLP1NB/ref=cs_sr_dp?keywords=oneplus+cases&qid=1703020435&sr=8-15',50,'2023-12-19 15:13:56.686097-06','2023-12-19 15:13:56.686097-06','www.amazon.com'), + (3875,'Designed for OnePlus Open Case with Screen Protectors [Hard PC Leather Slim Phone Case] [Shockproof Anti-Slip] Slim Case for OnePlus Open 2023 (Black)',NULL,'B0CLSCMZRT','https://m.media-amazon.com/images/I/61exBA1mXwL._AC_UY218_.jpg',4,3.0,'$9.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/OnePlus-Open-Case-Protectors-Shockproof/dp/B0CLSCMZRT/ref=cs_sr_dp_3?keywords=oneplus+cases&qid=1703020435&sr=8-16',50,'2023-12-19 15:13:56.694903-06','2023-12-19 15:13:56.694903-06','www.amazon.com'), + (3876,'KKEIKO Case for OnePlus Nord N200 5G, RFID Blocking PU Leather Wallet Case with Card Holder, Magnetic Flip Cover Compatible with OnePlus Nord N200 5G, Black',NULL,'B0CBFHS9PM','https://m.media-amazon.com/images/I/81ad82OCkdL._AC_UY218_.jpg',21,4.6,'$14.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo2NDEzMTcyMjQ1OTE3MTc6MTcwMzAyMDQzNTpzcF9tdGY6MzAwMDc1NjY2NTYxODAyOjowOjo&url=%2FKKEIKO-OnePlus-Blocking-Magnetic-Compatible%2Fdp%2FB0CBFHS9PM%2Fref%3Dsr_1_17_sspa%3Fkeywords%3Doneplus%2Bcases%26qid%3D1703020435%26sr%3D8-17-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',50,'2023-12-19 15:13:56.701994-06','2023-12-19 15:13:56.701994-06','www.amazon.com'), + (3877,'Fit for OnePlus Nord N30 5G Case with Slide Camera Cover & Screen Protector (2 Pack), Build in 360° Rotating Ring Kickstand [Military Grade] Protective Case for Nord N30 5g Case, Black',NULL,'B0CJ2Y5CF5','https://m.media-amazon.com/images/I/81pzAxDntJL._AC_UY218_.jpg',294,4.5,'$7.68','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Protector-Rotating-Kickstand-Military-Protective/dp/B0CJ2Y5CF5/ref=cs_sr_dp_n?keywords=oneplus+cases&qid=1703020435&sr=8-18',50,'2023-12-19 15:13:56.709336-06','2023-12-19 15:13:56.709336-06','www.amazon.com'), + (3878,'Libeagle for Oneplus Open Case, Built-in Screen Protector, Full Hinge Protection, Metal Kickstand, Camera Protection, Thin & Slim Cover 5G 2023-Black',NULL,'B0CMQQRT86','https://m.media-amazon.com/images/I/61wSImWi9IL._AC_UY218_.jpg',7,4.8,'$28.59','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Libeagle-Protector-Protection-Kickstand-2023-Black/dp/B0CMQQRT86/ref=cs_sr_dp?keywords=oneplus+cases&qid=1703020435&sr=8-19',50,'2023-12-19 15:13:56.716364-06','2023-12-19 15:13:56.716364-06','www.amazon.com'), + (3879,'Poetic Guardian Case for OnePlus 11 5G 6.7" (2023) [20 FT Mil-Grade Drop Tested], Full-Body Hybrid Shockproof Bumper Cover with Built-in Screen Protector, Pink/Clear',NULL,'B0BX2KBYWZ','https://m.media-amazon.com/images/I/71pld6AXwfL._AC_UY218_.jpg',153,4.2,'$19.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Poetic-Mil-Grade-Full-Body-Shockproof-Protector/dp/B0BX2KBYWZ/ref=cs_sr_dp_4?keywords=oneplus+cases&qid=1703020435&sr=8-20',50,'2023-12-19 15:13:56.72426-06','2023-12-19 15:13:56.72426-06','www.amazon.com'), + (3880,'BENTOBEN OnePlus Nord N10 5G Case, Slim Fit Glow in The Dark Hybrid Hard PC Soft TPU Bumper Drop Proof Protective Girls Women Boys Men Cover for One Plus Nord N10 5G 6.49 Inch 2020, Nebula/Galaxy',NULL,'B08YYD8VFB','https://m.media-amazon.com/images/I/81fW8JCyA3L._AC_UY218_.jpg',400,4.4,'$11.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/BENTOBEN-OnePlus-Hybrid-Bumper-Protective/dp/B08YYD8VFB/ref=sr_1_21?keywords=oneplus+cases&qid=1703020435&sr=8-21',50,'2023-12-19 15:13:56.730932-06','2023-12-19 15:13:56.730932-06','www.amazon.com'), + (3881,'Puxssul for OnePlus 10T Case 5G, Soft TPU Artificial Leather case,Extremely Light Ultra-Light Camera Protection Leather Cover Case for OnePlus 10T 5G. (White)',NULL,'B0CC96TJ8S','https://m.media-amazon.com/images/I/71wI81jTEtL._AC_UY218_.jpg',44,4.5,'$10.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo2NDEzMTcyMjQ1OTE3MTc6MTcwMzAyMDQzNTpzcF9idGY6MzAwMDI1NDg5NDA1MjAyOjowOjo&url=%2FPuxssul-OnePlus-Artificial-Ultra-Light-Protection%2Fdp%2FB0CC96TJ8S%2Fref%3Dsr_1_22_sspa%3Fkeywords%3Doneplus%2Bcases%26qid%3D1703020435%26sr%3D8-22-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9idGY%26psc%3D1',50,'2023-12-19 15:13:56.740415-06','2023-12-19 15:13:56.740415-06','www.amazon.com'), + (3894,'YQODSZ for OnePlus Open Case with Hinge Protection, [Built in Screen Protector] [Camera Protector] All-Inclusive OnePlus Open Phone Case Slim Hard PC OnePlus Open Kickstand Case Green',NULL,'B0CMR4G65H','https://m.media-amazon.com/images/I/51mnNjTvZ8L._AC_UY218_.jpg',9,4.3,'$28.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/YQODSZ-OnePlus-Open-Case-Kickstand/dp/B0CMR4G65H/ref=cs_sr_dp_3?keywords=oneplus+cases&qid=1703020444&sr=8-24',50,'2023-12-19 15:14:04.95606-06','2023-12-19 15:14:04.95606-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4042,'Dockers',NULL,'B0B2FGCBR9','https://m.media-amazon.com/images/I/519qYsZeYtL._AC_UL320_.jpg',504,4.5,'$24.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Dockers-Ferris-Loafer-4-Way-Stretch/dp/B0B2FGCBR9/ref=sr_1_32?keywords=men%27s+shoes&qid=1703020483&sr=8-32',53,'2023-12-19 15:14:44.941263-06','2023-12-19 15:14:44.941263-06','www.amazon.com'), + (3882,'QUIETIP Case Compatible OnePlus 11 5G,Magnetic Body Metal Frame Double Sided Clear Tempered Glass Shockproof with Camera Protection Cover Thin,Green',NULL,'B0BT54QHDP','https://aax-us-iad.amazon.com/e/loi/imp?b=JEoyWeLVvuRPGgczgiasDNAAAAGMg-2YnQEAAAH2AQBvbm9fdHhuX2JpZDMgICBvbm9fdHhuX2ltcDEgICA2CeOx',92,2.5,'$19.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.comhttps://aax-us-iad.amazon.com/x/c/REoyWeLVvuRPGgczgiasDNAAAAGMg-2YcgEAAAH2AQBvbm9fdHhuX2JpZDMgICBvbm9fdHhuX2ltcDEgICA2CeOx/https://www.amazon.com/QUIETIP-Compatible-Magnetic-Shockproof-Protection/dp/B0BT54QHDP/ref=sxbs_sbv_search_btf?content-id=amzn1.sym.e3e25c3f-be9c-4043-8c05-6ebb65e75e4b%3Aamzn1.sym.e3e25c3f-be9c-4043-8c05-6ebb65e75e4b&cv_ct_cx=oneplus+cases&keywords=oneplus+cases&pd_rd_i=B0BT54QHDP&pd_rd_r=13fac63b-fc53-4251-a070-0894a73aee9d&pd_rd_w=kaIvp&pd_rd_wg=zakIO&pf_rd_p=e3e25c3f-be9c-4043-8c05-6ebb65e75e4b&pf_rd_r=WAJNVSCDP3AC2CAJYC32&qid=1703020435&sbo=RZvfv%2F%2FHxDF%2BO5021pAnSA%3D%3D&sr=1-1-a61ee601-6e56-4862-a8a2-1d3da5a5406f',50,'2023-12-19 15:13:56.747362-06','2023-12-19 15:13:56.747362-06','www.amazon.comhttps:'), + (3883,'KKEIKO Case for OnePlus 8T, RFID Blocking PU Leather Wallet Case with Card Holder, Magnetic Flip Cover Compatible with OnePlus 8T, Black',NULL,'B0CBFFDPRN','https://m.media-amazon.com/images/I/81Q6bwbcKmL._AC_UY218_.jpg',21,4.6,'$14.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxMzgzODg3MDg4OTg2NzE3OjE3MDMwMjA0NDQ6c3BfYXRmX25leHQ6MzAwMDc1NzAwMTI5NDAyOjowOjo&url=%2FKKEIKO-OnePlus-Blocking-Magnetic-Compatible%2Fdp%2FB0CBFFDPRN%2Fref%3Dsr_1_17_sspa%3Fkeywords%3Doneplus%2Bcases%26qid%3D1703020444%26sr%3D8-17-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGZfbmV4dA%26psc%3D1',50,'2023-12-19 15:14:04.856391-06','2023-12-19 15:14:04.856391-06','www.amazon.com'), + (3884,'NZND Compatible with OnePlus Nord N300 5G Case with Tempered Glass Screen Protector (Maximum Coverage), Full-Body Protective [Military-Grade], Magnetic Car Ring Holder Cover Case (Green)',NULL,'B0CCQ885YS','https://m.media-amazon.com/images/I/81OJYF4uCHL._AC_UY218_.jpg',6,5.0,'$9.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxMzgzODg3MDg4OTg2NzE3OjE3MDMwMjA0NDQ6c3BfYXRmX25leHQ6MzAwMDYyMDAzMTI2OTAyOjowOjo&url=%2FNZND-Compatible-Protector-Protective-Military-Grade%2Fdp%2FB0CCQ885YS%2Fref%3Dsr_1_18_sspa%3Fkeywords%3Doneplus%2Bcases%26qid%3D1703020444%26sr%3D8-18-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGZfbmV4dA%26psc%3D1',50,'2023-12-19 15:14:04.875815-06','2023-12-19 15:14:04.875815-06','www.amazon.com'), + (3885,'Spigen Ultra Hybrid Designed for OnePlus Nord Case (2020) - Matte Black',NULL,'B083G84HMW','https://m.media-amazon.com/images/I/61QmuOcW4KL._AC_UY218_.jpg',3619,4.4,'$11.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Spigen-Ultra-Hybrid-Designed-OnePlus/dp/B083G84HMW/ref=sr_1_19?keywords=oneplus+cases&qid=1703020444&sr=8-19',50,'2023-12-19 15:14:04.883206-06','2023-12-19 15:14:04.883206-06','www.amazon.com'), + (3886,'Poetic Guardian Series Case Designed for OnePlus Nord N100, Full-Body Hybrid Shockproof Bumper Cover with Built-in-Screen Protector, Pink/Clear',NULL,'B08ZRWRP59','https://m.media-amazon.com/images/I/71AgwY3vp3L._AC_UY218_.jpg',635,4.6,'$12.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Poetic-Guardian-Full-Body-Shockproof-Protector/dp/B08ZRWRP59/ref=cs_sr_dp_2?keywords=oneplus+cases&qid=1703020444&sr=8-20',50,'2023-12-19 15:14:04.890431-06','2023-12-19 15:14:04.890431-06','www.amazon.com'), + (4525,'6 Set Packing Cubes for Travel, OlarHike 4 Various Sizes(Large,Medium,Small,Slim) Luggage Organizer Bags for Travel Accessories Travel Essentials, Travel Cubes for Carry on Suitcases (Grey)',NULL,'B09HGTL2RY','https://m.media-amazon.com/images/I/812vi81y4BL._AC_UL320_.jpg',4310,4.7,'$22.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3NDA4MjkzNzE0NTk4NzE3OjE3MDMwMjA2Nzk6c3BfbXRmOjIwMDA2OTYzMTI2Mjk5ODo6MDo6&url=%2FOlarHike-Organizer-Accessories-Essentials-Suitcases%2Fdp%2FB09HGTL2RY%2Fref%3Dsr_1_27_sspa%3Fkeywords%3Dtravel%2Baccessories%26qid%3D1703020679%26sr%3D8-27-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',57,'2023-12-19 15:18:00.583318-06','2023-12-19 15:18:08.028284-06','www.amazon.com'), + (3888,'Puxssul for OnePlus 10T Case 5G, Soft TPU Artificial Leather case,Extremely Light Ultra-Light Camera Protection Leather Cover Case for OnePlus 10T 5G.(Violet)',NULL,'B0CMHRJ6Y2','https://m.media-amazon.com/images/I/71ekyrKYLnL._AC_UL320_.jpg',44,4.5,'$10.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozMDk3Njk5NzY5NDYyNzE3OjE3MDMwMjA0NDQ6c3Bfc2VhcmNoX3RoZW1hdGljOjMwMDEwMDg1NjkzMTYwMjo6MDo6&url=%2FPuxssul-OnePlus-Artificial-Ultra-Light-Protection%2Fdp%2FB0CMHRJ6Y2%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%253Aamzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%26cv_ct_cx%3Doneplus%2Bcases%26keywords%3Doneplus%2Bcases%26pd_rd_i%3DB0CMHRJ6Y2%26pd_rd_r%3D6c6b9626-0532-4430-b6ef-48f3cb49aff4%26pd_rd_w%3DT9Ezp%26pd_rd_wg%3DWUatq%26pf_rd_p%3D0c4cbb48-e433-4698-bba6-b3a5297e3e20%26pf_rd_r%3D9HXSM3344E4DY8FKFQAX%26qid%3D1703020444%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-17-f853d353-bf33-45e7-b5c2-2cb2b31abc9b-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',50,'2023-12-19 15:14:04.911832-06','2023-12-19 15:14:04.911832-06','www.amazon.com'), + (4043,'ASICS',NULL,'B09NBT4PXS','https://m.media-amazon.com/images/I/6114sOCgomL._AC_UL320_.jpg',2232,4.5,'$44.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/ASICS-Gel-ExciteTM-Running-Drive-White/dp/B09NBT4PXS/ref=sr_1_33?keywords=men%27s+shoes&qid=1703020483&sr=8-33',53,'2023-12-19 15:14:44.947962-06','2023-12-19 15:14:44.947962-06','www.amazon.com'), + (3889,'Suordii for OnePlus Nord N300 5G Case with Screen Protector [2 Pack], Shockproof Protective Case with Slide Camera Cover, Built-in 360° Rotate Ring Kickstand for OnePlus Nord N300 5G - Red',NULL,'B0BLY1SJGW','https://m.media-amazon.com/images/I/71pjKA+OtmL._AC_UL320_.jpg',20,4.0,'$12.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozMDk3Njk5NzY5NDYyNzE3OjE3MDMwMjA0NDQ6c3Bfc2VhcmNoX3RoZW1hdGljOjIwMDE2NDU2MTA5Njk5ODo6MTo6&url=%2FSuordii-Protector-Shockproof-Protective-Kickstand%2Fdp%2FB0BLY1SJGW%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%253Aamzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%26cv_ct_cx%3Doneplus%2Bcases%26keywords%3Doneplus%2Bcases%26pd_rd_i%3DB0BLY1SJGW%26pd_rd_r%3D6c6b9626-0532-4430-b6ef-48f3cb49aff4%26pd_rd_w%3DT9Ezp%26pd_rd_wg%3DWUatq%26pf_rd_p%3D0c4cbb48-e433-4698-bba6-b3a5297e3e20%26pf_rd_r%3D9HXSM3344E4DY8FKFQAX%26qid%3D1703020444%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-18-f853d353-bf33-45e7-b5c2-2cb2b31abc9b-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',50,'2023-12-19 15:14:04.918398-06','2023-12-19 15:14:04.918398-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3890,'TUDIA DualShield Grip Designed for OnePlus Nord N30 5G Case (2023), [MergeGrip] Dual Layer Shockproof Slim Military Grade Non-Slip Tough Heavy Duty Protective Phone Case Cover (Pine Green)',NULL,'B0CDG4YH59','https://m.media-amazon.com/images/I/71+4dePBo4L._AC_UL320_.jpg',19,4.4,'$15.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozMDk3Njk5NzY5NDYyNzE3OjE3MDMwMjA0NDQ6c3Bfc2VhcmNoX3RoZW1hdGljOjMwMDA5NjM5Mjk2MDAwMjo6Mjo6&url=%2FTUDIA-DualShield-MergeGrip-Shockproof-Protective%2Fdp%2FB0CDG4YH59%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%253Aamzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%26cv_ct_cx%3Doneplus%2Bcases%26keywords%3Doneplus%2Bcases%26pd_rd_i%3DB0CDG4YH59%26pd_rd_r%3D6c6b9626-0532-4430-b6ef-48f3cb49aff4%26pd_rd_w%3DT9Ezp%26pd_rd_wg%3DWUatq%26pf_rd_p%3D0c4cbb48-e433-4698-bba6-b3a5297e3e20%26pf_rd_r%3D9HXSM3344E4DY8FKFQAX%26qid%3D1703020444%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-19-f853d353-bf33-45e7-b5c2-2cb2b31abc9b-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',50,'2023-12-19 15:14:04.92477-06','2023-12-19 15:14:04.92477-06','www.amazon.com'), + (3891,'Case for OnePlus 11 5G Phone Case Hide Telescopic Folding with Ring Kickstand Shockproof Protective Cover ,with 1pcs Screen Protector Reinforced Corners TPU Blue',NULL,'B0CCRGQ1Z7','https://m.media-amazon.com/images/I/61gahnDDvZL._AC_UL320_.jpg',43,4.2,'$11.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozMDk3Njk5NzY5NDYyNzE3OjE3MDMwMjA0NDQ6c3Bfc2VhcmNoX3RoZW1hdGljOjMwMDAzNTA0NTg2NTIwMjo6Mzo6&url=%2FTelescopic-Kickstand-Shockproof-Protective-Reinforced%2Fdp%2FB0CCRGQ1Z7%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%253Aamzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%26cv_ct_cx%3Doneplus%2Bcases%26keywords%3Doneplus%2Bcases%26pd_rd_i%3DB0CCRGQ1Z7%26pd_rd_r%3D6c6b9626-0532-4430-b6ef-48f3cb49aff4%26pd_rd_w%3DT9Ezp%26pd_rd_wg%3DWUatq%26pf_rd_p%3D0c4cbb48-e433-4698-bba6-b3a5297e3e20%26pf_rd_r%3D9HXSM3344E4DY8FKFQAX%26qid%3D1703020444%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-20-f853d353-bf33-45e7-b5c2-2cb2b31abc9b-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',50,'2023-12-19 15:14:04.930732-06','2023-12-19 15:14:04.930732-06','www.amazon.com'), + (3887,'AKINIK for OnePlus Nord N200 5G Case with Slide Camera Cover and 2pcs HD Screen Protector, 360° Rotation Ring Kickstand [Military Grade] Case for OnePlus Nord N200 5G (Red)',NULL,'B0C84XKDHC','https://m.media-amazon.com/images/I/81Vs-B93ALL._AC_UL320_.jpg',16,4.6,'$9.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozMDk3Njk5NzY5NDYyNzE3OjE3MDMwMjA0NDQ6c3Bfc2VhcmNoX3RoZW1hdGljOjMwMDAxOTExOTU1NzYwMjo6NDo6&url=%2FAKINIK-OnePlus-Nord-N200-Case%2Fdp%2FB0C84XKDHC%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%253Aamzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%26cv_ct_cx%3Doneplus%2Bcases%26keywords%3Doneplus%2Bcases%26pd_rd_i%3DB0C84XKDHC%26pd_rd_r%3D6c6b9626-0532-4430-b6ef-48f3cb49aff4%26pd_rd_w%3DT9Ezp%26pd_rd_wg%3DWUatq%26pf_rd_p%3D0c4cbb48-e433-4698-bba6-b3a5297e3e20%26pf_rd_r%3D9HXSM3344E4DY8FKFQAX%26qid%3D1703020444%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-21-f853d353-bf33-45e7-b5c2-2cb2b31abc9b-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',50,'2023-12-19 15:14:04.905348-06','2023-12-19 15:14:04.937959-06','www.amazon.com'), + (3892,'TUDIA DualShield Grip Designed for OnePlus 11 Case 5G (2023), [MergeGrip] Dual Layer Shockproof Slim Military Grade Non-Slip Tough Heavy Duty Protective Phone Case Cover (Gray)',NULL,'B0BVTHVYL6','https://m.media-amazon.com/images/I/71JscUvnSUL._AC_UY218_.jpg',288,4.6,'$15.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/TUDIA-DualShield-MergeGrip-Shockproof-Protective/dp/B0BVTHVYL6/ref=cs_sr_dp_6?keywords=oneplus+cases&qid=1703020444&sr=8-22',50,'2023-12-19 15:14:04.944226-06','2023-12-19 15:14:04.944226-06','www.amazon.com'), + (3893,'for OnePlus Nord N20 5G Case with HD Screen Protector, Heavy Duty Shockproof Protective Case with Metal Kickstand [Military Grade] Protective Case for OnePlus Nord N20 5G, Black',NULL,'B0BCGHGZY9','https://m.media-amazon.com/images/I/81XSbeZPFLL._AC_UY218_.jpg',479,4.4,'$9.89','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/ATUMP-Protector-Shockproof-Protective-Kickstand/dp/B0BCGHGZY9/ref=cs_sr_dp?keywords=oneplus+cases&qid=1703020444&sr=8-23',50,'2023-12-19 15:14:04.949989-06','2023-12-19 15:14:04.949989-06','www.amazon.com'), + (4044,'Skechers',NULL,'B07J576K61','https://m.media-amazon.com/images/I/91CurXTesTL._AC_UL320_.jpg',12002,4.4,'$75.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Skechers-Moreno-Canvas-Oxford-Beige/dp/B07J576K61/ref=sr_1_34?keywords=men%27s+shoes&qid=1703020483&sr=8-34',53,'2023-12-19 15:14:44.956436-06','2023-12-19 15:14:44.956436-06','www.amazon.com'), + (3895,'for Oneplus Nord N20 5G Case with Tempered Glass Screen Protector [2 Pack] Military Grade Heavy Duty Full Body Durable Oneplus N20 5G Case with Built In 360°Adjustable Metal Ring Kickstand -SKY BLUE',NULL,'B0B244J99Z','https://m.media-amazon.com/images/I/71q9UPoLhDL._AC_UY218_.jpg',96,4.3,'$11.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Tempered-Protector-Military-360%C2%B0Adjustable-Kickstand/dp/B0B244J99Z/ref=cs_sr_dp_4?keywords=oneplus+cases&qid=1703020444&sr=8-25',50,'2023-12-19 15:14:04.962114-06','2023-12-19 15:14:04.962114-06','www.amazon.com'), + (3896,'Spigen Liquid Air Armor Designed for OnePlus 11 Case (2023) - Matte Black',NULL,'B0BJ8H232L','https://m.media-amazon.com/images/I/71bHgHSfhpL._AC_UY218_.jpg',269,4.1,'$12.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Spigen-Liquid-Armor-Designed-OnePlus/dp/B0BJ8H232L/ref=sr_1_26?keywords=oneplus+cases&qid=1703020444&sr=8-26',50,'2023-12-19 15:14:04.968352-06','2023-12-19 15:14:04.968352-06','www.amazon.com'), + (3897,'NZND Case for OnePlus Nord N30 5G / Nord CE 3 Lite 5G with Tempered Glass Screen Protector (Maximum Coverage), Full-Body Protective [Military-Grade], Magnetic Car Ring Holder Cover Case (Green)',NULL,'B0C8L17DR1','https://m.media-amazon.com/images/I/81khmEzhjxL._AC_UY218_.jpg',40,4.2,'$8.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxMzgzODg3MDg4OTg2NzE3OjE3MDMwMjA0NDQ6c3BfbXRmOjMwMDAwMzczMzg0MjEwMjo6MDo6&url=%2FNZND-Protector-Full-Body-Protective-Military-Grade%2Fdp%2FB0C8L17DR1%2Fref%3Dsr_1_27_sspa%3Fkeywords%3Doneplus%2Bcases%26qid%3D1703020444%26sr%3D8-27-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',50,'2023-12-19 15:14:04.975237-06','2023-12-19 15:14:04.975237-06','www.amazon.com'), + (3898,'Cresee Case for OnePlus 11 5G, Thin Clear Cover with Camera Protection Slim Shockproof Flexible TPU Phone Case for OnePlus 11 - Transparent',NULL,'B0BVFTJ61C','https://m.media-amazon.com/images/I/7152lH6+tPL._AC_UY218_.jpg',128,4.4,'$8.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Cresee-OnePlus-Protection-Shockproof-Flexible/dp/B0BVFTJ61C/ref=cs_sr_dp_3?keywords=oneplus+cases&qid=1703020444&sr=8-29',50,'2023-12-19 15:14:04.981496-06','2023-12-19 15:14:04.981496-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3899,'ExoGuard for OnePlus Nord N200 5G Case, Rubber Shockproof Full-Body Cover Case Built-in Screen Protector and Kickstand Compatible with OnePlus Nord N200 Phone (Red)',NULL,'B096DX1CJR','https://m.media-amazon.com/images/I/71bTCiM-evS._AC_UY218_.jpg',592,4.4,'$19.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/ExoGuard-Shockproof-Full-Body-Protector-Compatible/dp/B096DX1CJR/ref=cs_sr_dp?keywords=oneplus+cases&qid=1703020444&sr=8-30',50,'2023-12-19 15:14:04.988313-06','2023-12-19 15:14:04.988313-06','www.amazon.com'), + (3900,'Poetic Revolution Series Case for OnePlus Nord N10 5G, Full-Body Rugged Dual-Layer Shockproof Protective Cover with Kickstand and Built-in-Screen Protector, Black',NULL,'B08TH7C5CB','https://m.media-amazon.com/images/I/814-jzazT8L._AC_UY218_.jpg',1843,4.6,'$18.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Poetic-Revolution-Dual-Layer-Shockproof-Protective/dp/B08TH7C5CB/ref=sr_1_31?keywords=oneplus+cases&qid=1703020444&sr=8-31',50,'2023-12-19 15:14:04.995403-06','2023-12-19 15:14:04.995403-06','www.amazon.com'), + (3901,'seacosmo Case for OnePlus Nord N10 5G, Full Body Shockproof Cover [with Built-in Screen Protector] Slim Fit Bumper Protective Case for 1+ Nord N10 5G, Black/Clear',NULL,'B09268WXGW','https://m.media-amazon.com/images/I/61cE2vzBkIL._AC_UY218_.jpg',487,4.1,'$13.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/seacosmo-OnePlus-Shockproof-Protector-Protective/dp/B09268WXGW/ref=sr_1_32?keywords=oneplus+cases&qid=1703020444&sr=8-32',50,'2023-12-19 15:14:05.001644-06','2023-12-19 15:14:05.001644-06','www.amazon.com'), + (3902,'YQODSZ for OnePlus Open Case with Magnetic Hinge Protection, [Built in Screen Protector] [Camera Protector] All-Inclusive OnePlus Open Phone Case Slim Hard PC OnePlus Open Kickstand Case Black',NULL,'B0CN77MRDL','https://m.media-amazon.com/images/I/51ozpnUtvKL._AC_UY218_.jpg',3,4.6,'$28.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/YQODSZ-OnePlus-Open-Case-Kickstand/dp/B0CN77MRDL/ref=cs_sr_dp_3?keywords=oneplus+cases&qid=1703020444&sr=8-33',50,'2023-12-19 15:14:05.008811-06','2023-12-19 15:14:05.008811-06','www.amazon.com'), + (3903,'Dretal for OnePlus Nord N300 5G Case + Tempered Glass Screen Protector with Kickstand & Slide Lens Protector Cover,Heavy Duty Armor Shockproof Rugged Military Grade Protective Case(Black',NULL,'B0BKQ3JGN4','https://m.media-amazon.com/images/I/710c92D+azL._AC_UY218_.jpg',193,4.2,'$7.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Tempered-Protector-Kickstand-Shockproof-Protective/dp/B0BKQ3JGN4/ref=cs_sr_dp_3?keywords=oneplus+cases&qid=1703020444&sr=8-34',50,'2023-12-19 15:14:05.014656-06','2023-12-19 15:14:05.014656-06','www.amazon.com'), + (4045,'Skechers',NULL,'B07YQNQJ73','https://m.media-amazon.com/images/I/81C5ohx8YyL._AC_UL320_.jpg',4711,4.6,'$28.77','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Skechers-mens-Walk-Max-Clinched/dp/B07YQNQJ73/ref=sr_1_35?keywords=men%27s+shoes&qid=1703020483&sr=8-35',53,'2023-12-19 15:14:44.967255-06','2023-12-19 15:14:44.967255-06','www.amazon.com'), + (3904,'Poetic Revolution Series Case for Oneplus Nord N200 5G, Full-Body Rugged Dual-Layer Shockproof Protective Cover with Kickstand and Built-in Screen Protector, Black',NULL,'B099DP59W5','https://m.media-amazon.com/images/I/71AIv6B5HhL._AC_UY218_.jpg',515,4.6,'$17.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Poetic-Revolution-Dual-Layer-Shockproof-Protective/dp/B099DP59W5/ref=cs_sr_dp_2?keywords=oneplus+cases&qid=1703020444&sr=8-35',50,'2023-12-19 15:14:05.022296-06','2023-12-19 15:14:05.022296-06','www.amazon.com'), + (3905,'seacosmo Case for Oneplus Nord N100, Full Body Shockproof Cover with Built-in Screen Protector, Slim Fit Bumper Protective Case for 1+ Nord N100- Black/Clear',NULL,'B096ZJSQGQ','https://m.media-amazon.com/images/I/71qundVQL-L._AC_UY218_.jpg',286,4.4,'$13.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/seacosmo-Oneplus-Shockproof-Protector-Protective/dp/B096ZJSQGQ/ref=sr_1_36?keywords=oneplus+cases&qid=1703020444&sr=8-36',50,'2023-12-19 15:14:05.02893-06','2023-12-19 15:14:05.02893-06','www.amazon.com'), + (3906,'Encased DuraClip Designed for OnePlus Nord N20 5G Belt Case - Slim Phone Cover with Kickstand and Holster Clip (Black)',NULL,'B0B3GKT8J6','https://m.media-amazon.com/images/I/81NtUVHaK3L._AC_UY218_.jpg',27,4.2,'$14.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxMzgzODg3MDg4OTg2NzE3OjE3MDMwMjA0NDQ6c3BfYnRmOjIwMDA2MzIxODkwNzI5ODo6MDo6&url=%2FEncased-DuraClip-Designed-OnePlus-Nord%2Fdp%2FB0B3GKT8J6%2Fref%3Dsr_1_37_sspa%3Fkeywords%3Doneplus%2Bcases%26qid%3D1703020444%26sr%3D8-37-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9idGY%26psc%3D1',50,'2023-12-19 15:14:05.034945-06','2023-12-19 15:14:05.034945-06','www.amazon.com'), + (3907,'TUDIA DualShield Grip Designed for OnePlus Nord N30 5G Case (2023), [MergeGrip] Dual Layer Shockproof Slim Military Grade Non-Slip Tough Heavy Duty Protective Phone Case Cover (Matte Black)',NULL,'B0CDG8P143','https://m.media-amazon.com/images/I/71ybgHRgboL._AC_UY218_.jpg',19,4.4,'$15.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxMzgzODg3MDg4OTg2NzE3OjE3MDMwMjA0NDQ6c3BfYnRmOjMwMDA5NjM5Mjk1OTkwMjo6MDo6&url=%2FTUDIA-DualShield-MergeGrip-Shockproof-Protective%2Fdp%2FB0CDG8P143%2Fref%3Dsr_1_38_sspa%3Fkeywords%3Doneplus%2Bcases%26qid%3D1703020444%26sr%3D8-38-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9idGY%26psc%3D1',50,'2023-12-19 15:14:05.042099-06','2023-12-19 15:14:05.042099-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3908,'OnePlus 7 Pro Case Military Protection with Built-in 360 Rotation Kickstand Support Car Magnetic Holder for OnePlus 7 Pro 6.67" Blue',NULL,'B08FB3SPWC','https://aax-us-iad.amazon.com/e/loi/imp?b=JN9r_mCVB0xJNcwifKnqCusAAAGMg-254AEAAAH2AQBvbm9fdHhuX2JpZDcgICBvbm9fdHhuX2ltcDEgICDRCMnR',610,4.2,'$15.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.comhttps://aax-us-iad.amazon.com/x/c/RN9r_mCVB0xJNcwifKnqCusAAAGMg-25sAEAAAH2AQBvbm9fdHhuX2JpZDcgICBvbm9fdHhuX2ltcDEgICDRCMnR/https://www.amazon.com/Military-Protection-Rotation-Kickstand-Magnetic/dp/B08FB3SPWC/ref=sxbs_sbv_search_btf?content-id=amzn1.sym.2066ba78-527e-4aed-9de4-3ba096deb87b%3Aamzn1.sym.2066ba78-527e-4aed-9de4-3ba096deb87b&cv_ct_cx=oneplus+cases&keywords=oneplus+cases&pd_rd_i=B08FB3SPWC&pd_rd_r=8213246f-c011-49fb-b2e9-5757b3861542&pd_rd_w=fcCLq&pd_rd_wg=XtXle&pf_rd_p=2066ba78-527e-4aed-9de4-3ba096deb87b&pf_rd_r=9HXSM3344E4DY8FKFQAX&qid=1703020444&sbo=RZvfv%2F%2FHxDF%2BO5021pAnSA%3D%3D&sr=1-17-48f7baba-8e26-45f3-8811-e1a601ad20bf',50,'2023-12-19 15:14:05.048764-06','2023-12-19 15:14:05.048764-06','www.amazon.comhttps:'), + (3909,'i-Blason Armorbox Series for Google Pixel 8 Pro Case with Kickstand & Belt Clip, Full-Body Rugged Anti-Slip Bumper Case with Built-in Screen Protector [Support Fingerprint ID] (Black)',NULL,'B0CKWVZ6YT','https://m.media-amazon.com/images/I/81oKeRE2KBL._AC_UY218_.jpg',6,4.6,'$23.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo2ODc2NTc4ODk3NzI0NzE3OjE3MDMwMjA0NTA6c3BfYXRmOjMwMDA4MjkxOTI4MDkwMjo6MDo6&url=%2Fi-Blason-Kickstand-Full-Body-Anti-Slip-Fingerprint%2Fdp%2FB0CKWVZ6YT%2Fref%3Dsr_1_1_sspa%3Fkeywords%3Dpixel%2Bcases%26qid%3D1703020450%26sr%3D8-1-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGY%26psc%3D1',51,'2023-12-19 15:14:11.675448-06','2023-12-19 15:14:11.675448-06','www.amazon.com'), + (3910,'ZZXX Google Pixel 8 Wallet Case with [RFID Blocking] Card Slot Kickstand Magnetic Closure Leather Flip Fold Protective Phone Case for Google Pixel 8 Case Wallet(Grey-6.3 inch)',NULL,'B0C6QD1P7M','https://m.media-amazon.com/images/I/91twC0ZppoL._AC_UY218_.jpg',2,5.0,'$18.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo2ODc2NTc4ODk3NzI0NzE3OjE3MDMwMjA0NTA6c3BfYXRmOjMwMDA5MDA2MDUxNDYwMjo6MDo6&url=%2FZZXX-Google-Pixel-Kickstand-Protective%2Fdp%2FB0C6QD1P7M%2Fref%3Dsr_1_2_sspa%3Fkeywords%3Dpixel%2Bcases%26qid%3D1703020450%26sr%3D8-2-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGY%26psc%3D1',51,'2023-12-19 15:14:11.684038-06','2023-12-19 15:14:11.684038-06','www.amazon.com'), + (3911,'Humixx for Google Pixel 8 Pro Case [Military Grade Drop Tested] [Ultimate Silky Touch] Shockproof Anti-Fingerprints Translucent Matte Hard Back Protective Slim Phone Case for Pixel 8 Pro 6.7” Black',NULL,'B0CGTQLSQ6','https://m.media-amazon.com/images/I/61358P92fyL._AC_UY218_.jpg',99,4.5,'$18.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Humixx-Google-Pixel-Pro-Anti-Fingerprints/dp/B0CGTQLSQ6/ref=sr_1_3?keywords=pixel+cases&qid=1703020450&sr=8-3',51,'2023-12-19 15:14:11.690587-06','2023-12-19 15:14:11.690587-06','www.amazon.com'), + (3912,'GONEZ Compatible with Google Pixel 8 Case, Liquid Silicone Case with 2x Screen Protectors, Full Body Protective Cover, Shockproof, Slim Phone Case, Anti-Scratch Soft Microfiber Lining 6.2", Stone/Gray',NULL,'B0CJ2K7SDG','https://m.media-amazon.com/images/I/61Q4q+CaLmL._AC_UY218_.jpg',53,4.1,'$9.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/GONEZ-Compatible-Protectors-Protective-Anti-Scratch/dp/B0CJ2K7SDG/ref=cs_sr_dp_n?keywords=pixel+cases&qid=1703020450&sr=8-4',51,'2023-12-19 15:14:11.69812-06','2023-12-19 15:14:11.69812-06','www.amazon.com'), + (3913,'Oterkin for Google Pixel 8 Case Clear, [20X Anti-Yellowing] Pixel 8 Case with [2Pcs Tempered Glass Screen Protector][Built-in 4 Airbags][10FT Military Protection] Google Pixel 8 Phone Case (Clear)',NULL,'B0CL986N8B','https://m.media-amazon.com/images/I/71NJgSaTAYL._AC_UY218_.jpg',162,4.3,'$12.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Oterkin-Pixel-Case-Anti-Yellowing-Protection/dp/B0CL986N8B/ref=cs_sr_dp_6?keywords=pixel+cases&qid=1703020450&sr=8-5',51,'2023-12-19 15:14:11.707117-06','2023-12-19 15:14:11.707117-06','www.amazon.com'), + (4578,'Orzly Carry Case Compatible with Nintendo Switch and New Switch OLED Console - Black Protective Hard Portable Travel Carry Case Shell Pouch with Pockets for Accessories and Games',NULL,'B01NAUKS62','https://m.media-amazon.com/images/I/71oOxt0LKiL._AC_UL320_.jpg',62129,4.7,'$23.91','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Orzly-Carry-Case-Compatible-Nintendo-Switch/dp/B01NAUKS62/ref=sr_1_82?keywords=travel+accessories&qid=1703020686&sr=8-82',57,'2023-12-19 15:18:08.035122-06','2023-12-19 15:18:08.035122-06','www.amazon.com'), + (3915,'Poetic Guardian Series Case Designed for Google Pixel 7 5G with Built-in Screen Protector, Work with Fingerprint ID, Full Body Hybrid Shockproof Rugged Cover Case, Black/Clear',NULL,'B0BJTYGQS2','https://m.media-amazon.com/images/I/61xgM0DYpoL._AC_UL320_.jpg',176,4.5,'$16.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozMTY5MzE3MTM2NTA0NzE3OjE3MDMwMjA0NTA6c3Bfc2VhcmNoX3RoZW1hdGljOjIwMDEwMzU1NzMyMzQ5ODo6MDo6&url=%2FPoetic-Guardian-Protector-Fingerprint-Shockproof%2Fdp%2FB0BJTYGQS2%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.d0d6e7d3-c9f1-480b-9f2a-893b95951bfb%253Aamzn1.sym.d0d6e7d3-c9f1-480b-9f2a-893b95951bfb%26cv_ct_cx%3Dpixel%2Bcases%26keywords%3Dpixel%2Bcases%26pd_rd_i%3DB0BJTYGQS2%26pd_rd_r%3D7dfa77b4-d6a2-4e7e-8dc8-82026c4a4918%26pd_rd_w%3DFKcEv%26pd_rd_wg%3DwuA3W%26pf_rd_p%3Dd0d6e7d3-c9f1-480b-9f2a-893b95951bfb%26pf_rd_r%3DVP3B92DK8NDND9JNRB2D%26qid%3D1703020450%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-1-2c727eeb-987f-452f-86bd-c2978cc9d8b9-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',51,'2023-12-19 15:14:11.720082-06','2023-12-19 15:14:11.720082-06','www.amazon.com'), + (3916,'i-Blason Cosmo Series Case for Google Pixel 6a (2022 Release), Slim Full-Body Stylish Protective Case with Built-in Screen Protector (Marble)',NULL,'B0B9LZQQYP','https://m.media-amazon.com/images/I/71zbL8NzOhL._AC_UL320_.jpg',139,4.4,'$21.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozMTY5MzE3MTM2NTA0NzE3OjE3MDMwMjA0NTA6c3Bfc2VhcmNoX3RoZW1hdGljOjIwMDA5MzI1Mjg3NTA5ODo6MTo6&url=%2Fi-Blason-Release-Full-Body-Protective-Protector%2Fdp%2FB0B9LZQQYP%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.d0d6e7d3-c9f1-480b-9f2a-893b95951bfb%253Aamzn1.sym.d0d6e7d3-c9f1-480b-9f2a-893b95951bfb%26cv_ct_cx%3Dpixel%2Bcases%26keywords%3Dpixel%2Bcases%26pd_rd_i%3DB0B9LZQQYP%26pd_rd_r%3D7dfa77b4-d6a2-4e7e-8dc8-82026c4a4918%26pd_rd_w%3DFKcEv%26pd_rd_wg%3DwuA3W%26pf_rd_p%3Dd0d6e7d3-c9f1-480b-9f2a-893b95951bfb%26pf_rd_r%3DVP3B92DK8NDND9JNRB2D%26qid%3D1703020450%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-2-2c727eeb-987f-452f-86bd-c2978cc9d8b9-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',51,'2023-12-19 15:14:11.72679-06','2023-12-19 15:14:11.72679-06','www.amazon.com'), + (3917,'i-Blason Cosmo Series for Google Pixel 7 Pro Case (2022), Slim Full-Body Stylish Protective Case with Built-in Screen Protector (Ocean)',NULL,'B0BDFCGNC7','https://m.media-amazon.com/images/I/81YGa786I+L._AC_UL320_.jpg',570,4.5,'$22.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozMTY5MzE3MTM2NTA0NzE3OjE3MDMwMjA0NTA6c3Bfc2VhcmNoX3RoZW1hdGljOjIwMDA5NjM1OTc0MjQ5ODo6Mjo6&url=%2Fi-Blason-Full-Body-Stylish-Protective-Protector%2Fdp%2FB0BDFCGNC7%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.d0d6e7d3-c9f1-480b-9f2a-893b95951bfb%253Aamzn1.sym.d0d6e7d3-c9f1-480b-9f2a-893b95951bfb%26cv_ct_cx%3Dpixel%2Bcases%26keywords%3Dpixel%2Bcases%26pd_rd_i%3DB0BDFCGNC7%26pd_rd_r%3D7dfa77b4-d6a2-4e7e-8dc8-82026c4a4918%26pd_rd_w%3DFKcEv%26pd_rd_wg%3DwuA3W%26pf_rd_p%3Dd0d6e7d3-c9f1-480b-9f2a-893b95951bfb%26pf_rd_r%3DVP3B92DK8NDND9JNRB2D%26qid%3D1703020450%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-3-2c727eeb-987f-452f-86bd-c2978cc9d8b9-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',51,'2023-12-19 15:14:11.734288-06','2023-12-19 15:14:11.734288-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4046,'adidas',NULL,'B09VCHRRV8','https://m.media-amazon.com/images/I/71rLqRMkt0L._AC_UL320_.jpg',429,4.2,'$99.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/adidas-Terrex-Sneaker-Black-Carbon/dp/B09VCHRRV8/ref=sr_1_36?keywords=men%27s+shoes&qid=1703020483&sr=8-36',53,'2023-12-19 15:14:44.975197-06','2023-12-19 15:14:44.975197-06','www.amazon.com'), + (4579,'Rightline Gear Range Jr Weatherproof Rooftop Cargo Carrier for Top of Vehicle, Attaches With or Without Roof Rack, 10 Cubic Feet, Black',NULL,'B0006IEH78','https://m.media-amazon.com/images/I/81Z7YS7cFHL._AC_UL320_.jpg',563,4.3,'$69.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Rightline-Gear-100R50-Range-Carrier/dp/B0006IEH78/ref=sr_1_83?keywords=travel+accessories&qid=1703020686&sr=8-83',57,'2023-12-19 15:18:08.041378-06','2023-12-19 15:18:08.041378-06','www.amazon.com'), + (3918,'i-Blason Cosmo Series for Google Pixel 7 Case (2022), Slim Full-Body Stylish Protective Case with Built-in Screen Protector (Marble)',NULL,'B0BD6JCNSV','https://m.media-amazon.com/images/I/71jyu0LcK0L._AC_UL320_.jpg',318,4.5,'$21.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozMTY5MzE3MTM2NTA0NzE3OjE3MDMwMjA0NTA6c3Bfc2VhcmNoX3RoZW1hdGljOjIwMDA5NjM2NzY5NTQ5ODo6Mzo6&url=%2Fi-Blason-Full-Body-Stylish-Protective-Protector%2Fdp%2FB0BD6JCNSV%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.d0d6e7d3-c9f1-480b-9f2a-893b95951bfb%253Aamzn1.sym.d0d6e7d3-c9f1-480b-9f2a-893b95951bfb%26cv_ct_cx%3Dpixel%2Bcases%26keywords%3Dpixel%2Bcases%26pd_rd_i%3DB0BD6JCNSV%26pd_rd_r%3D7dfa77b4-d6a2-4e7e-8dc8-82026c4a4918%26pd_rd_w%3DFKcEv%26pd_rd_wg%3DwuA3W%26pf_rd_p%3Dd0d6e7d3-c9f1-480b-9f2a-893b95951bfb%26pf_rd_r%3DVP3B92DK8NDND9JNRB2D%26qid%3D1703020450%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-4-2c727eeb-987f-452f-86bd-c2978cc9d8b9-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',51,'2023-12-19 15:14:11.74111-06','2023-12-19 15:14:11.74111-06','www.amazon.com'), + (3914,'SUPCASE Unicorn Beetle Pro Series Case for Google Pixel 7 Pro (2022 Release), Full-Body Rugged Belt-Clip & Kickstand Case with Built-in Screen Protector (Black)',NULL,'B0B4VLHLB1','https://m.media-amazon.com/images/I/71DxptxK3FL._AC_UL320_.jpg',850,4.3,'$24.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozMTY5MzE3MTM2NTA0NzE3OjE3MDMwMjA0NTA6c3Bfc2VhcmNoX3RoZW1hdGljOjIwMDA5MzA5OTY2NzQ5ODo6NDo6&url=%2FSUPCASE-Full-Body-Belt-Clip-Kickstand-Protector%2Fdp%2FB0B4VLHLB1%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.d0d6e7d3-c9f1-480b-9f2a-893b95951bfb%253Aamzn1.sym.d0d6e7d3-c9f1-480b-9f2a-893b95951bfb%26cv_ct_cx%3Dpixel%2Bcases%26keywords%3Dpixel%2Bcases%26pd_rd_i%3DB0B4VLHLB1%26pd_rd_r%3D7dfa77b4-d6a2-4e7e-8dc8-82026c4a4918%26pd_rd_w%3DFKcEv%26pd_rd_wg%3DwuA3W%26pf_rd_p%3Dd0d6e7d3-c9f1-480b-9f2a-893b95951bfb%26pf_rd_r%3DVP3B92DK8NDND9JNRB2D%26qid%3D1703020450%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-5-2c727eeb-987f-452f-86bd-c2978cc9d8b9-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',51,'2023-12-19 15:14:11.713924-06','2023-12-19 15:14:11.747063-06','www.amazon.com'), + (3919,'Google Pixel 8 Case - Durable Protection - Stain-Resistant Silicone - Android Phone Case - Hazel',NULL,'B0CGVR48TG','https://m.media-amazon.com/images/I/51nL6RcpyDL._AC_UY218_.jpg',111,4.5,'$34.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Google-Pixel-Case-Protection-Stain-Resistant/dp/B0CGVR48TG/ref=cs_sr_dp_4?keywords=pixel+cases&qid=1703020450&sr=8-6',51,'2023-12-19 15:14:11.754916-06','2023-12-19 15:14:11.754916-06','www.amazon.com'), + (3920,'Crave Dual Guard for Google Pixel 6, Shockproof Protection Dual Layer Case for Google Pixel 6 - Forest Green',NULL,'B09CLKZJMD','https://m.media-amazon.com/images/I/81uCsr2PMnL._AC_UY218_.jpg',6587,4.5,'$15.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Crave-Guard-Google-Shockproof-Protection/dp/B09CLKZJMD/ref=cs_sr_dp_n?keywords=pixel+cases&qid=1703020450&sr=8-7',51,'2023-12-19 15:14:11.761633-06','2023-12-19 15:14:11.761633-06','www.amazon.com'), + (3921,'Spigen Liquid Air Armor Designed for Pixel 8 Pro Case (2023) - Matte Black',NULL,'B0BZ5TQG4C','https://m.media-amazon.com/images/I/71NCAq8yHmL._AC_UY218_.jpg',561,4.7,'$15.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Spigen-Liquid-Armor-Designed-MP671/dp/B0BZ5TQG4C/ref=cs_sr_dp_3?keywords=pixel+cases&qid=1703020450&sr=8-8',51,'2023-12-19 15:14:11.76914-06','2023-12-19 15:14:11.76914-06','www.amazon.com'), + (3922,'Cresee Case for Google Pixel 8 Pro, Clear Cover with Reinforced Corner Bumper Slim Fit Shockproof Flexible TPU Case for Pixel 8 Pro - Transparent',NULL,'B0CH8JR5X3','https://m.media-amazon.com/images/I/71vzMHLgAkL._AC_UY218_.jpg',3,5.0,'$8.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Cresee-Google-Reinforced-Shockproof-Flexible/dp/B0CH8JR5X3/ref=cs_sr_dp_2?keywords=pixel+cases&qid=1703020450&sr=8-9',51,'2023-12-19 15:14:11.775764-06','2023-12-19 15:14:11.775764-06','www.amazon.com'), + (3923,'Spigen Ultra Hybrid Designed for Pixel 8 Pro Case (2023) - Crystal Clear',NULL,'B0BZ5PVX2C','https://m.media-amazon.com/images/I/61CBrlxVNfL._AC_UY218_.jpg',505,4.5,'$15.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Spigen-Ultra-Hybrid-Designed-MP671/dp/B0BZ5PVX2C/ref=cs_sr_dp_3?keywords=pixel+cases&qid=1703020450&sr=8-10',51,'2023-12-19 15:14:11.782223-06','2023-12-19 15:14:11.782223-06','www.amazon.com'), + (3924,'Janmitta for Google Pixel 8 Case with Screen Protector + Camera Lens Protector,Heavy Duty Shockproof Full Body Protective Cover Built in Rotatable Metal Ring Holder Kickstand,2023 Mint Green',NULL,'B0C8SYZX33','https://m.media-amazon.com/images/I/71Ww570xLWL._AC_UY218_.jpg',2025,4.4,'$12.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Janmitta-Google-Pixel-Shockproof-Protective/dp/B0C8SYZX33/ref=cs_sr_dp_n?keywords=pixel+cases&qid=1703020450&sr=8-11',51,'2023-12-19 15:14:11.789542-06','2023-12-19 15:14:11.789542-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3934,'NEWDERY 10000mAh Battery Case for Google Pixel 7 Pro, Ultra Powerful Rechargeable Charger, Protective Extended Backup - Black',NULL,'B0BL7Y73GB','https://m.media-amazon.com/images/I/71HEWqZcddL._AC_UY218_.jpg',137,3.5,'$49.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo2ODc2NTc4ODk3NzI0NzE3OjE3MDMwMjA0NTA6c3BfYnRmOjMwMDA1ODc3MjQ2NzEwMjo6MDo6&url=%2FNEWDERY-10000mAh-Powerful-Rechargeable-Protective%2Fdp%2FB0BL7Y73GB%2Fref%3Dsr_1_22_sspa%3Fkeywords%3Dpixel%2Bcases%26qid%3D1703020450%26sr%3D8-22-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9idGY%26psc%3D1',51,'2023-12-19 15:14:11.86382-06','2023-12-19 15:14:11.86382-06','www.amazon.com'), + (4580,'Add-A-Bag Luggage Strap Jacket Gripper, Luggage Straps Baggage Suitcase Belts Travel Accessories - Make Your Hands Free, Easy to Carry Your Extra Bags, (1x Black+1x Grey)',NULL,'B0B5H3DFZH','https://m.media-amazon.com/images/I/61aQo-SptCL._AC_UL320_.jpg',1295,4.4,'$11.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Luggage-Gripper-Baggage-Suitcase-Accessories/dp/B0B5H3DFZH/ref=sr_1_85?keywords=travel+accessories&qid=1703020686&sr=8-85',57,'2023-12-19 15:18:08.046789-06','2023-12-19 15:18:08.046789-06','www.amazon.com'), + (3926,'DEERLAMN for Google Pixel 8 Pro Case with Slide Camera Cover+Screen Protector (1 Pack), Rotated Ring Kickstand Military Grade Shockproof Heavy Duty Protective Cover -Black',NULL,'B0C6K47ZDT','https://m.media-amazon.com/images/I/71YeI1IHfRL._AC_UY218_.jpg',151,4.2,'$14.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/DEERLAMN-Protector-Kickstand-Shockproof-Protective/dp/B0C6K47ZDT/ref=cs_sr_dp_n?keywords=pixel+cases&qid=1703020450&sr=8-13',51,'2023-12-19 15:14:11.803666-06','2023-12-19 15:14:11.803666-06','www.amazon.com'), + (3927,'Crave Dual Guard for Google Pixel 7 Case, Shockproof Protection Dual Layer Case for Google Pixel 7 - Forest Green',NULL,'B0BC8RYLNN','https://m.media-amazon.com/images/I/81Tc6kVSXXL._AC_UY218_.jpg',1585,4.7,'$17.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Crave-Guard-Google-Shockproof-Protection/dp/B0BC8RYLNN/ref=cs_sr_dp_n?keywords=pixel+cases&qid=1703020450&sr=8-14',51,'2023-12-19 15:14:11.81138-06','2023-12-19 15:14:11.81138-06','www.amazon.com'), + (3928,'Caseology Parallax 3D Ergonomic Design Case Compatible with Google Pixel 8 case 5G [Military Grade Drop Tested](2023) - Burgundy',NULL,'B0BZ72DVFK','https://m.media-amazon.com/images/I/61Dde2zB6-L._AC_UY218_.jpg',98,4.6,'$16.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Caseology-Parallax-Protective-Compatible-Military/dp/B0BZ72DVFK/ref=cs_sr_dp_3?keywords=pixel+cases&qid=1703020450&sr=8-15',51,'2023-12-19 15:14:11.817948-06','2023-12-19 15:14:11.817948-06','www.amazon.com'), + (3929,'OTOFLY Designed for Pixel 8 Pro Case, Silicone Shockproof Slim Thin Phone Case for Google Pixel 8 Pro 6.7 inch (Pine Green)',NULL,'B0CGLRLTM6','https://m.media-amazon.com/images/I/61XUhwc8OGL._AC_UY218_.jpg',362,4.4,'$14.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/OTOFLY-Designed-Silicone-Shockproof-Green/dp/B0CGLRLTM6/ref=cs_sr_dp_n?keywords=pixel+cases&qid=1703020450&sr=8-16',51,'2023-12-19 15:14:11.825731-06','2023-12-19 15:14:11.825731-06','www.amazon.com'), + (3930,'Humixx Shockproof Designed for Google Pixel 7 Case [Military Grade Drop Tested] [Ultimate Silky Touch] Translucent Hard Back Protective Slim Thin Matte Black Phone Cases for Pixel 7 5G 6.1”',NULL,'B0C7S756SW','https://m.media-amazon.com/images/I/71HMlaHVQCL._AC_UY218_.jpg',737,4.6,'$16.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Humixx-Translucent-Protection-Anti-Fingerprint-Shockproof/dp/B0C7S756SW/ref=cs_sr_dp_2?keywords=pixel+cases&qid=1703020450&sr=8-18',51,'2023-12-19 15:14:11.832499-06','2023-12-19 15:14:11.832499-06','www.amazon.com'), + (3931,'TAURI for Google Pixel 8 Pro Case, [5 in 1] 1X Clear Case [Not-Yellowing] with 2X TPU Film Screen Protector + 2X Camera Lens Protector, [Military Grade Protection] Slim Case for Pixel 8 Pro',NULL,'B0CHM29R9J','https://m.media-amazon.com/images/I/714zBGOytqL._AC_UY218_.jpg',2834,4.4,'$15.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/TAURI-Pixel-Pro-Not-Yellowing-Protection/dp/B0CHM29R9J/ref=cs_sr_dp?keywords=pixel+cases&qid=1703020450&sr=8-19',51,'2023-12-19 15:14:11.840097-06','2023-12-19 15:14:11.840097-06','www.amazon.com'), + (3932,'Spigen Ultra Hybrid [Anti-Yellowing Technology] Designed for Pixel 7 Case (2022) - Crystal Clear',NULL,'B09YMVP2BG','https://m.media-amazon.com/images/I/61D88K-UYkL._AC_UY218_.jpg',2677,4.4,'$15.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Spigen-Hybrid-Anti-Yellowing-Technology-Designed/dp/B09YMVP2BG/ref=cs_sr_dp_2?keywords=pixel+cases&qid=1703020450&sr=8-20',51,'2023-12-19 15:14:11.84899-06','2023-12-19 15:14:11.84899-06','www.amazon.com'), + (3933,'Thinborne Compatible with Google Pixel 8 Pro Case, [Made of 600D Aramid Fiber] [Unbelievable Thin and Slim] [Minimalist Style with Carbon Fiber Textures] [ Free Screen Protector]',NULL,'B0CHL5QFTM','https://m.media-amazon.com/images/I/61eR1wDhmIL._AC_UY218_.jpg',38,4.8,'$39.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo2ODc2NTc4ODk3NzI0NzE3OjE3MDMwMjA0NTA6c3BfYnRmOjMwMDA3Mzk0OTE5MDAwMjo6MDo6&url=%2FThinborne-Compatible-Unbelievable-Minimalist-Protector%2Fdp%2FB0CHL5QFTM%2Fref%3Dsr_1_21_sspa%3Fkeywords%3Dpixel%2Bcases%26qid%3D1703020450%26sr%3D8-21-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9idGY%26psc%3D1',51,'2023-12-19 15:14:11.857153-06','2023-12-19 15:14:11.857153-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4047,'Skechers',NULL,'B000PRLDMC','https://m.media-amazon.com/images/I/81ertdte74L._AC_UL320_.jpg',20808,4.5,'$59.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Skechers-Energy-Afterburn-Lace-Up-Sneaker/dp/B000PRLDMC/ref=sr_1_37?keywords=men%27s+shoes&qid=1703020483&sr=8-37',53,'2023-12-19 15:14:44.981743-06','2023-12-19 15:14:44.981743-06','www.amazon.com'), + (3925,'Crave Slim Guard for Pixel 5a Case, Shockproof Case for Google Pixel 5a 5G - Forest Green',NULL,'B08ZHQY2TG','https://aax-us-iad.amazon.com/e/loi/imp?b=JDJekRZ4j_YBB3XbsLKNuOMAAAGMg-3URQEAAAH2AQBvbm9fdHhuX2JpZDEgICBvbm9fdHhuX2ltcDEgICBEx188',692,4.4,'$15.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.comhttps://aax-us-iad.amazon.com/x/c/RKkFnWUOvKYLrn3GdldcCL0AAAGMg-3T_AEAAAH2AQBvbm9fdHhuX2JpZDUgICBvbm9fdHhuX2ltcDEgICBk_LjC/https://www.amazon.com/Crave-Guard-Pixel-Shockproof-Google/dp/B08ZHQY2TG/ref=sxin_23_sbv_search_btf?content-id=amzn1.sym.6ca944f8-539c-499e-a3a4-26a566d1de59%3Aamzn1.sym.6ca944f8-539c-499e-a3a4-26a566d1de59&cv_ct_cx=pixel+cases&keywords=pixel+cases&pd_rd_i=B08ZHQY2TG&pd_rd_r=7dfa77b4-d6a2-4e7e-8dc8-82026c4a4918&pd_rd_w=QpqqT&pd_rd_wg=wuA3W&pf_rd_p=6ca944f8-539c-499e-a3a4-26a566d1de59&pf_rd_r=VP3B92DK8NDND9JNRB2D&qid=1703020450&sbo=RZvfv%2F%2FHxDF%2BO5021pAnSA%3D%3D&sr=1-1-5190daf0-67e3-427c-bea6-c72c1df98776',51,'2023-12-19 15:14:11.796802-06','2023-12-19 15:14:11.870377-06','www.amazon.comhttps:'), + (4581,'1Pack Travel Pill Organizer, 8 Compartments Portable Pill Case, Small Pill Box for Pocket Purse Portable Medicine Vitamin Container Beige',NULL,'B0BLZM9NCF','https://m.media-amazon.com/images/I/61+9-yC3nQL._AC_UL320_.jpg',6621,4.4,'$3.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Organizer-Compartments-Portable-Medicine-Container/dp/B0BLZM9NCF/ref=sr_1_86?keywords=travel+accessories&qid=1703020686&sr=8-86',57,'2023-12-19 15:18:08.053397-06','2023-12-19 15:18:08.053397-06','www.amazon.com'), + (3936,'DagoRoo for Pixel 8 Pro Case, Google 8 Pro [Military Grade Protective] Slim Soft TPU & Hard PC, Girls Women Crystal Clear Flower Pattern Cases for Google Pixel 8 Pro -Purple',NULL,'B0CLVG2LPG','https://m.media-amazon.com/images/I/71cW3mjqkkL._AC_UY218_.jpg',42,4.8,'$9.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/DagoRoo-Military-Protective-Crystal-Pattern/dp/B0CLVG2LPG/ref=cs_sr_dp_5?keywords=pixel+cases&qid=1703020458&sr=8-19',51,'2023-12-19 15:14:19.211957-06','2023-12-19 15:14:19.211957-06','www.amazon.com'), + (3937,'Crave Dual Guard for Google Pixel 8 Pro Case, Shockproof Protection Dual Layer Case for Google Pixel 8 Pro - Forest Green',NULL,'B0CC5K92BT','https://m.media-amazon.com/images/I/81tFWwJqVxL._AC_UY218_.jpg',206,4.7,'$15.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Crave-Guard-Google-Shockproof-Protection/dp/B0CC5K92BT/ref=cs_sr_dp_n?keywords=pixel+cases&qid=1703020458&sr=8-20',51,'2023-12-19 15:14:19.218883-06','2023-12-19 15:14:19.218883-06','www.amazon.com'), + (3938,'Crave Dual Guard for Google Pixel 8 Case, Shockproof Protection Dual Layer Case for Google Pixel 8 - Black',NULL,'B0CC5KD3LZ','https://m.media-amazon.com/images/I/81qhkS6lcUL._AC_UY218_.jpg',148,4.7,'$15.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Crave-Guard-Google-Shockproof-Protection/dp/B0CC5KD3LZ/ref=cs_sr_dp_n?keywords=pixel+cases&qid=1703020458&sr=8-21',51,'2023-12-19 15:14:19.225735-06','2023-12-19 15:14:19.225735-06','www.amazon.com'), + (3940,'X-level Google Pixel 8 Pro Case, Thin Slim Premium PU Leather Soft TPU Bumper Shockproof Protective Phone Cover for Google Pixel 8 Pro 2023 (Blue)',NULL,'B0CGX3D23D','https://m.media-amazon.com/images/I/6131ox6QI4L._AC_UL320_.jpg',33,4.2,'$14.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo0NzE0MDY3NTQ2NjY4NzE3OjE3MDMwMjA0NTg6c3Bfc2VhcmNoX3RoZW1hdGljOjMwMDA2NzkwMTI0ODUwMjo6MDo6&url=%2FX-level-Premium-Leather-Shockproof-Protective%2Fdp%2FB0CGX3D23D%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%253Aamzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%26cv_ct_cx%3Dpixel%2Bcases%26keywords%3Dpixel%2Bcases%26pd_rd_i%3DB0CGX3D23D%26pd_rd_r%3Dc120204e-4227-4cca-80c5-474c300b9e67%26pd_rd_w%3DzUpTy%26pd_rd_wg%3DufYZ4%26pf_rd_p%3D0c4cbb48-e433-4698-bba6-b3a5297e3e20%26pf_rd_r%3D9QXARFEDAMSA8PB0SEP3%26qid%3D1703020458%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-17-f853d353-bf33-45e7-b5c2-2cb2b31abc9b-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',51,'2023-12-19 15:14:19.241625-06','2023-12-19 15:14:19.241625-06','www.amazon.com'), + (3939,'Miimall Compatible for Magsafe Charging Designed for Google Pixel 7a Case (2023) - Matte Clear & Black',NULL,'B0C4H6M7S7','https://m.media-amazon.com/images/I/71TdiC77qSL._AC_UL320_.jpg',20,4.3,'$19.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo0NzE0MDY3NTQ2NjY4NzE3OjE3MDMwMjA0NTg6c3Bfc2VhcmNoX3RoZW1hdGljOjIwMDE2NzQyODE3MjM5ODo6NDo6&url=%2FMiimall-Compatible-Magsafe-Charging-Designed%2Fdp%2FB0C4H6M7S7%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%253Aamzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%26cv_ct_cx%3Dpixel%2Bcases%26keywords%3Dpixel%2Bcases%26pd_rd_i%3DB0C4H6M7S7%26pd_rd_r%3Dc120204e-4227-4cca-80c5-474c300b9e67%26pd_rd_w%3DzUpTy%26pd_rd_wg%3DufYZ4%26pf_rd_p%3D0c4cbb48-e433-4698-bba6-b3a5297e3e20%26pf_rd_r%3D9QXARFEDAMSA8PB0SEP3%26qid%3D1703020458%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-21-f853d353-bf33-45e7-b5c2-2cb2b31abc9b-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',51,'2023-12-19 15:14:19.233973-06','2023-12-19 15:14:19.268078-06','www.amazon.com'), + (4048,'PUMA',NULL,'B01G3LZAI6','https://m.media-amazon.com/images/I/71VfZS6bXAL._AC_UL320_.jpg',54448,4.4,'$51.14','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/PUMA-Tazon-Black-Silver-Running/dp/B01G3LZAI6/ref=sr_1_38?keywords=men%27s+shoes&qid=1703020483&sr=8-38',53,'2023-12-19 15:14:44.989295-06','2023-12-19 15:14:44.989295-06','www.amazon.com'), + (4582,'GEAR AID HEROCLIP (Mini) Carabiner Gear Clip and Hook, for Hanging Bags, Purses, Lanterns, Strollers, Tools, Helmets, Water Bottles, and More',NULL,'B07JJZTYSV','https://m.media-amazon.com/images/I/81EO2vNo1RL._AC_UL320_.jpg',3045,4.7,'$16.63','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/HEROCLIP-Carabiner-Travel-Luggage-Small/dp/B07JJZTYSV/ref=sr_1_90?keywords=travel+accessories&qid=1703020686&sr=8-90',57,'2023-12-19 15:18:08.070737-06','2023-12-19 15:18:08.070737-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3935,'CaseBorne Compatible with Google Pixel 8 Pro Protective Case - 5-Layer Construction, Compatible with MagSafe, Slim Yet Rugged with Tempered Glass Screen Protector Green',NULL,'B0CBQPR9J9','https://m.media-amazon.com/images/I/61hDn8d84ML._AC_UL320_.jpg',78,4.3,'$39.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo1MTY2MTQzNTI5MTY1NzE3OjE3MDMwMjA0NTg6c3BfYXRmX25leHQ6MzAwMDYyMTQ0MTMyNDAyOjowOjo&url=%2FCaseBorne-Compatible-Google-Pixel-Protective%2Fdp%2FB0CBQPR9J9%2Fref%3Dsr_1_17_sspa%3Fkeywords%3Dpixel%2Bcases%26qid%3D1703020458%26sr%3D8-17-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGZfbmV4dA%26psc%3D1',51,'2023-12-19 15:14:19.19237-06','2023-12-19 15:14:19.247492-06','www.amazon.com'), + (3941,'X-level Google Pixel 6 Case, Premium PU Leather Soft TPU Bumper Shockproof Protective Phone Cover Case for Pixel 6 (Brown)',NULL,'B09DYBW9DJ','https://m.media-amazon.com/images/I/61Y-ensefTL._AC_UL320_.jpg',921,4.5,'$11.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo0NzE0MDY3NTQ2NjY4NzE3OjE3MDMwMjA0NTg6c3Bfc2VhcmNoX3RoZW1hdGljOjIwMDA5NDAwNTA3MDE1MTo6Mjo6&url=%2FX-level-Anti-Scratch-Premium-Shockproof-Protective%2Fdp%2FB09DYBW9DJ%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%253Aamzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%26cv_ct_cx%3Dpixel%2Bcases%26keywords%3Dpixel%2Bcases%26pd_rd_i%3DB09DYBW9DJ%26pd_rd_r%3Dc120204e-4227-4cca-80c5-474c300b9e67%26pd_rd_w%3DzUpTy%26pd_rd_wg%3DufYZ4%26pf_rd_p%3D0c4cbb48-e433-4698-bba6-b3a5297e3e20%26pf_rd_r%3D9QXARFEDAMSA8PB0SEP3%26qid%3D1703020458%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-19-f853d353-bf33-45e7-b5c2-2cb2b31abc9b-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',51,'2023-12-19 15:14:19.25445-06','2023-12-19 15:14:19.25445-06','www.amazon.com'), + (3942,'Poetic Revolution Case for Google Pixel 8 Pro 5G 6.7 inch, Built-in Screen Protector Work with Fingerprint ID, Full Body Rugged Shockproof Protective Cover Case with Kickstand, Black',NULL,'B0CHJM2SY9','https://m.media-amazon.com/images/I/71-X39JuiML._AC_UL320_.jpg',22,4.7,'$17.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo0NzE0MDY3NTQ2NjY4NzE3OjE3MDMwMjA0NTg6c3Bfc2VhcmNoX3RoZW1hdGljOjMwMDA2NzgwMjAyNzIwMjo6Mzo6&url=%2FPoetic-Revolution-Fingerprint-Shockproof-Protective%2Fdp%2FB0CHJM2SY9%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%253Aamzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%26cv_ct_cx%3Dpixel%2Bcases%26keywords%3Dpixel%2Bcases%26pd_rd_i%3DB0CHJM2SY9%26pd_rd_r%3Dc120204e-4227-4cca-80c5-474c300b9e67%26pd_rd_w%3DzUpTy%26pd_rd_wg%3DufYZ4%26pf_rd_p%3D0c4cbb48-e433-4698-bba6-b3a5297e3e20%26pf_rd_r%3D9QXARFEDAMSA8PB0SEP3%26qid%3D1703020458%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-20-f853d353-bf33-45e7-b5c2-2cb2b31abc9b-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',51,'2023-12-19 15:14:19.261574-06','2023-12-19 15:14:19.261574-06','www.amazon.com'), + (3943,'Ringke Onyx [Feels Good in The Hand] Compatible with Google Pixel 8 Case, Anti-Fingerprint Technology Prevents Oily Smudges Non-Slip Enhanced Grip Precise Cutouts for Camera Lenses - Dark Green',NULL,'B0CHMW2K8N','https://m.media-amazon.com/images/I/71WoviM8xoL._AC_UY218_.jpg',617,4.7,'$14.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Ringke-Compatible-Anti-Fingerprint-Technology-Prevents/dp/B0CHMW2K8N/ref=cs_sr_dp_3?keywords=pixel+cases&qid=1703020458&sr=8-22',51,'2023-12-19 15:14:19.276936-06','2023-12-19 15:14:19.276936-06','www.amazon.com'), + (3944,'OtterBox Google Pixel 7A Commuter Series Case - TREES COMPANY (Green), slim & tough, pocket-friendly, with port protection',NULL,'B0C483NTWF','https://m.media-amazon.com/images/I/61KPKS-4AML._AC_UY218_.jpg',186,4.6,'$25.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/OtterBox-Google-Pixel-Commuter-Case/dp/B0C483NTWF/ref=cs_sr_dp_2?keywords=pixel+cases&qid=1703020458&sr=8-23',51,'2023-12-19 15:14:19.283411-06','2023-12-19 15:14:19.283411-06','www.amazon.com'), + (3945,'Juntone for Google Pixel 8 Case Clear with Magnetic [Compatible with MagSafe] [Non-Yellowing] [10 FT Military Grade Drop Protection] Shockproof Slim Case for Pixel 8 Case, Crystal Clear',NULL,'B0CGXNF6JD','https://m.media-amazon.com/images/I/71MHR+Sqn7L._AC_UY218_.jpg',422,4.3,'$13.31','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Juntone-Compatible-Non-Yellowing-Protection-Shockproof/dp/B0CGXNF6JD/ref=cs_sr_dp_n?keywords=pixel+cases&qid=1703020458&sr=8-24',51,'2023-12-19 15:14:19.291688-06','2023-12-19 15:14:19.291688-06','www.amazon.com'), + (3946,'Spigen Ultra Hybrid [Anti-Yellowing Technology] Designed for Google Pixel 6 Case (2021) - Crystal Clear',NULL,'B0964GD8B5','https://m.media-amazon.com/images/I/51A1x7OXQLL._AC_UY218_.jpg',7027,4.5,'$15.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Spigen-Hybrid-Anti-Yellowing-Technology-Designed/dp/B0964GD8B5/ref=cs_sr_dp_2?keywords=pixel+cases&qid=1703020458&sr=8-25',51,'2023-12-19 15:14:19.298639-06','2023-12-19 15:14:19.298639-06','www.amazon.com'), + (3947,'DagoRoo for Pixel 8 Case, Google 8 Case with Tempered Glass Screen Protector [2 Pack], [Military Grade Protective] Slim Soft TPU & Hard PC, Girls Women Crystal Clear Flower Pattern Cases-Purple',NULL,'B0CJL2LXH8','https://m.media-amazon.com/images/I/71aSfj8O-LL._AC_UY218_.jpg',22,4.3,'$9.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/DagoRoo-Tempered-Protector-Protective-Cases-Purple/dp/B0CJL2LXH8/ref=cs_sr_dp_5?keywords=pixel+cases&qid=1703020458&sr=8-26',51,'2023-12-19 15:14:19.307025-06','2023-12-19 15:14:19.307025-06','www.amazon.com'), + (3948,'Poetic Revolution Case for Google Pixel 8 5G 6.2 inch, [20FT Mil-Grade Drop Tested], Full-Body Rugged Shockproof Cover with Kickstand and Built-in-Screen Protector, Black',NULL,'B0CHJJXLD4','https://m.media-amazon.com/images/I/712Td6TaLyL._AC_UY218_.jpg',3,4.0,'$17.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo1MTY2MTQzNTI5MTY1NzE3OjE3MDMwMjA0NTg6c3BfbXRmOjMwMDA3NzA3OTA0MTYwMjo6MDo6&url=%2FPoetic-Revolution-Mil-Grade-Full-Body-Shockproof%2Fdp%2FB0CHJJXLD4%2Fref%3Dsr_1_27_sspa%3Fkeywords%3Dpixel%2Bcases%26qid%3D1703020458%26sr%3D8-27-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',51,'2023-12-19 15:14:19.313152-06','2023-12-19 15:14:19.313152-06','www.amazon.com'), + (3949,'Spigen Liquid Air Armor Designed for Pixel 8 Case (2023) - Abyss Green',NULL,'B0BZ5RRT1B','https://m.media-amazon.com/images/I/71MICy2koOL._AC_UY218_.jpg',327,4.7,'$16.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Spigen-Liquid-Armor-Designed-MP620/dp/B0BZ5RRT1B/ref=cs_sr_dp_3?keywords=pixel+cases&qid=1703020458&sr=8-29',51,'2023-12-19 15:14:19.319652-06','2023-12-19 15:14:19.319652-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3950,'VRS DESIGN Damda Glide Pro Wallet Phone Case for Pixel 8 Pro, Sturdy Semi Auto Card Holder Wallet [4 Cards] Case Compatible for Pixel 8 Pro Case (2023) Matte Black',NULL,'B0CL6KQY17','https://m.media-amazon.com/images/I/71LWgxTzidL._AC_UY218_.jpg',32,4.5,'$22.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/VRS-DESIGN-Wallet-Sturdy-Compatible/dp/B0CL6KQY17/ref=cs_sr_dp_2?keywords=pixel+cases&qid=1703020458&sr=8-30',51,'2023-12-19 15:14:19.3264-06','2023-12-19 15:14:19.3264-06','www.amazon.com'), + (3951,'Spigen Tough Armor Designed for Pixel 8 Pro Case (2023) - Black',NULL,'B0BZ5XTSJ7','https://m.media-amazon.com/images/I/61JwJC8GbYL._AC_UY218_.jpg',497,4.5,'$24.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Spigen-Tough-Armor-Designed-MP671/dp/B0BZ5XTSJ7/ref=cs_sr_dp_4?keywords=pixel+cases&qid=1703020458&sr=8-31',51,'2023-12-19 15:14:19.332027-06','2023-12-19 15:14:19.332027-06','www.amazon.com'), + (3952,'Spigen Ultra Hybrid Designed for Pixel 7a Case (2023) - Crystal Clear',NULL,'B0BTK334LB','https://m.media-amazon.com/images/I/618Wn80KEHL._AC_UY218_.jpg',845,4.7,'$15.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Spigen-Ultra-Hybrid-Designed-MP610/dp/B0BTK334LB/ref=cs_sr_dp_3?keywords=pixel+cases&qid=1703020458&sr=8-32',51,'2023-12-19 15:14:19.338996-06','2023-12-19 15:14:19.338996-06','www.amazon.com'), + (3953,'Spigen Thin Fit Designed for Pixel 8 Case (2023) - Black',NULL,'B0BZ67PWJT','https://m.media-amazon.com/images/I/61hYxsNX3nL._AC_UY218_.jpg',141,4.3,'$16.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Spigen-Thin-Designed-MP620-Case/dp/B0BZ67PWJT/ref=cs_sr_dp_5?keywords=pixel+cases&qid=1703020458&sr=8-33',51,'2023-12-19 15:14:19.345945-06','2023-12-19 15:14:19.345945-06','www.amazon.com'), + (3954,'Btscase for Google Pixel 6 Case, Gold Glitter Bling Marble Pattern Hard PC Slim Fit Shockproof Full Body Rugged Drop Protective Women Girls Cover Cute Case for Google Pixel 6 (2021), Green',NULL,'B0CBB4Z7RM','https://m.media-amazon.com/images/I/71eIuVIx9kL._AC_UY218_.jpg',595,4.7,'$11.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Btscase-Glitter-Pattern-Shockproof-Protective/dp/B0CBB4Z7RM/ref=cs_sr_dp_n?keywords=pixel+cases&qid=1703020458&sr=8-34',51,'2023-12-19 15:14:19.352796-06','2023-12-19 15:14:19.352796-06','www.amazon.com'), + (3955,'OTOFLY Designed for Pixel 8 Case, Silicone Shockproof Slim Thin Phone Case for Google Pixel 8 6.2 inch (Pine Green)',NULL,'B0CGLRNMPT','https://m.media-amazon.com/images/I/61bpwGgeVYL._AC_UY218_.jpg',163,4.6,'$14.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/OTOFLY-Designed-Silicone-Shockproof-Green/dp/B0CGLRNMPT/ref=cs_sr_dp_n?keywords=pixel+cases&qid=1703020458&sr=8-35',51,'2023-12-19 15:14:19.35972-06','2023-12-19 15:14:19.35972-06','www.amazon.com'), + (3956,'OTOFLY Designed for Pixel 7 Case, Silicone Shockproof Slim Thin Phone Case for Google Pixel 7 6.3 inch (Pine Green)',NULL,'B0BGPN9TQC','https://m.media-amazon.com/images/I/716zbSJ0y+L._AC_UY218_.jpg',962,4.5,'$14.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/OTOFLY-Google-Pixel-7-Phone-Case/dp/B0BGPN9TQC/ref=cs_sr_dp_n?keywords=pixel+cases&qid=1703020458&sr=8-36',51,'2023-12-19 15:14:19.365657-06','2023-12-19 15:14:19.365657-06','www.amazon.com'), + (3957,'Bellroy Leather Case for Google Pixel Fold - Bluestone',NULL,'B0C9H1VC6P','https://m.media-amazon.com/images/I/4107AHypKnL._AC_UY218_.jpg',15,2.0,'$75.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo1MTY2MTQzNTI5MTY1NzE3OjE3MDMwMjA0NTg6c3BfYnRmOjMwMDAwNzIzMjgwNTAwMjo6MDo6&url=%2FBellroy-Leather-Case-Google-Pixel%2Fdp%2FB0C9H1VC6P%2Fref%3Dsr_1_37_sspa%3Fkeywords%3Dpixel%2Bcases%26qid%3D1703020458%26sr%3D8-37-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9idGY%26psc%3D1',51,'2023-12-19 15:14:19.372761-06','2023-12-19 15:14:19.372761-06','www.amazon.com'), + (3958,'Crystal Clear for Google Pixel 7a Case Shockproof Soft Protective Flexible TPU Bumper Drop Protection Transparent Slim Thin Cover for Pixel 7a Red',NULL,'B0C3X7BB49','https://m.media-amazon.com/images/I/71f1EGzFyWL._AC_UY218_.jpg',2,5.0,'$13.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo1MTY2MTQzNTI5MTY1NzE3OjE3MDMwMjA0NTg6c3BfYnRmOjIwMDE4MDAzMTk1NjU5ODo6MDo6&url=%2FShockproof-Protective-Flexible-Protection-Transparent%2Fdp%2FB0C3X7BB49%2Fref%3Dsr_1_38_sspa%3Fkeywords%3Dpixel%2Bcases%26qid%3D1703020458%26sr%3D8-38-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9idGY%26psc%3D1',51,'2023-12-19 15:14:19.37914-06','2023-12-19 15:14:19.37914-06','www.amazon.com'), + (3959,'Carveit Wood Case for Pixel 6 Pro Case [Real Wood & Soft TPU] Shockproof Hybrid Protective Cover Unique & Classy Wooden Case Compatible with Google Pixel 6 Pro (Vegvisir Viking Compass-Blackwood)',NULL,'B09MK75NXK','https://aax-us-iad.amazon.com/e/loi/imp?b=JIY1P67lHprxo-FUzSorXhkAAAGMg-3yDgEAAAH2AQBvbm9fdHhuX2JpZDMgICBvbm9fdHhuX2ltcDEgICBsvj0g',346,4.7,'$25.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.comhttps://aax-us-iad.amazon.com/x/c/RIY1P67lHprxo-FUzSorXhkAAAGMg-3x1AEAAAH2AQBvbm9fdHhuX2JpZDMgICBvbm9fdHhuX2ltcDEgICBsvj0g/https://www.amazon.com/Carveit-Shockproof-Protective-Compatible-Compass-Blackwood/dp/B09MK75NXK/ref=sxbs_sbv_search_btf?content-id=amzn1.sym.2066ba78-527e-4aed-9de4-3ba096deb87b%3Aamzn1.sym.2066ba78-527e-4aed-9de4-3ba096deb87b&cv_ct_cx=pixel+cases&keywords=pixel+cases&pd_rd_i=B09MK75NXK&pd_rd_r=6565a1a6-2e73-4203-b9eb-067148c0babc&pd_rd_w=m8dM2&pd_rd_wg=iCkdc&pf_rd_p=2066ba78-527e-4aed-9de4-3ba096deb87b&pf_rd_r=9QXARFEDAMSA8PB0SEP3&qid=1703020458&sbo=RZvfv%2F%2FHxDF%2BO5021pAnSA%3D%3D&sr=1-17-48f7baba-8e26-45f3-8811-e1a601ad20bf',51,'2023-12-19 15:14:19.385502-06','2023-12-19 15:14:19.385502-06','www.amazon.comhttps:'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3960,'GIQ USB C hub USB 3.0 to Dual HDMI VGA Adapter Triple Display Laptop Docking Station Dual Display Compatible for MacBook M1 USB Dock-Black',NULL,'B0B5RDRK5Y','https://m.media-amazon.com/images/I/61N4TZF1IvL._AC_UY218_.jpg',1853,4.4,'$92.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3NzczMjI2Nzc4NzcxNzE3OjE3MDMwMjA0Njc6c3BfYXRmOjIwMDA4Njk1NzAxNzQ5ODo6MDo6&url=%2FDocking-Station-Adapter-Compatible-Dock-Black%2Fdp%2FB0B5RDRK5Y%2Fref%3Dsr_1_1_sspa%3Fkeywords%3Dcomputer%2Baccessories%26qid%3D1703020467%26sr%3D8-1-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGY%26psc%3D1',52,'2023-12-19 15:14:28.245942-06','2023-12-19 15:14:28.245942-06','www.amazon.com'), + (3961,'FORGING MOUNT Heavy Duty Dual Monitor Arms - Desk Mount Gas Spring Computer Monitor Stand Fits 15-42 inch, Height Adjustable Double Full Motion with Clamp and Grommet Base, Each Arm Holds Up to 44lbs',NULL,'B0BW8D7FGZ','https://m.media-amazon.com/images/I/71PQy8uqYQL._AC_UY218_.jpg',10,3.9,'$119.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3NzczMjI2Nzc4NzcxNzE3OjE3MDMwMjA0Njc6c3BfYXRmOjMwMDEwNzY0MzAyMDQwMjo6MDo6&url=%2FFORGING-MOUNT-Heavy-Duty-Monitor%2Fdp%2FB0BW8D7FGZ%2Fref%3Dsr_1_2_sspa%3Fkeywords%3Dcomputer%2Baccessories%26qid%3D1703020467%26sr%3D8-2-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGY%26psc%3D1',52,'2023-12-19 15:14:28.254336-06','2023-12-19 15:14:28.254336-06','www.amazon.com'), + (3962,'UtechSmart Venus Pro RGB Wireless MMO Gaming Mouse, 16,000 DPI Optical Sensor, 2.4 GHz Transmission Technology, Ergonomic Design, 16M Chroma RGB Lighting, 16 programmable Buttons, Up to 70 Hours',NULL,'B07XP4K152','https://m.media-amazon.com/images/I/61EoZYj1SjL._AC_UY218_.jpg',22050,4.5,'$47.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/UtechSmart-transmission-technology-Ergonomic-programmable/dp/B07XP4K152/ref=sr_1_3?keywords=computer+accessories&qid=1703020467&sr=8-3',52,'2023-12-19 15:14:28.26203-06','2023-12-19 15:14:28.26203-06','www.amazon.com'), + (3963,'CushZone Foot Rest for Under Desk at Work Adjustable Foam for Office, Work, Gaming, Computer, Gift, Home Office Accessories Back & Hip Pain Relief (Grey)',NULL,'B0B7HZNMPZ','https://m.media-amazon.com/images/I/812S5LcnAJL._AC_UY218_.jpg',2075,4.5,'$29.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/CushZone-Adjustable-Office-Computer-Accessories/dp/B0B7HZNMPZ/ref=sr_1_4?keywords=computer+accessories&qid=1703020467&sr=8-4',52,'2023-12-19 15:14:28.269376-06','2023-12-19 15:14:28.269376-06','www.amazon.com'), + (3964,'KAFRI RGB Headphone Stand with Wireless Charger Desk Gaming Headset Holder Hanger Rack with 10W/7.5W Fast Charge QI Wireless Charging Pad - Suitable for Gamer Desktop Table Game Earphone Accessories',NULL,'B07W549S56','https://m.media-amazon.com/images/I/71wi7nIafdL._AC_UY218_.jpg',3597,4.4,'$24.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Headphone-Wireless-Charger-KAFRI-Charging/dp/B07W549S56/ref=sr_1_5?keywords=computer+accessories&qid=1703020467&sr=8-5',52,'2023-12-19 15:14:28.276949-06','2023-12-19 15:14:28.276949-06','www.amazon.com'), + (3965,'MCHOSE Laptop Stand, Adjustable Computer Stand, Ergonomic Laptop Riser with 360° Rotating Base, Notebook Stand Compatible with All 10-17” Laptops, Space Grey',NULL,'B0BHYTZB43','https://aax-us-iad.amazon.com/e/loi/imp?b=JEFpM0NwmZzpEzBfj1B36bsAAAGMg-4USwEAAAH2AQBvbm9fdHhuX2JpZDcgICBvbm9fdHhuX2ltcDEgICA_z5-B',514,4.6,'$44.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.comhttps://aax-us-iad.amazon.com/x/c/REFpM0NwmZzpEzBfj1B36bsAAAGMg-4UFgEAAAH2AQBvbm9fdHhuX2JpZDcgICBvbm9fdHhuX2ltcDEgICA_z5-B/https://www.amazon.com/MCHOSE-Adjustable-Computer-Ergonomic-Compatible/dp/B0BHYTZB43/ref=sxin_14_sbv_search_btf?content-id=amzn1.sym.6ca944f8-539c-499e-a3a4-26a566d1de59%3Aamzn1.sym.6ca944f8-539c-499e-a3a4-26a566d1de59&cv_ct_cx=computer+accessories&keywords=computer+accessories&pd_rd_i=B0BHYTZB43&pd_rd_r=ed6308b0-546f-44cf-9316-99343fc4ce09&pd_rd_w=wZgFw&pd_rd_wg=G1km0&pf_rd_p=6ca944f8-539c-499e-a3a4-26a566d1de59&pf_rd_r=VVGBRE0SHQGHCGDXZSNK&qid=1703020467&sbo=RZvfv%2F%2FHxDF%2BO5021pAnSA%3D%3D&sr=1-1-5190daf0-67e3-427c-bea6-c72c1df98776',52,'2023-12-19 15:14:28.284358-06','2023-12-19 15:14:28.284358-06','www.amazon.comhttps:'), + (4049,'adidas',NULL,'B0BG93252B','https://m.media-amazon.com/images/I/81uBxoBI0RL._AC_UL320_.jpg',51,4.2,'$40.60','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/adidas-Kaptir-Sneaker-Black-White/dp/B0BG93252B/ref=sr_1_39?keywords=men%27s+shoes&qid=1703020483&sr=8-39',53,'2023-12-19 15:14:44.996984-06','2023-12-19 15:14:44.996984-06','www.amazon.com'), + (3966,'MDOZQ Office Desk Accessories 2pcs Monitor Memo Board Computer Message Board Office Supplies for Women Men Computer Sticky Note Holder Home Office Accessories Desktop Message Office Decor',NULL,'B0BRMX3SWH','https://m.media-amazon.com/images/I/61yjorGIhAL._AC_UY218_.jpg',486,4.4,'$6.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Accessories-Computer-Monitor-Message-Supplies/dp/B0BRMX3SWH/ref=sr_1_6?keywords=computer+accessories&qid=1703020467&sr=8-6',52,'2023-12-19 15:14:28.29083-06','2023-12-19 15:14:28.29083-06','www.amazon.com'), + (3967,'ODISTAR Desktop Vacuum Cleaner,Mini Table dust Sweeper Energy Saving,High Endurance up to 400 mins,Cordless&360º Rotatable for Cleaning Hairs,Crumbs,Computer Keyboard of Gifts for Kids (Pink)',NULL,'B082D8F917','https://m.media-amazon.com/images/I/41tVjk+BsxL._AC_UY218_.jpg',4933,4.5,'$12.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3NzczMjI2Nzc4NzcxNzE3OjE3MDMwMjA0Njc6c3BfbXRmOjIwMDAyNjI0MTI0MjY5ODo6MDo6&url=%2FODISTAR-Endurance-Cordless-Rotatable-Cleaning%2Fdp%2FB082D8F917%2Fref%3Dsr_1_7_sspa%3Fkeywords%3Dcomputer%2Baccessories%26qid%3D1703020467%26sr%3D8-7-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',52,'2023-12-19 15:14:28.299602-06','2023-12-19 15:14:28.299602-06','www.amazon.com'), + (3968,'Anker 332 USB-C Hub (5-in-1) with 4K HDMI Display, 5Gbps - and 2 5Gbps USB-A Data Ports and for MacBook Pro, MacBook Air, Dell XPS, Lenovo Thinkpad, HP Laptops and More',NULL,'B0BQLLB61B','https://m.media-amazon.com/images/I/61gciQ4Uu9L._AC_UY218_.jpg',2490,4.4,'$24.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Anker-Display-MacBook-Thinkpad-Laptops/dp/B0BQLLB61B/ref=sr_1_8?keywords=computer+accessories&qid=1703020467&sr=8-8',52,'2023-12-19 15:14:28.306962-06','2023-12-19 15:14:28.306962-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3969,'Nightstand Edge Mount Power Strip with USB-C Ports Tabletop Surge Protector Desk Clamp Power Sockets with 3 AC Outlets &4 Fast Charging USB Ports for Home Office Hotel and Dormitory',NULL,'B0B7XYQBSR','https://m.media-amazon.com/images/I/61IfJQTeRuL._AC_UY218_.jpg',177,4.5,'$36.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Nightstand-Tabletop-Protector-Charging-Dormitory/dp/B0B7XYQBSR/ref=sr_1_9?keywords=computer+accessories&qid=1703020467&sr=8-9',52,'2023-12-19 15:14:28.312813-06','2023-12-19 15:14:28.312813-06','www.amazon.com'), + (3970,'WESTREE Dual Monitor Stand Riser with Two Drawers, Extra Large Storage for 2 Monitors, Desktop Oraganizer Computer,Laptop,Screen,Printer,TV',NULL,'B09712RBWB','https://m.media-amazon.com/images/I/71hZ9GVAplL._AC_UY218_.jpg',2209,4.6,'$39.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/WESTREE-Monitor-Drawers-Computer-Organizer/dp/B09712RBWB/ref=sr_1_10?keywords=computer+accessories&qid=1703020467&sr=8-10',52,'2023-12-19 15:14:28.318706-06','2023-12-19 15:14:28.318706-06','www.amazon.com'), + (3971,'Laptop Screen Keyboard Cleaner Kit, Electronics Cleaning Tool for MacBook iPad iPhone Pro, Brush Tool for Tablet, Computer, PC Monitor,TV Camera Lens with 2ml Mist Spray New Compact with Patent',NULL,'B0BJZ2PFCV','https://m.media-amazon.com/images/I/71ySJCxI4JL._AC_UY218_.jpg',1270,4.5,'$16.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Keyboard-Cleaner-Electronics-Cleaning-Computer/dp/B0BJZ2PFCV/ref=sr_1_11?keywords=computer+accessories&qid=1703020467&sr=8-11',52,'2023-12-19 15:14:28.326437-06','2023-12-19 15:14:28.326437-06','www.amazon.com'), + (3972,'Benazcap X Large Memory Seat Cushion for Office Chair Pressure Relief Sciatica & Tailbone Pain Relief Memory Foam Firm Coccyx Pad for Long Sitting, for Office Chair, Gaming Chair and Car Seat Upgrade',NULL,'B0B5RDC71M','https://m.media-amazon.com/images/I/71HxhCydvLL._AC_UY218_.jpg',1823,4.3,'$31.13','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3NzczMjI2Nzc4NzcxNzE3OjE3MDMwMjA0Njc6c3BfbXRmOjIwMDA3NTkzMzE2MDk5ODo6MDo6&url=%2FBenazcap-Cushion-Pressure-Sciatica-Tailbone%2Fdp%2FB0B5RDC71M%2Fref%3Dsr_1_12_sspa%3Fkeywords%3Dcomputer%2Baccessories%26qid%3D1703020467%26sr%3D8-12-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',52,'2023-12-19 15:14:28.333634-06','2023-12-19 15:14:28.333634-06','www.amazon.com'), + (3973,'Electronic Accessories Case, Universal Cable Cord Holder Organizer / Electronic Case, Waterproof Portable Cable Organizer Bag, USB Flash Drives Bag, Cable case Bag, USB Case Organizer,USB Charger Bag',NULL,'B097BRZJVQ','https://m.media-amazon.com/images/I/71ctODtgw8S._AC_UY218_.jpg',5596,4.4,'$6.65','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/CAOODKDK-Electronic-Accessories-OrganizerElectronic-Waterproof/dp/B097BRZJVQ/ref=sr_1_13?keywords=computer+accessories&qid=1703020467&sr=8-13',52,'2023-12-19 15:14:28.340363-06','2023-12-19 15:14:28.340363-06','www.amazon.com'), + (3974,'Baseus USB C Hub, 4K@60Hz HDMI USB C Docking Station, 7 in 1 USB Hub with 3 USB-A 5Gbps, PD 100W, TF/SD Card Reader, USB C Adapter Compatible for iPhone 15/Mac/Dell/Acer/HP/ASUS/Steam Deck/Rog Ally',NULL,'B0C85759QD','https://m.media-amazon.com/images/I/71L42CoODhL._AC_UY218_.jpg',498,4.3,'$19.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Baseus-Docking-Station-Adapter-Compatible/dp/B0C85759QD/ref=sr_1_14?keywords=computer+accessories&qid=1703020467&sr=8-14',52,'2023-12-19 15:14:28.346674-06','2023-12-19 15:14:28.346674-06','www.amazon.com'), + (3976,'Computer Speakers, Desktop Speakers with 6 Colorful RGB Lights, Volume Control Stereo Bass PC Speakers, USB Powered Subwoofer Gaming Speakers w/3.5mm Aux Cable for PC Monitor Laptop Tablet Phone',NULL,'B0BZZ41652','https://m.media-amazon.com/images/I/61ROQtzmEzL._AC_UY218_.jpg',592,4.5,'$26.88','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Computer-Speakers-Desktop-Colorful-Subwoofer/dp/B0BZZ41652/ref=sr_1_16?keywords=computer+accessories&qid=1703020467&sr=8-16',52,'2023-12-19 15:14:28.359548-06','2023-12-19 15:14:28.359548-06','www.amazon.com'), + (3977,'ODISTAR Desktop Vacuum Cleaner,Mini Table dust Sweeper Energy Saving,High Endurance up to 400 mins,Cordless&360º Rotatable Design for Cleaning Hairs,Crumbs,Computer Keyboard of Gifts for Kids (Black)',NULL,'B082D4XXJJ','https://m.media-amazon.com/images/I/41LrBEZmLkL._AC_UY218_.jpg',2247,4.3,'$13.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3NzczMjI2Nzc4NzcxNzE3OjE3MDMwMjA0Njc6c3BfbXRmOjIwMDAyNjI0MTI0Mjg5ODo6MDo6&url=%2FODISTAR-Endurance-Cordless-Rotatable-Cleaning%2Fdp%2FB082D4XXJJ%2Fref%3Dsr_1_17_sspa%3Fkeywords%3Dcomputer%2Baccessories%26qid%3D1703020467%26sr%3D8-17-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',52,'2023-12-19 15:14:28.366248-06','2023-12-19 15:14:28.366248-06','www.amazon.com'), + (3978,'Large RGB Gaming Mouse Pad -15 Light Modes Touch Control Extended Soft Computer Keyboard Mat Non-Slip Rubber Base for Gamer Esports Pros 31.5X11.8 in',NULL,'B09M3R13NQ','https://m.media-amazon.com/images/I/71TBg3aD0gL._AC_UY218_.jpg',3438,4.6,'$17.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Extended-Computer-Keyboard-Non-Slip-31-5X11-8/dp/B09M3R13NQ/ref=sr_1_18?keywords=computer+accessories&qid=1703020467&sr=8-18',52,'2023-12-19 15:14:28.374135-06','2023-12-19 15:14:28.374135-06','www.amazon.com'), + (3979,'Leather Desk Pad Protector,Mouse Pad/Mat, Non-Slip PU Leather Desk Blotter for Laptop,Waterproof Desk Writing Pad for Office and Home (31.5" x 15.7",Olive Green)',NULL,'B08NB7RZB7','https://m.media-amazon.com/images/I/71miLdyaA7L._AC_UY218_.jpg',71164,4.7,'$11.19','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Leather-Protector-Non-Slip-Blotter-Waterproof/dp/B08NB7RZB7/ref=sr_1_19?keywords=computer+accessories&qid=1703020467&sr=8-19',52,'2023-12-19 15:14:28.381075-06','2023-12-19 15:14:28.381075-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3980,'Simple Trending 2 Tier Metal Monitor Stand Monitor riser and Computer Desk Organizer with Drawer and Pen Holder for Laptop, Computer, iMac, Black',NULL,'B088NHGC48','https://m.media-amazon.com/images/I/81jncrTlOCL._AC_UY218_.jpg',1991,4.7,'$33.97','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Simple-Trending-Organizer-Anti-Slip-Computer/dp/B088NHGC48/ref=sr_1_20?keywords=computer+accessories&qid=1703020467&sr=8-20',52,'2023-12-19 15:14:28.388047-06','2023-12-19 15:14:28.388047-06','www.amazon.com'), + (3981,'Gaming Headphone Stand PC Accessories - RGB Headset Stand with 2 USB Charger, Cool LED Headphone Holder PC Gaming Accessories Gift for Boys Men Gamers, Computer Game Hardware for Desk',NULL,'B0CHJQ6XQ5','https://m.media-amazon.com/images/I/71YyxJDEqSL._AC_UY218_.jpg',86,4.3,'$39.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Gaming-Headphone-Stand-PC-Accessories/dp/B0CHJQ6XQ5/ref=sr_1_21?keywords=computer+accessories&qid=1703020467&sr=8-21',52,'2023-12-19 15:14:28.394759-06','2023-12-19 15:14:28.394759-06','www.amazon.com'), + (3982,'BAGAIL 4 Set/5 Set/6 Set Compression Packing Cubes Travel Accessories Expandable Packing Organizers',NULL,'B07XLFXJ7D','https://m.media-amazon.com/images/I/61TNS6K2LEL._AC_UY218_.jpg',18956,4.6,'$24.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3NzczMjI2Nzc4NzcxNzE3OjE3MDMwMjA0Njc6c3BfYnRmOjIwMDAyNDIwNzYwMjcxMTo6MDo6&url=%2FBagail-Compression-Packing-Expandable-Organizers%2Fdp%2FB07XLFXJ7D%2Fref%3Dsr_1_22_sspa%3Fkeywords%3Dcomputer%2Baccessories%26qid%3D1703020467%26sr%3D8-22-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9idGY%26psc%3D1',52,'2023-12-19 15:14:28.400794-06','2023-12-19 15:14:28.400794-06','www.amazon.com'), + (3983,'ZARIMI Compressed air Duster - Keyboard Cleaner for Office no Canned Reusable Good Replacement Can Electric 91000RPM Cordless air Duster pc 7600mAh -pc Cleaning-air Blower-car dusters-Electric',NULL,'B0B4S5P1H8','https://aax-us-iad.amazon.com/e/loi/imp?b=JG0vo49aumbnC26wFUf5vKoAAAGMg-4UaAEAAAH2AQBvbm9fdHhuX2JpZDcgICBvbm9fdHhuX2ltcDEgICC9EBoT',3568,4.3,'$55.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.comhttps://aax-us-iad.amazon.com/x/c/RG0vo49aumbnC26wFUf5vKoAAAGMg-4UMAEAAAH2AQBvbm9fdHhuX2JpZDcgICBvbm9fdHhuX2ltcDEgICC9EBoT/https://www.amazon.com/ZARIMI-Compressed-air-Duster-dusters-Electric/dp/B0B4S5P1H8/ref=sxbs_sbv_search_btf?content-id=amzn1.sym.e3e25c3f-be9c-4043-8c05-6ebb65e75e4b%3Aamzn1.sym.e3e25c3f-be9c-4043-8c05-6ebb65e75e4b&cv_ct_cx=computer+accessories&keywords=computer+accessories&pd_rd_i=B0B4S5P1H8&pd_rd_r=3a849c65-de2a-4be5-915f-b76d45e0295d&pd_rd_w=IADA7&pd_rd_wg=GaXZo&pf_rd_p=e3e25c3f-be9c-4043-8c05-6ebb65e75e4b&pf_rd_r=VVGBRE0SHQGHCGDXZSNK&qid=1703020467&sbo=RZvfv%2F%2FHxDF%2BO5021pAnSA%3D%3D&sr=1-1-a61ee601-6e56-4862-a8a2-1d3da5a5406f',52,'2023-12-19 15:14:28.409424-06','2023-12-19 15:14:28.409424-06','www.amazon.comhttps:'), + (4050,'adidas',NULL,'B08N5NCR6G','https://m.media-amazon.com/images/I/71Ap6d8QO5S._AC_UL320_.jpg',6583,4.5,'$46.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/adidas-Ownthegame-Basketball-Black-Carbon/dp/B08N5NCR6G/ref=sr_1_40?keywords=men%27s+shoes&qid=1703020483&sr=8-40',53,'2023-12-19 15:14:45.007823-06','2023-12-19 15:14:45.007823-06','www.amazon.com'), + (3984,'Under Desk Cable Management Tray,MOOACE Set of 2 Extendable Cord Organizer for Desk 14.1-25.6 inches,No Drill Desk Cable Management Tray with Wire Organizer and Adhesive Screw for Hanging Wall,Black',NULL,'B0C49LR8QG','https://m.media-amazon.com/images/I/61Jk11hu8HL._AC_UY218_.jpg',29,4.7,'$26.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3ODc3ODM0NzI2MjIxNzE3OjE3MDMwMjA0NzU6c3BfYXRmX25leHQ6MzAwMDg0Nzg4NDk0MDAyOjowOjo&url=%2FManagement-MOOACE-Extendable-Organizer-14-1-25-6%2Fdp%2FB0C49LR8QG%2Fref%3Dsr_1_17_sspa%3Fkeywords%3Dcomputer%2Baccessories%26qid%3D1703020475%26sr%3D8-17-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGZfbmV4dA%26psc%3D1',52,'2023-12-19 15:14:36.584504-06','2023-12-19 15:14:36.584504-06','www.amazon.com'), + (3985,'SMNICE Power Strip with USB, Surge Protector Flat Plug with 8 Widely Spaced Outlets and 6 USB Ports, 5ft Extension Cord Wall Mountable for Smartphone Tablet Laptop Computer Multiple Devices',NULL,'B0BBV7VZGC','https://m.media-amazon.com/images/I/61QF+eodS7L._AC_UY218_.jpg',1382,4.7,'$22.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3ODc3ODM0NzI2MjIxNzE3OjE3MDMwMjA0NzU6c3BfYXRmX25leHQ6MjAwMDkzNTM2NDM0NDk4OjowOjo&url=%2FSMNICE-Protector-Extension-Mountable-Smartphone%2Fdp%2FB0BBV7VZGC%2Fref%3Dsr_1_18_sspa%3Fkeywords%3Dcomputer%2Baccessories%26qid%3D1703020475%26sr%3D8-18-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGZfbmV4dA%26psc%3D1',52,'2023-12-19 15:14:36.602547-06','2023-12-19 15:14:36.602547-06','www.amazon.com'), + (3986,'SHOWPIN 122 in 1 Precision Computer Screwdriver Kit, Laptop Screwdriver Sets with 101 Magnetic Drill Bits, Electronics Tool Kit Compatible for Tablet, PC, iPhone, PS4 Repair',NULL,'B0822FS7Z6','https://m.media-amazon.com/images/I/81oN38OAm0L._AC_UY218_.jpg',4704,4.7,'$20.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Computer-Repair-Magnetic-Screwdriver-Precision/dp/B0822FS7Z6/ref=sr_1_19?keywords=computer+accessories&qid=1703020475&sr=8-19',52,'2023-12-19 15:14:36.609029-06','2023-12-19 15:14:36.609029-06','www.amazon.com'), + (3987,'ErGear Dual Monitor Desk Mount, Fully Adjustable Dual Monitor Arm for 2 Computer Screens up to 32 inch, Heavy Duty Dual Monitor Stand for Desk, Holds up to 17.6 lbs per Arm, EGCM1',NULL,'B082MLVXRR','https://m.media-amazon.com/images/I/61zSbH7KWFL._AC_UY218_.jpg',16951,4.4,'$29.69','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Heavy-Duty-Adjustable-Computer-Monitors-EGCM1/dp/B082MLVXRR/ref=sr_1_20?keywords=computer+accessories&qid=1703020475&sr=8-20',52,'2023-12-19 15:14:36.615279-06','2023-12-19 15:14:36.615279-06','www.amazon.com'), + (3988,'LORYERGO Laptop Stand, Ergonomic Computer Stand Laptop Riser for Desk, Laptop Stand Desk Holder Compatible with Most 10-15.6” Laptops, Silver',NULL,'B09C89MJB9','https://m.media-amazon.com/images/I/61srHVHN2GL._AC_UY218_.jpg',5036,4.7,'$15.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/LORYERGO-Laptop-Stand-Ergonomic-Compatible/dp/B09C89MJB9/ref=sr_1_21?keywords=computer+accessories&qid=1703020475&sr=8-21',52,'2023-12-19 15:14:36.621997-06','2023-12-19 15:14:36.621997-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3989,'PC Gaming Headphone Headset Holder Hanger Hook, HORUMP Dual Headphone Stand Under Desk with 5 Ports USB Charging Station, Suitable for Gamer Earphone Accessories as Boyfriend, Son, Husband Gifts',NULL,'B0991PS5NK','https://m.media-amazon.com/images/I/61PRhYizhGL._AC_UY218_.jpg',671,4.3,'$19.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/HORUMP-Headphone-Charger-Charging-Earphone/dp/B0991PS5NK/ref=sr_1_22?keywords=computer+accessories&qid=1703020475&sr=8-22',52,'2023-12-19 15:14:36.628461-06','2023-12-19 15:14:36.628461-06','www.amazon.com'), + (3990,'COLORCORAL Cleaning Gel Universal Dust Cleaner for PC Keyboard Cleaning Car Detailing Laptop Dusting Home and Office Electronics Cleaning Kit Computer Dust Remover from 160G',NULL,'B07GW9TJ3G','https://m.media-amazon.com/images/I/714s4ksW5GL._AC_UY218_.jpg',54050,4.1,'$8.89','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Keyboard-Universal-Keyboards-Calculators-ColorCoral/dp/B07GW9TJ3G/ref=sr_1_24?keywords=computer+accessories&qid=1703020475&sr=8-24',52,'2023-12-19 15:14:36.634341-06','2023-12-19 15:14:36.634341-06','www.amazon.com'), + (3991,'StepLively Foot Rest for Under Desk at Work, Comfortable Foot Stool with 2 Adjustable Heights, Footrest with Washable Cover, for Back & Hip Pain Relief, Suitable for Office, Home and Car (Black)',NULL,'B0C2KLLJPD','https://m.media-amazon.com/images/I/61AjtN2tkFL._AC_UY218_.jpg',596,4.5,'$24.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/StepLively-Comfortable-Adjustable-Footrest-Washable/dp/B0C2KLLJPD/ref=sr_1_25?keywords=computer+accessories&qid=1703020475&sr=8-25',52,'2023-12-19 15:14:36.640683-06','2023-12-19 15:14:36.640683-06','www.amazon.com'), + (3992,'Keyboard Cleaning Kit Laptop Cleaner, 10-in-1 Computer Screen Cleaning Brush Tool, Multi-Function PC Electronic Cleaner Kit Spray for iPad iPhone Pro, Earbuds, Camera Monitor, All-in-One with Patent',NULL,'B0C2VBXRYG','https://m.media-amazon.com/images/I/71AJth10-BL._AC_UY218_.jpg',3217,4.6,'$13.57','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Keyboard-Cleaning-Computer-Multi-Function-Electronic/dp/B0C2VBXRYG/ref=sr_1_26?keywords=computer+accessories&qid=1703020475&sr=8-26',52,'2023-12-19 15:14:36.646494-06','2023-12-19 15:14:36.646494-06','www.amazon.com'), + (3993,'Fesciory 4 Pack Keyboard Cleaner, Dust Cleaning Gel with 5 Keyboard Cleaning Kit, Universal Car Cleaning Gel for Car Vent, Detailing Cleaning Gel Putty for Car Dash, Printers, Calculators, Speakers',NULL,'B08Y5JFPFG','https://m.media-amazon.com/images/I/812yTvcjUHL._AC_UY218_.jpg',3126,4.1,'$13.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3ODc3ODM0NzI2MjIxNzE3OjE3MDMwMjA0NzU6c3BfbXRmOjIwMDA1ODAzNjY3MDE1MTo6MDo6&url=%2FKeyboard-Gel-Universal-Detailing-Calculators%2Fdp%2FB08Y5JFPFG%2Fref%3Dsr_1_27_sspa%3Fkeywords%3Dcomputer%2Baccessories%26qid%3D1703020475%26sr%3D8-27-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',52,'2023-12-19 15:14:36.652111-06','2023-12-19 15:14:36.652111-06','www.amazon.com'), + (3994,'WALI Dual LCD Monitor Fully Adjustable Desk Mount Stand Fits Two Screens up to 27 inch, 22 lbs. Weight Capacity per Arm (M002), Black',NULL,'B018MSDG84','https://m.media-amazon.com/images/I/61vA8MvkGQL._AC_UY218_.jpg',13213,4.5,'$34.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3ODc3ODM0NzI2MjIxNzE3OjE3MDMwMjA0NzU6c3BfbXRmOjMwMDA0MDY0NTk5MzYwMjo6MDo6&url=%2FWALI-Monitor-Adjustable-Capacity-M002%2Fdp%2FB018MSDG84%2Fref%3Dsr_1_28_sspa%3Fkeywords%3Dcomputer%2Baccessories%26qid%3D1703020475%26sr%3D8-28-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',52,'2023-12-19 15:14:36.658431-06','2023-12-19 15:14:36.658431-06','www.amazon.com'), + (3995,'SUPERDANNY LED Desk Lamp for Office Home, Eye-Caring Desk Light with Adjustable Gooseneck, 12W Touch Control Dimmable Brightness, Architect Clamp Lamp with USB Adapter for Reading Study Workbench',NULL,'B0C9GRJGR7','https://m.media-amazon.com/images/I/71o9Kz0V9QL._AC_UY218_.jpg',224,4.6,'$19.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/SUPERDANNY-Eye-Caring-Adjustable-Gooseneck-Brightness/dp/B0C9GRJGR7/ref=cs_sr_dp?keywords=computer+accessories&qid=1703020475&sr=8-29',52,'2023-12-19 15:14:36.66396-06','2023-12-19 15:14:36.66396-06','www.amazon.com'), + (3996,'USB 3.0 Hub, VIENON 4-Port USB Hub USB Splitter USB Expander for Laptop, Xbox, Flash Drive, HDD, Console, Printer, Camera,Keyborad, Mouse',NULL,'B09MLRPTT2','https://m.media-amazon.com/images/I/51MiG9+u4lL._AC_UY218_.jpg',9735,4.5,'$7.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Extender-Splitter-MacBook-Chromebook-Pixelbook/dp/B09MLRPTT2/ref=sr_1_30?keywords=computer+accessories&qid=1703020475&sr=8-30',52,'2023-12-19 15:14:36.669935-06','2023-12-19 15:14:36.669935-06','www.amazon.com'), + (3997,'Compressed Air Duster Keyboard Cleaner-Cordless Electric Air Duster for Computer PC 110000RPM Canned Air Blower Spray Can Car Duster Cleaning',NULL,'B0C3VJPYQP','https://m.media-amazon.com/images/I/71AeQB0bZxL._AC_UY218_.jpg',226,4.5,'$39.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Anraye-CV15-BP-Compressed-Air-Duster-Keyboard-Cleaner-Cordless-Electric-Air-Duster-for-Computer-PC-Canned-Air-Blower-Spray-Can-Car-Duster-Cleaning-Dust-Off/dp/B0C3VJPYQP/ref=sr_1_31?keywords=computer+accessories&qid=1703020475&sr=8-31',52,'2023-12-19 15:14:36.676864-06','2023-12-19 15:14:36.676864-06','www.amazon.com'), + (3998,'Lamicall Foldable Phone Stand for Desk - Height Adjustable Cell Phone Holder Portable Cellphone Cradle Desktop Dock Compatible with iPhone 15 14 13 Pro Max Mini, 12 11 XR X 8 7 6 Plus SE, Smartphone',NULL,'B09MCKK9NX','https://m.media-amazon.com/images/I/61cHbjMo7IL._AC_UY218_.jpg',17744,4.8,'$9.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Lamicall-Foldable-Phone-Stand-Desk/dp/B09MCKK9NX/ref=sr_1_32?keywords=computer+accessories&qid=1703020475&sr=8-32',52,'2023-12-19 15:14:36.684093-06','2023-12-19 15:14:36.684093-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (3999,'PC Gaming Headset Headphone Hook Holder Hanger Mount, Headphones Stand with Adjustable & Rotating Arm Clamp, Under Desk Design, Universal Fit, Built in Cable Clip Organizer EURPMASK',NULL,'B07BVK2FQW','https://m.media-amazon.com/images/I/616qQCQHs2L._AC_UY218_.jpg',26593,4.7,'$12.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Headphone-Headphones-Adjustable-Universal-EURPMASK/dp/B07BVK2FQW/ref=sr_1_33?keywords=computer+accessories&qid=1703020475&sr=8-33',52,'2023-12-19 15:14:36.691757-06','2023-12-19 15:14:36.691757-06','www.amazon.com'), + (4000,'PASOW 50pcs Cable Ties Reusable Fastening Wire Organizer Cord Rope Holder 7 Inch (Black)',NULL,'B0154MS9Q0','https://m.media-amazon.com/images/I/71vOgb6rIoL._AC_UY218_.jpg',25380,4.7,'$5.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Pasow-Reusable-Fastening-Organizer-Holder/dp/B0154MS9Q0/ref=sr_1_34?keywords=computer+accessories&qid=1703020475&sr=8-34',52,'2023-12-19 15:14:36.701262-06','2023-12-19 15:14:36.701262-06','www.amazon.com'), + (4001,'Power Strip, SUPERDANNY Surge Protector with 22 AC Outlets and 6 USB Charging Ports, 1875W/15A, 2100 Joules, 6.5Ft Flat Plug Heavy Duty Extension Cord for Home, Office, Dorm, Gaming Room, Black',NULL,'B08Z2ZKVXX','https://m.media-amazon.com/images/I/71bPzJg1JoL._AC_UY218_.jpg',7679,4.8,'$25.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/SUPERDANNY-Protector-Outlets-Charging-Extension/dp/B08Z2ZKVXX/ref=sr_1_35?keywords=computer+accessories&qid=1703020475&sr=8-35',52,'2023-12-19 15:14:36.708267-06','2023-12-19 15:14:36.708267-06','www.amazon.com'), + (4002,'N NOROCME 192 PCS Cable Management Kit 4 Wire Organizer Sleeve,11 Cable Holder,35Cord Clips 10+2 Roll Cable Organizer Straps and 100 Fastening Cable Ties for Computer TV Under Desk, black,clear',NULL,'B0B687J37D','https://m.media-amazon.com/images/I/81F7bTfj+4L._AC_UY218_.jpg',2598,4.6,'$14.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Management-Organizer-Sleeve-Fastening-Computer/dp/B0B687J37D/ref=sr_1_36?keywords=computer+accessories&qid=1703020475&sr=8-36',52,'2023-12-19 15:14:36.714863-06','2023-12-19 15:14:36.714863-06','www.amazon.com'), + (4003,'TRZLIFE Desk Vacuum Cleaner, Upgraded Mini Table Vacuum Improved Details Higher Suction More Durable Rechargeable Energy Saving Mini Vac Sucks up Tiny Items Crumbs Flakes for Desktop Drawer Countertop',NULL,'B08V91626C','https://m.media-amazon.com/images/I/71uWfO8AcaL._AC_UY218_.jpg',1427,4.3,'$18.97','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3ODc3ODM0NzI2MjIxNzE3OjE3MDMwMjA0NzU6c3BfYnRmOjIwMDA2NjQzMzg0MDE1MTo6MDo6&url=%2FTRZLIFE-Cleaner%25EF%25BC%258CMini-Endurance-Stronger-Rotatable%2Fdp%2FB08V91626C%2Fref%3Dsr_1_38_sspa%3Fkeywords%3Dcomputer%2Baccessories%26qid%3D1703020475%26sr%3D8-38-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9idGY%26psc%3D1',52,'2023-12-19 15:14:36.721788-06','2023-12-19 15:14:36.721788-06','www.amazon.com'), + (4004,'USB C Docking Station Dual Monitor for Dell/HP/Lenovo/Surface Laptop, 14 in 1 Triple Display Hub Multiple Adapter, Dongle with 2 HDMI 4K+VGA+5 Port+100W PD Charger+Ethernet+SD/TF+Audio',NULL,'B09WDCH35N','https://aax-us-iad.amazon.com/e/loi/imp?b=JHG2rwj8PTxfS1PGfFpOm0cAAAGMg-42cwEAAAH2AQBvbm9fdHhuX2JpZDUgICBvbm9fdHhuX2ltcDEgICBxdbTt',2976,4.1,'$55.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.comhttps://aax-us-iad.amazon.com/x/c/RHG2rwj8PTxfS1PGfFpOm0cAAAGMg-42QQEAAAH2AQBvbm9fdHhuX2JpZDUgICBvbm9fdHhuX2ltcDEgICBxdbTt/https://www.amazon.com/Docking-Station-Monitor-Multiple-Ethernet/dp/B09WDCH35N/ref=sxbs_sbv_search_btf?content-id=amzn1.sym.2066ba78-527e-4aed-9de4-3ba096deb87b%3Aamzn1.sym.2066ba78-527e-4aed-9de4-3ba096deb87b&cv_ct_cx=computer+accessories&keywords=computer+accessories&pd_rd_i=B09WDCH35N&pd_rd_r=47595611-18b9-4e09-8833-7a48d9718be9&pd_rd_w=bGwkl&pd_rd_wg=t4Fyc&pf_rd_p=2066ba78-527e-4aed-9de4-3ba096deb87b&pf_rd_r=J6JCMFT3ZX5FDJPKVKGV&qid=1703020475&sbo=RZvfv%2F%2FHxDF%2BO5021pAnSA%3D%3D&sr=1-17-48f7baba-8e26-45f3-8811-e1a601ad20bf',52,'2023-12-19 15:14:36.728348-06','2023-12-19 15:14:36.728348-06','www.amazon.comhttps:'), + (4005,'VILOCY',NULL,'B0BZSBKRN3','https://m.media-amazon.com/images/I/81S-ZjeSElL._AC_UL320_.jpg',3612,4.4,'$45.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4ODM4Mjc3OTMzNzI1NzE3OjE3MDMwMjA0ODM6c3BfYXRmOjIwMDE2MDEzOTIwNjk5ODo6MDo6&url=%2FVILOCY-Sneakers-Lightweight-Comfortable-Breathable%2Fdp%2FB0BZSBKRN3%2Fref%3Dsr_1_1_sspa%3Fkeywords%3Dmen%2527s%2Bshoes%26qid%3D1703020483%26sr%3D8-1-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGY%26psc%3D1',53,'2023-12-19 15:14:44.637057-06','2023-12-19 15:14:44.637057-06','www.amazon.com'), + (4006,'Skechers',NULL,'B0756BS917','https://m.media-amazon.com/images/I/71J7UawwfxL._AC_UL320_.jpg',33209,4.6,'$49.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Skechers-Classic-Fit-Delson-Camden-Sneaker-black/dp/B0756BS917/ref=sr_1_2?keywords=men%27s+shoes&qid=1703020483&sr=8-2',53,'2023-12-19 15:14:44.647113-06','2023-12-19 15:14:44.647113-06','www.amazon.com'), + (4007,'Under Armour',NULL,'B087Z1Y7S7','https://m.media-amazon.com/images/I/410-L0vF3+L._AC_UL320_.jpg',55247,4.6,'$49.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Under-Armour-Charged-Assert-Black/dp/B087Z1Y7S7/ref=sr_1_3?keywords=men%27s+shoes&qid=1703020483&sr=8-3',53,'2023-12-19 15:14:44.655377-06','2023-12-19 15:14:44.655377-06','www.amazon.com'), + (4008,'Under Armour',NULL,'B09XBV3828','https://m.media-amazon.com/images/I/61VrbOtzDXL._AC_UL320_.jpg',1814,4.5,'$49.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Under-Armour-Charged-Assert-Running/dp/B09XBV3828/ref=sr_1_4?keywords=men%27s+shoes&qid=1703020483&sr=8-4',53,'2023-12-19 15:14:44.662829-06','2023-12-19 15:14:44.662829-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4583,'Travel Power Strip, NTONPOWER 3 Outlets 3 USB Portable Desktop Charging Station Short Extension Cord 15 inches for Office, Home, Hotels, Cruise Ship, Nightstand, White',NULL,'B073ZDH43X','https://m.media-amazon.com/images/I/61eeYMMCzZL._AC_UL320_.jpg',9745,4.6,'$19.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Travel-Power-Strip-NTONPOWER-Nightstand/dp/B073ZDH43X/ref=sr_1_91?keywords=travel+accessories&qid=1703020686&sr=8-91',57,'2023-12-19 15:18:08.076317-06','2023-12-19 15:18:08.076317-06','www.amazon.com'), + (4051,'Columbia',NULL,'B089FCC5KS','https://m.media-amazon.com/images/I/61wRs38mw1L._AC_UL320_.jpg',861,4.5,'$57.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Columbia-Tamiami-Slate-Light-Orange/dp/B089FCC5KS/ref=sr_1_41?keywords=men%27s+shoes&qid=1703020483&sr=8-41',53,'2023-12-19 15:14:45.014386-06','2023-12-19 15:14:45.014386-06','www.amazon.com'), + (4052,'Skechers',NULL,'B01L04GQL6','https://m.media-amazon.com/images/I/81QqLikuSqL._AC_UL320_.jpg',38920,4.6,'$40.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Skechers-Expected-Avillo-Slip-Loafer/dp/B01L04GQL6/ref=sr_1_42?keywords=men%27s+shoes&qid=1703020483&sr=8-42',53,'2023-12-19 15:14:45.021351-06','2023-12-19 15:14:45.021351-06','www.amazon.com'), + (4010,'VILOCY',NULL,'B0B3TB6QJC','https://m.media-amazon.com/images/I/81NmU6rAQ1L._AC_UL320_.jpg',3612,4.4,'$45.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo2NzY2NDMyOTg4NjMzNzE3OjE3MDMwMjA0ODM6c3Bfc2VhcmNoX3RoZW1hdGljOjIwMDA3MzgyNTgwMTU5ODo6MDo6&url=%2FVILOCY-Sneakers-Oxfords-Business-Lightweight%2Fdp%2FB0B3TB6QJC%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.cbead6fc-f00c-4cd7-8558-497bc91856e7%253Aamzn1.sym.cbead6fc-f00c-4cd7-8558-497bc91856e7%26cv_ct_cx%3Dmen%2527s%2Bshoes%26keywords%3Dmen%2527s%2Bshoes%26pd_rd_i%3DB0B3TB6QJC%26pd_rd_r%3Dfef79979-9e10-4c41-93df-66264ef487bb%26pd_rd_w%3DKeXdG%26pd_rd_wg%3DCfwmO%26pf_rd_p%3Dcbead6fc-f00c-4cd7-8558-497bc91856e7%26pf_rd_r%3DPHA3F06ED7ADFY0X79V3%26qid%3D1703020483%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-1-183302c6-8dec-4386-8e58-6031e7be5ad8-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',53,'2023-12-19 15:14:44.680584-06','2023-12-19 15:14:54.141435-06','www.amazon.com'), + (4011,'Jousen',NULL,'B07THGXGVL','https://m.media-amazon.com/images/I/71bzAXD2jAL._AC_UL320_.jpg',2713,4.4,'$48.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo2NzY2NDMyOTg4NjMzNzE3OjE3MDMwMjA0ODM6c3Bfc2VhcmNoX3RoZW1hdGljOjMwMDAyMzQyNDkzOTAwMjo6MTo6&url=%2FJOUSEN-Oxford-Lightweight-Classic-Casual%2Fdp%2FB07THGXGVL%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.cbead6fc-f00c-4cd7-8558-497bc91856e7%253Aamzn1.sym.cbead6fc-f00c-4cd7-8558-497bc91856e7%26cv_ct_cx%3Dmen%2527s%2Bshoes%26keywords%3Dmen%2527s%2Bshoes%26pd_rd_i%3DB07THGXGVL%26pd_rd_r%3Dfef79979-9e10-4c41-93df-66264ef487bb%26pd_rd_w%3DKeXdG%26pd_rd_wg%3DCfwmO%26pf_rd_p%3Dcbead6fc-f00c-4cd7-8558-497bc91856e7%26pf_rd_r%3DPHA3F06ED7ADFY0X79V3%26qid%3D1703020483%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-2-183302c6-8dec-4386-8e58-6031e7be5ad8-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',53,'2023-12-19 15:14:44.687485-06','2023-12-19 15:14:44.687485-06','www.amazon.com'), + (4012,'VAMJAM',NULL,'B08FQRW2GK','https://m.media-amazon.com/images/I/71C4-3Ksp-L._AC_UL320_.jpg',7680,4.1,'$34.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo2NzY2NDMyOTg4NjMzNzE3OjE3MDMwMjA0ODM6c3Bfc2VhcmNoX3RoZW1hdGljOjIwMDA4OTg5MTc0MzgzMTo6Mjo6&url=%2FYDB-Lightweight-Breathable-Athletic-Sneakers%2Fdp%2FB08FQRW2GK%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.cbead6fc-f00c-4cd7-8558-497bc91856e7%253Aamzn1.sym.cbead6fc-f00c-4cd7-8558-497bc91856e7%26cv_ct_cx%3Dmen%2527s%2Bshoes%26keywords%3Dmen%2527s%2Bshoes%26pd_rd_i%3DB08FQRW2GK%26pd_rd_r%3Dfef79979-9e10-4c41-93df-66264ef487bb%26pd_rd_w%3DKeXdG%26pd_rd_wg%3DCfwmO%26pf_rd_p%3Dcbead6fc-f00c-4cd7-8558-497bc91856e7%26pf_rd_r%3DPHA3F06ED7ADFY0X79V3%26qid%3D1703020483%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-3-183302c6-8dec-4386-8e58-6031e7be5ad8-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',53,'2023-12-19 15:14:44.695372-06','2023-12-19 15:14:44.695372-06','www.amazon.com'), + (4013,'Kkyc',NULL,'B08PQM34J1','https://m.media-amazon.com/images/I/818qTgbuvOL._AC_UL320_.jpg',1448,4.3,'$40.97','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo2NzY2NDMyOTg4NjMzNzE3OjE3MDMwMjA0ODM6c3Bfc2VhcmNoX3RoZW1hdGljOjMwMDEwMzAzNzYyNDYwMjo6Mzo6&url=%2FKkyc-Shoes-Comfortable-Casual-Light%2Fdp%2FB08PQM34J1%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.cbead6fc-f00c-4cd7-8558-497bc91856e7%253Aamzn1.sym.cbead6fc-f00c-4cd7-8558-497bc91856e7%26cv_ct_cx%3Dmen%2527s%2Bshoes%26keywords%3Dmen%2527s%2Bshoes%26pd_rd_i%3DB08PQM34J1%26pd_rd_r%3Dfef79979-9e10-4c41-93df-66264ef487bb%26pd_rd_w%3DKeXdG%26pd_rd_wg%3DCfwmO%26pf_rd_p%3Dcbead6fc-f00c-4cd7-8558-497bc91856e7%26pf_rd_r%3DPHA3F06ED7ADFY0X79V3%26qid%3D1703020483%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-4-183302c6-8dec-4386-8e58-6031e7be5ad8-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',53,'2023-12-19 15:14:44.701222-06','2023-12-19 15:14:44.701222-06','www.amazon.com'), + (4009,'VILOCY',NULL,'B0BM3PRQF9','https://m.media-amazon.com/images/I/81TLZ0RTLRL._AC_UL320_.jpg',681,4.5,'$45.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo2NzY2NDMyOTg4NjMzNzE3OjE3MDMwMjA0ODM6c3Bfc2VhcmNoX3RoZW1hdGljOjIwMDE3NzYyNzQ4NTU5ODo6NDo6&url=%2FOxfords-Business-Comfortable-Breathable-Lightweight%2Fdp%2FB0BM3PRQF9%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.cbead6fc-f00c-4cd7-8558-497bc91856e7%253Aamzn1.sym.cbead6fc-f00c-4cd7-8558-497bc91856e7%26cv_ct_cx%3Dmen%2527s%2Bshoes%26keywords%3Dmen%2527s%2Bshoes%26pd_rd_i%3DB0BM3PRQF9%26pd_rd_r%3Dfef79979-9e10-4c41-93df-66264ef487bb%26pd_rd_w%3DKeXdG%26pd_rd_wg%3DCfwmO%26pf_rd_p%3Dcbead6fc-f00c-4cd7-8558-497bc91856e7%26pf_rd_r%3DPHA3F06ED7ADFY0X79V3%26qid%3D1703020483%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-5-183302c6-8dec-4386-8e58-6031e7be5ad8-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',53,'2023-12-19 15:14:44.671577-06','2023-12-19 15:14:44.707961-06','www.amazon.com'), + (4014,'Bruno Marc',NULL,'B07ZLSTZGB','https://m.media-amazon.com/images/I/714vviCL5XL._AC_UL320_.jpg',10744,4.6,'$39.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Bruno-Marc-Sneakers-Lightweight-Grand-01/dp/B07ZLSTZGB/ref=sr_1_5?keywords=men%27s+shoes&qid=1703020483&sr=8-5',53,'2023-12-19 15:14:44.713953-06','2023-12-19 15:14:44.713953-06','www.amazon.com'), + (4015,'Merrell',NULL,'B000B2IUFO','https://m.media-amazon.com/images/I/61zSN8scjNL._AC_UL320_.jpg',34916,4.6,'$57.86','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Merrell-Mens-Jungle-Slip-Gunsmoke/dp/B000B2IUFO/ref=sr_1_6?keywords=men%27s+shoes&qid=1703020483&sr=8-6',53,'2023-12-19 15:14:44.720042-06','2023-12-19 15:14:44.720042-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4016,'Skechers',NULL,'B00D881IBG','https://m.media-amazon.com/images/I/81d5u6zG-EL._AC_UL320_.jpg',75634,4.4,'$51.84','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Skechers-Afterburn-fashion-sneakers-Black/dp/B00D881IBG/ref=sr_1_7?keywords=men%27s+shoes&qid=1703020483&sr=8-7',53,'2023-12-19 15:14:44.727132-06','2023-12-19 15:14:44.727132-06','www.amazon.com'), + (4017,'Clarks',NULL,'B004DCSYZE','https://m.media-amazon.com/images/I/71NjblvJxoL._AC_UL320_.jpg',23768,4.3,'$43.40','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Clarks-Mens-Bushacre-Beeswax-12/dp/B004DCSYZE/ref=sr_1_8?keywords=men%27s+shoes&qid=1703020483&sr=8-8',53,'2023-12-19 15:14:44.732936-06','2023-12-19 15:14:44.732936-06','www.amazon.com'), + (4018,'Steve Madden',NULL,'B01LW2SL7R','https://m.media-amazon.com/images/I/813UuOjWfZL._AC_UL320_.jpg',6115,4.3,'$49.92','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Steve-Madden-Fashion-Sneaker-Fabric/dp/B01LW2SL7R/ref=sr_1_9?keywords=men%27s+shoes&qid=1703020483&sr=8-9',53,'2023-12-19 15:14:44.739894-06','2023-12-19 15:14:44.739894-06','www.amazon.com'), + (4019,'Dr. Scholl''s Shoes',NULL,'B07TWCKYGH','https://m.media-amazon.com/images/I/71pFL31UYqL._AC_UL320_.jpg',4487,4.3,'$65.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Dr-Scholls-Shoes-Mens-Oxford/dp/B07TWCKYGH/ref=sr_1_10?keywords=men%27s+shoes&qid=1703020483&sr=8-10',53,'2023-12-19 15:14:44.74996-06','2023-12-19 15:14:44.74996-06','www.amazon.com'), + (4020,'Vostey',NULL,'B0CB4CKCQB','https://m.media-amazon.com/images/I/81vt-LqQ6FL._AC_UL320_.jpg',23,4.7,'$45.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4ODM4Mjc3OTMzNzI1NzE3OjE3MDMwMjA0ODM6c3BfbXRmOjMwMDA4MDk1MDg0ODgwMjo6MDo6&url=%2FVostey-Loafers-Slip-ons-Lightweight-BMY3036%2Fdp%2FB0CB4CKCQB%2Fref%3Dsr_1_11_sspa%3Fkeywords%3Dmen%2527s%2Bshoes%26qid%3D1703020483%26sr%3D8-11-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',53,'2023-12-19 15:14:44.757532-06','2023-12-19 15:14:44.757532-06','www.amazon.com'), + (4021,'UMYOGO',NULL,'B07NRYTNXJ','https://m.media-amazon.com/images/I/71Hexq78RTL._AC_UL320_.jpg',37603,4.2,'$45.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4ODM4Mjc3OTMzNzI1NzE3OjE3MDMwMjA0ODM6c3BfbXRmOjIwMDA4OTAzNTk1MjY5ODo6MDo6&url=%2FUMYOGO-Athletic-Walking-Running-Sneakers%2Fdp%2FB07NRYTNXJ%2Fref%3Dsr_1_12_sspa%3Fkeywords%3Dmen%2527s%2Bshoes%26qid%3D1703020483%26sr%3D8-12-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',53,'2023-12-19 15:14:44.767373-06','2023-12-19 15:14:44.767373-06','www.amazon.com'), + (4022,'SKDOIUL',NULL,'B0C7KWG577','https://m.media-amazon.com/images/I/819P3ge+geL._AC_UL320_.jpg',32,4.3,'$33.90','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4ODM4Mjc3OTMzNzI1NzE3OjE3MDMwMjA0ODM6c3BfbXRmOjMwMDAzNTAxNTc3NDcwMjo6MDo6&url=%2FSKDOIUL-Walking-Sneakers-Breathable-Comfort%2Fdp%2FB0C7KWG577%2Fref%3Dsr_1_13_sspa%3Fkeywords%3Dmen%2527s%2Bshoes%26qid%3D1703020483%26sr%3D8-13-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',53,'2023-12-19 15:14:44.774939-06','2023-12-19 15:14:44.774939-06','www.amazon.com'), + (4024,'VILOCY',NULL,'B0BKL32VLM','https://aax-us-iad.amazon.com/e/loi/imp?b=JPd_tRa4GPts74ZWhuszg5kAAAGMg-5TKgEAAAH2AQBvbm9fdHhuX2JpZDYgICBvbm9fdHhuX2ltcDEgICBoy_lD',3612,4.4,'$45.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.comhttps://aax-us-iad.amazon.com/x/c/RPd_tRa4GPts74ZWhuszg5kAAAGMg-5S6wEAAAH2AQBvbm9fdHhuX2JpZDYgICBvbm9fdHhuX2ltcDEgICBoy_lD/https://www.amazon.com/VILOCY-Sneakers-Oxfords-Business-Lightweight/dp/B0BKL32VLM/ref=sxin_23_sbv_search_btf?content-id=amzn1.sym.6ca944f8-539c-499e-a3a4-26a566d1de59%3Aamzn1.sym.6ca944f8-539c-499e-a3a4-26a566d1de59&cv_ct_cx=men%27s+shoes&keywords=men%27s+shoes&pd_rd_i=B0BKL32VLM&pd_rd_r=fef79979-9e10-4c41-93df-66264ef487bb&pd_rd_w=mcZ5Y&pd_rd_wg=CfwmO&pf_rd_p=6ca944f8-539c-499e-a3a4-26a566d1de59&pf_rd_r=PHA3F06ED7ADFY0X79V3&qid=1703020483&sbo=RZvfv%2F%2FHxDF%2BO5021pAnSA%3D%3D&sr=1-1-5190daf0-67e3-427c-bea6-c72c1df98776',53,'2023-12-19 15:14:44.79158-06','2023-12-19 15:14:44.79158-06','www.amazon.comhttps:'), + (4025,'adidas',NULL,'B096HLGK4V','https://m.media-amazon.com/images/I/71FBY-t7AwL._AC_UL320_.jpg',1678,4.6,'$56.22','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/adidas-Spikeless-Shoes-Footwear-White/dp/B096HLGK4V/ref=sr_1_15?keywords=men%27s+shoes&qid=1703020483&sr=8-15',53,'2023-12-19 15:14:44.798002-06','2023-12-19 15:14:44.798002-06','www.amazon.com'), + (4026,'adidas',NULL,'B07ZSCB99R','https://m.media-amazon.com/images/I/71-3MqaCozL._AC_UL320_.jpg',14327,4.7,'$64.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/adidas-Daily-Skate-Black-White/dp/B07ZSCB99R/ref=sr_1_16?keywords=men%27s+shoes&qid=1703020483&sr=8-16',53,'2023-12-19 15:14:44.809495-06','2023-12-19 15:14:44.809495-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4027,'Clarks',NULL,'B074V67KGJ','https://m.media-amazon.com/images/I/7136WF4PjnL._AC_UL320_.jpg',6602,4.5,'$52.55','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/CLARKS-Cotrell-Loafer-Tobacco-Leather/dp/B074V67KGJ/ref=sr_1_17?keywords=men%27s+shoes&qid=1703020483&sr=8-17',53,'2023-12-19 15:14:44.815388-06','2023-12-19 15:14:44.815388-06','www.amazon.com'), + (4028,'Reebok',NULL,'B071FSRX53','https://m.media-amazon.com/images/I/71YAz2R2D8L._AC_UL320_.jpg',7826,4.4,'$52.81','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Reebok-Workout-Trainer-Carbon-Classic/dp/B071FSRX53/ref=sr_1_18?keywords=men%27s+shoes&qid=1703020483&sr=8-18',53,'2023-12-19 15:14:44.821326-06','2023-12-19 15:14:44.821326-06','www.amazon.com'), + (4029,'FRSHANIAH',NULL,'B08R979J5V','https://m.media-amazon.com/images/I/61mY1z+neEL._AC_UL320_.jpg',4730,4.2,'$39.90','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4ODM4Mjc3OTMzNzI1NzE3OjE3MDMwMjA0ODM6c3BfbXRmOjIwMDE1MzE0MTI0NjM5ODo6MDo6&url=%2FFRSHANIAH-Sneakers-Running-Athletic-Breathable%2Fdp%2FB08R979J5V%2Fref%3Dsr_1_19_sspa%3Fkeywords%3Dmen%2527s%2Bshoes%26qid%3D1703020483%26sr%3D8-19-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',53,'2023-12-19 15:14:44.827465-06','2023-12-19 15:14:44.827465-06','www.amazon.com'), + (4030,'Wrezatro',NULL,'B09JBX9LTH','https://m.media-amazon.com/images/I/71UNzuaKlvL._AC_UL320_.jpg',2092,4.1,'$27.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4ODM4Mjc3OTMzNzI1NzE3OjE3MDMwMjA0ODM6c3BfbXRmOjIwMDAyMjgzNTU1NTA5ODo6MDo6&url=%2FWrezatro-Walking-Breathable-Running-Sneakers%2Fdp%2FB09JBX9LTH%2Fref%3Dsr_1_20_sspa%3Fkeywords%3Dmen%2527s%2Bshoes%26qid%3D1703020483%26sr%3D8-20-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',53,'2023-12-19 15:14:44.833725-06','2023-12-19 15:14:44.833725-06','www.amazon.com'), + (4031,'HHP',NULL,'B0BDFPZS1Z','https://m.media-amazon.com/images/I/71ljMvZMrGL._AC_UL320_.jpg',388,4.4,'$29.91','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4ODM4Mjc3OTMzNzI1NzE3OjE3MDMwMjA0ODM6c3BfbXRmOjMwMDEwMzg2ODk5NTEwMjo6MDo6&url=%2FHHP-Mens-Running-Shoes-Sneakers%2Fdp%2FB0BDFPZS1Z%2Fref%3Dsr_1_21_sspa%3Fkeywords%3Dmen%2527s%2Bshoes%26qid%3D1703020483%26sr%3D8-21-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',53,'2023-12-19 15:14:44.841139-06','2023-12-19 15:14:44.841139-06','www.amazon.com'), + (4032,'Kapsen',NULL,'B092MC6BFZ','https://m.media-amazon.com/images/I/71YQNz3uzyL._AC_UL320_.jpg',2080,4.1,'$31.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4ODM4Mjc3OTMzNzI1NzE3OjE3MDMwMjA0ODM6c3BfbXRmOjIwMDEwNTEyNzI0MzYzMTo6MDo6&url=%2FRunning-Walking-Sneakers-Breathable-Trainers%2Fdp%2FB092MC6BFZ%2Fref%3Dsr_1_22_sspa%3Fkeywords%3Dmen%2527s%2Bshoes%26qid%3D1703020483%26sr%3D8-22-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',53,'2023-12-19 15:14:44.851705-06','2023-12-19 15:14:44.851705-06','www.amazon.com'), + (4033,'adidas',NULL,'B0BG93GBMP','https://m.media-amazon.com/images/I/71nRAZxGg3L._AC_UL320_.jpg',212,4.6,'$63.71','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/adidas-Mens-Kaptir-Sneaker-White/dp/B0BG93GBMP/ref=sr_1_23?keywords=men%27s+shoes&qid=1703020483&sr=8-23',53,'2023-12-19 15:14:44.858822-06','2023-12-19 15:14:44.858822-06','www.amazon.com'), + (4034,'ASICS',NULL,'B08PL662NN','https://m.media-amazon.com/images/I/51l7n7bEfRL._AC_UL320_.jpg',12272,4.5,'$39.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/ASICS-Gel-Contend-Running-Shoes-Black/dp/B08PL662NN/ref=sr_1_24?keywords=men%27s+shoes&qid=1703020483&sr=8-24',53,'2023-12-19 15:14:44.866081-06','2023-12-19 15:14:44.866081-06','www.amazon.com'), + (4035,'Bruno Marc',NULL,'B01N3MAX7M','https://m.media-amazon.com/images/I/81We33yH25L._AC_UL320_.jpg',10167,4.2,'$37.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Bruno-RIVERA-01-Black-Oxfords-Sneakers/dp/B01N3MAX7M/ref=sr_1_25?keywords=men%27s+shoes&qid=1703020483&sr=8-25',53,'2023-12-19 15:14:44.875299-06','2023-12-19 15:14:44.875299-06','www.amazon.com'), + (4036,'PUMA',NULL,'B08KK9J54W','https://m.media-amazon.com/images/I/81tc6arDvFL._AC_UL320_.jpg',10588,4.5,'$54.97','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/PUMA-Mens-Axelion-Running-Black-Castlerock/dp/B08KK9J54W/ref=sr_1_26?keywords=men%27s+shoes&qid=1703020483&sr=8-26',53,'2023-12-19 15:14:44.887025-06','2023-12-19 15:14:44.887025-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4037,'Kapsen',NULL,'B09PN75PF5','https://m.media-amazon.com/images/I/711asHME6pL._AC_UL320_.jpg',1586,4.3,'$29.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4ODM4Mjc3OTMzNzI1NzE3OjE3MDMwMjA0ODM6c3BfbXRmOjIwMDA0NTMwNzQ1MjQ5ODo6MDo6&url=%2FKapsen-Running-Breathable-Walking-Sneakers%2Fdp%2FB09PN75PF5%2Fref%3Dsr_1_27_sspa%3Fkeywords%3Dmen%2527s%2Bshoes%26qid%3D1703020483%26sr%3D8-27-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',53,'2023-12-19 15:14:44.896884-06','2023-12-19 15:14:44.896884-06','www.amazon.com'), + (4038,'TSIODFO',NULL,'B091JXKZY8','https://m.media-amazon.com/images/I/81S9qXanHKS._AC_UL320_.jpg',3717,4.1,'$36.90','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4ODM4Mjc3OTMzNzI1NzE3OjE3MDMwMjA0ODM6c3BfbXRmOjIwMDA3NTIxNDEwMDEyMTo6MDo6&url=%2FSneakers-Fashion-Running-Athletic-Trainers%2Fdp%2FB091JXKZY8%2Fref%3Dsr_1_28_sspa%3Fkeywords%3Dmen%2527s%2Bshoes%26qid%3D1703020483%26sr%3D8-28-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',53,'2023-12-19 15:14:44.904519-06','2023-12-19 15:14:44.904519-06','www.amazon.com'), + (4039,'Kricely',NULL,'B0CFF1NTYT','https://m.media-amazon.com/images/I/71QV8eYSQ9L._AC_UL320_.jpg',472,4.1,'$43.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4ODM4Mjc3OTMzNzI1NzE3OjE3MDMwMjA0ODM6c3BfbXRmOjMwMDA2NDM5MjI2NTMwMjo6MDo6&url=%2FKricely-Walking-Breathable-Lightweight-Sneakers%2Fdp%2FB0CFF1NTYT%2Fref%3Dsr_1_29_sspa%3Fkeywords%3Dmen%2527s%2Bshoes%26qid%3D1703020483%26sr%3D8-29-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',53,'2023-12-19 15:14:44.915823-06','2023-12-19 15:14:44.915823-06','www.amazon.com'), + (4040,'Skechers',NULL,'B0864TN1V4','https://m.media-amazon.com/images/I/71rvcOg6-QL._AC_UL320_.jpg',2119,4.6,'$40.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Skechers-Track-Moulton-Oxford-Black/dp/B0864TN1V4/ref=sr_1_30?keywords=men%27s+shoes&qid=1703020483&sr=8-30',53,'2023-12-19 15:14:44.927038-06','2023-12-19 15:14:44.927038-06','www.amazon.com'), + (4058,'Rockport',NULL,'B000W8WVUW','https://m.media-amazon.com/images/I/71T-kM6A9uL._AC_UL320_.jpg',25324,4.3,'$61.60','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Rockport-Mens-Eureka-Walking-Brown/dp/B000W8WVUW/ref=sr_1_49?keywords=men%27s+shoes&qid=1703020483&sr=8-49',53,'2023-12-19 15:14:45.069957-06','2023-12-19 15:14:45.069957-06','www.amazon.com'), + (4059,'Under Armour',NULL,'B0BGQQXQYX','https://m.media-amazon.com/images/I/71ucAy2MNcL._AC_UL320_.jpg',9,3.9,'$54.75','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Under-Armour-Charged-Impulse-Running/dp/B0BGQQXQYX/ref=sr_1_50?keywords=men%27s+shoes&qid=1703020483&sr=8-50',53,'2023-12-19 15:14:45.081153-06','2023-12-19 15:14:45.081153-06','www.amazon.com'), + (4060,'Dr. Scholl''s Shoes',NULL,'B0CBLDFVQ6','https://m.media-amazon.com/images/I/51aQvNB5pTL._AC_UL320_.jpg',65,4.0,'$29.74','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Scholls-Jeff-Leather-Stacked-Rounded/dp/B0CBLDFVQ6/ref=sr_1_51?keywords=men%27s+shoes&qid=1703020483&sr=8-51',53,'2023-12-19 15:14:45.089034-06','2023-12-19 15:14:45.089034-06','www.amazon.com'), + (4061,'Columbia',NULL,'B01015LM5A','https://m.media-amazon.com/images/I/61PAldp2I1L._AC_UL320_.jpg',3336,4.6,'$53.19','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Columbia-Mens-Bahama-Vent-Gypsy/dp/B01015LM5A/ref=sr_1_53?keywords=men%27s+shoes&qid=1703020483&sr=8-53',53,'2023-12-19 15:14:45.099822-06','2023-12-19 15:14:45.099822-06','www.amazon.com'), + (4062,'Bruno Marc',NULL,'B07FCZJSHM','https://m.media-amazon.com/images/I/713e1SamhNL._AC_UL320_.jpg',3141,4.5,'$39.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Bruno-Marc-HUTCHINGSON_2-Camel-Oxford/dp/B07FCZJSHM/ref=sr_1_54?keywords=men%27s+shoes&qid=1703020483&sr=8-54',53,'2023-12-19 15:14:45.107754-06','2023-12-19 15:14:45.107754-06','www.amazon.com'), + (4063,'Bruno Marc',NULL,'B0C9ZCN5QZ','https://m.media-amazon.com/images/I/71Or1R+gVLL._AC_UL320_.jpg',31,4.7,'$29.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Bruno-Marc-Comfortable-Sneakers-SBFS228M-1/dp/B0C9ZCN5QZ/ref=sr_1_55?keywords=men%27s+shoes&qid=1703020483&sr=8-55',53,'2023-12-19 15:14:45.116432-06','2023-12-19 15:14:45.116432-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4064,'Bruno Marc',NULL,'B0CJ8ZLQW6','https://m.media-amazon.com/images/I/811f4yJyvCL._AC_UL320_.jpg',20,4.4,'$37.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Bruno-Marc-Resistant-Restaurant-SBWO2302M/dp/B0CJ8ZLQW6/ref=sr_1_56?keywords=men%27s+shoes&qid=1703020483&sr=8-56',53,'2023-12-19 15:14:45.123736-06','2023-12-19 15:14:45.123736-06','www.amazon.com'), + (4065,'PUMA',NULL,'B07FZZ7DJ4','https://m.media-amazon.com/images/I/71UR4AP4hVL._AC_UL320_.jpg',1463,4.5,'$53.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/PUMA-Mens-Astro-Sneaker-Black-White-teamgold/dp/B07FZZ7DJ4/ref=sr_1_57?keywords=men%27s+shoes&qid=1703020483&sr=8-57',53,'2023-12-19 15:14:45.133252-06','2023-12-19 15:14:45.133252-06','www.amazon.com'), + (4066,'Skechers',NULL,'B0755ZRTBN','https://m.media-amazon.com/images/I/81R6Yd9ONTS._AC_UL320_.jpg',15760,4.7,'$44.97','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Skechers-Relaxed-Fit-Creston-Moseco-Moccasin-Charcoal/dp/B0755ZRTBN/ref=sr_1_58?keywords=men%27s+shoes&qid=1703020483&sr=8-58',53,'2023-12-19 15:14:45.140995-06','2023-12-19 15:14:45.140995-06','www.amazon.com'), + (4067,'Skechers',NULL,'B07FMWZLGW','https://m.media-amazon.com/images/I/61GF68th8tL._AC_UL320_.jpg',41105,4.6,'$44.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Skechers-Evolution-Ultra-Impeccable-Sneaker-Black/dp/B07FMWZLGW/ref=sr_1_59?keywords=men%27s+shoes&qid=1703020483&sr=8-59',53,'2023-12-19 15:14:45.147088-06','2023-12-19 15:14:45.147088-06','www.amazon.com'), + (4068,'Skechers',NULL,'B07W8ZND8G','https://m.media-amazon.com/images/I/81sesU0lM8L._AC_UL320_.jpg',15164,4.5,'$40.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Skechers-Consistent-Performance-Running-Walking-Sneaker/dp/B07W8ZND8G/ref=sr_1_60?keywords=men%27s+shoes&qid=1703020483&sr=8-60',53,'2023-12-19 15:14:45.154617-06','2023-12-19 15:14:45.154617-06','www.amazon.com'), + (4584,'Tide Liquid Travel Sink Packets, 3-Count',NULL,'B000GCS004','https://m.media-amazon.com/images/I/81J9nylIWWL._AC_UL320_.jpg',26852,4.7,'$4.30','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Tide-Travel-Sink-Packets-3-Count/dp/B000GCS004/ref=sr_1_92?keywords=travel+accessories&qid=1703020686&sr=8-92',57,'2023-12-19 15:18:08.081981-06','2023-12-19 15:18:08.081981-06','www.amazon.com'), + (4070,'VILOCY',NULL,'B0C1B34D46','https://m.media-amazon.com/images/I/81VegEKuCfL._AC_UL320_.jpg',3612,4.4,'$45.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3NjYyODEzOTEyMTI4NzE3OjE3MDMwMjA0ODM6c3Bfc2VhcmNoX3RoZW1hdGljX2J0ZjoyMDAxNjk0NDY2MTgyOTg6OjA6Og&url=%2FVILOCY-Sneakers-Lightweight-Comfortable-Breathable%2Fdp%2FB0C1B34D46%2Fref%3Dsxbs_pa_sp_search_thematic_btf_sspa%3Fcontent-id%3Damzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%253Aamzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%26cv_ct_cx%3Dmen%2527s%2Bshoes%26keywords%3Dmen%2527s%2Bshoes%26pd_rd_i%3DB0C1B34D46%26pd_rd_r%3D9afc1dce-1e50-4683-ad44-970510d1d5f3%26pd_rd_w%3D35dSe%26pd_rd_wg%3DanDJS%26pf_rd_p%3Dc950d26b-f218-41e6-a496-534825ce2131%26pf_rd_r%3DPHA3F06ED7ADFY0X79V3%26qid%3D1703020483%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-1-50a2b317-b617-44c1-b7a6-daec194a2368-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWNfYnRm%26psc%3D1',53,'2023-12-19 15:14:45.168325-06','2023-12-19 15:14:45.168325-06','www.amazon.com'), + (4071,'VAMJAM',NULL,'B08FR6G1M4','https://m.media-amazon.com/images/I/71C4-3Ksp-L._AC_UL320_.jpg',7680,4.1,'$34.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3NjYyODEzOTEyMTI4NzE3OjE3MDMwMjA0ODM6c3Bfc2VhcmNoX3RoZW1hdGljX2J0ZjoyMDAwODk4OTE3NDQyMzE6OjE6Og&url=%2FYDB-Lightweight-Breathable-Athletic-Sneakers%2Fdp%2FB08FR6G1M4%2Fref%3Dsxbs_pa_sp_search_thematic_btf_sspa%3Fcontent-id%3Damzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%253Aamzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%26cv_ct_cx%3Dmen%2527s%2Bshoes%26keywords%3Dmen%2527s%2Bshoes%26pd_rd_i%3DB08FR6G1M4%26pd_rd_r%3D9afc1dce-1e50-4683-ad44-970510d1d5f3%26pd_rd_w%3D35dSe%26pd_rd_wg%3DanDJS%26pf_rd_p%3Dc950d26b-f218-41e6-a496-534825ce2131%26pf_rd_r%3DPHA3F06ED7ADFY0X79V3%26qid%3D1703020483%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-2-50a2b317-b617-44c1-b7a6-daec194a2368-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWNfYnRm%26psc%3D1',53,'2023-12-19 15:14:45.176193-06','2023-12-19 15:14:45.176193-06','www.amazon.com'), + (4094,'SKDOIUL',NULL,'B0946JQ6LY','https://m.media-amazon.com/images/I/81OQaUHx1kS._AC_UL320_.jpg',11120,4.1,'$39.90','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozMDY4MTQzODMwMjM4NzE3OjE3MDMwMjA0OTI6c3BfbXRmOjIwMDA0NDI3NjI4MDc5ODo6MDo6&url=%2FSKDOIUL-Running-Sneakers-Athletic-Breathable%2Fdp%2FB0946JQ6LY%2Fref%3Dsr_1_66_sspa%3Fkeywords%3Dmen%2527s%2Bshoes%26qid%3D1703020492%26sr%3D8-66-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',53,'2023-12-19 15:14:54.255101-06','2023-12-19 15:14:54.255101-06','www.amazon.com'), + (4585,'Foot Rest,Airplane Footrest Made with Premium Foam,Travel Essentials Head Hammock Portable Travel Footrest Flight Carry-On Foot Rest Adjustable Height Foot Rest Travel Accessories Footrests Hammock',NULL,'B07WDQY2Y9','https://m.media-amazon.com/images/I/61SpQq8dPWL._AC_UL320_.jpg',1106,3.9,'$9.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Airplane-Footrest-Adjustable-Accessories-Footrests/dp/B07WDQY2Y9/ref=sr_1_93?keywords=travel+accessories&qid=1703020686&sr=8-93',57,'2023-12-19 15:18:08.087483-06','2023-12-19 15:18:08.087483-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4072,'ENLEN&BENNA',NULL,'B0B185RWSH','https://m.media-amazon.com/images/I/71mztMuCKXL._AC_UL320_.jpg',592,4.4,'$47.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3NjYyODEzOTEyMTI4NzE3OjE3MDMwMjA0ODM6c3Bfc2VhcmNoX3RoZW1hdGljX2J0ZjoyMDAxNTUxOTk4MDk2OTg6OjI6Og&url=%2FENLEN-BENNA-Loafers-Lightweight-Comfortable%2Fdp%2FB0B185RWSH%2Fref%3Dsxbs_pa_sp_search_thematic_btf_sspa%3Fcontent-id%3Damzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%253Aamzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%26cv_ct_cx%3Dmen%2527s%2Bshoes%26keywords%3Dmen%2527s%2Bshoes%26pd_rd_i%3DB0B185RWSH%26pd_rd_r%3D9afc1dce-1e50-4683-ad44-970510d1d5f3%26pd_rd_w%3D35dSe%26pd_rd_wg%3DanDJS%26pf_rd_p%3Dc950d26b-f218-41e6-a496-534825ce2131%26pf_rd_r%3DPHA3F06ED7ADFY0X79V3%26qid%3D1703020483%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-3-50a2b317-b617-44c1-b7a6-daec194a2368-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWNfYnRm%26psc%3D1',53,'2023-12-19 15:14:45.182098-06','2023-12-19 15:14:45.182098-06','www.amazon.com'), + (4073,'Giniros',NULL,'B0BP25HZVL','https://m.media-amazon.com/images/I/71DvNqa6ddL._AC_UL320_.jpg',901,4.2,'$35.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3NjYyODEzOTEyMTI4NzE3OjE3MDMwMjA0ODM6c3Bfc2VhcmNoX3RoZW1hdGljX2J0ZjoyMDAxMjk5NTgxMzEzOTg6OjM6Og&url=%2FGiniros-Running-Breathable-Lightweight-Sneakers%2Fdp%2FB0BP25HZVL%2Fref%3Dsxbs_pa_sp_search_thematic_btf_sspa%3Fcontent-id%3Damzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%253Aamzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%26cv_ct_cx%3Dmen%2527s%2Bshoes%26keywords%3Dmen%2527s%2Bshoes%26pd_rd_i%3DB0BP25HZVL%26pd_rd_r%3D9afc1dce-1e50-4683-ad44-970510d1d5f3%26pd_rd_w%3D35dSe%26pd_rd_wg%3DanDJS%26pf_rd_p%3Dc950d26b-f218-41e6-a496-534825ce2131%26pf_rd_r%3DPHA3F06ED7ADFY0X79V3%26qid%3D1703020483%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-4-50a2b317-b617-44c1-b7a6-daec194a2368-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWNfYnRm%26psc%3D1',53,'2023-12-19 15:14:45.189298-06','2023-12-19 15:14:45.189298-06','www.amazon.com'), + (4069,'Jousen',NULL,'B07VCSJD4N','https://m.media-amazon.com/images/I/811DeEQ8NCL._AC_UL320_.jpg',14435,4.3,'$45.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3NjYyODEzOTEyMTI4NzE3OjE3MDMwMjA0ODM6c3Bfc2VhcmNoX3RoZW1hdGljX2J0ZjoyMDAwNTk1NjgyNjA2OTg6OjQ6Og&url=%2FJOUSEN-Sneakers-Business-Fashion-Sneaker%2Fdp%2FB07VCSJD4N%2Fref%3Dsxbs_pa_sp_search_thematic_btf_sspa%3Fcontent-id%3Damzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%253Aamzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%26cv_ct_cx%3Dmen%2527s%2Bshoes%26keywords%3Dmen%2527s%2Bshoes%26pd_rd_i%3DB07VCSJD4N%26pd_rd_r%3D9afc1dce-1e50-4683-ad44-970510d1d5f3%26pd_rd_w%3D35dSe%26pd_rd_wg%3DanDJS%26pf_rd_p%3Dc950d26b-f218-41e6-a496-534825ce2131%26pf_rd_r%3DPHA3F06ED7ADFY0X79V3%26qid%3D1703020483%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-5-50a2b317-b617-44c1-b7a6-daec194a2368-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWNfYnRm%26psc%3D1',53,'2023-12-19 15:14:45.162116-06','2023-12-19 15:14:45.195138-06','www.amazon.com'), + (4074,'SKDOIUL',NULL,'B0C7L166DW','https://m.media-amazon.com/images/I/71kIjVWHmML._AC_UL320_.jpg',32,4.3,'$33.90','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozMDY4MTQzODMwMjM4NzE3OjE3MDMwMjA0OTI6c3BfYXRmX25leHQ6MzAwMDM1MDE1Nzc0NjAyOjowOjo&url=%2FSKDOIUL-Walking-Sneakers-Breathable-Comfort%2Fdp%2FB0C7L166DW%2Fref%3Dsr_1_49_sspa%3Fkeywords%3Dmen%2527s%2Bshoes%26qid%3D1703020492%26sr%3D8-49-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGZfbmV4dA%26psc%3D1',53,'2023-12-19 15:14:54.043541-06','2023-12-19 15:14:54.043541-06','www.amazon.com'), + (4075,'VAMJAM',NULL,'B08FQS15HW','https://m.media-amazon.com/images/I/71C4-3Ksp-L._AC_UL320_.jpg',7680,4.1,'$34.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozMDY4MTQzODMwMjM4NzE3OjE3MDMwMjA0OTI6c3BfYXRmX25leHQ6MjAwMDg5ODkxNzQ0MTMxOjowOjo&url=%2FYDB-Lightweight-Breathable-Athletic-Sneakers%2Fdp%2FB08FQS15HW%2Fref%3Dsr_1_50_sspa%3Fkeywords%3Dmen%2527s%2Bshoes%26qid%3D1703020492%26sr%3D8-50-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGZfbmV4dA%26psc%3D1',53,'2023-12-19 15:14:54.073242-06','2023-12-19 15:14:54.073242-06','www.amazon.com'), + (4076,'Kapsen',NULL,'B09PN76Y4F','https://m.media-amazon.com/images/I/711asHME6pL._AC_UL320_.jpg',1586,4.3,'$29.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozMDY4MTQzODMwMjM4NzE3OjE3MDMwMjA0OTI6c3BfYXRmX25leHQ6MjAwMDQ1MzA3NDUzMjk4OjowOjo&url=%2FKapsen-Running-Breathable-Walking-Sneakers%2Fdp%2FB09PN76Y4F%2Fref%3Dsr_1_51_sspa%3Fkeywords%3Dmen%2527s%2Bshoes%26qid%3D1703020492%26sr%3D8-51-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGZfbmV4dA%26psc%3D1',53,'2023-12-19 15:14:54.081207-06','2023-12-19 15:14:54.081207-06','www.amazon.com'), + (4077,'WXQ',NULL,'B09YKND6VH','https://m.media-amazon.com/images/I/61m7cJxIPWL._AC_UL320_.jpg',710,4.1,'$30.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozMDY4MTQzODMwMjM4NzE3OjE3MDMwMjA0OTI6c3BfYXRmX25leHQ6MzAwMDM5Mzg4MDc0NTAyOjowOjo&url=%2FWXQ-Running-Comfortable-Lightweight-Breathable%2Fdp%2FB09YKND6VH%2Fref%3Dsr_1_52_sspa%3Fkeywords%3Dmen%2527s%2Bshoes%26qid%3D1703020492%26sr%3D8-52-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGZfbmV4dA%26psc%3D1',53,'2023-12-19 15:14:54.091209-06','2023-12-19 15:14:54.091209-06','www.amazon.com'), + (4078,'adidas',NULL,'B0BHPS6X5Q','https://m.media-amazon.com/images/I/71lu4fM+A6L._AC_UL320_.jpg',220,4.7,'$52.51','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/adidas-Racer-Adapt-Sneaker-Black/dp/B0BHPS6X5Q/ref=sr_1_53?keywords=men%27s+shoes&qid=1703020492&sr=8-53',53,'2023-12-19 15:14:54.097408-06','2023-12-19 15:14:54.097408-06','www.amazon.com'), + (4079,'Clarks',NULL,'B01N2SBH4J','https://m.media-amazon.com/images/I/61kMEn9L13L._AC_UL320_.jpg',10938,4.5,'$42.20','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/CLARKS-Mens-Tilden-Oxford-Leather/dp/B01N2SBH4J/ref=sr_1_54?keywords=men%27s+shoes&qid=1703020492&sr=8-54',53,'2023-12-19 15:14:54.108572-06','2023-12-19 15:14:54.108572-06','www.amazon.com'), + (4080,'Under Armour',NULL,'B0BGQQPCHF','https://m.media-amazon.com/images/I/512P1h2kJxL._AC_UL320_.jpg',6202,4.5,'$57.18','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Under-Armour-Charged-Trainer-Varsity/dp/B0BGQQPCHF/ref=sr_1_55?keywords=men%27s+shoes&qid=1703020492&sr=8-55',53,'2023-12-19 15:14:54.114935-06','2023-12-19 15:14:54.114935-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4586,'Steripod Clip-On Toothbrush Protector with Peppermint Essential Oils, Keeps Toothbrush Fresh and Clean, Travel Accessories, Fits Most Manual and Electric Toothbrushes, 2 Count',NULL,'B09SQCMT5G','https://m.media-amazon.com/images/I/71R7norWF5L._AC_UL320_.jpg',2306,4.8,'$5.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Steripod-Toothbrush-Protector-Peppermint-Toothbrushes/dp/B09SQCMT5G/ref=sr_1_94?keywords=travel+accessories&qid=1703020686&sr=8-94',57,'2023-12-19 15:18:08.0941-06','2023-12-19 15:18:08.0941-06','www.amazon.com'), + (4095,'HuitJours',NULL,'B0B2P916PC','https://m.media-amazon.com/images/I/41yPMZxfdWL._AC_UL320_.jpg',271,4.3,'$52.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozMDY4MTQzODMwMjM4NzE3OjE3MDMwMjA0OTI6c3BfbXRmOjIwMDExNDUwNDU0NDA5ODo6MDo6&url=%2FHuitJours-Loafer-Colors-Patchwork-Moccasins%2Fdp%2FB0B2P916PC%2Fref%3Dsr_1_67_sspa%3Fkeywords%3Dmen%2527s%2Bshoes%26qid%3D1703020492%26sr%3D8-67-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',53,'2023-12-19 15:14:54.265078-06','2023-12-19 15:14:54.265078-06','www.amazon.com'), + (4082,'Pozvnn',NULL,'B0B6R8GFF4','https://m.media-amazon.com/images/I/71K5jAued7L._AC_UL320_.jpg',976,4.2,'$29.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4NzcxNTkxODU3MTI5NzE3OjE3MDMwMjA0OTI6c3Bfc2VhcmNoX3RoZW1hdGljOjIwMDExMzY3MzEwMjY5ODo6MDo6&url=%2FPozvnn-Lightweight-Breathable-Athletic-Sneakers%2Fdp%2FB0B6R8GFF4%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%253Aamzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%26cv_ct_cx%3Dmen%2527s%2Bshoes%26keywords%3Dmen%2527s%2Bshoes%26pd_rd_i%3DB0B6R8GFF4%26pd_rd_r%3D55569294-b565-4bf8-8ebc-cf48c0bcc1f9%26pd_rd_w%3DMs38A%26pd_rd_wg%3DN8svP%26pf_rd_p%3D0c4cbb48-e433-4698-bba6-b3a5297e3e20%26pf_rd_r%3DK5RA5081PE0K7EF11925%26qid%3D1703020492%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-49-f853d353-bf33-45e7-b5c2-2cb2b31abc9b-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',53,'2023-12-19 15:14:54.131961-06','2023-12-19 15:14:54.131961-06','www.amazon.com'), + (4083,'Pozvnn',NULL,'B09MRX6KJL','https://m.media-amazon.com/images/I/61rXgqjlIwL._AC_UL320_.jpg',226,4.4,'$25.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4NzcxNTkxODU3MTI5NzE3OjE3MDMwMjA0OTI6c3Bfc2VhcmNoX3RoZW1hdGljOjMwMDA3NDg4NDgyNjUwMjo6Mjo6&url=%2FFashion-Sneakers-Running-Athletic-Breathable%2Fdp%2FB09MRX6KJL%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%253Aamzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%26cv_ct_cx%3Dmen%2527s%2Bshoes%26keywords%3Dmen%2527s%2Bshoes%26pd_rd_i%3DB09MRX6KJL%26pd_rd_r%3D55569294-b565-4bf8-8ebc-cf48c0bcc1f9%26pd_rd_w%3DMs38A%26pd_rd_wg%3DN8svP%26pf_rd_p%3D0c4cbb48-e433-4698-bba6-b3a5297e3e20%26pf_rd_r%3DK5RA5081PE0K7EF11925%26qid%3D1703020492%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-51-f853d353-bf33-45e7-b5c2-2cb2b31abc9b-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',53,'2023-12-19 15:14:54.14967-06','2023-12-19 15:14:54.14967-06','www.amazon.com'), + (4084,'Socviis',NULL,'B098JX3414','https://m.media-amazon.com/images/I/81yFCDYxwkL._AC_UL320_.jpg',3039,4.2,'$25.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4NzcxNTkxODU3MTI5NzE3OjE3MDMwMjA0OTI6c3Bfc2VhcmNoX3RoZW1hdGljOjIwMDA4ODQ0ODc3NDYyMTo6Mzo6&url=%2FSocviis-Athletic-Trainers-Lightweight-Breathable%2Fdp%2FB098JX3414%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%253Aamzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%26cv_ct_cx%3Dmen%2527s%2Bshoes%26keywords%3Dmen%2527s%2Bshoes%26pd_rd_i%3DB098JX3414%26pd_rd_r%3D55569294-b565-4bf8-8ebc-cf48c0bcc1f9%26pd_rd_w%3DMs38A%26pd_rd_wg%3DN8svP%26pf_rd_p%3D0c4cbb48-e433-4698-bba6-b3a5297e3e20%26pf_rd_r%3DK5RA5081PE0K7EF11925%26qid%3D1703020492%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-52-f853d353-bf33-45e7-b5c2-2cb2b31abc9b-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',53,'2023-12-19 15:14:54.157371-06','2023-12-19 15:14:54.157371-06','www.amazon.com'), + (4081,'Kapsen',NULL,'B092MFRT7T','https://m.media-amazon.com/images/I/71YQNz3uzyL._AC_UL320_.jpg',2080,4.1,'$39.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4NzcxNTkxODU3MTI5NzE3OjE3MDMwMjA0OTI6c3Bfc2VhcmNoX3RoZW1hdGljOjIwMDA3OTM1OTkzNDYzMTo6NDo6&url=%2FRunning-Walking-Sneakers-Breathable-Trainers%2Fdp%2FB092MFRT7T%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%253Aamzn1.sym.0c4cbb48-e433-4698-bba6-b3a5297e3e20%26cv_ct_cx%3Dmen%2527s%2Bshoes%26keywords%3Dmen%2527s%2Bshoes%26pd_rd_i%3DB092MFRT7T%26pd_rd_r%3D55569294-b565-4bf8-8ebc-cf48c0bcc1f9%26pd_rd_w%3DMs38A%26pd_rd_wg%3DN8svP%26pf_rd_p%3D0c4cbb48-e433-4698-bba6-b3a5297e3e20%26pf_rd_r%3DK5RA5081PE0K7EF11925%26qid%3D1703020492%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-53-f853d353-bf33-45e7-b5c2-2cb2b31abc9b-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',53,'2023-12-19 15:14:54.122519-06','2023-12-19 15:14:54.16387-06','www.amazon.com'), + (4085,'Skechers',NULL,'B01KXSD9WE','https://m.media-amazon.com/images/I/71CL7Xf-TPL._AC_UL320_.jpg',5099,4.2,'$40.24','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Skechers-Work-Mens-Dighton-Black/dp/B01KXSD9WE/ref=sr_1_56?keywords=men%27s+shoes&qid=1703020492&sr=8-56',53,'2023-12-19 15:14:54.173925-06','2023-12-19 15:14:54.173925-06','www.amazon.com'), + (4086,'DC',NULL,'B093LS599G','https://m.media-amazon.com/images/I/71I27VHB52L._AC_UL320_.jpg',6229,4.6,'$41.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/DC-Gaveler-Casual-Sneakers-Heather/dp/B093LS599G/ref=sr_1_57?keywords=men%27s+shoes&qid=1703020492&sr=8-57',53,'2023-12-19 15:14:54.184091-06','2023-12-19 15:14:54.184091-06','www.amazon.com'), + (4087,'Clarks',NULL,'B083FQQG33','https://m.media-amazon.com/images/I/71pmeBadtwL._AC_UL320_.jpg',1318,4.3,'$45.20','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Clarks-Whiddon-Step-Dark-Leather/dp/B083FQQG33/ref=sr_1_58?keywords=men%27s+shoes&qid=1703020492&sr=8-58',53,'2023-12-19 15:14:54.1914-06','2023-12-19 15:14:54.1914-06','www.amazon.com'), + (4088,'Clarks',NULL,'B00SMJO8WM','https://m.media-amazon.com/images/I/81zqrHuWkZL._AC_UL320_.jpg',16069,4.5,'$39.60','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Clarks-Tilden-Cap-Oxford-Leather/dp/B00SMJO8WM/ref=sr_1_59?keywords=men%27s+shoes&qid=1703020492&sr=8-59',53,'2023-12-19 15:14:54.197683-06','2023-12-19 15:14:54.197683-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4089,'adidas',NULL,'B08CZ272F8','https://m.media-amazon.com/images/I/51dghK71TcL._AC_UL320_.jpg',10909,4.5,'$68.79','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/adidas-Mens-Kaptir-Black-Carbon/dp/B08CZ272F8/ref=sr_1_60?keywords=men%27s+shoes&qid=1703020492&sr=8-60',53,'2023-12-19 15:14:54.205121-06','2023-12-19 15:14:54.205121-06','www.amazon.com'), + (4090,'Bruno Marc',NULL,'B0BGHDPLLF','https://m.media-amazon.com/images/I/71Ad3nHY5KL._AC_UL320_.jpg',8720,4.3,'$34.39','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Bruno-Marc-Cap-Toe-Oxfords-LOUISWIDE_2/dp/B0BGHDPLLF/ref=sr_1_61?keywords=men%27s+shoes&qid=1703020492&sr=8-61',53,'2023-12-19 15:14:54.214291-06','2023-12-19 15:14:54.214291-06','www.amazon.com'), + (4091,'Merrell',NULL,'B098KH8J12','https://m.media-amazon.com/images/I/81rSi12yULL._AC_UL320_.jpg',5790,4.6,'$34.27','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Merrell-Mens-Moab-Hiking-Walnut/dp/B098KH8J12/ref=sr_1_62?keywords=men%27s+shoes&qid=1703020492&sr=8-62',53,'2023-12-19 15:14:54.225289-06','2023-12-19 15:14:54.225289-06','www.amazon.com'), + (4092,'Bruno Marc',NULL,'B07S7P8N4S','https://m.media-amazon.com/images/I/71qbbLaNXRL._AC_UL320_.jpg',7163,4.4,'$42.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Bruno-Marc-Black-Casual-LG19008M/dp/B07S7P8N4S/ref=sr_1_63?keywords=men%27s+shoes&qid=1703020492&sr=8-63',53,'2023-12-19 15:14:54.232968-06','2023-12-19 15:14:54.232968-06','www.amazon.com'), + (4093,'Vooncosir',NULL,'B082Z52Q28','https://m.media-amazon.com/images/I/71ifckGA8IL._AC_UL320_.jpg',4537,4.1,'$39.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozMDY4MTQzODMwMjM4NzE3OjE3MDMwMjA0OTI6c3BfbXRmOjIwMDA3MTgxMTc4NzIzMTo6MDo6&url=%2FVooncosir-Sneakers-Breathable-Athletic-Lightweight%2Fdp%2FB082Z52Q28%2Fref%3Dsr_1_65_sspa%3Fkeywords%3Dmen%2527s%2Bshoes%26qid%3D1703020492%26sr%3D8-65-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',53,'2023-12-19 15:14:54.244658-06','2023-12-19 15:14:54.244658-06','www.amazon.com'), + (4115,'Skechers',NULL,'B075PF4PMC','https://m.media-amazon.com/images/I/81R3RoG5fHL._AC_UL320_.jpg',12948,4.5,'$62.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Skechers-Afterburn-Wonted-Loafer-pebble/dp/B075PF4PMC/ref=sr_1_87?keywords=men%27s+shoes&qid=1703020492&sr=8-87',53,'2023-12-19 15:14:54.424935-06','2023-12-19 15:14:54.424935-06','www.amazon.com'), + (4096,'Akk',NULL,'B0BTBWQ554','https://m.media-amazon.com/images/I/71sTRyYBd0L._AC_UL320_.jpg',86,4.2,'$29.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozMDY4MTQzODMwMjM4NzE3OjE3MDMwMjA0OTI6c3BfbXRmOjMwMDEwMDU3MTY2MjkwMjo6MDo6&url=%2FAkk-Lightweight-Breathable-Athletic-Sneakers%2Fdp%2FB0BTBWQ554%2Fref%3Dsr_1_68_sspa%3Fkeywords%3Dmen%2527s%2Bshoes%26qid%3D1703020492%26sr%3D8-68-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',53,'2023-12-19 15:14:54.272552-06','2023-12-19 15:14:54.272552-06','www.amazon.com'), + (4097,'DC',NULL,'B006IYTG0M','https://m.media-amazon.com/images/I/715fiNSHyoL._AC_UL320_.jpg',20194,4.7,'$49.90','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/DC-Court-Graffik-Skate-Black/dp/B006IYTG0M/ref=sr_1_69?keywords=men%27s+shoes&qid=1703020492&sr=8-69',53,'2023-12-19 15:14:54.279899-06','2023-12-19 15:14:54.279899-06','www.amazon.com'), + (4098,'Tommy Hilfiger',NULL,'B014GNDYBI','https://m.media-amazon.com/images/I/81JoQvgtlxL._AC_UL320_.jpg',9684,4.4,'$45.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Tommy-Hilfiger-Mens-PANDORA-Medium/dp/B014GNDYBI/ref=sr_1_70?keywords=men%27s+shoes&qid=1703020492&sr=8-70',53,'2023-12-19 15:14:54.28718-06','2023-12-19 15:14:54.28718-06','www.amazon.com'), + (4099,'DC',NULL,'B007RKGQWW','https://m.media-amazon.com/images/I/71umS8hsUzL._AC_UL320_.jpg',3239,4.6,'$49.91','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/DC-Anvil-Action-Sports-Black/dp/B007RKGQWW/ref=sr_1_71?keywords=men%27s+shoes&qid=1703020492&sr=8-71',53,'2023-12-19 15:14:54.293855-06','2023-12-19 15:14:54.293855-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4100,'Clarks',NULL,'B01ACQYFI4','https://m.media-amazon.com/images/I/71ZPPw13Z6L._AC_UL320_.jpg',7427,4.5,'$42.37','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/CLARKS-Mens-Cotrell-Step-Black/dp/B01ACQYFI4/ref=sr_1_72?keywords=men%27s+shoes&qid=1703020492&sr=8-72',53,'2023-12-19 15:14:54.305365-06','2023-12-19 15:14:54.305365-06','www.amazon.com'), + (4101,'ZGR',NULL,'B0CH3H6TY8','https://m.media-amazon.com/images/I/61DffHsw9DL._AC_UL320_.jpg',4,4.7,'$23.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozMDY4MTQzODMwMjM4NzE3OjE3MDMwMjA0OTI6c3BfbXRmOjMwMDEwMzE5OTIwNTQwMjo6MDo6&url=%2FZGR-Synthetic-Leather-Sneakers-Tennis%2Fdp%2FB0CH3H6TY8%2Fref%3Dsr_1_73_sspa%3Fkeywords%3Dmen%2527s%2Bshoes%26qid%3D1703020492%26sr%3D8-73-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',53,'2023-12-19 15:14:54.313301-06','2023-12-19 15:14:54.313301-06','www.amazon.com'), + (4102,'OL OUTJET LEGEND',NULL,'B0CGZZQHCS','https://m.media-amazon.com/images/I/81Vx3PTWIaL._AC_UL320_.jpg',42,4.5,'$49.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozMDY4MTQzODMwMjM4NzE3OjE3MDMwMjA0OTI6c3BfbXRmOjMwMDA5NTIyOTUwMTgwMjo6MDo6&url=%2FOL-OUTJET-LEGEND-Comfortable-Lightweight%2Fdp%2FB0CGZZQHCS%2Fref%3Dsr_1_74_sspa%3Fkeywords%3Dmen%2527s%2Bshoes%26qid%3D1703020492%26sr%3D8-74-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',53,'2023-12-19 15:14:54.320872-06','2023-12-19 15:14:54.320872-06','www.amazon.com'), + (4103,'VILOCY',NULL,'B0B3T9V2GY','https://m.media-amazon.com/images/I/81EdJ3zDL8L._AC_UL320_.jpg',3612,4.4,'$45.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozMDY4MTQzODMwMjM4NzE3OjE3MDMwMjA0OTI6c3BfbXRmOjIwMDA3MzgyNTgwMTM5ODo6MDo6&url=%2FVILOCY-Sneakers-Oxfords-Business-Lightweight%2Fdp%2FB0B3T9V2GY%2Fref%3Dsr_1_75_sspa%3Fkeywords%3Dmen%2527s%2Bshoes%26qid%3D1703020492%26sr%3D8-75-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',53,'2023-12-19 15:14:54.328298-06','2023-12-19 15:14:54.328298-06','www.amazon.com'), + (4104,'UMYOGO',NULL,'B07W9777K5','https://m.media-amazon.com/images/I/71hVcucYd6L._AC_UL320_.jpg',37603,4.2,'$45.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozMDY4MTQzODMwMjM4NzE3OjE3MDMwMjA0OTI6c3BfbXRmOjMwMDAwOTgyNDU2NjQwMjo6MDo6&url=%2FUMYOGO-Breathable-Sneakers-Lightweight-Athletic%2Fdp%2FB07W9777K5%2Fref%3Dsr_1_76_sspa%3Fkeywords%3Dmen%2527s%2Bshoes%26qid%3D1703020492%26sr%3D8-76-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',53,'2023-12-19 15:14:54.334563-06','2023-12-19 15:14:54.334563-06','www.amazon.com'), + (4105,'Bruno Marc',NULL,'B073T4SZ7Y','https://m.media-amazon.com/images/I/71TlDeVb6rL._AC_UL320_.jpg',5451,4.4,'$34.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Bruno-State-01-Black-Leather-Loafers/dp/B073T4SZ7Y/ref=sr_1_77?keywords=men%27s+shoes&qid=1703020492&sr=8-77',53,'2023-12-19 15:14:54.342025-06','2023-12-19 15:14:54.342025-06','www.amazon.com'), + (4106,'Skechers',NULL,'B08L8KZBW1','https://m.media-amazon.com/images/I/81bu7HJ8q4L._AC_UL320_.jpg',611,4.7,'$56.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Skechers-USA-Mens-Respected-Fallston-Canvas/dp/B08L8KZBW1/ref=sr_1_78?keywords=men%27s+shoes&qid=1703020492&sr=8-78',53,'2023-12-19 15:14:54.35329-06','2023-12-19 15:14:54.35329-06','www.amazon.com'), + (4107,'Dockers',NULL,'B0B4X1713M','https://m.media-amazon.com/images/I/51YyP-WJMgL._AC_UL320_.jpg',395,4.3,'$49.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Dockers-Bronson-Rugged-Casual-Oxford/dp/B0B4X1713M/ref=sr_1_79?keywords=men%27s+shoes&qid=1703020492&sr=8-79',53,'2023-12-19 15:14:54.360368-06','2023-12-19 15:14:54.360368-06','www.amazon.com'), + (4108,'Skechers',NULL,'B0BX3X6VDQ','https://m.media-amazon.com/images/I/814yXqiJKxL._AC_UL320_.jpg',1248,4.6,'$69.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Skechers-Summits-Range-Loafer-Charcoal/dp/B0BX3X6VDQ/ref=sr_1_80?keywords=men%27s+shoes&qid=1703020492&sr=8-80',53,'2023-12-19 15:14:54.367242-06','2023-12-19 15:14:54.367242-06','www.amazon.com'), + (4110,'Sperry',NULL,'B07VCSQPK3','https://m.media-amazon.com/images/I/81Pc-ezcpgL._AC_UL320_.jpg',3609,4.5,'$41.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/SPERRY-Mens-Striper-Sneaker-Black/dp/B07VCSQPK3/ref=sr_1_82?keywords=men%27s+shoes&qid=1703020492&sr=8-82',53,'2023-12-19 15:14:54.382358-06','2023-12-19 15:14:54.382358-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4111,'Reebok',NULL,'B09H56MCR8','https://m.media-amazon.com/images/I/716oVRpDcML._AC_UL320_.jpg',392,4.6,'$37.04','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Reebok-Cross-Trainer-White-Vector/dp/B09H56MCR8/ref=sr_1_83?keywords=men%27s+shoes&qid=1703020492&sr=8-83',53,'2023-12-19 15:14:54.390103-06','2023-12-19 15:14:54.390103-06','www.amazon.com'), + (4112,'Nike',NULL,'B098PDC8L1','https://m.media-amazon.com/images/I/81tWOXksBiL._AC_UL320_.jpg',1773,4.3,'$54.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Sneaker-Midnight-White-Obsidian-Ashen/dp/B098PDC8L1/ref=sr_1_84?keywords=men%27s+shoes&qid=1703020492&sr=8-84',53,'2023-12-19 15:14:54.399456-06','2023-12-19 15:14:54.399456-06','www.amazon.com'), + (4113,'Skechers',NULL,'B0BSDCFC16','https://m.media-amazon.com/images/I/71XxtLQKe0L._AC_UL320_.jpg',951,4.6,'$70.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Skechers-Slip-Ins-Athletic-Walking-Air-Cooled-Sneaker/dp/B0BSDCFC16/ref=sr_1_85?keywords=men%27s+shoes&qid=1703020492&sr=8-85',53,'2023-12-19 15:14:54.409884-06','2023-12-19 15:14:54.409884-06','www.amazon.com'), + (4114,'Under Armour',NULL,'B09LS8RCBM','https://m.media-amazon.com/images/I/71SwE8VuwFL._AC_UL320_.jpg',1058,4.5,'$63.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Under-Armour-Charged-Escape-Running/dp/B09LS8RCBM/ref=sr_1_86?keywords=men%27s+shoes&qid=1703020492&sr=8-86',53,'2023-12-19 15:14:54.417312-06','2023-12-19 15:14:54.417312-06','www.amazon.com'), + (4116,'Oakley',NULL,'B0BCX1QM93','https://m.media-amazon.com/images/I/71Ql+lcKZ2L._AC_UL320_.jpg',59,4.4,'$75.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Oakley-Mens-Split-Sneaker-Light/dp/B0BCX1QM93/ref=sr_1_88?keywords=men%27s+shoes&qid=1703020492&sr=8-88',53,'2023-12-19 15:14:54.432479-06','2023-12-19 15:14:54.432479-06','www.amazon.com'), + (4117,'Under Armour',NULL,'B0968YW75P','https://m.media-amazon.com/images/I/51sQuWP5SdL._AC_UL320_.jpg',6883,4.6,'$65.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Under-Armour-Surge-Running-Black/dp/B0968YW75P/ref=sr_1_89?keywords=men%27s+shoes&qid=1703020492&sr=8-89',53,'2023-12-19 15:14:54.440571-06','2023-12-19 15:14:54.440571-06','www.amazon.com'), + (4118,'Bruno Marc',NULL,'B089YN1F8J','https://m.media-amazon.com/images/I/61u1W+ZI2KL._AC_UL320_.jpg',6009,4.5,'$36.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Bruno-Marc-Leather-Loafers-Cambridge-05/dp/B089YN1F8J/ref=sr_1_90?keywords=men%27s+shoes&qid=1703020492&sr=8-90',53,'2023-12-19 15:14:54.447828-06','2023-12-19 15:14:54.447828-06','www.amazon.com'), + (4119,'Under Armour',NULL,'B09PPGCPBF','https://m.media-amazon.com/images/I/51yDdaSZHFL._AC_UL320_.jpg',1653,4.5,'$69.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Under-Armour-Unisex-Lockdown-Basketball/dp/B09PPGCPBF/ref=sr_1_91?keywords=men%27s+shoes&qid=1703020492&sr=8-91',53,'2023-12-19 15:14:54.45885-06','2023-12-19 15:14:54.45885-06','www.amazon.com'), + (4120,'adidas',NULL,'B08CZ416J1','https://m.media-amazon.com/images/I/81cuTtP+n6L._AC_UL320_.jpg',17107,4.5,'$55.72','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/adidas-Racer-Adapt-Black-White/dp/B08CZ416J1/ref=sr_1_92?keywords=men%27s+shoes&qid=1703020492&sr=8-92',53,'2023-12-19 15:14:54.465386-06','2023-12-19 15:14:54.465386-06','www.amazon.com'), + (4121,'DREAM PAIRS',NULL,'B00SX5JQZ4','https://m.media-amazon.com/images/I/71rV3mQlH6L._AC_UL320_.jpg',8588,4.4,'$31.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/PRINCE-Classic-Modern-Wingtip-PRINCE-3-BLACK/dp/B00SX5JQZ4/ref=sr_1_94?keywords=men%27s+shoes&qid=1703020492&sr=8-94',53,'2023-12-19 15:14:54.476155-06','2023-12-19 15:14:54.476155-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4122,'adidas',NULL,'B0BHPTK364','https://m.media-amazon.com/images/I/71TU8HBorhL._AC_UL320_.jpg',152,4.5,'$59.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/adidas-Mens-Racer-Sneaker-White/dp/B0BHPTK364/ref=sr_1_95?keywords=men%27s+shoes&qid=1703020492&sr=8-95',53,'2023-12-19 15:14:54.486884-06','2023-12-19 15:14:54.486884-06','www.amazon.com'), + (4123,'Avia',NULL,'B0C9NNLGKT','https://m.media-amazon.com/images/I/51Oss8hrhlL._AC_UL320_.jpg',69,4.4,'$49.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Avia-Basketball-Sneakers-Indoor-Outdoor/dp/B0C9NNLGKT/ref=sr_1_96?keywords=men%27s+shoes&qid=1703020492&sr=8-96',53,'2023-12-19 15:14:54.493402-06','2023-12-19 15:14:54.493402-06','www.amazon.com'), + (4124,'Hanes',NULL,'B07J6BPTHD','https://m.media-amazon.com/images/I/71GqKnkXMXL._AC_UL320_.jpg',31089,4.3,'$28.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Hanes-Moccasin-Slipper-Outdoor-Protection/dp/B07J6BPTHD/ref=sr_1_97?keywords=men%27s+shoes&qid=1703020492&sr=8-97',53,'2023-12-19 15:14:54.499966-06','2023-12-19 15:14:54.499966-06','www.amazon.com'), + (4125,'Nunn Bush',NULL,'B09M1Y64ZG','https://m.media-amazon.com/images/I/61BDLoPf4wL._AC_UL320_.jpg',176,4.3,'$74.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Nunn-Bush-Oxford-Leather-Lightweight/dp/B09M1Y64ZG/ref=sr_1_98?keywords=men%27s+shoes&qid=1703020492&sr=8-98',53,'2023-12-19 15:14:54.507647-06','2023-12-19 15:14:54.507647-06','www.amazon.com'), + (4126,'ASICS',NULL,'B0BZDSVX7J','https://m.media-amazon.com/images/I/51EVLtlIM4L._AC_UL320_.jpg',129,4.2,'$59.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/ASICS-Gel-Dedicate-Tennis-Shoes-White/dp/B0BZDSVX7J/ref=sr_1_99?keywords=men%27s+shoes&qid=1703020492&sr=8-99',53,'2023-12-19 15:14:54.51555-06','2023-12-19 15:14:54.51555-06','www.amazon.com'), + (4127,'Cole Haan',NULL,'B08SQC59ZF','https://m.media-amazon.com/images/I/41SIVoAuCHL._AC_UL320_.jpg',1152,4.6,'$90.15','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Cole-Haan-Atlantic-Oxford-Chestnut/dp/B08SQC59ZF/ref=sr_1_100?keywords=men%27s+shoes&qid=1703020492&sr=8-100',53,'2023-12-19 15:14:54.52295-06','2023-12-19 15:14:54.52295-06','www.amazon.com'), + (4128,'Bruno Marc',NULL,'B0BN8HM5XJ','https://m.media-amazon.com/images/I/71O5Wj1PhbL._AC_UL320_.jpg',5012,4.4,'$38.69','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Bruno-Marc-Leather-Classic-DOWNINGWIDE-01/dp/B0BN8HM5XJ/ref=sr_1_102?keywords=men%27s+shoes&qid=1703020492&sr=8-102',53,'2023-12-19 15:14:54.539726-06','2023-12-19 15:14:54.539726-06','www.amazon.com'), + (4129,'DREAM PAIRS',NULL,'B08CZKLJM9','https://m.media-amazon.com/images/I/71wOU0QwREL._AC_UL320_.jpg',12942,4.4,'$36.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Prince-Classic-Modern-Wingtip-PRINCEWIDE-6-BROWN/dp/B08CZKLJM9/ref=sr_1_103?keywords=men%27s+shoes&qid=1703020492&sr=8-103',53,'2023-12-19 15:14:54.548453-06','2023-12-19 15:14:54.548453-06','www.amazon.com'), + (4130,'Avia',NULL,'B07B4JSD9Q','https://m.media-amazon.com/images/I/51hr22w+-0L._AC_UL320_.jpg',1811,4.0,'$29.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Avia-Mens-Avi-Skill-Service-Black/dp/B07B4JSD9Q/ref=sr_1_104?keywords=men%27s+shoes&qid=1703020492&sr=8-104',53,'2023-12-19 15:14:54.556187-06','2023-12-19 15:14:54.556187-06','www.amazon.com'), + (4131,'adidas',NULL,'B0BHPT5Z7Y','https://m.media-amazon.com/images/I/71cZbWhjZRL._AC_UL320_.jpg',548,4.4,'$49.29','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/adidas-Runfalcon-Sneaker-Metallic-Scarlet/dp/B0BHPT5Z7Y/ref=sr_1_105?keywords=men%27s+shoes&qid=1703020492&sr=8-105',53,'2023-12-19 15:14:54.564535-06','2023-12-19 15:14:54.564535-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4132,'Bruno Marc',NULL,'B01FYCP8NC','https://m.media-amazon.com/images/I/61xQhG-Fb5L._AC_UL320_.jpg',2171,4.5,'$29.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Bruno-Goldman-01-Leather-Square-Oxfords/dp/B01FYCP8NC/ref=sr_1_106?keywords=men%27s+shoes&qid=1703020492&sr=8-106',53,'2023-12-19 15:14:54.575524-06','2023-12-19 15:14:54.575524-06','www.amazon.com'), + (4133,'Skechers',NULL,'B07YQPBH3J','https://m.media-amazon.com/images/I/81C5ohx8YyL._AC_UL320_.jpg',3962,4.5,'$41.25','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Skechers-mens-Walk-Max-Clinched/dp/B07YQPBH3J/ref=sr_1_107?keywords=men%27s+shoes&qid=1703020492&sr=8-107',53,'2023-12-19 15:14:54.583123-06','2023-12-19 15:14:54.583123-06','www.amazon.com'), + (4134,'ASICS',NULL,'B0B484TMX3','https://m.media-amazon.com/images/I/71qha-bIjzL._AC_UL320_.jpg',1071,4.5,'$59.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/ASICS-Gel-Venture-Running-Shoes-Black/dp/B0B484TMX3/ref=sr_1_108?keywords=men%27s+shoes&qid=1703020492&sr=8-108',53,'2023-12-19 15:14:54.590345-06','2023-12-19 15:14:54.590345-06','www.amazon.com'), + (4587,'BAGSMART 6 Set/4 Set/2 Set Compression Packing Cubes for Travel, Lightweight Vacation Travel Essentials, Travel Accessories for Suitcase Organizer Bags Set, Durable Luggage Organizer Travel Bags',NULL,'B08Z7SLGMF','https://m.media-amazon.com/images/I/71Cg8hse7WL._AC_UL320_.jpg',7563,4.6,'$39.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/BAGSMART-Organizers-Expandable-Compression-Lightweight/dp/B08Z7SLGMF/ref=sr_1_95?keywords=travel+accessories&qid=1703020686&sr=8-95',57,'2023-12-19 15:18:08.100928-06','2023-12-19 15:18:08.100928-06','www.amazon.com'), + (4136,'VILOCY',NULL,'B0C1B2SDNJ','https://m.media-amazon.com/images/I/81+zS10jGcL._AC_UL320_.jpg',3612,4.4,'$45.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozNzc4NzE4ODUyOTA3NzE3OjE3MDMwMjA0OTI6c3Bfc2VhcmNoX3RoZW1hdGljX2J0ZjoyMDAxNjk1MDk1MjIyOTg6OjA6Og&url=%2FVILOCY-Sneakers-Lightweight-Comfortable-Breathable%2Fdp%2FB0C1B2SDNJ%2Fref%3Dsxbs_pa_sp_search_thematic_btf_sspa%3Fcontent-id%3Damzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%253Aamzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%26cv_ct_cx%3Dmen%2527s%2Bshoes%26keywords%3Dmen%2527s%2Bshoes%26pd_rd_i%3DB0C1B2SDNJ%26pd_rd_r%3Dcbc67c46-1e33-4ce3-95ea-1ece4073707c%26pd_rd_w%3Dg6QxC%26pd_rd_wg%3DB82tp%26pf_rd_p%3Dc950d26b-f218-41e6-a496-534825ce2131%26pf_rd_r%3DK5RA5081PE0K7EF11925%26qid%3D1703020492%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-49-50a2b317-b617-44c1-b7a6-daec194a2368-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWNfYnRm%26psc%3D1',53,'2023-12-19 15:14:54.605468-06','2023-12-19 15:14:54.605468-06','www.amazon.com'), + (4137,'VILOCY',NULL,'B0BM3BJD8H','https://m.media-amazon.com/images/I/81jMUruuCXL._AC_UL320_.jpg',681,4.5,'$45.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozNzc4NzE4ODUyOTA3NzE3OjE3MDMwMjA0OTI6c3Bfc2VhcmNoX3RoZW1hdGljX2J0ZjoyMDAxMjE4MDkzNDA1OTg6OjE6Og&url=%2FOxfords-Business-Comfortable-Breathable-Lightweight%2Fdp%2FB0BM3BJD8H%2Fref%3Dsxbs_pa_sp_search_thematic_btf_sspa%3Fcontent-id%3Damzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%253Aamzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%26cv_ct_cx%3Dmen%2527s%2Bshoes%26keywords%3Dmen%2527s%2Bshoes%26pd_rd_i%3DB0BM3BJD8H%26pd_rd_r%3Dcbc67c46-1e33-4ce3-95ea-1ece4073707c%26pd_rd_w%3Dg6QxC%26pd_rd_wg%3DB82tp%26pf_rd_p%3Dc950d26b-f218-41e6-a496-534825ce2131%26pf_rd_r%3DK5RA5081PE0K7EF11925%26qid%3D1703020492%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-50-50a2b317-b617-44c1-b7a6-daec194a2368-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWNfYnRm%26psc%3D1',53,'2023-12-19 15:14:54.615425-06','2023-12-19 15:14:54.615425-06','www.amazon.com'), + (4138,'Jousen',NULL,'B07TDKK853','https://m.media-amazon.com/images/I/81QxMQEee1L._AC_UL320_.jpg',1072,4.3,'$46.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozNzc4NzE4ODUyOTA3NzE3OjE3MDMwMjA0OTI6c3Bfc2VhcmNoX3RoZW1hdGljX2J0ZjozMDAwODUwNTQ5OTc3MDI6OjI6Og&url=%2FJOUSEN-Fashion-Sneakers-Eyelets-Casual%2Fdp%2FB07TDKK853%2Fref%3Dsxbs_pa_sp_search_thematic_btf_sspa%3Fcontent-id%3Damzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%253Aamzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%26cv_ct_cx%3Dmen%2527s%2Bshoes%26keywords%3Dmen%2527s%2Bshoes%26pd_rd_i%3DB07TDKK853%26pd_rd_r%3Dcbc67c46-1e33-4ce3-95ea-1ece4073707c%26pd_rd_w%3Dg6QxC%26pd_rd_wg%3DB82tp%26pf_rd_p%3Dc950d26b-f218-41e6-a496-534825ce2131%26pf_rd_r%3DK5RA5081PE0K7EF11925%26qid%3D1703020492%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-51-50a2b317-b617-44c1-b7a6-daec194a2368-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWNfYnRm%26psc%3D1',53,'2023-12-19 15:14:54.62327-06','2023-12-19 15:14:54.62327-06','www.amazon.com'), + (4139,'Feethit',NULL,'B09YRPZZ4Q','https://m.media-amazon.com/images/I/71OaLmM2zdL._AC_UL320_.jpg',2655,4.2,'$30.59','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozNzc4NzE4ODUyOTA3NzE3OjE3MDMwMjA0OTI6c3Bfc2VhcmNoX3RoZW1hdGljX2J0ZjoyMDAwOTY5Njg4NzQ4OTg6OjM6Og&url=%2FFeethit-Lightweight-Breathable-Comfortable-Sneakers%2Fdp%2FB09YRPZZ4Q%2Fref%3Dsxbs_pa_sp_search_thematic_btf_sspa%3Fcontent-id%3Damzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%253Aamzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%26cv_ct_cx%3Dmen%2527s%2Bshoes%26keywords%3Dmen%2527s%2Bshoes%26pd_rd_i%3DB09YRPZZ4Q%26pd_rd_r%3Dcbc67c46-1e33-4ce3-95ea-1ece4073707c%26pd_rd_w%3Dg6QxC%26pd_rd_wg%3DB82tp%26pf_rd_p%3Dc950d26b-f218-41e6-a496-534825ce2131%26pf_rd_r%3DK5RA5081PE0K7EF11925%26qid%3D1703020492%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-52-50a2b317-b617-44c1-b7a6-daec194a2368-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWNfYnRm%26psc%3D1',53,'2023-12-19 15:14:54.629975-06','2023-12-19 15:14:54.629975-06','www.amazon.com'), + (4135,'Giniros',NULL,'B0BP24VG2K','https://m.media-amazon.com/images/I/71KZAYqIHhL._AC_UL320_.jpg',901,4.2,'$35.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozNzc4NzE4ODUyOTA3NzE3OjE3MDMwMjA0OTI6c3Bfc2VhcmNoX3RoZW1hdGljX2J0ZjoyMDAxNDY3MDk4MDUwOTg6OjQ6Og&url=%2FGiniros-Running-Breathable-Lightweight-Sneakers%2Fdp%2FB0BP24VG2K%2Fref%3Dsxbs_pa_sp_search_thematic_btf_sspa%3Fcontent-id%3Damzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%253Aamzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%26cv_ct_cx%3Dmen%2527s%2Bshoes%26keywords%3Dmen%2527s%2Bshoes%26pd_rd_i%3DB0BP24VG2K%26pd_rd_r%3Dcbc67c46-1e33-4ce3-95ea-1ece4073707c%26pd_rd_w%3Dg6QxC%26pd_rd_wg%3DB82tp%26pf_rd_p%3Dc950d26b-f218-41e6-a496-534825ce2131%26pf_rd_r%3DK5RA5081PE0K7EF11925%26qid%3D1703020492%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-53-50a2b317-b617-44c1-b7a6-daec194a2368-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWNfYnRm%26psc%3D1',53,'2023-12-19 15:14:54.597582-06','2023-12-19 15:14:54.635773-06','www.amazon.com'), + (4140,'Amazon Essentials',NULL,'B096NP4QWH','https://m.media-amazon.com/images/I/61JQEDRPNTL._AC_UL320_.jpg',9379,4.2,'$23.70','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3ODM0OTE0MjY5NDc4NzE3OjE3MDMwMjA1MDA6c3BfYXRmOjIwMDAyNDUwNDQ0MDg5ODo6MDo6&url=%2FAmazon-Essentials-Womens-Pointed-Toe-Ballet%2Fdp%2FB096NP4QWH%2Fref%3Dsr_1_1_ffob_sspa%3Fkeywords%3Dwomen%2527s%2Bshoes%26qid%3D1703020500%26sr%3D8-1-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGY%26psc%3D1',54,'2023-12-19 15:15:01.961346-06','2023-12-19 15:15:01.961346-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4141,'Reebok',NULL,'B000AOZKB0','https://m.media-amazon.com/images/I/71kqJ4XOmtL._AC_UL320_.jpg',40466,4.4,'$33.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Reebok-Womens-Princess-Aerobics-White/dp/B000AOZKB0/ref=sr_1_2?keywords=women%27s+shoes&qid=1703020500&sr=8-2',54,'2023-12-19 15:15:01.971891-06','2023-12-19 15:15:01.971891-06','www.amazon.com'), + (4142,'Skechers',NULL,'B07BKLXNCC','https://m.media-amazon.com/images/I/81wjCtEL03L._AC_UL320_.jpg',20005,4.5,'$37.91','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Skechers-Womens-Summit-Quick-Getaway/dp/B07BKLXNCC/ref=sr_1_3?keywords=women%27s+shoes&qid=1703020500&sr=8-3',54,'2023-12-19 15:15:01.978278-06','2023-12-19 15:15:01.978278-06','www.amazon.com'), + (4143,'Skechers',NULL,'B07847ND21','https://m.media-amazon.com/images/I/619B6lMmq7L._AC_UL320_.jpg',47002,4.5,'$36.43','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Skechers-Womens-Summits-Sneakers-Black/dp/B07847ND21/ref=sr_1_4?keywords=women%27s+shoes&qid=1703020500&sr=8-4',54,'2023-12-19 15:15:01.984808-06','2023-12-19 15:15:01.984808-06','www.amazon.com'), + (4588,'DDgro Travel Essentials for Men Women, Electronics Organizer Pouch Bag for Tech Accessories/Charger & Cords/Cables/Magic Mouse (Small, Light Gray)',NULL,'B0915TJTJ8','https://m.media-amazon.com/images/I/61Zo8kdCb1L._AC_UL320_.jpg',4595,4.5,'$6.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/DDgro-Electronics-Accessories-Certificates-stationeries/dp/B0915TJTJ8/ref=sr_1_97?keywords=travel+accessories&qid=1703020686&sr=8-97',57,'2023-12-19 15:18:08.107497-06','2023-12-19 15:18:08.107497-06','www.amazon.com'), + (4145,'TIOSEBON',NULL,'B06Y5L9B28','https://m.media-amazon.com/images/I/61Xcdvg4x6L._AC_UL320_.jpg',32684,4.4,'$23.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo1MjU5MTYyNjU1NTU2NzE3OjE3MDMwMjA1MDA6c3Bfc2VhcmNoX3RoZW1hdGljOjIwMDEyMTM0MzkxNTQ5ODo6MDo6&url=%2FTIOSEBON-Athletic-Walking-Mesh-Comfortable-Sneakers%2Fdp%2FB06Y5L9B28%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.cbead6fc-f00c-4cd7-8558-497bc91856e7%253Aamzn1.sym.cbead6fc-f00c-4cd7-8558-497bc91856e7%26cv_ct_cx%3Dwomen%2527s%2Bshoes%26keywords%3Dwomen%2527s%2Bshoes%26pd_rd_i%3DB06Y5L9B28%26pd_rd_r%3Db9c22103-e916-4fdd-87f1-8137fbe97c0a%26pd_rd_w%3D6Db44%26pd_rd_wg%3DFXfqC%26pf_rd_p%3Dcbead6fc-f00c-4cd7-8558-497bc91856e7%26pf_rd_r%3D614PPZTWS9JZKEHNW0B5%26qid%3D1703020500%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-1-183302c6-8dec-4386-8e58-6031e7be5ad8-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',54,'2023-12-19 15:15:01.999732-06','2023-12-19 15:15:01.999732-06','www.amazon.com'), + (4146,'vibdiv',NULL,'B08CZ7YX3B','https://m.media-amazon.com/images/I/81h4mg7EtCL._AC_UL320_.jpg',10837,4.3,'$23.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo1MjU5MTYyNjU1NTU2NzE3OjE3MDMwMjA1MDA6c3Bfc2VhcmNoX3RoZW1hdGljOjMwMDA5OTg1MjU1MjAwMjo6MTo6&url=%2Fvibdiv-Walking-Sneakers-Lightweight-Comfortable%2Fdp%2FB08CZ7YX3B%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.cbead6fc-f00c-4cd7-8558-497bc91856e7%253Aamzn1.sym.cbead6fc-f00c-4cd7-8558-497bc91856e7%26cv_ct_cx%3Dwomen%2527s%2Bshoes%26keywords%3Dwomen%2527s%2Bshoes%26pd_rd_i%3DB08CZ7YX3B%26pd_rd_r%3Db9c22103-e916-4fdd-87f1-8137fbe97c0a%26pd_rd_w%3D6Db44%26pd_rd_wg%3DFXfqC%26pf_rd_p%3Dcbead6fc-f00c-4cd7-8558-497bc91856e7%26pf_rd_r%3D614PPZTWS9JZKEHNW0B5%26qid%3D1703020500%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-2-183302c6-8dec-4386-8e58-6031e7be5ad8-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',54,'2023-12-19 15:15:02.013-06','2023-12-19 15:15:02.013-06','www.amazon.com'), + (4147,'FRACORA',NULL,'B08B8RCJJR','https://m.media-amazon.com/images/I/818BTVSf1FL._AC_UL320_.jpg',7455,4.2,'$12.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo1MjU5MTYyNjU1NTU2NzE3OjE3MDMwMjA1MDA6c3Bfc2VhcmNoX3RoZW1hdGljOjMwMDEwNjY3NjI2MzkwMjo6Mjo6&url=%2FFRACORA-Breathable-Leather-Walking-Grey-US10%2Fdp%2FB08B8RCJJR%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.cbead6fc-f00c-4cd7-8558-497bc91856e7%253Aamzn1.sym.cbead6fc-f00c-4cd7-8558-497bc91856e7%26cv_ct_cx%3Dwomen%2527s%2Bshoes%26keywords%3Dwomen%2527s%2Bshoes%26pd_rd_i%3DB08B8RCJJR%26pd_rd_r%3Db9c22103-e916-4fdd-87f1-8137fbe97c0a%26pd_rd_w%3D6Db44%26pd_rd_wg%3DFXfqC%26pf_rd_p%3Dcbead6fc-f00c-4cd7-8558-497bc91856e7%26pf_rd_r%3D614PPZTWS9JZKEHNW0B5%26qid%3D1703020500%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-3-183302c6-8dec-4386-8e58-6031e7be5ad8-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',54,'2023-12-19 15:15:02.019528-06','2023-12-19 15:15:02.019528-06','www.amazon.com'), + (4148,'DADAWEN',NULL,'B01L92LMAE','https://m.media-amazon.com/images/I/61zbPhPK0yL._AC_UL320_.jpg',8875,4.3,'$35.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo1MjU5MTYyNjU1NTU2NzE3OjE3MDMwMjA1MDA6c3Bfc2VhcmNoX3RoZW1hdGljOjIwMDA0MTYxNjE1NTI5ODo6Mzo6&url=%2FDADAWEN-Platform-Lace-Up-Wingtips-Oxfords%2Fdp%2FB01L92LMAE%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.cbead6fc-f00c-4cd7-8558-497bc91856e7%253Aamzn1.sym.cbead6fc-f00c-4cd7-8558-497bc91856e7%26cv_ct_cx%3Dwomen%2527s%2Bshoes%26keywords%3Dwomen%2527s%2Bshoes%26pd_rd_i%3DB01L92LMAE%26pd_rd_r%3Db9c22103-e916-4fdd-87f1-8137fbe97c0a%26pd_rd_w%3D6Db44%26pd_rd_wg%3DFXfqC%26pf_rd_p%3Dcbead6fc-f00c-4cd7-8558-497bc91856e7%26pf_rd_r%3D614PPZTWS9JZKEHNW0B5%26qid%3D1703020500%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-4-183302c6-8dec-4386-8e58-6031e7be5ad8-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',54,'2023-12-19 15:15:02.0271-06','2023-12-19 15:15:02.0271-06','www.amazon.com'), + (4144,'Ablanczoom',NULL,'B0777KKFY2','https://m.media-amazon.com/images/I/71OS+eDPd9L._AC_UL320_.jpg',3308,4.1,'$25.47','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo1MjU5MTYyNjU1NTU2NzE3OjE3MDMwMjA1MDA6c3Bfc2VhcmNoX3RoZW1hdGljOjMwMDAzMTc4MzcwMDIwMjo6NDo6&url=%2FAblanczoom-Leather-Loafers-Moccasins-Breathable%2Fdp%2FB0777KKFY2%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.cbead6fc-f00c-4cd7-8558-497bc91856e7%253Aamzn1.sym.cbead6fc-f00c-4cd7-8558-497bc91856e7%26cv_ct_cx%3Dwomen%2527s%2Bshoes%26keywords%3Dwomen%2527s%2Bshoes%26pd_rd_i%3DB0777KKFY2%26pd_rd_r%3Db9c22103-e916-4fdd-87f1-8137fbe97c0a%26pd_rd_w%3D6Db44%26pd_rd_wg%3DFXfqC%26pf_rd_p%3Dcbead6fc-f00c-4cd7-8558-497bc91856e7%26pf_rd_r%3D614PPZTWS9JZKEHNW0B5%26qid%3D1703020500%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-5-183302c6-8dec-4386-8e58-6031e7be5ad8-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',54,'2023-12-19 15:15:01.993001-06','2023-12-19 15:15:02.033669-06','www.amazon.com'), + (4149,'Clarks',NULL,'B00U8PORZ6','https://m.media-amazon.com/images/I/711j1A3rxWL._AC_UL320_.jpg',12607,4.5,'$43.32','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/CLARKS-Womens-Ashland-Slip-Loafer/dp/B00U8PORZ6/ref=sr_1_5?keywords=women%27s+shoes&qid=1703020500&sr=8-5',54,'2023-12-19 15:15:02.042224-06','2023-12-19 15:15:02.042224-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4150,'ASICS',NULL,'B08PK8WG3D','https://m.media-amazon.com/images/I/610DKH06nTL._AC_UL320_.jpg',17991,4.4,'$47.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/ASICS-Womens-Gel-Contend-Running-Shoes/dp/B08PK8WG3D/ref=sr_1_6?keywords=women%27s+shoes&qid=1703020500&sr=8-6',54,'2023-12-19 15:15:02.052232-06','2023-12-19 15:15:02.052232-06','www.amazon.com'), + (4151,'Hey Dude',NULL,'B0BB15FWRN','https://m.media-amazon.com/images/I/51vcNivyleL._AC_UL320_.jpg',1935,4.6,'$29.25','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Hey-Dude-Sandshell-Comfortable-Light-Weight/dp/B0BB15FWRN/ref=sr_1_7?keywords=women%27s+shoes&qid=1703020500&sr=8-7',54,'2023-12-19 15:15:02.059019-06','2023-12-19 15:15:02.059019-06','www.amazon.com'), + (4152,'New Balance',NULL,'B093QYJZS6','https://m.media-amazon.com/images/I/81J7Ep3ikXL._AC_UL320_.jpg',4970,4.3,'$38.97','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/New-Balance-Dynasoft-Nergize-Trainer/dp/B093QYJZS6/ref=sr_1_8?keywords=women%27s+shoes&qid=1703020500&sr=8-8',54,'2023-12-19 15:15:02.065758-06','2023-12-19 15:15:02.065758-06','www.amazon.com'), + (4153,'Amazon Essentials',NULL,'B0BPCJ81LP','https://m.media-amazon.com/images/I/61bkLFlfsfL._AC_UL320_.jpg',118,3.9,'$24.40','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Amazon-Essentials-Womens-Shearling-Black/dp/B0BPCJ81LP/ref=sr_1_9?keywords=women%27s+shoes&qid=1703020500&sr=8-9',54,'2023-12-19 15:15:02.076054-06','2023-12-19 15:15:02.076054-06','www.amazon.com'), + (4154,'adidas',NULL,'B0BG94S3L2','https://m.media-amazon.com/images/I/71WneOD1jgL._AC_UL320_.jpg',402,4.2,'$45.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/adidas-Womens-Cloudfoam-Sportswear-Sneaker/dp/B0BG94S3L2/ref=sr_1_10?keywords=women%27s+shoes&qid=1703020500&sr=8-10',54,'2023-12-19 15:15:02.086554-06','2023-12-19 15:15:02.086554-06','www.amazon.com'), + (4155,'Amazon Essentials',NULL,'B088KBVBXR','https://m.media-amazon.com/images/I/61YXQs52RVL._AC_UL320_.jpg',11009,4.1,'$22.80','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3ODM0OTE0MjY5NDc4NzE3OjE3MDMwMjA1MDA6c3BfbXRmOjIwMDA1NDczODQzNzIzMTo6MDo6&url=%2FAmazon-Essentials-Womens-Loafer-Beige%2Fdp%2FB088KBVBXR%2Fref%3Dsr_1_11_ffob_sspa%3Fkeywords%3Dwomen%2527s%2Bshoes%26qid%3D1703020500%26sr%3D8-11-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',54,'2023-12-19 15:15:02.094121-06','2023-12-19 15:15:02.094121-06','www.amazon.com'), + (4156,'Reebok',NULL,'B09ZFXTMF5','https://m.media-amazon.com/images/I/61riOw+8TnL._AC_UL320_.jpg',246,4.5,'$65.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3ODM0OTE0MjY5NDc4NzE3OjE3MDMwMjA1MDA6c3BfbXRmOjMwMDAwNzIxOTIyMTQwMjo6MDo6&url=%2FReebok-Womens-Advance-Sneaker-FTWWHT%2Fdp%2FB09ZFXTMF5%2Fref%3Dsr_1_12_sspa%3Fkeywords%3Dwomen%2527s%2Bshoes%26qid%3D1703020500%26sr%3D8-12-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',54,'2023-12-19 15:15:02.100676-06','2023-12-19 15:15:02.100676-06','www.amazon.com'), + (4157,'Waluzs',NULL,'B09SFXPMR2','https://m.media-amazon.com/images/I/61ldSgqlGqL._AC_UL320_.jpg',5081,4.2,'$23.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3ODM0OTE0MjY5NDc4NzE3OjE3MDMwMjA1MDA6c3BfbXRmOjMwMDA3OTU4MzU4ODIwMjo6MDo6&url=%2FWomens-Sneakers-Walking-Fashion-Sneakers%25EF%25BC%2588White-5%25EF%25BC%2589%2Fdp%2FB09SFXPMR2%2Fref%3Dsr_1_13_sspa%3Fkeywords%3Dwomen%2527s%2Bshoes%26qid%3D1703020500%26sr%3D8-13-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',54,'2023-12-19 15:15:02.108066-06','2023-12-19 15:15:02.108066-06','www.amazon.com'), + (4158,'VOCNTVY',NULL,'B0BS6PKC9K','https://m.media-amazon.com/images/I/61QqovnY0QL._AC_UL320_.jpg',70,4.2,'$36.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3ODM0OTE0MjY5NDc4NzE3OjE3MDMwMjA1MDA6c3BfbXRmOjIwMDEzNTM4Mjg3OTE5ODo6MDo6&url=%2FClassic-Leather-Comfort-Moccasins-Driving%2Fdp%2FB0BS6PKC9K%2Fref%3Dsr_1_14_sspa%3Fkeywords%3Dwomen%2527s%2Bshoes%26qid%3D1703020500%26sr%3D8-14-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',54,'2023-12-19 15:15:02.115216-06','2023-12-19 15:15:02.115216-06','www.amazon.com'), + (4159,'Lamincoa',NULL,'B08CXLXGRX','https://aax-us-iad.amazon.com/e/loi/imp?b=JNbnCvBxJJ9bOiBoMb5sQa0AAAGMg-6W9QEAAAH2AQBvbm9fdHhuX2JpZDcgICBvbm9fdHhuX2ltcDEgICCjdN7n',12200,4.2,'$33.55','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.comhttps://aax-us-iad.amazon.com/x/c/RNbnCvBxJJ9bOiBoMb5sQa0AAAGMg-6WswEAAAH2AQBvbm9fdHhuX2JpZDcgICBvbm9fdHhuX2ltcDEgICCjdN7n/https://www.amazon.com/Lamincoa-Sneakers-Lightweight-Outdooor-Blue-Pink/dp/B08CXLXGRX/ref=sxin_23_sbv_search_btf?content-id=amzn1.sym.6ca944f8-539c-499e-a3a4-26a566d1de59%3Aamzn1.sym.6ca944f8-539c-499e-a3a4-26a566d1de59&cv_ct_cx=women%27s+shoes&keywords=women%27s+shoes&pd_rd_i=B08CXLXGRX&pd_rd_r=b9c22103-e916-4fdd-87f1-8137fbe97c0a&pd_rd_w=oM18X&pd_rd_wg=FXfqC&pf_rd_p=6ca944f8-539c-499e-a3a4-26a566d1de59&pf_rd_r=614PPZTWS9JZKEHNW0B5&qid=1703020500&sbo=Tc8eqSFhUl4VwMzbE4fw%2Fw%3D%3D&sr=1-1-5190daf0-67e3-427c-bea6-c72c1df98776',54,'2023-12-19 15:15:02.126211-06','2023-12-19 15:15:02.126211-06','www.amazon.comhttps:'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4160,'adidas',NULL,'B09VCN733T','https://m.media-amazon.com/images/I/71ZvZcMomhL._AC_UL320_.jpg',21902,4.4,'$31.83','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/adidas-Womens-Puremotion-Sneaker-Alumina/dp/B09VCN733T/ref=sr_1_15?keywords=women%27s+shoes&qid=1703020500&sr=8-15',54,'2023-12-19 15:15:02.132818-06','2023-12-19 15:15:02.132818-06','www.amazon.com'), + (4161,'PUMA',NULL,'B08CS2PRVZ','https://m.media-amazon.com/images/I/71xX+mHmkUL._AC_UL320_.jpg',10126,4.4,'$40.08','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/PUMA-womens-Running-Black-ignite-Pink-aquamarine/dp/B08CS2PRVZ/ref=sr_1_16?keywords=women%27s+shoes&qid=1703020500&sr=8-16',54,'2023-12-19 15:15:02.1395-06','2023-12-19 15:15:02.1395-06','www.amazon.com'), + (4162,'ASICS',NULL,'B09MZ2H7PK','https://m.media-amazon.com/images/I/61-zP6mMP2L._AC_UL320_.jpg',6303,4.5,'$44.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/ASICS-Womens-Gel-Excite-Running-Barely/dp/B09MZ2H7PK/ref=sr_1_17?keywords=women%27s+shoes&qid=1703020500&sr=8-17',54,'2023-12-19 15:15:02.145777-06','2023-12-19 15:15:02.145777-06','www.amazon.com'), + (4163,'MUK LUKS',NULL,'B0BDBD5KT5','https://m.media-amazon.com/images/I/71hiIy37KEL._AC_UL320_.jpg',58,4.1,'$36.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/MUK-LUKS-Womens-Street-Richmond/dp/B0BDBD5KT5/ref=sr_1_18?keywords=women%27s+shoes&qid=1703020500&sr=8-18',54,'2023-12-19 15:15:02.157297-06','2023-12-19 15:15:02.157297-06','www.amazon.com'), + (4164,'BENEKER',NULL,'B07YKCXYK2','https://m.media-amazon.com/images/I/61TOV5mcMhL._AC_UL320_.jpg',11499,4.5,'$25.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3ODM0OTE0MjY5NDc4NzE3OjE3MDMwMjA1MDA6c3BfbXRmOjIwMDAyMTAwNzkxMDI0MTo6MDo6&url=%2FWomens-Canvas-Sneakers-Lightweight-Casual%2Fdp%2FB07YKCXYK2%2Fref%3Dsr_1_19_sspa%3Fkeywords%3Dwomen%2527s%2Bshoes%26qid%3D1703020500%26sr%3D8-19-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',54,'2023-12-19 15:15:02.167499-06','2023-12-19 15:15:02.167499-06','www.amazon.com'), + (4165,'VenusCelia',NULL,'B0BKGYRH4J','https://m.media-amazon.com/images/I/71ejHLBJOPL._AC_UL320_.jpg',2727,4.0,'$29.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3ODM0OTE0MjY5NDc4NzE3OjE3MDMwMjA1MDA6c3BfbXRmOjIwMDE0NTY0NzI3OTk5ODo6MDo6&url=%2FVenusCelia-Womens-Plain-Dance-Flats%2Fdp%2FB0BKGYRH4J%2Fref%3Dsr_1_20_sspa%3Fkeywords%3Dwomen%2527s%2Bshoes%26qid%3D1703020500%26sr%3D8-20-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',54,'2023-12-19 15:15:02.174665-06','2023-12-19 15:15:02.174665-06','www.amazon.com'), + (4166,'FUNKYMONKEY',NULL,'B09577T7JB','https://m.media-amazon.com/images/I/71DE8-B6SVL._AC_UL320_.jpg',4354,4.4,'$23.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3ODM0OTE0MjY5NDc4NzE3OjE3MDMwMjA1MDA6c3BfbXRmOjIwMDA0NDE0OTMyNTk5ODo6MDo6&url=%2FFUNKYMONKEY-Canvas-Classic-Comfort-Sneaker%2Fdp%2FB09577T7JB%2Fref%3Dsr_1_21_sspa%3Fkeywords%3Dwomen%2527s%2Bshoes%26qid%3D1703020500%26sr%3D8-21-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',54,'2023-12-19 15:15:02.181161-06','2023-12-19 15:15:02.181161-06','www.amazon.com'), + (4167,'FRACORA',NULL,'B09H6J9N8P','https://m.media-amazon.com/images/I/61JmYkbf7iL._AC_UL320_.jpg',3041,4.2,'$24.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3ODM0OTE0MjY5NDc4NzE3OjE3MDMwMjA1MDA6c3BfbXRmOjIwMDA4MzUzMTMxODE5ODo6MDo6&url=%2FFRACORA-Leather-Comfortable-Fashion-Sneaker%2Fdp%2FB09H6J9N8P%2Fref%3Dsr_1_22_sspa%3Fkeywords%3Dwomen%2527s%2Bshoes%26qid%3D1703020500%26sr%3D8-22-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',54,'2023-12-19 15:15:02.188115-06','2023-12-19 15:15:02.188115-06','www.amazon.com'), + (4168,'Blowfish Malibu',NULL,'B01L9NBLPO','https://m.media-amazon.com/images/I/7151ZVkpZfL._AC_UL320_.jpg',30565,4.6,'$23.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Blowfish-Womens-Marley-Fashion-Sneaker/dp/B01L9NBLPO/ref=sr_1_23?keywords=women%27s+shoes&qid=1703020500&sr=8-23',54,'2023-12-19 15:15:02.195872-06','2023-12-19 15:15:02.195872-06','www.amazon.com'), + (4169,'adidas',NULL,'B091V6S244','https://m.media-amazon.com/images/I/81JNKz52U7L._AC_UL320_.jpg',1711,4.3,'$39.65','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/adidas-Originals-Womens-Swift-Sneaker/dp/B091V6S244/ref=sr_1_24?keywords=women%27s+shoes&qid=1703020500&sr=8-24',54,'2023-12-19 15:15:02.201688-06','2023-12-19 15:15:02.201688-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4170,'ASICS',NULL,'B091KHRGPS','https://m.media-amazon.com/images/I/615jKNTNWKL._AC_UL320_.jpg',20762,4.4,'$42.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/ASICS-Gel-Venture-Running-Piedmont-Metropolis/dp/B091KHRGPS/ref=sr_1_26?keywords=women%27s+shoes&qid=1703020500&sr=8-26',54,'2023-12-19 15:15:02.212628-06','2023-12-19 15:15:02.212628-06','www.amazon.com'), + (4171,'Brooks',NULL,'B09RRHT5T4','https://m.media-amazon.com/images/I/71XjYtwZNRL._AC_UL320_.jpg',4283,4.7,'$139.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3ODM0OTE0MjY5NDc4NzE3OjE3MDMwMjA1MDA6c3BfbXRmOjMwMDAwMjM2Njc3MTAwMjo6MDo6&url=%2FBrooks-Womens-Ghost-Neutral-Running%2Fdp%2FB09RRHT5T4%2Fref%3Dsr_1_27_sspa%3Fkeywords%3Dwomen%2527s%2Bshoes%26qid%3D1703020500%26sr%3D8-27-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1%26smid%3DAU2SJWQ0WCZ47',54,'2023-12-19 15:15:02.219564-06','2023-12-19 15:15:02.219564-06','www.amazon.com'), + (4172,'SPATI',NULL,'B09DKKNQ3B','https://m.media-amazon.com/images/I/713f02ZScEL._AC_UL320_.jpg',306,4.0,'$34.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3ODM0OTE0MjY5NDc4NzE3OjE3MDMwMjA1MDA6c3BfbXRmOjIwMDAzMjEzNjgxNDU5ODo6MDo6&url=%2FSPATI-Knitted-Footwear-Breathable-Numeric_5%2Fdp%2FB09DKKNQ3B%2Fref%3Dsr_1_28_sspa%3Fkeywords%3Dwomen%2527s%2Bshoes%26qid%3D1703020500%26sr%3D8-28-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',54,'2023-12-19 15:15:02.226696-06','2023-12-19 15:15:02.226696-06','www.amazon.com'), + (4173,'FRACORA',NULL,'B0B3WNY49V','https://m.media-amazon.com/images/I/71VRMwja6kL._AC_UL320_.jpg',1603,4.3,'$42.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3ODM0OTE0MjY5NDc4NzE3OjE3MDMwMjA1MDA6c3BfbXRmOjMwMDA2NTcyODc4ODgwMjo6MDo6&url=%2FLeather-Booties-Non-slip-Waterproof-Black-US8%2Fdp%2FB0B3WNY49V%2Fref%3Dsr_1_29_sspa%3Fkeywords%3Dwomen%2527s%2Bshoes%26qid%3D1703020500%26sr%3D8-29-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',54,'2023-12-19 15:15:02.236806-06','2023-12-19 15:15:02.236806-06','www.amazon.com'), + (4174,'Under Armour',NULL,'B08H2GX4CM','https://m.media-amazon.com/images/I/51PgLKADR9L._AC_UL320_.jpg',19651,4.5,'$44.97','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Under-Armour-Womens-Charged-Assert/dp/B08H2GX4CM/ref=sr_1_30?keywords=women%27s+shoes&qid=1703020500&sr=8-30',54,'2023-12-19 15:15:02.243521-06','2023-12-19 15:15:02.243521-06','www.amazon.com'), + (4175,'Soda',NULL,'B09MVFC4YW','https://m.media-amazon.com/images/I/71Mg0-0oP5L._AC_UL320_.jpg',7564,4.4,'$31.90','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/CHANCE-Perforated-Stacked-Booties-numeric_10/dp/B09MVFC4YW/ref=sr_1_31?keywords=women%27s+shoes&qid=1703020500&sr=8-31',54,'2023-12-19 15:15:02.255283-06','2023-12-19 15:15:02.255283-06','www.amazon.com'), + (4176,'LifeStride',NULL,'B07CR24XQ6','https://m.media-amazon.com/images/I/7176r-kEwBL._AC_UL320_.jpg',6689,4.2,'$47.21','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/LifeStride-Womens-Adley-Ankle-Black/dp/B07CR24XQ6/ref=sr_1_32?keywords=women%27s+shoes&qid=1703020500&sr=8-32',54,'2023-12-19 15:15:02.262307-06','2023-12-19 15:15:02.262307-06','www.amazon.com'), + (4177,'Clarks',NULL,'B01N1XI0GI','https://m.media-amazon.com/images/I/81q9voJKrNL._AC_UL320_.jpg',9530,4.5,'$43.74','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Clarks-Womens-Loafer-Tumbled-Leather/dp/B01N1XI0GI/ref=sr_1_33?keywords=women%27s+shoes&qid=1703020500&sr=8-33',54,'2023-12-19 15:15:02.269507-06','2023-12-19 15:15:02.269507-06','www.amazon.com'), + (4178,'Under Armour',NULL,'B09XBVQGPS','https://m.media-amazon.com/images/I/61D2nT6Tr+L._AC_UL320_.jpg',535,4.3,'$56.25','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Under-Armour-Womens-Charged-Running/dp/B09XBVQGPS/ref=sr_1_34?keywords=women%27s+shoes&qid=1703020500&sr=8-34',54,'2023-12-19 15:15:02.279226-06','2023-12-19 15:15:02.279226-06','www.amazon.com'), + (4179,'Blowfish Malibu',NULL,'B07T16NZP5','https://m.media-amazon.com/images/I/81BRFOqQoYL._AC_UL320_.jpg',4388,4.4,'$27.43','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Blowfish-Mamba-Sweet-Washed-Canvas/dp/B07T16NZP5/ref=sr_1_35?keywords=women%27s+shoes&qid=1703020500&sr=8-35',54,'2023-12-19 15:15:02.286192-06','2023-12-19 15:15:02.286192-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4180,'Clarks',NULL,'B01MU022AU','https://m.media-amazon.com/images/I/71v3si+LXjL._AC_UL320_.jpg',17597,4.5,'$39.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Clarks-Womens-Emslie-Warren-Leather/dp/B01MU022AU/ref=sr_1_36?keywords=women%27s+shoes&qid=1703020500&sr=8-36',54,'2023-12-19 15:15:02.292767-06','2023-12-19 15:15:02.292767-06','www.amazon.com'), + (4181,'Skechers',NULL,'B07942YW88','https://m.media-amazon.com/images/I/71xwsh1oOzL._AC_UL320_.jpg',5012,4.3,'$41.38','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Skechers-Seager-STAT-Scalloped-Engineered-Skech-Knit-Classic/dp/B07942YW88/ref=sr_1_37?keywords=women%27s+shoes&qid=1703020500&sr=8-37',54,'2023-12-19 15:15:02.299391-06','2023-12-19 15:15:02.299391-06','www.amazon.com'), + (4182,'Skechers',NULL,'B088KV2XTC','https://m.media-amazon.com/images/I/71OzzQUKNBL._AC_UL320_.jpg',1321,4.5,'$33.74','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Skechers-Womens-Chill-Lugs-Urban-Loafer/dp/B088KV2XTC/ref=sr_1_38?keywords=women%27s+shoes&qid=1703020500&sr=8-38',54,'2023-12-19 15:15:02.306843-06','2023-12-19 15:15:02.306843-06','www.amazon.com'), + (4183,'Clarks',NULL,'B078GGN4MR','https://m.media-amazon.com/images/I/71PDLqWQhsL._AC_UL320_.jpg',2354,4.3,'$38.28','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/CLARKS-Womens-Juliet-Leather-Synthetic/dp/B078GGN4MR/ref=sr_1_39?keywords=women%27s+shoes&qid=1703020500&sr=8-39',54,'2023-12-19 15:15:02.313374-06','2023-12-19 15:15:02.313374-06','www.amazon.com'), + (4184,'Clarks',NULL,'B0121QYJSE','https://m.media-amazon.com/images/I/813+WlOO32L._AC_UL320_.jpg',11620,4.4,'$40.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/CLARKS-Womens-Ashland-Slip-Loafer/dp/B0121QYJSE/ref=sr_1_40?keywords=women%27s+shoes&qid=1703020500&sr=8-40',54,'2023-12-19 15:15:02.320359-06','2023-12-19 15:15:02.320359-06','www.amazon.com'), + (4185,'Keds',NULL,'B010EGKNVA','https://m.media-amazon.com/images/I/71mpCNnGHDL._AC_UL320_.jpg',8147,4.4,'$26.87','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Keds-Womens-Kickstart-Fashion-Sneaker/dp/B010EGKNVA/ref=sr_1_41?keywords=women%27s+shoes&qid=1703020500&sr=8-41',54,'2023-12-19 15:15:02.327092-06','2023-12-19 15:15:02.327092-06','www.amazon.com'), + (4186,'adidas',NULL,'B07HRR5JWX','https://m.media-amazon.com/images/I/61XSBe3R-aL._AC_UL320_.jpg',14960,4.5,'$58.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/adidas-Originals-Womens-Swift-Sneaker/dp/B07HRR5JWX/ref=sr_1_42?keywords=women%27s+shoes&qid=1703020500&sr=8-42',54,'2023-12-19 15:15:02.333728-06','2023-12-19 15:15:02.333728-06','www.amazon.com'), + (4187,'Dr. Scholl''s Shoes',NULL,'B07QW34QBK','https://m.media-amazon.com/images/I/619RqvQXPWL._AC_UL320_.jpg',3445,4.1,'$59.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Dr-Scholls-Shoes-Womens-Microfiber/dp/B07QW34QBK/ref=sr_1_43?keywords=women%27s+shoes&qid=1703020500&sr=8-43',54,'2023-12-19 15:15:02.342011-06','2023-12-19 15:15:02.342011-06','www.amazon.com'), + (4188,'Nike',NULL,'B0059RVL2K','https://m.media-amazon.com/images/I/61Ivtyqn7PL._AC_UL320_.jpg',1422,4.5,'$64.97','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/NIKE-Roshe-Coral-Stardust-White/dp/B0059RVL2K/ref=sr_1_45?keywords=women%27s+shoes&qid=1703020500&sr=8-45',54,'2023-12-19 15:15:02.352391-06','2023-12-19 15:15:02.352391-06','www.amazon.com'), + (4189,'Dr. Scholl''s Shoes',NULL,'B07R1T2TYT','https://m.media-amazon.com/images/I/81jhabeTwzL._AC_UL320_.jpg',958,4.3,'$49.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Dr-Scholls-Shoes-Brianna-Microfiber/dp/B07R1T2TYT/ref=sr_1_46?keywords=women%27s+shoes&qid=1703020500&sr=8-46',54,'2023-12-19 15:15:02.36086-06','2023-12-19 15:15:02.36086-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4190,'Keds',NULL,'B0961BZ676','https://m.media-amazon.com/images/I/61Tfb8DNHDL._AC_UL320_.jpg',536,4.3,'$42.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Keds-Womens-Kickback-Sneaker-White/dp/B0961BZ676/ref=sr_1_47?keywords=women%27s+shoes&qid=1703020500&sr=8-47',54,'2023-12-19 15:15:02.367804-06','2023-12-19 15:15:02.367804-06','www.amazon.com'), + (4191,'BZees',NULL,'B07H6Q1J65','https://m.media-amazon.com/images/I/51+-SH01egL._AC_UL320_.jpg',4328,4.5,'$44.34','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/BZees-Womens-Niche-Slip-Black/dp/B07H6Q1J65/ref=sr_1_48?keywords=women%27s+shoes&qid=1703020500&sr=8-48',54,'2023-12-19 15:15:02.374973-06','2023-12-19 15:15:02.374973-06','www.amazon.com'), + (4192,'adidas',NULL,'B09DXW4SK3','https://m.media-amazon.com/images/I/71WpfijAH+L._AC_UL320_.jpg',1376,4.4,'$39.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/adidas-Womens-Puremotion-Running-Metallic/dp/B09DXW4SK3/ref=sr_1_49?keywords=women%27s+shoes&qid=1703020500&sr=8-49',54,'2023-12-19 15:15:02.381397-06','2023-12-19 15:15:02.381397-06','www.amazon.com'), + (4193,'LifeStride',NULL,'B07CR3BTT6','https://m.media-amazon.com/images/I/51ACgE-bXqL._AC_UL320_.jpg',3170,4.0,'$20.97','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/LifeStride-Womens-Deja-Ballet-Black/dp/B07CR3BTT6/ref=sr_1_50?keywords=women%27s+shoes&qid=1703020500&sr=8-50',54,'2023-12-19 15:15:02.38821-06','2023-12-19 15:15:02.38821-06','www.amazon.com'), + (4194,'Clarks',NULL,'B0874LS1YX','https://m.media-amazon.com/images/I/71ovq1uTymL._AC_UL320_.jpg',2295,4.3,'$46.12','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Clarks-womens-Loafer-Tumbled-Leather/dp/B0874LS1YX/ref=sr_1_51?keywords=women%27s+shoes&qid=1703020500&sr=8-51',54,'2023-12-19 15:15:02.395138-06','2023-12-19 15:15:02.395138-06','www.amazon.com'), + (4195,'DREAM PAIRS',NULL,'B07SV35B11','https://m.media-amazon.com/images/I/71Si20WwdbL._AC_UL320_.jpg',6261,4.3,'$39.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/DREAM-PAIRS-Platform-Sneakers-Wedge-SNKR-1/dp/B07SV35B11/ref=sr_1_52?keywords=women%27s+shoes&qid=1703020500&sr=8-52',54,'2023-12-19 15:15:02.401747-06','2023-12-19 15:15:02.401747-06','www.amazon.com'), + (4196,'Dr. Scholl''s Shoes',NULL,'B094CDRW7T','https://m.media-amazon.com/images/I/51P4xt2XliL._AC_UL320_.jpg',374,4.2,'$43.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Dr-Scholls-Shoes-Sneaker-Microfiber/dp/B094CDRW7T/ref=sr_1_53?keywords=women%27s+shoes&qid=1703020500&sr=8-53',54,'2023-12-19 15:15:02.410499-06','2023-12-19 15:15:02.410499-06','www.amazon.com'), + (4197,'DREAM PAIRS',NULL,'B073H96BHL','https://m.media-amazon.com/images/I/61iSxV0-upL._AC_UL320_.jpg',17066,4.3,'$24.38','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/DREAM-PAIRS-Womens-Revona-Nubuck/dp/B073H96BHL/ref=sr_1_54?keywords=women%27s+shoes&qid=1703020500&sr=8-54',54,'2023-12-19 15:15:02.416534-06','2023-12-19 15:15:02.416534-06','www.amazon.com'), + (4198,'PUMA',NULL,'B09VR3NRT6','https://m.media-amazon.com/images/I/619cQm5JaSL._AC_UL320_.jpg',502,4.5,'$40.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/PUMA-Womens-Better-Prowl-Sneaker/dp/B09VR3NRT6/ref=sr_1_55?keywords=women%27s+shoes&qid=1703020500&sr=8-55',54,'2023-12-19 15:15:02.423819-06','2023-12-19 15:15:02.423819-06','www.amazon.com'), + (4199,'Bruno Marc',NULL,'B09NKJWZ3Z','https://m.media-amazon.com/images/I/61PD67FO3yL._AC_UL320_.jpg',3504,4.4,'$36.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Bruno-Marc-SBLS225W-Comfortable-Lightweight/dp/B09NKJWZ3Z/ref=sr_1_56?keywords=women%27s+shoes&qid=1703020500&sr=8-56',54,'2023-12-19 15:15:02.429711-06','2023-12-19 15:15:02.429711-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4200,'Clarks',NULL,'B07GQ4QC1Q','https://m.media-amazon.com/images/I/71E4B0CAhtL._AC_UL320_.jpg',7793,4.3,'$36.69','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/CLARKS-Womens-Juliet-Loafer-Leather/dp/B07GQ4QC1Q/ref=sr_1_57?keywords=women%27s+shoes&qid=1703020500&sr=8-57',54,'2023-12-19 15:15:02.455475-06','2023-12-19 15:15:02.455475-06','www.amazon.com'), + (4201,'New Balance',NULL,'B005ATNLF2','https://m.media-amazon.com/images/I/71xXFLETfxL._AC_UL320_.jpg',69975,4.4,'$33.79','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/New-Balance-FuelCore-Nergize-Training/dp/B005ATNLF2/ref=sr_1_58?keywords=women%27s+shoes&qid=1703020500&sr=8-58',54,'2023-12-19 15:15:02.462944-06','2023-12-19 15:15:02.462944-06','www.amazon.com'), + (4202,'Crocs',NULL,'B071VVHVGZ','https://m.media-amazon.com/images/I/61wC6rjFlML._AC_UL320_.jpg',7869,4.2,'$24.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Crocs-Womens-Work-Kadee-Black/dp/B071VVHVGZ/ref=sr_1_59?keywords=women%27s+shoes&qid=1703020500&sr=8-59',54,'2023-12-19 15:15:02.468983-06','2023-12-19 15:15:02.468983-06','www.amazon.com'), + (4203,'Dr. Scholl''s Shoes',NULL,'B005BI7S6U','https://m.media-amazon.com/images/I/71YtCD9h-EL._AC_UL320_.jpg',4658,4.3,'$50.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Dr-Scholls-Womens-Slip-Ons-Loafer/dp/B005BI7S6U/ref=sr_1_60?keywords=women%27s+shoes&qid=1703020500&sr=8-60',54,'2023-12-19 15:15:02.47618-06','2023-12-19 15:15:02.47618-06','www.amazon.com'), + (4589,'OlimpiaFit Quick Dry Towel - 3 Size Pack of Lightweight Microfiber Travel Towels w/Bag - Fast Drying Towel Set for Camping, Beach, Gym, Backpacking, Sports, Yoga & Swim Use',NULL,'B075LKVP7R','https://m.media-amazon.com/images/I/71-HrLjjBeL._AC_UL320_.jpg',11955,4.7,'$8.93','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/OlimpiaFit-Quick-Dry-Towel-Lightweight/dp/B075LKVP7R/ref=sr_1_101?keywords=travel+accessories&qid=1703020686&sr=8-101',57,'2023-12-19 15:18:08.117261-06','2023-12-19 15:18:08.117261-06','www.amazon.com'), + (4205,'Slow Man',NULL,'B07LF4RHXC','https://m.media-amazon.com/images/I/71Tz5Sk4dmL._AC_UL320_.jpg',99967,4.0,'$37.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozNzA4NDQ0MzYyNDQ1NzE3OjE3MDMwMjA1MDA6c3Bfc2VhcmNoX3RoZW1hdGljX2J0ZjozMDAwMDA3ODQ0ODM0MDI6OjA6Og&url=%2FWomens-Walking-Shoes-Sock-Sneakers%2Fdp%2FB07LF4RHXC%2Fref%3Dsxbs_pa_sp_search_thematic_btf_sspa%3Fcontent-id%3Damzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%253Aamzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%26cv_ct_cx%3Dwomen%2527s%2Bshoes%26keywords%3Dwomen%2527s%2Bshoes%26pd_rd_i%3DB07LF4RHXC%26pd_rd_r%3D6ee41f59-5d11-47f5-9c88-a77751f942ba%26pd_rd_w%3D2JB06%26pd_rd_wg%3D9GDRN%26pf_rd_p%3Dc950d26b-f218-41e6-a496-534825ce2131%26pf_rd_r%3D614PPZTWS9JZKEHNW0B5%26qid%3D1703020500%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-1-50a2b317-b617-44c1-b7a6-daec194a2368-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWNfYnRm%26psc%3D1',54,'2023-12-19 15:15:02.490171-06','2023-12-19 15:15:02.490171-06','www.amazon.com'), + (4206,'FRACORA',NULL,'B08B8RGWZG','https://m.media-amazon.com/images/I/71PbGGdQMrL._AC_UL320_.jpg',7455,4.2,'$19.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozNzA4NDQ0MzYyNDQ1NzE3OjE3MDMwMjA1MDA6c3Bfc2VhcmNoX3RoZW1hdGljX2J0ZjozMDAwNDEyNDIzODM2MDI6OjE6Og&url=%2FFRACORA-Breathable-Leather-Walking-Beige-US8%2Fdp%2FB08B8RGWZG%2Fref%3Dsxbs_pa_sp_search_thematic_btf_sspa%3Fcontent-id%3Damzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%253Aamzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%26cv_ct_cx%3Dwomen%2527s%2Bshoes%26keywords%3Dwomen%2527s%2Bshoes%26pd_rd_i%3DB08B8RGWZG%26pd_rd_r%3D6ee41f59-5d11-47f5-9c88-a77751f942ba%26pd_rd_w%3D2JB06%26pd_rd_wg%3D9GDRN%26pf_rd_p%3Dc950d26b-f218-41e6-a496-534825ce2131%26pf_rd_r%3D614PPZTWS9JZKEHNW0B5%26qid%3D1703020500%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-2-50a2b317-b617-44c1-b7a6-daec194a2368-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWNfYnRm%26psc%3D1',54,'2023-12-19 15:15:02.49635-06','2023-12-19 15:15:02.49635-06','www.amazon.com'), + (4219,'SPATI',NULL,'B09DKC7HF5','https://m.media-amazon.com/images/I/715XieV5PoL._AC_UL320_.jpg',306,4.0,'$34.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo1MzExMDI5OTUxMzY3NzE3OjE3MDMwMjA1MDg6c3BfbXRmOjIwMDAzMjEyMzM2MDQ5ODo6MDo6&url=%2FSPATI-Knitted-Footwear-Breathable-Numeric_9%2Fdp%2FB09DKC7HF5%2Fref%3Dsr_1_60_sspa%3Fkeywords%3Dwomen%2527s%2Bshoes%26qid%3D1703020507%26sr%3D8-60-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',54,'2023-12-19 15:15:09.134998-06','2023-12-19 15:15:09.134998-06','www.amazon.com'), + (4313,'JBL',NULL,'B08PHJW4BD','https://m.media-amazon.com/images/I/714riq8vR-L._AC_UL320_.jpg',27184,4.8,'$49.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/JBL-Clip-Bluetooth-Integrated-Waterproof/dp/B08PHJW4BD/ref=sr_1_43?keywords=outdoor&qid=1703020517&sr=8-43',55,'2023-12-19 15:15:18.76442-06','2023-12-19 15:15:18.76442-06','www.amazon.com'), + (4590,'VEEKTOMX Portable Charger with Built-in Cables - 10000mAh Power Bank for iPhone - Slim Fast Charge USB C Battery Pack - Small Travel Essentials Powerbank, Compatible with iPhone, Samsung, Android, etc',NULL,'B09B94C8H8','https://m.media-amazon.com/images/I/71-n6JtXs3L._AC_UL320_.jpg',1574,4.5,'$19.41','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Portable-Charger-10000mAh-outputs-Compatible/dp/B09B94C8H8/ref=sr_1_102?keywords=travel+accessories&qid=1703020686&sr=8-102',57,'2023-12-19 15:18:08.124259-06','2023-12-19 15:18:08.124259-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4208,'hash bubbie',NULL,'B09YCKJBYS','https://m.media-amazon.com/images/I/61we5BvjvVL._AC_UL320_.jpg',967,4.1,'$23.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozNzA4NDQ0MzYyNDQ1NzE3OjE3MDMwMjA1MDA6c3Bfc2VhcmNoX3RoZW1hdGljX2J0ZjoyMDAwNzU0NTc1OTE1OTg6OjM6Og&url=%2Fhash-bubbie-Comfortable-Leather-Nude-US6%2Fdp%2FB09YCKJBYS%2Fref%3Dsxbs_pa_sp_search_thematic_btf_sspa%3Fcontent-id%3Damzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%253Aamzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%26cv_ct_cx%3Dwomen%2527s%2Bshoes%26keywords%3Dwomen%2527s%2Bshoes%26pd_rd_i%3DB09YCKJBYS%26pd_rd_r%3D6ee41f59-5d11-47f5-9c88-a77751f942ba%26pd_rd_w%3D2JB06%26pd_rd_wg%3D9GDRN%26pf_rd_p%3Dc950d26b-f218-41e6-a496-534825ce2131%26pf_rd_r%3D614PPZTWS9JZKEHNW0B5%26qid%3D1703020500%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-4-50a2b317-b617-44c1-b7a6-daec194a2368-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWNfYnRm%26psc%3D1',54,'2023-12-19 15:15:02.508857-06','2023-12-19 15:15:02.508857-06','www.amazon.com'), + (4204,'TERRIKAT',NULL,'B0BR3T55XN','https://m.media-amazon.com/images/I/71BLqIR2IHL._AC_UL320_.jpg',1267,4.2,'$39.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozNzA4NDQ0MzYyNDQ1NzE3OjE3MDMwMjA1MDA6c3Bfc2VhcmNoX3RoZW1hdGljX2J0ZjoyMDAxMjc5Nzc0NzkyOTg6OjQ6Og&url=%2FTERRIKAT-Loafers-Comfort-Moccasins-1308-Hon6-5%2Fdp%2FB0BR3T55XN%2Fref%3Dsxbs_pa_sp_search_thematic_btf_sspa%3Fcontent-id%3Damzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%253Aamzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%26cv_ct_cx%3Dwomen%2527s%2Bshoes%26keywords%3Dwomen%2527s%2Bshoes%26pd_rd_i%3DB0BR3T55XN%26pd_rd_r%3D6ee41f59-5d11-47f5-9c88-a77751f942ba%26pd_rd_w%3D2JB06%26pd_rd_wg%3D9GDRN%26pf_rd_p%3Dc950d26b-f218-41e6-a496-534825ce2131%26pf_rd_r%3D614PPZTWS9JZKEHNW0B5%26qid%3D1703020500%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-5-50a2b317-b617-44c1-b7a6-daec194a2368-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWNfYnRm%26psc%3D1',54,'2023-12-19 15:15:02.48334-06','2023-12-19 15:15:02.514894-06','www.amazon.com'), + (4209,'FUNKYMONKEY',NULL,'B08973Z67G','https://m.media-amazon.com/images/I/51T5A7959oL._AC_UL320_.jpg',7038,4.1,'$26.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo1MzExMDI5OTUxMzY3NzE3OjE3MDMwMjA1MDg6c3BfYXRmX25leHQ6MjAwMDQ0MTQxMjc0NTk4OjowOjo&url=%2FFUNKYMONKEY-Womens-Comfort-Walking-Driving%2Fdp%2FB08973Z67G%2Fref%3Dsr_1_49_sspa%3Fkeywords%3Dwomen%2527s%2Bshoes%26qid%3D1703020507%26sr%3D8-49-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGZfbmV4dA%26psc%3D1',54,'2023-12-19 15:15:09.05288-06','2023-12-19 15:15:09.05288-06','www.amazon.com'), + (4210,'FUNKYMONKEY',NULL,'B0957861ZC','https://m.media-amazon.com/images/I/71VZv1Wzc1L._AC_UL320_.jpg',4354,4.4,'$23.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo1MzExMDI5OTUxMzY3NzE3OjE3MDMwMjA1MDg6c3BfYXRmX25leHQ6MjAwMDQ0MTQ5MjQ5ODk4OjowOjo&url=%2FFUNKYMONKEY-Canvas-Classic-Comfort-Sneaker%2Fdp%2FB0957861ZC%2Fref%3Dsr_1_50_sspa%3Fkeywords%3Dwomen%2527s%2Bshoes%26qid%3D1703020507%26sr%3D8-50-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGZfbmV4dA%26psc%3D1',54,'2023-12-19 15:15:09.076078-06','2023-12-19 15:15:09.076078-06','www.amazon.com'), + (4211,'COOJOY',NULL,'B08G3WT8VG','https://m.media-amazon.com/images/I/61Pet0TtnsL._AC_UL320_.jpg',2187,4.7,'$42.39','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo1MzExMDI5OTUxMzY3NzE3OjE3MDMwMjA1MDg6c3BfYXRmX25leHQ6MzAwMTA0MzM4OTE1ODAyOjowOjo&url=%2FCOOJOY-Womens-Waterproof-Booties-Anti-Slip%2Fdp%2FB08G3WT8VG%2Fref%3Dsr_1_51_sspa%3Fkeywords%3Dwomen%2527s%2Bshoes%26qid%3D1703020507%26sr%3D8-51-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGZfbmV4dA%26psc%3D1',54,'2023-12-19 15:15:09.082986-06','2023-12-19 15:15:09.082986-06','www.amazon.com'), + (4212,'HEAWISH',NULL,'B097K3VWHV','https://m.media-amazon.com/images/I/81aSIE2gzqL._AC_UL320_.jpg',3023,4.3,'$20.89','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo1MzExMDI5OTUxMzY3NzE3OjE3MDMwMjA1MDg6c3BfYXRmX25leHQ6MjAwMDcxNzk5MTMxMDk4OjowOjo&url=%2FHEAWISH-Womens-Comfortable-Crochet-Casual%2Fdp%2FB097K3VWHV%2Fref%3Dsr_1_52_sspa%3Fkeywords%3Dwomen%2527s%2Bshoes%26qid%3D1703020507%26sr%3D8-52-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGZfbmV4dA%26psc%3D1',54,'2023-12-19 15:15:09.08876-06','2023-12-19 15:15:09.08876-06','www.amazon.com'), + (4213,'DREAM PAIRS',NULL,'B078PX6W2J','https://m.media-amazon.com/images/I/61lK-bfUocL._AC_UL320_.jpg',12759,4.3,'$36.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/DREAM-PAIRS-Sole_Stretchy-Fashion-Elastic/dp/B078PX6W2J/ref=sr_1_53?keywords=women%27s+shoes&qid=1703020507&sr=8-53',54,'2023-12-19 15:15:09.094993-06','2023-12-19 15:15:09.094993-06','www.amazon.com'), + (4214,'TOMS',NULL,'B096PK2VJH','https://m.media-amazon.com/images/I/71AV637og1L._AC_UL320_.jpg',2536,4.5,'$28.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/TOMS-Womens-Alpargata-Loafer-Flat/dp/B096PK2VJH/ref=sr_1_54?keywords=women%27s+shoes&qid=1703020507&sr=8-54',54,'2023-12-19 15:15:09.101305-06','2023-12-19 15:15:09.101305-06','www.amazon.com'), + (4215,'DREAM PAIRS',NULL,'B097P9N94W','https://m.media-amazon.com/images/I/71aVGFCvqQL._AC_UL320_.jpg',5877,4.4,'$30.35','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/DREAM-PAIRS-Comfort-Oxfords-Loafers/dp/B097P9N94W/ref=sr_1_56?keywords=women%27s+shoes&qid=1703020507&sr=8-56',54,'2023-12-19 15:15:09.107803-06','2023-12-19 15:15:09.107803-06','www.amazon.com'), + (4216,'Skechers',NULL,'B07MZYDLDY','https://m.media-amazon.com/images/I/81bc5+ZTzUL._AC_UL320_.jpg',41938,4.5,'$40.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Skechers-Womens-Walk-5-15901-Black/dp/B07MZYDLDY/ref=sr_1_57?keywords=women%27s+shoes&qid=1703020507&sr=8-57',54,'2023-12-19 15:15:09.114521-06','2023-12-19 15:15:09.114521-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4217,'Skechers',NULL,'B073WH9XD8','https://m.media-amazon.com/images/I/81ofYchE-sL._AC_UL320_.jpg',46620,4.3,'$42.36','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Skechers-Womens-Squad-Service-black/dp/B073WH9XD8/ref=sr_1_58?keywords=women%27s+shoes&qid=1703020507&sr=8-58',54,'2023-12-19 15:15:09.122042-06','2023-12-19 15:15:09.122042-06','www.amazon.com'), + (4218,'DADAWEN',NULL,'B09MJVRKS1','https://m.media-amazon.com/images/I/714vdyv+FNL._AC_UL320_.jpg',12861,4.1,'$34.19','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo1MzExMDI5OTUxMzY3NzE3OjE3MDMwMjA1MDg6c3BfbXRmOjIwMDA0MTIzMzM3NDQ5ODo6MDo6&url=%2FDADAWEN-Classic-T-Strap-Platform-Mid-Heel%2Fdp%2FB09MJVRKS1%2Fref%3Dsr_1_59_sspa%3Fkeywords%3Dwomen%2527s%2Bshoes%26qid%3D1703020507%26sr%3D8-59-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',54,'2023-12-19 15:15:09.128276-06','2023-12-19 15:15:09.128276-06','www.amazon.com'), + (4207,'TERRIKAT',NULL,'B0C8TTPYFX','https://m.media-amazon.com/images/I/71ko88IH3WL._AC_UL320_.jpg',311,4.2,'$41.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTozNzA4NDQ0MzYyNDQ1NzE3OjE3MDMwMjA1MDA6c3Bfc2VhcmNoX3RoZW1hdGljX2J0ZjozMDAwMjAzMzk4MzAyMDI6OjI6Og&url=%2FTERRIKAT-Classic-Leather-Lightweight-1202-Lv6-5%2Fdp%2FB0C8TTPYFX%2Fref%3Dsxbs_pa_sp_search_thematic_btf_sspa%3Fcontent-id%3Damzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%253Aamzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%26cv_ct_cx%3Dwomen%2527s%2Bshoes%26keywords%3Dwomen%2527s%2Bshoes%26pd_rd_i%3DB0C8TTPYFX%26pd_rd_r%3D6ee41f59-5d11-47f5-9c88-a77751f942ba%26pd_rd_w%3D2JB06%26pd_rd_wg%3D9GDRN%26pf_rd_p%3Dc950d26b-f218-41e6-a496-534825ce2131%26pf_rd_r%3D614PPZTWS9JZKEHNW0B5%26qid%3D1703020500%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-3-50a2b317-b617-44c1-b7a6-daec194a2368-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWNfYnRm%26psc%3D1',54,'2023-12-19 15:15:02.502881-06','2023-12-19 15:15:09.140828-06','www.amazon.com'), + (4220,'Greatonu',NULL,'B0BW9657XG','https://m.media-amazon.com/images/I/714Kfta6yRL._AC_UL320_.jpg',42,4.5,'$39.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo1MzExMDI5OTUxMzY3NzE3OjE3MDMwMjA1MDg6c3BfbXRmOjMwMDA0NzA3MTYxMzYwMjo6MDo6&url=%2FGreatonu-Womens-Heeled-Closed-Wedding%2Fdp%2FB0BW9657XG%2Fref%3Dsr_1_62_sspa%3Fkeywords%3Dwomen%2527s%2Bshoes%26qid%3D1703020507%26sr%3D8-62-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',54,'2023-12-19 15:15:09.146938-06','2023-12-19 15:15:09.146938-06','www.amazon.com'), + (4221,'adidas',NULL,'B071S6MDD9','https://m.media-amazon.com/images/I/81zc8i+8qfL._AC_UL320_.jpg',73398,4.6,'$21.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/adidas-Performance-Womens-Cloudfoam-Running/dp/B071S6MDD9/ref=sr_1_63?keywords=women%27s+shoes&qid=1703020507&sr=8-63',54,'2023-12-19 15:15:09.152896-06','2023-12-19 15:15:09.152896-06','www.amazon.com'), + (4222,'Dansko',NULL,'B08BS1XTDR','https://m.media-amazon.com/images/I/61A-Q2-PVQL._AC_UL320_.jpg',1594,4.6,'$129.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Dansko-Womens-Rowan-Nubuck-Sandals/dp/B08BS1XTDR/ref=sr_1_64?keywords=women%27s+shoes&qid=1703020507&sr=8-64',54,'2023-12-19 15:15:09.159953-06','2023-12-19 15:15:09.159953-06','www.amazon.com'), + (4223,'Under Armour',NULL,'B0BGQPZSWM','https://m.media-amazon.com/images/I/51Y9Ti2Io-L._AC_UL320_.jpg',2156,4.4,'$50.67','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Under-Armour-Womens-Surge-Running/dp/B0BGQPZSWM/ref=sr_1_65?keywords=women%27s+shoes&qid=1703020507&sr=8-65',54,'2023-12-19 15:15:09.166325-06','2023-12-19 15:15:09.166325-06','www.amazon.com'), + (4224,'TOMS',NULL,'B096PHZH81','https://m.media-amazon.com/images/I/41Qy5XzIYuL._AC_UL320_.jpg',3440,4.6,'$36.75','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/TOMS-Womens-Alpargata-Loafer-Black/dp/B096PHZH81/ref=sr_1_66?keywords=women%27s+shoes&qid=1703020507&sr=8-66',54,'2023-12-19 15:15:09.174455-06','2023-12-19 15:15:09.174455-06','www.amazon.com'), + (4225,'Kapsen',NULL,'B092MK9LRM','https://m.media-amazon.com/images/I/81ApKBQE8cS._AC_UL320_.jpg',5397,4.2,'$38.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo1MzExMDI5OTUxMzY3NzE3OjE3MDMwMjA1MDg6c3BfbXRmOjIwMDA3MTUxMzA2NDU4MTo6MDo6&url=%2FKapsen-Running-Breathable-Sneakers-Trainers%2Fdp%2FB092MK9LRM%2Fref%3Dsr_1_67_sspa%3Fkeywords%3Dwomen%2527s%2Bshoes%26qid%3D1703020507%26sr%3D8-67-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',54,'2023-12-19 15:15:09.181121-06','2023-12-19 15:15:09.181121-06','www.amazon.com'), + (4226,'YDN',NULL,'B085HFD9T6','https://m.media-amazon.com/images/I/41SsYhVgG6L._AC_UL320_.jpg',175,4.0,'$49.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo1MzExMDI5OTUxMzY3NzE3OjE3MDMwMjA1MDg6c3BfbXRmOjIwMDE1MjIyNzczNjY5ODo6MDo6&url=%2FYDN-Women-Kitten-Pointed-Office%2Fdp%2FB085HFD9T6%2Fref%3Dsr_1_68_sspa%3Fkeywords%3Dwomen%2527s%2Bshoes%26qid%3D1703020507%26sr%3D8-68-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',54,'2023-12-19 15:15:09.18785-06','2023-12-19 15:15:09.18785-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4227,'YHOON',NULL,'B08812WT8F','https://m.media-amazon.com/images/I/911-PYemqPL._AC_UL320_.jpg',13972,4.3,'$28.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo1MzExMDI5OTUxMzY3NzE3OjE3MDMwMjA1MDg6c3BfbXRmOjIwMDAyNzg5NzA5MjA5ODo6MDo6&url=%2FYHOON-Walking-Breathable-Lightweight-Sneakers%2Fdp%2FB08812WT8F%2Fref%3Dsr_1_69_sspa%3Fkeywords%3Dwomen%2527s%2Bshoes%26qid%3D1703020507%26sr%3D8-69-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',54,'2023-12-19 15:15:09.19449-06','2023-12-19 15:15:09.19449-06','www.amazon.com'), + (4228,'VenusCelia',NULL,'B08PSZB6VQ','https://m.media-amazon.com/images/I/61ZIg6s2w7L._AC_UL320_.jpg',18713,4.3,'$27.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo1MzExMDI5OTUxMzY3NzE3OjE3MDMwMjA1MDg6c3BfbXRmOjMwMDA2MzU5NTE4OTYwMjo6MDo6&url=%2FVenusCelia-Womens-Natural-Comfort-Walking%2Fdp%2FB08PSZB6VQ%2Fref%3Dsr_1_70_sspa%3Fkeywords%3Dwomen%2527s%2Bshoes%26qid%3D1703020507%26sr%3D8-70-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',54,'2023-12-19 15:15:09.201079-06','2023-12-19 15:15:09.201079-06','www.amazon.com'), + (4229,'adidas',NULL,'B096HKWND4','https://m.media-amazon.com/images/I/71oxeigDtJL._AC_UL320_.jpg',1246,4.5,'$32.75','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/adidas-Womens-SUMMERVENT-Spikeless-Metallic/dp/B096HKWND4/ref=sr_1_71?keywords=women%27s+shoes&qid=1703020507&sr=8-71',54,'2023-12-19 15:15:09.208324-06','2023-12-19 15:15:09.208324-06','www.amazon.com'), + (4230,'Dr. Scholl''s Shoes',NULL,'B07YVS6SNV','https://m.media-amazon.com/images/I/818yz0JQgOL._AC_UL320_.jpg',754,4.4,'$60.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Dr-Scholls-Womens-Sneaker-Soft/dp/B07YVS6SNV/ref=sr_1_72?keywords=women%27s+shoes&qid=1703020507&sr=8-72',54,'2023-12-19 15:15:09.215091-06','2023-12-19 15:15:09.215091-06','www.amazon.com'), + (4231,'Dr. Scholl''s Shoes',NULL,'B07YVSX9SC','https://m.media-amazon.com/images/I/712WROTAewL._AC_UL320_.jpg',6340,4.1,'$54.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Dr-Scholls-Shoes-Womens-Webster/dp/B07YVSX9SC/ref=sr_1_73?keywords=women%27s+shoes&qid=1703020507&sr=8-73',54,'2023-12-19 15:15:09.222007-06','2023-12-19 15:15:09.222007-06','www.amazon.com'), + (4232,'Clarks',NULL,'B00AZORVYO','https://m.media-amazon.com/images/I/61+5lIbPVzL._AC_UL320_.jpg',10293,4.3,'$45.38','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/CLARKS-Womens-Ashland-Bubble-Loafer/dp/B00AZORVYO/ref=sr_1_74?keywords=women%27s+shoes&qid=1703020507&sr=8-74',54,'2023-12-19 15:15:09.228566-06','2023-12-19 15:15:09.228566-06','www.amazon.com'), + (4233,'Clarks',NULL,'B09P226FHK','https://m.media-amazon.com/images/I/51Z3+-Un2XL._AC_UL320_.jpg',497,4.3,'$38.36','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Clarks-Womens-Breeze-Loafer-Synthetic/dp/B09P226FHK/ref=sr_1_75?keywords=women%27s+shoes&qid=1703020507&sr=8-75',54,'2023-12-19 15:15:09.235136-06','2023-12-19 15:15:09.235136-06','www.amazon.com'), + (4234,'Clarks',NULL,'B08HJPC2LP','https://m.media-amazon.com/images/I/71Gh1VFMcfS._AC_UL320_.jpg',1720,4.4,'$39.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Clarks-Womens-Poppy-Loafer-Tumbled/dp/B08HJPC2LP/ref=sr_1_76?keywords=women%27s+shoes&qid=1703020507&sr=8-76',54,'2023-12-19 15:15:09.241497-06','2023-12-19 15:15:09.241497-06','www.amazon.com'), + (4235,'LifeStride',NULL,'B0983Y1SC7','https://m.media-amazon.com/images/I/712BEpKBxIL._AC_UL320_.jpg',474,4.4,'$38.66','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/LifeStride-Womens-Impact-Loafer-Black/dp/B0983Y1SC7/ref=sr_1_77?keywords=women%27s+shoes&qid=1703020507&sr=8-77',54,'2023-12-19 15:15:09.248421-06','2023-12-19 15:15:09.248421-06','www.amazon.com'), + (4236,'Amazon Essentials',NULL,'B088K98J1J','https://m.media-amazon.com/images/I/61PRjU6VDML._AC_UL320_.jpg',11009,4.1,'$22.80','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Amazon-Essentials-Womens-Loafer-Black/dp/B088K98J1J/ref=sr_1_78?keywords=women%27s+shoes&qid=1703020507&sr=8-78',54,'2023-12-19 15:15:09.255407-06','2023-12-19 15:15:09.255407-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4237,'Skechers',NULL,'B000VHYTXQ','https://m.media-amazon.com/images/I/81i1QgYAcYL._AC_UL320_.jpg',4362,4.5,'$47.88','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Skechers-Womens-Parties-Mate-Chocolate-Leather/dp/B000VHYTXQ/ref=sr_1_80?keywords=women%27s+shoes&qid=1703020507&sr=8-80',54,'2023-12-19 15:15:09.261332-06','2023-12-19 15:15:09.261332-06','www.amazon.com'), + (4238,'New Balance',NULL,'B07B414Q8J','https://m.media-amazon.com/images/I/61alcr5GlXL._AC_UL320_.jpg',32433,4.5,'$64.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/New-Balance-Womens-Comfort-Trainer/dp/B07B414Q8J/ref=sr_1_81?keywords=women%27s+shoes&qid=1703020507&sr=8-81',54,'2023-12-19 15:15:09.268031-06','2023-12-19 15:15:09.268031-06','www.amazon.com'), + (4239,'Nike',NULL,'B097TH69WC','https://m.media-amazon.com/images/I/51PNqBi2fxL._AC_UL320_.jpg',1077,4.0,'$62.59','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Nike-Womens-Vision-Running-WHITE-WHITE/dp/B097TH69WC/ref=sr_1_82?keywords=women%27s+shoes&qid=1703020507&sr=8-82',54,'2023-12-19 15:15:09.274063-06','2023-12-19 15:15:09.274063-06','www.amazon.com'), + (4240,'Clarks',NULL,'B01N5CWR9H','https://m.media-amazon.com/images/I/81A1zhXPg2L._AC_UL320_.jpg',7747,4.4,'$40.70','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/CLARKS-Womens-Adriel-Viola-Leather/dp/B01N5CWR9H/ref=sr_1_83?keywords=women%27s+shoes&qid=1703020507&sr=8-83',54,'2023-12-19 15:15:09.281307-06','2023-12-19 15:15:09.281307-06','www.amazon.com'), + (4241,'DC',NULL,'B09PL664QY','https://m.media-amazon.com/images/I/61A7HZpnp7L._AC_UL320_.jpg',506,4.5,'$39.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/DC-Womens-Gaveler-Casual-Sneakers/dp/B09PL664QY/ref=sr_1_84?keywords=women%27s+shoes&qid=1703020507&sr=8-84',54,'2023-12-19 15:15:09.28771-06','2023-12-19 15:15:09.28771-06','www.amazon.com'), + (4242,'ASICS',NULL,'B09WBWJGSK','https://m.media-amazon.com/images/I/51WFb62GsbL._AC_UL320_.jpg',2591,4.5,'$39.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/ASICS-Womens-JOLT-Running-Shoes/dp/B09WBWJGSK/ref=sr_1_85?keywords=women%27s+shoes&qid=1703020507&sr=8-85',54,'2023-12-19 15:15:09.294291-06','2023-12-19 15:15:09.294291-06','www.amazon.com'), + (4243,'Clarks',NULL,'B01NCKJITQ','https://m.media-amazon.com/images/I/618gwqa0oiL._AC_UL320_.jpg',8160,4.5,'$35.42','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/CLARKS-Womens-Emslie-Lulin-Dress/dp/B01NCKJITQ/ref=sr_1_86?keywords=women%27s+shoes&qid=1703020507&sr=8-86',54,'2023-12-19 15:15:09.300501-06','2023-12-19 15:15:09.300501-06','www.amazon.com'), + (4244,'Skechers',NULL,'B07H5VGV67','https://m.media-amazon.com/images/I/71AIs8qfKDL._AC_UL320_.jpg',21797,4.4,'$52.50','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Skechers-Stand-Womens-Sneaker-Black/dp/B07H5VGV67/ref=sr_1_87?keywords=women%27s+shoes&qid=1703020507&sr=8-87',54,'2023-12-19 15:15:09.306967-06','2023-12-19 15:15:09.306967-06','www.amazon.com'), + (4245,'New Balance',NULL,'B08KGZF778','https://m.media-amazon.com/images/I/71vCni0v3+S._AC_UL320_.jpg',29487,4.5,'$84.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/New-Balance-Womens-Running-Munsell/dp/B08KGZF778/ref=sr_1_88?keywords=women%27s+shoes&qid=1703020507&sr=8-88',54,'2023-12-19 15:15:09.314313-06','2023-12-19 15:15:09.314313-06','www.amazon.com'), + (4246,'Skechers',NULL,'B01N6MGRF4','https://m.media-amazon.com/images/I/71ZxG6OS9XL._AC_UL320_.jpg',22623,4.4,'$44.38','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Skechers-Womens-Ghenter-Bronaugh-Service/dp/B01N6MGRF4/ref=sr_1_89?keywords=women%27s+shoes&qid=1703020507&sr=8-89',54,'2023-12-19 15:15:09.321242-06','2023-12-19 15:15:09.321242-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4109,'Life Fitness',NULL,'B01EOLI8X6','https://m.media-amazon.com/images/I/51s+aIUfyjL._AC_UL320_.jpg',15,3.4,'$1.679','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Life-Fitness-Row-HX-Trainer/dp/B01EOLI8X6/ref=sr_1_81?keywords=men%27s+shoes&qid=1703020492&sr=8-81',53,'2023-12-19 15:14:54.374643-06','2023-12-19 15:15:09.327109-06','www.amazon.com'), + (4247,'LifeStride',NULL,'B06XQHDK9X','https://m.media-amazon.com/images/I/51NBQKtlncL._AC_UL320_.jpg',1056,4.0,'$22.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/LifeStride-Womens-Juliana-Stretch-Wedge/dp/B06XQHDK9X/ref=sr_1_91?keywords=women%27s+shoes&qid=1703020507&sr=8-91',54,'2023-12-19 15:15:09.33425-06','2023-12-19 15:15:09.33425-06','www.amazon.com'), + (4248,'adidas',NULL,'B09MDQC87D','https://m.media-amazon.com/images/I/61YCY5vETML._AC_UL320_.jpg',41,4.3,'$30.33','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/adidas-Womens-SOLARMOTION-Bliss-Orange/dp/B09MDQC87D/ref=sr_1_92?keywords=women%27s+shoes&qid=1703020507&sr=8-92',54,'2023-12-19 15:15:09.340947-06','2023-12-19 15:15:09.340947-06','www.amazon.com'), + (4249,'ASICS',NULL,'B0B4PHSKX8','https://m.media-amazon.com/images/I/61818SrwLhL._AC_UL320_.jpg',1294,4.5,'$119.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/ASICS-Womens-Gel-Nimbus-Running-Piedmont/dp/B0B4PHSKX8/ref=sr_1_93?keywords=women%27s+shoes&qid=1703020507&sr=8-93',54,'2023-12-19 15:15:09.347671-06','2023-12-19 15:15:09.347671-06','www.amazon.com'), + (4250,'Hey Dude',NULL,'B0B9YTK57L','https://m.media-amazon.com/images/I/513RCvXQbIL._AC_UL320_.jpg',52883,4.7,'$55.24','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Hey-Dude-Chambray-Comfortable-Light-Weight/dp/B0B9YTK57L/ref=sr_1_94?keywords=women%27s+shoes&qid=1703020507&sr=8-94',54,'2023-12-19 15:15:09.354739-06','2023-12-19 15:15:09.354739-06','www.amazon.com'), + (4251,'PUMA',NULL,'B01C3LLGJ2','https://m.media-amazon.com/images/I/61+DxOI+QML._AC_UL320_.jpg',47029,4.4,'$57.27','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/PUMA-Womens-Cross-Trainer-Silver-Beetroot/dp/B01C3LLGJ2/ref=sr_1_95?keywords=women%27s+shoes&qid=1703020507&sr=8-95',54,'2023-12-19 15:15:09.360748-06','2023-12-19 15:15:09.360748-06','www.amazon.com'), + (4252,'Skechers',NULL,'B08RWP1FQK','https://m.media-amazon.com/images/I/61UMHhtAKML._AC_UL320_.jpg',1315,4.6,'$74.44','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Skechers-Cushioning-Elite-Lace-Up-White/dp/B08RWP1FQK/ref=sr_1_96?keywords=women%27s+shoes&qid=1703020507&sr=8-96',54,'2023-12-19 15:15:09.366947-06','2023-12-19 15:15:09.366947-06','www.amazon.com'), + (4253,'Dr. Scholl''s Shoes',NULL,'B08CCTT6BN','https://m.media-amazon.com/images/I/61xi8D0vX+L._AC_UL320_.jpg',349,4.5,'$70.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Dr-Scholls-Shoes-Laurence-Microfiber/dp/B08CCTT6BN/ref=sr_1_97?keywords=women%27s+shoes&qid=1703020507&sr=8-97',54,'2023-12-19 15:15:09.373655-06','2023-12-19 15:15:09.373655-06','www.amazon.com'), + (4254,'New Balance',NULL,'B09YGPD9PD','https://m.media-amazon.com/images/I/717CthrzLaL._AC_UL320_.jpg',239,4.2,'$59.31','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/New-Balance-Womens-Running-Raincloud/dp/B09YGPD9PD/ref=sr_1_98?keywords=women%27s+shoes&qid=1703020507&sr=8-98',54,'2023-12-19 15:15:09.380895-06','2023-12-19 15:15:09.380895-06','www.amazon.com'), + (4255,'Lugz',NULL,'B0998C35RV','https://m.media-amazon.com/images/I/51XD9G8CsmL._AC_UL320_.jpg',777,4.1,'$29.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Lugz-Womens-Clipper-Slip-Resistant-Service/dp/B0998C35RV/ref=sr_1_100?keywords=women%27s+shoes&qid=1703020507&sr=8-100',54,'2023-12-19 15:15:09.392299-06','2023-12-19 15:15:09.392299-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4256,'Amazon Essentials',NULL,'B082QGDKFM','https://m.media-amazon.com/images/I/618yR05NaIL._AC_UL320_.jpg',1946,3.9,'$19.90','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Amazon-Essentials-Womens-Casual-Sneaker/dp/B082QGDKFM/ref=sr_1_101?keywords=women%27s+shoes&qid=1703020507&sr=8-101',54,'2023-12-19 15:15:09.399743-06','2023-12-19 15:15:09.399743-06','www.amazon.com'), + (4257,'LifeStride',NULL,'B081HGFBKT','https://m.media-amazon.com/images/I/81Y5ePij1eL._AC_UL320_.jpg',14198,4.3,'$49.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/LifeStride-Womens-Giovanna-Pumps-Black/dp/B081HGFBKT/ref=sr_1_102?keywords=women%27s+shoes&qid=1703020507&sr=8-102',54,'2023-12-19 15:15:09.406203-06','2023-12-19 15:15:09.406203-06','www.amazon.com'), + (4258,'Avia',NULL,'B07B4K4P9L','https://m.media-amazon.com/images/I/61J0Bu181wL._AC_UL320_.jpg',2579,3.9,'$29.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Avia-Womens-Avi-Focus-Service-Metallic/dp/B07B4K4P9L/ref=sr_1_103?keywords=women%27s+shoes&qid=1703020507&sr=8-103',54,'2023-12-19 15:15:09.412655-06','2023-12-19 15:15:09.412655-06','www.amazon.com'), + (4259,'LifeStride',NULL,'B07TCB6YF8','https://m.media-amazon.com/images/I/61OqDtwZKTL._AC_UL320_.jpg',398,4.2,'$20.97','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/LifeStride-Zendaya-Womens-Slip-Navy/dp/B07TCB6YF8/ref=sr_1_104?keywords=women%27s+shoes&qid=1703020507&sr=8-104',54,'2023-12-19 15:15:09.4185-06','2023-12-19 15:15:09.4185-06','www.amazon.com'), + (4260,'Nike',NULL,'B0B5ZK28KJ','https://m.media-amazon.com/images/I/71D1i43ID3L._AC_UL320_.jpg',273,4.3,'$50.31','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Nike-Experience-Running-Trainers-Thistle/dp/B0B5ZK28KJ/ref=sr_1_105?keywords=women%27s+shoes&qid=1703020507&sr=8-105',54,'2023-12-19 15:15:09.424842-06','2023-12-19 15:15:09.424842-06','www.amazon.com'), + (4261,'Brooks',NULL,'B09MGDDTLF','https://m.media-amazon.com/images/I/81XnL5xkZoL._AC_UL320_.jpg',3936,4.6,'$64.88','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Brooks-Womens-Launch-Black-Purple/dp/B09MGDDTLF/ref=sr_1_106?keywords=women%27s+shoes&qid=1703020507&sr=8-106',54,'2023-12-19 15:15:09.43124-06','2023-12-19 15:15:09.43124-06','www.amazon.com'), + (4262,'ALTRA',NULL,'B09Y2DDQ27','https://m.media-amazon.com/images/I/71bltQyVj3L._AC_UL320_.jpg',143,4.3,'$59.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/ALTRA-Womens-AL0A7R7O-Provision-Running/dp/B09Y2DDQ27/ref=sr_1_107?keywords=women%27s+shoes&qid=1703020507&sr=8-107',54,'2023-12-19 15:15:09.43786-06','2023-12-19 15:15:09.43786-06','www.amazon.com'), + (4263,'Nike',NULL,'B0BNJJVHVW','https://m.media-amazon.com/images/I/61ohg9b4o9L._AC_UL320_.jpg',4977,4.3,'$58.02','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Nike-Womens-Revolution-Nature-Running/dp/B0BNJJVHVW/ref=sr_1_108?keywords=women%27s+shoes&qid=1703020507&sr=8-108',54,'2023-12-19 15:15:09.444401-06','2023-12-19 15:15:09.444401-06','www.amazon.com'), + (4591,'Mini Portable Charger USB-C Power Bank, 5200mAh Portable Phone Charger, Compact Plug in Battery Pack Compatible with iPhone 15/15Plus/15Pro/15Pro Max Samsung S23/S22 Moto iPad Pro Android Phone etc',NULL,'B0CHJR4NRP','https://m.media-amazon.com/images/I/71+87+ZW3aL._AC_UL320_.jpg',119,4.6,'$23.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Portable-Charger-5200mAh-Compact-Compatible/dp/B0CHJR4NRP/ref=sr_1_103?keywords=travel+accessories&qid=1703020686&sr=8-103',57,'2023-12-19 15:18:08.131013-06','2023-12-19 15:18:08.131013-06','www.amazon.com'), + (4265,'DeYashopin',NULL,'B0B91KZC9N','https://m.media-amazon.com/images/I/61I2mXzxNGL._AC_UL320_.jpg',1197,4.3,'$37.77','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4Mjg2NzIyOTY1MzA3NzE3OjE3MDMwMjA1MDg6c3Bfc2VhcmNoX3RoZW1hdGljX2J0ZjozMDAwODY2NTM2MTMyMDI6OjA6Og&url=%2FDeYashopin-Leisure-Comfort-Microfiber-Black-9-5%2Fdp%2FB0B91KZC9N%2Fref%3Dsxbs_pa_sp_search_thematic_btf_sspa%3Fcontent-id%3Damzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%253Aamzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%26cv_ct_cx%3Dwomen%2527s%2Bshoes%26keywords%3Dwomen%2527s%2Bshoes%26pd_rd_i%3DB0B91KZC9N%26pd_rd_r%3D28f5bec8-3b24-4c0b-b307-13b25d64069f%26pd_rd_w%3DcjGIW%26pd_rd_wg%3DIj2Sh%26pf_rd_p%3Dc950d26b-f218-41e6-a496-534825ce2131%26pf_rd_r%3DNV2Q33K70K3PFE8DQE6V%26qid%3D1703020507%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-49-50a2b317-b617-44c1-b7a6-daec194a2368-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWNfYnRm%26psc%3D1',54,'2023-12-19 15:15:09.459318-06','2023-12-19 15:15:09.459318-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4266,'Slow Man',NULL,'B07LFF2VV1','https://m.media-amazon.com/images/I/61qUXs7zhIL._AC_UL320_.jpg',99967,4.0,'$37.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4Mjg2NzIyOTY1MzA3NzE3OjE3MDMwMjA1MDg6c3Bfc2VhcmNoX3RoZW1hdGljX2J0ZjozMDAwMTY3NjQxMzI5MDI6OjE6Og&url=%2FWomens-Walking-Shoes-Sock-Sneakers%2Fdp%2FB07LFF2VV1%2Fref%3Dsxbs_pa_sp_search_thematic_btf_sspa%3Fcontent-id%3Damzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%253Aamzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%26cv_ct_cx%3Dwomen%2527s%2Bshoes%26keywords%3Dwomen%2527s%2Bshoes%26pd_rd_i%3DB07LFF2VV1%26pd_rd_r%3D28f5bec8-3b24-4c0b-b307-13b25d64069f%26pd_rd_w%3DcjGIW%26pd_rd_wg%3DIj2Sh%26pf_rd_p%3Dc950d26b-f218-41e6-a496-534825ce2131%26pf_rd_r%3DNV2Q33K70K3PFE8DQE6V%26qid%3D1703020507%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-50-50a2b317-b617-44c1-b7a6-daec194a2368-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWNfYnRm%26psc%3D1%26smid%3DA102YGJJFP9LY',54,'2023-12-19 15:15:09.46676-06','2023-12-19 15:15:09.46676-06','www.amazon.com'), + (4267,'hash bubbie',NULL,'B09YCR8T29','https://m.media-amazon.com/images/I/7156F1HU8aL._AC_UL320_.jpg',967,4.1,'$22.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4Mjg2NzIyOTY1MzA3NzE3OjE3MDMwMjA1MDg6c3Bfc2VhcmNoX3RoZW1hdGljX2J0ZjoyMDAwNzU0NTc1OTI0OTg6OjI6Og&url=%2Fhash-bubbie-Comfortable-Leather-Black-US8%2Fdp%2FB09YCR8T29%2Fref%3Dsxbs_pa_sp_search_thematic_btf_sspa%3Fcontent-id%3Damzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%253Aamzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%26cv_ct_cx%3Dwomen%2527s%2Bshoes%26keywords%3Dwomen%2527s%2Bshoes%26pd_rd_i%3DB09YCR8T29%26pd_rd_r%3D28f5bec8-3b24-4c0b-b307-13b25d64069f%26pd_rd_w%3DcjGIW%26pd_rd_wg%3DIj2Sh%26pf_rd_p%3Dc950d26b-f218-41e6-a496-534825ce2131%26pf_rd_r%3DNV2Q33K70K3PFE8DQE6V%26qid%3D1703020507%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-51-50a2b317-b617-44c1-b7a6-daec194a2368-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWNfYnRm%26psc%3D1',54,'2023-12-19 15:15:09.473651-06','2023-12-19 15:15:09.473651-06','www.amazon.com'), + (4268,'HEAWISH',NULL,'B09WJ4SV3W','https://m.media-amazon.com/images/I/71NBToNGoiL._AC_UL320_.jpg',6521,4.3,'$23.88','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4Mjg2NzIyOTY1MzA3NzE3OjE3MDMwMjA1MDg6c3Bfc2VhcmNoX3RoZW1hdGljX2J0ZjozMDAwNTM2MzIwODQ4MDI6OjM6Og&url=%2FHEAWISH-Womens-Floral-Ballet-Flowers%2Fdp%2FB09WJ4SV3W%2Fref%3Dsxbs_pa_sp_search_thematic_btf_sspa%3Fcontent-id%3Damzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%253Aamzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%26cv_ct_cx%3Dwomen%2527s%2Bshoes%26keywords%3Dwomen%2527s%2Bshoes%26pd_rd_i%3DB09WJ4SV3W%26pd_rd_r%3D28f5bec8-3b24-4c0b-b307-13b25d64069f%26pd_rd_w%3DcjGIW%26pd_rd_wg%3DIj2Sh%26pf_rd_p%3Dc950d26b-f218-41e6-a496-534825ce2131%26pf_rd_r%3DNV2Q33K70K3PFE8DQE6V%26qid%3D1703020507%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-52-50a2b317-b617-44c1-b7a6-daec194a2368-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWNfYnRm%26psc%3D1',54,'2023-12-19 15:15:09.481298-06','2023-12-19 15:15:09.481298-06','www.amazon.com'), + (4264,'kufeiti',NULL,'B08LSKSNJV','https://m.media-amazon.com/images/I/81XrW90Ys+L._AC_UL320_.jpg',8321,4.0,'$19.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4Mjg2NzIyOTY1MzA3NzE3OjE3MDMwMjA1MDg6c3Bfc2VhcmNoX3RoZW1hdGljX2J0ZjoyMDAwNjE5Mjc5ODUwOTg6OjQ6Og&url=%2Fkufeiti-Sneakers-Fashion-Comfortable-Elastic%2Fdp%2FB08LSKSNJV%2Fref%3Dsxbs_pa_sp_search_thematic_btf_sspa%3Fcontent-id%3Damzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%253Aamzn1.sym.c950d26b-f218-41e6-a496-534825ce2131%26cv_ct_cx%3Dwomen%2527s%2Bshoes%26keywords%3Dwomen%2527s%2Bshoes%26pd_rd_i%3DB08LSKSNJV%26pd_rd_r%3D28f5bec8-3b24-4c0b-b307-13b25d64069f%26pd_rd_w%3DcjGIW%26pd_rd_wg%3DIj2Sh%26pf_rd_p%3Dc950d26b-f218-41e6-a496-534825ce2131%26pf_rd_r%3DNV2Q33K70K3PFE8DQE6V%26qid%3D1703020507%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-53-50a2b317-b617-44c1-b7a6-daec194a2368-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWNfYnRm%26psc%3D1',54,'2023-12-19 15:15:09.451873-06','2023-12-19 15:15:09.487665-06','www.amazon.com'), + (4269,'Blink Silicone Camera Skin for Indoor and Outdoor – White',NULL,'B08B4648C4','https://m.media-amazon.com/images/I/41SA0K4wfWL._AC_UL320_.jpg',637,4.4,'$7.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToyMzU5NDQ2MzQ3MTY3MTc6MTcwMzAyMDUxNzpzcF9hdGY6MjAwMDMxOTcyMDA3MDcxOjowOjo&url=%2FBlink-Silicone-Camera-Indoor-Outdoor%2Fdp%2FB08B4648C4%2Fref%3Dsr_1_1_ffob_sspa%3Fkeywords%3Doutdoor%26qid%3D1703020517%26sr%3D8-1-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGY%26psc%3D1',55,'2023-12-19 15:15:18.477684-06','2023-12-19 15:15:18.477684-06','www.amazon.com'), + (4270,'Outdoor Projector, Mini Projector for Home Theater, 1080P and 240" Supported Movie Projector 7500 L Portable Home Video Projector Compatible with Smartphone/TV Stick/PS4/PC/Laptop',NULL,'B0991YNM7B','https://m.media-amazon.com/images/I/6107KCDjItL._AC_UL320_.jpg',2855,4.4,'$69.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/%E3%80%90Updated%E3%80%91-Projector-Supported-Compatible-Smartphone/dp/B0991YNM7B/ref=sr_1_2?keywords=outdoor&qid=1703020517&sr=8-2',55,'2023-12-19 15:15:18.48568-06','2023-12-19 15:15:18.48568-06','www.amazon.com'), + (4271,'Throw Throw Burrito by Exploding Kittens: Extreme Outdoor Edition - A Dodgeball Card Game - Family-Friendly Party Card Games for Adults, Teens & Kids',NULL,'B01ASIBA5M','https://m.media-amazon.com/images/I/81EIsOyR3gL._AC_UL320_.jpg',38599,4.7,'$25.79','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Throw-Burrito-Extreme-Exploding-Dodgeball/dp/B01ASIBA5M/ref=sr_1_3?keywords=outdoor&qid=1703020517&sr=8-3',55,'2023-12-19 15:15:18.492251-06','2023-12-19 15:15:18.492251-06','www.amazon.com'), + (4272,'Bamworld',NULL,'B09234GQXV','https://m.media-amazon.com/images/I/81ldZ1TV-5L._AC_UL320_.jpg',14014,4.5,'$23.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Bamworld-Stands-Outdoor-Multiple-Balcony/dp/B09234GQXV/ref=sr_1_4?keywords=outdoor&qid=1703020517&sr=8-4',55,'2023-12-19 15:15:18.498665-06','2023-12-19 15:15:18.498665-06','www.amazon.com'), + (4592,'So-Mine Commuter Essential Bag | Attaches to Airline Seat and Car Pocket | Travel Organizer | Slim Profile | 6 Pockets | 2 Cable Loops | 1 Zipper Pocket | Fits on Roller Bag Handle',NULL,'B081B9ZGLK','https://m.media-amazon.com/images/I/914IUIsoBfL._AC_UL320_.jpg',616,4.3,'$19.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Commuter-Essential-Organizer-Designed-Accessory/dp/B081B9ZGLK/ref=sr_1_104?keywords=travel+accessories&qid=1703020686&sr=8-104',57,'2023-12-19 15:18:08.137229-06','2023-12-19 15:18:08.137229-06','www.amazon.com'), + (4274,'Heavy Duty Patio Sofa Cover Waterproof, Mrrihand 2-Seater Outdoor Sofa Loveseat Cover, Outdoor Patio Furniture Cover for Winter with Air Vent and Handles, 60" L×34" D×30" H, Black',NULL,'B09MSZVXH8','https://m.media-amazon.com/images/I/71Y1YXMeviL._AC_UL320_.jpg',1302,4.5,'$25.62','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo0NTgzOTg4NTkyMzQyNzE3OjE3MDMwMjA1MTc6c3Bfc2VhcmNoX3RoZW1hdGljOjIwMDA1NTc5OTQxNTg5ODo6MDo6&url=%2FWaterproof-Mrrihand-2-Seater-Furniture-60%2Fdp%2FB09MSZVXH8%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.882a4bd1-3fd3-4961-90f6-8abc45a77ab4%253Aamzn1.sym.882a4bd1-3fd3-4961-90f6-8abc45a77ab4%26cv_ct_cx%3Doutdoor%26keywords%3Doutdoor%26pd_rd_i%3DB09MSZVXH8%26pd_rd_r%3D0cfffc08-0b5e-4c2c-9ddf-f2993af9944b%26pd_rd_w%3D6krn2%26pd_rd_wg%3DqLO9o%26pf_rd_p%3D882a4bd1-3fd3-4961-90f6-8abc45a77ab4%26pf_rd_r%3DB66DG5J15A2HQ95FX630%26qid%3D1703020517%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-1-957b5332-dff9-4ebb-812a-1c4282368112-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',55,'2023-12-19 15:15:18.511373-06','2023-12-19 15:15:18.511373-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4275,'Outdoor Faucet Covers for Winter Freeze Protection, 2 Pack 6.7" x 11" Hose Bib Covers for Winter, Water Spigot Covers Winter Insulated, Pipe Wrap Insulation Cover Socks Outside Faucet Freeze Protector',NULL,'B0CCRPWB6Z','https://m.media-amazon.com/images/I/81jhQC+Dq3L._AC_UL320_.jpg',97,4.3,'$8.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo0NTgzOTg4NTkyMzQyNzE3OjE3MDMwMjA1MTc6c3Bfc2VhcmNoX3RoZW1hdGljOjMwMDA4NTEzMDQxNjgwMjo6MTo6&url=%2FOutdoor-Protection-Insulated-Insulation-Protector%2Fdp%2FB0CCRPWB6Z%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.882a4bd1-3fd3-4961-90f6-8abc45a77ab4%253Aamzn1.sym.882a4bd1-3fd3-4961-90f6-8abc45a77ab4%26cv_ct_cx%3Doutdoor%26keywords%3Doutdoor%26pd_rd_i%3DB0CCRPWB6Z%26pd_rd_r%3D0cfffc08-0b5e-4c2c-9ddf-f2993af9944b%26pd_rd_w%3D6krn2%26pd_rd_wg%3DqLO9o%26pf_rd_p%3D882a4bd1-3fd3-4961-90f6-8abc45a77ab4%26pf_rd_r%3DB66DG5J15A2HQ95FX630%26qid%3D1703020517%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-2-957b5332-dff9-4ebb-812a-1c4282368112-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',55,'2023-12-19 15:15:18.517234-06','2023-12-19 15:15:18.62771-06','www.amazon.com'), + (4276,'KFY outdoor storage box,XXL 230 gallon Resin Large deck box waterproof and sunproof Loackable Suitable for patio furniture and outdoor garden tool storage(black)',NULL,'B0CN46WCK5','https://m.media-amazon.com/images/I/71cxQqvF07L._AC_UL320_.jpg',27,4.3,'$319.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo0NTgzOTg4NTkyMzQyNzE3OjE3MDMwMjA1MTc6c3Bfc2VhcmNoX3RoZW1hdGljOjMwMDA4NzIzOTY2NTgwMjo6Mjo6&url=%2FKFY-waterproof-Loackable-furniture-storage%25EF%25BC%2588black%25EF%25BC%2589%2Fdp%2FB0CN46WCK5%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.882a4bd1-3fd3-4961-90f6-8abc45a77ab4%253Aamzn1.sym.882a4bd1-3fd3-4961-90f6-8abc45a77ab4%26cv_ct_cx%3Doutdoor%26keywords%3Doutdoor%26pd_rd_i%3DB0CN46WCK5%26pd_rd_r%3D0cfffc08-0b5e-4c2c-9ddf-f2993af9944b%26pd_rd_w%3D6krn2%26pd_rd_wg%3DqLO9o%26pf_rd_p%3D882a4bd1-3fd3-4961-90f6-8abc45a77ab4%26pf_rd_r%3DB66DG5J15A2HQ95FX630%26qid%3D1703020517%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-3-957b5332-dff9-4ebb-812a-1c4282368112-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',55,'2023-12-19 15:15:18.52477-06','2023-12-19 15:15:18.52477-06','www.amazon.com'), + (4277,'Jayus Double Sided US Marine Corps Military Flags 3x5 Outdoor- Vivid Colors 200D USMC Flag Banner with 2 Grommets',NULL,'B09QXLPJ3D','https://m.media-amazon.com/images/I/61ql85SchlS._AC_UL320_.jpg',574,4.7,'$21.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo0NTgzOTg4NTkyMzQyNzE3OjE3MDMwMjA1MTc6c3Bfc2VhcmNoX3RoZW1hdGljOjIwMDE3MDQ5OTUyNTU5ODo6Mzo6&url=%2FDouble-Military-Outdoor-Colors-Grommets%2Fdp%2FB09QXLPJ3D%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.882a4bd1-3fd3-4961-90f6-8abc45a77ab4%253Aamzn1.sym.882a4bd1-3fd3-4961-90f6-8abc45a77ab4%26cv_ct_cx%3Doutdoor%26keywords%3Doutdoor%26pd_rd_i%3DB09QXLPJ3D%26pd_rd_r%3D0cfffc08-0b5e-4c2c-9ddf-f2993af9944b%26pd_rd_w%3D6krn2%26pd_rd_wg%3DqLO9o%26pf_rd_p%3D882a4bd1-3fd3-4961-90f6-8abc45a77ab4%26pf_rd_r%3DB66DG5J15A2HQ95FX630%26qid%3D1703020517%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-4-957b5332-dff9-4ebb-812a-1c4282368112-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',55,'2023-12-19 15:15:18.530513-06','2023-12-19 15:15:18.530513-06','www.amazon.com'), + (4273,'AmeriTop Solar Lights Outdoor 300 LED 6500K Motion Sensor Lights Cordless; 5 Adjustable Heads, 360° Wide Angle Illumination, IP65 Waterproof, Security Flood Light for Patio Yard Garden 2 Pack',NULL,'B0957ZMRKZ','https://m.media-amazon.com/images/I/81nVCfpDkLL._AC_UL320_.jpg',3147,4.4,'$39.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo0NTgzOTg4NTkyMzQyNzE3OjE3MDMwMjA1MTc6c3Bfc2VhcmNoX3RoZW1hdGljOjIwMDA5NzA4MDUyMzYzMTo6NDo6&url=%2FSolar-Lights-Outdoor-Adjustable-Illumination%2Fdp%2FB0957ZMRKZ%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.882a4bd1-3fd3-4961-90f6-8abc45a77ab4%253Aamzn1.sym.882a4bd1-3fd3-4961-90f6-8abc45a77ab4%26cv_ct_cx%3Doutdoor%26keywords%3Doutdoor%26pd_rd_i%3DB0957ZMRKZ%26pd_rd_r%3D0cfffc08-0b5e-4c2c-9ddf-f2993af9944b%26pd_rd_w%3D6krn2%26pd_rd_wg%3DqLO9o%26pf_rd_p%3D882a4bd1-3fd3-4961-90f6-8abc45a77ab4%26pf_rd_r%3DB66DG5J15A2HQ95FX630%26qid%3D1703020517%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-5-957b5332-dff9-4ebb-812a-1c4282368112-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',55,'2023-12-19 15:15:18.505592-06','2023-12-19 15:15:18.535686-06','www.amazon.com'), + (4278,'ROZATO',NULL,'B09RN1ZH6L','https://m.media-amazon.com/images/I/71bg5Fu-fLL._AC_UL320_.jpg',816,4.6,'$64.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/ROZATO-Tabletop-Fireplace-Portable-Outdoor/dp/B09RN1ZH6L/ref=sr_1_5?keywords=outdoor&qid=1703020517&sr=8-5',55,'2023-12-19 15:15:18.541509-06','2023-12-19 15:15:18.541509-06','www.amazon.com'), + (4279,'Brightever',NULL,'B0BGL7W99N','https://m.media-amazon.com/images/I/8117DTT-UJL._AC_UL320_.jpg',1115,4.4,'$15.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Brightever-%E3%80%90%F0%9D%90%94%F0%9D%90%A9%F0%9D%90%A0%F0%9D%90%AB%F0%9D%90%9A%F0%9D%90%9D%F0%9D%90%9E%F0%9D%90%9D%E3%80%91-Lights-Outdoor-Waterproof/dp/B0BGL7W99N/ref=sr_1_6?keywords=outdoor&qid=1703020517&sr=8-6',55,'2023-12-19 15:15:18.54739-06','2023-12-19 15:15:18.54739-06','www.amazon.com'), + (4280,'4 Pack Firefly LightsSolar Garden Lights Upgraded 8 LED, Solar Firefly Lights Outdoor Waterproof, Breathing Mode High Flexibility Firefly Garden Lights Solar Outdoor for Patio,Yard, Path',NULL,'B0C2Q3MC6G','https://m.media-amazon.com/images/I/81cYd6a4rsL._AC_UL320_.jpg',203,4.2,'$6.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/LightsSolar-Upgraded-Waterproof-Breathing-Flexibility/dp/B0C2Q3MC6G/ref=sr_1_7?keywords=outdoor&qid=1703020517&sr=8-7',55,'2023-12-19 15:15:18.553982-06','2023-12-19 15:15:18.553982-06','www.amazon.com'), + (4281,'Light Bulb Security Camera, 5G/2.4G WiFi Security Cameras Wireless Outdoor with Motion Detection and Alarm, Two-Way Talk, Color Night Vision, Human Detection, Bulb Camera Work with Alex (2 Pack)',NULL,'B0CMCWYDZK','https://m.media-amazon.com/images/I/71PYyoaXE4L._AC_UL320_.jpg',59,4.8,'$49.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Security-Cameras-Wireless-Outdoor-Detection/dp/B0CMCWYDZK/ref=sr_1_8?keywords=outdoor&qid=1703020517&sr=8-8',55,'2023-12-19 15:15:18.560148-06','2023-12-19 15:15:18.560148-06','www.amazon.com'), + (4282,'Brightever',NULL,'B0B4NT4J28','https://m.media-amazon.com/images/I/71JM1dsFQ1L._AC_UL320_.jpg',2803,4.7,'$49.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Brightever-Shatterproof-Waterproof-Backyard-Dimmable/dp/B0B4NT4J28/ref=sr_1_9?keywords=outdoor&qid=1703020517&sr=8-9',55,'2023-12-19 15:15:18.566104-06','2023-12-19 15:15:18.566104-06','www.amazon.com'), + (4283,'TONULAX',NULL,'B09YD454KV','https://m.media-amazon.com/images/I/71oGQ4MIPsL._AC_UL320_.jpg',6975,4.5,'$37.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/TONULAX-Solar-Garden-Lights-Decorative/dp/B09YD454KV/ref=sr_1_10?keywords=outdoor&qid=1703020517&sr=8-10',55,'2023-12-19 15:15:18.572983-06','2023-12-19 15:15:18.572983-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4296,'VOLISUN',NULL,'B0BDRL222C','https://m.media-amazon.com/images/I/81Vx6Gmp-DL._AC_UL320_.jpg',1293,4.5,'$32.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/VOLISUN-Triangle-Waterproof-Outdoor-Walkway/dp/B0BDRL222C/ref=sr_1_24?keywords=outdoor&qid=1703020517&sr=8-24',55,'2023-12-19 15:15:18.65879-06','2023-12-19 15:15:18.65879-06','www.amazon.com'), + (4284,'Solar Outdoor Lights, [2 Packs] 225 LED 3 Head Adjustable Motion Sensor Lights, 2500LM 330° Wide Angle Solar Flood Lights, IP65 Waterproof Wall Lamp Security Lights With 16.5Ft Cable for Garden Yard',NULL,'B0C5DGS4TC','https://m.media-amazon.com/images/I/71eFoWEvgNL._AC_UL320_.jpg',581,4.2,'$29.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToyMzU5NDQ2MzQ3MTY3MTc6MTcwMzAyMDUxNzpzcF9tdGY6MzAwMDUwOTkxMjc3NDAyOjowOjo&url=%2FOutdoor-Lights-Adjustable-Waterproof-Security%2Fdp%2FB0C5DGS4TC%2Fref%3Dsr_1_11_sspa%3Fkeywords%3Doutdoor%26qid%3D1703020517%26sr%3D8-11-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',55,'2023-12-19 15:15:18.578821-06','2023-12-19 15:15:18.578821-06','www.amazon.com'), + (4285,'Solar Lights Outdoor, 106 LED 3000LM Solar Powered Motion Sensor Flood Lights with Remote, Dusk to Dawn Led Solar Security Wall Lights with 16.5Ft Cable IP65 Waterproof for Outside, Garage, 2 Pack',NULL,'B09VBWGM8V','https://m.media-amazon.com/images/I/81Ju9wRoBaL._AC_UL320_.jpg',2513,4.3,'$34.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToyMzU5NDQ2MzQ3MTY3MTc6MTcwMzAyMDUxNzpzcF9tdGY6MjAwMDY1MzY2NzUzMzk4OjowOjo&url=%2FOutdoor-Powered-Security-Waterproof-Outside%2Fdp%2FB09VBWGM8V%2Fref%3Dsr_1_12_sspa%3Fkeywords%3Doutdoor%26qid%3D1703020517%26sr%3D8-12-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',55,'2023-12-19 15:15:18.585069-06','2023-12-19 15:15:18.585069-06','www.amazon.com'), + (4286,'Pyramid Patio Heater 48,000 BTU Outdoor Heater with Cover, Propane Patio Heater, Pyramid Outdoor Heaters Quartz Glass Tube Patio Heaters for Outdoor Use with Wheels, Ground Nails, Detachable Table',NULL,'B09B76HHLX','https://m.media-amazon.com/images/I/61TqePoaNnL._AC_UL320_.jpg',147,4.2,'$239.88','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToyMzU5NDQ2MzQ3MTY3MTc6MTcwMzAyMDUxNzpzcF9tdGY6MjAwMDc5ODA0MDI3NDQxOjowOjo&url=%2FPyramid-Outdoor-Propane-Heaters-Detachable%2Fdp%2FB09B76HHLX%2Fref%3Dsr_1_13_sspa%3Fkeywords%3Doutdoor%26qid%3D1703020517%26sr%3D8-13-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',55,'2023-12-19 15:15:18.591076-06','2023-12-19 15:15:18.591076-06','www.amazon.com'), + (4287,'Bridika Solar Fence Lights 8 Colors, Warm White, Cool White and RGB, Bright Deck Lights Solar Outdoor Waterproof, Dusk to Dawn Fence Lights for Backyard, Patio, Railing, Wall, Step (12 Pack)',NULL,'B0C52RGHJG','https://aax-us-iad.amazon.com/e/loi/imp?b=JOaQdb-dk9QbIFXDdyk1CM4AAAGMg-7XlQEAAAH2AQBvbm9fdHhuX2JpZDUgICBvbm9fdHhuX2ltcDEgICC06m6N',196,4.2,'$67.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.comhttps://aax-us-iad.amazon.com/x/c/ROaQdb-dk9QbIFXDdyk1CM4AAAGMg-7XUQEAAAH2AQBvbm9fdHhuX2JpZDUgICBvbm9fdHhuX2ltcDEgICC06m6N/https://www.amazon.com/Bridika-Outdoor-Waterproof-Backyard-Railing/dp/B0C52RGHJG/ref=sxin_23_sbv_search_btf?content-id=amzn1.sym.6ca944f8-539c-499e-a3a4-26a566d1de59%3Aamzn1.sym.6ca944f8-539c-499e-a3a4-26a566d1de59&cv_ct_cx=outdoor&keywords=outdoor&pd_rd_i=B0C52RGHJG&pd_rd_r=0cfffc08-0b5e-4c2c-9ddf-f2993af9944b&pd_rd_w=kL79c&pd_rd_wg=qLO9o&pf_rd_p=6ca944f8-539c-499e-a3a4-26a566d1de59&pf_rd_r=B66DG5J15A2HQ95FX630&qid=1703020517&sbo=RZvfv%2F%2FHxDF%2BO5021pAnSA%3D%3D&sr=1-1-5190daf0-67e3-427c-bea6-c72c1df98776',55,'2023-12-19 15:15:18.596911-06','2023-12-19 15:15:18.596911-06','www.amazon.comhttps:'), + (4288,'SOLPEX',NULL,'B07YC8PVF1','https://m.media-amazon.com/images/I/710SfWdkgoS._AC_UL320_.jpg',12357,4.3,'$29.89','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Solpex-Lights-Outdoor-Waterproof-Pathway/dp/B07YC8PVF1/ref=sr_1_15?keywords=outdoor&qid=1703020517&sr=8-15',55,'2023-12-19 15:15:18.60297-06','2023-12-19 15:15:18.60297-06','www.amazon.com'), + (4289,'Kingsyard',NULL,'B0C274KF4T','https://m.media-amazon.com/images/I/71sIRh3D8LL._AC_UL320_.jpg',3150,4.7,'$9.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Kingsyard-Hummingbird-Outdoors-Feeding-Included/dp/B0C274KF4T/ref=sr_1_16?keywords=outdoor&qid=1703020517&sr=8-16',55,'2023-12-19 15:15:18.60933-06','2023-12-19 15:15:18.60933-06','www.amazon.com'), + (4290,'WYZE',NULL,'B0BWSPP9HH','https://m.media-amazon.com/images/I/51VfHNLKklL._AC_UL320_.jpg',8675,4.3,'$64.74','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/WYZE-IP65-Rated-Security-Compatible-Assistant/dp/B0BWSPP9HH/ref=sr_1_17?keywords=outdoor&qid=1703020517&sr=8-17',55,'2023-12-19 15:15:18.615688-06','2023-12-19 15:15:18.615688-06','www.amazon.com'), + (4291,'GCI Outdoor',NULL,'B07N6YD8BK','https://m.media-amazon.com/images/I/81uACa+Dd-L._AC_UL320_.jpg',81130,4.7,'$60.19','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/GCI-Outdoor-Rocker-Collapsible-Rocking/dp/B07N6YD8BK/ref=sr_1_18?keywords=outdoor&qid=1703020517&sr=8-18',55,'2023-12-19 15:15:18.621753-06','2023-12-19 15:15:18.621753-06','www.amazon.com'), + (4292,'Diyel',NULL,'B0BLSH6JM1','https://m.media-amazon.com/images/I/51+ZcEmxNuL._AC_UL320_.jpg',83,4.4,'$149.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToyMzU5NDQ2MzQ3MTY3MTc6MTcwMzAyMDUxNzpzcF9tdGY6MzAwMDA1NTg0NTA3MDAyOjowOjo&url=%2FDiyel-Gooseneck-Farmhouse-Exterior-Industrial%2Fdp%2FB0BLSH6JM1%2Fref%3Dsr_1_20_sspa%3Fkeywords%3Doutdoor%26qid%3D1703020517%26sr%3D8-20-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',55,'2023-12-19 15:15:18.634276-06','2023-12-19 15:15:18.634276-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4293,'LayinSun',NULL,'B0CL7KK6CN','https://m.media-amazon.com/images/I/81xxfH8Pw5L._AC_UL320_.jpg',14,4.9,'$849.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToyMzU5NDQ2MzQ3MTY3MTc6MTcwMzAyMDUxNzpzcF9tdGY6MzAwMDc0ODczMzM1OTAyOjowOjo&url=%2FLayinSun-Pieces-Outdoor-Furniture-Rattan%2Fdp%2FB0CL7KK6CN%2Fref%3Dsr_1_21_sspa%3Fkeywords%3Doutdoor%26qid%3D1703020517%26sr%3D8-21-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',55,'2023-12-19 15:15:18.64124-06','2023-12-19 15:15:18.64124-06','www.amazon.com'), + (4294,'JACKYLED',NULL,'B0CDH4D9J3','https://m.media-amazon.com/images/I/81T9KoMxlcL._AC_UL320_.jpg',118,4.4,'$35.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToyMzU5NDQ2MzQ3MTY3MTc6MTcwMzAyMDUxNzpzcF9tdGY6MzAwMDYxNzI0NzU2MjAyOjowOjo&url=%2FJACKYLED-Outside-Adjustable-Waterproof-Security%2Fdp%2FB0CDH4D9J3%2Fref%3Dsr_1_22_sspa%3Fkeywords%3Doutdoor%26qid%3D1703020517%26sr%3D8-22-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',55,'2023-12-19 15:15:18.647119-06','2023-12-19 15:15:18.647119-06','www.amazon.com'), + (4295,'Best Choice Products',NULL,'B0CP2V63JT','https://m.media-amazon.com/images/I/716SiWEx-JL._AC_UL320_.jpg',3,5.0,'$34.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Best-Choice-Products-Basketball-Adjustable/dp/B0CP2V63JT/ref=sr_1_23?keywords=outdoor&qid=1703020517&sr=8-23',55,'2023-12-19 15:15:18.65297-06','2023-12-19 15:15:18.65297-06','www.amazon.com'), + (4297,'EAST OAK',NULL,'B0C6TJBKJM','https://m.media-amazon.com/images/I/51QEhdB3hoL._AC_UL320_.jpg',289,4.4,'$149.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/EAST-OAK-Double-Layer-Stainless-Commercial/dp/B0C6TJBKJM/ref=sr_1_25?keywords=outdoor&qid=1703020517&sr=8-25',55,'2023-12-19 15:15:18.665702-06','2023-12-19 15:15:18.665702-06','www.amazon.com'), + (4298,'DenicMic',NULL,'B0BYZF8F96','https://m.media-amazon.com/images/I/81239Yh+PzL._AC_UL320_.jpg',67,4.3,'$29.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToyMzU5NDQ2MzQ3MTY3MTc6MTcwMzAyMDUxNzpzcF9tdGY6MzAwMDE2NjU4MTE2MjAyOjowOjo&url=%2FDenicMic-Outdoor-Flexible-Waterproof-Decorations%2Fdp%2FB0BYZF8F96%2Fref%3Dsr_1_27_sspa%3Fkeywords%3Doutdoor%26qid%3D1703020517%26sr%3D8-27-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',55,'2023-12-19 15:15:18.671649-06','2023-12-19 15:15:18.671649-06','www.amazon.com'), + (4299,'Kullavik',NULL,'B0CKDMZ4N8','https://m.media-amazon.com/images/I/81zFv4UB7iL._AC_UL320_.jpg',179,4.9,'$899.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToyMzU5NDQ2MzQ3MTY3MTc6MTcwMzAyMDUxNzpzcF9tdGY6MzAwMDg1ODY2NTQ5NzAyOjowOjo&url=%2FKullavik-Furniture-55000BTU-Sectional-Conversation%2Fdp%2FB0CKDMZ4N8%2Fref%3Dsr_1_28_sspa%3Fkeywords%3Doutdoor%26qid%3D1703020517%26sr%3D8-28-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',55,'2023-12-19 15:15:18.676866-06','2023-12-19 15:15:18.676866-06','www.amazon.com'), + (4300,'PENXUA',NULL,'B09NR2RZQW','https://m.media-amazon.com/images/I/81XNC5AA35L._AC_UL320_.jpg',3013,4.4,'$9.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/PENXUA-Waterproof-Cardinals-Hummingbird-Decoration/dp/B09NR2RZQW/ref=sr_1_30?keywords=outdoor&qid=1703020517&sr=8-30',55,'2023-12-19 15:15:18.683604-06','2023-12-19 15:15:18.683604-06','www.amazon.com'), + (4301,'Garden Solar Ball Lights Outdoor Waterproof, 50 LED Cracked Glass Globe Solar Power Ground Lights for Path Yard Patio Lawn, Christmas Decoration Landscape Warm White(2 Pack 4.7'''')',NULL,'B08ZYY5BVX','https://m.media-amazon.com/images/I/81r0F2rRXOL._AC_UL320_.jpg',1163,4.2,'$29.60','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Kooboe-Outdoor-Waterproof-Walkway-Decoration/dp/B08ZYY5BVX/ref=sr_1_31?keywords=outdoor&qid=1703020517&sr=8-31',55,'2023-12-19 15:15:18.689645-06','2023-12-19 15:15:18.689645-06','www.amazon.com'), + (4302,'Philips',NULL,'B07YBF2M7H','https://m.media-amazon.com/images/I/71jRqA9z8fL._AC_UL320_.jpg',1312,4.7,'$7.69','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Philips-Extension-Christmas-SPS1033GE-27/dp/B07YBF2M7H/ref=sr_1_32?keywords=outdoor&qid=1703020517&sr=8-32',55,'2023-12-19 15:15:18.695632-06','2023-12-19 15:15:18.695632-06','www.amazon.com'), + (4303,'Nacome',NULL,'B091ZFL4X5','https://m.media-amazon.com/images/I/71Mq0xq6M4L._AC_UL320_.jpg',8462,4.5,'$28.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Nacome-Garden-Statue-Figurine-Succulent/dp/B091ZFL4X5/ref=sr_1_33?keywords=outdoor&qid=1703020517&sr=8-33',55,'2023-12-19 15:15:18.701765-06','2023-12-19 15:15:18.701765-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4304,'BN-LINK',NULL,'B0CHR9HH2D','https://m.media-amazon.com/images/I/61QBcrv1GTL._AC_UL320_.jpg',37,5.0,'$13.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/BN-LINK-Extension-Resistant-Landscaping-Decorations/dp/B0CHR9HH2D/ref=sr_1_34?keywords=outdoor&qid=1703020517&sr=8-34',55,'2023-12-19 15:15:18.707685-06','2023-12-19 15:15:18.707685-06','www.amazon.com'), + (4305,'All-New Blink Outdoor 4 Floodlight Camera – Wire-free smart security camera, 700 lumens, two-year battery life, HD live view, enhanced motion detection, Works with Alexa- 1 camera system',NULL,'B0BBX45V5B','https://m.media-amazon.com/images/I/41B0SP8h2nL._AC_UL320_.jpg',324,4.3,'$95.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/All-New-Blink-Outdoor-Floodlight-Camera/dp/B0BBX45V5B/ref=sr_1_35?keywords=outdoor&qid=1703020517&sr=8-35',55,'2023-12-19 15:15:18.714276-06','2023-12-19 15:15:18.714276-06','www.amazon.com'), + (4306,'Devoko',NULL,'B09N3JFSR4','https://m.media-amazon.com/images/I/81UMJ-Dn-XL._AC_UL320_.jpg',1930,4.3,'$89.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Devoko-Waterproof-Lockable-Container-Furniture/dp/B09N3JFSR4/ref=sr_1_36?keywords=outdoor&qid=1703020517&sr=8-36',55,'2023-12-19 15:15:18.721502-06','2023-12-19 15:15:18.721502-06','www.amazon.com'), + (4307,'Indoor Outdoor Thermometer Hygrometer Wireless Weather Stations, Temperature Humidity Monitor Battery Powered Inside Outside Thermometer with 330ft Range Remote Sensor and Adjustable Backlight',NULL,'B0CJJKWRFC','https://m.media-amazon.com/images/I/71mHCq1H2SL._AC_UL320_.jpg',67,4.5,'$26.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Thermometer-Hygrometer-Temperature-Adjustable-Backlight/dp/B0CJJKWRFC/ref=sr_1_37?keywords=outdoor&qid=1703020517&sr=8-37',55,'2023-12-19 15:15:18.727361-06','2023-12-19 15:15:18.727361-06','www.amazon.com'), + (4308,'DEWENWILS',NULL,'B0C69HM61K','https://m.media-amazon.com/images/I/81aPLSEUyTL._AC_UL320_.jpg',15388,4.6,'$12.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/DEWENWILS-Christmas-Waterproof-Grounded-Electrical/dp/B0C69HM61K/ref=sr_1_38?keywords=outdoor&qid=1703020517&sr=8-38',55,'2023-12-19 15:15:18.734104-06','2023-12-19 15:15:18.734104-06','www.amazon.com'), + (4309,'Franklin Sports',NULL,'B06XTW1BND','https://m.media-amazon.com/images/I/61ZLEHX1FsL._AC_UL320_.jpg',16773,4.7,'$9.88','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Franklin-Sports-X-40-Pickleballs-Approved/dp/B06XTW1BND/ref=sr_1_39?keywords=outdoor&qid=1703020517&sr=8-39',55,'2023-12-19 15:15:18.740734-06','2023-12-19 15:15:18.740734-06','www.amazon.com'), + (4310,'Kingsyard',NULL,'B0BFDXX8JX','https://m.media-amazon.com/images/I/71-LQi2SZHL._AC_UL320_.jpg',909,4.8,'$9.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Kingsyard-Hummingbird-Feeding-Outdoors-Included/dp/B0BFDXX8JX/ref=sr_1_40?keywords=outdoor&qid=1703020517&sr=8-40',55,'2023-12-19 15:15:18.746261-06','2023-12-19 15:15:18.746261-06','www.amazon.com'), + (4311,'Taylor',NULL,'B000H6E7FG','https://m.media-amazon.com/images/I/71XmpFo8SpL._AC_UL320_.jpg',294,4.4,'$18.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Taylor-Precision-Products-Thermometer-12-Inch/dp/B000H6E7FG/ref=sr_1_41?keywords=outdoor&qid=1703020517&sr=8-41',55,'2023-12-19 15:15:18.752445-06','2023-12-19 15:15:18.752445-06','www.amazon.com'), + (4312,'Govee',NULL,'B0CCYTJR9G','https://m.media-amazon.com/images/I/81y-wQMa2SL._AC_UL320_.jpg',222,4.7,'$89.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Govee-Christmas-Decorations-Waterproof-Lighting/dp/B0CCYTJR9G/ref=sr_1_42?keywords=outdoor&qid=1703020517&sr=8-42',55,'2023-12-19 15:15:18.758906-06','2023-12-19 15:15:18.758906-06','www.amazon.com'), + (4314,'GIGALUMI',NULL,'B0CKPJPZZH','https://m.media-amazon.com/images/I/81CMC2OYCAL._AC_UL320_.jpg',9,4.9,'$31.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/GIGALUMI-Statues-Figurine-Birthday-Decoration/dp/B0CKPJPZZH/ref=sr_1_44?keywords=outdoor&qid=1703020517&sr=8-44',55,'2023-12-19 15:15:18.770925-06','2023-12-19 15:15:18.770925-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4315,'iBirdie',NULL,'B075ZRJ263','https://m.media-amazon.com/images/I/71WMttbXIoL._AC_UL320_.jpg',18895,4.7,'$27.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Outdoor-Waterproof-Weatherproof-Outside-Screen/dp/B075ZRJ263/ref=sr_1_45?keywords=outdoor&qid=1703020517&sr=8-45',55,'2023-12-19 15:15:18.77747-06','2023-12-19 15:15:18.77747-06','www.amazon.com'), + (4316,'That White People',NULL,'B085D7SZ8T','https://m.media-amazon.com/images/I/81kzY73I9-L._AC_UL320_.jpg',81,3.4,'$0.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Outdoors/dp/B085D7SZ8T/ref=sr_1_46?keywords=outdoor&qid=1703020517&sr=8-46',55,'2023-12-19 15:15:18.782897-06','2023-12-19 15:15:18.782897-06','www.amazon.com'), + (4317,'4 Pack BlueX LED A21 Red Green Light Bulbs - 15W (120Watt Equivalent) - E26 Base Red Green LED Red Bulb, Party Decoration, Porch, Home Lighting, Holiday Lighting',NULL,'B0C4C4SL5J','https://m.media-amazon.com/images/I/71r1dgoUOoL._AC_UL320_.jpg',1826,4.4,'$14.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Pack-BlueX-Green-Light-Bulbs/dp/B0C4C4SL5J/ref=sr_1_47?keywords=outdoor&qid=1703020517&sr=8-47',55,'2023-12-19 15:15:18.789846-06','2023-12-19 15:15:18.789846-06','www.amazon.com'), + (4318,'Brightown',NULL,'B0B9WNG2F6','https://m.media-amazon.com/images/I/81s-KNWvOhL._AC_UL320_.jpg',219,4.4,'$79.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Brightown-Firewood-Waterproof-Adjustable-Fireplace/dp/B0B9WNG2F6/ref=sr_1_48?keywords=outdoor&qid=1703020517&sr=8-48',55,'2023-12-19 15:15:18.795917-06','2023-12-19 15:15:18.795917-06','www.amazon.com'), + (4319,'Rolling Grilling Baskets, Grill Baskets for Outdoor Grill, BBQ Grill Baskets, Stainless Steel Grill Accessories for Veggies, Fish, Fries, Shrimp and Chicken (2-PCS)',NULL,'B0CCJYFPHS','https://m.media-amazon.com/images/I/81yWQAsSWaL._AC_UL320_.jpg',25,4.6,'$10.49','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Rolling-Grilling-Baskets-Stainless-Accessories/dp/B0CCJYFPHS/ref=sr_1_49?keywords=outdoor&qid=1703020517&sr=8-49',55,'2023-12-19 15:15:18.80179-06','2023-12-19 15:15:18.80179-06','www.amazon.com'), + (4321,'URAGO',NULL,'B09PYY9436','https://m.media-amazon.com/images/I/81EYZnKuUaL._AC_UL320_.jpg',6018,4.3,'$34.34','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/URAGO-Waterproof-Landscape-Lighting-Decorative/dp/B09PYY9436/ref=sr_1_51?keywords=outdoor&qid=1703020517&sr=8-51',55,'2023-12-19 15:15:18.815684-06','2023-12-19 15:15:18.815684-06','www.amazon.com'), + (4322,'Flemoon',NULL,'B09NLW5HMX','https://m.media-amazon.com/images/I/61fJba15DJL._AC_UL320_.jpg',2302,4.6,'$29.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Flemoon-Electrical-Waterproof-Weatherproof-Decoration/dp/B09NLW5HMX/ref=sr_1_52?keywords=outdoor&qid=1703020517&sr=8-52',55,'2023-12-19 15:15:18.821817-06','2023-12-19 15:15:18.821817-06','www.amazon.com'), + (4323,'Rolling Grill Baskets for Outdoor Grilling : 2 Pcs Stainless Steel Grill Mesh, Rolling Grill Baskets for Outdoor Grill, Portable Grill Nets Cylinder for Shrimp, Meat Barbecue Camping Picnic with Forks',NULL,'B0C9QFQ76F','https://m.media-amazon.com/images/I/811XOCIAO4L._AC_UL320_.jpg',237,4.5,'$27.49','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Rolling-Grill-Baskets-Outdoor-Grilling/dp/B0C9QFQ76F/ref=sr_1_53?keywords=outdoor&qid=1703020517&sr=8-53',55,'2023-12-19 15:15:18.828154-06','2023-12-19 15:15:18.828154-06','www.amazon.com'), + (4324,'Rowing Machine Cover, Fitness Equipment Protective Cover and Oxford Waterproof Fabric are The Ideal Choice for Indoor and Outdoor use(Black)',NULL,'B07SXC32JW','https://m.media-amazon.com/images/I/61FxOffjTqL._AC_UL320_.jpg',286,4.5,'$23.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/International-Equipment-Protective-Waterproof-use%EF%BC%88Black%EF%BC%89/dp/B07SXC32JW/ref=sr_1_54?keywords=outdoor&qid=1703020517&sr=8-54',55,'2023-12-19 15:15:18.833804-06','2023-12-19 15:15:18.833804-06','www.amazon.com'), + (4325,'AcuRite',NULL,'B000A3IMP2','https://m.media-amazon.com/images/I/612kC-gghPL._AC_UL320_.jpg',29249,4.6,'$5.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/AcuRite-00850A2-Capacity-Easy-Read-Magnifying/dp/B000A3IMP2/ref=sr_1_55?keywords=outdoor&qid=1703020517&sr=8-55',55,'2023-12-19 15:15:18.84046-06','2023-12-19 15:15:18.84046-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4327,'WILSON',NULL,'B091MBQYPH','https://m.media-amazon.com/images/I/914I6wrUEiS._AC_UL320_.jpg',3281,4.6,'$35.77','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Wilson-Authentic-Indoor-Outdoor-Basketball/dp/B091MBQYPH/ref=sr_1_57?keywords=outdoor&qid=1703020517&sr=8-57',55,'2023-12-19 15:15:18.853824-06','2023-12-19 15:15:18.853824-06','www.amazon.com'), + (4328,'Outdoor String Lights 48FT, Outdoor Lights Waterproof ETL Listed with 18 Shatterproof Bulbs, Personalized 8 Lighting Modes Remote Control Patio Lights for Patio Decor Porch Balcony Backyard Party',NULL,'B0C33RNZP4','https://m.media-amazon.com/images/I/6172ml0FY3L._AC_UL320_.jpg',167,4.3,'$24.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Waterproof-Shatterproof-Personalized-Lighting-Backyard/dp/B0C33RNZP4/ref=sr_1_58?keywords=outdoor&qid=1703020517&sr=8-58',55,'2023-12-19 15:15:18.860876-06','2023-12-19 15:15:18.860876-06','www.amazon.com'), + (4329,'The HC Companies',NULL,'B08ZQM19C6','https://m.media-amazon.com/images/I/41NUY8c8cAS._AC_UL320_.jpg',8473,4.5,'$1.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/HC-Companies-CNA06000DE1C024LRDGW-planters-Dusty/dp/B08ZQM19C6/ref=sr_1_59?keywords=outdoor&qid=1703020517&sr=8-59',55,'2023-12-19 15:15:18.867229-06','2023-12-19 15:15:18.867229-06','www.amazon.com'), + (4330,'Simple Green',NULL,'B0098QN9SC','https://m.media-amazon.com/images/I/81-q-UfjbOL._AC_UL320_.jpg',9942,4.6,'$12.38','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Simple-Outdoor-Eliminator-Gallon-Refill/dp/B0098QN9SC/ref=sr_1_60?keywords=outdoor&qid=1703020517&sr=8-60',55,'2023-12-19 15:15:18.874829-06','2023-12-19 15:15:18.874829-06','www.amazon.com'), + (4331,'Muse Garden Hummingbird Feeders for Outdoors Hanging, Hummingbird Gifts for Women, Garden Decor Backyard Decor, Blown Glass Hummingbird Feeder, Unique Gardening Gifts for Older Women, 32OZ, Nebula',NULL,'B089D3NJ32','https://aax-us-iad.amazon.com/e/loi/imp?b=JDfnmQTg2xa4OsEdECYayIcAAAGMg-7XrwEAAAH2AQBvbm9fdHhuX2JpZDEgICBvbm9fdHhuX2ltcDEgICAyzaaY',5926,4.7,'$29.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.comhttps://aax-us-iad.amazon.com/x/c/RDfnmQTg2xa4OsEdECYayIcAAAGMg-7XaQEAAAH2AQBvbm9fdHhuX2JpZDEgICBvbm9fdHhuX2ltcDEgICAyzaaY/https://www.amazon.com/Muse-Garden-Hummingbird-Outdoors-Containing/dp/B089D3NJ32/ref=sxbs_sbv_search_btf?content-id=amzn1.sym.e3e25c3f-be9c-4043-8c05-6ebb65e75e4b%3Aamzn1.sym.e3e25c3f-be9c-4043-8c05-6ebb65e75e4b&cv_ct_cx=outdoor&keywords=outdoor&pd_rd_i=B089D3NJ32&pd_rd_r=8dfc5eda-4dd5-4c71-8c35-99b784d61bab&pd_rd_w=chA7V&pd_rd_wg=hjcXq&pf_rd_p=e3e25c3f-be9c-4043-8c05-6ebb65e75e4b&pf_rd_r=B66DG5J15A2HQ95FX630&qid=1703020517&sbo=RZvfv%2F%2FHxDF%2BO5021pAnSA%3D%3D&sr=1-1-a61ee601-6e56-4862-a8a2-1d3da5a5406f',55,'2023-12-19 15:15:18.881652-06','2023-12-19 15:15:18.881652-06','www.amazon.comhttps:'), + (4332,'ALLPOWERS',NULL,'B0CG162ZPY','https://m.media-amazon.com/images/I/61geOSR4FUL._AC_UL320_.jpg',40,4.1,'$1.599','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxNTU2NTIzMzAwNTA1NzE3OjE3MDMwMjA1MjQ6c3BfYXRmX25leHQ6MzAwMDM4ODEzMDA2MjAyOjowOjo&url=%2FALLPOWERS-Generator-Portable-Function-Emergency%2Fdp%2FB0CG162ZPY%2Fref%3Dsr_1_49_sspa%3Fkeywords%3Doutdoor%26qid%3D1703020524%26sr%3D8-49-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGZfbmV4dA%26psc%3D1',55,'2023-12-19 15:15:25.348397-06','2023-12-19 15:15:25.348397-06','www.amazon.com'), + (4333,'Rilyson',NULL,'B0BRKVQCZ5','https://m.media-amazon.com/images/I/71Kx1Dc0CaL._AC_UL320_.jpg',67,4.5,'$1.049','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxNTU2NTIzMzAwNTA1NzE3OjE3MDMwMjA1MjQ6c3BfYXRmX25leHQ6MjAwMTE4MTYyMDcxNjk4OjowOjo&url=%2FRilyson-Wicker-Rocking-Swivel-Chairs%2Fdp%2FB0BRKVQCZ5%2Fref%3Dsr_1_50_sspa%3Fkeywords%3Doutdoor%26qid%3D1703020524%26sr%3D8-50-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGZfbmV4dA%26psc%3D1',55,'2023-12-19 15:15:25.370791-06','2023-12-19 15:15:25.370791-06','www.amazon.com'), + (4334,'yuxiangBBQ',NULL,'B07VY7YBGW','https://m.media-amazon.com/images/I/616pnF7snOL._AC_UL320_.jpg',663,4.3,'$159.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxNTU2NTIzMzAwNTA1NzE3OjE3MDMwMjA1MjQ6c3BfYXRmX25leHQ6MjAwMTAwMDMyNTU1ODk4OjowOjo&url=%2FyuxiangBBQ-Outdoor-Kitchen-Drawers-Stainless%2Fdp%2FB07VY7YBGW%2Fref%3Dsr_1_51_sspa%3Fkeywords%3Doutdoor%26qid%3D1703020524%26sr%3D8-51-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGZfbmV4dA%26psc%3D1',55,'2023-12-19 15:15:25.377876-06','2023-12-19 15:15:25.377876-06','www.amazon.com'), + (4335,'Aoorun',NULL,'B0C2YS8YSB','https://m.media-amazon.com/images/I/81Ztn1rYXTL._AC_UL320_.jpg',5,4.3,'$490.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxNTU2NTIzMzAwNTA1NzE3OjE3MDMwMjA1MjQ6c3BfYXRmX25leHQ6MzAwMTA3MzczNzc0NTAyOjowOjo&url=%2FAoorun-Adirondack-Connecting-Resistant-Backyard-Blue%2Fdp%2FB0C2YS8YSB%2Fref%3Dsr_1_52_sspa%3Fkeywords%3Doutdoor%26qid%3D1703020524%26sr%3D8-52-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGZfbmV4dA%26psc%3D1',55,'2023-12-19 15:15:25.384953-06','2023-12-19 15:15:25.384953-06','www.amazon.com'), + (4336,'WNATN',NULL,'B09CKPKHXN','https://m.media-amazon.com/images/I/81AvU5WU3SL._AC_UL320_.jpg',617,4.7,'$7.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/WNATN-Protection-Thickened-AntiFrozen-Waterproof/dp/B09CKPKHXN/ref=sr_1_53?keywords=outdoor&qid=1703020524&sr=8-53',55,'2023-12-19 15:15:25.394895-06','2023-12-19 15:15:25.394895-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4337,'BALDR',NULL,'B0CJBC4NNX','https://m.media-amazon.com/images/I/71B7rDMDS0L._AC_UL320_.jpg',91,4.4,'$29.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/BALDR-Thermometer-Wireless-Portable-Temperature/dp/B0CJBC4NNX/ref=sr_1_54?keywords=outdoor&qid=1703020524&sr=8-54',55,'2023-12-19 15:15:25.402396-06','2023-12-19 15:15:25.402396-06','www.amazon.com'), + (4338,'2-Pack 120 LED 72FT Solar Lights Outdoor Waterproof, Crystal Globe Lights with 8 Lighting Modes, Solar Powered Patio Lights for Garden Yard Porch Wedding Party Decor (Warm White)',NULL,'B08YDQVT1K','https://m.media-amazon.com/images/I/818G3cAC0pL._AC_UL320_.jpg',17475,4.3,'$26.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Outdoor-Crystal-Lighting-Waterproof-Powered/dp/B08YDQVT1K/ref=sr_1_55?keywords=outdoor&qid=1703020524&sr=8-55',55,'2023-12-19 15:15:25.409581-06','2023-12-19 15:15:25.409581-06','www.amazon.com'), + (4339,'Outdoor Odor Eliminator for Pets, Dogs, Ideal for Artificial Grass & Patio (32 oz Hose End Sprayer)',NULL,'B017A5GP1U','https://m.media-amazon.com/images/I/81uDkkFA6+L._AC_UL320_.jpg',3511,4.4,'$9.35','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Simple-Outdoor-Eliminator-Sprayer-32-Ounce/dp/B017A5GP1U/ref=sr_1_56?keywords=outdoor&qid=1703020524&sr=8-56',55,'2023-12-19 15:15:25.416015-06','2023-12-19 15:15:25.416015-06','www.amazon.com'), + (4341,'ornesign',NULL,'B0BZR4RBTW','https://m.media-amazon.com/images/I/81qCwUuDn1L._AC_UL320_.jpg',2371,4.6,'$35.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/ornesign-Outdoor-Decorative-10-Waterproof/dp/B0BZR4RBTW/ref=sr_1_58?keywords=outdoor&qid=1703020524&sr=8-58',55,'2023-12-19 15:15:25.432747-06','2023-12-19 15:15:25.432747-06','www.amazon.com'), + (4342,'FMART',NULL,'B09SPB8JVB','https://m.media-amazon.com/images/I/612OPZwKxtL._AC_UL320_.jpg',744,4.1,'$62.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxNTU2NTIzMzAwNTA1NzE3OjE3MDMwMjA1MjQ6c3BfbXRmOjMwMDA5OTIzMTAyMTMwMjo6MDo6&url=%2FFMART-Bluetooth-Landscape-Spotlights-Uplights%2Fdp%2FB09SPB8JVB%2Fref%3Dsr_1_59_sspa%3Fkeywords%3Doutdoor%26qid%3D1703020524%26sr%3D8-59-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',55,'2023-12-19 15:15:25.439922-06','2023-12-19 15:15:25.439922-06','www.amazon.com'), + (4343,'HBN',NULL,'B0CDR5MZVH','https://m.media-amazon.com/images/I/61j555GLa0L._AC_UL320_.jpg',20,4.4,'$13.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/HBN-Waterproof-Protective-Electrical-Decoration/dp/B0CDR5MZVH/ref=sr_1_60?keywords=outdoor&qid=1703020524&sr=8-60',55,'2023-12-19 15:15:25.446268-06','2023-12-19 15:15:25.446268-06','www.amazon.com'), + (4344,'ruhotili',NULL,'B0BRQC2QW7','https://m.media-amazon.com/images/I/81vPfUc+CeL._AC_UL320_.jpg',1611,4.3,'$27.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/ruhotili-Outdoor-Waterproof-Driveway-Decoration/dp/B0BRQC2QW7/ref=sr_1_62?keywords=outdoor&qid=1703020524&sr=8-62',55,'2023-12-19 15:15:25.45334-06','2023-12-19 15:15:25.45334-06','www.amazon.com'), + (4345,'Keter',NULL,'B09DTJPPG8','https://m.media-amazon.com/images/I/51lPLX0IdwL._AC_UL320_.jpg',1876,4.5,'$37.24','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Keter-City-Gallon-Resin-Accessories/dp/B09DTJPPG8/ref=sr_1_63?keywords=outdoor&qid=1703020524&sr=8-63',55,'2023-12-19 15:15:25.459494-06','2023-12-19 15:15:25.459494-06','www.amazon.com'), + (4346,'AmeriTop',NULL,'B0C8W73KQB','https://m.media-amazon.com/images/I/81fTdLCfnRL._AC_UL320_.jpg',3147,4.4,'$39.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxNTU2NTIzMzAwNTA1NzE3OjE3MDMwMjA1MjQ6c3BfbXRmOjMwMDA2MjM2OTg0NzIwMjo6MDo6&url=%2FAmeriTop-Cordless-Adjustable-Illumination-Waterproof%2Fdp%2FB0C8W73KQB%2Fref%3Dsr_1_65_sspa%3Fkeywords%3Doutdoor%26qid%3D1703020524%26sr%3D8-65-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',55,'2023-12-19 15:15:25.466119-06','2023-12-19 15:15:25.466119-06','www.amazon.com'), + (4347,'Brightech',NULL,'B075NS8YXG','https://m.media-amazon.com/images/I/71VOmyQRn0L._AC_UL320_.jpg',29110,4.5,'$31.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxNTU2NTIzMzAwNTA1NzE3OjE3MDMwMjA1MjQ6c3BfbXRmOjIwMDEyOTAyMTEyNDA5ODo6MDo6&url=%2FBrightech-Ambience-Pro-Waterproof-Outdoor%2Fdp%2FB075NS8YXG%2Fref%3Dsr_1_66_sspa%3Fkeywords%3Doutdoor%26qid%3D1703020524%26sr%3D8-66-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',55,'2023-12-19 15:15:25.472796-06','2023-12-19 15:15:25.472796-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4348,'Kasa Outdoor Smart Plug, Smart Home Wi-Fi Outlet with 2 Sockets, IP64 Weather Resistance, Compatible with Alexa, Google Home & IFTTT, No Hub Required, ETL Certified(EP40), Black',NULL,'B091FXH2FR','https://m.media-amazon.com/images/I/61soGaMHzrL._AC_UL320_.jpg',13536,4.6,'$15.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Kasa-Smart-Resistance-Compatible-EP40/dp/B091FXH2FR/ref=sr_1_68?keywords=outdoor&qid=1703020524&sr=8-68',55,'2023-12-19 15:15:25.483499-06','2023-12-19 15:15:25.483499-06','www.amazon.com'), + (4349,'Outdoor Faucet Cover for Winter - Pro 7.1"W x 9.8"H - 2 Pack Outdoor Water Faucet Cover Socks for Winter Freeze Protection Pipe Insulation Reusable Waterproof Insulated Spigot backflow Cover',NULL,'B0CDG6PLBS','https://m.media-amazon.com/images/I/710EFe6VrEL._AC_UL320_.jpg',98,4.6,'$5.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Outdoor-Faucet-Cover-Winter-Protection/dp/B0CDG6PLBS/ref=sr_1_69?keywords=outdoor&qid=1703020524&sr=8-69',55,'2023-12-19 15:15:25.489328-06','2023-12-19 15:15:25.489328-06','www.amazon.com'), + (4350,'Solar Lights for Outside 4 Pack, New Upgraded Solar Garden Lights, Solar Lights Outdoor Waterproof for Garden Decor, Outdoor Solar Lights for Patio Yard Decor, Firefly Garden Lights Solar, Warm White',NULL,'B0BHQV57NL','https://m.media-amazon.com/images/I/81ukgwJ-PoL._AC_UL320_.jpg',1431,4.3,'$29.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Outdoor-Waterproof-Swaying-Decorative-Fireflies/dp/B0BHQV57NL/ref=sr_1_70?keywords=outdoor&qid=1703020524&sr=8-70',55,'2023-12-19 15:15:25.496289-06','2023-12-19 15:15:25.496289-06','www.amazon.com'), + (4351,'GOOTOP',NULL,'B09PQF39PG','https://m.media-amazon.com/images/I/81daTy3zofL._AC_UL320_.jpg',13724,4.4,'$39.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/GOOTOP-Mosquito-Zapper-Outdoor-Electric/dp/B09PQF39PG/ref=sr_1_71?keywords=outdoor&qid=1703020524&sr=8-71',55,'2023-12-19 15:15:25.502231-06','2023-12-19 15:15:25.502231-06','www.amazon.com'), + (4352,'Glintoper',NULL,'B09PDY15ZD','https://m.media-amazon.com/images/I/91W9c3wn+XL._AC_UL320_.jpg',500,4.5,'$39.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxNTU2NTIzMzAwNTA1NzE3OjE3MDMwMjA1MjQ6c3BfbXRmOjIwMDA0MTkwODY5MTc5ODo6MDo6&url=%2FGlintoper-Watering-Waterfall-Figurine-Decorative%2Fdp%2FB09PDY15ZD%2Fref%3Dsr_1_72_sspa%3Fkeywords%3Doutdoor%26qid%3D1703020524%26sr%3D8-72-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',55,'2023-12-19 15:15:25.511936-06','2023-12-19 15:15:25.511936-06','www.amazon.com'), + (4353,'Anmeix',NULL,'B0CCP46B9T','https://m.media-amazon.com/images/I/61qVhOLtEKL._AC_UL320_.jpg',100,4.8,'$25.44','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxNTU2NTIzMzAwNTA1NzE3OjE3MDMwMjA1MjQ6c3BfbXRmOjMwMDA0NzUzNTA3MzQwMjo6MDo6&url=%2FAnmeix-Christmas-Flickering-Flame%25EF%25BC%258CWaterproof-Landscape%2Fdp%2FB0CCP46B9T%2Fref%3Dsr_1_73_sspa%3Fkeywords%3Doutdoor%26qid%3D1703020524%26sr%3D8-73-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',55,'2023-12-19 15:15:25.518911-06','2023-12-19 15:15:25.518911-06','www.amazon.com'), + (4354,'Eurmax',NULL,'B07XG4M12N','https://m.media-amazon.com/images/I/51mU5ebCqKL._AC_UL320_.jpg',4478,4.5,'$324.86','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MToxNTU2NTIzMzAwNTA1NzE3OjE3MDMwMjA1MjQ6c3BfbXRmOjIwMDEyNzc4MDY2NzA5ODo6MDo6&url=%2FEurmax-Commercial-Instant-Canopies-Weights%2Fdp%2FB07XG4M12N%2Fref%3Dsr_1_74_sspa%3Fkeywords%3Doutdoor%26qid%3D1703020524%26sr%3D8-74-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',55,'2023-12-19 15:15:25.525518-06','2023-12-19 15:15:25.525518-06','www.amazon.com'), + (4355,'Spalding',NULL,'B08QJLH54P','https://m.media-amazon.com/images/I/7187crn3osS._AC_UL320_.jpg',12535,4.6,'$22.70','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Spalding-Street-Outdoor-Basketball-27-5/dp/B08QJLH54P/ref=sr_1_75?keywords=outdoor&qid=1703020524&sr=8-75',55,'2023-12-19 15:15:25.532228-06','2023-12-19 15:15:25.532228-06','www.amazon.com'), + (4356,'Keter',NULL,'B07RZM9332','https://m.media-amazon.com/images/I/51yp2BksC+L._AC_UL320_.jpg',2386,4.2,'$69.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Keter-243531-Marvel-Gallon-Weather/dp/B07RZM9332/ref=sr_1_76?keywords=outdoor&qid=1703020524&sr=8-76',55,'2023-12-19 15:15:25.538498-06','2023-12-19 15:15:25.538498-06','www.amazon.com'), + (4357,'LESES',NULL,'B0BTCZ96MV','https://m.media-amazon.com/images/I/81EJGK4-X3L._AC_UL320_.jpg',174,4.4,'$14.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/LESES-Solar-Statue-Turtle-Decorations/dp/B0BTCZ96MV/ref=sr_1_77?keywords=outdoor&qid=1703020524&sr=8-77',55,'2023-12-19 15:15:25.544338-06','2023-12-19 15:15:25.544338-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4358,'USA Toyz',NULL,'B0CG7RDFDB','https://m.media-amazon.com/images/I/81mDQa1BS5L._AC_UL320_.jpg',1241,4.5,'$15.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/USA-Toyz-Stealth-Ultimate-Waterproof/dp/B0CG7RDFDB/ref=sr_1_79?keywords=outdoor&qid=1703020524&sr=8-79',55,'2023-12-19 15:15:25.550621-06','2023-12-19 15:15:25.550621-06','www.amazon.com'), + (4374,'Mini Lustrous',NULL,'B07DSLTJTY','https://m.media-amazon.com/images/I/31MA73Q2Z6L._AC_UL320_.jpg',277,4.4,'$23.80','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Elliptical-Protective-Dust-proof-Waterproof-Water-Resistant/dp/B07DSLTJTY/ref=sr_1_96?keywords=outdoor&qid=1703020524&sr=8-96',55,'2023-12-19 15:15:25.644936-06','2023-12-19 15:15:25.644936-06','www.amazon.com'), + (4359,'Outdoor Faucet Cover for Winter - Pro 7.1"W x 10.6"H Outdoor Water Faucet Cover Socks for Winter Freeze Protection Pipe Insulation Reusable Waterproof Insulated Spigot backflow Cover,Black (2)',NULL,'B0B7RJXZX1','https://m.media-amazon.com/images/I/71mK7cr3CmL._AC_UL320_.jpg',1223,4.6,'$7.97','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Hometopia-Outdoor-Faucet-Cover-Winter/dp/B0B7RJXZX1/ref=sr_1_80?keywords=outdoor&qid=1703020524&sr=8-80',55,'2023-12-19 15:15:25.556815-06','2023-12-19 15:15:25.556815-06','www.amazon.com'), + (4360,'Waterproof Electrical Box, Diivoo Outdoor Extension Cord Covers Waterproof, Large Size 6 Cable Seal Entry, IP54 Protect Power Strip, Timer Outlet Plug, Holiday Light Decoration, Black',NULL,'B0CJRQ6JBL','https://m.media-amazon.com/images/I/71dTMdpVFaL._AC_UL320_.jpg',430,4.4,'$18.89','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Waterproof-Electrical-Diivoo-Extension-Decoration/dp/B0CJRQ6JBL/ref=sr_1_81?keywords=outdoor&qid=1703020524&sr=8-81',55,'2023-12-19 15:15:25.56247-06','2023-12-19 15:15:25.56247-06','www.amazon.com'), + (4361,'4 Pack BlueX LED Par38 Flood Red Green Light Bulb - 18W (120Watt Equivalent) - Dimmable - E26 Base Red Green LED Lights, Party Decoration, Porch, Holiday Lighting, Red Flood Light',NULL,'B0C4C8XQWL','https://m.media-amazon.com/images/I/71tH8kAtT+L._AC_UL320_.jpg',3911,4.5,'$34.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/BlueX-Par38-Flood-Green-Light/dp/B0C4C8XQWL/ref=sr_1_82?keywords=outdoor&qid=1703020524&sr=8-82',55,'2023-12-19 15:15:25.568482-06','2023-12-19 15:15:25.568482-06','www.amazon.com'), + (4362,'Zigzagger',NULL,'B07MX96LVD','https://m.media-amazon.com/images/I/71KL3RR00IL._AC_UL320_.jpg',27593,4.4,'$20.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Zigzagger-Stitch-Slippers-Outdoor-Nonslip/dp/B07MX96LVD/ref=sr_1_83?keywords=outdoor&qid=1703020524&sr=8-83',55,'2023-12-19 15:15:25.574545-06','2023-12-19 15:15:25.574545-06','www.amazon.com'), + (4363,'Keter',NULL,'B007O1CAZQ','https://m.media-amazon.com/images/I/815wTtv7U0L._AC_UL320_.jpg',21725,4.7,'$82.84','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Keter-Pacific-Cool-Bar-Furniture/dp/B007O1CAZQ/ref=sr_1_84?keywords=outdoor&qid=1703020524&sr=8-84',55,'2023-12-19 15:15:25.580228-06','2023-12-19 15:15:25.580228-06','www.amazon.com'), + (4364,'Outdoor Christmas Pvc Inflatable Decorated Ball Red 24 Inch Giant Ball for Decorated Ball Ornaments Giant Christmas Blow Up Jumbo Ball Xmas Blow Outdoor Outside Holiday Yard Lawn Decor(Merry Chrismas)',NULL,'B0CND525W9','https://m.media-amazon.com/images/I/71GrJOkAaXL._AC_UL320_.jpg',22,1.5,'$34.39','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Christmas-Pvc-Inflatable-Decorated-Ornaments/dp/B0CND525W9/ref=sr_1_85?keywords=outdoor&qid=1703020524&sr=8-85',55,'2023-12-19 15:15:25.58536-06','2023-12-19 15:15:25.58536-06','www.amazon.com'), + (4365,'FunforFun!',NULL,'B0C1C8579L','https://m.media-amazon.com/images/I/71-j-hzgJLL._AC_UL320_.jpg',69,4.4,'$7.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/FunforFun-Unicorn-Launcher-Outdoor-Birthday/dp/B0C1C8579L/ref=sr_1_86?keywords=outdoor&qid=1703020524&sr=8-86',55,'2023-12-19 15:15:25.590829-06','2023-12-19 15:15:25.590829-06','www.amazon.com'), + (4366,'OUTOGO',NULL,'B0C1RR3L1M','https://m.media-amazon.com/images/I/61cpuUAXPrL._AC_UL320_.jpg',33,4.1,'$9.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/OUTOGO-Elephant-Launcher-Christmas-Birthday/dp/B0C1RR3L1M/ref=sr_1_87?keywords=outdoor&qid=1703020524&sr=8-87',55,'2023-12-19 15:15:25.596875-06','2023-12-19 15:15:25.596875-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4367,'PETDOTT',NULL,'B0B5SX7GHM','https://m.media-amazon.com/images/I/71F8AORHJIL._AC_UL320_.jpg',115,4.6,'$17.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/PETDOTT-Heating-Electric-Temperature-Pregnant/dp/B0B5SX7GHM/ref=sr_1_88?keywords=outdoor&qid=1703020524&sr=8-88',55,'2023-12-19 15:15:25.602158-06','2023-12-19 15:15:25.602158-06','www.amazon.com'), + (4368,'OUTDOOR EDGE',NULL,'B0BXK4ZVW3','https://m.media-amazon.com/images/I/61UdaVb8ctL._AC_UL320_.jpg',41,4.7,'$11.49','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/OUTDOOR-EDGE-Drop-Point-Blades-Compatibility/dp/B0BXK4ZVW3/ref=sr_1_89?keywords=outdoor&qid=1703020524&sr=8-89',55,'2023-12-19 15:15:25.608501-06','2023-12-19 15:15:25.608501-06','www.amazon.com'), + (4369,'GasOne',NULL,'B0B5BC3CC4','https://m.media-amazon.com/images/I/61gIY2BDSkL._AC_UL320_.jpg',362,4.6,'$45.41','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/GasOne-B-5200K-Outdoor-Pressure-Braided/dp/B0B5BC3CC4/ref=sr_1_90?keywords=outdoor&qid=1703020524&sr=8-90',55,'2023-12-19 15:15:25.614948-06','2023-12-19 15:15:25.614948-06','www.amazon.com'), + (4370,'Ring',NULL,'B0C5QSN9YB','https://m.media-amazon.com/images/I/21fAw4hLYNL._AC_UL320_.jpg',62082,4.7,'$69.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Ring-Battery-security-privacy-controls/dp/B0C5QSN9YB/ref=sr_1_91?keywords=outdoor&qid=1703020524&sr=8-91',55,'2023-12-19 15:15:25.621165-06','2023-12-19 15:15:25.621165-06','www.amazon.com'), + (4371,'Master Lock',NULL,'B0BJ135VH1','https://m.media-amazon.com/images/I/51USWDszKFL._AC_UL320_.jpg',7105,4.5,'$31.63','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Master-Lock-Combination-Weatherproof-M175LFEC2/dp/B0BJ135VH1/ref=sr_1_92?keywords=outdoor&qid=1703020524&sr=8-92',55,'2023-12-19 15:15:25.626767-06','2023-12-19 15:15:25.626767-06','www.amazon.com'), + (4372,'Weather Station Wireless Indoor Outdoor Thermometer, Color Display Digital Thermometer Humidity Monitor with Atomic Clock, Forecast Station with Calendar and Adjustable Backlight for Home',NULL,'B0CN2RH2N4','https://m.media-amazon.com/images/I/71QQTaogsFL._AC_UL320_.jpg',60,5.0,'$39.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Wireless-Thermometer-Humidity-Adjustable-Backlight/dp/B0CN2RH2N4/ref=sr_1_93?keywords=outdoor&qid=1703020524&sr=8-93',55,'2023-12-19 15:15:25.633539-06','2023-12-19 15:15:25.633539-06','www.amazon.com'), + (4373,'Bedsure',NULL,'B07PVFQXTV','https://m.media-amazon.com/images/I/71R9jIdpbqL._AC_UL320_.jpg',20285,4.5,'$34.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Bedsure-Large-Elevated-Outdoor-Skid-Resistant/dp/B07PVFQXTV/ref=sr_1_95?keywords=outdoor&qid=1703020524&sr=8-95',55,'2023-12-19 15:15:25.639507-06','2023-12-19 15:15:25.639507-06','www.amazon.com'), + (4375,'JACKYLED',NULL,'B0CJC5G5KS','https://m.media-amazon.com/images/I/81e1x-N6IwL._AC_UL320_.jpg',23,4.3,'$59.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/JACKYLED-Spotlights-Adjustable-Waterproof-Extendable/dp/B0CJC5G5KS/ref=sr_1_97?keywords=outdoor&qid=1703020524&sr=8-97',55,'2023-12-19 15:15:25.651327-06','2023-12-19 15:15:25.651327-06','www.amazon.com'), + (4376,'BN-LINK',NULL,'B09K4K25KF','https://m.media-amazon.com/images/I/61xxUi9VGxL._AC_UL320_.jpg',1105,4.5,'$9.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/BN-LINK-Mechanical-Protective-Waterproof-Dustproof/dp/B09K4K25KF/ref=sr_1_98?keywords=outdoor&qid=1703020524&sr=8-98',55,'2023-12-19 15:15:25.656936-06','2023-12-19 15:15:25.656936-06','www.amazon.com'), + (4377,'DAYBETTER',NULL,'B07JN28KP3','https://m.media-amazon.com/images/I/81nn1+0h6FL._AC_UL320_.jpg',41827,4.4,'$17.59','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/DAYBETTER-Waterproof-Flexible-Changing-Controller/dp/B07JN28KP3/ref=sr_1_99?keywords=outdoor&qid=1703020524&sr=8-99',55,'2023-12-19 15:15:25.662484-06','2023-12-19 15:15:25.662484-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4378,'HBN',NULL,'B0CJ4GWBZV','https://m.media-amazon.com/images/I/71D3AO4O0HL._AC_UL320_.jpg',44,4.4,'$11.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/HBN-Waterproof-Weatherproof-Photocell-Lights%EF%BC%8C1875W/dp/B0CJ4GWBZV/ref=sr_1_100?keywords=outdoor&qid=1703020524&sr=8-100',55,'2023-12-19 15:15:25.66795-06','2023-12-19 15:15:25.66795-06','www.amazon.com'), + (4379,'daphino',NULL,'B0CFQDMMHG','https://m.media-amazon.com/images/I/71MlD05oyRL._AC_UL320_.jpg',2128,4.8,'$19.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/daphino-Adjustable-355%C2%B0Wide-Waterproof-Security/dp/B0CFQDMMHG/ref=sr_1_101?keywords=outdoor&qid=1703020524&sr=8-101',55,'2023-12-19 15:15:25.677655-06','2023-12-19 15:15:25.677655-06','www.amazon.com'), + (4326,'The Great Outdoors [Blu-ray]',NULL,'6301179552','https://m.media-amazon.com/images/I/81dtUNoGrJL._AC_UL320_.jpg',14029,4.8,'$9.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Great-Outdoors-VHS-Dan-Aykroyd/dp/6301179552/ref=sr_1_56?keywords=outdoor&qid=1703020517&sr=8-56',55,'2023-12-19 15:15:18.847533-06','2023-12-19 15:15:25.683484-06','www.amazon.com'), + (4380,'Lighted Christmas Window Lights Decorations, 5pcs Battery Powered Christmas Window Hanging Dwarf Reindeer Angel Star Green Monster Shaped with Suction Cup for Xmas Tree Window Indoor Outdoor Decor',NULL,'B0CCJDMNR7','https://m.media-amazon.com/images/I/81xl8rp47yL._AC_UL320_.jpg',910,4.4,'$8.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Lighted-Christmas-Decorations-Battery-Reindeer/dp/B0CCJDMNR7/ref=sr_1_103?keywords=outdoor&qid=1703020524&sr=8-103',55,'2023-12-19 15:15:25.689363-06','2023-12-19 15:15:25.689363-06','www.amazon.com'), + (4381,'Raymate',NULL,'B0CPJ1VHXY','https://m.media-amazon.com/images/I/71G0o6lUMIL._AC_UL320_.jpg',303,4.7,'$19.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Raymate-Bluetooth-Speakers-Waterproof-Bluetooth-V5-0/dp/B0CPJ1VHXY/ref=sr_1_105?keywords=outdoor&qid=1703020524&sr=8-105',55,'2023-12-19 15:15:25.694956-06','2023-12-19 15:15:25.694956-06','www.amazon.com'), + (4382,'WYZE',NULL,'B0BWT19S5C','https://m.media-amazon.com/images/I/61Rq1zAqncL._AC_UL320_.jpg',436,4.4,'$39.96','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/WYZE-Spotlight-Detection-Compatible-Assistant/dp/B0BWT19S5C/ref=sr_1_106?keywords=outdoor&qid=1703020524&sr=8-106',55,'2023-12-19 15:15:25.700449-06','2023-12-19 15:15:25.700449-06','www.amazon.com'), + (4383,'Ninja',NULL,'B0C6BQVDX3','https://m.media-amazon.com/images/I/815UmCN6zUL._AC_UL320_.jpg',157,4.5,'$284.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Ninja-Woodfire-Technology-terracotta-OO101/dp/B0C6BQVDX3/ref=sr_1_107?keywords=outdoor&qid=1703020524&sr=8-107',55,'2023-12-19 15:15:25.70659-06','2023-12-19 15:15:25.70659-06','www.amazon.com'), + (4384,'echosari',NULL,'B0CKM8ZNNB','https://m.media-amazon.com/images/I/81ADmyHHBSL._AC_UL320_.jpg',2440,4.3,'$26.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/echosari-Christmas-Changing-Multicolor-Connectable/dp/B0CKM8ZNNB/ref=sr_1_108?keywords=outdoor&qid=1703020524&sr=8-108',55,'2023-12-19 15:15:25.712906-06','2023-12-19 15:15:25.712906-06','www.amazon.com'), + (4385,'Consciot Solar Spot Lights Outdoor, 54 LEDs Solar Lights Christmas Decorations, 7 Multicolor Changing, Solar Lights Outdoor Waterproof IP67, Solar Spotlight for Yard Garden Landscape, 2 Pack',NULL,'B0BVZGBT4X','https://aax-us-iad.amazon.com/e/loi/imp?b=JHUvUavOp5dGFJFP51BixAsAAAGMg-7zigEAAAH2AQBvbm9fdHhuX2JpZDMgICBvbm9fdHhuX2ltcDEgICDFsgEc',349,4.3,'$32.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.comhttps://aax-us-iad.amazon.com/x/c/RHUvUavOp5dGFJFP51BixAsAAAGMg-7zLQEAAAH2AQBvbm9fdHhuX2JpZDMgICBvbm9fdHhuX2ltcDEgICDFsgEc/https://www.amazon.com/Consciot-Multicolor-Waterproof-Spotlight-Landscape/dp/B0BVZGBT4X/ref=sxbs_sbv_search_btf?content-id=amzn1.sym.2066ba78-527e-4aed-9de4-3ba096deb87b%3Aamzn1.sym.2066ba78-527e-4aed-9de4-3ba096deb87b&cv_ct_cx=outdoor&keywords=outdoor&pd_rd_i=B0BVZGBT4X&pd_rd_r=2b449d50-76b1-42b7-93cc-5ab2be5db958&pd_rd_w=gtTM8&pd_rd_wg=gWVHM&pf_rd_p=2066ba78-527e-4aed-9de4-3ba096deb87b&pf_rd_r=TD4T3X7DEG6TQ56A9MNT&qid=1703020524&sbo=RZvfv%2F%2FHxDF%2BO5021pAnSA%3D%3D&sr=1-49-48f7baba-8e26-45f3-8811-e1a601ad20bf',55,'2023-12-19 15:15:25.718879-06','2023-12-19 15:15:25.718879-06','www.amazon.comhttps:'), + (4593,'Flat Plug Extension Cord, 5ft Power Strip with 4 USB Ports(2 USB C), 4 Widely Outlets Extender, Wall Mount, Desk Charging Station for Office, School, Travel and Dorm Room Essentials, White, ETL Listed',NULL,'B0C5HT9LMP','https://m.media-amazon.com/images/I/518tiMuntLL._AC_UL320_.jpg',284,4.7,'$16.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Extension-Outlets-Extender-Charging-Essentials/dp/B0C5HT9LMP/ref=sr_1_105?keywords=travel+accessories&qid=1703020686&sr=8-105',57,'2023-12-19 15:18:08.143239-06','2023-12-19 15:18:08.143239-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4387,'Spy x Family, Vol. 1 (1)',NULL,'6258237207','https://m.media-amazon.com/images/I/71vMGRog+iL._AC_UL320_.jpg',9685,4.9,'$7.28','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Spy-x-Family-Tatsuya-Endo/dp/6258237207/ref=sr_1_2?keywords=manga&qid=1703020665&sr=8-2',56,'2023-12-19 15:17:45.963614-06','2023-12-19 15:17:45.963614-06','www.amazon.com'), + (4388,'Chainsaw Man Box Set: Includes volumes 1-11',NULL,'1974741427','https://m.media-amazon.com/images/I/81u8igOscKL._AC_UL320_.jpg',284,4.6,'$59.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Chainsaw-Man-Box-Set-volumes/dp/1974741427/ref=sr_1_3?keywords=manga&qid=1703020665&sr=8-3',56,'2023-12-19 15:17:45.969849-06','2023-12-19 15:17:45.969849-06','www.amazon.com'), + (4389,'Attack on Titan Season 1 Part 1 Manga Box Set (Attack on Titan Manga Box Sets)',NULL,'1632366991','https://m.media-amazon.com/images/I/91VlIW1pn8L._AC_UL320_.jpg',5121,4.8,'$30.96','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Attack-Titan-Season-Part-Manga/dp/1632366991/ref=sr_1_4?keywords=manga&qid=1703020665&sr=8-4',56,'2023-12-19 15:17:45.975756-06','2023-12-19 15:17:45.975756-06','www.amazon.com'), + (4594,'Wireless Charger 3 in 1,RTOPS Magnetic Travel Wireless Charging Station Multiple Devices,GaN 3 in 1 Charging Station,Compatible for iPhone15/14/13/12/Pro/Max,iWatch,AirPods 3/2/Pro(Adapter Includes)',NULL,'B09MS72VJ2','https://m.media-amazon.com/images/I/51NtxFOhS0L._AC_UL320_.jpg',3303,4.4,'$39.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Wireless-Magnetic-Foldable-Charging-Compatible/dp/B09MS72VJ2/ref=sr_1_106?keywords=travel+accessories&qid=1703020686&sr=8-106',57,'2023-12-19 15:18:08.148906-06','2023-12-19 15:18:08.148906-06','www.amazon.com'), + (4390,'My Hero Academia, Vol. 1 (1)',NULL,'B012EM80FS','https://m.media-amazon.com/images/I/81AjnD8nvHL._AC_UL320_.jpg',15664,4.8,'$5.68','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/My-Hero-Academia-Vol-Midoriya-ebook/dp/B012EM80FS/ref=sr_1_5?keywords=manga&qid=1703020665&sr=8-5',56,'2023-12-19 15:17:45.988764-06','2023-12-19 15:17:45.988764-06','www.amazon.com'), + (4391,'A Silent Voice Complete Series Box Set',NULL,'1632366436','https://m.media-amazon.com/images/I/81ieKoIzq7L._AC_UL320_.jpg',4379,4.9,'$59.84','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Silent-Voice-Complete-Box-Set/dp/1632366436/ref=sr_1_6?keywords=manga&qid=1703020665&sr=8-6',56,'2023-12-19 15:17:45.994219-06','2023-12-19 15:17:45.994219-06','www.amazon.com'), + (4392,'Solo Leveling, Vol. 1 (comic) (Solo Leveling (manga), 1)',NULL,'B08FVLVXX6','https://m.media-amazon.com/images/I/71BFjpc84NL._AC_UL320_.jpg',5298,4.8,'$9.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Solo-Leveling-Vol-1-Chugong-ebook/dp/B08FVLVXX6/ref=sr_1_7?keywords=manga&qid=1703020665&sr=8-7',56,'2023-12-19 15:17:46.000231-06','2023-12-19 15:17:46.000231-06','www.amazon.com'), + (4393,'Berserk Deluxe Volume 1',NULL,'1506711987','https://m.media-amazon.com/images/I/91eRoWSACCL._AC_UL320_.jpg',15118,4.9,'$28.49','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Berserk-Deluxe-1-Kentaro-Miura/dp/1506711987/ref=sr_1_8?keywords=manga&qid=1703020665&sr=8-8',56,'2023-12-19 15:17:46.006758-06','2023-12-19 15:17:46.006758-06','www.amazon.com'), + (4394,'Disney Twisted-Wonderland, Vol. 1: The Manga: Book of Heartslabyul (1)',NULL,'B0C7DMP6JG','https://m.media-amazon.com/images/I/71GWNNslN2L._AC_UL320_.jpg',248,4.8,'$10.10','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Disney-Twisted-Wonderland-Vol-Manga-Heartslabyul-ebook/dp/B0C7DMP6JG/ref=sr_1_9?keywords=manga&qid=1703020665&sr=8-9',56,'2023-12-19 15:17:46.01332-06','2023-12-19 15:17:46.01332-06','www.amazon.com'), + (4395,'Chainsaw Man, Vol. 13 (13)',NULL,'B0BV1B2PW4','https://m.media-amazon.com/images/I/81WO4SsaNzL._AC_UL320_.jpg',78,4.5,'$9.58','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Chainsaw-Man-Vol-Tatsuki-Fujimoto-ebook/dp/B0BV1B2PW4/ref=sr_1_10?keywords=manga&qid=1703020665&sr=8-10',56,'2023-12-19 15:17:46.019554-06','2023-12-19 15:17:46.019554-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4396,'Death Note (All-in-One Edition)',NULL,'1421597713','https://m.media-amazon.com/images/I/71sBVJBC3+L._AC_UL320_.jpg',6253,4.8,'$33.32','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Death-Note-All-One-Tsugumi/dp/1421597713/ref=sr_1_11?keywords=manga&qid=1703020665&sr=8-11',56,'2023-12-19 15:17:46.025257-06','2023-12-19 15:17:46.025257-06','www.amazon.com'), + (4397,'Goodbye, Eri',NULL,'8467960728','https://m.media-amazon.com/images/I/71fgXFnzayL._AC_UL320_.jpg',746,4.8,'$11.87','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/GOODBYE-ERI-ED-KANZENBAN-CAT/dp/8467960728/ref=sr_1_12?keywords=manga&qid=1703020665&sr=8-12',56,'2023-12-19 15:17:46.03181-06','2023-12-19 15:17:46.03181-06','www.amazon.com'), + (4398,'Attack on Titan 1',NULL,'0606371095','https://m.media-amazon.com/images/I/71S8O-3xLVL._AC_UL320_.jpg',8893,4.8,'$7.67','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Attack-Turtleback-School-Library-Binding/dp/0606371095/ref=sr_1_13?keywords=manga&qid=1703020665&sr=8-13',56,'2023-12-19 15:17:46.037924-06','2023-12-19 15:17:46.037924-06','www.amazon.com'), + (4399,'[Oshi No Ko], Vol. 1 (Volume 1) ([Oshi No Ko], 1)',NULL,'B0B9PSDCF7','https://m.media-amazon.com/images/I/81gs7bNAyvL._AC_UL320_.jpg',695,4.8,'$7.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Oshi-No-Ko-Vol-ebook/dp/B0B9PSDCF7/ref=sr_1_14?keywords=manga&qid=1703020665&sr=8-14',56,'2023-12-19 15:17:46.043935-06','2023-12-19 15:17:46.043935-06','www.amazon.com'), + (4400,'Black Clover, Vol. 1 (1)',NULL,'B01DVAQSCO','https://m.media-amazon.com/images/I/81zc+lxiNwL._AC_UL320_.jpg',2663,4.8,'$8.50','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Black-Clover-Vol-Boys-Vow-ebook/dp/B01DVAQSCO/ref=sr_1_15?keywords=manga&qid=1703020665&sr=8-15',56,'2023-12-19 15:17:46.050612-06','2023-12-19 15:17:46.050612-06','www.amazon.com'), + (4401,'Undead Unluck, Vol. 1 (1)',NULL,'B0936GBZGX','https://m.media-amazon.com/images/I/81mQnuTHJdL._AC_UL320_.jpg',829,4.8,'$8.50','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Undead-Unluck-Vol-Yoshifumi-Tozuka-ebook/dp/B0936GBZGX/ref=sr_1_16?keywords=manga&qid=1703020665&sr=8-16',56,'2023-12-19 15:17:46.056503-06','2023-12-19 15:17:46.056503-06','www.amazon.com'), + (4402,'Demon Slayer: Kimetsu Academy, Vol. 1 (1)',NULL,'1974740358','https://m.media-amazon.com/images/I/81rzQHAySML._AC_UL320_.jpg',4,5.0,'$9.58','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4MjcyMTQ1NjQ5NjQwNzE3OjE3MDMwMjA2NjU6c3BfbXRmOjMwMDA5ODE2ODE3MDgwMjo6MDo6&url=%2FDemon-Slayer-Kimetsu-Academy-Vol%2Fdp%2F1974740358%2Fref%3Dsr_1_17_sspa%3Fkeywords%3Dmanga%26qid%3D1703020665%26sr%3D8-17-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',56,'2023-12-19 15:17:46.062433-06','2023-12-19 15:17:46.062433-06','www.amazon.com'), + (4403,'A Cheat and a Liar',NULL,'B0BX5V47GF','https://m.media-amazon.com/images/I/71PyQNduggL._AC_UL320_.jpg',1,5.0,'$4.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4MjcyMTQ1NjQ5NjQwNzE3OjE3MDMwMjA2NjU6c3BfbXRmOjMwMDEwMTQ4NDQxMDcwMjo6MDo6&url=%2FCheat-Liar-Bruce-Spurdle-ebook%2Fdp%2FB0BX5V47GF%2Fref%3Dsr_1_18_sspa%3Fkeywords%3Dmanga%26qid%3D1703020665%26sr%3D8-18-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',56,'2023-12-19 15:17:46.068423-06','2023-12-19 15:17:46.068423-06','www.amazon.com'), + (4404,'Mantle Of A God (Chosen by Freya Book 1)',NULL,'B0CFFYM91Z','https://m.media-amazon.com/images/I/91xms-AX5LL._AC_UL320_.jpg',592,4.5,'$0.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4MjcyMTQ1NjQ5NjQwNzE3OjE3MDMwMjA2NjU6c3BfbXRmOjMwMDA0MjA5NDAyOTQwMjo6MDo6&url=%2FMantle-God-Chosen-Freya-Book-ebook%2Fdp%2FB0CFFYM91Z%2Fref%3Dsr_1_19_sspa%3Fkeywords%3Dmanga%26qid%3D1703020665%26sr%3D8-19-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',56,'2023-12-19 15:17:46.074276-06','2023-12-19 15:17:46.074276-06','www.amazon.com'), + (4405,'Jujutsu Kaisen, Vol. 21 (21)',NULL,'B0BTZRYKYM','https://m.media-amazon.com/images/I/81Q-ir0-LTL._AC_UL320_.jpg',84,4.7,'$7.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Jujutsu-Kaisen-Vol-Gege-Akutami-ebook/dp/B0BTZRYKYM/ref=sr_1_20?keywords=manga&qid=1703020665&sr=8-20',56,'2023-12-19 15:17:46.080282-06','2023-12-19 15:17:46.080282-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4406,'Wotakoi: Love Is Hard for Otaku Complete Manga Box Set (Wotakoi Box Set)',NULL,'1646516362','https://m.media-amazon.com/images/I/618O8CTSsnL._AC_UL320_.jpg',182,4.8,'$50.02','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Wotakoi-Love-Otaku-Complete-Manga/dp/1646516362/ref=sr_1_21?keywords=manga&qid=1703020665&sr=8-21',56,'2023-12-19 15:17:46.08733-06','2023-12-19 15:17:46.08733-06','www.amazon.com'), + (4407,'All You Need Is Kill (manga)',NULL,'1421576015','https://m.media-amazon.com/images/I/81nTX5++hSL._AC_UL320_.jpg',1327,4.8,'$13.60','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/All-You-Need-Kill-manga/dp/1421576015/ref=sr_1_22?keywords=manga&qid=1703020665&sr=8-22',56,'2023-12-19 15:17:46.093171-06','2023-12-19 15:17:46.093171-06','www.amazon.com'), + (4408,'Demon Slayer Complete Box Set: Includes volumes 1-23 with premium',NULL,'1974725952','https://m.media-amazon.com/images/I/81+cFDUS1QL._AC_UL320_.jpg',4306,4.9,'$145.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Demon-Slayer-Complete-Box-Set/dp/1974725952/ref=sr_1_23?keywords=manga&qid=1703020665&sr=8-23',56,'2023-12-19 15:17:46.09951-06','2023-12-19 15:17:46.09951-06','www.amazon.com'), + (4409,'TAOYATAO Cthulhu Mythology The Great Book of The Necronomicon Playing Card Board Game Poker Card',NULL,'B0B6HQJH5S','https://m.media-amazon.com/images/I/71xwVeWq3gL._AC_UL320_.jpg',9,3.8,'$13.68','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4MjcyMTQ1NjQ5NjQwNzE3OjE3MDMwMjA2NjU6c3BfbXRmOjIwMDA4NDM5MjM3NDk5ODo6MDo6&url=%2FCthulhu-Mythology-Necronomicon-Playing-Exquisite%2Fdp%2FB0B6HQJH5S%2Fref%3Dsr_1_24_sspa%3Fkeywords%3Dmanga%26qid%3D1703020665%26sr%3D8-24-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',56,'2023-12-19 15:17:46.105333-06','2023-12-19 15:17:46.105333-06','www.amazon.com'), + (4410,'Elegtiskas Detachable Dickey Blouse False Collar Half Shirt Blouse Collar Crop Top',NULL,'B08ZYN7386','https://m.media-amazon.com/images/I/51O6+lO9E7L._AC_UL320_.jpg',915,4.4,'$16.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4MjcyMTQ1NjQ5NjQwNzE3OjE3MDMwMjA2NjU6c3BfbXRmOjIwMDA4MTk1MzIxOTU2MTo6MDo6&url=%2FElegtiskas-Detachable-Dickey-Blouse-Collar%2Fdp%2FB08ZYN7386%2Fref%3Dsr_1_27_sspa%3Fkeywords%3Dmanga%26qid%3D1703020665%26sr%3D8-27-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',56,'2023-12-19 15:17:46.11135-06','2023-12-19 15:17:46.11135-06','www.amazon.com'), + (4411,'Chainsaw Man, Vol. 1 (1)',NULL,'B09C2XBH8V','https://m.media-amazon.com/images/I/81s8xJUzWGL._AC_UL320_.jpg',9822,4.8,'$6.34','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/CHAINSAW-MAN-Tatsuki-Fujimoto-English/dp/B09C2XBH8V/ref=sr_1_28?keywords=manga&qid=1703020665&sr=8-28',56,'2023-12-19 15:17:46.119258-06','2023-12-19 15:17:46.119258-06','www.amazon.com'), + (4412,'The Ghost in the Shell: Fully Compiled (Complete Hardcover Collection) (The Ghost in the Shell Deluxe)',NULL,'1646516311','https://m.media-amazon.com/images/I/81JNWXA7YuL._AC_UL320_.jpg',211,4.6,'$49.49','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Ghost-Shell-Compiled-Hardcover-Collection/dp/1646516311/ref=sr_1_29?keywords=manga&qid=1703020665&sr=8-29',56,'2023-12-19 15:17:46.126349-06','2023-12-19 15:17:46.126349-06','www.amazon.com'), + (4413,'Demon Slayer: Kimetsu no Yaiba, Vol. 1 (1)',NULL,'B07CTBBGZF','https://m.media-amazon.com/images/I/81ZNkhqRvVL._AC_UL320_.jpg',14728,4.8,'$7.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Demon-Slayer-Kimetsu-Yaiba-Cruelty-ebook/dp/B07CTBBGZF/ref=sr_1_30?keywords=manga&qid=1703020665&sr=8-30',56,'2023-12-19 15:17:46.132973-06','2023-12-19 15:17:46.132973-06','www.amazon.com'), + (4414,'My Hero Academia Box Set 1: Includes volumes 1-20 with premium (1) (My Hero Academia Box Sets)',NULL,'1974735990','https://m.media-amazon.com/images/I/81fCzl5vTtL._AC_UL320_.jpg',920,4.8,'$98.57','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/My-Hero-Academia-Box-Set/dp/1974735990/ref=sr_1_31?keywords=manga&qid=1703020665&sr=8-31',56,'2023-12-19 15:17:46.13905-06','2023-12-19 15:17:46.13905-06','www.amazon.com'), + (4415,'Chainsaw Man Manga Collection 11 Book Set volumes 1-11 by Tatsuki Fujimoto & Juliet Music Magnetic Bookmarks',NULL,'B0C34C7XPK','https://m.media-amazon.com/images/I/A13eGS1TgSL._AC_UL320_.jpg',5,4.8,'$89.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4MjcyMTQ1NjQ5NjQwNzE3OjE3MDMwMjA2NjU6c3BfbXRmOjMwMDAwMzk5MzMzNTAwMjo6MDo6&url=%2FCollection-Tatsuki-Fujimoto-Juliet-Music%2Fdp%2FB0C34C7XPK%2Fref%3Dsr_1_32_sspa%3Fkeywords%3Dmanga%26qid%3D1703020665%26sr%3D8-32-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',56,'2023-12-19 15:17:46.145117-06','2023-12-19 15:17:46.145117-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4416,'Enno Vatti 100 Anime Scratch Off Poster - Top Animes Of All Time (16.5" x 23.4")- Ultimate Bucket List/Cool Anime Stuff- Best Gifts for Anime Lovers, Christmas, Easter, Valentine''s Day',NULL,'B092D3P7LM','https://m.media-amazon.com/images/I/81wvyvlrbQS._AC_UL320_.jpg',2301,4.8,'$19.89','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4MjcyMTQ1NjQ5NjQwNzE3OjE3MDMwMjA2NjU6c3BfbXRmOjIwMDA3MTAzOTI1MjM5ODo6MDo6&url=%2F100-Anime-Scratch-Off-Poster%2Fdp%2FB092D3P7LM%2Fref%3Dsr_1_34_sspa%3Fkeywords%3Dmanga%26qid%3D1703020665%26sr%3D8-34-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',56,'2023-12-19 15:17:46.15126-06','2023-12-19 15:17:46.15126-06','www.amazon.com'), + (4417,'Zom 100: Bucket List of the Dead, Vol. 12 (12)',NULL,'1974741346','https://m.media-amazon.com/images/I/81Vxv5g-j7L._AC_UL320_.jpg',15,4.8,'$12.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4MjcyMTQ1NjQ5NjQwNzE3OjE3MDMwMjA2NjU6c3BfbXRmOjMwMDA4MDk0OTIwMTYwMjo6MDo6&url=%2FZom-100-Bucket-List-Dead%2Fdp%2F1974741346%2Fref%3Dsr_1_35_sspa%3Fkeywords%3Dmanga%26qid%3D1703020665%26sr%3D8-35-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',56,'2023-12-19 15:17:46.15745-06','2023-12-19 15:17:46.15745-06','www.amazon.com'), + (4418,'ORIGIN 1',NULL,'B0CL9MW3FZ','https://m.media-amazon.com/images/I/91jH9R2OHcL._AC_UL320_.jpg',7,4.7,'$12.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/ORIGIN-Vol-1-BOICHI-ebook/dp/B0CL9MW3FZ/ref=sr_1_36?keywords=manga&qid=1703020665&sr=8-36',56,'2023-12-19 15:17:46.163663-06','2023-12-19 15:17:46.163663-06','www.amazon.com'), + (4419,'BLAME! 1',NULL,'B01INYEW1W','https://m.media-amazon.com/images/I/91DSoniXjcL._AC_UL320_.jpg',1626,4.7,'$17.70','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/BLAME-Vol-1-Tsutomu-Nihei-ebook/dp/B01INYEW1W/ref=sr_1_37?keywords=manga&qid=1703020665&sr=8-37',56,'2023-12-19 15:17:46.169286-06','2023-12-19 15:17:46.169286-06','www.amazon.com'), + (4420,'The Summer Hikaru Died, Vol. 1 (Volume 1) (The Summer Hikaru Died, 1)',NULL,'B0BTFCFRWT','https://m.media-amazon.com/images/I/71aptV4ScXL._AC_UL320_.jpg',304,4.8,'$10.89','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Summer-Hikaru-Died-Vol-ebook/dp/B0BTFCFRWT/ref=sr_1_38?keywords=manga&qid=1703020665&sr=8-38',56,'2023-12-19 15:17:46.175754-06','2023-12-19 15:17:46.175754-06','www.amazon.com'), + (4421,'Toilet-bound Hanako-kun: First Stall (Volume 1) (Toilet-bound Hanako-kun Boxed InSTALLments, 1)',NULL,'1975366492','https://m.media-amazon.com/images/I/71tJrlvN2tL._AC_UL320_.jpg',113,4.6,'$62.52','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Toilet-bound-Hanako-kun-First-Stall-InSTALLments/dp/1975366492/ref=sr_1_40?keywords=manga&qid=1703020665&sr=8-40',56,'2023-12-19 15:17:46.185223-06','2023-12-19 15:17:46.185223-06','www.amazon.com'), + (4422,'Bocchi the Rock!, Vol. 1 (Volume 1) (Bocchi the Rock!, 1)',NULL,'B0C4FZMF17','https://m.media-amazon.com/images/I/81DubR7340L._AC_UL320_.jpg',71,4.8,'$13.59','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Bocchi-Rock-Vol-Aki-Hamazi-ebook/dp/B0C4FZMF17/ref=sr_1_42?keywords=manga&qid=1703020665&sr=8-42',56,'2023-12-19 15:17:46.195768-06','2023-12-19 15:17:46.195768-06','www.amazon.com'), + (4423,'Pokémon Adventures (7 Volume Set - Reads R to L (Japanese Style) for all ages)',NULL,'1421550067','https://m.media-amazon.com/images/I/810UyPoPuML._AC_UL320_.jpg',2481,4.8,'$41.79','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Pok%C3%A9mon-Adventures-Set-Reads-Japanese/dp/1421550067/ref=sr_1_43?keywords=manga&qid=1703020665&sr=8-43',56,'2023-12-19 15:17:46.203119-06','2023-12-19 15:17:46.203119-06','www.amazon.com'), + (4424,'One Piece, Vol. 104 (104)',NULL,'B0BV1HY8B6','https://m.media-amazon.com/images/I/91CN0HstfNL._AC_UL320_.jpg',108,4.8,'$9.58','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/One-Piece-Vol-Eiichiro-Sanji-ebook/dp/B0BV1HY8B6/ref=sr_1_44?keywords=manga&qid=1703020665&sr=8-44',56,'2023-12-19 15:17:46.234645-06','2023-12-19 15:17:46.234645-06','www.amazon.com'), + (4425,'Haikyu!!, Vol. 1 (1)',NULL,'B01F4IYNX2','https://m.media-amazon.com/images/I/8125DI58M+L._AC_UL320_.jpg',6675,4.9,'$5.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Haikyu-Vol-1-Hinata-Kageyama-ebook/dp/B01F4IYNX2/ref=sr_1_46?keywords=manga&qid=1703020665&sr=8-46',56,'2023-12-19 15:17:46.24342-06','2023-12-19 15:17:46.24342-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4426,'One-Punch Man, Vol. 1 (1)',NULL,'B00I9IO7FE','https://m.media-amazon.com/images/I/81VAgJoB3BL._AC_UL320_.jpg',6473,4.8,'$9.36','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/One-Punch-Man-Vol-1-ONE-ebook/dp/B00I9IO7FE/ref=sr_1_47?keywords=manga&qid=1703020665&sr=8-47',56,'2023-12-19 15:17:46.250886-06','2023-12-19 15:17:46.250886-06','www.amazon.com'), + (4427,'Kaiju No. 8, Vol. 1 (1)',NULL,'B098DN5KVB','https://m.media-amazon.com/images/I/81IgJ1cGaWS._AC_UL320_.jpg',3110,4.9,'$6.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Kaiju-No-8-Vol-1-ebook/dp/B098DN5KVB/ref=sr_1_48?keywords=manga&qid=1703020665&sr=8-48',56,'2023-12-19 15:17:46.257602-06','2023-12-19 15:17:46.257602-06','www.amazon.com'), + (4428,'One Piece: East Blue 1-2-3',NULL,'1421536250','https://m.media-amazon.com/images/I/810mUdp86HL._AC_UL320_.jpg',3283,4.8,'$11.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/One-Piece-East-Blue-1-2-3/dp/1421536250/ref=sr_1_49?keywords=manga&qid=1703020665&sr=8-49',56,'2023-12-19 15:17:46.264656-06','2023-12-19 15:17:46.264656-06','www.amazon.com'), + (4429,'Attack on Titan The Final Season Part 2 Manga Box Set (Attack on Titan Manga Box Sets)',NULL,'164651453X','https://m.media-amazon.com/images/I/81b-63KSjqL._AC_UL320_.jpg',305,4.9,'$30.57','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Attack-Titan-Final-Season-Manga/dp/164651453X/ref=sr_1_50?keywords=manga&qid=1703020665&sr=8-50',56,'2023-12-19 15:17:46.271085-06','2023-12-19 15:17:46.271085-06','www.amazon.com'), + (4430,'Sakamoto Days, Vol. 1 (1)',NULL,'B0992SXGBL','https://m.media-amazon.com/images/I/81keqrZAVYL._AC_UL320_.jpg',1060,4.8,'$9.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Sakamoto-Days-Vol-Yuto-Suzuki-ebook/dp/B0992SXGBL/ref=sr_1_51?keywords=manga&qid=1703020665&sr=8-51',56,'2023-12-19 15:17:46.27738-06','2023-12-19 15:17:46.27738-06','www.amazon.com'), + (4595,'Luggage Cup Holder for Suitcases Free Hands,Travel Must Haves, Adjustable for Different Sizes of Coffee Cups, Universal Luggage Accessories for Flight Attendants, Business Travelers, Tourists(Gray)',NULL,'B0BVMHT7MM','https://m.media-amazon.com/images/I/81AX3FqcvoL._AC_UL320_.jpg',207,4.5,'$13.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Suitcases-Adjustable-Different-Accessories-Attendants/dp/B0BVMHT7MM/ref=sr_1_107?keywords=travel+accessories&qid=1703020686&sr=8-107',57,'2023-12-19 15:18:08.155061-06','2023-12-19 15:18:08.155061-06','www.amazon.com'), + (4431,'Disney Twisted-Wonderland, Vol. 2: The Manga: Book of Heartslabyul (2)',NULL,'B0CKDRPSPV','https://m.media-amazon.com/images/I/819HdisoLBL._AC_UL320_.jpg',37,4.8,'$11.69','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Disney-Twisted-Wonderland-Vol-Manga-Heartslabyul-ebook/dp/B0CKDRPSPV/ref=sr_1_53?keywords=manga&qid=1703020665&sr=8-53',56,'2023-12-19 15:17:46.290573-06','2023-12-19 15:17:46.290573-06','www.amazon.com'), + (4432,'Jujutsu Kaisen, Vol. 19 (19)',NULL,'B0BQPNQLXM','https://m.media-amazon.com/images/I/811kK9R8bXL._AC_UL320_.jpg',781,4.9,'$8.50','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Jujutsu-Kaisen-Vol-Gege-Akutami-ebook/dp/B0BQPNQLXM/ref=sr_1_54?keywords=manga&qid=1703020665&sr=8-54',56,'2023-12-19 15:17:46.297787-06','2023-12-19 15:17:46.297787-06','www.amazon.com'), + (4433,'Sakamoto Days, Vol. 10 (10)',NULL,'B0BTZTTGR9','https://m.media-amazon.com/images/I/71ZJCDq881L._AC_UL320_.jpg',5,4.8,'$9.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Sakamoto-Days-Vol-Yuto-Suzuki-ebook/dp/B0BTZTTGR9/ref=sr_1_55?keywords=manga&qid=1703020665&sr=8-55',56,'2023-12-19 15:17:46.306316-06','2023-12-19 15:17:46.306316-06','www.amazon.com'), + (4434,'Demon Slayer: Kimetsu no Yaiba, Vol. 6 (6)',NULL,'B07RB7CR6R','https://m.media-amazon.com/images/I/81t1iALAZSL._AC_UL320_.jpg',5393,4.9,'$5.79','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Demon-Slayer-Kimetsu-Yaiba-Gathers-ebook/dp/B07RB7CR6R/ref=sr_1_56?keywords=manga&qid=1703020665&sr=8-56',56,'2023-12-19 15:17:46.313097-06','2023-12-19 15:17:46.313097-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4435,'Demon Slayer: Kimetsu Academy, Vol. 1 (1)',NULL,'B0CLKZYRFN','https://m.media-amazon.com/images/I/81rzQHAySML._AC_UL320_.jpg',4,5.0,'$9.58','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Demon-Slayer-Kimetsu-Academy-Vol-ebook/dp/B0CLKZYRFN/ref=sr_1_57?keywords=manga&qid=1703020665&sr=8-57',56,'2023-12-19 15:17:46.319734-06','2023-12-19 15:17:46.319734-06','www.amazon.com'), + (4436,'Jujutsu Kaisen, Vol. 20 (20)',NULL,'B0BJ66KC3N','https://m.media-amazon.com/images/I/81+-9sRp2JL._AC_UL320_.jpg',447,4.9,'$8.75','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Jujutsu-Kaisen-Vol-Gege-Akutami-ebook/dp/B0BJ66KC3N/ref=sr_1_58?keywords=manga&qid=1703020665&sr=8-58',56,'2023-12-19 15:17:46.326085-06','2023-12-19 15:17:46.326085-06','www.amazon.com'), + (4437,'Musashi: An Epic Novel of the Samurai Era',NULL,'1538589877','https://m.media-amazon.com/images/I/81H7+mxJk9L._AC_UL320_.jpg',3968,4.8,'$17.89','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Musashi-Eiji-Yoshikawa/dp/1538589877/ref=sr_1_59?keywords=manga&qid=1703020665&sr=8-59',56,'2023-12-19 15:17:46.333805-06','2023-12-19 15:17:46.333805-06','www.amazon.com'), + (4438,'Mr. Villain''s Day Off 01',NULL,'B0CKVJ1MFN','https://m.media-amazon.com/images/I/81QBXbWbamL._AC_UL320_.jpg',88,4.6,'$12.60','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Mr-Villains-CHAPTER-SERIALS-Book-ebook/dp/B0CKVJ1MFN/ref=sr_1_60?keywords=manga&qid=1703020665&sr=8-60',56,'2023-12-19 15:17:46.340685-06','2023-12-19 15:17:46.340685-06','www.amazon.com'), + (4386,'How to Draw Anime for Kids How to Draw Anime and Manga for Beginners: Learn to Draw Awesome Anime and Manga Characters A Step-by-Step Drawing Guide for Kids 9 - 12 (How to Draw Everything)',NULL,'B0CJKY712P','https://aax-us-iad.amazon.com/e/loi/imp?b=JBT4te2JtcxmKdX7YpFd1R0AAAGMg_EZMgEAAAH2AQBvbm9fdHhuX2JpZDEgICBvbm9fdHhuX2ltcDEgICBPqeRi',130,4.5,'$16.19','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo4MjcyMTQ1NjQ5NjQwNzE3OjE3MDMwMjA2NjU6c3BfYXRmOjMwMDA2ODcyMzQ1NjkwMjo6MDo6&url=%2FAnime-Manga-Beginners-Step-Step%2Fdp%2FB0CJKY712P%2Fref%3Dsr_1_1_sspa%3Fkeywords%3Dmanga%26qid%3D1703020665%26sr%3D8-1-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGY%26psc%3D1',56,'2023-12-19 15:17:45.956815-06','2023-12-19 15:17:46.34734-06','www.amazon.com'), + (4439,'How to Draw Anime and Manga for Beginners: Learn to Draw Awesome Anime and Manga Characters - A Step-by-Step Drawing Guide for Kids, Teens, and Adults',NULL,'B09ZCTWDH8','https://m.media-amazon.com/images/I/719lXlNOptL._AC_UL320_.jpg',1272,4.7,'$15.04','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo2Nzg4NjY0NzY5MDMzNzE3OjE3MDMwMjA2NzI6c3BfYXRmX25leHQ6MzAwMDk5MTI5MzAxODAyOjowOjo&url=%2FAnime-Manga-Beginners-Step-Step%2Fdp%2FB09ZCTWDH8%2Fref%3Dsr_1_49_sspa%3Fkeywords%3Dmanga%26qid%3D1703020672%26sr%3D8-49-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGZfbmV4dA%26psc%3D1',56,'2023-12-19 15:17:53.687613-06','2023-12-19 15:17:53.687613-06','www.amazon.com'), + (4440,'Shuna''s Journey',NULL,'1250846528','https://m.media-amazon.com/images/I/81w8MPT9fVL._AC_UL320_.jpg',679,4.8,'$16.46','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Shunas-Journey-Hayao-Miyazaki/dp/1250846528/ref=sr_1_52?keywords=manga&qid=1703020672&sr=8-52',56,'2023-12-19 15:17:53.704891-06','2023-12-19 15:17:53.704891-06','www.amazon.com'), + (4441,'Blue Lock 3',NULL,'B093XX72CX','https://m.media-amazon.com/images/I/71JQ6EFjg1L._AC_UL320_.jpg',443,4.8,'$10.39','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Blue-Lock-Vol-Yusuke-Nomura-ebook/dp/B093XX72CX/ref=sr_1_53?keywords=manga&qid=1703020672&sr=8-53',56,'2023-12-19 15:17:53.710702-06','2023-12-19 15:17:53.710702-06','www.amazon.com'), + (4442,'Jujutsu Kaisen, Vol. 18 (18)',NULL,'B09SP9RBFY','https://m.media-amazon.com/images/I/81InOZKyKSL._AC_UL320_.jpg',1271,4.9,'$7.68','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Jujutsu-Kaisen-Vol-Gege-Akutami-ebook/dp/B09SP9RBFY/ref=sr_1_54?keywords=manga&qid=1703020672&sr=8-54',56,'2023-12-19 15:17:53.716825-06','2023-12-19 15:17:53.716825-06','www.amazon.com'), + (4443,'Soul Eater: The Perfect Edition 01',NULL,'1646090012','https://m.media-amazon.com/images/I/71FDks9l9rL._AC_UL320_.jpg',1751,4.9,'$17.21','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Soul-Eater-Perfect-Atsushi-Ohkubo/dp/1646090012/ref=sr_1_55?keywords=manga&qid=1703020672&sr=8-55',56,'2023-12-19 15:17:53.723117-06','2023-12-19 15:17:53.723117-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4444,'Blade of the Moon Princess, Vol. 1 (1)',NULL,'B0BV1C12D6','https://m.media-amazon.com/images/I/81pFGlgRKqL._AC_UL320_.jpg',27,4.3,'$8.50','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Blade-Moon-Princess-Vol-1-ebook/dp/B0BV1C12D6/ref=sr_1_56?keywords=manga&qid=1703020672&sr=8-56',56,'2023-12-19 15:17:53.72884-06','2023-12-19 15:17:53.72884-06','www.amazon.com'), + (4445,'Inside the Tentacle Cave (Manga) Vol. 1',NULL,'B0CJ9WH2WJ','https://m.media-amazon.com/images/I/81FokG-lsNL._AC_UL320_.jpg',21,4.5,'$13.49','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Inside-Tentacle-Cave-Manga-Vol-ebook/dp/B0CJ9WH2WJ/ref=sr_1_57?keywords=manga&qid=1703020672&sr=8-57',56,'2023-12-19 15:17:53.734823-06','2023-12-19 15:17:53.734823-06','www.amazon.com'), + (4446,'How to Draw Anime and Manga for Beginners: Learn to Draw Awesome Anime and Manga Characters - A Step-by-Step Drawing Guide for Kids, Teens, and Adults',NULL,'B0BN8QPP8K','https://m.media-amazon.com/images/I/719lXlNOptL._AC_UL320_.jpg',1272,4.7,'$15.04','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Anime-Manga-Beginners-Step-Step/dp/B0BN8QPP8K/ref=sr_1_58?keywords=manga&qid=1703020672&sr=8-58',56,'2023-12-19 15:17:53.741641-06','2023-12-19 15:17:53.741641-06','www.amazon.com'), + (4447,'Spy x Family, Vol. 10 (10)',NULL,'B0BV1HZZ4F','https://m.media-amazon.com/images/I/71+4aMJ1qHL._AC_UL320_.jpg',407,4.8,'$9.58','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Spy-x-Family-Vol-10-ebook/dp/B0BV1HZZ4F/ref=sr_1_59?keywords=manga&qid=1703020672&sr=8-59',56,'2023-12-19 15:17:53.748251-06','2023-12-19 15:17:53.748251-06','www.amazon.com'), + (4448,'Monster: The Perfect Edition, Vol. 1 (1)',NULL,'142156906X','https://m.media-amazon.com/images/I/81jtWp+Hb9L._AC_UL320_.jpg',1533,4.9,'$17.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Monster-Vol-Perfect-Naoki-Urasawa/dp/142156906X/ref=sr_1_60?keywords=manga&qid=1703020672&sr=8-60',56,'2023-12-19 15:17:53.754222-06','2023-12-19 15:17:53.754222-06','www.amazon.com'), + (4449,'My Hero Academia, Vol. 36 (36)',NULL,'B0BV1B77VG','https://m.media-amazon.com/images/I/81mydGNiOAL._AC_UL320_.jpg',143,4.9,'$9.58','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/My-Hero-Academia-Vol-36-ebook/dp/B0BV1B77VG/ref=sr_1_61?keywords=manga&qid=1703020672&sr=8-61',56,'2023-12-19 15:17:53.760439-06','2023-12-19 15:17:53.760439-06','www.amazon.com'), + (4450,'Chainsaw Man, Vol. 12 (12)',NULL,'B0BV11TYK2','https://m.media-amazon.com/images/I/81yS2PMLZ0L._AC_UL320_.jpg',525,4.8,'$9.58','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Chainsaw-Man-Vol-Tatsuki-Fujimoto-ebook/dp/B0BV11TYK2/ref=sr_1_62?keywords=manga&qid=1703020672&sr=8-62',56,'2023-12-19 15:17:53.766502-06','2023-12-19 15:17:53.766502-06','www.amazon.com'), + (4451,'One Piece, Vol. 1: Romance Dawn',NULL,'1435221443','https://m.media-amazon.com/images/I/71y+XnBXm4L._AC_UL320_.jpg',4538,4.8,'$9.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/One-Piece-1-Romance-Dawn/dp/1435221443/ref=sr_1_63?keywords=manga&qid=1703020672&sr=8-63',56,'2023-12-19 15:17:53.773542-06','2023-12-19 15:17:53.773542-06','www.amazon.com'), + (4452,'My Hero Academia, Vol. 3 (3)',NULL,'B01AIXDNIE','https://m.media-amazon.com/images/I/815IWVldmFL._AC_UL320_.jpg',9809,4.9,'$7.70','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/My-Hero-Academia-Vol-Might-ebook/dp/B01AIXDNIE/ref=sr_1_64?keywords=manga&qid=1703020672&sr=8-64',56,'2023-12-19 15:17:53.781219-06','2023-12-19 15:17:53.781219-06','www.amazon.com'), + (4453,'Dandadan, Vol. 1 (1)',NULL,'B0BGMHSL39','https://m.media-amazon.com/images/I/81kHWcb7n4L._AC_UL320_.jpg',723,4.9,'$9.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Dandadan-Vol-1-Yukinobu-Tatsu-ebook/dp/B0BGMHSL39/ref=sr_1_65?keywords=manga&qid=1703020672&sr=8-65',56,'2023-12-19 15:17:53.78833-06','2023-12-19 15:17:53.78833-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4454,'20th Century Boys: The Perfect Edition, Vol. 1 (1)',NULL,'1421599619','https://m.media-amazon.com/images/I/719RN4X0xZL._AC_UL320_.jpg',1249,4.9,'$19.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/20th-Century-Boys-Perfect-Vol/dp/1421599619/ref=sr_1_66?keywords=manga&qid=1703020672&sr=8-66',56,'2023-12-19 15:17:53.795571-06','2023-12-19 15:17:53.795571-06','www.amazon.com'), + (4455,'Pink Heart Jam, Vol. 1 (1)',NULL,'B0CMQPFR3M','https://m.media-amazon.com/images/I/71AD1NdxFqL._AC_UL320_.jpg',8,4.7,'$12.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Pink-Heart-Vol-Yaoi-Manga-ebook/dp/B0CMQPFR3M/ref=sr_1_67?keywords=manga&qid=1703020672&sr=8-67',56,'2023-12-19 15:17:53.803962-06','2023-12-19 15:17:53.803962-06','www.amazon.com'), + (4456,'Toilet-bound Hanako-kun, Vol. 19 (Toilet-bound Hanako-kun, 19)',NULL,'B0CCW75YZJ','https://m.media-amazon.com/images/I/91585KVEl6L._AC_UL320_.jpg',13,5.0,'$12.79','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Toilet-bound-Hanako-kun-Vol-19-AidaIro-ebook/dp/B0CCW75YZJ/ref=sr_1_68?keywords=manga&qid=1703020672&sr=8-68',56,'2023-12-19 15:17:53.810998-06','2023-12-19 15:17:53.810998-06','www.amazon.com'), + (4457,'Warmtwinl 50PCS Cards Comic Edition The Clow Card Magic Book Set Gifts',NULL,'B07V7SL8M1','https://m.media-amazon.com/images/I/71tCKRTPX9L._AC_UL320_.jpg',9,4.7,'$39.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo2Nzg4NjY0NzY5MDMzNzE3OjE3MDMwMjA2NzI6c3BfbXRmOjIwMDA2Mjc2OTYzMzc5ODo6MDo6&url=%2FAraonstorm-50PCS-Cardcaptor-Kinomoto-Sakura%2Fdp%2FB07V7SL8M1%2Fref%3Dsr_1_69_sspa%3Fkeywords%3Dmanga%26qid%3D1703020672%26sr%3D8-69-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',56,'2023-12-19 15:17:53.818806-06','2023-12-19 15:17:53.818806-06','www.amazon.com'), + (4458,'Eat Sleep Anime Repeat Manga Japan Kanji Weeb Vintage Anime T-Shirt',NULL,'B08ZW74YFB','https://m.media-amazon.com/images/I/71EbW6Z-q7L._AC_UL320_.jpg',71,4.4,'$18.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo2Nzg4NjY0NzY5MDMzNzE3OjE3MDMwMjA2NzI6c3BfbXRmOjIwMDA5MjU0NzUwNzY4MTo6MDo6&url=%2FAnime-Manga-Japan-Vintage-T-Shirt%2Fdp%2FB08ZW74YFB%2Fref%3Dsr_1_70_sspa%3Fkeywords%3Dmanga%26qid%3D1703020672%26sr%3D8-70-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',56,'2023-12-19 15:17:53.826206-06','2023-12-19 15:17:53.826206-06','www.amazon.com'), + (4459,'Berserker Guts Anime Enamel Pins - Berserker Armor Swordsman Manga Pin - Christmas Cosplay Jewelry Gifts for Kids Girls Teens Women Men and Fans',NULL,'B0BVHWZ4FD','https://m.media-amazon.com/images/I/619my91qRJL._AC_UL320_.jpg',36,5.0,'$15.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo2Nzg4NjY0NzY5MDMzNzE3OjE3MDMwMjA2NzI6c3BfbXRmOjIwMDEyODE3MjI3NjY5ODo6MDo6&url=%2F3Pcs-Berserker-Guts-Manga-Enamel%2Fdp%2FB0BVHWZ4FD%2Fref%3Dsr_1_71_sspa%3Fkeywords%3Dmanga%26qid%3D1703020672%26sr%3D8-71-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',56,'2023-12-19 15:17:53.838048-06','2023-12-19 15:17:53.838048-06','www.amazon.com'), + (4460,'How to Draw Anime (Includes Anime, Manga and Chibi) Part 1 Drawing Anime Faces',NULL,'1947215159','https://m.media-amazon.com/images/I/81wzrzqp02L._AC_UL320_.jpg',8798,4.7,'$7.55','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo2Nzg4NjY0NzY5MDMzNzE3OjE3MDMwMjA2NzI6c3BfbXRmOjIwMDEwMjMzNTk0MjQ5ODo6MDo6&url=%2FAnime-Manga-Chibi-Drawing-Faces%2Fdp%2F1947215159%2Fref%3Dsr_1_72_sspa%3Fkeywords%3Dmanga%26qid%3D1703020672%26sr%3D8-72-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',56,'2023-12-19 15:17:53.845887-06','2023-12-19 15:17:53.845887-06','www.amazon.com'), + (4461,'Jujutsu Kaisen, Vol. 5 (5)',NULL,'B08DFCDQ6R','https://m.media-amazon.com/images/I/81w9aLVP9pL._AC_UL320_.jpg',4019,4.9,'$9.29','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Jujutsu-Kaisen-Vol-Sister-School-Goodwill-ebook/dp/B08DFCDQ6R/ref=sr_1_73?keywords=manga&qid=1703020672&sr=8-73',56,'2023-12-19 15:17:53.852669-06','2023-12-19 15:17:53.852669-06','www.amazon.com'), + (4462,'Jujutsu Kaisen, Vol. 17 (17)',NULL,'B09JS7T25Y','https://m.media-amazon.com/images/I/71l8URKoHlL._AC_UL320_.jpg',1297,4.9,'$7.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Jujutsu-Kaisen-Vol-Gege-Akutami-ebook/dp/B09JS7T25Y/ref=sr_1_74?keywords=manga&qid=1703020672&sr=8-74',56,'2023-12-19 15:17:53.858532-06','2023-12-19 15:17:53.858532-06','www.amazon.com'), + (4463,'Freaking Idiots Guide Ebay Bundle (eBay Selling Made Easy)',NULL,'B00KB47UTE','https://m.media-amazon.com/images/I/61gR52XEeIL._AC_UL320_.jpg',7,4.5,'$19.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Freaking-Idiots-Guide-Two-Book-Bundle/dp/B00KB47UTE/ref=sr_1_75?keywords=manga&qid=1703020672&sr=8-75',56,'2023-12-19 15:17:53.865536-06','2023-12-19 15:17:53.865536-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4464,'Dragon Ball Super, Vol. 9 (9)',NULL,'B088WDZKVV','https://m.media-amazon.com/images/I/81oIvgePfDL._AC_UL320_.jpg',3779,4.9,'$11.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Dragon-Ball-Super-Vol-Aftermath-ebook/dp/B088WDZKVV/ref=sr_1_76?keywords=manga&qid=1703020672&sr=8-76',56,'2023-12-19 15:17:53.871449-06','2023-12-19 15:17:53.871449-06','www.amazon.com'), + (4465,'NRGDWXZ Anime Figure,Onna no Ureta ase - Kurosawa Otome - 1/6 Anime Figure Home Decor Collectible Figurines',NULL,'B09SXTHYHY','https://m.media-amazon.com/images/I/41F1y4NgXGL._AC_UL320_.jpg',4,3.2,'$50.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo2Nzg4NjY0NzY5MDMzNzE3OjE3MDMwMjA2NzI6c3BfbXRmOjMwMDEwNTAxNjYzOTkwMjo6MDo6&url=%2FNRGDWXZ-Anime-Figure-Onna-Ureta%2Fdp%2FB09SXTHYHY%2Fref%3Dsr_1_77_sspa%3Fkeywords%3Dmanga%26qid%3D1703020672%26sr%3D8-77-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',56,'2023-12-19 15:17:53.877284-06','2023-12-19 15:17:53.877284-06','www.amazon.com'), + (4466,'Youtooz Bonk Cheems Vinyl Figure, 3.5" Cheems Vinyl Figure, Cute Shiba Inu Doge Figure - Youtooz Meme Collection Based on Internet Meme',NULL,'B09YKBFHK5','https://m.media-amazon.com/images/I/61-9HBKJJqL._AC_UL320_.jpg',143,4.8,'$39.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo2Nzg4NjY0NzY5MDMzNzE3OjE3MDMwMjA2NzI6c3BfbXRmOjIwMDA1NzE0MDkzMjU5ODo6MDo6&url=%2FBonk-Cheems-Vinyl-Figure-Shiba%2Fdp%2FB09YKBFHK5%2Fref%3Dsr_1_78_sspa%3Fkeywords%3Dmanga%26qid%3D1703020672%26sr%3D8-78-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',56,'2023-12-19 15:17:53.884396-06','2023-12-19 15:17:53.884396-06','www.amazon.com'), + (4467,'How to Draw Manga (Includes Anime, Manga and Chibi) Part 1 Drawing Manga Faces (How to Draw Anime)',NULL,'1947215469','https://m.media-amazon.com/images/I/810yAJd8OaL._AC_UL320_.jpg',745,4.7,'$8.44','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo2Nzg4NjY0NzY5MDMzNzE3OjE3MDMwMjA2NzI6c3BfbXRmOjIwMDEyMjcyODc3MzA5ODo6MDo6&url=%2FManga-Anime-Chibi-Drawing-Faces%2Fdp%2F1947215469%2Fref%3Dsr_1_79_sspa%3Fkeywords%3Dmanga%26qid%3D1703020672%26sr%3D8-79-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',56,'2023-12-19 15:17:53.891587-06','2023-12-19 15:17:53.891587-06','www.amazon.com'), + (4468,'Lovestruck Prince! I’ll Fight the Heroine for My Villainess Fiancée! Volume 1',NULL,'B0BW5MGH4Z','https://m.media-amazon.com/images/I/91mG5Ov6Z3L._AC_UL320_.jpg',99,4.4,'$7.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo2Nzg4NjY0NzY5MDMzNzE3OjE3MDMwMjA2NzI6c3BfbXRmOjIwMDE0NTYwMzk3MjE5ODo6MDo6&url=%2FLovestruck-Prince-Heroine-Villainess-Fianc%25C3%25A9e-ebook%2Fdp%2FB0BW5MGH4Z%2Fref%3Dsr_1_80_sspa%3Fkeywords%3Dmanga%26qid%3D1703020672%26sr%3D8-80-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',56,'2023-12-19 15:17:53.897735-06','2023-12-19 15:17:53.897735-06','www.amazon.com'), + (4469,'The Ice Guy and the Cool Girl 01',NULL,'B0BYMK17ZP','https://m.media-amazon.com/images/I/91QCNwRTNOL._AC_UL320_.jpg',58,4.5,'$11.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Ice-Guy-Cool-Girl-01-ebook/dp/B0BYMK17ZP/ref=sr_1_81?keywords=manga&qid=1703020672&sr=8-81',56,'2023-12-19 15:17:53.90482-06','2023-12-19 15:17:53.90482-06','www.amazon.com'), + (4470,'Death Note Complete Box Set: Volumes 1-13 with Premium',NULL,'142152581X','https://m.media-amazon.com/images/I/71teEs2FRpL._AC_UL320_.jpg',3116,4.9,'$77.01','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Death-Note-Box-Vol-s-1-13/dp/142152581X/ref=sr_1_82?keywords=manga&qid=1703020672&sr=8-82',56,'2023-12-19 15:17:53.911064-06','2023-12-19 15:17:53.911064-06','www.amazon.com'), + (4471,'Jujutsu Kaisen, Vol. 7 (7)',NULL,'B08NSZ89SJ','https://m.media-amazon.com/images/I/81+8PTZHyiL._AC_UL320_.jpg',3688,4.9,'$8.79','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Jujutsu-Kaisen-Vol-Origin-Obedience-ebook/dp/B08NSZ89SJ/ref=sr_1_83?keywords=manga&qid=1703020672&sr=8-83',56,'2023-12-19 15:17:53.917226-06','2023-12-19 15:17:53.917226-06','www.amazon.com'), + (4472,'Dragon Ball Super, Vol. 19 (19)',NULL,'B0BV1C3DC2','https://m.media-amazon.com/images/I/81exshFjhhL._AC_UL320_.jpg',308,4.9,'$8.49','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Dragon-Ball-Super-Vol-19-ebook/dp/B0BV1C3DC2/ref=sr_1_84?keywords=manga&qid=1703020672&sr=8-84',56,'2023-12-19 15:17:53.923371-06','2023-12-19 15:17:53.923371-06','www.amazon.com'), + (4473,'I Guess This Dragon Who Lost Her Egg to Disaster Is My Mom Now Volume 1',NULL,'B0C84C9Q5K','https://m.media-amazon.com/images/I/91BwhQbfKCL._AC_UL320_.jpg',153,4.7,'$7.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo2Nzg4NjY0NzY5MDMzNzE3OjE3MDMwMjA2NzI6c3BfbXRmOjMwMDAyNTczMDQ3OTgwMjo6MDo6&url=%2FGuess-This-Dragon-Lost-Disaster-ebook%2Fdp%2FB0C84C9Q5K%2Fref%3Dsr_1_85_sspa%3Fkeywords%3Dmanga%26qid%3D1703020672%26sr%3D8-85-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',56,'2023-12-19 15:17:53.930112-06','2023-12-19 15:17:53.930112-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4474,'Spy x Family, Vol. 3 (3)',NULL,'B08NSP7LY3','https://m.media-amazon.com/images/I/71POPOUAqVL._AC_UL320_.jpg',5743,4.9,'$7.90','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Spy-x-Family-Vol-3-ebook/dp/B08NSP7LY3/ref=sr_1_86?keywords=manga&qid=1703020672&sr=8-86',56,'2023-12-19 15:17:53.936865-06','2023-12-19 15:17:53.936865-06','www.amazon.com'), + (4475,'Fist of the North Star, Vol. 1 (1)',NULL,'B00183NUR8','https://m.media-amazon.com/images/I/81lzVPn+yPL._AC_UL320_.jpg',1223,4.9,'$14.10','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Heart-Chapter-Fist-North-Star/dp/B00183NUR8/ref=sr_1_87?keywords=manga&qid=1703020672&sr=8-87',56,'2023-12-19 15:17:53.942904-06','2023-12-19 15:17:53.942904-06','www.amazon.com'), + (4476,'Jujutsu Kaisen, Vol. 11 (11)',NULL,'B099WGWFZR','https://m.media-amazon.com/images/I/81TfMK1X3iL._AC_UL320_.jpg',3715,4.9,'$9.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Jujutsu-Kaisen-Vol-11-Incident-Gate-ebook/dp/B099WGWFZR/ref=sr_1_88?keywords=manga&qid=1703020672&sr=8-88',56,'2023-12-19 15:17:53.94943-06','2023-12-19 15:17:53.94943-06','www.amazon.com'), + (4477,'Jujutsu Kaisen, Vol. 3 (3)',NULL,'B086G9CQM9','https://m.media-amazon.com/images/I/81SB+vu9lzL._AC_UL320_.jpg',5422,4.9,'$6.69','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Jujutsu-Kaisen-Vol-Gege-Akutami-ebook/dp/B086G9CQM9/ref=sr_1_89?keywords=manga&qid=1703020672&sr=8-89',56,'2023-12-19 15:17:53.956575-06','2023-12-19 15:17:53.956575-06','www.amazon.com'), + (4478,'Spy x Family, Vol. 4 (4)',NULL,'B08WRV3MMX','https://m.media-amazon.com/images/I/71-ZeEvOS5L._AC_UL320_.jpg',5033,4.9,'$7.96','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Spy-x-Family-Vol-4-ebook/dp/B08WRV3MMX/ref=sr_1_90?keywords=manga&qid=1703020672&sr=8-90',56,'2023-12-19 15:17:53.962871-06','2023-12-19 15:17:53.962871-06','www.amazon.com'), + (4479,'Jujutsu Kaisen, Vol. 15 (15)',NULL,'B09J785SM6','https://m.media-amazon.com/images/I/81Lv0kPDH6L._AC_UL320_.jpg',2110,4.9,'$7.49','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Jujutsu-Kaisen-Vol-15-Incident-Transformation-ebook/dp/B09J785SM6/ref=sr_1_91?keywords=manga&qid=1703020672&sr=8-91',56,'2023-12-19 15:17:53.969679-06','2023-12-19 15:17:53.969679-06','www.amazon.com'), + (4480,'Spy x Family, Vol. 6 (6)',NULL,'B09GTMG7DS','https://m.media-amazon.com/images/I/71uLglx4D2L._AC_UL320_.jpg',3714,4.9,'$7.49','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Spy-x-Family-Vol-6-ebook/dp/B09GTMG7DS/ref=sr_1_92?keywords=manga&qid=1703020672&sr=8-92',56,'2023-12-19 15:17:53.975688-06','2023-12-19 15:17:53.975688-06','www.amazon.com'), + (4481,'My Dress-Up Darling 10',NULL,'B0BQLJRTLB','https://m.media-amazon.com/images/I/81Dtv-ACzgL._AC_UL320_.jpg',193,4.8,'$13.49','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/My-Dress-Up-Darling-Shinichi-Fukuda-ebook/dp/B0BQLJRTLB/ref=sr_1_93?keywords=manga&qid=1703020672&sr=8-93',56,'2023-12-19 15:17:53.981107-06','2023-12-19 15:17:53.981107-06','www.amazon.com'), + (4482,'Blue Lock 1',NULL,'B08Y19GQ3P','https://m.media-amazon.com/images/I/81Z85oL1xvL._AC_UL320_.jpg',967,4.8,'$10.30','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Blue-Lock-Vol-Yusuke-Nomura-ebook/dp/B08Y19GQ3P/ref=sr_1_94?keywords=manga&qid=1703020672&sr=8-94',56,'2023-12-19 15:17:53.987077-06','2023-12-19 15:17:53.987077-06','www.amazon.com'), + (4483,'My Hero Academia, Vol. 2 (2)',NULL,'B016XB2A5C','https://m.media-amazon.com/images/I/81wv8f5jCWL._AC_UL320_.jpg',11051,4.8,'$7.49','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/My-Hero-Academia-Vol-Damned-ebook/dp/B016XB2A5C/ref=sr_1_95?keywords=manga&qid=1703020672&sr=8-95',56,'2023-12-19 15:17:53.992638-06','2023-12-19 15:17:53.992638-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4484,'Jujutsu Kaisen, Vol. 14 (14)',NULL,'B09J6NQ6VS','https://m.media-amazon.com/images/I/81ZwggSh1zL._AC_UL320_.jpg',2645,4.9,'$7.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Jujutsu-Kaisen-Vol-14-Incident-Right-ebook/dp/B09J6NQ6VS/ref=sr_1_96?keywords=manga&qid=1703020672&sr=8-96',56,'2023-12-19 15:17:53.999656-06','2023-12-19 15:17:53.999656-06','www.amazon.com'), + (4485,'Homunculus (Omnibus) Vol. 3-4',NULL,'B0CDFJCGSH','https://m.media-amazon.com/images/I/81ioI5j4WTL._AC_UL320_.jpg',40,4.6,'$23.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Homunculus-Omnibus-Vol-Hideo-Yamamoto-ebook/dp/B0CDFJCGSH/ref=sr_1_97?keywords=manga&qid=1703020672&sr=8-97',56,'2023-12-19 15:17:54.00629-06','2023-12-19 15:17:54.00629-06','www.amazon.com'), + (4486,'The Apothecary Diaries 10 (Manga)',NULL,'1646091361','https://m.media-amazon.com/images/I/91rWZuBmGKL._AC_UL320_.jpg',124,4.8,'$7.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Apothecary-Diaries-10-Manga/dp/1646091361/ref=sr_1_98?keywords=manga&qid=1703020672&sr=8-98',56,'2023-12-19 15:17:54.012381-06','2023-12-19 15:17:54.012381-06','www.amazon.com'), + (4487,'Jujutsu Kaisen, Vol. 4 (4)',NULL,'B088W65ZQ8','https://m.media-amazon.com/images/I/814Ppc2uVOL._AC_UL320_.jpg',4906,4.9,'$9.69','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Jujutsu-Kaisen-Vol-Gonna-Kill-ebook/dp/B088W65ZQ8/ref=sr_1_99?keywords=manga&qid=1703020672&sr=8-99',56,'2023-12-19 15:17:54.018237-06','2023-12-19 15:17:54.018237-06','www.amazon.com'), + (4488,'Attack on Titan Season 1 Part 2 Manga Box Set (Attack on Titan Manga Box Sets)',NULL,'1632367009','https://m.media-amazon.com/images/I/91izqXwEzVL._AC_UL320_.jpg',2401,4.8,'$22.46','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Attack-Titan-Season-Part-Manga/dp/1632367009/ref=sr_1_100?keywords=manga&qid=1703020672&sr=8-100',56,'2023-12-19 15:17:54.025522-06','2023-12-19 15:17:54.025522-06','www.amazon.com'), + (4489,'Solo Leveling, Vol. 3 (comic) (Solo Leveling (comic), 3)',NULL,'B0916CB35Q','https://m.media-amazon.com/images/I/71tnjmKWwJL._AC_UL320_.jpg',2807,4.9,'$12.23','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Solo-Leveling-Vol-3-Chugong-ebook/dp/B0916CB35Q/ref=sr_1_101?keywords=manga&qid=1703020672&sr=8-101',56,'2023-12-19 15:17:54.032967-06','2023-12-19 15:17:54.032967-06','www.amazon.com'), + (4490,'Bungo Stray Dogs, Vol. 1 (Volume 1) (Bungo Stray Dogs, 1)',NULL,'B01LX0R0EG','https://m.media-amazon.com/images/I/91Oys66zPBL._AC_UL320_.jpg',1550,4.8,'$10.01','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Bungo-Stray-Dogs-Vol-1-ebook/dp/B01LX0R0EG/ref=sr_1_102?keywords=manga&qid=1703020672&sr=8-102',56,'2023-12-19 15:17:54.039255-06','2023-12-19 15:17:54.039255-06','www.amazon.com'), + (4491,'Bungo Stray Dogs, Vol. 2 (Volume 2) (Bungo Stray Dogs, 2)',NULL,'B01LZ3XXV5','https://m.media-amazon.com/images/I/71ourYMMPcL._AC_UL320_.jpg',1034,4.8,'$13.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Bungo-Stray-Dogs-Vol-2-ebook/dp/B01LZ3XXV5/ref=sr_1_103?keywords=manga&qid=1703020672&sr=8-103',56,'2023-12-19 15:17:54.045463-06','2023-12-19 15:17:54.045463-06','www.amazon.com'), + (4492,'Naruto: 3-in-1 Edition, Vol. 1 (Uzumaki Naruto / The Worst Client / Dreams)',NULL,'1421539896','https://m.media-amazon.com/images/I/818GcRRgOVL._AC_UL320_.jpg',3483,4.8,'$13.42','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Naruto-3-1-Uzumaki-Client/dp/1421539896/ref=sr_1_104?keywords=manga&qid=1703020672&sr=8-104',56,'2023-12-19 15:17:54.052159-06','2023-12-19 15:17:54.052159-06','www.amazon.com'), + (4493,'COLORLESS Vol. 1',NULL,'B09YCK6H7Q','https://m.media-amazon.com/images/I/9176ht6pcZL._AC_UL320_.jpg',199,4.7,'$12.60','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/COLORLESS-Vol-1-Kent-ebook/dp/B09YCK6H7Q/ref=sr_1_105?keywords=manga&qid=1703020672&sr=8-105',56,'2023-12-19 15:17:54.059783-06','2023-12-19 15:17:54.059783-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4494,'Zom 100: Bucket List of the Dead, Vol. 1 (1)',NULL,'B08VRRDB1T','https://m.media-amazon.com/images/I/81WRJYFzdqL._AC_UL320_.jpg',1051,4.8,'$11.69','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Zom-100-Bucket-List-Dead-ebook/dp/B08VRRDB1T/ref=sr_1_106?keywords=manga&qid=1703020672&sr=8-106',56,'2023-12-19 15:17:54.067198-06','2023-12-19 15:17:54.067198-06','www.amazon.com'), + (4495,'The Legend of Zelda - Legendary Edition Box Set',NULL,'1974718190','https://m.media-amazon.com/images/I/71qoC7KFoZL._AC_UL320_.jpg',1257,4.4,'$80.00','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Legend-Zelda-Legendary-Box-Set/dp/1974718190/ref=sr_1_107?keywords=manga&qid=1703020672&sr=8-107',56,'2023-12-19 15:17:54.074001-06','2023-12-19 15:17:54.074001-06','www.amazon.com'), + (4496,'Jujutsu Kaisen, Vol. 12 (12)',NULL,'B09GV9QBDT','https://m.media-amazon.com/images/I/81FaJC8-EhL._AC_UL320_.jpg',2905,4.9,'$9.39','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Jujutsu-Kaisen-Vol-12-Incident-Summon-ebook/dp/B09GV9QBDT/ref=sr_1_108?keywords=manga&qid=1703020672&sr=8-108',56,'2023-12-19 15:17:54.08131-06','2023-12-19 15:17:54.08131-06','www.amazon.com'), + (4497,'How To Draw Anime for Kids Basics and Beyond: This Step-By-Step Guide Will Teach You darwings ( Heads, Faces, Bodies, Pose, eyes ) (How To Draw Anime - Manga)',NULL,'B0BJHGR2WK','https://aax-us-iad.amazon.com/e/loi/imp?b=JPwK4mTw9RLgyPprdq6g3NgAAAGMg_E36gEAAAH2AQBvbm9fdHhuX2JpZDcgICBvbm9fdHhuX2ltcDEgICBOyF6W',132,4.7,'$15.04','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.comhttps://aax-us-iad.amazon.com/x/c/RPwK4mTw9RLgyPprdq6g3NgAAAGMg_E3xQEAAAH2AQBvbm9fdHhuX2JpZDcgICBvbm9fdHhuX2ltcDEgICBOyF6W/https://www.amazon.com/Anime-Basics-Beyond-Step-Step/dp/B0BJHGR2WK/ref=sxbs_sbv_search_btf?content-id=amzn1.sym.2066ba78-527e-4aed-9de4-3ba096deb87b%3Aamzn1.sym.2066ba78-527e-4aed-9de4-3ba096deb87b&cv_ct_cx=manga&keywords=manga&pd_rd_i=B0BJHGR2WK&pd_rd_r=ccd9e2e8-d67d-4520-8d69-aa27722a8095&pd_rd_w=3L8UU&pd_rd_wg=xLGui&pf_rd_p=2066ba78-527e-4aed-9de4-3ba096deb87b&pf_rd_r=XK9JDG0SH1Q876QE55DT&qid=1703020672&sbo=RZvfv%2F%2FHxDF%2BO5021pAnSA%3D%3D&sr=1-49-48f7baba-8e26-45f3-8811-e1a601ad20bf',56,'2023-12-19 15:17:54.088421-06','2023-12-19 15:17:54.088421-06','www.amazon.comhttps:'), + (4498,'Shoe Dust Bags - 4 Pack Black Duster Flannel Single Shoe Pouch with Drawstring Closure, Washable Breathable Cotton Fabric Cloth for Travel, Home, Luggage, Handbags, Storage, Accessories - 8x17',NULL,'B09DNDF4QV','https://m.media-amazon.com/images/I/81ry4CX3BoL._AC_UL320_.jpg',820,4.6,'$14.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3NDA4MjkzNzE0NTk4NzE3OjE3MDMwMjA2Nzk6c3BfYXRmOjIwMDA5OTcwMjUwMzM3MTo6MDo6&url=%2FFlannel-Storage-Drawstring-Washable-Multifunctional%2Fdp%2FB09DNDF4QV%2Fref%3Dsr_1_1_sspa%3Fkeywords%3Dtravel%2Baccessories%26qid%3D1703020679%26sr%3D8-1-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGY%26psc%3D1',57,'2023-12-19 15:18:00.386421-06','2023-12-19 15:18:00.386421-06','www.amazon.com'), + (4500,'FYY Travel Cable Organizer Pouch Electronic Accessories Carry Case Portable Waterproof Double Layers All-in-One Storage Bag for Cord, Charger, Phone, Earphone Black',NULL,'B0924H4XB9','https://m.media-amazon.com/images/I/81hLyL0rX2S._AC_UL320_.jpg',18826,4.5,'$9.85','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3NDA4MjkzNzE0NTk4NzE3OjE3MDMwMjA2Nzk6c3BfYXRmOjIwMDE0NjU3OTAzNTA5ODo6MDo6&url=%2FFYY-Electronic-Organizer-Accessories-Waterproof%2Fdp%2FB0924H4XB9%2Fref%3Dsr_1_3_sspa%3Fkeywords%3Dtravel%2Baccessories%26qid%3D1703020679%26sr%3D8-3-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGY%26psc%3D1%26smid%3DA222X4SZL8V9A5',57,'2023-12-19 15:18:00.404215-06','2023-12-19 15:18:00.411279-06','www.amazon.com'), + (4501,'ZPROW Travel Jewelry Case, Mini Portable Jewelry Travel Boxes, Small Jewelry Organizer for Rings, Earrings, Pendants, Watches, Necklaces, Lipsticks Organizer Storage Holder Case (Pink)',NULL,'B0BX8NQBJS','https://m.media-amazon.com/images/I/71UU9Dovb4L._AC_UL320_.jpg',337,4.6,'$7.58','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/ZPROW-Portable-Organizer-Necklaces-Lipsticks/dp/B0BX8NQBJS/ref=sr_1_5?keywords=travel+accessories&qid=1703020679&sr=8-5',57,'2023-12-19 15:18:00.418045-06','2023-12-19 15:18:00.418045-06','www.amazon.com'), + (4502,'napfun Neck Pillow for Traveling, Upgraded Travel Neck Pillow for Airplane 100% Pure Memory Foam Travel Pillow for Flight Headrest Sleep, Portable Plane Accessories, Light Grey',NULL,'B07SRRQS5B','https://m.media-amazon.com/images/I/91GsUY-yrWL._AC_UL320_.jpg',12671,4.4,'$13.96','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Traveling-Upgraded-Airplane-Headrest-Accessories/dp/B07SRRQS5B/ref=sr_1_6?keywords=travel+accessories&qid=1703020679&sr=8-6',57,'2023-12-19 15:18:00.426203-06','2023-12-19 15:18:00.426203-06','www.amazon.com'), + (4499,'ALL INCLUDED 10 Set Durable Packing Cubes for Suitcases,OlarHike Travel Essentials,UPGRADED Anti-Tear Stitching, NEW Improved Luggage Packing Organizers for Travel Accessories(Black)',NULL,'B0BMVH7JDS','https://m.media-amazon.com/images/I/710IWgvzyBL._AC_UL320_.jpg',955,4.7,'$26.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3NDA4MjkzNzE0NTk4NzE3OjE3MDMwMjA2Nzk6c3BfYXRmOjMwMDAyNTUwMDYxMTkwMjo6MDo6&url=%2FOlarHike-Essentials-Suitcases-Organizers-Accessories%2Fdp%2FB0BMVH7JDS%2Fref%3Dsr_1_2_sspa%3Fkeywords%3Dtravel%2Baccessories%26qid%3D1703020679%26sr%3D8-2-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGY%26psc%3D1',57,'2023-12-19 15:18:00.395408-06','2023-12-19 15:18:08.010642-06','www.amazon.com'), + (4596,'Miamica Soft Travel Laundry Bag with Zipper & Drawstring, 21” x 22” – Keep Your Dirty Clothes Separate & Organized',NULL,'B01FWDLMZG','https://m.media-amazon.com/images/I/5110-ezP88L._AC_UL320_.jpg',2359,4.7,'$8.93','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Miamica-Bag-Dirty-Laundry-Gray/dp/B01FWDLMZG/ref=sr_1_108?keywords=travel+accessories&qid=1703020686&sr=8-108',57,'2023-12-19 15:18:08.161457-06','2023-12-19 15:18:08.161457-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4505,'BAGSMART 6 Set/4 Set/2 Set Compression Packing Cubes for Travel, Lightweight Vacation Travel Essentials, Travel Accessories for Suitcase Organizer Bags Set, Durable Luggage Organizer Travel Bags',NULL,'B0CJXB2P46','https://m.media-amazon.com/images/I/71Xgoq7lsTL._AC_UL320_.jpg',7563,4.6,'$39.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo2MDM4NTQwNjgwNDM5NzE3OjE3MDMwMjA2Nzk6c3Bfc2VhcmNoX3RoZW1hdGljOjMwMDA4NDYyNzMzOTEwMjo6MTo6&url=%2FBAGSMART-Compression-Lightweight-Essentials-Accessories%2Fdp%2FB0CJXB2P46%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.d0d6e7d3-c9f1-480b-9f2a-893b95951bfb%253Aamzn1.sym.d0d6e7d3-c9f1-480b-9f2a-893b95951bfb%26cv_ct_cx%3Dtravel%2Baccessories%26keywords%3Dtravel%2Baccessories%26pd_rd_i%3DB0CJXB2P46%26pd_rd_r%3Dfc81a4a3-ffbf-45bc-a40c-f7499dc39017%26pd_rd_w%3DP2Jkb%26pd_rd_wg%3DBZfdF%26pf_rd_p%3Dd0d6e7d3-c9f1-480b-9f2a-893b95951bfb%26pf_rd_r%3DEEX4P84285A70Z1M14Y4%26qid%3D1703020679%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-2-2c727eeb-987f-452f-86bd-c2978cc9d8b9-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',57,'2023-12-19 15:18:00.449327-06','2023-12-19 15:18:00.449327-06','www.amazon.com'), + (4506,'Veken 6 Set Packing Cubes for Suitcases, Travel Organizer Bags for Carry on Luggage, Suitcase Organizer Bags Set for Travel Essentials Travel Accessories in 4 Sizes(Extra Large, Large, Medium, Small)',NULL,'B09YPQ8J7B','https://m.media-amazon.com/images/I/71PgW3i2yYL._AC_UL320_.jpg',23530,4.7,'$26.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo2MDM4NTQwNjgwNDM5NzE3OjE3MDMwMjA2Nzk6c3Bfc2VhcmNoX3RoZW1hdGljOjMwMDA1ODAzNjMyODEwMjo6Mjo6&url=%2FVeken-Suitcase-Organizer-Accessories-Essentials%2Fdp%2FB09YPQ8J7B%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.d0d6e7d3-c9f1-480b-9f2a-893b95951bfb%253Aamzn1.sym.d0d6e7d3-c9f1-480b-9f2a-893b95951bfb%26cv_ct_cx%3Dtravel%2Baccessories%26keywords%3Dtravel%2Baccessories%26pd_rd_i%3DB09YPQ8J7B%26pd_rd_r%3Dfc81a4a3-ffbf-45bc-a40c-f7499dc39017%26pd_rd_w%3DP2Jkb%26pd_rd_wg%3DBZfdF%26pf_rd_p%3Dd0d6e7d3-c9f1-480b-9f2a-893b95951bfb%26pf_rd_r%3DEEX4P84285A70Z1M14Y4%26qid%3D1703020679%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-3-2c727eeb-987f-452f-86bd-c2978cc9d8b9-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',57,'2023-12-19 15:18:00.455092-06','2023-12-19 15:18:00.455092-06','www.amazon.com'), + (4507,'Ceptics Australia, China Travel Adapter - 5 Input with 20W PD-QC 3.1A Dual USB-C and USB - Ultra Compact - Light Weight - USA to Any Type I Countries Such as New Zealand, Argentina and More',NULL,'B09RQQ1QZQ','https://m.media-amazon.com/images/I/61moPD96yRL._AC_UL320_.jpg',492,4.6,'$17.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo2MDM4NTQwNjgwNDM5NzE3OjE3MDMwMjA2Nzk6c3Bfc2VhcmNoX3RoZW1hdGljOjMwMDEwNzQ5MTI0MTgwMjo6Mzo6&url=%2FAustralia-China-Travel-Adapter-Ceptics%2Fdp%2FB09RQQ1QZQ%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.d0d6e7d3-c9f1-480b-9f2a-893b95951bfb%253Aamzn1.sym.d0d6e7d3-c9f1-480b-9f2a-893b95951bfb%26cv_ct_cx%3Dtravel%2Baccessories%26keywords%3Dtravel%2Baccessories%26pd_rd_i%3DB09RQQ1QZQ%26pd_rd_r%3Dfc81a4a3-ffbf-45bc-a40c-f7499dc39017%26pd_rd_w%3DP2Jkb%26pd_rd_wg%3DBZfdF%26pf_rd_p%3Dd0d6e7d3-c9f1-480b-9f2a-893b95951bfb%26pf_rd_r%3DEEX4P84285A70Z1M14Y4%26qid%3D1703020679%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-4-2c727eeb-987f-452f-86bd-c2978cc9d8b9-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',57,'2023-12-19 15:18:00.46058-06','2023-12-19 15:18:00.46058-06','www.amazon.com'), + (4504,'Veken 8 Set Packing Cubes for Suitcases, Travel Essentials for Carry on, Luggage Organizer Bags Set for Travel Accessories in 4 Sizes (Extra Large, Large, Medium, Small), Black',NULL,'B0B7BFMHNF','https://m.media-amazon.com/images/I/71hxdVXOB+L._AC_UL320_.jpg',11660,4.7,'$16.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo2MDM4NTQwNjgwNDM5NzE3OjE3MDMwMjA2Nzk6c3Bfc2VhcmNoX3RoZW1hdGljOjMwMDA1OTY1MTc0MTkwMjo6MDo6&url=%2FVeken-Accessories-Essentials-Organizer-Suitcases%2Fdp%2FB0B7BFMHNF%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.d0d6e7d3-c9f1-480b-9f2a-893b95951bfb%253Aamzn1.sym.d0d6e7d3-c9f1-480b-9f2a-893b95951bfb%26cv_ct_cx%3Dtravel%2Baccessories%26keywords%3Dtravel%2Baccessories%26pd_rd_i%3DB0B7BFMHNF%26pd_rd_r%3Dfc81a4a3-ffbf-45bc-a40c-f7499dc39017%26pd_rd_w%3DP2Jkb%26pd_rd_wg%3DBZfdF%26pf_rd_p%3Dd0d6e7d3-c9f1-480b-9f2a-893b95951bfb%26pf_rd_r%3DEEX4P84285A70Z1M14Y4%26qid%3D1703020679%26sbo%3DTc8eqSFhUl4VwMzbE4fw%252Fw%253D%253D%26sr%3D1-1-2c727eeb-987f-452f-86bd-c2978cc9d8b9-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',57,'2023-12-19 15:18:00.442216-06','2023-12-19 15:18:00.476126-06','www.amazon.com'), + (4597,'kakoya Flameless LED Candles with Timer 5 Pc Flickering Flameless Candles for Romantic Ambiance and Home Decoration Durable Acrylic Shell,with Embedded Star String,Battery Operated Candles(Grey)',NULL,'B0BXCYHTGN','https://m.media-amazon.com/images/I/71OGdS2e7ML._AC_UL320_.jpg',540,4.3,'$27.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/kakoya-Flickering-Decoration-String%EF%BC%8CBattery-Candles%EF%BC%88Grey%EF%BC%89/dp/B0BXCYHTGN/ref=sr_1_1?keywords=decoration&qid=1703020694&sr=8-1',58,'2023-12-19 15:18:16.049094-06','2023-12-19 15:18:16.049094-06','www.amazon.com'), + (4503,'Fosmon Digital Luggage Scale (2 Pack), LCD Display Backlight Temperature Baggage Scale w/ 110lbs Capacity, Portable Stainless Steel Hanging Luggage Weight Scale w/ Tare Function for Travelers - Silver',NULL,'B01N5QP2I9','https://m.media-amazon.com/images/I/71ILFTShsiL._AC_UL320_.jpg',2620,4.7,'$16.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo2MDM4NTQwNjgwNDM5NzE3OjE3MDMwMjA2Nzk6c3Bfc2VhcmNoX3RoZW1hdGljOjIwMDE2OTYwOTU1OTU5ODo6NDo6&url=%2FDigital-Fosmon-Backlight-Temperature-Function%2Fdp%2FB01N5QP2I9%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.d0d6e7d3-c9f1-480b-9f2a-893b95951bfb%253Aamzn1.sym.d0d6e7d3-c9f1-480b-9f2a-893b95951bfb%26cv_ct_cx%3Dtravel%2Baccessories%26keywords%3Dtravel%2Baccessories%26pd_rd_i%3DB01N5QP2I9%26pd_rd_r%3Dfc81a4a3-ffbf-45bc-a40c-f7499dc39017%26pd_rd_w%3DP2Jkb%26pd_rd_wg%3DBZfdF%26pf_rd_p%3Dd0d6e7d3-c9f1-480b-9f2a-893b95951bfb%26pf_rd_r%3DEEX4P84285A70Z1M14Y4%26qid%3D1703020679%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-5-2c727eeb-987f-452f-86bd-c2978cc9d8b9-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',57,'2023-12-19 15:18:00.434489-06','2023-12-19 15:18:00.465691-06','www.amazon.com'), + (4508,'Electronic Organizer Travel USB Cable Accessories Bag/Case,Waterproof for Power Bank,Charging Cords,Chargers,Mouse ,Earphones Flash Drive',NULL,'B08YZ633BY','https://m.media-amazon.com/images/I/81i0r0ZKd7L._AC_UL320_.jpg',5596,4.4,'$6.94','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Electronic-Organizer-Accessories-Waterproof-Earphones/dp/B08YZ633BY/ref=sr_1_7?keywords=travel+accessories&qid=1703020679&sr=8-7',57,'2023-12-19 15:18:00.471024-06','2023-12-19 15:18:00.471024-06','www.amazon.com'), + (4509,'BAGSMART Toiletry Bag Travel Bag with Hanging Hook, Water-resistant Makeup Cosmetic Bag Travel Organizer for Accessories, Shampoo, Full-size Container, Toiletries',NULL,'B07SL2X217','https://m.media-amazon.com/images/I/71OALypQqJL._AC_UL320_.jpg',50631,4.8,'$22.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Water-resistant-Organizer-Accessories-Container-Toiletries/dp/B07SL2X217/ref=sr_1_9?keywords=travel+accessories&qid=1703020679&sr=8-9',57,'2023-12-19 15:18:00.484103-06','2023-12-19 15:18:00.484103-06','www.amazon.com'), + (4510,'MiiKARE Airplane Travel Essentials Phone Holder, Universal Handsfree Phone Mount for Flying with 360 Degree Rotation, Accessory for Airplane, Travel Must Haves Phone Stand for Desk, Tray Table',NULL,'B07MYW7C3Z','https://m.media-amazon.com/images/I/61xHQoosSAL._AC_UL320_.jpg',4867,4.5,'$12.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/MiiKARE-Universal-Rotating-Adjustable-Compatible/dp/B07MYW7C3Z/ref=sr_1_10?keywords=travel+accessories&qid=1703020679&sr=8-10',57,'2023-12-19 15:18:00.489706-06','2023-12-19 15:18:00.489706-06','www.amazon.com'), + (4514,'Poo-Pourri Before-You-Go Toilet Spray, Original Citrus, Travel Size 10 mL - Lemon, Bergamot and Lemongrass, 0.34 Fl Oz (Pack of 1)',NULL,'B07CN6ZDVY','https://m.media-amazon.com/images/I/51-TSawxo4L._AC_UL320_.jpg',99936,4.7,'$4.59','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Poo-Pourri-Before-You-Go-Toilet-Travel-Original/dp/B07CN6ZDVY/ref=sr_1_16?keywords=travel+accessories&qid=1703020679&sr=8-16',57,'2023-12-19 15:18:00.51345-06','2023-12-19 15:18:00.51345-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4512,'Passport Holder Cover Wallet Travel Essentials Leather Travel Wallet Rfid Blocking Case Vacation Travel Must Haves Travel Accessories for Men Women (2#Brown)',NULL,'B09DTD4XJG','https://m.media-amazon.com/images/I/81jJTx3fcLL._AC_UL320_.jpg',7133,4.7,'$9.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3NDA4MjkzNzE0NTk4NzE3OjE3MDMwMjA2Nzk6c3BfbXRmOjIwMDE2NjExMzU3MDI5ODo6MDo6&url=%2FPassport-Vaccine-Holder-Leather-Blocking%2Fdp%2FB09DTD4XJG%2Fref%3Dsr_1_14_sspa%3Fkeywords%3Dtravel%2Baccessories%26qid%3D1703020679%26sr%3D8-14-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',57,'2023-12-19 15:18:00.502013-06','2023-12-19 15:18:07.998321-06','www.amazon.com'), + (4511,'NISHEL Travel Toiletry Bag for women, Portable Hanging Organizer for Full-Sized Shampoo, Conditioner, Brushes Set, Travel-Size Accessories, Pink',NULL,'B08JPKFYPG','https://m.media-amazon.com/images/I/71G3TAmEQHL._AC_UL320_.jpg',10588,4.8,'$22.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3NDA4MjkzNzE0NTk4NzE3OjE3MDMwMjA2Nzk6c3BfbXRmOjIwMDA1ODk3Nzc5MjA5ODo6MDo6&url=%2FNISHEL-Organizer-Full-Sized-Conditioner-Accessories%2Fdp%2FB08JPKFYPG%2Fref%3Dsr_1_11_sspa%3Fkeywords%3Dtravel%2Baccessories%26qid%3D1703020679%26sr%3D8-11-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',57,'2023-12-19 15:18:00.495379-06','2023-12-19 15:18:08.064398-06','www.amazon.com'), + (4519,'Sensyne 60" Phone Tripod & Selfie Stick, Lightweight All in One Phone Tripod Integrated with Wireless Remote Compatible with All Cell Phones for Selfie/Video Recording/Photo/Live Stream/Vlog(Black)',NULL,'B0BD7VTXN3','https://m.media-amazon.com/images/I/61zOhjOHX6L._AC_UL320_.jpg',3193,4.6,'$29.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3NDA4MjkzNzE0NTk4NzE3OjE3MDMwMjA2Nzk6c3BfbXRmOjIwMDE3NzE2NTQ3MDY5ODo6MDo6&url=%2FLightweight-Integrated-Wireless-Compatible-Recording%2Fdp%2FB0BD7VTXN3%2Fref%3Dsr_1_20_sspa%3Fkeywords%3Dtravel%2Baccessories%26qid%3D1703020679%26sr%3D8-20-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',57,'2023-12-19 15:18:00.544453-06','2023-12-19 15:18:08.059229-06','www.amazon.com'), + (4516,'INIU Portable Charger, Slimmest 10000mAh 5V/3A Power Bank, USB C in&out High-Speed Charging Battery Pack, External Phone Powerbank Compatible with iPhone 15 14 13 12 11 Samsung S22 S21 Google iPad etc',NULL,'B07CZDXDG8','https://m.media-amazon.com/images/I/51AOZq9HhEL._AC_UL320_.jpg',84743,4.6,'$19.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/INIU-High-Speed-Flashlight-Powerbank-Compatible/dp/B07CZDXDG8/ref=sr_1_17?keywords=travel+accessories&qid=1703020679&sr=8-17',57,'2023-12-19 15:18:00.525725-06','2023-12-19 15:18:00.525725-06','www.amazon.com'), + (4517,'Etekcity Luggage Scale, Travel Essentials, Digital Weight Scales for Travel Accessories, Portable Handheld Scale with Temperature Sensor, Rubber Paint, 110 Pounds, Battery Included, Blue',NULL,'B082LYC2TN','https://m.media-amazon.com/images/I/81TfNMQ2H8L._AC_UL320_.jpg',20407,4.7,'$10.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Etekcity-Portable-Handheld-Suitcase-Temperature/dp/B082LYC2TN/ref=sr_1_18?keywords=travel+accessories&qid=1703020679&sr=8-18',57,'2023-12-19 15:18:00.532169-06','2023-12-19 15:18:00.532169-06','www.amazon.com'), + (4518,'SAUNORCH Universal International Travel Power Adapter W/High Speed 2.4A USB-A, 3.0A Type-C Wall Charger, European Adapter, Worldwide AC Outlet Plugs Adapters for Europe, UK, US, AU, Asia-Green',NULL,'B07H98ZQYJ','https://m.media-amazon.com/images/I/61FawSKxrNL._AC_UL320_.jpg',3503,4.6,'$19.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3NDA4MjkzNzE0NTk4NzE3OjE3MDMwMjA2Nzk6c3BfbXRmOjIwMDA1MDA3MjgyNzQ5ODo6MDo6&url=%2FSAUNORCH-Universal-International-Worldwide-Asia-Green%2Fdp%2FB07H98ZQYJ%2Fref%3Dsr_1_19_sspa%3Fkeywords%3Dtravel%2Baccessories%26qid%3D1703020679%26sr%3D8-19-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',57,'2023-12-19 15:18:00.538271-06','2023-12-19 15:18:00.538271-06','www.amazon.com'), + (4520,'Packing Cubes for Travel-Extra Large Luggage Organizers 7 Piece Set-Ultralight, Expandable/Compression Bags for Clothes by TRIPPED Travel Gear (National Parks)',NULL,'B09PC9GZ5D','https://m.media-amazon.com/images/I/91kR-9Sy-hL._AC_UL320_.jpg',1738,4.6,'$54.95','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3NDA4MjkzNzE0NTk4NzE3OjE3MDMwMjA2Nzk6c3BfbXRmOjIwMDA1MjU1NDk5NDI5ODo6MDo6&url=%2FTravel-Extra-Set-Ultralight-TRIPPED-Travel-Gear%2Fdp%2FB09PC9GZ5D%2Fref%3Dsr_1_21_sspa%3Fkeywords%3Dtravel%2Baccessories%26qid%3D1703020679%26sr%3D8-21-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',57,'2023-12-19 15:18:00.550989-06','2023-12-19 15:18:00.550989-06','www.amazon.com'), + (4521,'Telena Travel Toiletry Bag for Women, Toiletry Bag Travel Bag with Hanging Hook, Water-resistant Makeup Organizer, Cosmetic Bag Travel Accessories, Beige with Brown',NULL,'B0B96ZLHPK','https://m.media-amazon.com/images/I/71lqcRj+IqL._AC_UL320_.jpg',85,4.6,'$39.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3NDA4MjkzNzE0NTk4NzE3OjE3MDMwMjA2Nzk6c3BfbXRmOjMwMDAxOTkwNjc3NTkwMjo6MDo6&url=%2FTelena-Toiletry-Water-resistant-Organizer-Accessories%2Fdp%2FB0B96ZLHPK%2Fref%3Dsr_1_22_sspa%3Fkeywords%3Dtravel%2Baccessories%26qid%3D1703020679%26sr%3D8-22-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',57,'2023-12-19 15:18:00.558128-06','2023-12-19 15:18:00.558128-06','www.amazon.com'), + (4598,'FANTESTICRYAN Small Birds Statues Gold Home Decor Modern Style Figurine Decorative Ornaments for Living Room, Bedroom, Office Desktop, Cabinets',NULL,'B07SPKC554','https://m.media-amazon.com/images/I/71SKqRaBtwL._AC_UL320_.jpg',7050,4.7,'$13.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Fantastic-Ryan-Decorative-Originality-Furnishing/dp/B07SPKC554/ref=sr_1_2?keywords=decoration&qid=1703020694&sr=8-2',58,'2023-12-19 15:18:16.059135-06','2023-12-19 15:18:16.059135-06','www.amazon.com'), + (4522,'TRANOMOS 8 Pack Silicone Bottle Covers, Travel Essentials for Women Men, Travel Size Toiletries, Cruise Ship Essentials, Accessories Luggage, Travel Must Haves, Elastic Sleeves for Leak Proofing',NULL,'B0BQ7PD5YW','https://m.media-amazon.com/images/I/61bAV7VnIZL._AC_UL320_.jpg',1343,4.3,'$7.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Proofing-Silicone-Accessories-Toiletries-Container/dp/B0BQ7PD5YW/ref=sr_1_23?keywords=travel+accessories&qid=1703020679&sr=8-23',57,'2023-12-19 15:18:00.564747-06','2023-12-19 15:18:00.564747-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4523,'Airplane Travel Essentials for Flying Flex Flap Cell Phone Holder & Flexible Tablet Stand for Desk, Bed, Treadmill, Home & in-Flight Airplane Travel Accessories - Travel Must Haves Cool Gadgets',NULL,'B07VJZ6YF6','https://m.media-amazon.com/images/I/91dAiGftDyL._AC_UL320_.jpg',4793,4.5,'$11.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Flight-Airplane-Accessories-Gadgets-Universal/dp/B07VJZ6YF6/ref=sr_1_25?keywords=travel+accessories&qid=1703020679&sr=8-25',57,'2023-12-19 15:18:00.571005-06','2023-12-19 15:18:00.571005-06','www.amazon.com'), + (4524,'Colgate Max Fresh Wisp Disposable Mini Travel Toothbrushes, Peppermint, 24 Count (Pack of 4)',NULL,'B071DPCBQG','https://m.media-amazon.com/images/I/81LR8rKCuXL._AC_UL320_.jpg',32296,4.7,'$17.92','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Colgate-Fresh-Disposable-Toothbrush-Peppermint/dp/B071DPCBQG/ref=sr_1_26?keywords=travel+accessories&qid=1703020679&sr=8-26',57,'2023-12-19 15:18:00.577126-06','2023-12-19 15:18:00.577126-06','www.amazon.com'), + (4526,'KAYZON Travel Mini Perfume Refillable Atomizer Container, Portable Perfume Scent Pump Case Fragrance Empty Spray Bottle for Traveling and Outgoing (3 Pack, 5ml) (3 Pcs)',NULL,'B09DYN6SYR','https://m.media-amazon.com/images/I/51PNOzxhILL._AC_UL320_.jpg',6452,4.3,'$5.79','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Refillable-Atomizer-Container-Fragrance-Traveling/dp/B09DYN6SYR/ref=sr_1_28?keywords=travel+accessories&qid=1703020679&sr=8-28',57,'2023-12-19 15:18:00.589623-06','2023-12-19 15:18:00.589623-06','www.amazon.com'), + (4528,'HOMEST 2 Pack XL Wash Me Travel Laundry Bag, Dirty Clothes Organizer, Large Enough to Hold 4 Loads of Laundry, Easy Fit a Laundry Hamper or Basket',NULL,'B07LCH3XN7','https://m.media-amazon.com/images/I/71z6zyZgWSS._AC_UL320_.jpg',17950,4.7,'$9.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/HOMEST-Travel-Laundry-Clothes-Organizer/dp/B07LCH3XN7/ref=sr_1_31?keywords=travel+accessories&qid=1703020679&sr=8-31',57,'2023-12-19 15:18:00.601395-06','2023-12-19 15:18:00.601395-06','www.amazon.com'), + (4529,'Travel Makeup Mirror with 10X Magnifying Mirror, Vanity Mirror with 80LEDs, 3 Color Lighting, Rechargeable 2000mAh Batteries, Portable Ultra Slim Lighted Makeup Mirror, Travel Essential for Women',NULL,'B0B7X8CWZM','https://m.media-amazon.com/images/I/51q667bfW6L._AC_UL320_.jpg',4695,4.4,'$20.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Magnifying-Lighting-Rechargeable-Batteries-Essentials/dp/B0B7X8CWZM/ref=sr_1_32?keywords=travel+accessories&qid=1703020679&sr=8-32',57,'2023-12-19 15:18:00.607694-06','2023-12-19 15:18:00.607694-06','www.amazon.com'), + (4530,'Hiearcool Waterproof Phone Pouch, Waterproof Phone Case for iPhone 15 14 13 12 Pro Max XS Samsung, IPX8 Cellphone Dry Bag Beach Essentials 2Pack-8.3"',NULL,'B079HV3TC9','https://m.media-amazon.com/images/I/61JkEouNSAL._AC_UL320_.jpg',92416,4.6,'$9.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Hiearcool-Waterproof-Phone-Pouch-Underwater-2/dp/B079HV3TC9/ref=sr_1_33?keywords=travel+accessories&qid=1703020679&sr=8-33',57,'2023-12-19 15:18:00.61336-06','2023-12-19 15:18:00.61336-06','www.amazon.com'), + (4527,'Airplane Foot Hammock (Memory Foam), Perfect Airplane Footrest to Relax Your Feet | Foot Hammock for Airplane Travel Accessories, Desk Foot Hammock, Travel Foot Rest, Comfy Foot Hanger Airplane',NULL,'B07SK6ZFLM','https://aax-us-iad.amazon.com/e/loi/imp?b=JHK6LkLZ6jbPdkxONCWpLdoAAAGMg_FvBQEAAAH2AQBvbm9fdHhuX2JpZDIgICBvbm9fdHhuX2ltcDEgICCsG4ks',3736,4.1,'$14.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/airplane-footrest-foot-hammock-travel-essentials-rest/dp/B07SK6ZFLM/ref=sr_1_29?keywords=travel+accessories&qid=1703020679&sr=8-29',57,'2023-12-19 15:18:00.595564-06','2023-12-19 15:18:08.168693-06','www.amazon.com'), + (4531,'Twelve South AirFly SE, Premium Bluetooth Wireless Audio Transmitter for AirPods or Wireless Headphones - Use with Any 3.5 mm Audio Jack for In-Flight, TV, Gym and Tablets, White, 1" by 4"',NULL,'B0BQZBMXD4','https://m.media-amazon.com/images/I/51HhyUqXImL._AC_UL320_.jpg',1987,4.4,'$34.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Twelve-South-Transmitter-Noise-Cancelling-Headphones/dp/B0BQZBMXD4/ref=sr_1_34?keywords=travel+accessories&qid=1703020679&sr=8-34',57,'2023-12-19 15:18:00.618878-06','2023-12-19 15:18:00.618878-06','www.amazon.com'), + (4532,'Gorilla Grip 6 Piece Packing Cubes Set, Compression Space Saving Organizers for Suitcases and Luggage, Mesh Window Bags, Travel Essentials for Carry On, Clothes and Shoes, Cube with Zipper, Turquoise',NULL,'B0B9YRY9MW','https://m.media-amazon.com/images/I/81t0ioHcCPL._AC_UL320_.jpg',1279,4.5,'$16.94','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Gorilla-Grip-Organizer-Lightweight-Suitcases/dp/B0B9YRY9MW/ref=sr_1_35?keywords=travel+accessories&qid=1703020679&sr=8-35',57,'2023-12-19 15:18:00.624476-06','2023-12-19 15:18:00.624476-06','www.amazon.com'), + (4533,'BAGSMART Electronics Organizer Travel Case, Small Cable Organizer Bag for Travel Essentials, Travel Tech Organizer as Travel Accessories, Cord Organizer for Phone, Power Bank, SD Card, Black',NULL,'B017SKRWL4','https://m.media-amazon.com/images/I/715h98AKwDL._AC_UL320_.jpg',5207,4.6,'$14.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/BAGSMART-Universal-Organizer-Electronics-Accessories/dp/B017SKRWL4/ref=sr_1_37?keywords=travel+accessories&qid=1703020679&sr=8-37',57,'2023-12-19 15:18:00.629903-06','2023-12-19 15:18:00.629903-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4534,'Miamica Foldable Travel Laundry Bag, Grey & Gold – Measures 21” x 22” When Fully Opened – Foldable Laundry Bag with Drawstring Closure – Durable, Lightweight Travel Accessories',NULL,'B06XP9TPKS','https://m.media-amazon.com/images/I/51dHy8CWTGL._AC_UL320_.jpg',5060,4.7,'$10.70','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Miamica-Laundry-Assorted-Styles-Grey/dp/B06XP9TPKS/ref=sr_1_39?keywords=travel+accessories&qid=1703020679&sr=8-39',57,'2023-12-19 15:18:00.635425-06','2023-12-19 15:18:00.635425-06','www.amazon.com'), + (4535,'YAMIU Travel Shoe Bags Set of 4 Waterproof Nylon with Zipper for Men & Women, Black',NULL,'B01N4B7C9X','https://m.media-amazon.com/images/I/71FsEUFT1jL._AC_UL320_.jpg',10190,4.7,'$12.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/YAMIU-Travel-Waterproof-Nylon-Zipper/dp/B01N4B7C9X/ref=sr_1_40?keywords=travel+accessories&qid=1703020679&sr=8-40',57,'2023-12-19 15:18:00.641054-06','2023-12-19 15:18:00.641054-06','www.amazon.com'), + (4536,'Travel Adapter, Universal All in One Worldwide Travel Adapter Power Converters Wall Charger AC Power Plug Adapter with Dual USB Charging Ports for USA EU UK AUS Black',NULL,'B01FO4W5W2','https://m.media-amazon.com/images/I/51TObDkKtCL._AC_UL320_.jpg',7864,4.5,'$9.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/NEWVANGA-International-Universal-Worldwide-Charging/dp/B01FO4W5W2/ref=sr_1_41?keywords=travel+accessories&qid=1703020679&sr=8-41',57,'2023-12-19 15:18:00.646703-06','2023-12-19 15:18:00.646703-06','www.amazon.com'), + (4537,'2 Pcs Luggage Tags, Fintie Privacy Cover ID Label with Stainless Steel Loop and Address Card for Travel Bag Suitcase',NULL,'B0969MLLDJ','https://m.media-amazon.com/images/I/81M8ugDMh5S._AC_UL320_.jpg',5456,4.8,'$9.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Luggage-Fintie-Privacy-Stainless-Suitcase/dp/B0969MLLDJ/ref=sr_1_42?keywords=travel+accessories&qid=1703020679&sr=8-42',57,'2023-12-19 15:18:00.652219-06','2023-12-19 15:18:00.652219-06','www.amazon.com'), + (4538,'OlarHike 8 Set Packing Cubes for Travel, 4 Various Sizes(Extra Large,Large,Medium,Small), Luggage Organizer Bags for Travel Accessories Travel Essentials, Travel Cubes for Carry on Suitcases (Cream)',NULL,'B0BGWZN7MV','https://m.media-amazon.com/images/I/71gl8WnTZUL._AC_UL320_.jpg',1102,4.6,'$24.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/OlarHike-Organizer-Accessories-Essentials-Suitcases/dp/B0BGWZN7MV/ref=sr_1_43?keywords=travel+accessories&qid=1703020679&sr=8-43',57,'2023-12-19 15:18:00.657603-06','2023-12-19 15:18:00.657603-06','www.amazon.com'), + (4539,'EACHY Travel Makeup Bag,Large Capacity Cosmetic Bags for Women,Waterproof Portable Pouch Open Flat Toiletry Bag Make up Organizer with Divider and Handle (Brown, Medium)',NULL,'B0BRR6Q2ZD','https://m.media-amazon.com/images/I/61eLxA1uvyL._AC_UL320_.jpg',1134,4.6,'$23.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/EACHY-Capacity-Cosmetic-Waterproof-Organizer/dp/B0BRR6Q2ZD/ref=sr_1_44?keywords=travel+accessories&qid=1703020679&sr=8-44',57,'2023-12-19 15:18:00.663325-06','2023-12-19 15:18:00.663325-06','www.amazon.com'), + (4540,'Zuihug 1Pack Travel Pill Organizer - 10 Compartments Pill Case, Compact and Portable Pill Box, Perfect for On-The-Go Storage, Pill Holder for Purse Gray',NULL,'B0C5R981CT','https://m.media-amazon.com/images/I/61THQCBMSyL._AC_UL320_.jpg',1509,4.7,'$3.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Zuihug-1Pack-Travel-Pill-Organizer/dp/B0C5R981CT/ref=sr_1_45?keywords=travel+accessories&qid=1703020679&sr=8-45',57,'2023-12-19 15:18:00.668545-06','2023-12-19 15:18:00.668545-06','www.amazon.com'), + (4541,'Dot&Dot Twist Memory Foam Travel Pillow for Neck, Chin, Lumbar and Leg Support - Neck Pillows for Sleeping Travel Airplane for Side, Stomach and Back Sleepers - Adjustable, Bendable Roll Pillow',NULL,'B01IEJHJWK','https://m.media-amazon.com/images/I/81Ah56ih4RL._AC_UL320_.jpg',13921,4.3,'$24.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Memory-Travel-Pillow-Lumbar-Support/dp/B01IEJHJWK/ref=sr_1_46?keywords=travel+accessories&qid=1703020679&sr=8-46',57,'2023-12-19 15:18:00.673819-06','2023-12-19 15:18:00.673819-06','www.amazon.com'), + (4542,'Portable Door Lock Travel Hotel Safety: Hotel Door Locks for Travelers, Home Apartment Security Locker from Inside Room Bedroom Women Travel Gifts Traveler Stocking Stuffers Traveling Essentials',NULL,'B09VJZYC9R','https://m.media-amazon.com/images/I/71cTJiUTBBL._AC_UL320_.jpg',1163,4.3,'$8.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Portable-Door-Lock-Home-Security/dp/B09VJZYC9R/ref=sr_1_47?keywords=travel+accessories&qid=1703020679&sr=8-47',57,'2023-12-19 15:18:00.679714-06','2023-12-19 15:18:00.679714-06','www.amazon.com'), + (4543,'Travel Duffel Bag, Sports Tote Gym Bag, Shoulder Weekender Overnight Bag for Women',NULL,'B07YS438FV','https://m.media-amazon.com/images/I/71+g-qsSOsS._AC_UL320_.jpg',28701,4.7,'$24.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Travel-Duffel-Sports-Shoulder-pink8/dp/B07YS438FV/ref=sr_1_48?keywords=travel+accessories&qid=1703020679&sr=8-48',57,'2023-12-19 15:18:00.68561-06','2023-12-19 15:18:00.68561-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4515,'Airplane Pockets Airplane Tray Table Cover | Seat Back Organizer & Storage for Personal Items | Clean, Convenient, Expandable Pockets | Sanitary Travel Essentials for Flying | Media Pouch',NULL,'B07WCXP7CH','https://m.media-amazon.com/images/I/41OA6TuCShL._AC_UL320_.jpg',1228,4.6,'$29.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.comhttps://aax-us-iad.amazon.com/x/c/RFnpOi1begJYlPJ5dN-qofQAAAGMg_FQxQEAAAH2AQBvbm9fdHhuX2JpZDIgICBvbm9fdHhuX2ltcDEgICBdJoe4/https://www.amazon.com/Airplane-Pockets-Tray-Cover-Compartments/dp/B07WCXP7CH/ref=sxin_23_sbv_search_btf?content-id=amzn1.sym.6ca944f8-539c-499e-a3a4-26a566d1de59%3Aamzn1.sym.6ca944f8-539c-499e-a3a4-26a566d1de59&cv_ct_cx=travel+accessories&keywords=travel+accessories&pd_rd_i=B07WCXP7CH&pd_rd_r=fc81a4a3-ffbf-45bc-a40c-f7499dc39017&pd_rd_w=4R5vH&pd_rd_wg=BZfdF&pf_rd_p=6ca944f8-539c-499e-a3a4-26a566d1de59&pf_rd_r=EEX4P84285A70Z1M14Y4&qid=1703020679&sbo=RZvfv%2F%2FHxDF%2BO5021pAnSA%3D%3D&sr=1-1-5190daf0-67e3-427c-bea6-c72c1df98776',57,'2023-12-19 15:18:00.519875-06','2023-12-19 15:18:00.691967-06','www.amazon.comhttps:'), + (4544,'TRODANCE Mini Jewelry Travel Case, Small, Portable Organizer Portable Display Storage Box For Rings Earrings Necklaces Gifts (Blue)',NULL,'B09631PYPT','https://m.media-amazon.com/images/I/61wNYT8kuKL._AC_UL320_.jpg',4884,4.5,'$7.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Organizer-Portable-Earrings-Necklaces-TRODANCE/dp/B09631PYPT/ref=sr_1_51?keywords=travel+accessories&qid=1703020679&sr=8-51',57,'2023-12-19 15:18:00.698733-06','2023-12-19 15:18:00.698733-06','www.amazon.com'), + (4545,'Compression Bags - Travel Accessories - 10 Pack Space Saver Bags - No Vacuum or Pump Needed - Vacuum Storage Bags for Travel Essentials - Home Packing-Organizers (Blue)',NULL,'B09MQJPXPG','https://m.media-amazon.com/images/I/617Y4QZta6L._AC_UL320_.jpg',1956,4.2,'$14.97','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Compression-Bags-Travel-Accessories-Packing-Organizers/dp/B09MQJPXPG/ref=sr_1_52?keywords=travel+accessories&qid=1703020679&sr=8-52',57,'2023-12-19 15:18:00.704661-06','2023-12-19 15:18:00.704661-06','www.amazon.com'), + (4546,'Perilogics Universal Airplane in Flight Phone Mount. Handsfree Phone Holder for Desk with Multi-Directional Dual 360 Degree Rotation. Pocket Size Travel Essential Accessory for Flying',NULL,'B09PLGHRJD','https://m.media-amazon.com/images/I/71g0YoOizBL._AC_UL320_.jpg',15913,4.5,'$13.97','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Universal-Handsfree-Multi-Directional-Rotation-Essential/dp/B09PLGHRJD/ref=sr_1_53?keywords=travel+accessories&qid=1703020679&sr=8-53',57,'2023-12-19 15:18:00.710528-06','2023-12-19 15:18:00.710528-06','www.amazon.com'), + (4547,'LISEN Tablet iPad Holder for Car Mount Headrest iPad Car Holder Back Seat Travel Accessories Car Tablet Holder Mount Road Trip Essentials for Kids Adults Fits All 4.7-12.9" Devices & Headrest Rod',NULL,'B09FDRGP6T','https://m.media-amazon.com/images/I/81f-svkg9jL._AC_UL320_.jpg',4977,4.6,'$17.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/LISEN-Headrest-Companion-Rotation-4-7-12-9/dp/B09FDRGP6T/ref=sr_1_55?keywords=travel+accessories&qid=1703020679&sr=8-55',57,'2023-12-19 15:18:00.716751-06','2023-12-19 15:18:00.716751-06','www.amazon.com'), + (4548,'Toiletry Bag for Men, Travel Essentials Travel Toiletry Bag, Water-Resistant Compact Bathroom Roll Organizer for Hygiene, Shaving kit, Gifts for men (5.Army Green(Polyster))',NULL,'B0B7RRL2BJ','https://m.media-amazon.com/images/I/81giHyDSRML._AC_UL320_.jpg',732,4.3,'$19.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Toiletry-Bag-Travel-Dopp-Kit-Organizer-Accessories/dp/B0B7RRL2BJ/ref=sr_1_57?keywords=travel+accessories&qid=1703020679&sr=8-57',57,'2023-12-19 15:18:00.722915-06','2023-12-19 15:18:00.722915-06','www.amazon.com'), + (4549,'Universal Travel Adapter, Redagod International Adaptor 4 USB A 1 USB C Ports, AC Power Plug Adapter All-in-one Travel Charger Outlet Converter for Europe UK AUS Asia Japan Covers 200+Countries',NULL,'B0BY85CTKG','https://m.media-amazon.com/images/I/61NklwYRSoL._AC_UL320_.jpg',866,4.8,'$18.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Universal-Redagod-International-Converter-Countries/dp/B0BY85CTKG/ref=sr_1_58?keywords=travel+accessories&qid=1703020679&sr=8-58',57,'2023-12-19 15:18:00.728372-06','2023-12-19 15:18:00.728372-06','www.amazon.com'), + (4550,'BEVA 4FT Travel Power Strip with USB C Ports, Non Surge Protector with Flat Plug Travel Extension Cord, 2 Outlets 3 USB Ports(1 USB C), Office Organizer Cruise Travel Essentials(Black 3.4A)',NULL,'B0BNDGSXS4','https://m.media-amazon.com/images/I/617vG87qwIL._AC_UL320_.jpg',1085,4.7,'$14.39','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Travel-Protector-Extension-Outlets-Essentials/dp/B0BNDGSXS4/ref=sr_1_59?keywords=travel+accessories&qid=1703020679&sr=8-59',57,'2023-12-19 15:18:00.734399-06','2023-12-19 15:18:00.734399-06','www.amazon.com'), + (4551,'12 Travel Compression Bags Vacuum Packing, Roll Up Space Saver Bags for Luggage, Cruise Ship Essentials (5 Large /5 Medium/2 Small Roll)',NULL,'B0BBGDFH4V','https://m.media-amazon.com/images/I/71W2tt9VPbL._AC_UL320_.jpg',52044,4.3,'$12.79','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/12-Travel-Compression-Packing-Essentials/dp/B0BBGDFH4V/ref=sr_1_60?keywords=travel+accessories&qid=1703020679&sr=8-60',57,'2023-12-19 15:18:00.740086-06','2023-12-19 15:18:00.740086-06','www.amazon.com'), + (4552,'So-Mine Commuter Essential Bag | Attaches to Airline Seat and Car Pocket | Travel Organizer | Slim Profile | 6 Pockets | 2 Cable Loops | 1 Zipper Pocket | Fits on Roller Bag Handle',NULL,'B082VDWNZS','https://aax-us-iad.amazon.com/e/loi/imp?b=JLxzjd4kMQlUciga0C7gc6wAAAGMg_FRIgEAAAH2AQBvbm9fdHhuX2JpZDcgICBvbm9fdHhuX2ltcDEgICCvB1nU',616,4.3,'$19.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.comhttps://aax-us-iad.amazon.com/x/c/RLxzjd4kMQlUciga0C7gc6wAAAGMg_FQ3AEAAAH2AQBvbm9fdHhuX2JpZDcgICBvbm9fdHhuX2ltcDEgICCvB1nU/https://www.amazon.com/Commuter-Essential-Organizer-Designed-Accessory/dp/B082VDWNZS/ref=sxbs_sbv_search_btf?content-id=amzn1.sym.e3e25c3f-be9c-4043-8c05-6ebb65e75e4b%3Aamzn1.sym.e3e25c3f-be9c-4043-8c05-6ebb65e75e4b&cv_ct_cx=travel+accessories&keywords=travel+accessories&pd_rd_i=B082VDWNZS&pd_rd_r=944dc33a-f8fc-4a97-9ed1-70b89681ca5e&pd_rd_w=L9WPm&pd_rd_wg=9QfUl&pf_rd_p=e3e25c3f-be9c-4043-8c05-6ebb65e75e4b&pf_rd_r=EEX4P84285A70Z1M14Y4&qid=1703020679&sbo=EO%2BcdOgoisx3waG5xqcZQA%3D%3D&sr=1-1-a61ee601-6e56-4862-a8a2-1d3da5a5406f',57,'2023-12-19 15:18:00.745938-06','2023-12-19 15:18:00.745938-06','www.amazon.comhttps:'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4599,'Eueasy 300 LED Curtain Lights, 9.8ft x 9.8ft Fairy Lights with 8 Modes, String Hanging Lights, Remote Control, Perfect for Indoor/Outdoor Christmas, Wedding, Party Wall Decorations (Warm White)',NULL,'B0CB5Y12QL','https://m.media-amazon.com/images/I/71APWYstKRL._AC_UL320_.jpg',1861,4.4,'$7.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Eueasy-Curtain-Hanging-Christmas-Decorations/dp/B0CB5Y12QL/ref=sr_1_3?keywords=decoration&qid=1703020694&sr=8-3',58,'2023-12-19 15:18:16.067228-06','2023-12-19 15:18:16.067228-06','www.amazon.com'), + (4601,'RUBFAC 65pcs Yellow Latex Balloons, 12 Inches Helium Party Balloons with Ribbon for Wedding, Birthday, Graduation, Baby Shower, Bridal shower',NULL,'B0C9LVL9HH','https://m.media-amazon.com/images/I/619-4kIUgaL._AC_UL320_.jpg',504,4.7,'$5.49','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo1MjkxMTc5MzM5NDIyNzE3OjE3MDMwMjA2OTQ6c3Bfc2VhcmNoX3RoZW1hdGljOjMwMDEwNDg4MjcxNDcwMjo6MDo6&url=%2FRUBFAC-Balloons-Wedding-Birthday-Graduation%2Fdp%2FB0C9LVL9HH%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.d0d6e7d3-c9f1-480b-9f2a-893b95951bfb%253Aamzn1.sym.d0d6e7d3-c9f1-480b-9f2a-893b95951bfb%26cv_ct_cx%3Ddecoration%26keywords%3Ddecoration%26pd_rd_i%3DB0C9LVL9HH%26pd_rd_r%3D82fdd207-347f-4bd6-b48e-15af44e189fe%26pd_rd_w%3DIv4JE%26pd_rd_wg%3DkVq6v%26pf_rd_p%3Dd0d6e7d3-c9f1-480b-9f2a-893b95951bfb%26pf_rd_r%3DX85J8G3W29EVBFJ47BSE%26qid%3D1703020694%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-1-2c727eeb-987f-452f-86bd-c2978cc9d8b9-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',58,'2023-12-19 15:18:16.080355-06','2023-12-19 15:18:16.080355-06','www.amazon.com'), + (4602,'Beistle Wall Decorations 4 Piece Vintage Halloween Party Supplies, 9", Black/Orange',NULL,'B00C69I85M','https://m.media-amazon.com/images/I/711rpXHEwOS._AC_UL320_.jpg',608,4.7,'$6.10','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo1MjkxMTc5MzM5NDIyNzE3OjE3MDMwMjA2OTQ6c3Bfc2VhcmNoX3RoZW1hdGljOjMwMDAxMDg5OTMxOTYwMjo6Mjo6&url=%2FBeistle-4-Pack-Halloween-Cutouts-9-Inch%2Fdp%2FB00C69I85M%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.d0d6e7d3-c9f1-480b-9f2a-893b95951bfb%253Aamzn1.sym.d0d6e7d3-c9f1-480b-9f2a-893b95951bfb%26cv_ct_cx%3Ddecoration%26keywords%3Ddecoration%26pd_rd_i%3DB00C69I85M%26pd_rd_r%3D82fdd207-347f-4bd6-b48e-15af44e189fe%26pd_rd_w%3DIv4JE%26pd_rd_wg%3DkVq6v%26pf_rd_p%3Dd0d6e7d3-c9f1-480b-9f2a-893b95951bfb%26pf_rd_r%3DX85J8G3W29EVBFJ47BSE%26qid%3D1703020694%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-3-2c727eeb-987f-452f-86bd-c2978cc9d8b9-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',58,'2023-12-19 15:18:16.085902-06','2023-12-19 15:18:16.085902-06','www.amazon.com'), + (4600,'Beistle Green Shamrock Cutouts 10 Piece, St Patrick''s Day Decorations, Wall Silhouettes',NULL,'B005DUH7XU','https://m.media-amazon.com/images/I/51PScRXoXgL._AC_UL320_.jpg',236,4.6,'$4.21','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo1MjkxMTc5MzM5NDIyNzE3OjE3MDMwMjA2OTQ6c3Bfc2VhcmNoX3RoZW1hdGljOjIwMDE3OTY1Mjk2Mzc5ODo6Mzo6&url=%2FPkgd-Printed-Shamrock-Cutouts-Pkg%2Fdp%2FB005DUH7XU%2Fref%3Dsxin_14_pa_sp_search_thematic_sspa%3Fcontent-id%3Damzn1.sym.d0d6e7d3-c9f1-480b-9f2a-893b95951bfb%253Aamzn1.sym.d0d6e7d3-c9f1-480b-9f2a-893b95951bfb%26cv_ct_cx%3Ddecoration%26keywords%3Ddecoration%26pd_rd_i%3DB005DUH7XU%26pd_rd_r%3D82fdd207-347f-4bd6-b48e-15af44e189fe%26pd_rd_w%3DIv4JE%26pd_rd_wg%3DkVq6v%26pf_rd_p%3Dd0d6e7d3-c9f1-480b-9f2a-893b95951bfb%26pf_rd_r%3DX85J8G3W29EVBFJ47BSE%26qid%3D1703020694%26sbo%3DRZvfv%252F%252FHxDF%252BO5021pAnSA%253D%253D%26sr%3D1-4-2c727eeb-987f-452f-86bd-c2978cc9d8b9-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM%26psc%3D1',58,'2023-12-19 15:18:16.07436-06','2023-12-19 15:18:16.092557-06','www.amazon.com'), + (4603,'SZELAM Digital Clock Large Display, LED Electric Alarm Clocks Mirror Surface for Makeup with Diming Mode, 3 Levels Brightness, Dual USB Ports Modern Decoration for Home Bedroom Decor-White',NULL,'B07P468RFV','https://m.media-amazon.com/images/I/61+GtiJ4XTL._AC_UL320_.jpg',29361,4.3,'$18.36','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Digital-Electric-Brightness-Decoration-Decor-White/dp/B07P468RFV/ref=sr_1_4?keywords=decoration&qid=1703020694&sr=8-4',58,'2023-12-19 15:18:16.099229-06','2023-12-19 15:18:16.099229-06','www.amazon.com'), + (4604,'Lulu Home Christmas Tabletop Decorations, 2 Packs Resin Golden & White Reindeer Lying Figurines, Xmas Holiday Winter Centerpieces Ornaments for Mantel Shelf Office Home Decor',NULL,'B0C6JTQMPP','https://m.media-amazon.com/images/I/81O+X8ykggL._AC_UL320_.jpg',17,4.9,'$12.59','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Lulu-Home-Christmas-Decorations-Centerpieces/dp/B0C6JTQMPP/ref=sr_1_5?keywords=decoration&qid=1703020694&sr=8-5',58,'2023-12-19 15:18:16.105611-06','2023-12-19 15:18:16.105611-06','www.amazon.com'), + (4605,'Rustic Wall Sconces Mason Jar Sconces Handmade Wall Art Hanging Design with Remote Control LED Fairy Lights and White Peony,Christmas Decor Gift Farmhouse Wall Home Decor Living Room Lights Set of Two',NULL,'B07SSLD42M','https://m.media-amazon.com/images/I/71ck3ge7PYL._AC_UL320_.jpg',20210,4.4,'$36.96','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Sconces-Handmade-Hanging-Farmhouse-Decorations/dp/B07SSLD42M/ref=sr_1_6?keywords=decoration&qid=1703020694&sr=8-6',58,'2023-12-19 15:18:16.112086-06','2023-12-19 15:18:16.112086-06','www.amazon.com'), + (4606,'2 Packs Artificial Hanging Plants with Lights, 3.4 Feet Fake Hanging Plant with Basket, Ivy Vine Fake Leaves LED Copper Wire Lights for Cafe Wall Home Garden Porch Wedding Garland Outside Decoration',NULL,'B0BX8BQ828','https://m.media-amazon.com/images/I/81GaZWFqC7L._AC_UL320_.jpg',138,4.3,'$21.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Artificial-Hanging-Wedding-Garland-Decoration/dp/B0BX8BQ828/ref=sr_1_7?keywords=decoration&qid=1703020694&sr=8-7',58,'2023-12-19 15:18:16.118724-06','2023-12-19 15:18:16.118724-06','www.amazon.com'), + (4607,'GOER 3.2 ft x 9.8 ft Metallic Tinsel Foil Fringe Curtains Party Photo Backdrop Party Streamers for Birthday,Graduation,New Year Eve Decorations Wedding Decor (1 Pack, Gold)',NULL,'B01J9FWFC2','https://m.media-amazon.com/images/I/81lkHyd6DoL._AC_UL320_.jpg',41555,4.5,'$6.49','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/GOER-711176740583-Foil-Fringe-Curtains/dp/B01J9FWFC2/ref=sr_1_8?keywords=decoration&qid=1703020694&sr=8-8',58,'2023-12-19 15:18:16.125524-06','2023-12-19 15:18:16.125524-06','www.amazon.com'), + (4608,'Yatim 78-Ft 12 Pack Silk Artificial Ivy Vines Leaf Garland Plants Hanging Wedding Garland Fake Foliage Flowers Home Kitchen Garden Office Wedding Wall Decor',NULL,'B01CL1R88W','https://m.media-amazon.com/images/I/912OWI9P4NL._AC_UL320_.jpg',12994,4.4,'$11.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Yatim-Artificial-Garland-Hanging-Wedding/dp/B01CL1R88W/ref=sr_1_9?keywords=decoration&qid=1703020694&sr=8-9',58,'2023-12-19 15:18:16.1321-06','2023-12-19 15:18:16.1321-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4609,'Solar Lights for Outside 2 Pack, New Upgraded Solar Garden Lights, Solar Lights Outdoor Waterproof for Garden Decor, Outdoor Solar Lights for Patio Yard Decor, Firefly Garden Lights Solar, Warm White',NULL,'B0BHQT8YJY','https://aax-us-iad.amazon.com/e/loi/imp?b=JPbeSE6Qy2gnm5RbeiO7ebEAAAGMg_GN9gEAAAH2AQBvbm9fdHhuX2JpZDIgICBvbm9fdHhuX2ltcDEgICCr6MNv',1431,4.3,'$15.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.comhttps://aax-us-iad.amazon.com/x/c/RPbeSE6Qy2gnm5RbeiO7ebEAAAGMg_GNtQEAAAH2AQBvbm9fdHhuX2JpZDIgICBvbm9fdHhuX2ltcDEgICCr6MNv/https://www.amazon.com/Firefly-Outdoor-Waterproof-Starburst-Swaying/dp/B0BHQT8YJY/ref=sxin_23_sbv_search_btf?content-id=amzn1.sym.6ca944f8-539c-499e-a3a4-26a566d1de59%3Aamzn1.sym.6ca944f8-539c-499e-a3a4-26a566d1de59&cv_ct_cx=decoration&keywords=decoration&pd_rd_i=B0BHQT8YJY&pd_rd_r=82fdd207-347f-4bd6-b48e-15af44e189fe&pd_rd_w=86RY9&pd_rd_wg=kVq6v&pf_rd_p=6ca944f8-539c-499e-a3a4-26a566d1de59&pf_rd_r=X85J8G3W29EVBFJ47BSE&qid=1703020694&sbo=RZvfv%2F%2FHxDF%2BO5021pAnSA%3D%3D&sr=1-1-5190daf0-67e3-427c-bea6-c72c1df98776',58,'2023-12-19 15:18:16.138811-06','2023-12-19 15:18:16.138811-06','www.amazon.comhttps:'), + (4610,'Dazzle Bright Curtain String Lights, 300 LED 9.8ft x 9.8ft 8 Lighting Modes Fairy Lights USB Powered, Waterproof Lights for Christmas Party Wedding Outdoor Indoor Wall Decorations (White)',NULL,'B092QR6C1Y','https://m.media-amazon.com/images/I/71KsNLXaTZS._AC_UL320_.jpg',3716,4.3,'$9.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Dazzle-Bright-Waterproof-Christmas-Decorations/dp/B092QR6C1Y/ref=sr_1_11?keywords=decoration&qid=1703020694&sr=8-11',58,'2023-12-19 15:18:16.145059-06','2023-12-19 15:18:16.145059-06','www.amazon.com'), + (4611,'Twinkle Star Copper String Lights Fairy String Lights 8 Modes LED String Lights USB Powered with Remote Control for Christmas Tree Wedding Party Home Decoration (Warm White with Remote, 66ft)',NULL,'B087CWJKFF','https://m.media-amazon.com/images/I/81NOvZdps2L._AC_UL320_.jpg',35387,4.5,'$10.66','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Twinkle-Star-Firefly-Christmas-Decorations/dp/B087CWJKFF/ref=sr_1_12?keywords=decoration&qid=1703020694&sr=8-12',58,'2023-12-19 15:18:16.151799-06','2023-12-19 15:18:16.151799-06','www.amazon.com'), + (4320,'Twinkle Star 1.8FT Lighted Pop Up Christmas Penguin Decorations, Pre-Lit Light Up 50 LED Warm White Lights, Collapsible Easily Metal Stand Easy-Assembly Reusable for Holiday Xmas Indoor Outdoor Decor',NULL,'B0C73FFLKV','https://m.media-amazon.com/images/I/71SZEWvbKuL._AC_UL320_.jpg',723,4.2,'$24.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Twinkle-Star-Christmas-Penguin-Decorations/dp/B0C73FFLKV/ref=sr_1_50?keywords=outdoor&qid=1703020517&sr=8-50',55,'2023-12-19 15:15:18.809235-06','2023-12-19 15:18:16.158007-06','www.amazon.com'), + (4612,'OuMuaMua 15pcs Winter Christmas Hanging Snowflake Decorations, 3D Holographic Snowflakes for Christmas Winter Wonderland Decorations Frozen Birthday New Year Party Home Decorations',NULL,'B098NN2HQP','https://m.media-amazon.com/images/I/8145FCDbKRL._AC_UL320_.jpg',4014,4.3,'$9.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Christmas-Decorations-Holographic-Snowflakes-Wonderland/dp/B098NN2HQP/ref=sr_1_14?keywords=decoration&qid=1703020694&sr=8-14',58,'2023-12-19 15:18:16.164409-06','2023-12-19 15:18:16.164409-06','www.amazon.com'), + (4613,'Dried Pampas Grass Decor, 100 PCS Pampas Grass Contains Bunny Tails Dried Flowers, Reed Grass Bouquet for Wedding Boho Flowers Home Table Decor, Rustic Farmhouse Party (White and Brown)',NULL,'B09H5JZC97','https://m.media-amazon.com/images/I/7173mks7XtL._AC_UL320_.jpg',5437,4.6,'$13.98','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Contains-Flowers-Bouquet-Wedding-Farmhouse/dp/B09H5JZC97/ref=sr_1_15?keywords=decoration&qid=1703020694&sr=8-15',58,'2023-12-19 15:18:16.170774-06','2023-12-19 15:18:16.170774-06','www.amazon.com'), + (4614,'SAOROPEB 3D Butterfly Wall Decor 48 Pcs 4 Styles 3 Sizes, Gold Butterfly Decorations for Butterfly Birthday Decorations Butterfly Party Decorations Cake Decorations, Removable Stickers (Gold)',NULL,'B095P43V29','https://m.media-amazon.com/images/I/81ryUOLchIS._AC_UL320_.jpg',13346,4.6,'$6.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Butterfly-Stickers-Removable-Decoration-Classroom/dp/B095P43V29/ref=sr_1_16?keywords=decoration&qid=1703020694&sr=8-16',58,'2023-12-19 15:18:16.177076-06','2023-12-19 15:18:16.177076-06','www.amazon.com'), + (4615,'Sonicism 12 Pack Pyramid Sound Proof Foam Panels with Self-Adhesive, 12" X 12" X 2" Acoustic Foam Panels of High Density, Soundproof Wall Panels Fast Expand, Sound Absorption and Decoration (Black)',NULL,'B0BRTVW9LC','https://m.media-amazon.com/images/I/81U1sV-CP6L._AC_UL320_.jpg',503,4.3,'$28.79','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3NTYyMDU3NTU5NDcxNzoxNzAzMDIwNjk0OnNwX210ZjoyMDAxMzA5MDYyOTkyOTg6OjA6Og&url=%2FSonicism-Self-Adhesive-Soundproof-Absorption-Decoration%2Fdp%2FB0BRTVW9LC%2Fref%3Dsr_1_17_sspa%3Fkeywords%3Ddecoration%26qid%3D1703020694%26sr%3D8-17-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',58,'2023-12-19 15:18:16.184235-06','2023-12-19 15:18:16.184235-06','www.amazon.com'), + (4616,'kakoya Flameless LED Candles with Timer 5 Pc Flickering Flameless Candles for Romantic Ambiance and Home Decoration Durable Acrylic Shell,with Embedded Star String,Battery Operated Candles(Red)',NULL,'B0C45GLB2H','https://m.media-amazon.com/images/I/61J4ODuDxbL._AC_UL320_.jpg',540,4.3,'$27.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3NTYyMDU3NTU5NDcxNzoxNzAzMDIwNjk0OnNwX210ZjozMDAxMDE1NDIyMTExMDI6OjA6Og&url=%2Fkakoya-Flickering-Decoration-String%25EF%25BC%258CBattery-Candles%25EF%25BC%2588Red%25EF%25BC%2589%2Fdp%2FB0C45GLB2H%2Fref%3Dsr_1_18_sspa%3Fkeywords%3Ddecoration%26qid%3D1703020694%26sr%3D8-18-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',58,'2023-12-19 15:18:16.191007-06','2023-12-19 15:18:16.191007-06','www.amazon.com'), + (4617,'Solar Lanterns Outdoor Hanging Lantern Lights,Sun Moon Metal Decor Lanterns-Waterproof LED Decorative Light for Garden Patio Yard Lawn Backyard Front Porch as Gifts for Mom Grandma Women',NULL,'B0C2H87XPX','https://m.media-amazon.com/images/I/81Ryv6i+9KL._AC_UL320_.jpg',1462,4.4,'$29.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3NTYyMDU3NTU5NDcxNzoxNzAzMDIwNjk0OnNwX210ZjozMDAxMDM2OTkyOTk3MDI6OjA6Og&url=%2FLanterns-Outdoor-Lanterns-Waterproof-Decorative-Backyard%2Fdp%2FB0C2H87XPX%2Fref%3Dsr_1_19_sspa%3Fkeywords%3Ddecoration%26qid%3D1703020694%26sr%3D8-19-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',58,'2023-12-19 15:18:16.197504-06','2023-12-19 15:18:16.197504-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4618,'AWQ 200 LED 66 FT Copper Wire String Lights 8 Modes LED Fairy String Lights USB Powered with Remote Control for Christmas Tree Wedding Party Home Decoration',NULL,'B08B5YQ77B','https://m.media-amazon.com/images/I/81Jt8m7tT-L._AC_UL320_.jpg',120,4.4,'$7.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3NTYyMDU3NTU5NDcxNzoxNzAzMDIwNjk0OnNwX210ZjoyMDAwMzI1NDI3OTY5NzE6OjA6Og&url=%2FAWQ-Powered-Control-Christmas-Decoration%2Fdp%2FB08B5YQ77B%2Fref%3Dsr_1_20_sspa%3Fkeywords%3Ddecoration%26qid%3D1703020694%26sr%3D8-20-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',58,'2023-12-19 15:18:16.204203-06','2023-12-19 15:18:16.204203-06','www.amazon.com'), + (4619,'110 PCS Dried Pampas Grass Bouquet, Boho Table Decor, Bunny Tails Dried Flowers, Brown Pompas, White Pampas Grass for Wedding, Home, Rustic Party, Baby Shower Decorations',NULL,'B0B1975JYZ','https://m.media-amazon.com/images/I/719aYPPyi6L._AC_UL320_.jpg',1553,4.6,'$15.48','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Pampas-Bouquet-Flowers-Wedding-Decorations/dp/B0B1975JYZ/ref=sr_1_21?keywords=decoration&qid=1703020694&sr=8-21',58,'2023-12-19 15:18:16.211019-06','2023-12-19 15:18:16.211019-06','www.amazon.com'), + (4620,'Twinkle Star 300 LED Window Curtain String Lights Wedding Party Home Garden Bedroom Outdoor Indoor Wall Decorations, Warm White',NULL,'B01LLSNG1E','https://m.media-amazon.com/images/I/81SeihZDOGL._AC_UL320_.jpg',96892,4.6,'$19.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Twinkle-Window-Curtain-String-Light/dp/B01LLSNG1E/ref=sr_1_22?keywords=decoration&qid=1703020694&sr=8-22',58,'2023-12-19 15:18:16.216917-06','2023-12-19 15:18:16.216917-06','www.amazon.com'), + (4621,'JMEXSUSS 300 LED Remote Control Christmas Curtain Lights, Plug in Fairy Curtain Lights Outdoor, Window Wall Hanging Curtain String Lights for Bedroom Backdrop Wedding Party Indoor Decor, Warm White',NULL,'B07CJ2V1LR','https://m.media-amazon.com/images/I/81zc2fRn1pL._AC_UL320_.jpg',11079,4.6,'$20.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/JMEXSUSS-Decorative-Linkable-Christmas-Birthday/dp/B07CJ2V1LR/ref=sr_1_24?keywords=decoration&qid=1703020694&sr=8-24',58,'2023-12-19 15:18:16.224274-06','2023-12-19 15:18:16.224274-06','www.amazon.com'), + (4622,'CWLWGO-Ceramic Matte Vase for Home Decor, Modern and Minimalist Decorative Vase Set. Farmhouse Living Room Tabletop, Bookshelf Decoration, Centerpiece Table Decor,Boho Decor.(Matte Multi)',NULL,'B09Q2CR55L','https://m.media-amazon.com/images/I/51qq7qPvKhL._AC_UL320_.jpg',745,4.7,'$26.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3NTYyMDU3NTU5NDcxNzoxNzAzMDIwNjk0OnNwX210ZjoyMDAwNDAxNDc1NjYyOTg6OjA6Og&url=%2FCeramic-CwlwGO-Decorative-Kitchen-Decor-%25EF%25BC%2588Multicolor%25EF%25BC%2589%2Fdp%2FB09Q2CR55L%2Fref%3Dsr_1_25_sspa%3Fkeywords%3Ddecoration%26qid%3D1703020694%26sr%3D8-25-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',58,'2023-12-19 15:18:16.231613-06','2023-12-19 15:18:16.231613-06','www.amazon.com'), + (4623,'AWQ 12 Stars 138 LEDs Fairy Lights Star String Lights Star Curtain Lights 8 Modes for Christmas Wedding Home Garden Bedroom Indoor Outdoor',NULL,'B08GP72CS2','https://m.media-amazon.com/images/I/81ft8EZH8DL._AC_UL320_.jpg',47,4.3,'$17.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3NTYyMDU3NTU5NDcxNzoxNzAzMDIwNjk0OnNwX210ZjoyMDAwMzk0MDc3ODY5NzE6OjA6Og&url=%2FAWQ-Curtain-Christmas-Wedding-Bedroom%2Fdp%2FB08GP72CS2%2Fref%3Dsr_1_26_sspa%3Fkeywords%3Ddecoration%26qid%3D1703020694%26sr%3D8-26-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',58,'2023-12-19 15:18:16.238945-06','2023-12-19 15:18:16.238945-06','www.amazon.com'), + (4624,'Hisow Orchids Artificial Flowers, 15" Faux Orchid in Gold Flower Pot Real Touch Flowers in Pot Large Flower Arrangements Artificial Centerpiece for Home Living Room Bathroom Kitchen Decoration (White)',NULL,'B09ZL8WDYN','https://m.media-amazon.com/images/I/716Uoy1Gq8L._AC_UL320_.jpg',102,3.9,'$32.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3NTYyMDU3NTU5NDcxNzoxNzAzMDIwNjk0OnNwX210ZjozMDAwMTAwNjcxNDEyMDI6OjA6Og&url=%2FHisow-Artificial-Arrangements-Centerpiece-Decoration%2Fdp%2FB09ZL8WDYN%2Fref%3Dsr_1_27_sspa%3Fkeywords%3Ddecoration%26qid%3D1703020694%26sr%3D8-27-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',58,'2023-12-19 15:18:16.245647-06','2023-12-19 15:18:16.245647-06','www.amazon.com'), + (4625,'YL Crafts - Resin Rhino Head Sculpture Animal Wall Decoration (Red)',NULL,'B01KQ46JNG','https://m.media-amazon.com/images/I/41U5Te4qc4L._AC_UL320_.jpg',3,3.2,'$74.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3NTYyMDU3NTU5NDcxNzoxNzAzMDIwNjk0OnNwX210ZjoyMDAxMjYwMTMxNTYxOTg6OjA6Og&url=%2FYL-Crafts-Resin-Sculpture-Animal%2Fdp%2FB01KQ46JNG%2Fref%3Dsr_1_28_sspa%3Fkeywords%3Ddecoration%26qid%3D1703020694%26sr%3D8-28-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',58,'2023-12-19 15:18:16.252011-06','2023-12-19 15:18:16.252011-06','www.amazon.com'), + (4626,'yinupet 48 Pieces Christams Party Hanging Swirl Set Decorations Xmas Hanging Swirl for Home Birthday Party Supplies',NULL,'B0CG5GTX3Z','https://m.media-amazon.com/images/I/81ks4V5mSiL._AC_UL320_.jpg',2,5.0,'$9.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/yinupet-Christams-Decorations-Birthday-Supplies/dp/B0CG5GTX3Z/ref=sr_1_29?keywords=decoration&qid=1703020694&sr=8-29',58,'2023-12-19 15:18:16.259433-06','2023-12-19 15:18:16.259433-06','www.amazon.com'), + (4627,'Winter Tiered Tray Decor Set Snowflake Snowman Gnome Wood Sign Beaded Garland Christmas Tier Tray Bundle Rustic Home Table Decoration Wooden Plaque for Shelf Kitchen Tabletop (Grey Snowflake Gnome)',NULL,'B0CLFZ9S51','https://m.media-amazon.com/images/I/81dPqAgw7uL._AC_UL320_.jpg',7,4.2,'$11.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Snowflake-Snowman-Christmas-Decoration-Tabletop/dp/B0CLFZ9S51/ref=sr_1_31?keywords=decoration&qid=1703020694&sr=8-31',58,'2023-12-19 15:18:16.265884-06','2023-12-19 15:18:16.265884-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4628,'NURADA Flickering Flameless Candles: Acrylic LED Pillar Candles Battery Operated with Remote and Timer Imitation Glass Candle for Home Table Bathroom Decor, Gray, Pack of 5 (D 3"×H 4" 5" 6" 8" 8")',NULL,'B0BFX4SC26','https://m.media-amazon.com/images/I/71xeRyRR20L._AC_UL320_.jpg',386,4.6,'$25.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3NTYyMDU3NTU5NDcxNzoxNzAzMDIwNjk0OnNwX210ZjozMDAwODk0NzkzNTg0MDI6OjA6Og&url=%2FNURADA-Flickering-Flameless-Candles-Imitation%2Fdp%2FB0BFX4SC26%2Fref%3Dsr_1_34_sspa%3Fkeywords%3Ddecoration%26qid%3D1703020694%26sr%3D8-34-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',58,'2023-12-19 15:18:16.273519-06','2023-12-19 15:18:16.273519-06','www.amazon.com'), + (4629,'HMASYO 12Pcs Large 3D Butterfly Party Decorations with Pearls - 12inch 2 Layer Big Paper Butterflies Set Comes in 2 Sizes Giant Butterfly Wall Decor for Birthday, Baby Shower, Nursery, Wedding',NULL,'B0C26SKHSB','https://m.media-amazon.com/images/I/61L3NxeWiBL._AC_UL320_.jpg',40,4.6,'$15.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3NTYyMDU3NTU5NDcxNzoxNzAzMDIwNjk0OnNwX210ZjoyMDAxNzE2MzgxMjQyOTg6OjA6Og&url=%2FHMASYO-12Pcs-Butterfly-Decorations-Pearls%2Fdp%2FB0C26SKHSB%2Fref%3Dsr_1_35_sspa%3Fkeywords%3Ddecoration%26qid%3D1703020694%26sr%3D8-35-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',58,'2023-12-19 15:18:16.280551-06','2023-12-19 15:18:16.280551-06','www.amazon.com'), + (4630,'Wokceer Sequin Shimmer Wall Backdrop 24 Panels Rainbow Square Sequin Backdrops for Party Decorations Birthday Wedding & Engagement Anniversary Iridescent Home Decor',NULL,'B0B1JGWD8C','https://m.media-amazon.com/images/I/71PcM0qrwuL._AC_UL320_.jpg',65,4.7,'$89.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo3NTYyMDU3NTU5NDcxNzoxNzAzMDIwNjk0OnNwX210ZjozMDAwNjcxNTIxNzI1MDI6OjA6Og&url=%2FBackdrops-Decorations-Engagement-Anniversary-Iridescent%2Fdp%2FB0B1JGWD8C%2Fref%3Dsr_1_36_sspa%3Fkeywords%3Ddecoration%26qid%3D1703020694%26sr%3D8-36-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',58,'2023-12-19 15:18:16.287069-06','2023-12-19 15:18:16.287069-06','www.amazon.com'), + (4631,'Liliful 15 Pcs Velvet Christmas Balls Bulk Flocked Christmas Tree Ball Ornaments Plastic Balls Xmas Decorative Hanging Ornaments Christmas Tree Decoration (Brown, Green, Beige,1.57 Inch)',NULL,'B0CKPK8T6F','https://m.media-amazon.com/images/I/914wrauLPfL._AC_UL320_.jpg',81,3.4,'$15.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Liliful-Christmas-Ornaments-Decorative-Decoration/dp/B0CKPK8T6F/ref=sr_1_38?keywords=decoration&qid=1703020694&sr=8-38',58,'2023-12-19 15:18:16.293893-06','2023-12-19 15:18:16.293893-06','www.amazon.com'), + (4632,'Christmas Window Lights Decorations, 5 pcs LED Lighted Christmas Hanging Lights Santa Claus Xmas Tree Bell Snowman Shaped Battery Operated with Suction Cup Hook for Fireplace Window Indoor Decor',NULL,'B0CB1DFXZF','https://m.media-amazon.com/images/I/812eUiSIRZL._AC_UL320_.jpg',910,4.4,'$9.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Christmas-Decorations-Lighted-Operated-Fireplace/dp/B0CB1DFXZF/ref=sr_1_42?keywords=decoration&qid=1703020694&sr=8-42',58,'2023-12-19 15:18:16.300042-06','2023-12-19 15:18:16.300042-06','www.amazon.com'), + (4633,'Homedics Tabletop Water Fountain, Home Décor Soothing Sound Machine - Automatic Pump, Deep Basin & Natural River Rocks. Indoor Zen Relaxation for Office, Living Room, or Bedroom, 8.25” Tall',NULL,'B000QTUJXS','https://m.media-amazon.com/images/I/815vZaQ9FXL._AC_UL320_.jpg',40167,4.2,'$40.28','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Homedics-Tabletop-Water-Fountain-Soothing/dp/B000QTUJXS/ref=sr_1_44?keywords=decoration&qid=1703020694&sr=8-44',58,'2023-12-19 15:18:16.306755-06','2023-12-19 15:18:16.306755-06','www.amazon.com'), + (4634,'White Ceramic Vase, Modern Vase for Minimalist Decor, Hollow Round Matte Pampas Flower Vases for Boho Home Wedding Party Room Dinner Table Shelf Decor (2pcs)',NULL,'B0BG2NLBMJ','https://m.media-amazon.com/images/I/619i5WhWjNL._AC_UL320_.jpg',685,4.8,'$24.78','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Ceramic-Modern-Minimalist-Hollow-Wedding/dp/B0BG2NLBMJ/ref=sr_1_45?keywords=decoration&qid=1703020694&sr=8-45',58,'2023-12-19 15:18:16.31432-06','2023-12-19 15:18:16.31432-06','www.amazon.com'), + (4635,'ENVEN 108Pcs Merry Christmas Party Decorations Kit - Merry Christmas Banner - MERRY CHRISTMAS Banner, Christmas Hanging Swirls, Christmas Balloons, Christmas Cupcake Toppers, Christmas Stickers for Kids Merry Christmas Decorations Party Supplies',NULL,'B0CB6Q5NSN','https://m.media-amazon.com/images/I/81FndrYew2L._AC_UL320_.jpg',4,5.0,'$7.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/ENVEN-108Pcs-Merry-Christmas-Decorations/dp/B0CB6Q5NSN/ref=sr_1_49?keywords=decoration&qid=1703020694&sr=8-49',58,'2023-12-19 15:18:16.320824-06','2023-12-19 15:18:16.320824-06','www.amazon.com'), + (4340,'UBTKEY Outdoor Christmas Decorations, Decorative Ladder Lights with Climbing Santa Claus on Ladder for Christmas Outside Window Yard Tree Decorations (10ft, Warm White)',NULL,'B0CB8T85NW','https://m.media-amazon.com/images/I/8131QIZbYAL._AC_UL320_.jpg',15,4.4,'$14.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/UBTKEY-Christmas-Decorations-Decorative-Climbing/dp/B0CB8T85NW/ref=sr_1_57?keywords=outdoor&qid=1703020524&sr=8-57',55,'2023-12-19 15:15:25.426085-06','2023-12-19 15:18:16.327671-06','www.amazon.com'), + (4636,'Paersion 2PCS Christmas Gnome Plush Decorations with Xmas Tree and Gift, Handmade Swedish Tomte Santa Christmas Home Tabletop Elf Gnomes Decor Christmas Decorations Ornaments',NULL,'B0CGPL258V','https://m.media-amazon.com/images/I/71pqHuxJGZL._AC_UL320_.jpg',13,4.8,'$9.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Paersion-Christmas-Decorations-Handmade-Ornaments/dp/B0CGPL258V/ref=sr_1_55?keywords=decoration&qid=1703020694&sr=8-55',58,'2023-12-19 15:18:16.333815-06','2023-12-19 15:18:16.333815-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4637,'30Pcs Mini Christmas Trees Artificial Christmas Tree Bottle Brush Trees with Wooden Base for Christmas Decor Christmas Party Home Table Craft Decorations(Green+Silver+White)',NULL,'B0C7QZPGWJ','https://m.media-amazon.com/images/I/81i3daU5ofL._AC_UL320_.jpg',888,4.3,'$16.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Christmas-Artificial-Bottle-Wooden-Decorations/dp/B0C7QZPGWJ/ref=sr_1_56?keywords=decoration&qid=1703020694&sr=8-56',58,'2023-12-19 15:18:16.342757-06','2023-12-19 15:18:16.342757-06','www.amazon.com'), + (4638,'Best Choice Products 3-Piece Large Lighted Christmas Deer Family Set 5Ft Outdoor Yard Decoration with 360 LED Lights, Stakes, Zip Ties - Gold',NULL,'B08L49GJCF','https://m.media-amazon.com/images/I/811d1gxBqiL._AC_UL320_.jpg',2323,4.5,'$149.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Best-Choice-Products-Christmas-Decoration/dp/B08L49GJCF/ref=sr_1_59?keywords=decoration&qid=1703020694&sr=8-59',58,'2023-12-19 15:18:16.350346-06','2023-12-19 15:18:16.350346-06','www.amazon.com'), + (4640,'Ratuor Peacock Statue Garden Decor Metal Peacock Yard Art Decorations Outdoor Sculpture Patio Lawn Ornament,Set of 2',NULL,'B0B99WSQ3M','https://m.media-amazon.com/images/I/81QI3URoILL._AC_UL320_.jpg',32,4.6,'$69.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo0MTQ1NDc1OTA0NzY5NzE3OjE3MDMwMjA3MDE6c3BfYXRmX25leHQ6MjAwMDkzMTMxMDEzMzk4OjowOjo&url=%2FPeacock-Decorations-Outdoor-Sculpture-Ornament%2Fdp%2FB0B99WSQ3M%2Fref%3Dsr_1_49_sspa%3Fkeywords%3Ddecoration%26qid%3D1703020701%26sr%3D8-49-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGZfbmV4dA%26psc%3D1',58,'2023-12-19 15:18:22.793014-06','2023-12-19 15:18:22.793014-06','www.amazon.com'), + (4641,'Leekung African Statue for Home Decoration,African Statues and Sculptures Table top Bookshelf Decor,African Lady Figurines Home Decor Antique Woodstone Color',NULL,'B0912RXYVY','https://m.media-amazon.com/images/I/71d5n19XXdS._AC_UL320_.jpg',346,4.7,'$31.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo0MTQ1NDc1OTA0NzY5NzE3OjE3MDMwMjA3MDE6c3BfYXRmX25leHQ6MjAwMDYzNTU3NjUwMTUxOjowOjo&url=%2FLeekung-Decoration-Sculptures-Bookshelf-Figurines%2Fdp%2FB0912RXYVY%2Fref%3Dsr_1_50_sspa%3Fkeywords%3Ddecoration%26qid%3D1703020701%26sr%3D8-50-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGZfbmV4dA%26psc%3D1',58,'2023-12-19 15:18:22.811128-06','2023-12-19 15:18:22.811128-06','www.amazon.com'), + (4642,'Leekung African Statues and Sculptures for Home Decor,African Figurines Head Statue Decorations for Home,African Art Sculptures Woman Statue Decor for Living Room Antique Black Color',NULL,'B08T7HDXR3','https://m.media-amazon.com/images/I/81m6AfUMN-S._AC_UL320_.jpg',366,4.6,'$34.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo0MTQ1NDc1OTA0NzY5NzE3OjE3MDMwMjA3MDE6c3BfYXRmX25leHQ6MjAwMTc4NzQwNTczMjk4OjowOjo&url=%2FLeekung-African-Sculptures-Figurines-Decorations%2Fdp%2FB08T7HDXR3%2Fref%3Dsr_1_51_sspa%3Fkeywords%3Ddecoration%26qid%3D1703020701%26sr%3D8-51-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGZfbmV4dA%26psc%3D1',58,'2023-12-19 15:18:22.818466-06','2023-12-19 15:18:22.818466-06','www.amazon.com'), + (4643,'ARKENY Valentines Day Table Runner 13x72 Inches, Heart Love Seasonal Farmhouse Burlap Red Buffalo Plaid Indoor Kitchen Dining Table Decorations for Home Party AT342-72',NULL,'B0BL38C42K','https://m.media-amazon.com/images/I/815TqMnB9KL._AC_UL320_.jpg',60,4.6,'$9.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo0MTQ1NDc1OTA0NzY5NzE3OjE3MDMwMjA3MDE6c3BfYXRmX25leHQ6MzAwMDk4MjAwMzY2OTAyOjowOjo&url=%2FARKENY-Valentines-Decorations-Farmhouse-Gathering%2Fdp%2FB0BL38C42K%2Fref%3Dsr_1_52_sspa%3Fkeywords%3Ddecoration%26qid%3D1703020701%26sr%3D8-52-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9hdGZfbmV4dA%26psc%3D1',58,'2023-12-19 15:18:22.825513-06','2023-12-19 15:18:22.825513-06','www.amazon.com'), + (4644,'52Ft White and Gold Heart Garland Hanging Love Heart Streamer Banner for Anniversary Bachelorette Valentines Day Mothers Fathers Day Engagement Wedding Bridal Shower Birthday Party Decoration Supplies',NULL,'B092L9NC97','https://m.media-amazon.com/images/I/81QLJVv+XgL._AC_UL320_.jpg',596,4.6,'$12.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Anniversary-Bachelorette-Engagement-Valentines-Decorations/dp/B092L9NC97/ref=sr_1_53?keywords=decoration&qid=1703020701&sr=8-53',58,'2023-12-19 15:18:22.832146-06','2023-12-19 15:18:22.832146-06','www.amazon.com'), + (4645,'Liliful 30 Pcs Christmas Candy Ornament Set Plastic Peppermint Candy Cane Christmas Decorations Christmas Candy Lollipop Ornament Xmas Hanging Lollipop Pattern Decorations with Rope (Red White)',NULL,'B0CFKDSC7G','https://m.media-amazon.com/images/I/819K37hwErL._AC_UL320_.jpg',20,4.2,'$23.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Liliful-Christmas-Ornament-Peppermint-Decorations/dp/B0CFKDSC7G/ref=sr_1_55?keywords=decoration&qid=1703020701&sr=8-55',58,'2023-12-19 15:18:22.839855-06','2023-12-19 15:18:22.839855-06','www.amazon.com'), + (4646,'MEHOFOND 7x5ft Merry Christmas Backdrop Ugly Sweater Party Photography Background Xmas Black Sweater Red and Green Snowflake Party Banner Decorations Photo Booth Props',NULL,'B0CC96NC93','https://m.media-amazon.com/images/I/71f4K9t7HOL._AC_UL320_.jpg',6,5.0,'$9.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/MEHOFOND-Christmas-Photography-Background-Decorations/dp/B0CC96NC93/ref=sr_1_56?keywords=decoration&qid=1703020701&sr=8-56',58,'2023-12-19 15:18:22.846802-06','2023-12-19 15:18:22.846802-06','www.amazon.com'), + (4647,'Sound Activated Party Lights with Remote Control Dj Lighting, Disco Ball Strobe Lamp 7 Modes Stage Light for Home Room Dance Parties Birthday Halloween Christmas Decorations Stocking Stuffers',NULL,'B06WVB8P3B','https://m.media-amazon.com/images/I/71G4t-Vi4cL._AC_UL320_.jpg',39712,4.5,'$9.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Activated-Control-Lighting-Parties-Birthday/dp/B06WVB8P3B/ref=sr_1_57?keywords=decoration&qid=1703020701&sr=8-57',58,'2023-12-19 15:18:22.852873-06','2023-12-19 15:18:22.852873-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4648,'ALLYORS 6 PCS Christmas Silverware Holder, Christmas Dinner Table Decorations, Xmas Party Dinner Table Dinnerware Decorations Supplies Flatware Decor',NULL,'B0C5X1QD2Q','https://m.media-amazon.com/images/I/71-II2WJEtL._AC_UL320_.jpg',31,4.7,'$5.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/ALLYORS-Christmas-Silverware-Decorations-Dinnerware/dp/B0C5X1QD2Q/ref=sr_1_59?keywords=decoration&qid=1703020701&sr=8-59',58,'2023-12-19 15:18:22.86023-06','2023-12-19 15:18:22.86023-06','www.amazon.com'), + (4649,'PEIDUO Christmas Decorations, 2FT Birch Tree with LED Lights, Warm White Light up Tree Lamp, Fairy Light Spirit Tree for Xmas Indoor Home Table Fireplace Decor, Battery Powered, 6H/18H Timer (2PK)',NULL,'B07X7H7C7V','https://m.media-amazon.com/images/I/815J6iwv5gL._AC_UL320_.jpg',3935,4.5,'$25.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Padoo-Battery-Powered-Decoration-Wedding/dp/B07X7H7C7V/ref=sr_1_63?keywords=decoration&qid=1703020701&sr=8-63',58,'2023-12-19 15:18:22.871177-06','2023-12-19 15:18:22.871177-06','www.amazon.com'), + (4651,'80s 90s 50s Party Decorations 80''s 90''s 50''s Party Bundle Includes Inflatable Radio Boombox and Mobile Phone, Back to 80s 90s 50s Backdrop, Tablecloth, 75 Pcs Balloons for Hip Hop Party (80s Style)',NULL,'B09BVV2SFF','https://m.media-amazon.com/images/I/91J+0xLW79L._AC_UL320_.jpg',968,4.6,'$25.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo0MTQ1NDc1OTA0NzY5NzE3OjE3MDMwMjA3MDE6c3BfbXRmOjIwMDEzNDM2NzQ1ODE5ODo6MDo6&url=%2FDecorations-Inflatable-Backdrop-Tablecloth-Balloons%2Fdp%2FB09BVV2SFF%2Fref%3Dsr_1_66_sspa%3Fkeywords%3Ddecoration%26qid%3D1703020701%26sr%3D8-66-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',58,'2023-12-19 15:18:22.885553-06','2023-12-19 15:18:22.885553-06','www.amazon.com'), + (4652,'Leekung Buddha Statue for Home Decor,Buddah Statute Zen Decoration,Meditation Buddha Decor Brown 7 inch',NULL,'B09FLNGFPP','https://m.media-amazon.com/images/I/71SH6xVdy5L._AC_UL320_.jpg',570,4.7,'$19.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo0MTQ1NDc1OTA0NzY5NzE3OjE3MDMwMjA3MDE6c3BfbXRmOjIwMDA5MjI5NzE0MDE1MTo6MDo6&url=%2FLeekung-Buddah-Statute-Buddha-Statue%2Fdp%2FB09FLNGFPP%2Fref%3Dsr_1_68_sspa%3Fkeywords%3Ddecoration%26qid%3D1703020701%26sr%3D8-68-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',58,'2023-12-19 15:18:22.892998-06','2023-12-19 15:18:22.892998-06','www.amazon.com'), + (4653,'YJ Fake Flowers with Vase, Silk Roses Artificial Flowers in Vase, Faux Flower Arrangement with Vase Suitable for Home Office Decoration, Dining Table Centerpiece(White)',NULL,'B093DDBMT5','https://m.media-amazon.com/images/I/71T5o5Lq8yL._AC_UL320_.jpg',1985,4.5,'$26.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Flowers-Artificial-Arrangement-Suitable-Decoration/dp/B093DDBMT5/ref=sr_1_70?keywords=decoration&qid=1703020701&sr=8-70',58,'2023-12-19 15:18:22.899273-06','2023-12-19 15:18:22.899273-06','www.amazon.com'), + (4654,'Iridescent Star Moon Circle Dot Garland Party Decoration Kit Hanging Crescent and Twinkle Little Star Streamer Bunting Banner for Kids First Birthday Ramadan EID Mubarak Baby Shower Wedding Decor',NULL,'B09223S6ZX','https://m.media-amazon.com/images/I/81e3JRzN2dS._AC_UL320_.jpg',2060,4.6,'$12.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Iridescent-Decoration-Crescent-Streamer-Birthday/dp/B09223S6ZX/ref=sr_1_72?keywords=decoration&qid=1703020701&sr=8-72',58,'2023-12-19 15:18:22.906126-06','2023-12-19 15:18:22.906126-06','www.amazon.com'), + (4655,'Pooqla LED Marquee Letter Lights Golden, Light Up Glitter Letter Sign Night Light for Girls Gifts Birthday Wedding Bedroom Christmas Party Decoration, Gold Y',NULL,'B0C46BPJ1R','https://m.media-amazon.com/images/I/71LzXCIlIfL._AC_UL320_.jpg',24,4.5,'$12.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo0MTQ1NDc1OTA0NzY5NzE3OjE3MDMwMjA3MDE6c3BfbXRmOjMwMDAwMjA3NzcwMTYwMjo6MDo6&url=%2FPooqla-Marquee-Birthday-Christmas-Decoration%2Fdp%2FB0C46BPJ1R%2Fref%3Dsr_1_73_sspa%3Fkeywords%3Ddecoration%26qid%3D1703020701%26sr%3D8-73-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',58,'2023-12-19 15:18:22.912543-06','2023-12-19 15:18:22.912543-06','www.amazon.com'), + (4656,'Norcalway Rose in Glass Dome Beauty and The Beast Rose - Rose in a Glass Mom Gifts Birthday Gifts Wedding Anniversary Decorations - Glass Rose | Rose with Dome | Rose Glass Dome - Glass Rose Gift',NULL,'B09PDWXHWN','https://m.media-amazon.com/images/I/71woLuc0L7L._AC_UL320_.jpg',348,4.7,'$27.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo0MTQ1NDc1OTA0NzY5NzE3OjE3MDMwMjA3MDE6c3BfbXRmOjIwMDEwODYzNjk5ODM5ODo6MDo6&url=%2FNorcalway-Daughter-Son-Husband-Anniversary%2Fdp%2FB09PDWXHWN%2Fref%3Dsr_1_74_sspa%3Fkeywords%3Ddecoration%26qid%3D1703020701%26sr%3D8-74-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',58,'2023-12-19 15:18:22.919138-06','2023-12-19 15:18:22.919138-06','www.amazon.com'), + (4657,'Leekung Owl Figurines Home Decor Accents - Shelf Decor Accents Owl Statues Home Decor for Shelves Decorations Bookshelf Decor Owls Decor Sculptures Bookcase Decor Living Room Office Gift for Women',NULL,'B0BQMM8K52','https://m.media-amazon.com/images/I/81VFqcOyMEL._AC_UL320_.jpg',661,4.7,'$14.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo0MTQ1NDc1OTA0NzY5NzE3OjE3MDMwMjA3MDE6c3BfbXRmOjMwMDA5NjAzOTg5NDcwMjo6MDo6&url=%2FLeekung-Figurines-Home-Decor-Accents%2Fdp%2FB0BQMM8K52%2Fref%3Dsr_1_75_sspa%3Fkeywords%3Ddecoration%26qid%3D1703020701%26sr%3D8-75-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',58,'2023-12-19 15:18:22.927012-06','2023-12-19 15:18:22.927012-06','www.amazon.com'), + (4658,'sugutee Good Luck Elephant Decor for Home, Large Gold Elephant Statue for Home Decor, Small Elephant Figurines and Statues (2 Pcs Medium)',NULL,'B094HBHL9Y','https://m.media-amazon.com/images/I/71xBGftng0S._AC_UL320_.jpg',582,4.7,'$43.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/sspa/click?ie=UTF8&spc=MTo0MTQ1NDc1OTA0NzY5NzE3OjE3MDMwMjA3MDE6c3BfbXRmOjMwMDA3NTE3MzQ3ODkwMjo6MDo6&url=%2FSUGUTEE-Elephant-Decorations-Figurines-Statues%2Fdp%2FB094HBHL9Y%2Fref%3Dsr_1_76_sspa%3Fkeywords%3Ddecoration%26qid%3D1703020701%26sr%3D8-76-spons%26sp_csd%3Dd2lkZ2V0TmFtZT1zcF9tdGY%26psc%3D1',58,'2023-12-19 15:18:22.933919-06','2023-12-19 15:18:22.933919-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4659,'Reindeer decoration Reindeer cake Christmas cake top decoration Reindeer cake top eyelashes nose ears Easter Christmas Halloween party cake emoji',NULL,'B0CM3FR8V6','https://m.media-amazon.com/images/I/718NiW8yuyL._AC_UL320_.jpg',1,5.0,'$9.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Reindeer-decoration-Christmas-eyelashes-Halloween/dp/B0CM3FR8V6/ref=sr_1_82?keywords=decoration&qid=1703020701&sr=8-82',58,'2023-12-19 15:18:22.941256-06','2023-12-19 15:18:22.941256-06','www.amazon.com'), + (4660,'57pcs Christmas Window Clings Gingerbread Christmas Decorations Ginger Bread Man Mouse Castle Snowflake Xmas Decor Merry Christmas Decals for Windows Christmas Office Home Gingerbread Decorations',NULL,'B0CL341FKR','https://m.media-amazon.com/images/I/71qYoETxUdL._AC_UL320_.jpg',8,3.9,'$9.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Christmas-Gingerbread-Decorations-Snowflake-Windows/dp/B0CL341FKR/ref=sr_1_83?keywords=decoration&qid=1703020701&sr=8-83',58,'2023-12-19 15:18:22.948067-06','2023-12-19 15:18:22.948067-06','www.amazon.com'), + (4661,'Beeveer 6 Pcs Christmas Table Decorations Christmas Table Top Centerpieces Vintage Wooden Retro Christmas Decor Snowman Deer Tree Santa Table Sign Ornaments for Xmas Winter Holiday Dinner Party',NULL,'B0CHFCJ946','https://m.media-amazon.com/images/I/81IU0B2kd8L._AC_UL320_.jpg',4,5.0,'$9.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Beeveer-Christmas-Decorations-Centerpieces-Ornaments/dp/B0CHFCJ946/ref=sr_1_87?keywords=decoration&qid=1703020701&sr=8-87',58,'2023-12-19 15:18:22.955214-06','2023-12-19 15:18:22.955214-06','www.amazon.com'), + (4662,'ZERODECO Party Decoration, 21 Pcs Multi-color Hanging Paper Fans, Pom Poms Flowers, Garlands String Polka Dot and Triangle Bunting Flags for Birthday Parties, Wedding Décor, Fiesta or Mexican Party',NULL,'B07HB1GGRV','https://m.media-amazon.com/images/I/819JiFbPnlL._AC_UL320_.jpg',11994,4.6,'$13.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Zerodeco-Decoration-Multi-color-Garlands-Triangle/dp/B07HB1GGRV/ref=sr_1_88?keywords=decoration&qid=1703020701&sr=8-88',58,'2023-12-19 15:18:22.961469-06','2023-12-19 15:18:22.961469-06','www.amazon.com'), + (4663,'Decor365 Glitter Champagne Gold Decorations Paper Circle Dots Garland Party Streamers Bunting Backdrop Hanging Decor Banner/Wedding/Bachelorette/Bridal Shower/Christmas/New Year/Home/Engagement/',NULL,'B07RV4H826','https://m.media-amazon.com/images/I/71km0XNHqSL._AC_UL320_.jpg',3191,4.7,'$12.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Champagne-Decorations-Streamers-Bachelorette-Engagement/dp/B07RV4H826/ref=sr_1_89?keywords=decoration&qid=1703020701&sr=8-89',58,'2023-12-19 15:18:22.967999-06','2023-12-19 15:18:22.967999-06','www.amazon.com'), + (4664,'Dfilio Christmas Decorations Outside, 10ft Christmas Decorative Ladder Lights with Santa Claus and Remote Control, Village Tree Sets for Indoor Outdoor, Window, Garden, Home, Wall, Xmas(Warm White)',NULL,'B0CJJ89RMC','https://m.media-amazon.com/images/I/81dPOMuc-DL._AC_UL320_.jpg',25,4.4,'$16.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Dfilio-Christmas-Decorations-Outside-Decorative/dp/B0CJJ89RMC/ref=sr_1_90?keywords=decoration&qid=1703020701&sr=8-90',58,'2023-12-19 15:18:22.975016-06','2023-12-19 15:18:22.975016-06','www.amazon.com'), + (4665,'4Pcs Grinchmas Decor for Christmas Tree, Funny Christmas Tree Ornament, Thief Stole Tree Topper Head Arms and Legs for Holiday Xmas Decoration',NULL,'B0CPL57STD','https://m.media-amazon.com/images/I/81DdDeXv6yL._AC_UL320_.jpg',46,4.5,'$7.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Grinchmas-Christmas-Ornament-Holiday-Decoration/dp/B0CPL57STD/ref=sr_1_93?keywords=decoration&qid=1703020701&sr=8-93',58,'2023-12-19 15:18:22.981902-06','2023-12-19 15:18:22.981902-06','www.amazon.com'), + (4666,'Whaline 10Pcs Christmas Snowflake Honeycomb Centerpieces Winter Wonderland Tabletop Signs Blue Silver Tiered Tray Decor for Birthday Christmas Frozen Party Decorations Supplies',NULL,'B0CJY6DMWJ','https://m.media-amazon.com/images/I/81ckcLO+2YL._AC_UL320_.jpg',2,4.5,'$8.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Whaline-Christmas-Centerpieces-Wonderland-Decorations/dp/B0CJY6DMWJ/ref=sr_1_95?keywords=decoration&qid=1703020701&sr=8-95',58,'2023-12-19 15:18:22.988951-06','2023-12-19 15:18:22.988951-06','www.amazon.com'), + (4667,'8Pcs Christmas Tree Decorations, Christmas Party Yard Signs with Stakes Decor for Christmas Tree or Garden Lawn Outdoor Decor Whoville Decorations Xmas Party Supplies Garland Decor Yard Signs',NULL,'B0CHRBSZPX','https://m.media-amazon.com/images/I/81ak3s8lisL._AC_UL320_.jpg',9,3.4,'$6.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Christmas-Decorations-Outdoor-Whoville-Supplies/dp/B0CHRBSZPX/ref=sr_1_96?keywords=decoration&qid=1703020701&sr=8-96',58,'2023-12-19 15:18:22.996301-06','2023-12-19 15:18:22.996301-06','www.amazon.com'), + (4668,'Christmas LED Glass Flameless Candles with Remote and Timer, Real Wax Battery Operated Candles Warm Color Flickering Light for Festival Home Party Decor(Pack of 3)-White',NULL,'B0CJY9NYQL','https://m.media-amazon.com/images/I/81OQJ4czwSL._AC_UL320_.jpg',2426,4.6,'$25.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Christmas-Flameless-Operated-Flickering-Festival/dp/B0CJY9NYQL/ref=sr_1_97?keywords=decoration&qid=1703020701&sr=8-97',58,'2023-12-19 15:18:23.0029-06','2023-12-19 15:18:23.0029-06','www.amazon.com'); +INSERT INTO public.product (id,title,description,product_key,image_url,total_reviews,rating,price,currency,modified,url,category_id,created_at,updated_at,origin) VALUES + (4669,'Led Flood Light 300W Equivalent 3000 LM, Outdoor Color Changing Led Stage Landscape Lights, Bluetooth RGBW Smart Floodlights 2700K & 16 Million Colors&Timing& Music Sync, IP66,US 3-Plug (2 Pack)',NULL,'B07W6SHBV5','https://m.media-amazon.com/images/I/51UP5j+awcL._AC_UL320_.jpg',8854,4.4,'$39.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Equivalent-Landscape-Bluetooth-Floodlights-Waterproof/dp/B07W6SHBV5/ref=sr_1_99?keywords=decoration&qid=1703020701&sr=8-99',58,'2023-12-19 15:18:23.010284-06','2023-12-19 15:18:23.010284-06','www.amazon.com'), + (4670,'Penn-Plax Spongebob Squarepants Officially Licensed Aquarium Ornament – Squidward’s Easter Island Home – Medium',NULL,'B0026H1O00','https://m.media-amazon.com/images/I/813amADOV5L._AC_UL320_.jpg',3882,4.6,'$6.30','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Penn-Plax-Spongebob-Squarepants-Officially-Licensed/dp/B0026H1O00/ref=sr_1_100?keywords=decoration&qid=1703020701&sr=8-100',58,'2023-12-19 15:18:23.016689-06','2023-12-19 15:18:23.016689-06','www.amazon.com'), + (4671,'Christmas Inflatable Santa Claus, 4ft Christmas Window Decorations Outdoor Indoor Blow Up Santa Claus, Build-in LED Xmas Yard Decor for Outdoor Indoor Yard Window Party Garden',NULL,'B0CCJDH3HV','https://m.media-amazon.com/images/I/71QG0TkxVqL._AC_UL320_.jpg',39,4.6,'$15.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Christmas-Inflatable-Santa-Claus-Decorations/dp/B0CCJDH3HV/ref=sr_1_104?keywords=decoration&qid=1703020701&sr=8-104',58,'2023-12-19 15:18:23.023984-06','2023-12-19 15:18:23.023984-06','www.amazon.com'), + (4672,'Protado Lighted Christmas Santa Claus Lamp, Crystal Glass Night Lights with Santa Claus Hat Christmas Decor for Thanksgiving Xmas New Year Holidays Home Decor, Ideal Xmas Gift Winter Indoor Decoration',NULL,'B0CDKRQ9YC','https://m.media-amazon.com/images/I/81LqCT+YeTL._AC_UL320_.jpg',41,4.7,'$9.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Protado-Christmas-Thanksgiving-Holidays-Decoration/dp/B0CDKRQ9YC/ref=sr_1_105?keywords=decoration&qid=1703020701&sr=8-105',58,'2023-12-19 15:18:23.030923-06','2023-12-19 15:18:23.030923-06','www.amazon.com'), + (4673,'OPSEAM Butterfly Wall Decor 24/48 PCS, 3D Butterflies Stickers for Party Decorations with Magnets(Colorful, 24)',NULL,'B09YY1D5T7','https://m.media-amazon.com/images/I/81Qwas7y+-L._AC_UL320_.jpg',1204,4.7,'$7.99','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.com/Butterfly-Butterflies-Stickers-Decorations-Colorful/dp/B09YY1D5T7/ref=sr_1_106?keywords=decoration&qid=1703020701&sr=8-106',58,'2023-12-19 15:18:23.037436-06','2023-12-19 15:18:23.037436-06','www.amazon.com'), + (4639,'INONE Ceramic Incense Burner with 120 Cones, Waterfall Backflow Incense Holder, Aromatherapy Ornament, Zen Decor, Home Decor, Room Decor (Cyan)',NULL,'B07TS7VD3J','https://aax-us-iad.amazon.com/e/loi/imp?b=JCICwDkgXyy9dQcZN_LTpioAAAGMg_GpOwEAAAH2AQBvbm9fdHhuX2JpZDcgICBvbm9fdHhuX2ltcDEgICCPzNh1',9781,3.9,'$13.40','USD','0001-12-31 18:09:24-05:50:36 BC','https://www.amazon.comhttps://aax-us-iad.amazon.com/x/c/RLLa41VtE14zLBtmIkNXAd4AAAGMg_GNygEAAAH2AQBvbm9fdHhuX2JpZDYgICBvbm9fdHhuX2ltcDEgICD2abum/https://www.amazon.com/INONE-Ceramic-Incense-Waterfall-Backflow/dp/B07TS7VD3J/ref=sxbs_sbv_search_btf?content-id=amzn1.sym.e3e25c3f-be9c-4043-8c05-6ebb65e75e4b%3Aamzn1.sym.e3e25c3f-be9c-4043-8c05-6ebb65e75e4b&cv_ct_cx=decoration&keywords=decoration&pd_rd_i=B07TS7VD3J&pd_rd_r=ed06abf8-0321-4f6b-8d10-0c90342ed6b9&pd_rd_w=yWi24&pd_rd_wg=FttDx&pf_rd_p=e3e25c3f-be9c-4043-8c05-6ebb65e75e4b&pf_rd_r=X85J8G3W29EVBFJ47BSE&qid=1703020694&sbo=RZvfv%2F%2FHxDF%2BO5021pAnSA%3D%3D&sr=1-1-a61ee601-6e56-4862-a8a2-1d3da5a5406f',58,'2023-12-19 15:18:16.358764-06','2023-12-19 15:18:23.044808-06','www.amazon.comhttps:'); diff --git a/src/database/migrations/1703110960211989_RemoveProductModifiedColumn.sql b/src/database/migrations/1703110960211989_RemoveProductModifiedColumn.sql new file mode 100644 index 00000000..602afe26 --- /dev/null +++ b/src/database/migrations/1703110960211989_RemoveProductModifiedColumn.sql @@ -0,0 +1,2 @@ +ALTER TABLE "product" +DROP COLUMN "modified"; diff --git a/src/database/migrations/1703288861377468_DropParticipantAddressNotNullConstraint.sql b/src/database/migrations/1703288861377468_DropParticipantAddressNotNullConstraint.sql new file mode 100644 index 00000000..cdf84340 --- /dev/null +++ b/src/database/migrations/1703288861377468_DropParticipantAddressNotNullConstraint.sql @@ -0,0 +1,2 @@ +ALTER TABLE "participant" +ALTER COLUMN "address" DROP NOT NULL; diff --git a/src/database/migrations/1703717887048543_CreateParticipantUserView.sql b/src/database/migrations/1703717887048543_CreateParticipantUserView.sql new file mode 100644 index 00000000..50506273 --- /dev/null +++ b/src/database/migrations/1703717887048543_CreateParticipantUserView.sql @@ -0,0 +1,9 @@ +CREATE VIEW participant_user AS ( + SELECT + "participant".*, + "user"."name" AS "user_name", + "user"."email" AS "user_email", + "user"."image_url" AS "user_image_url" + FROM "participant" + LEFT JOIN "user" ON "user"."id" = "participant"."user_id" +); diff --git a/src/database/migrations/1704409541850862_CreateEventViewForLinks.sql b/src/database/migrations/1704409541850862_CreateEventViewForLinks.sql new file mode 100644 index 00000000..e04137a7 --- /dev/null +++ b/src/database/migrations/1704409541850862_CreateEventViewForLinks.sql @@ -0,0 +1,9 @@ +CREATE VIEW event_link AS ( + SELECT + "event".*, + "link"."id" as "link_id", + "link"."code" as "link_code", + "link"."expiration_date" as "link_expiration_date" + FROM "event" + LEFT JOIN "link" ON "link"."event_id" = "event"."id" +); diff --git a/src/database/migrations/1707706778959044_WishQuantity.sql b/src/database/migrations/1707706778959044_WishQuantity.sql new file mode 100644 index 00000000..542e4c10 --- /dev/null +++ b/src/database/migrations/1707706778959044_WishQuantity.sql @@ -0,0 +1,2 @@ +ALTER TABLE wish +ADD COLUMN quantity INTEGER NOT NULL DEFAULT 1; diff --git a/src/database/models.go b/src/database/models.go new file mode 100644 index 00000000..518811d1 --- /dev/null +++ b/src/database/models.go @@ -0,0 +1,196 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.25.0 + +package database + +import ( + "database/sql" + "database/sql/driver" + "fmt" + "time" +) + +type CurrencyType string + +const ( + CurrencyTypeUSD CurrencyType = "USD" + CurrencyTypeCAD CurrencyType = "CAD" +) + +func (e *CurrencyType) Scan(src interface{}) error { + switch s := src.(type) { + case []byte: + *e = CurrencyType(s) + case string: + *e = CurrencyType(s) + default: + return fmt.Errorf("unsupported scan type for CurrencyType: %T", src) + } + return nil +} + +type NullCurrencyType struct { + CurrencyType CurrencyType `json:"currencyType"` + Valid bool `json:"valid"` // Valid is true if CurrencyType is not NULL +} + +// Scan implements the Scanner interface. +func (ns *NullCurrencyType) Scan(value interface{}) error { + if value == nil { + ns.CurrencyType, ns.Valid = "", false + return nil + } + ns.Valid = true + return ns.CurrencyType.Scan(value) +} + +// Value implements the driver Valuer interface. +func (ns NullCurrencyType) Value() (driver.Value, error) { + if !ns.Valid { + return nil, nil + } + return string(ns.CurrencyType), nil +} + +func (e CurrencyType) Valid() bool { + switch e { + case CurrencyTypeUSD, + CurrencyTypeCAD: + return true + } + return false +} + +func AllCurrencyTypeValues() []CurrencyType { + return []CurrencyType{ + CurrencyTypeUSD, + CurrencyTypeCAD, + } +} + +type Category struct { + ID int64 `db:"id" json:"id"` + Name string `db:"name" json:"name"` + Description sql.NullString `db:"description" json:"description"` + CategoryUrl sql.NullString `db:"category_url" json:"categoryUrl"` + CreatedAt time.Time `db:"created_at" json:"createdAt"` + UpdatedAt time.Time `db:"updated_at" json:"updatedAt"` +} + +type Draw struct { + ID int64 `db:"id" json:"id"` + DrawerID int64 `db:"drawer_id" json:"drawerId"` + DraweeID int64 `db:"drawee_id" json:"draweeId"` + EventID int64 `db:"event_id" json:"eventId"` + CreatedAt time.Time `db:"created_at" json:"createdAt"` + UpdatedAt time.Time `db:"updated_at" json:"updatedAt"` +} + +type Event struct { + ID int64 `db:"id" json:"id"` + Name string `db:"name" json:"name"` + Description sql.NullString `db:"description" json:"description"` + Budget string `db:"budget" json:"budget"` + InvitationMessage string `db:"invitation_message" json:"invitationMessage"` + DrawAt time.Time `db:"draw_at" json:"drawAt"` + CloseAt time.Time `db:"close_at" json:"closeAt"` + CreatedAt time.Time `db:"created_at" json:"createdAt"` + UpdatedAt time.Time `db:"updated_at" json:"updatedAt"` +} + +type EventLink struct { + ID int64 `db:"id" json:"id"` + Name string `db:"name" json:"name"` + Description sql.NullString `db:"description" json:"description"` + Budget string `db:"budget" json:"budget"` + InvitationMessage string `db:"invitation_message" json:"invitationMessage"` + DrawAt time.Time `db:"draw_at" json:"drawAt"` + CloseAt time.Time `db:"close_at" json:"closeAt"` + CreatedAt time.Time `db:"created_at" json:"createdAt"` + UpdatedAt time.Time `db:"updated_at" json:"updatedAt"` + LinkID sql.NullInt64 `db:"link_id" json:"linkId"` + LinkCode sql.NullString `db:"link_code" json:"linkCode"` + LinkExpirationDate sql.NullTime `db:"link_expiration_date" json:"linkExpirationDate"` +} + +type Link struct { + ID int64 `db:"id" json:"id"` + Code string `db:"code" json:"code"` + ExpirationDate time.Time `db:"expiration_date" json:"expirationDate"` + EventID int64 `db:"event_id" json:"eventId"` + CreatedAt time.Time `db:"created_at" json:"createdAt"` + UpdatedAt time.Time `db:"updated_at" json:"updatedAt"` +} + +type Participant struct { + ID int64 `db:"id" json:"id"` + Name string `db:"name" json:"name"` + Email string `db:"email" json:"email"` + Address sql.NullString `db:"address" json:"address"` + Organizer bool `db:"organizer" json:"organizer"` + Participates bool `db:"participates" json:"participates"` + Accepted bool `db:"accepted" json:"accepted"` + EventID int64 `db:"event_id" json:"eventId"` + UserID sql.NullInt64 `db:"user_id" json:"userId"` + CreatedAt time.Time `db:"created_at" json:"createdAt"` + UpdatedAt time.Time `db:"updated_at" json:"updatedAt"` +} + +type ParticipantUser struct { + ID int64 `db:"id" json:"id"` + Name string `db:"name" json:"name"` + Email string `db:"email" json:"email"` + Address sql.NullString `db:"address" json:"address"` + Organizer bool `db:"organizer" json:"organizer"` + Participates bool `db:"participates" json:"participates"` + Accepted bool `db:"accepted" json:"accepted"` + EventID int64 `db:"event_id" json:"eventId"` + UserID sql.NullInt64 `db:"user_id" json:"userId"` + CreatedAt time.Time `db:"created_at" json:"createdAt"` + UpdatedAt time.Time `db:"updated_at" json:"updatedAt"` + UserName sql.NullString `db:"user_name" json:"userName"` + UserEmail sql.NullString `db:"user_email" json:"userEmail"` + UserImageUrl sql.NullString `db:"user_image_url" json:"userImageUrl"` +} + +type Product struct { + ID int64 `db:"id" json:"id"` + Title string `db:"title" json:"title"` + Description sql.NullString `db:"description" json:"description"` + ProductKey string `db:"product_key" json:"productKey"` + ImageUrl string `db:"image_url" json:"imageUrl"` + TotalReviews int32 `db:"total_reviews" json:"totalReviews"` + Rating float32 `db:"rating" json:"rating"` + Price string `db:"price" json:"price"` + Currency CurrencyType `db:"currency" json:"currency"` + Url string `db:"url" json:"url"` + CategoryID sql.NullInt64 `db:"category_id" json:"categoryId"` + CreatedAt time.Time `db:"created_at" json:"createdAt"` + UpdatedAt time.Time `db:"updated_at" json:"updatedAt"` + ProductTs interface{} `db:"product_ts" json:"productTs"` + Origin string `db:"origin" json:"origin"` +} + +type User struct { + ID int64 `db:"id" json:"id"` + Name string `db:"name" json:"name"` + Email string `db:"email" json:"email"` + ImageUrl string `db:"image_url" json:"imageUrl"` + Phone sql.NullString `db:"phone" json:"phone"` + Admin bool `db:"admin" json:"admin"` + Active bool `db:"active" json:"active"` + CreatedAt time.Time `db:"created_at" json:"createdAt"` + UpdatedAt time.Time `db:"updated_at" json:"updatedAt"` +} + +type Wish struct { + ID int64 `db:"id" json:"id"` + UserID int64 `db:"user_id" json:"userId"` + ParticipantID int64 `db:"participant_id" json:"participantId"` + ProductID sql.NullInt64 `db:"product_id" json:"productId"` + EventID int64 `db:"event_id" json:"eventId"` + CreatedAt time.Time `db:"created_at" json:"createdAt"` + UpdatedAt time.Time `db:"updated_at" json:"updatedAt"` + Quantity int32 `db:"quantity" json:"quantity"` +} diff --git a/src/database/participant.sql.go b/src/database/participant.sql.go new file mode 100644 index 00000000..93489836 --- /dev/null +++ b/src/database/participant.sql.go @@ -0,0 +1,390 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.25.0 +// source: participant.sql + +package database + +import ( + "context" + "database/sql" +) + +const acceptEventInvite = `-- name: AcceptEventInvite :one +UPDATE "participant" +SET + "accepted" = TRUE, + "user_id" = $1, + "updated_at" = now() +WHERE + "email" = $2 + AND + "event_id" = $3 +RETURNING id, name, email, address, organizer, participates, accepted, event_id, user_id, created_at, updated_at +` + +type AcceptEventInviteParams struct { + UserID sql.NullInt64 `db:"user_id" json:"userId"` + Email string `db:"email" json:"email"` + EventID int64 `db:"event_id" json:"eventId"` +} + +func (q *Queries) AcceptEventInvite(ctx context.Context, arg AcceptEventInviteParams) (Participant, error) { + row := q.queryRow(ctx, q.acceptEventInviteStmt, acceptEventInvite, arg.UserID, arg.Email, arg.EventID) + var i Participant + err := row.Scan( + &i.ID, + &i.Name, + &i.Email, + &i.Address, + &i.Organizer, + &i.Participates, + &i.Accepted, + &i.EventID, + &i.UserID, + &i.CreatedAt, + &i.UpdatedAt, + ) + return i, err +} + +const createParticipant = `-- name: CreateParticipant :one +INSERT INTO "participant" ( + "name", + "email", + "address", + "organizer", + "participates", + "accepted", + "event_id", + "user_id" +) VALUES ( + $1, $2, $7, $3, $4, $5, $6, $8 +) +RETURNING id, name, email, address, organizer, participates, accepted, event_id, user_id, created_at, updated_at +` + +type CreateParticipantParams struct { + Name string `db:"name" json:"name"` + Email string `db:"email" json:"email"` + Organizer bool `db:"organizer" json:"organizer"` + Participates bool `db:"participates" json:"participates"` + Accepted bool `db:"accepted" json:"accepted"` + EventID int64 `db:"event_id" json:"eventId"` + Address sql.NullString `db:"address" json:"address"` + UserID sql.NullInt64 `db:"user_id" json:"userId"` +} + +func (q *Queries) CreateParticipant(ctx context.Context, arg CreateParticipantParams) (Participant, error) { + row := q.queryRow(ctx, q.createParticipantStmt, createParticipant, + arg.Name, + arg.Email, + arg.Organizer, + arg.Participates, + arg.Accepted, + arg.EventID, + arg.Address, + arg.UserID, + ) + var i Participant + err := row.Scan( + &i.ID, + &i.Name, + &i.Email, + &i.Address, + &i.Organizer, + &i.Participates, + &i.Accepted, + &i.EventID, + &i.UserID, + &i.CreatedAt, + &i.UpdatedAt, + ) + return i, err +} + +const declineEventInvite = `-- name: DeclineEventInvite :one +DELETE FROM "participant" +WHERE + "email" = $1 + AND + "event_id" = $2 + AND + "accepted" = FALSE +RETURNING id, name, email, address, organizer, participates, accepted, event_id, user_id, created_at, updated_at +` + +type DeclineEventInviteParams struct { + Email string `db:"email" json:"email"` + EventID int64 `db:"event_id" json:"eventId"` +} + +func (q *Queries) DeclineEventInvite(ctx context.Context, arg DeclineEventInviteParams) (Participant, error) { + row := q.queryRow(ctx, q.declineEventInviteStmt, declineEventInvite, arg.Email, arg.EventID) + var i Participant + err := row.Scan( + &i.ID, + &i.Name, + &i.Email, + &i.Address, + &i.Organizer, + &i.Participates, + &i.Accepted, + &i.EventID, + &i.UserID, + &i.CreatedAt, + &i.UpdatedAt, + ) + return i, err +} + +const deleteParticipantByIdAndEventId = `-- name: DeleteParticipantByIdAndEventId :one +DELETE FROM "participant" +WHERE "event_id" = $1 AND "id" = $2 +RETURNING id, name, email, address, organizer, participates, accepted, event_id, user_id, created_at, updated_at +` + +type DeleteParticipantByIdAndEventIdParams struct { + EventID int64 `db:"event_id" json:"eventId"` + ParticipantID int64 `db:"participant_id" json:"participantId"` +} + +func (q *Queries) DeleteParticipantByIdAndEventId(ctx context.Context, arg DeleteParticipantByIdAndEventIdParams) (Participant, error) { + row := q.queryRow(ctx, q.deleteParticipantByIdAndEventIdStmt, deleteParticipantByIdAndEventId, arg.EventID, arg.ParticipantID) + var i Participant + err := row.Scan( + &i.ID, + &i.Name, + &i.Email, + &i.Address, + &i.Organizer, + &i.Participates, + &i.Accepted, + &i.EventID, + &i.UserID, + &i.CreatedAt, + &i.UpdatedAt, + ) + return i, err +} + +const findParticipantFromEventIdAndUser = `-- name: FindParticipantFromEventIdAndUser :one +SELECT id, name, email, address, organizer, participates, accepted, event_id, user_id, created_at, updated_at FROM "participant" +WHERE "event_id" = $1 AND "user_id" = $2 +` + +type FindParticipantFromEventIdAndUserParams struct { + EventID int64 `db:"event_id" json:"eventId"` + UserID sql.NullInt64 `db:"user_id" json:"userId"` +} + +func (q *Queries) FindParticipantFromEventIdAndUser(ctx context.Context, arg FindParticipantFromEventIdAndUserParams) (Participant, error) { + row := q.queryRow(ctx, q.findParticipantFromEventIdAndUserStmt, findParticipantFromEventIdAndUser, arg.EventID, arg.UserID) + var i Participant + err := row.Scan( + &i.ID, + &i.Name, + &i.Email, + &i.Address, + &i.Organizer, + &i.Participates, + &i.Accepted, + &i.EventID, + &i.UserID, + &i.CreatedAt, + &i.UpdatedAt, + ) + return i, err +} + +const findParticipantUserWithFullEventById = `-- name: FindParticipantUserWithFullEventById :many +SELECT + main_participant.id, main_participant.name, main_participant.email, main_participant.address, main_participant.organizer, main_participant.participates, main_participant.accepted, main_participant.event_id, main_participant.user_id, main_participant.created_at, main_participant.updated_at, main_participant.user_name, main_participant.user_email, main_participant.user_image_url, + event.id, event.name, event.description, event.budget, event.invitation_message, event.draw_at, event.close_at, event.created_at, event.updated_at, + pu.id, pu.name, pu.email, pu.address, pu.organizer, pu.participates, pu.accepted, pu.event_id, pu.user_id, pu.created_at, pu.updated_at, pu.user_name, pu.user_email, pu.user_image_url +FROM "participant_user" "main_participant" +JOIN "event" ON "event"."id" = "main_participant"."event_id" +JOIN "participant_user" "pu" ON "pu"."event_id" = "event"."id" +WHERE "main_participant"."id" = $1 +` + +type FindParticipantUserWithFullEventByIdRow struct { + ParticipantUser ParticipantUser `db:"participant_user" json:"participantUser"` + Event Event `db:"event" json:"event"` + ParticipantUser_2 ParticipantUser `db:"participant_user_2" json:"participantUser2"` +} + +func (q *Queries) FindParticipantUserWithFullEventById(ctx context.Context, id int64) ([]FindParticipantUserWithFullEventByIdRow, error) { + rows, err := q.query(ctx, q.findParticipantUserWithFullEventByIdStmt, findParticipantUserWithFullEventById, id) + if err != nil { + return nil, err + } + defer rows.Close() + var items []FindParticipantUserWithFullEventByIdRow + for rows.Next() { + var i FindParticipantUserWithFullEventByIdRow + if err := rows.Scan( + &i.ParticipantUser.ID, + &i.ParticipantUser.Name, + &i.ParticipantUser.Email, + &i.ParticipantUser.Address, + &i.ParticipantUser.Organizer, + &i.ParticipantUser.Participates, + &i.ParticipantUser.Accepted, + &i.ParticipantUser.EventID, + &i.ParticipantUser.UserID, + &i.ParticipantUser.CreatedAt, + &i.ParticipantUser.UpdatedAt, + &i.ParticipantUser.UserName, + &i.ParticipantUser.UserEmail, + &i.ParticipantUser.UserImageUrl, + &i.Event.ID, + &i.Event.Name, + &i.Event.Description, + &i.Event.Budget, + &i.Event.InvitationMessage, + &i.Event.DrawAt, + &i.Event.CloseAt, + &i.Event.CreatedAt, + &i.Event.UpdatedAt, + &i.ParticipantUser_2.ID, + &i.ParticipantUser_2.Name, + &i.ParticipantUser_2.Email, + &i.ParticipantUser_2.Address, + &i.ParticipantUser_2.Organizer, + &i.ParticipantUser_2.Participates, + &i.ParticipantUser_2.Accepted, + &i.ParticipantUser_2.EventID, + &i.ParticipantUser_2.UserID, + &i.ParticipantUser_2.CreatedAt, + &i.ParticipantUser_2.UpdatedAt, + &i.ParticipantUser_2.UserName, + &i.ParticipantUser_2.UserEmail, + &i.ParticipantUser_2.UserImageUrl, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + +const findParticipantWithIdAndEventId = `-- name: FindParticipantWithIdAndEventId :one +SELECT id, name, email, address, organizer, participates, accepted, event_id, user_id, created_at, updated_at FROM "participant" +WHERE "event_id" = $1 AND "id" = $2 +` + +type FindParticipantWithIdAndEventIdParams struct { + EventID int64 `db:"event_id" json:"eventId"` + ParticipantID int64 `db:"participant_id" json:"participantId"` +} + +func (q *Queries) FindParticipantWithIdAndEventId(ctx context.Context, arg FindParticipantWithIdAndEventIdParams) (Participant, error) { + row := q.queryRow(ctx, q.findParticipantWithIdAndEventIdStmt, findParticipantWithIdAndEventId, arg.EventID, arg.ParticipantID) + var i Participant + err := row.Scan( + &i.ID, + &i.Name, + &i.Email, + &i.Address, + &i.Organizer, + &i.Participates, + &i.Accepted, + &i.EventID, + &i.UserID, + &i.CreatedAt, + &i.UpdatedAt, + ) + return i, err +} + +const patchParticipant = `-- name: PatchParticipant :one +UPDATE "participant" +SET + "participates" = COALESCE($2, "participates"), + "address" = COALESCE($3, "address"), + "name" = COALESCE($4, "name"), + "updated_at" = now() +WHERE "event_id" = $1 AND "id" = $5 +RETURNING id, name, email, address, organizer, participates, accepted, event_id, user_id, created_at, updated_at +` + +type PatchParticipantParams struct { + EventID int64 `db:"event_id" json:"eventId"` + Participates sql.NullBool `db:"participates" json:"participates"` + Address sql.NullString `db:"address" json:"address"` + Name sql.NullString `db:"name" json:"name"` + ParticipantID int64 `db:"participant_id" json:"participantId"` +} + +func (q *Queries) PatchParticipant(ctx context.Context, arg PatchParticipantParams) (Participant, error) { + row := q.queryRow(ctx, q.patchParticipantStmt, patchParticipant, + arg.EventID, + arg.Participates, + arg.Address, + arg.Name, + arg.ParticipantID, + ) + var i Participant + err := row.Scan( + &i.ID, + &i.Name, + &i.Email, + &i.Address, + &i.Organizer, + &i.Participates, + &i.Accepted, + &i.EventID, + &i.UserID, + &i.CreatedAt, + &i.UpdatedAt, + ) + return i, err +} + +const updateParticipantStatus = `-- name: UpdateParticipantStatus :one +UPDATE "participant" +SET + "organizer" = COALESCE($2, "organizer"), + "participates" = COALESCE($3, "participates"), + "updated_at" = now() +WHERE "event_id" = $1 AND "id" = $4 +RETURNING id, name, email, address, organizer, participates, accepted, event_id, user_id, created_at, updated_at +` + +type UpdateParticipantStatusParams struct { + EventID int64 `db:"event_id" json:"eventId"` + Organizer sql.NullBool `db:"organizer" json:"organizer"` + Participates sql.NullBool `db:"participates" json:"participates"` + ParticipantID int64 `db:"participant_id" json:"participantId"` +} + +func (q *Queries) UpdateParticipantStatus(ctx context.Context, arg UpdateParticipantStatusParams) (Participant, error) { + row := q.queryRow(ctx, q.updateParticipantStatusStmt, updateParticipantStatus, + arg.EventID, + arg.Organizer, + arg.Participates, + arg.ParticipantID, + ) + var i Participant + err := row.Scan( + &i.ID, + &i.Name, + &i.Email, + &i.Address, + &i.Organizer, + &i.Participates, + &i.Accepted, + &i.EventID, + &i.UserID, + &i.CreatedAt, + &i.UpdatedAt, + ) + return i, err +} diff --git a/src/database/product.sql.go b/src/database/product.sql.go new file mode 100644 index 00000000..cd3bcec4 --- /dev/null +++ b/src/database/product.sql.go @@ -0,0 +1,283 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.25.0 +// source: product.sql + +package database + +import ( + "context" + "database/sql" +) + +const createProduct = `-- name: CreateProduct :one +INSERT INTO "product" ( + "title", + "description", + "product_key", + "image_url", + "total_reviews", + "rating", + "price", + "currency", + "url", + "origin", + "category_id" +) VALUES ( + $1, $2, $3, $4, $5, $6, $7, $11, $8, $9, $10 +) RETURNING id, title, description, product_key, image_url, total_reviews, rating, price, currency, url, category_id, created_at, updated_at, product_ts, origin +` + +type CreateProductParams struct { + Title string `db:"title" json:"title"` + Description sql.NullString `db:"description" json:"description"` + ProductKey string `db:"product_key" json:"productKey"` + ImageUrl string `db:"image_url" json:"imageUrl"` + TotalReviews int32 `db:"total_reviews" json:"totalReviews"` + Rating float32 `db:"rating" json:"rating"` + Price string `db:"price" json:"price"` + Url string `db:"url" json:"url"` + Origin string `db:"origin" json:"origin"` + CategoryID sql.NullInt64 `db:"category_id" json:"categoryId"` + Currency NullCurrencyType `db:"currency" json:"currency"` +} + +func (q *Queries) CreateProduct(ctx context.Context, arg CreateProductParams) (Product, error) { + row := q.queryRow(ctx, q.createProductStmt, createProduct, + arg.Title, + arg.Description, + arg.ProductKey, + arg.ImageUrl, + arg.TotalReviews, + arg.Rating, + arg.Price, + arg.Url, + arg.Origin, + arg.CategoryID, + arg.Currency, + ) + var i Product + err := row.Scan( + &i.ID, + &i.Title, + &i.Description, + &i.ProductKey, + &i.ImageUrl, + &i.TotalReviews, + &i.Rating, + &i.Price, + &i.Currency, + &i.Url, + &i.CategoryID, + &i.CreatedAt, + &i.UpdatedAt, + &i.ProductTs, + &i.Origin, + ) + return i, err +} + +const filterProducts = `-- name: FilterProducts :many +SELECT + product.id, product.title, product.description, product.product_key, product.image_url, product.total_reviews, product.rating, product.price, product.currency, product.url, product.category_id, product.created_at, product.updated_at, product.product_ts, product.origin, + category.id, category.name, category.description, category.category_url, category.created_at, category.updated_at, + CEIL("product"."total_reviews" * "product"."rating") AS "weight" +FROM "product" +INNER JOIN "category" + ON "category"."id" = "product"."category_id" +WHERE + ( + $2::TEXT IS NULL OR + "product"."product_ts" @@ to_tsquery('english', $2::TEXT) + ) AND ( + "product"."price" BETWEEN $3 AND $4 + ) +ORDER BY + CASE WHEN + $5::BOOLEAN IS TRUE + THEN + "product"."price" + END ASC, + "weight" DESC +LIMIT $1 +OFFSET $1 * ($6::INTEGER - 1) +` + +type FilterProductsParams struct { + Limit int32 `db:"limit" json:"limit"` + Search sql.NullString `db:"search" json:"search"` + MinPrice string `db:"min_price" json:"minPrice"` + MaxPrice string `db:"max_price" json:"maxPrice"` + SortByPrice sql.NullBool `db:"sort_by_price" json:"sortByPrice"` + Page int32 `db:"page" json:"page"` +} + +type FilterProductsRow struct { + Product Product `db:"product" json:"product"` + Category Category `db:"category" json:"category"` + Weight float64 `db:"weight" json:"weight"` +} + +func (q *Queries) FilterProducts(ctx context.Context, arg FilterProductsParams) ([]FilterProductsRow, error) { + rows, err := q.query(ctx, q.filterProductsStmt, filterProducts, + arg.Limit, + arg.Search, + arg.MinPrice, + arg.MaxPrice, + arg.SortByPrice, + arg.Page, + ) + if err != nil { + return nil, err + } + defer rows.Close() + var items []FilterProductsRow + for rows.Next() { + var i FilterProductsRow + if err := rows.Scan( + &i.Product.ID, + &i.Product.Title, + &i.Product.Description, + &i.Product.ProductKey, + &i.Product.ImageUrl, + &i.Product.TotalReviews, + &i.Product.Rating, + &i.Product.Price, + &i.Product.Currency, + &i.Product.Url, + &i.Product.CategoryID, + &i.Product.CreatedAt, + &i.Product.UpdatedAt, + &i.Product.ProductTs, + &i.Product.Origin, + &i.Category.ID, + &i.Category.Name, + &i.Category.Description, + &i.Category.CategoryUrl, + &i.Category.CreatedAt, + &i.Category.UpdatedAt, + &i.Weight, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + +const findProductById = `-- name: FindProductById :one +SELECT id, title, description, product_key, image_url, total_reviews, rating, price, currency, url, category_id, created_at, updated_at, product_ts, origin FROM "product" +WHERE "id" = $1 +` + +func (q *Queries) FindProductById(ctx context.Context, id int64) (Product, error) { + row := q.queryRow(ctx, q.findProductByIdStmt, findProductById, id) + var i Product + err := row.Scan( + &i.ID, + &i.Title, + &i.Description, + &i.ProductKey, + &i.ImageUrl, + &i.TotalReviews, + &i.Rating, + &i.Price, + &i.Currency, + &i.Url, + &i.CategoryID, + &i.CreatedAt, + &i.UpdatedAt, + &i.ProductTs, + &i.Origin, + ) + return i, err +} + +const findProductByProductKey = `-- name: FindProductByProductKey :one +SELECT id, title, description, product_key, image_url, total_reviews, rating, price, currency, url, category_id, created_at, updated_at, product_ts, origin FROM "product" +WHERE "product_key" = $1 +` + +func (q *Queries) FindProductByProductKey(ctx context.Context, productKey string) (Product, error) { + row := q.queryRow(ctx, q.findProductByProductKeyStmt, findProductByProductKey, productKey) + var i Product + err := row.Scan( + &i.ID, + &i.Title, + &i.Description, + &i.ProductKey, + &i.ImageUrl, + &i.TotalReviews, + &i.Rating, + &i.Price, + &i.Currency, + &i.Url, + &i.CategoryID, + &i.CreatedAt, + &i.UpdatedAt, + &i.ProductTs, + &i.Origin, + ) + return i, err +} + +const updateProduct = `-- name: UpdateProduct :one +UPDATE "product" +SET + "price" = coalesce($2, "price"), + "rating" = coalesce($3, "rating"), + "total_reviews" = coalesce($4, "total_reviews"), + "title" = coalesce($5, "title"), + "image_url" = coalesce($6, "image_url"), + "description" = coalesce($7, "description"), + "updated_at" = now() +WHERE "product_key" = $1 +RETURNING id, title, description, product_key, image_url, total_reviews, rating, price, currency, url, category_id, created_at, updated_at, product_ts, origin +` + +type UpdateProductParams struct { + ProductKey string `db:"product_key" json:"productKey"` + Price sql.NullString `db:"price" json:"price"` + Rating sql.NullFloat64 `db:"rating" json:"rating"` + TotalReviews sql.NullInt32 `db:"total_reviews" json:"totalReviews"` + Title sql.NullString `db:"title" json:"title"` + ImageUrl sql.NullString `db:"image_url" json:"imageUrl"` + Description sql.NullString `db:"description" json:"description"` +} + +func (q *Queries) UpdateProduct(ctx context.Context, arg UpdateProductParams) (Product, error) { + row := q.queryRow(ctx, q.updateProductStmt, updateProduct, + arg.ProductKey, + arg.Price, + arg.Rating, + arg.TotalReviews, + arg.Title, + arg.ImageUrl, + arg.Description, + ) + var i Product + err := row.Scan( + &i.ID, + &i.Title, + &i.Description, + &i.ProductKey, + &i.ImageUrl, + &i.TotalReviews, + &i.Rating, + &i.Price, + &i.Currency, + &i.Url, + &i.CategoryID, + &i.CreatedAt, + &i.UpdatedAt, + &i.ProductTs, + &i.Origin, + ) + return i, err +} diff --git a/src/database/queries/category.sql b/src/database/queries/category.sql new file mode 100644 index 00000000..08daebe3 --- /dev/null +++ b/src/database/queries/category.sql @@ -0,0 +1,15 @@ +-- name: FindCategoryByName :one +SELECT * FROM "category" +WHERE "name" = $1; + +-- name: CreateCategory :one +INSERT INTO "category" ( + "name", + "description", + "category_url" +) VALUES( + $1, + sqlc.narg(description), + sqlc.narg(category_url) +) +RETURNING *; diff --git a/src/database/queries/event.sql b/src/database/queries/event.sql new file mode 100644 index 00000000..6520876e --- /dev/null +++ b/src/database/queries/event.sql @@ -0,0 +1,116 @@ +-- name: CreateEvent :one +INSERT INTO "event" ( + "name", + "description", + "budget", + "invitation_message", + "draw_at", + "close_at" +) VALUES ( + $1, $2, $3, $4, $5, $6 +) +RETURNING *; + +-- name: UpdateEvent :one +UPDATE "event" +SET + "name" = COALESCE(sqlc.narg(name), "name"), + "description" = COALESCE(sqlc.narg(description), "description"), + "budget" = COALESCE(sqlc.narg(budget), "budget"), + "draw_at" = COALESCE(sqlc.narg(draw_at), "draw_at"), + "close_at" = COALESCE(sqlc.narg(close_at), "close_at"), + "updated_at" = now() +WHERE "event"."id" = $1 +RETURNING *; + +-- name: DeleteEvent :one +DELETE FROM "event" +WHERE "event"."id" = $1 +RETURNING *; + +-- name: FindAllEventsWithUser :many +SELECT + sqlc.embed(event), + sqlc.embed(p) +FROM "event" +JOIN "participant" "p1" ON "p1"."event_id" = "event"."id" +JOIN "participant_user" "p" ON "p"."event_id" = "event"."id" +WHERE + "p1"."user_id" = $1 +ORDER BY + "event"."draw_at" ASC, + "event"."close_at" ASC, + "p"."id" ASC; + +-- name: FindEventSimple :one +SELECT * FROM "event" WHERE "event"."id" = $1; + +-- name: FindEventById :many +SELECT + sqlc.embed(event_link), + sqlc.embed(p) +FROM "event_link" +JOIN "participant_user" "p" ON "p"."event_id" = "event_link"."id" +WHERE "event_link"."id" = $1 +ORDER BY + "p"."organizer" DESC, + "p"."accepted" DESC, + "p"."created_at" DESC; + +-- name: FindEventInvites :many +SELECT "event".* +FROM "event" +JOIN "participant" ON "participant"."event_id" = "event"."id" +WHERE + "participant"."accepted" = FALSE + AND + "participant"."email" = $1; + + +-- +-- event verification queries +-- + +-- name: VerifyEventWithEmailOrUser :one +SELECT "event"."id" +FROM "event" +JOIN "participant" ON "participant"."event_id" = "event"."id" +WHERE + "event"."id" = sqlc.arg(event_id) + AND + ( + "participant"."user_id" = sqlc.narg(user_id) OR "participant"."email" = sqlc.narg(email) + ); + +-- name: VerifyEventWithParticipantId :one +SELECT "event"."id" +FROM "event" +JOIN "participant" ON "participant"."event_id" = "event"."id" +WHERE + "event"."id" = sqlc.arg(event_id) + AND + "participant"."id" = sqlc.arg(participant_id); + +-- name: VerifyEventForUserAsParticipant :one +SELECT "event"."id" +FROM "event" +JOIN "participant" ON "participant"."event_id" = "event"."id" +JOIN "user" ON "user"."id" = "participant"."user_id" +WHERE + "event"."id" = sqlc.arg(event_id) + AND + "participant"."participates" = TRUE + AND + "user"."id" = sqlc.arg(user_id); + +-- name: VerifyEventForUserAsOrganizer :one +SELECT "event"."id" +FROM "event" +JOIN "participant" ON "participant"."event_id" = "event"."id" +JOIN "user" ON "user"."id" = "participant"."user_id" +WHERE + "event"."id" = sqlc.arg(event_id) + AND + "participant"."organizer" = TRUE + AND + "user"."id" = sqlc.arg(user_id); diff --git a/src/database/queries/link.sql b/src/database/queries/link.sql new file mode 100644 index 00000000..282cab47 --- /dev/null +++ b/src/database/queries/link.sql @@ -0,0 +1,19 @@ +-- name: CreateLink :one +INSERT INTO "link" ( + code, + expiration_date, + event_id +) VALUES ( + $1, $2, $3 +) RETURNING *; + +-- name: FindLinkByCode :one +SELECT * FROM "link" WHERE code = $1; + +-- name: FindLinkWithEventByCode :one +SELECT + sqlc.embed(link), + sqlc.embed(event) +FROM "link" +JOIN "event" ON "event"."id" = "link"."event_id" +WHERE code = $1; diff --git a/src/database/queries/participant.sql b/src/database/queries/participant.sql new file mode 100644 index 00000000..ada6f507 --- /dev/null +++ b/src/database/queries/participant.sql @@ -0,0 +1,78 @@ +-- name: CreateParticipant :one +INSERT INTO "participant" ( + "name", + "email", + "address", + "organizer", + "participates", + "accepted", + "event_id", + "user_id" +) VALUES ( + $1, $2, sqlc.narg(address), $3, $4, $5, $6, sqlc.narg(user_id) +) +RETURNING *; + +-- name: AcceptEventInvite :one +UPDATE "participant" +SET + "accepted" = TRUE, + "user_id" = $1, + "updated_at" = now() +WHERE + "email" = $2 + AND + "event_id" = $3 +RETURNING *; + +-- name: DeclineEventInvite :one +DELETE FROM "participant" +WHERE + "email" = $1 + AND + "event_id" = $2 + AND + "accepted" = FALSE +RETURNING *; + +-- name: FindParticipantFromEventIdAndUser :one +SELECT * FROM "participant" +WHERE "event_id" = $1 AND "user_id" = $2; + +-- name: FindParticipantWithIdAndEventId :one +SELECT * FROM "participant" +WHERE "event_id" = $1 AND "id" = sqlc.arg(participant_id); + +-- name: FindParticipantUserWithFullEventById :many +SELECT + sqlc.embed(main_participant), + sqlc.embed(event), + sqlc.embed(pu) +FROM "participant_user" "main_participant" +JOIN "event" ON "event"."id" = "main_participant"."event_id" +JOIN "participant_user" "pu" ON "pu"."event_id" = "event"."id" +WHERE "main_participant"."id" = $1; + +-- name: UpdateParticipantStatus :one +UPDATE "participant" +SET + "organizer" = COALESCE(sqlc.narg(organizer), "organizer"), + "participates" = COALESCE(sqlc.narg(participates), "participates"), + "updated_at" = now() +WHERE "event_id" = $1 AND "id" = sqlc.arg(participant_id) +RETURNING *; + +-- name: PatchParticipant :one +UPDATE "participant" +SET + "participates" = COALESCE(sqlc.narg(participates), "participates"), + "address" = COALESCE(sqlc.narg(address), "address"), + "name" = COALESCE(sqlc.narg(name), "name"), + "updated_at" = now() +WHERE "event_id" = $1 AND "id" = sqlc.arg(participant_id) +RETURNING *; + +-- name: DeleteParticipantByIdAndEventId :one +DELETE FROM "participant" +WHERE "event_id" = $1 AND "id" = sqlc.arg(participant_id) +RETURNING *; diff --git a/src/database/queries/product.sql b/src/database/queries/product.sql new file mode 100644 index 00000000..77ac94f1 --- /dev/null +++ b/src/database/queries/product.sql @@ -0,0 +1,62 @@ +-- name: FindProductById :one +SELECT * FROM "product" +WHERE "id" = $1; + +-- name: FindProductByProductKey :one +SELECT * FROM "product" +WHERE "product_key" = $1; + +-- name: CreateProduct :one +INSERT INTO "product" ( + "title", + "description", + "product_key", + "image_url", + "total_reviews", + "rating", + "price", + "currency", + "url", + "origin", + "category_id" +) VALUES ( + $1, $2, $3, $4, $5, $6, $7, sqlc.narg(currency), $8, $9, $10 +) RETURNING *; + +-- name: FilterProducts :many +SELECT + sqlc.embed(product), + sqlc.embed(category), + CEIL("product"."total_reviews" * "product"."rating") AS "weight" +FROM "product" +INNER JOIN "category" + ON "category"."id" = "product"."category_id" +WHERE + ( + sqlc.narg(search)::TEXT IS NULL OR + "product"."product_ts" @@ to_tsquery('english', sqlc.narg(search)::TEXT) + ) AND ( + "product"."price" BETWEEN sqlc.arg(min_price) AND sqlc.arg(max_price) + ) +ORDER BY + CASE WHEN + sqlc.narg(sort_by_price)::BOOLEAN IS TRUE + THEN + "product"."price" + END ASC, + "weight" DESC +LIMIT $1 +OFFSET $1 * (sqlc.arg(page)::INTEGER - 1); + +-- name: UpdateProduct :one +UPDATE "product" +SET + "price" = coalesce(sqlc.narg('price'), "price"), + "rating" = coalesce(sqlc.narg('rating'), "rating"), + "total_reviews" = coalesce(sqlc.narg('total_reviews'), "total_reviews"), + "title" = coalesce(sqlc.narg('title'), "title"), + "image_url" = coalesce(sqlc.narg('image_url'), "image_url"), + "description" = coalesce(sqlc.narg('description'), "description"), + "updated_at" = now() +WHERE "product_key" = $1 +RETURNING *; diff --git a/src/database/queries/user.sql b/src/database/queries/user.sql new file mode 100644 index 00000000..29286b3f --- /dev/null +++ b/src/database/queries/user.sql @@ -0,0 +1,39 @@ +-- name: FindUserByEmail :one +SELECT * FROM "user" +WHERE email = $1; + +-- name: FindUserById :one +SELECT * FROM "user" +WHERE id = $1; + +-- name: FindUserByIdAndEmail :one +SELECT * FROM "user" +WHERE id = $1 AND email = $2; + +-- name: FindUserByIdOrEmail :one +SELECT * FROM "user" +WHERE id = $1 OR email = $2; + +-- name: SetUserAsAdmin :one +UPDATE "user" +SET "admin" = true +WHERE id = $1 +RETURNING *; + +-- name: CreateUser :one +INSERT INTO "user" ( + name, + email, + image_url, + phone, + admin, + active +) VALUES ( + $1, + $2, + $3, + $4, + $5, + $6 +) +RETURNING *; diff --git a/src/database/queries/wish.sql b/src/database/queries/wish.sql new file mode 100644 index 00000000..8e22e752 --- /dev/null +++ b/src/database/queries/wish.sql @@ -0,0 +1,54 @@ +-- name: CreateWish :one +INSERT INTO wish ( + user_id, + participant_id, + product_id, + event_id, + quantity, + created_at, + updated_at +) VALUES ( + $1, $2, $3, $4, COALESCE(sqlc.narg(quantity)::INTEGER, 1), now(), now() +) RETURNING *; + +-- name: DeleteWish :one +DELETE FROM wish +WHERE id = $1 +RETURNING id; + +-- name: GetWishByAllIDs :one +SELECT * +FROM wish +WHERE + id = $1 AND + user_id = $2 AND + participant_id = $3 AND + event_id = $4; + +-- name: GetAllWishesForUser :many +SELECT + sqlc.embed(wish), + sqlc.embed(product) +FROM wish +INNER JOIN product ON product.id = wish.product_id +WHERE + wish.user_id = $1 AND + wish.participant_id = $2 AND + wish.event_id = $3 +ORDER BY wish.created_at DESC; + +-- name: GetWishWithProductID :one +SELECT * FROM wish +WHERE + user_id = $1 AND + event_id = $2 AND + participant_id = $3 AND + product_id = $4; + +-- name: UpdateWishQuantity :one +UPDATE wish +SET + quantity = $2, + updated_at = NOW() +WHERE id = $1 +RETURNING *; diff --git a/src/database/user.sql.go b/src/database/user.sql.go new file mode 100644 index 00000000..a3bdb536 --- /dev/null +++ b/src/database/user.sql.go @@ -0,0 +1,185 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.25.0 +// source: user.sql + +package database + +import ( + "context" + "database/sql" +) + +const createUser = `-- name: CreateUser :one +INSERT INTO "user" ( + name, + email, + image_url, + phone, + admin, + active +) VALUES ( + $1, + $2, + $3, + $4, + $5, + $6 +) +RETURNING id, name, email, image_url, phone, admin, active, created_at, updated_at +` + +type CreateUserParams struct { + Name string `db:"name" json:"name"` + Email string `db:"email" json:"email"` + ImageUrl string `db:"image_url" json:"imageUrl"` + Phone sql.NullString `db:"phone" json:"phone"` + Admin bool `db:"admin" json:"admin"` + Active bool `db:"active" json:"active"` +} + +func (q *Queries) CreateUser(ctx context.Context, arg CreateUserParams) (User, error) { + row := q.queryRow(ctx, q.createUserStmt, createUser, + arg.Name, + arg.Email, + arg.ImageUrl, + arg.Phone, + arg.Admin, + arg.Active, + ) + var i User + err := row.Scan( + &i.ID, + &i.Name, + &i.Email, + &i.ImageUrl, + &i.Phone, + &i.Admin, + &i.Active, + &i.CreatedAt, + &i.UpdatedAt, + ) + return i, err +} + +const findUserByEmail = `-- name: FindUserByEmail :one +SELECT id, name, email, image_url, phone, admin, active, created_at, updated_at FROM "user" +WHERE email = $1 +` + +func (q *Queries) FindUserByEmail(ctx context.Context, email string) (User, error) { + row := q.queryRow(ctx, q.findUserByEmailStmt, findUserByEmail, email) + var i User + err := row.Scan( + &i.ID, + &i.Name, + &i.Email, + &i.ImageUrl, + &i.Phone, + &i.Admin, + &i.Active, + &i.CreatedAt, + &i.UpdatedAt, + ) + return i, err +} + +const findUserById = `-- name: FindUserById :one +SELECT id, name, email, image_url, phone, admin, active, created_at, updated_at FROM "user" +WHERE id = $1 +` + +func (q *Queries) FindUserById(ctx context.Context, id int64) (User, error) { + row := q.queryRow(ctx, q.findUserByIdStmt, findUserById, id) + var i User + err := row.Scan( + &i.ID, + &i.Name, + &i.Email, + &i.ImageUrl, + &i.Phone, + &i.Admin, + &i.Active, + &i.CreatedAt, + &i.UpdatedAt, + ) + return i, err +} + +const findUserByIdAndEmail = `-- name: FindUserByIdAndEmail :one +SELECT id, name, email, image_url, phone, admin, active, created_at, updated_at FROM "user" +WHERE id = $1 AND email = $2 +` + +type FindUserByIdAndEmailParams struct { + ID int64 `db:"id" json:"id"` + Email string `db:"email" json:"email"` +} + +func (q *Queries) FindUserByIdAndEmail(ctx context.Context, arg FindUserByIdAndEmailParams) (User, error) { + row := q.queryRow(ctx, q.findUserByIdAndEmailStmt, findUserByIdAndEmail, arg.ID, arg.Email) + var i User + err := row.Scan( + &i.ID, + &i.Name, + &i.Email, + &i.ImageUrl, + &i.Phone, + &i.Admin, + &i.Active, + &i.CreatedAt, + &i.UpdatedAt, + ) + return i, err +} + +const findUserByIdOrEmail = `-- name: FindUserByIdOrEmail :one +SELECT id, name, email, image_url, phone, admin, active, created_at, updated_at FROM "user" +WHERE id = $1 OR email = $2 +` + +type FindUserByIdOrEmailParams struct { + ID int64 `db:"id" json:"id"` + Email string `db:"email" json:"email"` +} + +func (q *Queries) FindUserByIdOrEmail(ctx context.Context, arg FindUserByIdOrEmailParams) (User, error) { + row := q.queryRow(ctx, q.findUserByIdOrEmailStmt, findUserByIdOrEmail, arg.ID, arg.Email) + var i User + err := row.Scan( + &i.ID, + &i.Name, + &i.Email, + &i.ImageUrl, + &i.Phone, + &i.Admin, + &i.Active, + &i.CreatedAt, + &i.UpdatedAt, + ) + return i, err +} + +const setUserAsAdmin = `-- name: SetUserAsAdmin :one +UPDATE "user" +SET "admin" = true +WHERE id = $1 +RETURNING id, name, email, image_url, phone, admin, active, created_at, updated_at +` + +func (q *Queries) SetUserAsAdmin(ctx context.Context, id int64) (User, error) { + row := q.queryRow(ctx, q.setUserAsAdminStmt, setUserAsAdmin, id) + var i User + err := row.Scan( + &i.ID, + &i.Name, + &i.Email, + &i.ImageUrl, + &i.Phone, + &i.Admin, + &i.Active, + &i.CreatedAt, + &i.UpdatedAt, + ) + return i, err +} diff --git a/src/database/wish.sql.go b/src/database/wish.sql.go new file mode 100644 index 00000000..149308e7 --- /dev/null +++ b/src/database/wish.sql.go @@ -0,0 +1,243 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.25.0 +// source: wish.sql + +package database + +import ( + "context" + "database/sql" +) + +const createWish = `-- name: CreateWish :one +INSERT INTO wish ( + user_id, + participant_id, + product_id, + event_id, + quantity, + created_at, + updated_at +) VALUES ( + $1, $2, $3, $4, COALESCE($5::INTEGER, 1), now(), now() +) RETURNING id, user_id, participant_id, product_id, event_id, created_at, updated_at, quantity +` + +type CreateWishParams struct { + UserID int64 `db:"user_id" json:"userId"` + ParticipantID int64 `db:"participant_id" json:"participantId"` + ProductID sql.NullInt64 `db:"product_id" json:"productId"` + EventID int64 `db:"event_id" json:"eventId"` + Quantity sql.NullInt32 `db:"quantity" json:"quantity"` +} + +func (q *Queries) CreateWish(ctx context.Context, arg CreateWishParams) (Wish, error) { + row := q.queryRow(ctx, q.createWishStmt, createWish, + arg.UserID, + arg.ParticipantID, + arg.ProductID, + arg.EventID, + arg.Quantity, + ) + var i Wish + err := row.Scan( + &i.ID, + &i.UserID, + &i.ParticipantID, + &i.ProductID, + &i.EventID, + &i.CreatedAt, + &i.UpdatedAt, + &i.Quantity, + ) + return i, err +} + +const deleteWish = `-- name: DeleteWish :one +DELETE FROM wish +WHERE id = $1 +RETURNING id +` + +func (q *Queries) DeleteWish(ctx context.Context, id int64) (int64, error) { + row := q.queryRow(ctx, q.deleteWishStmt, deleteWish, id) + err := row.Scan(&id) + return id, err +} + +const getAllWishesForUser = `-- name: GetAllWishesForUser :many +SELECT + wish.id, wish.user_id, wish.participant_id, wish.product_id, wish.event_id, wish.created_at, wish.updated_at, wish.quantity, + product.id, product.title, product.description, product.product_key, product.image_url, product.total_reviews, product.rating, product.price, product.currency, product.url, product.category_id, product.created_at, product.updated_at, product.product_ts, product.origin +FROM wish +INNER JOIN product ON product.id = wish.product_id +WHERE + wish.user_id = $1 AND + wish.participant_id = $2 AND + wish.event_id = $3 +ORDER BY wish.created_at DESC +` + +type GetAllWishesForUserParams struct { + UserID int64 `db:"user_id" json:"userId"` + ParticipantID int64 `db:"participant_id" json:"participantId"` + EventID int64 `db:"event_id" json:"eventId"` +} + +type GetAllWishesForUserRow struct { + Wish Wish `db:"wish" json:"wish"` + Product Product `db:"product" json:"product"` +} + +func (q *Queries) GetAllWishesForUser(ctx context.Context, arg GetAllWishesForUserParams) ([]GetAllWishesForUserRow, error) { + rows, err := q.query(ctx, q.getAllWishesForUserStmt, getAllWishesForUser, arg.UserID, arg.ParticipantID, arg.EventID) + if err != nil { + return nil, err + } + defer rows.Close() + var items []GetAllWishesForUserRow + for rows.Next() { + var i GetAllWishesForUserRow + if err := rows.Scan( + &i.Wish.ID, + &i.Wish.UserID, + &i.Wish.ParticipantID, + &i.Wish.ProductID, + &i.Wish.EventID, + &i.Wish.CreatedAt, + &i.Wish.UpdatedAt, + &i.Wish.Quantity, + &i.Product.ID, + &i.Product.Title, + &i.Product.Description, + &i.Product.ProductKey, + &i.Product.ImageUrl, + &i.Product.TotalReviews, + &i.Product.Rating, + &i.Product.Price, + &i.Product.Currency, + &i.Product.Url, + &i.Product.CategoryID, + &i.Product.CreatedAt, + &i.Product.UpdatedAt, + &i.Product.ProductTs, + &i.Product.Origin, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + +const getWishByAllIDs = `-- name: GetWishByAllIDs :one +SELECT id, user_id, participant_id, product_id, event_id, created_at, updated_at, quantity +FROM wish +WHERE + id = $1 AND + user_id = $2 AND + participant_id = $3 AND + event_id = $4 +` + +type GetWishByAllIDsParams struct { + ID int64 `db:"id" json:"id"` + UserID int64 `db:"user_id" json:"userId"` + ParticipantID int64 `db:"participant_id" json:"participantId"` + EventID int64 `db:"event_id" json:"eventId"` +} + +func (q *Queries) GetWishByAllIDs(ctx context.Context, arg GetWishByAllIDsParams) (Wish, error) { + row := q.queryRow(ctx, q.getWishByAllIDsStmt, getWishByAllIDs, + arg.ID, + arg.UserID, + arg.ParticipantID, + arg.EventID, + ) + var i Wish + err := row.Scan( + &i.ID, + &i.UserID, + &i.ParticipantID, + &i.ProductID, + &i.EventID, + &i.CreatedAt, + &i.UpdatedAt, + &i.Quantity, + ) + return i, err +} + +const getWishWithProductID = `-- name: GetWishWithProductID :one +SELECT id, user_id, participant_id, product_id, event_id, created_at, updated_at, quantity FROM wish +WHERE + user_id = $1 AND + event_id = $2 AND + participant_id = $3 AND + product_id = $4 +` + +type GetWishWithProductIDParams struct { + UserID int64 `db:"user_id" json:"userId"` + EventID int64 `db:"event_id" json:"eventId"` + ParticipantID int64 `db:"participant_id" json:"participantId"` + ProductID sql.NullInt64 `db:"product_id" json:"productId"` +} + +func (q *Queries) GetWishWithProductID(ctx context.Context, arg GetWishWithProductIDParams) (Wish, error) { + row := q.queryRow(ctx, q.getWishWithProductIDStmt, getWishWithProductID, + arg.UserID, + arg.EventID, + arg.ParticipantID, + arg.ProductID, + ) + var i Wish + err := row.Scan( + &i.ID, + &i.UserID, + &i.ParticipantID, + &i.ProductID, + &i.EventID, + &i.CreatedAt, + &i.UpdatedAt, + &i.Quantity, + ) + return i, err +} + +const updateWishQuantity = `-- name: UpdateWishQuantity :one +UPDATE wish +SET + quantity = $2, + updated_at = NOW() +WHERE id = $1 +RETURNING id, user_id, participant_id, product_id, event_id, created_at, updated_at, quantity +` + +type UpdateWishQuantityParams struct { + ID int64 `db:"id" json:"id"` + Quantity int32 `db:"quantity" json:"quantity"` +} + +func (q *Queries) UpdateWishQuantity(ctx context.Context, arg UpdateWishQuantityParams) (Wish, error) { + row := q.queryRow(ctx, q.updateWishQuantityStmt, updateWishQuantity, arg.ID, arg.Quantity) + var i Wish + err := row.Scan( + &i.ID, + &i.UserID, + &i.ParticipantID, + &i.ProductID, + &i.EventID, + &i.CreatedAt, + &i.UpdatedAt, + &i.Quantity, + ) + return i, err +} diff --git a/src/draws/draws.controller.ts b/src/draws/draws.controller.ts deleted file mode 100644 index a9863803..00000000 --- a/src/draws/draws.controller.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { Controller, Get, Post, Body, Patch, Param, Delete, UseGuards, Request, HttpException, HttpStatus } from '@nestjs/common'; -import { JwtAuthGuard } from 'src/auth/jwt-auth.guard'; -import { EventsService } from 'src/events/events.service'; -import { ParticipantsService } from 'src/participants/participants.service'; -import { UsersService } from 'src/users/users.service'; -import { DrawsService } from './draws.service'; -import { BAD_REQUEST } from 'src/util/exceptions'; -import { JwtStrategy } from '../auth/jwt.strategy'; -import { sendMail, namesDrawnMail } from '../util/sendgrid'; - -@Controller('draws') -export class DrawsController { - constructor( - private readonly drawsService: DrawsService, - private readonly usersService: UsersService, - private readonly eventsService: EventsService, - private readonly participantsService: ParticipantsService, - ) { } - - @UseGuards(JwtAuthGuard) - @Post() - async create(@Request() res, @Body() body: { eventId: number }) { - const user = await this.usersService.findByEmail(res.user.user.email); - const event = await this.eventsService.findOneForOrganizerUser(body.eventId, user); - if (!event) { - throw BAD_REQUEST('Something went wrong'); - } - return await this.drawsService.create(event, user); - } - - @UseGuards(JwtAuthGuard) - @Get('confirm/:eventId') - async confirmDraw(@Request() res, @Param('eventId') eventId: number) { - const user = await this.usersService.findByEmail(res.user.user.email); - const event = await this.eventsService.findOneForOrganizerUser(eventId, user); - if (!event) { - throw BAD_REQUEST('Something went wrong'); - } - - const draws = await this.drawsService.findAllWithUser(event); - - if (draws.length === 0) - throw BAD_REQUEST('No draws found for event'); - - // Mail all particiapnts about their draws - draws.forEach(({ drawer, drawee }) => { - namesDrawnMail(drawer.user, event, drawee); - }); - return { - message: "Participants are being notified!" - }; - } - - @UseGuards(JwtAuthGuard) - @Get(':eventId') - async findAll(@Request() res, @Param('eventId') eventId: number) { - const user = await this.usersService.findByEmail(res.user.user.email); - const event = await this.eventsService.findOneForOrganizerUser(eventId, user); - if (!event) { - throw BAD_REQUEST('Something went wrong'); - } - return await this.drawsService.findAllWithUser(event); - } - - @UseGuards(JwtAuthGuard) - @Get('me/:eventId') - async findForMe(@Request() res, @Param('eventId') eventId: number) { - const user = await this.usersService.findByEmail(res.user.user.email); - const event = await this.eventsService.findOneForUser(eventId, user); - if (!event) { - throw BAD_REQUEST('Event not found'); - } - - const participant = await this.participantsService.findByEventAndUser(event, user); - if (!participant) { - throw BAD_REQUEST('Something went wrong'); - } - - const draw = await this.drawsService.findForParticipant(event, participant); - if (!draw) { - throw BAD_REQUEST('No draws found for user'); - } - return draw; - } -} diff --git a/src/draws/draws.module.ts b/src/draws/draws.module.ts deleted file mode 100644 index 0b4cf612..00000000 --- a/src/draws/draws.module.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Module } from '@nestjs/common'; -import { DrawsService } from './draws.service'; -import { DrawsController } from './draws.controller'; -import { ParticipantsModule } from 'src/participants/participants.module'; -import { EventsModule } from 'src/events/events.module'; -import { UsersModule } from 'src/users/users.module'; -import { TypeOrmModule } from '@nestjs/typeorm'; -import { Draw } from './entities/draw.entity'; - -@Module({ - imports: [ - TypeOrmModule.forFeature([ - Draw - ]), - ParticipantsModule, - EventsModule, - UsersModule, - ], - controllers: [DrawsController], - providers: [DrawsService], - exports: [DrawsService] -}) -export class DrawsModule {} diff --git a/src/draws/draws.service.spec.ts b/src/draws/draws.service.spec.ts deleted file mode 100644 index 8086f4ed..00000000 --- a/src/draws/draws.service.spec.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { DrawsService } from './draws.service'; - -describe('DrawsService', () => { - let service: DrawsService; - - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - providers: [DrawsService], - }).compile(); - - service = module.get(DrawsService); - }); - - it('should be defined', () => { - expect(service).toBeDefined(); - }); -}); diff --git a/src/draws/draws.service.ts b/src/draws/draws.service.ts deleted file mode 100644 index 6e43371d..00000000 --- a/src/draws/draws.service.ts +++ /dev/null @@ -1,123 +0,0 @@ -import { Injectable, HttpException, HttpStatus } from '@nestjs/common'; -import { InjectRepository } from '@nestjs/typeorm'; -import { Draw } from './entities/draw.entity'; -import { Repository } from 'typeorm'; -import { Participant } from 'src/participants/entities/participant.entity'; -import { ParticipantsService } from 'src/participants/participants.service'; -import { User } from 'src/users/entities/user.entity'; -import { Event } from 'src/events/entities/event.entity'; -import { shuffle } from 'src/util/shuffle'; - -@Injectable() -export class DrawsService { - constructor( - @InjectRepository(Draw) - private readonly drawsRepository: Repository, - private readonly participantsService: ParticipantsService - ) { } - - async create(event: Event, user: User) { - const allParticipants = await this.participantsService.findAllByEventWithUser(event); - const participants = shuffle( - allParticipants - .filter(p => p.accepted && p.participates) - ); - return await this.generateDraw(participants, event); - } - - async findAll(event: Event): Promise { - return await this.drawsRepository - .createQueryBuilder('d') - .leftJoinAndSelect('d.drawer', 'p1') - .leftJoinAndSelect('d.drawee', 'p2') - .where('d.eventId = :eventId', { eventId: event.id }) - .getMany(); - } - - async findAllWithUser(event: Event): Promise { - return await this.drawsRepository - .createQueryBuilder('d') - .leftJoinAndSelect('d.drawer', 'p1') - .leftJoinAndSelect('d.drawee', 'p2') - .leftJoinAndSelect('p1.user', 'p1User') - .leftJoinAndSelect('p2.user', 'p2User') - .where('d.eventId = :eventId', { eventId: event.id }) - .getMany(); - } - - async findForParticipant(event: Event, participant: Participant): Promise { - return await this.drawsRepository - .createQueryBuilder('d') - .leftJoinAndSelect('d.drawer', 'p1') - .leftJoinAndSelect('d.drawee', 'p2') - .leftJoinAndSelect('p1.user', 'p1User') - .leftJoinAndSelect('p2.user', 'p2User') - .where('d.eventId = :eventId AND d.drawerId = :drawerId', - { - eventId: event.id, - drawerId: participant.id - }) - .getOne(); - } - - private async generateDraw(participants: Participant[], event: Event) { - await this.drawsRepository.createQueryBuilder() - .where('eventId = :eventId', { eventId: event.id }) - .delete() - .execute(); - - const allDraws = this.getDraws(participants.length); - const randomDraw = allDraws[Math.floor(Math.random() * allDraws.length)]; - const draws: Array = []; - - if (!randomDraw || randomDraw.size === 0) { - throw new HttpException({ - message: 'Could not process request' - }, HttpStatus.BAD_REQUEST); - } - - for (let [key, val] of randomDraw) { - const drawer = participants[key - 1]; - const drawee = participants[val - 1]; - - const draw = new Draw(); - draw.event = event; - draw.drawer = drawer; - draw.drawee = drawee; - draws.push(await draw.save()); - } - return draws; - } - - private getDraws(N: number): Array> { - const allParticipantsMaps = []; - - for (let i = 0; i < N; i++) { - const drawn = new Set(); - const pairs = new Map(); - const start = i + 1; - - for (let j = 0; j < N; j++) { - const index = j + 1; - let draw = start + index; - if (draw == index) - draw++; - if (draw > N) - draw %= N; - if (draw === 0) - draw++; - - if (drawn.has(draw) || draw === index) { - pairs.clear(); - break; - } - drawn.add(draw); - pairs.set(index, draw); - } - if (pairs.size == 0) - continue; - allParticipantsMaps.push(pairs); - } - return allParticipantsMaps; - } -} diff --git a/src/draws/dto/create-draw.dto.ts b/src/draws/dto/create-draw.dto.ts deleted file mode 100644 index 2488d474..00000000 --- a/src/draws/dto/create-draw.dto.ts +++ /dev/null @@ -1 +0,0 @@ -export class CreateDrawDto {} diff --git a/src/draws/dto/update-draw.dto.ts b/src/draws/dto/update-draw.dto.ts deleted file mode 100644 index 22ba3f8c..00000000 --- a/src/draws/dto/update-draw.dto.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { PartialType } from '@nestjs/mapped-types'; -import { CreateDrawDto } from './create-draw.dto'; - -export class UpdateDrawDto extends PartialType(CreateDrawDto) {} diff --git a/src/draws/entities/draw.entity.ts b/src/draws/entities/draw.entity.ts deleted file mode 100644 index bd295c39..00000000 --- a/src/draws/entities/draw.entity.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Event } from 'src/events/entities/event.entity'; -import { Participant } from 'src/participants/entities/participant.entity'; -import { BaseEntity, Column, Entity, ManyToOne, PrimaryGeneratedColumn, Index } from 'typeorm'; - -@Entity('draws') -export class Draw extends BaseEntity { - @Index({ unique: true }) - @PrimaryGeneratedColumn() - id: number; - - @Column('datetime') - createAt: Date = new Date(Date.now()); - - @Index() - @ManyToOne(() => Participant, participant => participant.drawers, { onDelete: 'CASCADE' }) - drawer: Participant; - - @ManyToOne(() => Participant, participant => participant.drawees, { onDelete: 'CASCADE' }) - drawee: Participant; - - @Index() - @ManyToOne(() => Event, event => event.draws, { onDelete: 'CASCADE' }) - event: Event; -} diff --git a/src/events/dto/create-event.dto.ts b/src/events/dto/create-event.dto.ts deleted file mode 100644 index 19ba029f..00000000 --- a/src/events/dto/create-event.dto.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { CreateParticipantDto } from "src/participants/dto/create-participant.dto"; - -export class CreateEventDto { - name: string; - description: string; - budget: number; - invitationMessage: string; - drawAt: Date; - closeAt: Date; - participants: CreateParticipantDto[] -} diff --git a/src/events/dto/update-event.dto.ts b/src/events/dto/update-event.dto.ts deleted file mode 100644 index 304f9500..00000000 --- a/src/events/dto/update-event.dto.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { PartialType } from '@nestjs/mapped-types'; -import { CreateEventDto } from './create-event.dto'; - -export class UpdateEventDto extends PartialType(CreateEventDto) {} diff --git a/src/events/entities/event.entity.ts b/src/events/entities/event.entity.ts deleted file mode 100644 index cd515ed8..00000000 --- a/src/events/entities/event.entity.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { BaseEntity, Column, Entity, Index, OneToMany, PrimaryGeneratedColumn } from 'typeorm'; -import { Participant } from 'src/participants/entities/participant.entity'; -import Link from 'src/links/entity/link.entity'; -import { Wish } from 'src/wishes/entities/wish.entity'; -import { Draw } from 'src/draws/entities/draw.entity'; - -@Entity('events') -export class Event extends BaseEntity { - @Index({ unique: true }) - @PrimaryGeneratedColumn() - id: number; - - @Column() - name: string; - - @Column('text', { nullable: true }) - description: string; - - @Column('decimal') - budget: number; - - @Column('text') - invitationMessage: string; - - @Column('datetime') - createdAt: Date = new Date(Date.now()); - - @Column('datetime') - drawAt: Date; - - @Column('datetime') - closeAt: Date; - - @OneToMany(() => Participant, participant => participant.event) - participants: Participant[]; - - @OneToMany(() => Link, link => link.event) - links: Link[]; - - @OneToMany(() => Wish, wish => wish.event) - wishes: Wish[]; - - @OneToMany(() => Draw, draw => draw.event) - draws: Draw[]; -} diff --git a/src/events/events.controller.ts b/src/events/events.controller.ts deleted file mode 100644 index 924ce7b6..00000000 --- a/src/events/events.controller.ts +++ /dev/null @@ -1,203 +0,0 @@ -import { Controller, Get, Post, Body, Patch, Param, Delete, UseGuards, Request, HttpStatus, HttpException, Query } from '@nestjs/common'; -import { EventsService } from './events.service'; -import { CreateEventDto } from './dto/create-event.dto'; -import { UpdateEventDto } from './dto/update-event.dto'; -import { JwtAuthGuard } from 'src/auth/jwt-auth.guard'; -import { UsersService } from 'src/users/users.service'; -import { Event } from './entities/event.entity'; -import { ParticipantsService } from '../participants/participants.service'; -import Link from 'src/links/entity/link.entity'; -import { LinksService } from 'src/links/links.service'; -import { Participant } from 'src/participants/entities/participant.entity'; -import { BAD_REQUEST, NOT_FOUND } from 'src/util/exceptions'; -import { newParticipantMail } from '../util/sendgrid'; -import { User } from 'src/users/entities/user.entity'; -import { FRONTEND_BASE } from '../../auth-tokens.json' - -@Controller('events') -export class EventsController { - constructor( - private readonly eventsService: EventsService, - private readonly usersService: UsersService, - private readonly participantsService: ParticipantsService, - private readonly linksService: LinksService, - ) { } - - @UseGuards(JwtAuthGuard) - @Post() - async create(@Request() req, @Body() createEventDto: CreateEventDto): Promise { - const user = await this.usersService.findOne(req.user.user.email); - return await this.eventsService - .create(createEventDto, user); - } - - @UseGuards(JwtAuthGuard) - @Get() - async findAll(@Request() req, @Query('user') u: boolean): Promise { - const user = await this.usersService.findByEmail(req.user.user.email); - - if (u) - return await this.eventsService.findAllForUserWithParticipantUser(user); - return await this.eventsService.findAllForUser(user); - } - - @UseGuards(JwtAuthGuard) - @Get('/invites') - async findAllInvites(@Request() req): Promise { - const user = await this.usersService.findByEmail(req.user.user.email); - return await this.eventsService.findAllInvitesForUser(user); - } - - @UseGuards(JwtAuthGuard) - @Get('/invites/accept/:eventId') - async acceptInvite(@Request() req, @Param('eventId') eventId: number): Promise { - const user = await this.usersService.findByEmail(req.user.user.email); - const event = await this.eventsService.findOne(eventId); - if (!event) { - throw NOT_FOUND('Event not found'); - } - - const newParticipant = await this.participantsService.acceptEvent(event, user); - const finalEvent = await this.eventsService.findOneForUser(eventId, user); - - // Send mail to all participants - newParticipant - const allParticipants = await this.participantsService.findAllByEventWithUser(event); - newParticipant.user = user; // Set user field so template can access imageUrl - allParticipants.filter(p => p.email != newParticipant.email).forEach(p => { - if (!p.accepted) { - // Create fake user data if participant has not accepted invite yet - const fakeUser = new User(); - fakeUser.imageUrl = `${FRONTEND_BASE}default.jpg` - fakeUser.email = p.email; - fakeUser.name = p.name; - newParticipantMail(fakeUser, event, newParticipant); - } else { - newParticipantMail(p.user, event, newParticipant); - } - }) - - return finalEvent; - } - - @UseGuards(JwtAuthGuard) - @Get('/invites/decline/:eventId') - async declineInvite(@Request() req, @Param('eventId') eventId: number): Promise { - const user = await this.usersService.findByEmail(req.user.user.email); - const event = await this.eventsService.findOne(eventId); - if (!event) { - throw NOT_FOUND('Event not found'); - } - - return await this.participantsService.declineEvent(event, user); - } - - @UseGuards(JwtAuthGuard) - @Post('get-link/:eventId') - async createLink(@Request() req, @Param('eventId') eventId: number, @Body() { expirationDate }: { expirationDate: Date }): Promise { - const user = await this.usersService.findByEmail(req.user.user.email); - const event = await this.eventsService.findOne(eventId); - return await this.eventsService - .createLinkForEvent(event, user, expirationDate); - } - - @Get('verify-invite-code/:inviteCode') - async verifyInviteCode(@Param('inviteCode') inviteCode: string) { - const link = await this.linksService.findOne(inviteCode); - if (!link) { - throw NOT_FOUND('Invalid or expired invitation code.'); - } - return link; - } - - @UseGuards(JwtAuthGuard) - @Get('invite-code/:inviteCode') - async inviteCode(@Request() req, @Param('inviteCode') inviteCode: string) { - const user = await this.usersService.findByEmail(req.user.user.email); - const link = await this.linksService.findOne(inviteCode); - if (!link) { - throw NOT_FOUND('Invalid or expired invitation code.'); - } - const event = await this.eventsService.findOneByLink(link); - const participant = await this.participantsService.create({ - name: user.name, - email: user.email, - address: '', - participates: true, - organizer: false, - accepted: false - }, event); - return await this.eventsService.findOneForUser(event.id, user); - } - - @UseGuards(JwtAuthGuard) - @Get(':eventId') - async findOne(@Request() req, @Param('eventId') eventId: number, @Query('verify') verify: boolean) { - const user = await this.usersService.findByEmail(req.user.user.email); - - if (verify) { - try { - const eventInfo = await this.eventsService.findEventDetails(eventId, user); - return { - id: eventInfo.id, - name: eventInfo.name, - description: eventInfo.description - } - } catch (e) { - throw NOT_FOUND("Event not found"); - } - } - - try { - return await this.eventsService.findOne(eventId, user); - } catch (e) { - throw NOT_FOUND("Event not found"); - } - } - - @UseGuards(JwtAuthGuard) - @Patch(':eventId') - async update(@Request() req, @Param('eventId') eventId: number, @Body() updateEventDto: UpdateEventDto) { - const user = await this.usersService.findByEmail(req.user.user.email); - const event = await this.eventsService.findOneForUser(eventId, user); - if (!event) { - throw NOT_FOUND("Event not found"); - } - - const participant = await this.participantsService.findByEventAndOrganizer(event, user); - if (!participant) { - throw BAD_REQUEST("Operation not allowed for non-organizer users"); - } - return await this.eventsService.update(event, updateEventDto, user); - } - - @UseGuards(JwtAuthGuard) - @Delete(':eventId') - async remove(@Request() req, @Param('eventId') eventId: number) { - const user = await this.usersService.findByEmail(req.user.user.email); - const event = await this.eventsService.findOneForUser(eventId, user); - if (!event) { - throw NOT_FOUND("Event not found"); - } - - const participant = await this.participantsService.findByEventAndOrganizer(event, user); - if (!participant) { - throw BAD_REQUEST("Delete not allowed for non-organizer users"); - } - const deleteStatus = await this.eventsService.remove(eventId); - return { - message: 'Event deleted' - }; - } - - @Get('get-details/:linkCode') - async getEventDetailsFromCode(@Param('linkCode') linkCode: string): Promise<{ name: string, description: string }> { - const link = await this.linksService.findOneWithEvent(linkCode.trim()); - if (!link) - throw BAD_REQUEST('Invalid invite code'); - - return { - name: link.event.name, - description: link.event.description - }; - } -} diff --git a/src/events/events.module.ts b/src/events/events.module.ts deleted file mode 100644 index 19c99c48..00000000 --- a/src/events/events.module.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Module, forwardRef } from '@nestjs/common'; -import { EventsService } from './events.service'; -import { EventsController } from './events.controller'; -import { TypeOrmModule } from '@nestjs/typeorm'; -import { Event } from './entities/event.entity'; -import { ParticipantsModule } from 'src/participants/participants.module'; -import { UsersModule } from 'src/users/users.module'; -import { LinksModule } from 'src/links/links.module'; - -@Module({ - imports: [ - TypeOrmModule.forFeature([Event]), - forwardRef(() => ParticipantsModule), - UsersModule, - LinksModule, - ], - controllers: [EventsController], - providers: [EventsService], - exports: [EventsService], -}) -export class EventsModule {} diff --git a/src/events/events.service.spec.ts b/src/events/events.service.spec.ts deleted file mode 100644 index f26bdfe3..00000000 --- a/src/events/events.service.spec.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { EventsService } from './events.service'; - -describe('EventsService', () => { - let service: EventsService; - - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - providers: [EventsService], - }).compile(); - - service = module.get(EventsService); - }); - - it('should be defined', () => { - expect(service).toBeDefined(); - }); -}); diff --git a/src/events/events.service.ts b/src/events/events.service.ts deleted file mode 100644 index 8c2f4a89..00000000 --- a/src/events/events.service.ts +++ /dev/null @@ -1,264 +0,0 @@ -import { HttpException, Injectable, HttpStatus } from '@nestjs/common'; -import { InjectRepository } from '@nestjs/typeorm'; -import { CreateEventDto } from './dto/create-event.dto'; -import { UpdateEventDto } from './dto/update-event.dto'; -import { Repository } from 'typeorm'; -import { Event } from './entities/event.entity' -import { Participant } from 'src/participants/entities/participant.entity'; -import { ParticipantsService } from '../participants/participants.service'; -import { User } from 'src/users/entities/user.entity'; -import { CreateParticipantDto } from 'src/participants/dto/create-participant.dto'; -import Link from 'src/links/entity/link.entity'; -import { LinksService } from '../links/links.service'; - -@Injectable() -export class EventsService { - constructor( - @InjectRepository(Event) - private readonly eventsRepository: Repository, - private readonly participantsService: ParticipantsService, - private readonly linksService: LinksService, - ) {} - - async create( - createEventDto: CreateEventDto, - organizer: User, - ): Promise { - const event = new Event(); - event.name = createEventDto.name; - event.description = createEventDto.description; - event.budget = createEventDto.budget; - event.invitationMessage = createEventDto.invitationMessage; - event.drawAt = createEventDto.drawAt; - event.closeAt = createEventDto.closeAt; - - const newEvent = await event.save(); - - const participants = await this.addAllParticipants( - createEventDto.participants, - organizer, - newEvent, - ); - return await this.findOneForUser(newEvent.id, organizer); - } - - /** - * Returns an event with only the id, name, and description - * @param id Event id - * @param user - * @returns - */ - async findEventDetails(id: number, user: User) { - return await this.eventsRepository - .createQueryBuilder('e') - .select(['e.id', 'e.name', 'e.description']) - .innerJoin('e.participants', 'p') - .where( - 'e.id = :eventId AND (p.userId = :userId OR p.email = :userEmail)', - { - userId: user.id, - userEmail: user.email, - eventId: id, - }, - ) - .getOneOrFail(); - } - - /** - * Returns an a full event with authentication, if user is provided (i.e. participants, link). - * If user is not provided, this method returns an event with no joins (i.e. no participants, link, etc. + no authentication) - * - * @param id - * @param user - * @returns - */ - async findOne(id: number, user?: User): Promise { - if (!user) return await this.eventsRepository.findOne(id); - - return await this.eventsRepository - .createQueryBuilder('e') - .innerJoin('e.participants', 'p1') - .leftJoinAndSelect('e.participants', 'p2') - .leftJoinAndSelect('p2.user', 'u') - .leftJoinAndSelect('e.links', 'l') - .where( - 'e.id = :eventId AND (p1.userId = :userId OR p1.email = :userEmail)', - { - userId: user.id, - userEmail: user.email, - eventId: id, - }, - ) - .getOneOrFail(); - } - - async findOneForUser(id: number, user: User): Promise { - return await this.eventsRepository - .createQueryBuilder('e') - .innerJoinAndSelect('e.participants', 'p') - .where('e.id = :eventId AND p.userId = :userId', { - userId: user.id, - eventId: id, - }) - .getOne(); - } - - async findOneForOrganizerUser(id: number, user: User): Promise { - return await this.eventsRepository - .createQueryBuilder('e') - .innerJoinAndSelect('e.participants', 'p') - .where('e.id = :eventId AND p.userId = :userId AND p.organizer = true', { - userId: user.id, - eventId: id, - }) - .getOne(); - } - - async findAllForUser(user: User): Promise { - return await this.eventsRepository - .createQueryBuilder('e') - .innerJoinAndSelect('e.participants', 'p') - .where('p.userId = :userId', { userId: user.id }) - .orderBy('e.drawAt', 'DESC') - .getMany(); - } - - async findAllForUserWithParticipantUser(user: User) { - return await this.eventsRepository - .createQueryBuilder('e') - .innerJoinAndSelect('e.participants', 'p1') - .leftJoinAndSelect('e.participants', 'p2') - .innerJoinAndSelect('p2.user', 'p2User') - .where('p1.userId = :userId', { userId: user.id }) - .orderBy('e.drawAt', 'DESC') - .getMany(); - } - - async findAllInvitesForUser(user: User): Promise { - return await this.eventsRepository - .createQueryBuilder('e') - .innerJoinAndSelect('e.participants', 'p') - .where('p.accepted = 0 AND p.email = :email', { - email: user.email, - }) - .getMany(); - } - - async createLinkForEvent( - event: Event, - user: User, - expirationDate: Date, - ): Promise { - const participant = await this.participantsService.findByEventAndOrganizer( - event, - user, - ); - if (!participant) { - throw new HttpException( - { - message: 'Could not perform operation', - }, - HttpStatus.BAD_REQUEST, - ); - } - return this.linksService.create(event, expirationDate); - } - - async findOneByLink(link: Link): Promise { - return await this.eventsRepository - .createQueryBuilder('e') - .innerJoin('e.links', 'l') - .where('l.code = :linkCode', { linkCode: `${link.code}` }) - .getOne(); - } - - async isUserPartOfEvent(event: Event, user: User): Promise { - const participant = await this.participantsService.findByEventAndUser( - event, - user, - ); - return participant ? true : false; - } - - async isUserPartOfEventShallow(event: Event, user: User): Promise { - const participant = - await this.participantsService.findByEventAndShallowUser( - event, - user.email, - ); - return participant ? true : false; - } - - async update(event: Event, updateEventDto: UpdateEventDto, user?: User) { - const updated = await this.eventsRepository.update( - { id: event.id }, - updateEventDto, - ); - - // If draw date is updated then also update link expiration - if (updateEventDto.drawAt) { - // No need to use await since we don't return the value - this.linksService.updateExpriationDate(event, updateEventDto.drawAt); - } - return await this.findOne(event.id, user); - } - - async remove(id: number) { - return await this.eventsRepository.delete({ id: id }); - } - - private checkForMainOrganizer( - createParticipants: CreateParticipantDto[], - organizer: User, - ): boolean { - let found = false; - createParticipants.forEach((p) => { - if (p.email === organizer.email) { - found = true; - - if (!p.organizer) { - throw new HttpException( - { - message: `${organizer.name} (${organizer.email}) must have organizer set as \`true\``, - }, - HttpStatus.BAD_REQUEST, - ); - } - } - }); - return found; - } - - private async addAllParticipants( - createParticipants: CreateParticipantDto[], - organizer: User, - event: Event, - ): Promise { - if (!this.checkForMainOrganizer(createParticipants, organizer)) { - throw new HttpException( - { - message: `${organizer.name} (${organizer.email}) must be a participant. If you don't want to participate set participates to \`false\``, - }, - HttpStatus.BAD_REQUEST, - ); - } - - // Add all participants - const participants = Array(); - for (const p of createParticipants) { - if (p.email === '' || p.name === '') continue; - - if (p.email === organizer.email) { - // The main organizer must have to have a valid account. - // Therefore, set accepted to true - p.accepted = true; - participants.push( - await this.participantsService.create(p, event, organizer), - ); - } else { - participants.push(await this.participantsService.create(p, event)); - } - } - return participants; - } -} diff --git a/src/google/google.controller.spec.ts b/src/google/google.controller.spec.ts deleted file mode 100644 index a3e655e9..00000000 --- a/src/google/google.controller.spec.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { GoogleController } from './google.controller'; - -describe('GoogleController', () => { - let controller: GoogleController; - - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - controllers: [GoogleController], - }).compile(); - - controller = module.get(GoogleController); - }); - - it('should be defined', () => { - expect(controller).toBeDefined(); - }); -}); diff --git a/src/google/google.controller.ts b/src/google/google.controller.ts deleted file mode 100644 index 0c691e48..00000000 --- a/src/google/google.controller.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { Controller, Get, HttpException, HttpStatus, Req, UseGuards } from '@nestjs/common'; -import { GoogleService } from 'src/google/google.service'; -import { AuthGuard } from '@nestjs/passport'; - -@Controller('auth/google') -export class GoogleController { - constructor(private readonly googleServices: GoogleService) { } - - @Get() - @UseGuards(AuthGuard('google')) - async googleAuth(@Req() req) { } - - @Get('redirect') - @UseGuards(AuthGuard('google')) - async googleAuthRedirect(@Req() req) { - const user = req.user; - - if (!user) - throw new HttpException({ - message: 'Something went wrong while trying to authenticate' - }, HttpStatus.BAD_REQUEST) - - return await this.googleServices.googleLogin({ - accessToken: user.accessToken, - email: user.email, - firstName: user.firstName, - lastName: user.lastName, - picture: user.picture - }) - } -} diff --git a/src/google/google.module.ts b/src/google/google.module.ts deleted file mode 100644 index e6d6072d..00000000 --- a/src/google/google.module.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Module } from '@nestjs/common'; -import { AuthModule } from 'src/auth/auth.module'; -import { GoogleService } from 'src/google/google.service'; -import { GoogleController } from './google.controller'; -import { GoogleStrategy } from './google.strategy'; - -@Module({ - imports: [AuthModule], - controllers: [GoogleController], - providers: [GoogleService, GoogleStrategy] -}) -export class GoogleModule { } diff --git a/src/google/google.service.ts b/src/google/google.service.ts deleted file mode 100644 index e9aedb27..00000000 --- a/src/google/google.service.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { Injectable } from '@nestjs/common'; -import { AuthService } from 'src/auth/auth.service'; - -@Injectable() -export class GoogleService { - constructor(private readonly authServices: AuthService) { } - - async googleLogin(user: { - accessToken: string, - email: string, - firstName: string, - lastName: string, - picture: string - }) { - const fullname = user.lastName ? `${user.firstName} ${user.lastName}` : user.firstName; - return await this.authServices - .login( - { - email: user.email, - name: fullname, - imageUrl: user.picture - }, - user.accessToken - ); - } -} \ No newline at end of file diff --git a/src/google/google.strategy.ts b/src/google/google.strategy.ts deleted file mode 100644 index 713c17ca..00000000 --- a/src/google/google.strategy.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { PassportStrategy } from '@nestjs/passport'; -import { Strategy, VerifyCallback } from 'passport-google-oauth20'; -import { GOOGLE } from '../../auth-tokens.json' -import { frontend } from 'src/util/external-routes' - -import { Injectable } from '@nestjs/common'; - -@Injectable() -export class GoogleStrategy extends PassportStrategy(Strategy, 'google') { - - constructor() { - super({ - clientID: GOOGLE.CLIENT_ID, - clientSecret: GOOGLE.CLIENT_SECRET, - callbackURL: frontend.google, - scope: ['email', 'profile'], - }); - } - - async validate(accessToken: string, refreshToken: string, profile: any, done: VerifyCallback): Promise { - const { name, emails, photos } = profile - const user = { - email: emails[0].value, - firstName: name.givenName, - lastName: name.familyName, - picture: photos[0].value, - accessToken - } - done(null, user); - } -} \ No newline at end of file diff --git a/src/links/entity/link.entity.ts b/src/links/entity/link.entity.ts deleted file mode 100644 index 586ef00d..00000000 --- a/src/links/entity/link.entity.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { BaseEntity, Column, Entity, PrimaryGeneratedColumn, ManyToOne, Index } from 'typeorm'; -import { Event } from 'src/events/entities/event.entity'; - -@Entity('links') -export default class Link extends BaseEntity { - @Index({ unique: true }) - @PrimaryGeneratedColumn() - id: number; - - @Index({ unique: true }) - @Column({ unique: true }) - code: string; - - @Column('datetime') - createdAt: Date = new Date(Date.now()); - - @Column('datetime') - expirationDate: Date; - - @Index() - @ManyToOne(() => Event, event => event.links, { onDelete: 'CASCADE' }) - event: Event; -} \ No newline at end of file diff --git a/src/links/links.module.ts b/src/links/links.module.ts deleted file mode 100644 index 898ed70b..00000000 --- a/src/links/links.module.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Module } from '@nestjs/common'; -import { TypeOrmModule } from '@nestjs/typeorm'; -import { LinksService } from './links.service'; -import Link from './entity/link.entity'; - -@Module({ - imports: [ - TypeOrmModule.forFeature([ - Link - ]) - ], - providers: [LinksService], - exports: [LinksService] -}) -export class LinksModule { } diff --git a/src/links/links.service.spec.ts b/src/links/links.service.spec.ts deleted file mode 100644 index e5a184aa..00000000 --- a/src/links/links.service.spec.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { LinksService } from './links.service'; - -describe('LinkService', () => { - let service: LinksService; - - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - providers: [LinksService], - }).compile(); - - service = module.get(LinksService); - }); - - it('should be defined', () => { - expect(service).toBeDefined(); - }); -}); diff --git a/src/links/links.service.ts b/src/links/links.service.ts deleted file mode 100644 index 19c08689..00000000 --- a/src/links/links.service.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { Injectable } from '@nestjs/common'; -import { InjectRepository } from '@nestjs/typeorm'; -import { Repository } from 'typeorm'; -import Link from './entity/link.entity'; -import { generate } from 'randomstring'; -import { Event } from 'src/events/entities/event.entity'; - -@Injectable() -export class LinksService { - private readonly codeLen = 15; - - constructor( - @InjectRepository(Link) - private readonly linksRepository: Repository, - ) { } - - async findOne(code: string): Promise { - return await this.linksRepository - .createQueryBuilder('l') - .where('l.code = :code AND expirationDate > CURRENT_DATE()', { - code: `${code}` - }) - .getOne(); - } - - /** - * Find link with a join on event - */ - async findOneWithEvent(code: string): Promise { - return await this.linksRepository - .createQueryBuilder('l') - .leftJoinAndSelect('l.event', 'e') - .where('l.code = :code', { code: `${code}` }) - .getOne(); - } - - async findByEvent(event: Event): Promise { - return await this.linksRepository - .createQueryBuilder('l') - .where('l.eventId = :eventId', { eventId: event.id }) - .getOne(); - } - - async generateValidCode(): Promise { - let code = generate(this.codeLen); - let link = await this.findOne(code); - while (link) { - code = generate(this.codeLen); - link = await this.findOne(code); - } - return code; - } - - async create(event: Event, expirationDate?: Date): Promise { - const link = new Link(); - link.code = await this.generateValidCode(); - link.event = event; - if (expirationDate) - link.expirationDate = expirationDate; - return await link.save(); - } - - async updateExpriationDate(event: Event, newExpirationDate: Date) { - const link = await this.findByEvent(event); - return await this.linksRepository.update(link, { expirationDate: newExpirationDate }); - } -} diff --git a/src/main.ts b/src/main.ts deleted file mode 100644 index 916b7f2a..00000000 --- a/src/main.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { NestFactory } from '@nestjs/core'; -import { AppModule } from './app.module'; - -async function bootstrap() { - const app = await NestFactory.create(AppModule); - app.enableCors(); - await app.listen(3001); -} -bootstrap(); diff --git a/src/mappers/event_mapper.go b/src/mappers/event_mapper.go new file mode 100644 index 00000000..bd2a3a3c --- /dev/null +++ b/src/mappers/event_mapper.go @@ -0,0 +1,114 @@ +package mappers + +import ( + "database/sql" + "fmt" + + "github.com/giftxtrade/api/src/database" + "github.com/giftxtrade/api/src/types" + "github.com/gosimple/slug" + "golang.org/x/exp/maps" +) + +func CreateEventToDbCreateEventParams(input types.CreateEvent) database.CreateEventParams { + return database.CreateEventParams{ + Name: input.Name, + Description: sql.NullString{ + String: input.Description, + Valid: input.Description != "", + }, + Budget: fmt.Sprintf("%f", input.Budget), + InvitationMessage: input.InvitationMessage, + DrawAt: input.DrawAt, + CloseAt: input.CloseAt, + } +} + +func DbEventToEvent(event database.Event, participants []types.Participant, links []types.Link) types.Event { + return types.Event{ + ID: event.ID, + Name: event.Name, + Slug: slug.Make(event.Name), + Description: event.Description.String, + Budget: event.Budget, + InvitationMessage: event.InvitationMessage, + DrawAt: event.DrawAt, + CloseAt: event.CloseAt, + CreatedAt: event.CreatedAt, + UpdatedAt: event.UpdatedAt, + Participants: participants, + Links: links, + } +} + +func DbEventsToEventsSimple(event []database.Event) []types.Event { + events := make([]types.Event, len(event)) + for i, row := range event { + events[i] = DbEventToEvent(row, nil, nil) + } + return events +} + +func DbEventLinkToEvent(event_link database.EventLink) types.Event { + db_event := database.Event{ + ID: event_link.ID, + Name: event_link.Name, + Description: event_link.Description, + Budget: event_link.Budget, + InvitationMessage: event_link.InvitationMessage, + DrawAt: event_link.DrawAt, + CloseAt: event_link.CloseAt, + CreatedAt: event_link.CreatedAt, + UpdatedAt: event_link.UpdatedAt, + } + return DbEventToEvent(db_event, nil, nil) +} + +func DbFindAllEventsWithUserRowToEvent(rows []database.FindAllEventsWithUserRow) []types.Event { + events := []types.Event{} + var prev_event_id int64 = 0 + for _, row := range rows { + if row.Event.ID != prev_event_id { + participant := DbParticipantUserToParticipant(row.ParticipantUser, nil) + mapped_event := DbEventToEvent(row.Event, []types.Participant{participant}, nil) + events = append(events, mapped_event) + + prev_event_id = row.Event.ID + continue + } + last_index := len(events) - 1 + events[last_index].Participants = append( + events[last_index].Participants, + DbParticipantUserToParticipant(row.ParticipantUser, nil), + ) + } + return events +} + +func DbFindEventByIdToEvent(rows []database.FindEventByIdRow) types.Event { + event := DbEventLinkToEvent(rows[0].EventLink) + link_map := map[int64]types.Link{} + participant_map := map[int64]types.Participant{} + participants := []types.Participant{} // TODO: optimize by preallocating memory + for _, row := range rows { + el := row.EventLink + if el.LinkID.Valid && link_map[el.LinkID.Int64] == (types.Link{}) { + link_map[el.LinkID.Int64] = types.Link{ + ID: el.LinkID.Int64, + Code: el.LinkCode.String, + ExpirationDate: el.LinkExpirationDate.Time, + EventID: el.ID, + } + } + + pu := row.ParticipantUser + if pu != (database.ParticipantUser{}) && participant_map[pu.ID] == (types.Participant{}) { + mapped_participant := DbParticipantUserToParticipant(pu, nil) + participant_map[pu.ID] = mapped_participant + participants = append(participants, mapped_participant) + } + } + event.Links = maps.Values(link_map) + event.Participants = participants + return event +} diff --git a/src/mappers/link_mapper.go b/src/mappers/link_mapper.go new file mode 100644 index 00000000..bef1eb7a --- /dev/null +++ b/src/mappers/link_mapper.go @@ -0,0 +1,20 @@ +package mappers + +import ( + "github.com/giftxtrade/api/src/database" + "github.com/giftxtrade/api/src/types" +) + +func DbLinkToLink(link database.Link, event *database.Event) types.Link { + mapped_link := types.Link{ + ID: link.ID, + Code: link.Code, + ExpirationDate: link.ExpirationDate, + EventID: link.EventID, + } + if event != nil { + event := DbEventToEvent(*event, nil, nil) + mapped_link.Event = &event + } + return mapped_link +} diff --git a/src/mappers/participant_mapper.go b/src/mappers/participant_mapper.go new file mode 100644 index 00000000..171090bf --- /dev/null +++ b/src/mappers/participant_mapper.go @@ -0,0 +1,77 @@ +package mappers + +import ( + "database/sql" + + "github.com/giftxtrade/api/src/database" + "github.com/giftxtrade/api/src/types" +) + +func CreateParticipantToDbCreateParticipantParams(input types.CreateParticipant, event *database.Event) database.CreateParticipantParams { + return database.CreateParticipantParams{ + Name: input.Name, + Email: input.Email, + Organizer: input.Organizer, + Participates: input.Participates, + Accepted: false, + EventID: event.ID, + Address: sql.NullString{ + Valid: input.Address != "", + String: input.Address, + }, + } +} + +func DbParticipantToParticipant(participant database.Participant, event *database.Event, user *database.User) types.Participant { + result := types.Participant{ + ID: participant.ID, + Name: participant.Name, + Email: participant.Email, + Address: participant.Address.String, + Organizer: participant.Organizer, + Participates: participant.Participates, + Accepted: participant.Accepted, + EventID: participant.EventID, + } + if participant.UserID.Valid { + result.UserID = participant.UserID.Int64 + } + if event != nil { + event := DbEventToEvent(*event, nil, nil) + result.Event = &event + result.EventID = event.ID + } + if user != nil { + user := DbUserToUser(*user) + result.User = &user + result.UserID = user.ID + } + return result +} + +func DbParticipantUserToParticipant(participant_user database.ParticipantUser, event *database.Event) types.Participant { + var user *database.User = nil + if participant_user.UserID.Valid { + user = &database.User{ + ID: participant_user.UserID.Int64, + Name: participant_user.UserName.String, + Email: participant_user.UserEmail.String, + ImageUrl: participant_user.UserImageUrl.String, + } + } + return DbParticipantToParticipant( + database.Participant{ + ID: participant_user.ID, + Name: participant_user.Name, + Email: participant_user.Email, + Address: participant_user.Address, + Organizer: participant_user.Organizer, + Participates: participant_user.Participates, + Accepted: participant_user.Accepted, + EventID: participant_user.EventID, + UserID: participant_user.UserID, + }, + event, + user, + ) +} diff --git a/src/mappers/product_mapper.go b/src/mappers/product_mapper.go new file mode 100644 index 00000000..24374d43 --- /dev/null +++ b/src/mappers/product_mapper.go @@ -0,0 +1,34 @@ +package mappers + +import ( + "github.com/giftxtrade/api/src/database" + "github.com/giftxtrade/api/src/types" +) + +func DbProductToProduct(product database.Product, category *database.Category) types.Product { + result := types.Product{ + ID: product.ID, + Title: product.Title, + Description: product.Description.String, + ProductKey: product.ProductKey, + ImageUrl: product.ImageUrl, + TotalReviews: product.TotalReviews, + Rating: product.Rating, + Price: product.Price, + Currency: string(product.Currency), + Url: product.Url, + CreatedAt: product.CreatedAt, + UpdatedAt: product.UpdatedAt, + Origin: product.Origin, + CategoryID: product.CategoryID.Int64, + } + if category != nil { + result.CategoryID = category.ID + result.Category = types.Category{ + ID: category.ID, + Name: category.Name, + Description: category.Description.String, + } + } + return result +} diff --git a/src/mappers/user_mapper.go b/src/mappers/user_mapper.go new file mode 100644 index 00000000..84c212be --- /dev/null +++ b/src/mappers/user_mapper.go @@ -0,0 +1,28 @@ +package mappers + +import ( + "github.com/giftxtrade/api/src/database" + "github.com/giftxtrade/api/src/types" +) + +func CreateUserToCreateUserParams(input types.CreateUser) database.CreateUserParams { + return database.CreateUserParams{ + Name: input.Name, + Email: input.Email, + ImageUrl: input.ImageUrl, + Active: true, + Admin: false, + } +} + +func DbUserToUser(user database.User) types.User { + return types.User{ + ID: user.ID, + Name: user.Name, + Email: user.Email, + ImageUrl: user.ImageUrl, + Active: user.Active, + Phone: user.Phone.String, + Admin: user.Admin, + } +} diff --git a/src/mappers/wish_mapper.go b/src/mappers/wish_mapper.go new file mode 100644 index 00000000..971fbc21 --- /dev/null +++ b/src/mappers/wish_mapper.go @@ -0,0 +1,22 @@ +package mappers + +import ( + "github.com/giftxtrade/api/src/database" + "github.com/giftxtrade/api/src/types" +) + +func DbWishToWish(wish database.Wish, product *database.Product) types.Wish { + result := types.Wish{ + ID: wish.ID, + UserID: wish.UserID, + ParticipantID: wish.ParticipantID, + EventID: wish.EventID, + Quantity: wish.Quantity, + } + if product != nil { + result.ProductID = product.ID + product := DbProductToProduct(*product, nil) + result.Product = &product + } + return result +} diff --git a/src/participants/dto/create-participant.dto.ts b/src/participants/dto/create-participant.dto.ts deleted file mode 100644 index 9831203e..00000000 --- a/src/participants/dto/create-participant.dto.ts +++ /dev/null @@ -1,8 +0,0 @@ -export class CreateParticipantDto { - name: string; - email: string; - address: string; - organizer: boolean; - participates: boolean; - accepted: boolean; -} diff --git a/src/participants/dto/update-participant.dto.ts b/src/participants/dto/update-participant.dto.ts deleted file mode 100644 index 6d1d7791..00000000 --- a/src/participants/dto/update-participant.dto.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { PartialType } from '@nestjs/mapped-types'; -import { CreateParticipantDto } from './create-participant.dto'; - -export class UpdateParticipantDto extends PartialType(CreateParticipantDto) {} diff --git a/src/participants/entities/participant.entity.ts b/src/participants/entities/participant.entity.ts deleted file mode 100644 index 06d1d6de..00000000 --- a/src/participants/entities/participant.entity.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { Entity, BaseEntity, PrimaryGeneratedColumn, Column, ManyToOne, ManyToMany, Index } from 'typeorm'; -import { User } from 'src/users/entities/user.entity'; -import { Wish } from 'src/wishes/entities/wish.entity'; -import { Event } from 'src/events/entities/event.entity'; -import { Draw } from 'src/draws/entities/draw.entity'; - -@Entity('participants') -export class Participant extends BaseEntity { - @Index({ unique: true }) - @PrimaryGeneratedColumn() - id: number; - - @Column() - name: string; - - @Index() - @Column() - email: string; - - @Column() - address: string; - - @Column('boolean') - organizer: boolean = false; - - @Column('boolean') - participates: boolean = true; - - @Column('boolean') - accepted: boolean = false; - - @Index() - @ManyToOne(() => Event, event => event.participants, { onDelete: 'CASCADE' }) - event: Event; - - @Index() - @ManyToOne(() => User, user => user.participated, { onDelete: 'CASCADE' }) - user: User; - - @ManyToMany(() => Wish, wish => wish.participant) - wishes: Wish[]; - - @ManyToMany(() => Draw, draw => draw.drawer) - drawers: Draw[]; - - @ManyToMany(() => Draw, draw => draw.drawee) - drawees: Draw[]; -} diff --git a/src/participants/participants.controller.ts b/src/participants/participants.controller.ts deleted file mode 100644 index 06982ec0..00000000 --- a/src/participants/participants.controller.ts +++ /dev/null @@ -1,173 +0,0 @@ -import { - Controller, - Get, - Body, - Patch, - Param, - Delete, - UseGuards, - Request, - Query, -} from '@nestjs/common'; -import { ParticipantsService } from './participants.service'; -import { JwtAuthGuard } from 'src/auth/jwt-auth.guard'; -import { UsersService } from 'src/users/users.service'; -import { EventsService } from 'src/events/events.service'; -import { BAD_REQUEST, NOT_FOUND } from 'src/util/exceptions'; -import { WishesService } from 'src/wishes/wishes.service'; - -@Controller('participants') -export class ParticipantsController { - constructor( - private readonly participantsService: ParticipantsService, - private readonly usersService: UsersService, - private readonly eventsService: EventsService, - private readonly wishesService: WishesService, - ) {} - - @UseGuards(JwtAuthGuard) - @Delete('manage') - async organizerRemove( - @Request() req, - @Query('participantId') participantId: number, - @Query('eventId') eventId: number, - ) { - const { event, participant, organizerUser } = - await this.validateEventAndParticipant( - req.user.user.email, - eventId, - participantId, - ); - - const shallowParticipant = - await this.participantsService.findByEventAndShallowUser( - event, - participant.email, - ); - if (!shallowParticipant || participant.email === organizerUser.email) - throw BAD_REQUEST('Could not remove participant'); - - await this.participantsService.remove(participantId); - return { message: 'Participant removed' }; - } - - @UseGuards(JwtAuthGuard) - @Patch('manage') - async changeParticipantOrganizerStatus( - @Request() req, - @Query('participantId') participantId: number, - @Query('eventId') eventId: number, - @Body() { organizer }: { organizer: boolean }, - ) { - const { event, participant, organizerUser } = - await this.validateEventAndParticipant( - req.user.user.email, - eventId, - participantId, - ); - - const shallowParticipant = - await this.participantsService.findByEventAndShallowUser( - event, - participant.email, - ); - if (!shallowParticipant || participant.email === organizerUser.email) - throw BAD_REQUEST('Could not update participant'); - - await this.participantsService.update(participantId, { - organizer: organizer, - }); - return await this.participantsService.findOne(participantId); - } - - @UseGuards(JwtAuthGuard) - @Get('/:eventId/:participantId') - async findParticipantForEvent( - @Request() req, - @Param('eventId') eventId: number, - @Param('participantId') participantId: number, - ) { - const user = await this.usersService.findByEmail(req.user.user.email); - const event = await this.eventsService.findOneForUser(eventId, user); - - if (!event) throw BAD_REQUEST('Could not fetch event'); - - const participant = await this.participantsService.findOneByEvent( - event, - participantId, - ); - if (!participant) - throw BAD_REQUEST('Could not fetch participant information'); - - const wishes = await this.wishesService.findAllByUserEvent( - participant.user, - event, - ); - participant.wishes = wishes; - return participant; - } - - @UseGuards(JwtAuthGuard) - @Patch(':participantId') - async updateParticipantAddress( - @Request() req, - @Param('participantId') participantId: number, - @Body() { address }: { address: string }, - ) { - const user = await this.usersService.findByEmail(req.user.user.email); - - const participant = await this.participantsService.findOneWithUser( - participantId, - ); - if (!participant) throw NOT_FOUND('Participant does not exist'); - if (participant.user.id !== user.id) - throw BAD_REQUEST('Could not update address'); - - if (participant.address === address) return participant; - - participant.address = address; - return await participant.save(); - } - - @UseGuards(JwtAuthGuard) - @Delete(':participantId') - async remove(@Request() req, @Param('participantId') participantId: number) { - const user = await this.usersService.findByEmail(req.user.user.email); - - const participant = await this.participantsService.findOneWithUser( - participantId, - ); - if (!participant) throw NOT_FOUND('Participant does not exist'); - if (participant.user.id !== user.id || participant.organizer) - throw BAD_REQUEST('Could not delete'); - await this.participantsService.remove(participantId); - return { message: 'Removed from event' }; - } - - private async validateEventAndParticipant( - email: string, - eventId: number, - participantId: number, - ) { - const organizerUser = await this.usersService.findByEmail(email); - - // Find event - const event = await this.eventsService.findOne(eventId); - if (!event) { - throw NOT_FOUND('Event not found'); - } - - // Get auth user as participant and check if they are an organizer - const organizer = await this.participantsService.findByEventAndUser( - event, - organizerUser, - ); - if (!organizer || !organizer?.organizer) - throw BAD_REQUEST('Illegal action'); - - const participant = await this.participantsService.findOne(participantId); - if (!participant) throw NOT_FOUND('Participant does not exist'); - - return { event, organizerUser, organizer, participant }; - } -} diff --git a/src/participants/participants.module.ts b/src/participants/participants.module.ts deleted file mode 100644 index 91c2764c..00000000 --- a/src/participants/participants.module.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { forwardRef, Module } from '@nestjs/common'; -import { ParticipantsService } from './participants.service'; -import { ParticipantsController } from './participants.controller'; -import { TypeOrmModule } from '@nestjs/typeorm'; -import { Participant } from './entities/participant.entity'; -import { UsersModule } from 'src/users/users.module'; -import { EventsModule } from 'src/events/events.module'; -import { WishesModule } from '../wishes/wishes.module'; -import { WishesService } from 'src/wishes/wishes.service'; - -@Module({ - imports: [ - TypeOrmModule.forFeature([Participant]), - UsersModule, - WishesModule, - forwardRef(() => EventsModule), - ], - controllers: [ParticipantsController], - providers: [ParticipantsService], - exports: [ParticipantsService], -}) -export class ParticipantsModule {} diff --git a/src/participants/participants.service.spec.ts b/src/participants/participants.service.spec.ts deleted file mode 100644 index 63c6e2b3..00000000 --- a/src/participants/participants.service.spec.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { ParticipantsService } from './participants.service'; - -describe('ParticipantsService', () => { - let service: ParticipantsService; - - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - providers: [ParticipantsService], - }).compile(); - - service = module.get(ParticipantsService); - }); - - it('should be defined', () => { - expect(service).toBeDefined(); - }); -}); diff --git a/src/participants/participants.service.ts b/src/participants/participants.service.ts deleted file mode 100644 index 1e62937b..00000000 --- a/src/participants/participants.service.ts +++ /dev/null @@ -1,198 +0,0 @@ -import { Injectable, HttpException, HttpStatus } from '@nestjs/common'; -import { InjectRepository } from '@nestjs/typeorm'; -import { Event } from 'src/events/entities/event.entity'; -import { User } from 'src/users/entities/user.entity'; -import { Repository } from 'typeorm'; -import { CreateParticipantDto } from './dto/create-participant.dto'; -import { UpdateParticipantDto } from './dto/update-participant.dto'; -import { Participant } from './entities/participant.entity'; - -@Injectable() -export class ParticipantsService { - constructor( - @InjectRepository(Participant) - private readonly participantRepository: Repository, - ) {} - - async create( - createParticipantDto: CreateParticipantDto, - event: Event, - user?: User, - ): Promise { - if (user) { - const participant = await this.findByEventAndUser(event, user); - if (participant) { - return participant; - } - } else { - const shallowParticipant = await this.findByEventAndShallowUser( - event, - createParticipantDto.email, - ); - if (shallowParticipant) { - return shallowParticipant; - } - } - - const participant = new Participant(); - participant.name = createParticipantDto.name; - participant.email = createParticipantDto.email; - participant.address = createParticipantDto.address; - participant.organizer = createParticipantDto.organizer; - participant.participates = createParticipantDto.participates; - participant.accepted = createParticipantDto.accepted; - if (user) participant.user = user; - participant.event = event; - - return await participant.save(); - } - - async findAll(): Promise { - return await this.participantRepository.find(); - } - - async findOne(id: number): Promise { - return await this.participantRepository.findOne({ id }); - } - - async findOneWithUser(id: number): Promise { - return await this.participantRepository - .createQueryBuilder('p') - .innerJoinAndSelect('p.user', 'u') - .where('p.id = :participantId', { participantId: id }) - .getOne(); - } - - /** - * Joins event and the participant user - * @param event - * @param participantId - * @returns - */ - async findOneByEvent( - event: Event, - participantId: number, - ): Promise { - return await this.participantRepository - .createQueryBuilder('p') - .innerJoin('p.event', 'e') - .innerJoinAndSelect('p.user', 'u') - .where('e.id = :eventId AND p.id = :participantId', { - eventId: event.id, - participantId, - }) - .getOne(); - } - - async findAllByEvent(event: Event): Promise { - return await this.participantRepository - .createQueryBuilder('p') - .innerJoin('p.event', 'e') - .where('e.id = :eventId', { eventId: event.id }) - .getMany(); - } - - async findAllByEventWithUser(event: Event): Promise { - return await this.participantRepository - .createQueryBuilder('p') - .innerJoin('p.event', 'e') - .leftJoinAndSelect('p.user', 'u') - .where('e.id = :eventId', { eventId: event.id }) - .getMany(); - } - - async findByEventAndUser(event: Event, user: User): Promise { - return await this.participantRepository - .createQueryBuilder('p') - .where('p.eventId = :eventId AND p.userId = :userId', { - eventId: event.id, - userId: user.id, - }) - .getOne(); - } - - async findByEventAndShallowUser( - event: Event, - email: string, - ): Promise { - return await this.participantRepository - .createQueryBuilder('p') - .where('p.eventId = :eventId AND p.email = :email', { - eventId: event.id, - email: `${email}`, - }) - .getOne(); - } - - async findByEventAndOrganizer( - event: Event, - user: User, - ): Promise { - return await this.participantRepository - .createQueryBuilder('p') - .innerJoin('p.event', 'e') - .where('e.id = :eventId AND p.userId = :userId AND p.organizer = true', { - eventId: event.id, - userId: user.id, - }) - .getOne(); - } - - async getPendingParticipantForEvent( - event: Event, - user: User, - ): Promise { - return await this.participantRepository - .createQueryBuilder('p') - .where( - 'p.eventId = :eventId AND p.email = :email AND p.accepted = false', - { - eventId: event.id, - email: user.email, - }, - ) - .getOne(); - } - - async acceptEvent(event: Event, user: User): Promise { - const participant = await this.getPendingParticipantForEvent(event, user); - if (!participant || participant.accepted) { - throw new HttpException( - { - message: 'Operation failed', - }, - HttpStatus.BAD_REQUEST, - ); - } - - participant.accepted = true; - participant.user = user; - return await participant.save(); - } - - async declineEvent(event: Event, user: User): Promise { - const participant = await this.getPendingParticipantForEvent(event, user); - if (!participant || participant.accepted) { - throw new HttpException( - { - message: 'Operation failed', - }, - HttpStatus.BAD_REQUEST, - ); - } - - await this.participantRepository.delete({ id: participant.id }); - return true; - } - - async update(id: number, updateParticipantDto: UpdateParticipantDto) { - return await this.participantRepository.update( - { id }, - updateParticipantDto, - ); - } - - async remove(id: number) { - return await this.participantRepository.delete({ id }); - } -} diff --git a/src/products/dto/create-product.dto.ts b/src/products/dto/create-product.dto.ts deleted file mode 100644 index cc600ac3..00000000 --- a/src/products/dto/create-product.dto.ts +++ /dev/null @@ -1,11 +0,0 @@ -export class CreateProductDto { - title: string; - description: string; - productKey: string; - imageUrl: string; - rating: number; - price: number; - currency: string; - category: string; - website: string; -} diff --git a/src/products/dto/update-product.dto.ts b/src/products/dto/update-product.dto.ts deleted file mode 100644 index e2d43fc5..00000000 --- a/src/products/dto/update-product.dto.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { PartialType } from '@nestjs/mapped-types'; -import { CreateProductDto } from './create-product.dto'; - -export class UpdateProductDto extends PartialType(CreateProductDto) {} diff --git a/src/products/entities/product.entity.ts b/src/products/entities/product.entity.ts deleted file mode 100644 index 3e531635..00000000 --- a/src/products/entities/product.entity.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { Category } from "src/categories/entities/category.entity"; -import { Wish } from "src/wishes/entities/wish.entity"; -import { BaseEntity, Column, Entity, Index, ManyToOne, OneToMany, PrimaryGeneratedColumn } from "typeorm"; - -@Entity('products') -export class Product extends BaseEntity { - @Index({ unique: true }) - @PrimaryGeneratedColumn() - id: number; - - @Index({ fulltext: true }) - @Column('text') - title: string; - - @Column('text') - description: string; - - @Index({ unique: true }) - @Column() - productKey: string; - - @Column('text') - imageUrl: string; - - @Index() - @Column('double') - rating: number; - - @Index() - @Column('double') - price: number; - - @Column() - currency: string; - - @Column('datetime') - modified: Date = new Date(Date.now()); - - @Index() - @ManyToOne(() => Category, category => category.products, { onDelete: 'CASCADE' }) - category: Category; - - @Column('text') - website: string; - - @OneToMany(() => Wish, wish => wish.product) - wishes: Wish[] -} diff --git a/src/products/products.controller.ts b/src/products/products.controller.ts deleted file mode 100644 index 4bb75b42..00000000 --- a/src/products/products.controller.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { Controller, Get, Post, Body, Patch, Param, Delete, UseGuards, Query, Request, HttpStatus, HttpException } from '@nestjs/common'; -import { ProductsService } from './products.service'; -import { CreateProductDto } from './dto/create-product.dto'; -import { UpdateProductDto } from './dto/update-product.dto'; -import { JwtAuthGuard } from 'src/auth/jwt-auth.guard'; -import { BAD_REQUEST, NOT_FOUND } from 'src/util/exceptions'; -import { UNAUTHORIZED } from '../util/exceptions'; - -@Controller('products') -export class ProductsController { - constructor(private readonly productsService: ProductsService) {} - - @UseGuards(JwtAuthGuard) - @Post() - async create(@Request() req, @Body() createProductDto: CreateProductDto) { - const { user } = req.user; - if (user.email !== 'moahammedayaan.dev@gmail.com') - throw UNAUTHORIZED('You are not authorized to perform this action'); - - return await this.productsService.create(createProductDto); - } - - @Get() - async findAll( - @Query('limit') limit: number = 50, - @Query('page') page: number = 1, - @Query('min_price') minPrice: number, - @Query('max_price') maxPrice: number, - @Query('search') search: string, - @Query('sort') sort: string, - ) { - const prevPage = page - 1; - const results = await this.productsService - .findAllWithLimit( - limit, - prevPage * limit, - minPrice, - maxPrice, - search ? search.trim() : undefined, - sort ? sort.trim().toLowerCase() : undefined - ); - - // If result is empty then check assume search is a product key or URL - // if no products are found then throw HTTP Exception - if (results.length === 0) { - const productKey = this.amazonProductKeyFromSearchOrUrl(search.trim()) - const productFromKey = await this.productsService.findByProductKey(productKey); - if (productFromKey && page == 1) { - return [productFromKey]; - } else if (!productFromKey && page == 1) { - const url = `https://amazon.com/s?k=${productKey}`; - - // TODO: Find product by Amazon product key search - - } - - throw BAD_REQUEST('No results'); - } - return results; - } - - @Get(':id') - async findOne(@Param('id') id: string) { - const product = await this.productsService.findOne(+id); - if (!product) - throw NOT_FOUND('Product not found') - return product; - } - - private amazonProductKeyFromSearchOrUrl(search: string) { - // Check if search is a URL - if (search.includes('amazon.com') && search.includes('dp')) { - // Assume productKey is a URL and then split by '/' - const splitBySlash = search.split('/'); - // Amazon product URL format: https://www.amazon.com/dp/[PRODUCT_KEY]... - // So if 'dp' is found then this is a valid products URL - const dpIndex = splitBySlash.findIndex(v => v === 'dp'); - - if (dpIndex > -1) { - const key = splitBySlash[dpIndex + 1]; // [..., 'dp', 'KEY?...'] - return key.split('?')[0]; - } - } - return search; - } -} diff --git a/src/products/products.module.ts b/src/products/products.module.ts deleted file mode 100644 index 309331d7..00000000 --- a/src/products/products.module.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Module } from '@nestjs/common'; -import { ProductsService } from './products.service'; -import { ProductsController } from './products.controller'; -import { TypeOrmModule } from '@nestjs/typeorm'; -import { Product } from './entities/product.entity'; -import { CategoriesModule } from 'src/categories/categories.module'; - -@Module({ - imports: [ - TypeOrmModule.forFeature([ - Product - ]), - CategoriesModule, - ], - controllers: [ProductsController], - providers: [ProductsService], - exports: [ProductsService] -}) -export class ProductsModule {} diff --git a/src/products/products.service.spec.ts b/src/products/products.service.spec.ts deleted file mode 100644 index 588e3998..00000000 --- a/src/products/products.service.spec.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { ProductsService } from './products.service'; - -describe('ProductsService', () => { - let service: ProductsService; - - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - providers: [ProductsService], - }).compile(); - - service = module.get(ProductsService); - }); - - it('should be defined', () => { - expect(service).toBeDefined(); - }); -}); diff --git a/src/products/products.service.ts b/src/products/products.service.ts deleted file mode 100644 index ce0c98f3..00000000 --- a/src/products/products.service.ts +++ /dev/null @@ -1,119 +0,0 @@ -import { Injectable } from '@nestjs/common'; -import { InjectRepository } from '@nestjs/typeorm'; -import { CreateProductDto } from './dto/create-product.dto'; -import { Product } from './entities/product.entity'; -import { Repository } from 'typeorm'; -import { CategoriesService } from '../categories/categories.service'; - -@Injectable() -export class ProductsService { - private static readonly exactKeywords = new Set( - ['men', 'women', 'kids', 'girls', 'boys', 'man', 'woman', 'boy', 'girl', 'baby', 'babies'] - ); - - constructor( - @InjectRepository(Product) - private readonly productRepository: Repository, - private readonly categoryServices: CategoriesService, - ) { } - - async create(createProductDto: CreateProductDto): Promise { - const productFound = await this.findByProductKey(createProductDto.productKey) - if (productFound) { - let changed = false - - if (createProductDto.price !== productFound.price) { - productFound.price = createProductDto.price - changed ||= true - } - - if (createProductDto.rating !== productFound.rating) { - productFound.rating = createProductDto.rating - changed ||= true - } - - if (changed) { - productFound.modified = new Date(Date.now()); - return await productFound.save(); - } - return productFound; - } - - const product = new Product(); - product.title = createProductDto.title.trim(); - product.description = createProductDto.description.trim(); - product.productKey = createProductDto.productKey; - product.imageUrl = createProductDto.imageUrl; - product.rating = createProductDto.rating; - product.price = createProductDto.price; - product.currency = createProductDto.currency; - product.category = await this.categoryServices.findLikeOrCreate(createProductDto.category); - product.website = createProductDto.website; - - return await product.save(); - } - - async findAll(): Promise { - return await this.productRepository.find(); - } - - async findAllWithLimit(limit: number, offset: number, minPrice?: number, maxPrice?: number, search?: string, sort?: string): Promise { - let where = '' - let whereValues = {} - if (minPrice && maxPrice) { - where = 'price BETWEEN :minPrice AND :maxPrice'; - whereValues = { minPrice, maxPrice }; - - if (search && search !== '') { - where += " AND MATCH(title) AGAINST (:search IN BOOLEAN MODE)"; - whereValues = { minPrice, maxPrice, search: this.createSearchQuery(search) }; - } - } - - const products = this.productRepository - .createQueryBuilder('products') - .where(where, whereValues) - .leftJoinAndSelect('products.category', 'categories') - .limit(limit) - .offset(offset) - .orderBy('products.id', 'ASC'); - - if (sort && sort !== '') { - if (sort === 'rating') { - return await products - .orderBy(`products.rating`, 'DESC') - .getMany(); - } else if (sort === 'price') { - return await products - .orderBy(`products.price`, 'DESC') - .getMany(); - } - } - return await products.getMany(); - } - - async findOne(id: number): Promise { - return await this.productRepository.findOne({ id }); - } - - async findByProductKey(productKey: string): Promise { - return await this.productRepository.findOne({ productKey }) - } - - private createSearchQuery(query: string) { - const exact = ProductsService.exactKeywords; - const queryWords = query.split(' '); - - let searchQuery = ''; - - queryWords.forEach(w => { - const wLower = w.toLowerCase(); - if (exact.has(wLower)) { - searchQuery += `${w} `; - } else { - searchQuery += `+${w} `; - } - }); - return searchQuery.trim(); - } -} diff --git a/src/server.go b/src/server.go new file mode 100644 index 00000000..7b0832ec --- /dev/null +++ b/src/server.go @@ -0,0 +1,32 @@ +package main + +import ( + "log" + + "github.com/giftxtrade/api/src/app" + "github.com/giftxtrade/api/src/database" + "github.com/gofiber/fiber/v2" + + _ "github.com/lib/pq" + _ "github.com/sqlc-dev/sqlc" +) + +func main() { + // Attempt connection with DB + conn, err := database.NewDbConnection() + if err != nil { + panic(err) + } + defer conn.Close() + + server := fiber.New(fiber.Config{ + ServerHeader: "giftxtrade api v2", + }) + app.New(conn, server) + + const port = "8080" + if err := server.Listen(":" + port); err != nil { + log.Fatalf("❌ port %s already in use. could not start server\n\n", port) + log.Fatal(err) + } +} diff --git a/src/services/event_service.go b/src/services/event_service.go new file mode 100644 index 00000000..1fdc1b80 --- /dev/null +++ b/src/services/event_service.go @@ -0,0 +1,114 @@ +package services + +import ( + "context" + "fmt" + + "github.com/giftxtrade/api/src/database/jet/postgres/public/table" + "github.com/giftxtrade/api/src/types" + "github.com/go-jet/jet/v2/postgres" +) + +type EventService struct { + ServiceBase + ParticipantService ParticipantService +} + +func (s *EventService) FindEventsForUser(ctx context.Context, user types.User) (events []types.Event, err error) { + events = []types.Event{} + participant_user_sub_query := table.Participant.SELECT( + table.Participant.AllColumns, + table.User.AllColumns, + ). + FROM( + table.Participant. + LEFT_JOIN(table.User, table.Participant.UserID.EQ(table.User.ID)), + ). + ORDER_BY(table.Participant.ID.ASC()). + AsTable(table.Participant.TableName()) + + query := table.Event.SELECT( + table.Event.AllColumns, + table.Link.AllColumns, + participant_user_sub_query.AllColumns(), + ).FROM( + table.Event. + LEFT_JOIN(table.Link, table.Event.ID.EQ(table.Link.EventID)). + LEFT_JOIN(table.Participant.AS("p1"), table.Event.ID.EQ(table.Participant.AS("p1").EventID)). + LEFT_JOIN( + participant_user_sub_query, + table.Event.ID.EQ(table.Participant.EventID.From(participant_user_sub_query)), + ), + ). + WHERE( + table.Participant.AS("p1").UserID.EQ(postgres.Int(user.ID)), + ). + ORDER_BY( + table.Event.DrawAt.ASC(), + table.Event.CloseAt.ASC(), + table.Participant.ID.From(participant_user_sub_query).ASC(), + ) + err = query.QueryContext(ctx, s.DB, &events) + return events, err +} + +func (s *EventService) FindEventById(ctx context.Context, user types.User, event_id int64) (event types.Event, err error) { + query := table.Event.SELECT( + table.Event.AllColumns, + table.Participant.AllColumns, + table.User.AllColumns, + table.Link.AllColumns, + table.Wish.AllColumns, + table.Product.AllColumns, + ).FROM( + table.Event. + LEFT_JOIN(table.Link, table.Event.ID.EQ(table.Link.EventID)). + INNER_JOIN(table.Participant, table.Event.ID.EQ(table.Participant.EventID)). + LEFT_JOIN(table.User, table.Participant.UserID.EQ(table.User.ID)). + LEFT_JOIN( + table.Wish, + table.Event.ID.EQ(table.Wish.EventID). + AND( + table.Wish.UserID.EQ(postgres.Int(user.ID)), + ), + ). + LEFT_JOIN(table.Product, table.Wish.ProductID.EQ(table.Product.ID)), + ).WHERE(table.Event.ID.EQ(postgres.Int64(event_id))).ORDER_BY( + table.Participant.Organizer.DESC(), + table.Participant.Accepted.DESC(), + table.Participant.CreatedAt.DESC(), + ) + err = query.QueryContext(ctx, s.DB, &event) + return event, err +} + +func (s *EventService) CreateEvent(ctx context.Context, user *types.User, input types.CreateEvent) (event types.Event, err error) { + s.TX, err = s.DB.BeginTx(ctx, nil) + defer s.TX.Rollback() + + qb := table.Event.INSERT( + table.Event.Name, + table.Event.Description, + table.Event.Budget, + table.Event.InvitationMessage, + table.Event.DrawAt, + table.Event.CloseAt, + ).MODEL(input).RETURNING(table.Event.AllColumns) + if err = qb.QueryContext(ctx, s.TX, &event); err != nil { + return types.Event{}, fmt.Errorf("could not create event") + } + + // create participants for event in transaction scope + s.ParticipantService.TX = s.TX + participants, err := s.ParticipantService.BulkCreateParticipant(ctx, user, &event, input.Participants) + if err != nil { + return types.Event{}, err + } + + if s.TX.Commit() != nil { + return types.Event{}, fmt.Errorf("could not commit transaction") + } + // TODO: email participants? + event.Participants = participants + return event, nil +} diff --git a/src/services/participant_service.go b/src/services/participant_service.go new file mode 100644 index 00000000..b447a0fc --- /dev/null +++ b/src/services/participant_service.go @@ -0,0 +1,56 @@ +package services + +import ( + "context" + "fmt" + + "github.com/giftxtrade/api/src/database/jet/postgres/public/table" + "github.com/giftxtrade/api/src/types" + "github.com/go-jet/jet/v2/qrm" +) + +type ParticipantService struct { + ServiceBase +} + +func (s *ParticipantService) BulkCreateParticipant( + ctx context.Context, + user *types.User, + event *types.Event, + input []types.CreateParticipant, +) (participants []types.Participant, err error) { + found_owner_participant := false + for i, p := range input { + if p.Organizer && p.Email == user.Email { + found_owner_participant = true + input[i].UserID = &user.ID + } + input[i].EventID = event.ID + } + if !found_owner_participant { + return nil, fmt.Errorf( + "%s (%s) must be in the participant list and have the organizer field set to 'true'", + user.Name, + user.Email, + ) + } + + qb := table.Participant. + INSERT( + table.Participant.Email, + table.Participant.Name, + table.Participant.Address, + table.Participant.Organizer, + table.Participant.Participates, + table.Participant.UserID, + table.Participant.EventID, + ). + MODELS(input). + RETURNING(table.Participant.AllColumns) + var db qrm.Queryable = s.DB + if s.TX != nil { + db = s.TX + } + err = qb.QueryContext(ctx, db, &participants) + return participants, err +} diff --git a/src/services/product_service.go b/src/services/product_service.go new file mode 100644 index 00000000..9328411f --- /dev/null +++ b/src/services/product_service.go @@ -0,0 +1,159 @@ +package services + +import ( + "context" + "database/sql" + "fmt" + "net/url" + + "github.com/giftxtrade/api/src/database" + "github.com/giftxtrade/api/src/database/jet/postgres/public/table" + "github.com/giftxtrade/api/src/types" + "github.com/go-jet/jet/v2/postgres" +) + +type ProductService struct { + ServiceBase +} + +func (service *ProductService) Search(ctx context.Context, filter types.ProductFilter) (products []types.Product, err error) { + products = []types.Product{} + search := "" + if filter.Search != nil { + search = *filter.Search + } + qb := table.Product. + SELECT( + table.Product.AllColumns, + table.Category.ID, + table.Category.Name, + postgres.CEIL(postgres.RawFloat(fmt.Sprintf( + "%s.%s * %s.%s", + table.Product.TableName(), + table.Product.TotalReviews.Name(), + table.Product.TableName(), + table.Product.Rating.Name(), + ))).AS("weight"), + ). + FROM(table.Product. + INNER_JOIN(table.Category, table.Category.ID.EQ(table.Product.CategoryID), + )). + WHERE( + postgres.AND( + postgres.String(search).EQ(postgres.String("")). // skips the ts_query expression if search is empty + OR( + postgres.RawBool( + fmt.Sprintf( + "%s.%s @@ to_tsquery('english', $search::TEXT)", + table.Product.ProductTs.TableName(), + table.Product.ProductTs.Name(), + ), + postgres.RawArgs{"$search": search}, + ), + ), + postgres.RawBool(fmt.Sprintf( + "%s.%s BETWEEN '$%.2f'::MONEY AND '$%.2f'::MONEY", + table.Product.TableName(), table.Product.Price.Name(), + filter.MinPrice, + filter.MaxPrice, + )), + ), + ). + ORDER_BY( + postgres.CASE(). + WHEN(postgres.Bool(*filter.Sort == "price")). + THEN(table.Product.Price). + ASC(), + postgres.FloatColumn("weight").DESC(), + ). + LIMIT(int64(filter.Limit)). + OFFSET(int64(filter.Limit * (filter.Page - 1))) + err = qb.QueryContext(ctx, service.DB, &products) + return products, err +} + +func (service *ProductService) UpdateOrCreate(ctx context.Context, input types.CreateProduct) (database.Product, bool, error) { + validation_err := service.Validator.Struct(input) + if validation_err != nil { + return database.Product{}, false, validation_err + } + + found_product, err := service. + Querier. + FindProductByProductKey(ctx, input.ProductKey) + // create new product + if err != nil { + parsed_url, url_parse_err := url.ParseRequestURI(input.OriginalUrl) + if url_parse_err != nil { + return database.Product{}, false, url_parse_err + } + + category, category_err := service.FindOrCreateCategory(ctx, database.CreateCategoryParams{ + Name: input.Category, + }) + if category_err != nil { + return database.Product{}, false, category_err + } + product, err := service.Querier.CreateProduct(ctx, database.CreateProductParams{ + ProductKey: input.ProductKey, + Title: input.Title, + Description: sql.NullString{ + String: input.Description, + Valid: input.Description != "", + }, + ImageUrl: input.ImageUrl, + TotalReviews: int32(input.TotalReviews), + Rating: input.Rating, + Price: input.Price, + Url: input.OriginalUrl, + Origin: parsed_url.Host, + Currency: database.NullCurrencyType{ + CurrencyType: database.CurrencyTypeUSD, + Valid: true, + }, + CategoryID: sql.NullInt64{ + Int64: category.ID, + Valid: true, + }, + }) + return product, err == nil, err + } + + // update existing product + product, err := service.Querier.UpdateProduct(ctx, database.UpdateProductParams{ + ProductKey: input.ProductKey, + Rating: sql.NullFloat64{ + Float64: float64(input.Rating), + Valid: input.Rating != 0 && found_product.Rating != input.Rating, + }, + TotalReviews: sql.NullInt32{ + Int32: int32(input.TotalReviews), + Valid: input.TotalReviews != 0 && found_product.TotalReviews != int32(input.TotalReviews), + }, + Price: sql.NullString{ + String: input.Price, + Valid: input.Price != "" && found_product.Price != input.Price, + }, + Title: sql.NullString{ + String: input.Title, + Valid: input.Title != "" && found_product.Title != input.Title, + }, + ImageUrl: sql.NullString{ + String: input.ImageUrl, + Valid: input.ImageUrl != "" && found_product.ImageUrl != input.ImageUrl, + }, + Description: sql.NullString{ + String: input.Description, + Valid: input.Description != "" && found_product.Description.String != input.Description, + }, + }) + return product, false, err +} + +func (service *ProductService) FindOrCreateCategory(ctx context.Context, input database.CreateCategoryParams) (database.Category, error) { + found_category, err := service.Querier.FindCategoryByName(ctx, input.Name) + if err != nil { + return service.Querier.CreateCategory(ctx, input) + } + return found_category, nil +} diff --git a/src/services/service.go b/src/services/service.go new file mode 100644 index 00000000..f554e19d --- /dev/null +++ b/src/services/service.go @@ -0,0 +1,58 @@ +package services + +import ( + "database/sql" + + "github.com/giftxtrade/api/src/database" + "github.com/giftxtrade/api/src/types" + "github.com/go-playground/validator/v10" + "gorm.io/gorm" +) + +type ServiceBase struct { + DB *sql.DB + TX *sql.Tx + Querier *database.Queries + Validator *validator.Validate + Tokens *types.Tokens +} + +type Service struct { + DB *sql.DB + UserService UserService + ProductService ProductService + ParticipantService ParticipantService + EventService EventService +} + +type IService interface { + CreateService(db *gorm.DB, table string) ServiceBase + New(db *gorm.DB) Service +} + +func New(db *sql.DB, querier *database.Queries, validator *validator.Validate, tokens *types.Tokens) Service { + service_base := ServiceBase { + DB: db, + Querier: querier, + Validator: validator, + Tokens: tokens, + } + + service := Service{ + DB: db, + } + service.UserService = UserService{ + ServiceBase: service_base, + } + service.ProductService = ProductService{ + ServiceBase: service_base, + } + service.ParticipantService = ParticipantService{ + ServiceBase: service_base, + } + service.EventService = EventService{ + ServiceBase: service_base, + ParticipantService: service.ParticipantService, + } + return service +} \ No newline at end of file diff --git a/src/services/user_service.go b/src/services/user_service.go new file mode 100644 index 00000000..17d655f1 --- /dev/null +++ b/src/services/user_service.go @@ -0,0 +1,92 @@ +package services + +import ( + "context" + "fmt" + + "github.com/giftxtrade/api/src/database/jet/postgres/public/model" + "github.com/giftxtrade/api/src/database/jet/postgres/public/table" + "github.com/giftxtrade/api/src/types" + "github.com/go-jet/jet/v2/postgres" + "github.com/golang-jwt/jwt" +) + +type UserService struct { + ServiceBase +} + +func (s *UserService) FindUserByEmail(ctx context.Context, email string) (user types.User, err error) { + qb := table.User. + SELECT(table.User.AllColumns). + WHERE(table.User.Email.EQ(postgres.String(email))). + LIMIT(1) + err = qb.QueryContext(ctx, s.DB, &user) + return user, err +} + +func (s *UserService) CreateUser(ctx context.Context, input types.CreateUser) (user types.User, err error) { + qb := table.User. + INSERT( + table.User.Name, + table.User.Email, + table.User.ImageURL, + table.User.Phone, + table.User.Active, + table.User.Admin, + ).MODEL(model.User{ + Name: input.Name, + Email: input.Email, + ImageURL: input.ImageUrl, + Phone: &input.Phone, + Active: false, + Admin: false, + }). + RETURNING(table.User.AllColumns) + qb.QueryContext(ctx, s.DB, &user) + return user, err +} + +// finds a user by email or creates one if not found. +// boolean value is true if a new user is created, otherwise false +func (s *UserService) FindOrCreate(ctx context.Context, input types.CreateUser) (types.User, bool, error) { + user, err := s.FindUserByEmail(ctx, input.Email) + if err != nil { + user, err = s.CreateUser(ctx, input) + if err != nil { + return types.User{}, false, err + } + return user, true, nil + } + return user, false, nil +} + +// Generates a JWT with claims, signed with key +func (s *UserService) GenerateJWT(key string, user *types.User) (string, error) { + jwt := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{ + "id": fmt.Sprint(user.ID), + "name": user.Name, + "email": user.Email, + "imageUrl": user.ImageUrl, + }) + token, err := jwt.SignedString([]byte(key)) + if err != nil { + return "", err + } + return token, nil +} + +func (s *UserService) GenerateAuthUser(ctx context.Context, input types.CreateUser) (types.Auth, bool, error) { + user, created, err := s.FindOrCreate(ctx, input) + if err != nil { + return types.Auth{}, false, fmt.Errorf("authentication could not succeed") + } + token, err := s.GenerateJWT(s.Tokens.JwtKey, &user) + if err != nil { + return types.Auth{}, false, fmt.Errorf("could not generate token") + } + auth := types.Auth{ + Token: token, + User: user, + } + return auth, created, nil +} diff --git a/src/tests/auth_controller_test.go b/src/tests/auth_controller_test.go new file mode 100644 index 00000000..d8f7f800 --- /dev/null +++ b/src/tests/auth_controller_test.go @@ -0,0 +1,215 @@ +package tests + +import ( + "context" + "encoding/json" + "net/http/httptest" + "testing" + + "github.com/giftxtrade/api/src/types" + "github.com/gofiber/fiber/v2" +) + +func TestAuthController(t *testing.T) { + user_service := app.Service.UserService + token := app.Tokens.JwtKey + + t.Run("auth middleware", func(t *testing.T) { + t.Run("should throw status 401", func(t *testing.T) { + t.Run("no authorization header", func(t *testing.T) { + server.Get("/no_auth_header", controller.UseJwtAuth, func(c *fiber.Ctx) error { + return nil + }) + req := httptest.NewRequest("GET", "/no_auth_header", nil) + res, err_res := server.Test(req) + if err_res != nil { + t.Fatal(err_res) + } + if res.StatusCode != 401 { + t.Fatal("status code must be a 401", res.StatusCode) + } + }) + + t.Run("invalid bearer token", func(t *testing.T) { + server.Get("/invalid_bearer_token", controller.UseJwtAuth, func(c *fiber.Ctx) error { + return nil + }) + req := httptest.NewRequest("GET", "/invalid_bearer_token", nil) + req.Header.Set("Authorization", "Bearer some-random-jwt") + res, err_res := server.Test(req) + if err_res != nil { + t.Fatal(err_res) + } + if res.StatusCode != 401 { + t.Fatal("status code must be a 401") + } + }) + + t.Run("invalid jwt", func(t *testing.T) { + jwt, err := user_service.GenerateJWT(token, &types.User{ + Name: "New User 1", + Email: "new_user1@email.com", + Active: true, + }) + if err != nil { + t.Fatal(err) + } + + server.Get("/invalid_jwt", controller.UseJwtAuth, func(c *fiber.Ctx) error { + return nil + }) + req := httptest.NewRequest("GET", "/invalid_jwt", nil) + req.Header.Set("Authorization", "Bearer " + jwt) + + res, err_res := server.Test(req) + if err_res != nil { + t.Fatal(err_res) + } + if res.StatusCode != 401 { + t.Fatal("jwt claims must exist in database") + } + }) + }) + + t.Run("should authenticate with status 200", func(t *testing.T) { + user, _, err := user_service.FindOrCreate(context.Background(), types.CreateUser{ + Name: "Naruto Uzumaki", + Email: "naruto_uzumaki@gmail.com", + ImageUrl: "", + }) + if err != nil { + t.Fatal(err) + } + jwt, err := user_service.GenerateJWT(token, &user) + if err != nil { + t.Fatal(err) + } + + server.Get("/valid_jwt", controller.UseJwtAuth, func(c *fiber.Ctx) error { + return nil + }) + req := httptest.NewRequest("GET", "/valid_jwt", nil) + req.Header.Set("Authorization", "Bearer " + jwt) + res, err_res := server.Test(req) + + if err_res != nil { + t.Fatal(err_res) + } + if res.StatusCode == 401 { + t.Fatal("status code must be 200 for valid JWT", jwt, res.StatusCode) + } + }) + + t.Run("admin only authentication", func(t *testing.T) { + t.Run("non admin user", func(t *testing.T) { + user, _, err := user_service.FindOrCreate(context.Background(), types.CreateUser{ + Name: "Non Admin User", + Email: "non_admin_user@gmail.com", + }) + if err != nil { + t.Fatal(err) + } + jwt, err := user_service.GenerateJWT(token, &user) + if err != nil { + t.Fatal(err) + } + + server.Get("/non_admin_user", controller.UseAdminOnly, func(c *fiber.Ctx) error { + return nil + }) + req := httptest.NewRequest("GET", "/non_admin_user", nil) + req.Header.Set("Authorization", "Bearer " + jwt) + res, err_res := server.Test(req) + if err_res != nil { + t.Fatal(err_res) + } + if res.StatusCode != 401 { + t.Fatal("user is not an admin so should not authenticate", res.StatusCode) + } + }) + + t.Run("admin user", func(t *testing.T) { + user, _, err := user_service.FindOrCreate(context.Background(), types.CreateUser{ + Name: "Admin User", + Email: "admin_user@gmail.com", + }) + if err != nil { + t.Fatal(err) + } + // set user to admin + _, err = user_service.Querier.SetUserAsAdmin(context.Background(), user.ID) + if err != nil { + t.Fatal(err) + } + + jwt, err := user_service.GenerateJWT(token, &user) + if err != nil { + t.Fatal(err) + } + + server.Get("/admin_user", controller.UseAdminOnly, func(c *fiber.Ctx) error { + return nil + }) + req := httptest.NewRequest("GET", "/admin_user", nil) + req.Header.Set("Authorization", "Bearer " + jwt) + res, err_res := server.Test(req) + + if err_res != nil { + t.Fatal(err_res) + } + if res.StatusCode != 200 { + t.Fatal("user is admin, should return status code 200.") + } + }) + }) + }) + + t.Run("[GET] /auth/profile", func(t *testing.T) { + t.Run("should return auth struct", func(t *testing.T) { + user, _, err := user_service.FindOrCreate(context.Background(), types.CreateUser{ + Name: "Get Profile User", + Email: "get_profile_user@gmail.com", + }) + if err != nil { + t.Fatal(err) + } + jwt, err := user_service.GenerateJWT(token, &user) + if err != nil { + t.Fatal(err) + } + + mock_auth := types.Auth{ + Token: jwt, + User: types.User{ + ID: user.ID, + Name: user.Name, + Email: user.Email, + ImageUrl: user.ImageUrl, + Active: user.Active, + Phone: user.Phone, + Admin: user.Admin, + }, + } + + req := httptest.NewRequest("GET", "/auth/profile", nil) + req.Header.Set("Authorization", "Bearer " + jwt) + server.Get("/auth/profile", controller.UseJwtAuth, controller.GetProfile) + res, err_res := server.Test(req) + + if err_res != nil { + t.Fatal(err_res) + } + if res.StatusCode != 200 { + t.Fatal("response must be ok (200).", res.StatusCode) + } + + var body types.Auth + if json.NewDecoder(res.Body).Decode(&body) != nil { + t.Fatal("could not parse response") + } + if body.Token != mock_auth.Token || body.User.ID != mock_auth.User.ID { + t.Fatal(body, mock_auth) + } + }) + }) +} \ No newline at end of file diff --git a/src/tests/category_service_test.go b/src/tests/category_service_test.go new file mode 100644 index 00000000..f6b5499c --- /dev/null +++ b/src/tests/category_service_test.go @@ -0,0 +1,55 @@ +package tests + +import ( + "context" + "database/sql" + "testing" + + "github.com/giftxtrade/api/src/database" +) + +func TestCategoryService(t *testing.T) { + querier := app.Querier + + input1 := database.CreateCategoryParams{ + Name: "hello", + } + + input2 := database.CreateCategoryParams{ + Name: "person", + Description: sql.NullString{ + Valid: true, + String: "some description", + }, + CategoryUrl: sql.NullString{ + Valid: true, + String: "https://example.com", + }, + } + + t.Run("create category", func(t *testing.T) { + category, err := querier.CreateCategory(context.Background(), input1) + if err != nil && category.Name != input1.Name { + t.Fatal(err) + } + }) + + t.Run("find category", func(t *testing.T) { + category, err := querier.FindCategoryByName(context.Background(), input1.Name) + if err != nil && category.Name != input1.Name { + t.Fatal(err) + } + }) + + t.Run("find or create", func(t *testing.T) { + category, err := app.Service.ProductService.FindOrCreateCategory(context.Background(), input1) + if err != nil && category.Name != input1.Name { + t.Fatal(err) + } + + category2, err := app.Service.ProductService.FindOrCreateCategory(context.Background(), input2) + if err != nil && category2.Name != input2.Name { + t.Fatal(err) + } + }) +} diff --git a/src/tests/event_service_test.go b/src/tests/event_service_test.go new file mode 100644 index 00000000..de023f1d --- /dev/null +++ b/src/tests/event_service_test.go @@ -0,0 +1,280 @@ +package tests + +import ( + "context" + "encoding/json" + "fmt" + "net/http/httptest" + "testing" + "time" + + "github.com/giftxtrade/api/src/controllers" + "github.com/giftxtrade/api/src/types" + "github.com/giftxtrade/api/src/utils" + "github.com/gofiber/fiber/v2" +) + +func create_participants(n int) []types.CreateParticipant { + participants := make([]types.CreateParticipant, n) + for i := 0; i < n; i++ { + id := i + 1 + participants[i] = types.CreateParticipant{ + Name: fmt.Sprintf("Participant #%d", id), + Email: fmt.Sprintf("participant_%d@example.com", id), + Participates: true, + } + } + return participants +} + +func TestEventService(t *testing.T) { + user_service := app.Service.UserService + event_service := app.Service.EventService + user_1, _, err := app.Service.UserService.FindOrCreate(context.Background(), types.CreateUser{ + Name: "Test User", + Email: "testuser@email.com", + }) + if err != nil { + t.Fatal(err) + } + user_2, _, err := app.Service.UserService.FindOrCreate(context.Background(), types.CreateUser{ + Name: "Some other random user", + Email: "thisrandomuser@email.com", + }) + if err != nil { + t.Fatal(err) + } + + t.Run("create event", func(t *testing.T) { + t.Run("correct params", func(t *testing.T) { + input := types.CreateEvent{ + Name: "Event 1", + Budget: 100.00, + DrawAt: time.Now(), + CloseAt: time.Now().Add(time.Hour * 24 * 30), + Participants: append(create_participants(5), types.CreateParticipant{ + Name: user_1.Name, + Email: user_1.Email, + Organizer: true, + Participates: false, + }), + } + new_event, err := event_service.CreateEvent(context.Background(), &user_1, input) + if err != nil { + t.Fatal(err) + } + + if len(new_event.Participants) != 6 { + t.Fatal("not all participants were inserted") + } + if new_event.Budget != fmt.Sprintf("$%.2f", input.Budget) { + t.Fatalf("values don't match %s %.2f", new_event.Budget, input.Budget) + } + + var mp types.Participant + for _, p := range new_event.Participants { + if p.Email != user_1.Email { + continue + } + mp = p + } + if mp.Accepted != true && mp.UserID != user_1.ID { + t.Fatalf("main participant accepted or user_id fields are incorrect %#v", mp) + } + }) + + t.Run("main participant not marked as organizer", func(t *testing.T) { + event := types.CreateEvent{ + Name: "Event 1", + Budget: 100.00, + DrawAt: time.Now(), + CloseAt: time.Now().Add(time.Hour * 24 * 30), + Participants: append(create_participants(5), types.CreateParticipant{ + Name: user_1.Name, + Email: user_1.Email, + Organizer: false, + Participates: true, + }), + } + _, err := event_service.CreateEvent(context.Background(), &user_1, event) + if err == nil { + t.Fatal("event should not be created. main participant is not marked 'organizer'") + } + + event.Participants = create_participants(20) + _, err = event_service.CreateEvent(context.Background(), &user_1, event) + if err == nil { + t.Fatal("event should not be created. main participant was not provided") + } + }) + + t.Run("no participant user", func(t *testing.T) { + event := types.CreateEvent{ + Name: "Event with no matching user", + Budget: 100.00, + DrawAt: time.Now(), + CloseAt: time.Now().Add(time.Hour * 24 * 30), + Participants: append(create_participants(5), types.CreateParticipant{ + Name: user_1.Name, + Email: "somerandomemail123@xyz.com", + Organizer: true, + Participates: true, + }), + } + _, err := event_service.CreateEvent(context.Background(), &user_1, event) + if err == nil { + t.Fatal("event should not be created. main participant is not provided") + } + }) + }) + + t.Run("event authentication", func(t *testing.T) { + token := app.Tokens.JwtKey + user_1_jwt, _ := user_service.GenerateJWT(token, &user_1) + user_2_jwt, _ := user_service.GenerateJWT(token, &user_2) + + user2_event, err := event_service.CreateEvent(context.Background(), &user_2, types.CreateEvent{ + Name: "UseEventAuthWithParam Test Event", + Budget: 200, + DrawAt: time.Now(), + CloseAt: time.Now().Add(time.Hour * 24 * 30), // 30 days from now + Participants: append(create_participants(20), types.CreateParticipant{ + Email: user_2.Email, + Name: user_2.Name, + Organizer: true, + }), + }) + if err != nil { + t.Fatal(err) + } + + participant := user2_event.Participants[1] + user_3, _, _ := user_service.FindOrCreate(context.Background(), types.CreateUser{ + Name: participant.Name, + Email: participant.Email, + }) + user_3_jwt, _ := user_service.GenerateJWT(token, &user_3) + + t.Run("UseEventAuthWithParam", func(t *testing.T) { + t.Run("non numeric event_id", func(t *testing.T) { + req := httptest.NewRequest("GET", "/event/abc123", nil) + req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", user_1_jwt)) + server.Get("/event/:event_id", controller.UseJwtAuth, controller.UseEventAuthWithParam, func(c *fiber.Ctx) error { + return nil + }) + res, err_res := server.Test(req) + if err_res != nil { + t.Fatal(err_res) + } + if res.StatusCode != 400 { + t.Fatal("status code must be a 400", res.StatusCode) + } + }) + + t.Run("incorrect numeric event_id", func(t *testing.T) { + req := httptest.NewRequest("GET", "/event/235421", nil) + req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", user_1_jwt)) + server.Get("/event/:event_id", controller.UseJwtAuth, controller.UseEventAuthWithParam, func(c *fiber.Ctx) error { + return nil + }) + res, err_res := server.Test(req) + if err_res != nil { + t.Fatal(err_res) + } + if res.StatusCode != 404 { + t.Fatal("status code must be a 400", res.StatusCode) + } + }) + + t.Run("correct event_id", func(t *testing.T) { + // test with user_1's auth info + // since this user shouldn't be on the participants list + req := httptest.NewRequest("GET", "/event/" + fmt.Sprintf("%d", user2_event.ID), nil) + req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", user_1_jwt)) + server.Get("/event/:event_id", controller.UseJwtAuth, controller.UseEventAuthWithParam, func(c *fiber.Ctx) error { + return nil + }) + res, err_res := server.Test(req) + if err_res != nil { + t.Fatal(err_res) + } + if res.StatusCode != 404 { + t.Fatal("status code must be a 400", res.StatusCode) + } + + // test with valid user_2's auth info + req = httptest.NewRequest("GET", "/event/" + fmt.Sprintf("%d", user2_event.ID) + "/someotherthing", nil) + req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", user_2_jwt)) + server.Get("/event/:event_id/someotherthing", controller.UseJwtAuth, controller.UseEventAuthWithParam, func(c *fiber.Ctx) error { + event_id := c.UserContext().Value(controllers.EVENT_ID_PARAM_KEY).(int64) + return utils.DataResponse(c, map[string]int64{"event_id": event_id}) + }) + res, err_res = server.Test(req) + if err_res != nil { + t.Fatal(err_res) + } + if res.StatusCode != 200 { + t.Fatal("status code must be a 200", res.StatusCode) + } + var body map[string]int64 + if err := json.NewDecoder(res.Body).Decode(&body); err != nil { + t.Fatal("could not parse body", err.Error()) + } + if body["event_id"] != user2_event.ID { + t.Fatal("event id is incorrect", body["event_id"], user2_event.ID) + } + + // test with unaccepted invite participant user + req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", user_3_jwt)) + res, err_res = server.Test(req) + if err_res != nil { + t.Fatal(err_res) + } + if res.StatusCode != 200 { + t.Fatal("status code must be a 200", res.StatusCode) + } + if err := json.NewDecoder(res.Body).Decode(&body); err != nil { + t.Fatal("could not parse body", err.Error()) + } + if body["event_id"] != user2_event.ID { + t.Fatal("event id is incorrect", body["event_id"], user2_event.ID) + } + }) + }) + + t.Run("UseEventOrganizerAuthWithParam", func(t *testing.T) { + // test with user_3's auth with no organizer permissions + req := httptest.NewRequest("GET", "/event/" + fmt.Sprint(user2_event.ID) + "/another-route", nil) + req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", user_3_jwt)) + server.Get("/event/:event_id/another-route", controller.UseJwtAuth, controller.UseEventOrganizerAuthWithParam, func(c *fiber.Ctx) error { + event_id := c.UserContext().Value(controllers.EVENT_ID_PARAM_KEY).(int64) + return utils.DataResponse(c, map[string]int64{"event_id": event_id}) + }) + res, err_res := server.Test(req) + if err_res != nil { + t.Fatal(err_res) + } + if res.StatusCode != 404 { + t.Fatal("status code must be a 404", res.StatusCode) + } + + // test with user_2's auth with organizer permissions + req = httptest.NewRequest("GET", "/event/" + fmt.Sprint(user2_event.ID) + "/another-route", nil) + req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", user_2_jwt)) + res, err_res = server.Test(req) + if err_res != nil { + t.Fatal(err_res) + } + if res.StatusCode != 200 { + t.Fatal("status code must be a 200", res.StatusCode) + } + var body map[string]int64 + if err := json.NewDecoder(res.Body).Decode(&body); err != nil { + t.Fatal("could not parse body", err.Error()) + } + if body["event_id"] != user2_event.ID { + t.Fatal("event id is incorrect", body["event_id"], user2_event.ID) + } + }) + }) +} diff --git a/src/tests/parsers_test.go b/src/tests/parsers_test.go new file mode 100644 index 00000000..ef9eed4b --- /dev/null +++ b/src/tests/parsers_test.go @@ -0,0 +1,113 @@ +package tests + +import ( + "context" + "fmt" + "testing" + + "github.com/giftxtrade/api/src/controllers" + "github.com/giftxtrade/api/src/services" + "github.com/giftxtrade/api/src/types" + "github.com/giftxtrade/api/src/utils" +) + +func TestGetBearerToken(t *testing.T) { + // Test properly formatted authorization field + { + token1, err := utils.GetBearerToken("Bearer my_token") + if token1 != "my_token" && err == nil { + t.Errorf("did not parse bearer token properly") + } + } + + // Test with empty bearer token + { + _, err := utils.GetBearerToken("Bearer") + if err == nil { + t.Errorf("did not parse bearer token properly") + } + } + + // Test with no value + { + _, err := utils.GetBearerToken("") + if err == nil { + t.Errorf("did not parse bearer token properly") + } + } +} + +func TestGetJwtClaims(t *testing.T) { + // Test with correct key and claims + { + key := "abcd123" + jwt := "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImV4YW1wbGVAZW1haWwuY29tIiwidXNlcm5hbWUiOiJleGFtcGxlIn0.OTAHN2L8ag5n20Xbfa-T4PRpLvsnp4pNFb8D3zHluyg" + + claims_map, err := utils.GetJwtClaims(jwt, key) + username := claims_map["username"].(string) + email := claims_map["email"].(string) + if err != nil || email != "example@email.com" || username != "example" { + fmt.Println(err) + t.Fail() + } + } + + // Test with correct jwt and incorrect key + { + key := "incorrect key" + jwt := "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJPbmxpbmUgSldUIEJ1aWxkZXIiLCJpYXQiOjE2NDIzOTc5OTksImV4cCI6MTY3MzkzMzk5OSwiYXVkIjoid3d3LmV4YW1wbGUuY29tIiwic3ViIjoianJvY2tldEBleGFtcGxlLmNvbSIsImVtYWlsIjoiZXhhbXBsZUBlbWFpbC5jb20iLCJ1c2VybmFtZSI6ImV4YW1wbGUifQ.fBJbtYyIJuHA6Ip8OlQuVmDrHlIhtSAlx7S3lUBK_qM" + + if _, err := utils.GetJwtClaims(jwt, key); err == nil { + t.Fail() + } + } + + // Test with correct key and incorrect jwt + { + key := "q34859t8jsvdh1" + jwt := "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJPbmxpbmUgSldUIEJ1aWxkZXIiLCJpYXQiOjE2NDIzOTc5OTksImV4cCI6MTY3MzkzMzk5OSwiYXVkIjoid3d3LmV4YW1wbGUuY29tIiwic3ViIjoianJvY2tldEBleGFtcGxlLmNvbSIsImBtYWlsIjoiZXhhbXBsZUBlbWFpbC5jb20iLCJ1c2VybmFtZSI6ImV4YW1wbGUifQ.Ohw7jfG65CzgiTB-DZMVoKl67APTeJrwrmHd3Ex9KX0" + + if _, err := utils.GetJwtClaims(jwt, key); err == nil { + t.Fail() + } + } +} + +func TestGenerateTokens(t *testing.T) { + { + user := types.User{ + ID: 1, + Email: "johndoe@example.com", + Name: "John Doe", + } + user_service := services.UserService{} + jwt1, err1 := user_service.GenerateJWT("123", &user) + jwt2, err2 := user_service.GenerateJWT("1234", &user) + + if err1 != nil || err2 != nil || jwt1 == jwt2 { + t.Fail() + } + } +} + +func TestParseAuthContext(t *testing.T) { + { + ctx := context.Background() + user := types.User{ + ID: 2, + Email: "johndoe2@example.com", + Name: "John Doe 2", + } + token := "my random token" + ctx = context.WithValue(ctx, controllers.AUTH_KEY, types.Auth{Token: token, User: user}) + parsed_auth := controllers.GetAuthContext(ctx) + + if parsed_auth.User != user { + t.Fail() + } + + if parsed_auth.Token != token { + t.Fail() + } + } +} \ No newline at end of file diff --git a/src/tests/participant_test.go b/src/tests/participant_test.go new file mode 100644 index 00000000..35fd9d56 --- /dev/null +++ b/src/tests/participant_test.go @@ -0,0 +1,176 @@ +package tests + +import ( + "context" + "database/sql" + "encoding/json" + "fmt" + "maps" + "net/http/httptest" + "testing" + "time" + + "github.com/giftxtrade/api/src/controllers" + "github.com/giftxtrade/api/src/database" + "github.com/giftxtrade/api/src/types" + "github.com/giftxtrade/api/src/utils" + "github.com/gofiber/fiber/v2" +) + +func TestParticipant(t *testing.T) { + token := app.Tokens.JwtKey + user_service := app.Service.UserService + event_service := app.Service.EventService + + // User #1 + user1, _, err := app.Service.UserService.FindOrCreate(context.Background(), types.CreateUser{ + Name: "Participant User #1", + Email: "testparticipantuser1@email.com", + }) + user1_jwt, _ := user_service.GenerateJWT(token, &user1) + if err != nil { + t.Fatal(err) + } + + // User #2 + user2, _, err := app.Service.UserService.FindOrCreate(context.Background(), types.CreateUser{ + Name: "Participant User #2", + Email: "testparticipantuser2@email.com", + }) + if err != nil { + t.Fatal(err) + } + // user2_dto := mappers.DbUserToUser(user2) + // user2_jwt, _ := user_service.GenerateJWT(token, &user2) + + // Event for user1 + event1_input := types.CreateEvent{ + Name: "Event #1 For User #1", + Budget: 100.00, + DrawAt: time.Now(), + CloseAt: time.Now().Add(time.Hour * 24 * 30), + Participants: append(create_participants(5), types.CreateParticipant{ + Name: user1.Name, + Email: user1.Email, + Organizer: true, + Participates: false, + }), + } + user1_event, err := event_service.CreateEvent(context.Background(), &user1, event1_input) + if err != nil { + t.Fatal(err) + } + // Event for user2 + // input := types.CreateEvent{ + // Name: "Event #2 For User #2", + // Budget: 100.00, + // DrawAt: time.Now(), + // CloseAt: time.Now().Add(time.Hour * 24 * 30), + // Participants: append(create_participants(5), types.CreateParticipant{ + // Name: user2.Name, + // Email: user2.Email, + // Organizer: true, + // Participates: false, + // }), + // } + // user2_event, err := event_service.CreateEvent(context.Background(), &user2_dto, input) + // if err != nil { + // t.Fatal(err) + // } + + t.Run("Participant middleware tests", func(t *testing.T) { + t.Run("UseEventParticipantAuthWithQuery", func(t *testing.T) { + var user1_participant types.Participant + for _, p := range user1_event.Participants { + if p.Email != user1.Email { + continue + } + user1_participant = p + } + server.Get("/events/:event_id/manage", controller.UseJwtAuth, controller.UseEventAuthWithParam, controller.UseEventParticipantAuthWithQuery, func(c *fiber.Ctx) error { + participant := c.UserContext().Value(controllers.PARTICIPANT_OB_KEY).(database.Participant) + return utils.DataResponse(c, map[string]interface{}{"event_id": participant.EventID, "participant_id": participant.ID, "email": participant.Email}) + }) + + // Unparsable participant id + req := httptest.NewRequest("GET", fmt.Sprintf("/events/%d/manage?participantId=%s", user1_event.ID, "abc123"), nil) + req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", user1_jwt)) + res, err_res := server.Test(req) + if err_res != nil { + t.Fatal(err_res) + } + if res.StatusCode != 400 { + t.Fatal("status code must be a 400", res.StatusCode) + } + + // Unknown participant id + req = httptest.NewRequest("GET", fmt.Sprintf("/events/%d/manage?participantId=%d", user1_event.ID, 3483), nil) + req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", user1_jwt)) + res, err_res = server.Test(req) + if err_res != nil { + t.Fatal(err_res) + } + if res.StatusCode != 400 { + t.Fatal("status code must be a 400", res.StatusCode) + } + var body map[string]([]string) + if err := json.NewDecoder(res.Body).Decode(&body); err != nil { + t.Fatal(err) + } + if body["errors"][0] != "participant does not exist on the event" { + t.Fatal(body) + } + + // Correct participant ID + req = httptest.NewRequest("GET", fmt.Sprintf("/events/%d/manage?participantId=%d", user1_event.ID, user1_participant.ID), nil) + req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", user1_jwt)) + res, err_res = server.Test(req) + if err_res != nil { + t.Fatal(err_res) + } + if res.StatusCode != 200 { + t.Fatal("status code must be a 200", res.StatusCode) + } + var body2 map[string]interface{} + if err := json.NewDecoder(res.Body).Decode(&body2); err != nil { + t.Fatal(err) + } + data := map[string]interface{}{"event_id": user1_event.ID, "participant_id": user1_participant.ID, "email": user1_participant.Email} + if maps.Equal(body2, data) { + t.Fatal(body2, data) + } + + // Correct participant id with + user2_participant, err := app.Querier.CreateParticipant(context.Background(), database.CreateParticipantParams{ + EventID: user1_event.ID, + UserID: sql.NullInt64{ + Valid: true, + Int64: user2.ID, + }, + Accepted: true, + Participates: true, + Name: user2.Name, + Email: user2.Email, + }) + if err != nil { + t.Fatal(err) + } + req = httptest.NewRequest("GET", fmt.Sprintf("/events/%d/manage?participantId=%d", user1_event.ID, user2_participant.ID), nil) + req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", user1_jwt)) + res, err_res = server.Test(req) + if err_res != nil { + t.Fatal(err_res) + } + if res.StatusCode != 200 { + t.Fatal("status code must be a 200", res.StatusCode) + } + if err := json.NewDecoder(res.Body).Decode(&body2); err != nil { + t.Fatal(err) + } + data = map[string]interface{}{"event_id": user1_event.ID, "participant_id": user2_participant.ID, "email": user2_participant.Email} + if maps.Equal(body2, data) { + t.Fatal(body2, data) + } + }) + }) +} diff --git a/src/tests/product_service_test.go b/src/tests/product_service_test.go new file mode 100644 index 00000000..5f0ab908 --- /dev/null +++ b/src/tests/product_service_test.go @@ -0,0 +1,187 @@ +package tests + +import ( + "context" + "database/sql" + "reflect" + "testing" + + "github.com/giftxtrade/api/src/database" + "github.com/giftxtrade/api/src/types" +) + +func TestProductService(t *testing.T) { + product_service := app.Service.ProductService + + t.Run("create product", func(t *testing.T) { + t.Run("should create product", func(t *testing.T) { + input := database.CreateProductParams{ + Title: "Product 1", + ProductKey: "token", + Url: "https://example.com", + Price: "10.5", + Rating: 4.5, + TotalReviews: 124, + Origin: "example", + ImageUrl: "some-image", + Currency: database.NullCurrencyType{ + Valid: true, + CurrencyType: database.CurrencyTypeUSD, + }, + } + product, err := product_service.Querier.CreateProduct(context.Background(), input) + if err != nil { + t.Fatal(err) + } + + if product.ID == 0 || product.Title != input.Title || (product.CategoryID != sql.NullInt64{}) || product.Currency != database.CurrencyTypeUSD { + t.Fatal(product, input) + } + + input2_category, err := product_service.Querier.CreateCategory(context.Background(), database.CreateCategoryParams{ + Name: "my category", + }) + if err != nil { + t.Fatal(err) + } + + input2 := input + input2.Title = "Product 2" + input2.ProductKey = "token2" + input2.Price = "1.50" + input2.CategoryID = sql.NullInt64{ + Valid: true, + Int64: input2_category.ID, + } + product2, err := product_service.Querier.CreateProduct(context.Background(), input2) + if err != nil { + t.Fatal(err) + } + + if product2.Title != input2.Title || !product2.CategoryID.Valid || product2.CategoryID.Int64 != input2_category.ID { + t.Fatal(product2, input2) + } + + t.Run("should not create with duplicate product key", func(t *testing.T) { + input := input + input.Title = "Different Product" + if _, err := product_service.Querier.CreateProduct(context.Background(), input); err == nil { + t.Fatal("should not create product with a duplicate product_key") + } + }) + }) + }) + + t.Run("find product", func(t *testing.T) { + var new_product database.Product + + t.Run("find by product_key", func(t *testing.T) { + // this should return the product created with `input` + product, err := product_service.Querier.FindProductByProductKey(context.Background(), "token") + if err != nil { + t.Fatal(err, product) + } + + if product.ProductKey != "token" || product.Title != "Product 1" { + t.Fatal("values don't match") + } + + input := database.CreateProductParams{ + Title: "Find Product 1", + ProductKey: "find_product_1", + Url: "https://example.com", + Price: "5", + Rating: 5, + TotalReviews: 4, + Currency: database.NullCurrencyType{ + Valid: true, + CurrencyType: database.CurrencyTypeUSD, + }, + } + product, err = product_service.Querier.CreateProduct(context.Background(), input) + if err != nil { + t.Fatal(err, product) + } + + found_product, err := product_service.Querier.FindProductByProductKey(context.Background(), product.ProductKey) + if err != nil || !reflect.DeepEqual(found_product, product) { + t.Fatal(err, product, found_product) + } + new_product = product + + if _, err := product_service.Querier.FindProductByProductKey(context.Background(), "random token"); err == nil { + t.Fatal("product with key doesn't exist") + } + }) + + t.Run("find by id", func(t *testing.T) { + product, err := product_service.Querier.FindProductById(context.Background(), new_product.ID) + if err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(product, new_product) { + t.Fatal(product, new_product) + } + + if _, err := product_service.Querier.FindProductById(context.Background(), 1234); err == nil { + t.Fatal("product with key doesn't exist") + } + }) + }) + + t.Run("should create or update", func(t *testing.T) { + input := types.CreateProduct{ + Title: "Find Product 2", + ProductKey: "find_product_2", + OriginalUrl: "https://example.com", + ImageUrl: "http://exmaple.com/image.jpg", + Price: "5", + Rating: 5, + TotalReviews: 4, + Category: "New Category", + } + product, created, err := product_service.UpdateOrCreate(context.Background(), input) + if err != nil || !created { + t.Fatal(err) + } + if product.ProductKey != input.ProductKey || product.Title != input.Title { + t.Fatal("valued don't match", product, input) + } + if product.Origin != "example.com" { + t.Fatal("origin is incorrect", product.Origin) + } + + input2 := input + input2.Title = input.Title + " (updated)" + input2.Price = "50" + product2, created, err := product_service.UpdateOrCreate(context.Background(), input2) + if err != nil || created { + t.Fatal(err) + } + + if product2.ID != product.ID || product2.Price == product.Price { + t.Fatal("product should be created") + } + }) + + t.Run("filter products", func(t *testing.T) { + t.Run("limit", func(t *testing.T) { + products, err := product_service.Querier.FilterProducts(context.Background(), database.FilterProductsParams{ + Limit: 10, + Search: sql.NullString{ + Valid: true, + String: "manga", + }, + Page: 1, + MinPrice: "$1", + MaxPrice: "$200", + }) + if err != nil { + t.Fatal(err) + } + if len(products) != 10 { + t.Fatal("products length is incorrect", len(products)) + } + }) + }) +} \ No newline at end of file diff --git a/src/tests/setup_test.go b/src/tests/setup_test.go new file mode 100644 index 00000000..5b468020 --- /dev/null +++ b/src/tests/setup_test.go @@ -0,0 +1,90 @@ +package tests + +import ( + "database/sql" + "fmt" + "log" + "os" + "testing" + + my_app "github.com/giftxtrade/api/src/app" + "github.com/giftxtrade/api/src/controllers" + "github.com/gofiber/fiber/v2" + "github.com/ory/dockertest/v3" + "github.com/ory/dockertest/v3/docker" + + _ "github.com/lib/pq" +) + +var ( + db *sql.DB + server *fiber.App + app *my_app.AppBase + controller controllers.Controller +) + +func NewMockDB() { + pool, err := dockertest.NewPool("") + if err != nil { + log.Fatalf("Could not construct pool: %s", err) + } + + err = pool.Client.Ping() + if err != nil { + log.Fatalf("Could not ping pool: %s", err) + } + + // Build and run the given Dockerfile + resource, err := pool.RunWithOptions( + &dockertest.RunOptions{ + Repository: "postgres", + Tag: "14", + Env: []string{ + "POSTGRES_PASSWORD=postgres", + "POSTGRES_USER=postgres", + "POSTGRES_DB=postgres", + "listen_addresses = '*'", + }, + }, + func(config *docker.HostConfig) { + // set AutoRemove to true so that stopped container goes away by itself + config.AutoRemove = true + config.RestartPolicy = docker.RestartPolicy{Name: "no"} + }, + ) + if err != nil { + log.Fatalf("Could not start resource: %s", err) + } + + if err = pool.Retry(func() error { + var err error + hostAndPort := resource.GetHostPort("5432/tcp") + db, err = sql.Open("postgres", fmt.Sprintf("postgres://postgres:postgres@%s/postgres?sslmode=disable", hostAndPort)) + if err != nil { + return err + } + return db.Ping() + }); err != nil { + log.Fatalf("Could not connect to docker: %s", err) + } +} + +func SetupMockController(app *my_app.AppBase) controllers.Controller { + return controllers.Controller{ + AppContext: app.AppContext, + Service: app.Service, + Querier: app.Querier, + } +} + +func TestMain(m *testing.M) { + NewMockDB() + app = my_app.NewMock(db, fiber.New()) + server = fiber.New() + controller = SetupMockController(app) + + // run tests... + exitCode := m.Run() + + os.Exit(exitCode) +} diff --git a/src/tests/user_service_test.go b/src/tests/user_service_test.go new file mode 100644 index 00000000..112757c6 --- /dev/null +++ b/src/tests/user_service_test.go @@ -0,0 +1,133 @@ +package tests + +import ( + "context" + "fmt" + "testing" + + "github.com/giftxtrade/api/src/database" + "github.com/giftxtrade/api/src/types" +) + +func TestUserService(t *testing.T) { + user_service := app.Service.UserService + + test_user1 := database.CreateUserParams{ + Email: "john_doe@email.com", + Name: "John Doe", + ImageUrl: "https://images.com/john_doe", + } + + test_user2 := database.CreateUserParams{ + Name: "Test User", + Email: "testuser123@email.com", + ImageUrl: "https://images.com/test_user2", + } + + t.Run("create user", func(t *testing.T) { + t.Run("should create user", func(t *testing.T) { + new_user, err := user_service.Querier.CreateUser(context.Background(), test_user1) + if err != nil { + t.Fatal("should not return an error", new_user, test_user1) + } + + if new_user.ID == 0 || new_user.Name != test_user1.Name || new_user.Email != test_user1.Email || new_user.ImageUrl != test_user1.ImageUrl || new_user.Active || new_user.Admin { + t.Fatal("user service create did not work", new_user, test_user1) + } + }) + + t.Run("should not create existing user", func(t *testing.T) { + if _, err := user_service.Querier.CreateUser(context.Background(), test_user1); err == nil { + t.Fatalf("should not create a new user") + } + }) + }) + + t.Run("find user", func(t *testing.T) { + t.Run("should find by email", func(t *testing.T) { + user_by_email, err := user_service.Querier.FindUserByEmail(context.Background(), test_user1.Email) + if err != nil { + t.Fatal(err) + } + if user_by_email.Email != test_user1.Email || user_by_email.Name != test_user1.Name || user_by_email.ID == 0 { + t.FailNow() + } + + if user_by_email, err = user_service.Querier.FindUserByEmail(context.Background(), fmt.Sprint(user_by_email.ID)); err == nil { + t.Fatal(err) + } + }) + + t.Run("should find by id", func(t *testing.T) { + user_by_email, err := user_service.Querier.FindUserByEmail(context.Background(), test_user1.Email) + if err != nil { + t.Fatal(err) + } + + user_by_id, err := user_service.Querier.FindUserById(context.Background(), user_by_email.ID) + if err != nil { + t.Fatal(err) + } + if user_by_id.Email != test_user1.Email || user_by_id.Name != test_user1.Name || user_by_id.ID == 0 { + t.FailNow() + } + }) + + t.Run("should find or create", func(t *testing.T) { + created_user, created, err := user_service.FindOrCreate(context.Background(), types.CreateUser{ + Name: test_user2.Name, + Email: test_user2.Email, + ImageUrl: test_user2.ImageUrl, + }) + if err != nil || !created { + t.Fatal(err) + } + if created_user.Email != test_user2.Email || created_user.Name != test_user2.Name || created_user.ID == 0 { + t.FailNow() + } + + found_user, created, err := user_service.FindOrCreate(context.Background(), types.CreateUser{ + Name: test_user2.Name, + Email: test_user2.Email, + ImageUrl: test_user2.ImageUrl, + }) + if err != nil || created { + t.Fatal(err) + } + if found_user.Email != test_user2.Email || found_user.Name != test_user2.Name || found_user.ID != created_user.ID { + t.FailNow() + } + }) + + t.Run("should find with id and email", func(t *testing.T) { + user, err := user_service.Querier.FindUserByIdAndEmail(context.Background(), database.FindUserByIdAndEmailParams{ + ID: 3434, + Email: test_user1.Email, + }) + if err == nil { + t.Fatal("should not find a user with an non existing or matching uuid") + } + + user_by_email, err := user_service.Querier.FindUserByEmail(context.Background(), test_user1.Email) + if err != nil { + t.Fatal(err) + } + + user, err = user_service.Querier.FindUserByIdAndEmail(context.Background(), database.FindUserByIdAndEmailParams{ + ID: user_by_email.ID, + Email: test_user1.Email, + }) + if err != nil || user.ID != user_by_email.ID || user.Email != user_by_email.Email { + t.Fatal(err, user, user_by_email) + } + + _, err = user_service.Querier.FindUserByIdAndEmail(context.Background(), database.FindUserByIdAndEmailParams{ + ID: user.ID, + Email: test_user2.Email, + }) + if err == nil { + t.Fatal("should not find a user with id and email from different users") + } + }) + }) +} \ No newline at end of file diff --git a/src/types/app.go b/src/types/app.go new file mode 100644 index 00000000..d0d73e5c --- /dev/null +++ b/src/types/app.go @@ -0,0 +1,15 @@ +package types + +import ( + "database/sql" + + "github.com/go-playground/validator/v10" + "github.com/gofiber/fiber/v2" +) + +type AppContext struct { + DB *sql.DB + Tokens *Tokens + Server *fiber.App + Validator *validator.Validate +} diff --git a/src/types/dto.go b/src/types/dto.go new file mode 100644 index 00000000..6fc35069 --- /dev/null +++ b/src/types/dto.go @@ -0,0 +1,186 @@ +package types + +import ( + "time" +) + +type Response struct { + Message string `json:"message"` +} + +type Result struct { + Data interface{} `json:"data"` +} + +type Errors struct { + Errors []string `json:"errors"` +} + +type DeleteStatus struct { + Deleted bool `json:"deleted"` +} + +type User struct { + ID int64 `json:"id" sql:"primary_key"` + Name string `json:"name"` + Email string `json:"email" ` + ImageUrl string `json:"imageUrl,omitempty"` + Active bool `json:"active"` + Phone string `json:"phone,omitempty"` + Admin bool `json:"admin,omitempty"` +} + +type CreateUser struct { + Name string `json:"name" validate:"required"` + Email string `json:"email" validate:"required,email"` + ImageUrl string `json:"imageUrl,omitempty" validate:"omitempty,url"` + Phone string `json:"phone,omitempty" validate:"omitempty,"` +} + +type Auth struct { + User User `json:"user"` + Token string `json:"token"` +} + +type Category struct { + ID int64 `json:"id"` + Name string `json:"name"` + Description string `json:"description,omitempty"` +} + +type CreateCategory struct { + Name string `json:"name" validate:"required"` + Description string `json:"description,omitempty"` + Url string `json:"url,omitempty" validate:"omitempty,url"` +} + +type Product struct { + ID int64 `json:"id"` + Title string `json:"title"` + Description string `json:"description,omitempty"` + ProductKey string `json:"productKey"` + ImageUrl string `json:"imageUrl"` + TotalReviews int32 `json:"totalReviews"` + Rating float32 `json:"rating"` + Price string `json:"price"` + Currency string `json:"currency"` + Url string `json:"url"` + CategoryID int64 `json:"categoryId,omitempty"` + Category Category `json:"category,omitempty"` + CreatedAt time.Time `json:"createdAt"` + UpdatedAt time.Time `json:"updatedAt"` + Origin string `json:"origin"` +} + +type CreateProduct struct { + Title string `json:"title" validate:"required"` + Description string `json:"description,omitempty"` + ProductKey string `json:"productKey" validate:"required"` + ImageUrl string `json:"imageUrl,omitempty" validate:"omitempty,url"` + Rating float32 `json:"rating" validate:"required,min=1,max=5"` + Price string `json:"price" validate:"required,gte=1"` + OriginalUrl string `json:"originalUrl" validate:"required,url"` + TotalReviews uint `json:"totalReviews" validate:"required,gte=1"` + Category string `json:"category" validate:"required"` +} + +type ProductFilter struct { + Search *string `json:"search,omitempty" validate:"omitempty"` + Limit int32 `json:"limit" validate:"required,min=1,max=200"` + Page int32 `json:"page" validate:"required,gte=1"` + MinPrice float32 `json:"minPrice,omitempty" validate:"omitempty,gte=1,ltefield=MaxPrice"` + MaxPrice float32 `json:"maxPrice,omitempty" validate:"omitempty,gtefield=MinPrice"` + Sort *string `json:"sort,omitempty" validate:"omitempty"` +} + +type CreateWish struct { + ProductID *int64 `json:"productId,omitempty"` +} + +type DeleteWish struct { + WishID int64 `json:"wishId"` +} + +type Wish struct { + ID int64 `json:"id" sql:"primary_key"` + UserID int64 `json:"userId"` + ParticipantID int64 `json:"participantId"` + ProductID int64 `json:"productId,omitempty"` + Product *Product `json:"product,omitempty"` + EventID int64 `json:"eventId"` + Quantity int32 `json:"quantity" alias:"wish.quantity"` +} + +type Participant struct { + ID int64 `json:"id" sql:"primary_key"` + Name string `json:"name"` + Email string `json:"email"` + Address string `json:"address,omitempty"` + Organizer bool `json:"organizer"` + Participates bool `json:"participates"` + Accepted bool `json:"accepted"` + EventID int64 `json:"eventId,omitempty"` + Event *Event `json:"event,omitempty"` + UserID int64 `json:"userId,omitempty"` + User *User `json:"user,omitempty"` + Wishes *[]Wish `json:"wishes,omitempty"` +} + +type CreateParticipant struct { + Email string `json:"email" validate:"required,email"` + Name string `json:"name,omitempty" validate:"omitempty"` + Address string `json:"address,omitempty" validate:"omitempty"` + Organizer bool `json:"organizer,omitempty" validate:"omitempty"` + Participates bool `json:"participates,omitempty" validate:"omitempty"` + UserID *int64 `json:"-" validate:"omitempty"` + EventID int64 `json:"-" validate:"omitempty"` +} + +type PatchParticipant struct { + Name *string `json:"name,omitempty" validate:"omitempty"` + Address *string `json:"address,omitempty" validate:"omitempty"` + Organizer *bool `json:"organizer,omitempty" validate:"omitempty"` + Participates *bool `json:"participates,omitempty" validate:"omitempty"` +} + +type Link struct { + ID int64 `json:"id" sql:"primary_key" alias:"link.id"` + Code string `json:"code" alias:"link.code"` + EventID int64 `json:"eventId,omitempty" alias:"link.event_id"` + Event *Event `json:"event,omitempty"` + ExpirationDate time.Time `json:"expiration_date" alias:"link.expiration_date"` +} + +type Event struct { + ID int64 `json:"id" sql:"primary_key" alias:"event.id"` + Name string `json:"name" alias:"event.name"` + Slug string `json:"slug,omitempty"` + Description string `json:"description,omitempty" alias:"event.description"` + Budget string `json:"budget" alias:"event.budget"` + InvitationMessage string `json:"invitationMessage,omitempty" alias:"event.invitation_message"` + DrawAt time.Time `json:"drawAt" alias:"event.draw_at"` + CloseAt time.Time `json:"closeAt" alias:"event.close_at"` + CreatedAt time.Time `json:"createdAt" alias:"event.created_at"` + UpdatedAt time.Time `json:"updatedAt" alias:"event.updated_at"` + Participants []Participant `json:"participants,omitempty"` + Links []Link `json:"links,omitempty"` + MyWishList []Wish `json:"my_wish_list,omitempty"` +} + +type CreateEvent struct { + Name string `json:"name" validate:"required"` + Description string `json:"description,omitempty"` + Budget float32 `json:"budget" validate:"required,gte=1"` + InvitationMessage string `json:"invitationMessage,omitempty"` + DrawAt time.Time `json:"drawAt" validate:"required"` + CloseAt time.Time `json:"closeAt" validate:"required"` + Participants []CreateParticipant `json:"participants,omitempty" validate:"omitempty"` +} + +type UpdateEvent struct { + Name string `json:"name,omitempty"` + Description string `json:"description,omitempty"` + Budget float32 `json:"budget,omitempty" validate:"gte=1"` + DrawAt time.Time `json:"drawAt,omitempty"` + CloseAt time.Time `json:"closeAt,omitempty"` +} diff --git a/src/types/json.go b/src/types/json.go new file mode 100644 index 00000000..577030c1 --- /dev/null +++ b/src/types/json.go @@ -0,0 +1,27 @@ +package types + +type TwitterKeys struct { + ApiKey string `json:"apiKey"` + ApiKeySecret string `json:"apiKeySecret"` + BearerToken string `json:"bearerToken"` + CallbackUrl string `json:"callbackUrl"` +} + +type GoogleKeys struct { + ClientId string `json:"clientId"` + ClientSecret string `json:"clientSecret"` + CallbackUrl string `json:"callbackUrl"` +} + +type SendgridKeys struct { + ApiKey string `json:"apiKey"` +} + +type Tokens struct { + JwtKey string `json:"jwtKey"` + Twitter TwitterKeys `json:"twitter"` + Google GoogleKeys `json:"google"` + Sendgrid SendgridKeys `json:"sendgrid"` + // To add other tokens create a struct and add them here, + // make sure to also update tokens.json +} diff --git a/src/types/keys.go b/src/types/keys.go new file mode 100644 index 00000000..f9e83100 --- /dev/null +++ b/src/types/keys.go @@ -0,0 +1,8 @@ +package types + +import "time" + +type AuthKeyType string +type EventIdParamKeyType string + +const DateTimeFormat string = time.RFC3339 diff --git a/src/users/dto/create-user.dto.ts b/src/users/dto/create-user.dto.ts deleted file mode 100644 index 69385598..00000000 --- a/src/users/dto/create-user.dto.ts +++ /dev/null @@ -1,5 +0,0 @@ -export class CreateUserDto { - name: string; - email: string; - imageUrl: string; -} diff --git a/src/users/dto/update-user.dto.ts b/src/users/dto/update-user.dto.ts deleted file mode 100644 index dfd37fb1..00000000 --- a/src/users/dto/update-user.dto.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { PartialType } from '@nestjs/mapped-types'; -import { CreateUserDto } from './create-user.dto'; - -export class UpdateUserDto extends PartialType(CreateUserDto) {} diff --git a/src/users/entities/user.entity.ts b/src/users/entities/user.entity.ts deleted file mode 100644 index 6662c19b..00000000 --- a/src/users/entities/user.entity.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Wish } from "src/wishes/entities/wish.entity"; -import { BaseEntity, Column, Entity, Index, PrimaryGeneratedColumn } from "typeorm"; -import { Participant } from 'src/participants/entities/participant.entity'; - -@Entity('users') -export class User extends BaseEntity { - @Index({ unique: true }) - @PrimaryGeneratedColumn() - id: number; - - @Column() - name: string; - - @Index({ unique: true }) - @Column() - email: string; - - @Column() - imageUrl: string; - - @Column({ nullable: true }) - phone: string; - - @Column('text', { select: false, nullable: true }) - password: string; - - participated: Participant[]; - - wishes: Wish[]; -} diff --git a/src/users/users.module.ts b/src/users/users.module.ts deleted file mode 100644 index b0d4c475..00000000 --- a/src/users/users.module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Module } from '@nestjs/common'; -import { TypeOrmModule } from '@nestjs/typeorm'; -import { User } from './entities/user.entity'; -import { UsersService } from './users.service'; - -@Module({ - imports: [ - TypeOrmModule.forFeature([User]), - ], - providers: [UsersService], - exports: [UsersService] -}) -export class UsersModule {} diff --git a/src/users/users.service.spec.ts b/src/users/users.service.spec.ts deleted file mode 100644 index 62815ba6..00000000 --- a/src/users/users.service.spec.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { UsersService } from './users.service'; - -describe('UsersService', () => { - let service: UsersService; - - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - providers: [UsersService], - }).compile(); - - service = module.get(UsersService); - }); - - it('should be defined', () => { - expect(service).toBeDefined(); - }); -}); diff --git a/src/users/users.service.ts b/src/users/users.service.ts deleted file mode 100644 index a436daf1..00000000 --- a/src/users/users.service.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { Injectable } from '@nestjs/common'; -import { InjectRepository } from '@nestjs/typeorm'; -import { DeleteResult, Repository } from 'typeorm'; -import { CreateUserDto } from './dto/create-user.dto'; -import { User } from './entities/user.entity'; - -@Injectable() -export class UsersService { - constructor( - @InjectRepository(User) - private usersRepository: Repository - ) { } - - async insert(user: CreateUserDto): Promise { - const userEntity = new User(); - userEntity.email = user.email; - userEntity.name = user.name; - userEntity.imageUrl = user.imageUrl; - - return await userEntity.save(); - } - - async findAll(): Promise { - return await this.usersRepository.find(); - } - - async findById(id: number): Promise { - return await this.usersRepository - .findOne({ - where: { id } - }); - } - - async findByEmail(email: string): Promise { - return await this.usersRepository - .findOne({ - where: { email: email } - }); - } - - async findOne(email: string): Promise { - return await this.findByEmail(email); - } - - async findOneOrCreate(user: CreateUserDto): Promise { - const existingUser = await this.findOne(user.email); - if (existingUser) { - let changed = false; - if (user.imageUrl !== existingUser.imageUrl) { - existingUser.imageUrl = user.imageUrl; - changed ||= true; - } - - if (user.name !== existingUser.name) { - existingUser.name = user.name; - changed ||= true; - } - - if (changed) - return await existingUser.save(); - return existingUser; - } - return await this.insert(user); - } - - async remove(email: string): Promise { - return await this.usersRepository.delete(email); - } -} diff --git a/src/util/exceptions.ts b/src/util/exceptions.ts deleted file mode 100644 index 0ce62b15..00000000 --- a/src/util/exceptions.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { HttpException, HttpStatus } from '@nestjs/common'; - -export function BAD_REQUEST(message: string) { - return new HttpException({ - message: message - }, HttpStatus.BAD_REQUEST); -} - -export function NOT_FOUND(message: string) { - return new HttpException({ - message: message - }, HttpStatus.NOT_FOUND); -} - -export function UNAUTHORIZED(message: string) { - return new HttpException({ - message: message - }, HttpStatus.UNAUTHORIZED); -} \ No newline at end of file diff --git a/src/util/external-routes.ts b/src/util/external-routes.ts deleted file mode 100644 index de58b9ff..00000000 --- a/src/util/external-routes.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { FRONTEND_BASE } from '../../auth-tokens.json'; - -export const frontend_base = FRONTEND_BASE; - -export const frontend = { - home: frontend_base, - google: `${frontend_base}auth/google`, - twitter: `${frontend_base}auth/twitter`, -} \ No newline at end of file diff --git a/src/util/jwtPayload.ts b/src/util/jwtPayload.ts deleted file mode 100644 index ec106601..00000000 --- a/src/util/jwtPayload.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { User } from "src/users/entities/user.entity"; - -export default interface JwtPayload { - user: User; - gToken: string; -} - -export interface JwtAuthReturn { - loggedIn: boolean; - user: User; - accessToken: string; - gToken: string; -} \ No newline at end of file diff --git a/src/util/sendgrid.ts b/src/util/sendgrid.ts deleted file mode 100644 index 05ca950b..00000000 --- a/src/util/sendgrid.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { SENDGRID } from '../../auth-tokens.json' -import { Event } from 'src/events/entities/event.entity'; -import { User } from 'src/users/entities/user.entity'; -import { Participant } from 'src/participants/entities/participant.entity'; -import generateSlug from './slug'; - -const sgMail = require('@sendgrid/mail') - -export const mailingTemplates = { - namesDrawn: 'd-957406e64b0a4a0286838b56fdb20e5e', - newParticipant: 'd-0241b0c49d7f4757b0a1381118ab81c2' -} - -export function sendMail(to: string, subject: string, templateId: string, templateData: any) { - sgMail.setApiKey(SENDGRID.API_KEY); - return sgMail - .send({ - to: to, - from: 'giftxtrade@giftxtrade.com', - subject: subject, - dynamic_template_data: templateData, - template_id: templateId - }); -} - -export function newParticipantMail(user: User, event: Event, newParticipant: Participant) { - const subject = `${newParticipant.name} Has Joined ${event.name} - GiftTrade`; - - sendMail(user.email, subject, mailingTemplates.newParticipant, { - year: new Date().getFullYear().toString(), - user: user, - event: event, - participant: newParticipant, - slug: generateSlug(event.name) - }) - .then((res: any) => { }) - .catch((res: any) => { }); -} - -export function namesDrawnMail(user: User, event: Event, drawee: Participant) { - const subject = `Names were drawn for ${event.name} - GiftTrade`; - - sendMail(user.email, subject, mailingTemplates.namesDrawn, { - year: new Date().getFullYear().toString(), - user: user, - event: event, - drawee: drawee, - slug: generateSlug(event.name) - }) - .then((res: any) => { }) - .catch((res: any) => { }); -} \ No newline at end of file diff --git a/src/util/shuffle.ts b/src/util/shuffle.ts deleted file mode 100644 index f3f821b3..00000000 --- a/src/util/shuffle.ts +++ /dev/null @@ -1,19 +0,0 @@ -export function shuffle(arr: Array) { - // Source: StackOverflow https://stackoverflow.com/a/2450976/5834961 - - let currentIndex = arr.length, randomIndex; - - // While there remain elements to shuffle... - while (0 !== currentIndex) { - - // Pick a remaining element... - randomIndex = Math.floor(Math.random() * currentIndex); - currentIndex--; - - // And swap it with the current element. - [arr[currentIndex], arr[randomIndex]] = [ - arr[randomIndex], arr[currentIndex]]; - } - - return arr; -} \ No newline at end of file diff --git a/src/util/slug.ts b/src/util/slug.ts deleted file mode 100644 index 63f2cd2b..00000000 --- a/src/util/slug.ts +++ /dev/null @@ -1,7 +0,0 @@ -import slugify from "slugify"; - -export default function generateSlug(str: string): string { - return slugify(str, { - lower: true - }); -} \ No newline at end of file diff --git a/src/utils/parsers.go b/src/utils/parsers.go new file mode 100644 index 00000000..5e99e713 --- /dev/null +++ b/src/utils/parsers.go @@ -0,0 +1,71 @@ +package utils + +import ( + "encoding/json" + "fmt" + "os" + "strings" + + "github.com/giftxtrade/api/src/types" + "github.com/go-playground/validator/v10" + "github.com/golang-jwt/jwt" +) + +// Given a JSON file, map the contents into any struct dest +func FileMapper[T any](filename string, dest T) error { + file, err := os.ReadFile(filename) + if err != nil { + return fmt.Errorf("%s not found", filename) + } + if err = json.Unmarshal(file, dest); err != nil { + return err + } + return nil +} + +func ParseTokens() (types.Tokens, error) { + var tokens types.Tokens + err := FileMapper("tokens.json", &tokens) + return tokens, err +} + +// Given a bearer token ("Bearer ") returns the token or an error if parsing was unsuccessful +func GetBearerToken(authorization string) (string, error) { + parsed_authorization := strings.Split(authorization, " ") + if parsed_authorization[0] != "Bearer" || len(parsed_authorization) < 2 { + return "", fmt.Errorf("could not parse bearer token") + } + token := parsed_authorization[1] + return token, nil +} + +// Given a raw jwt token and an encryption key return the mapped jwt claims or an error +func GetJwtClaims(jwt_token string, key string) (jwt.MapClaims, error) { + token, token_err := jwt.Parse(jwt_token, func(t *jwt.Token) (interface{}, error) { + if _, ok := t.Method.(*jwt.SigningMethodHMAC); !ok { + return nil, fmt.Errorf("invalid signing method") + } + return []byte(key), nil + }) + if token_err != nil { + return nil, fmt.Errorf("could not parse jwt token") + } + + // Get claims stored in parsed JWT token + claims, ok := token.Claims.(jwt.MapClaims) + if !ok { + return nil, fmt.Errorf("could not fetch jwt claims") + } + return claims, nil +} + +// Parses json serializable []byte into result data and validates the decoded result +func ParseAndValidateBody[T comparable](validator *validator.Validate, data []byte) (result T, error error) { + if json.Unmarshal(data, &result) != nil { + return result, fmt.Errorf("could not parse data") + } + if err := validator.Struct(result); err != nil { + return result, err + } + return result, nil +} diff --git a/src/utils/response.go b/src/utils/response.go new file mode 100644 index 00000000..8d313ee7 --- /dev/null +++ b/src/utils/response.go @@ -0,0 +1,46 @@ +package utils + +import ( + "github.com/giftxtrade/api/src/types" + "github.com/gofiber/fiber/v2" +) + +func ResponseWithStatusCode[T any](c *fiber.Ctx, statusCode int, data T) error { + return c.Status(statusCode).JSON(data) +} + +// Generic json response with status code 200 +func JsonResponse[T any](c *fiber.Ctx, data T) error { + return ResponseWithStatusCode(c, fiber.StatusOK, data) +} + +// types.Error json response with status code 400 +func FailResponse(c *fiber.Ctx, errors ...string) error { + return ResponseWithStatusCode(c, fiber.StatusBadRequest, types.Errors{ + Errors: errors, + }) +} + +// types.Error json response with status code 401 +func FailResponseUnauthorized(c *fiber.Ctx, errors ...string) error { + return ResponseWithStatusCode(c, fiber.StatusUnauthorized, types.Errors{ + Errors: errors, + }) +} + +// types.Error json response with status code 404 +func FailResponseNotFound(c *fiber.Ctx, errors ...string) error { + return ResponseWithStatusCode(c, fiber.StatusNotFound, types.Errors{ + Errors: errors, + }) +} + +// types.Data json response with status code 200 +func DataResponse[T any](c *fiber.Ctx, data T) error { + return ResponseWithStatusCode(c, fiber.StatusOK, data) +} + +// types.Data json response with status code 201 +func DataResponseCreated[T any](c *fiber.Ctx, data T) error { + return ResponseWithStatusCode(c, fiber.StatusCreated, data) +} \ No newline at end of file diff --git a/src/utils/strings.go b/src/utils/strings.go new file mode 100644 index 00000000..5ecb24dc --- /dev/null +++ b/src/utils/strings.go @@ -0,0 +1,16 @@ +package utils + +import ( + "crypto/rand" + "encoding/base64" +) + +// Generate random string URL encoded +func GenerateRandomUrlEncodedString(length int) (string, error) { + buffer := make([]byte, length) + _, err := rand.Read(buffer) + if err != nil { + return "", err + } + return base64.URLEncoding.EncodeToString(buffer)[:length], nil +} diff --git a/src/wishes/dto/create-wish.dto.ts b/src/wishes/dto/create-wish.dto.ts deleted file mode 100644 index 72ef20d9..00000000 --- a/src/wishes/dto/create-wish.dto.ts +++ /dev/null @@ -1,5 +0,0 @@ -export class CreateWishDto { - eventId: number; - productId: number; - participantId: number; -} diff --git a/src/wishes/dto/update-wish.dto.ts b/src/wishes/dto/update-wish.dto.ts deleted file mode 100644 index 6df36b70..00000000 --- a/src/wishes/dto/update-wish.dto.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { PartialType } from '@nestjs/mapped-types'; -import { CreateWishDto } from './create-wish.dto'; - -export class UpdateWishDto extends PartialType(CreateWishDto) {} diff --git a/src/wishes/entities/wish.entity.ts b/src/wishes/entities/wish.entity.ts deleted file mode 100644 index aee6be37..00000000 --- a/src/wishes/entities/wish.entity.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { Entity, BaseEntity, PrimaryGeneratedColumn, Column, ManyToOne, Index } from 'typeorm'; -import { User } from 'src/users/entities/user.entity'; -import { Participant } from 'src/participants/entities/participant.entity'; -import { Product } from 'src/products/entities/product.entity'; -import { Event } from 'src/events/entities/event.entity'; - -@Entity('wishes') -export class Wish extends BaseEntity { - @Index({ unique: true }) - @PrimaryGeneratedColumn() - id: number; - - @Column('datetime') - createdAt: Date = new Date(Date.now()); - - @Index() - @ManyToOne(() => User, user => user.wishes, { onDelete: 'CASCADE' }) - user: User; - - @Index() - @ManyToOne(() => Participant, participant => participant.wishes, { onDelete: 'CASCADE' }) - participant: Participant; - - @Index() - @ManyToOne(() => Product, product => product.wishes, { onDelete: 'CASCADE' }) - product: Product; - - @Index() - @ManyToOne(() => Event, event => event.wishes, { onDelete: 'CASCADE' }) - event: Event; -} diff --git a/src/wishes/wishes.controller.ts b/src/wishes/wishes.controller.ts deleted file mode 100644 index 01997f89..00000000 --- a/src/wishes/wishes.controller.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { Controller, Get, Post, Body, Patch, Param, Delete, UseGuards, Request, HttpException, HttpStatus } from '@nestjs/common'; -import { WishesService } from './wishes.service'; -import { CreateWishDto } from './dto/create-wish.dto'; -import { UpdateWishDto } from './dto/update-wish.dto'; -import { JwtAuthGuard } from 'src/auth/jwt-auth.guard'; -import { UsersService } from 'src/users/users.service'; -import { EventsService } from 'src/events/events.service'; -import { ParticipantsService } from 'src/participants/participants.service'; - -@Controller('wishes') -export class WishesController { - constructor( - private readonly wishesService: WishesService, - private readonly usersService: UsersService, - private readonly eventsService: EventsService, - private readonly participantService: ParticipantsService, - ) { } - - @UseGuards(JwtAuthGuard) - @Post() - async create(@Request() req, @Body() createWishDto: CreateWishDto) { - const user = await this.usersService.findByEmail(req.user.user.email); - return await this.wishesService.create(user, createWishDto); - } - - @UseGuards(JwtAuthGuard) - @Get(':id') - async findAll(@Request() req, @Param('id') eventId) { - const user = await this.usersService.findByEmail(req.user.user.email); - const event = await this.eventsService.findOneForUser(eventId, user); - if (!event) { - throw new HttpException({ - message: 'Event not found' - }, HttpStatus.NOT_FOUND); - } - - return await this.wishesService.findAllByUserEvent(user, event); - } - - @UseGuards(JwtAuthGuard) - @Get(':eventId/:participantId') - async findAllForParticipant(@Request() req, @Param('eventId') eventId, @Param('participantId') participantId) { - const user = await this.usersService.findByEmail(req.user.user.email); - const participant = await this.participantService.findOneWithUser(participantId); - const event = await this.eventsService.findOneForUser(eventId, user); - - if (!participant || !event) { - throw new HttpException({ - message: 'Invalid participant or event' - }, HttpStatus.NOT_FOUND); - } - return await this.wishesService.findAllByUserEvent(participant.user, event); - } - - @UseGuards(JwtAuthGuard) - @Delete() - async remove(@Request() req, @Body() createWishDto: CreateWishDto) { - const user = await this.usersService.findByEmail(req.user.user.email); - return await this.wishesService.remove(user, createWishDto); - } -} diff --git a/src/wishes/wishes.module.ts b/src/wishes/wishes.module.ts deleted file mode 100644 index 259a37dc..00000000 --- a/src/wishes/wishes.module.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Module, forwardRef } from '@nestjs/common'; -import { WishesService } from './wishes.service'; -import { WishesController } from './wishes.controller'; -import { TypeOrmModule } from '@nestjs/typeorm'; -import { Wish } from './entities/wish.entity'; -import { UsersModule } from 'src/users/users.module'; -import { ProductsModule } from 'src/products/products.module'; -import { EventsModule } from 'src/events/events.module'; -import { ParticipantsModule } from 'src/participants/participants.module'; - -@Module({ - imports: [ - TypeOrmModule.forFeature([Wish]), - UsersModule, - ProductsModule, - forwardRef(() => EventsModule), - forwardRef(() => ParticipantsModule), - ], - controllers: [WishesController], - providers: [WishesService], - exports: [WishesService], -}) -export class WishesModule {} diff --git a/src/wishes/wishes.service.spec.ts b/src/wishes/wishes.service.spec.ts deleted file mode 100644 index 255407c2..00000000 --- a/src/wishes/wishes.service.spec.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { WishesService } from './wishes.service'; - -describe('WishesService', () => { - let service: WishesService; - - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - providers: [WishesService], - }).compile(); - - service = module.get(WishesService); - }); - - it('should be defined', () => { - expect(service).toBeDefined(); - }); -}); diff --git a/src/wishes/wishes.service.ts b/src/wishes/wishes.service.ts deleted file mode 100644 index 5d0928f9..00000000 --- a/src/wishes/wishes.service.ts +++ /dev/null @@ -1,148 +0,0 @@ -import { Injectable, HttpException, HttpStatus } from '@nestjs/common'; -import { CreateWishDto } from './dto/create-wish.dto'; -import { UpdateWishDto } from './dto/update-wish.dto'; -import { EventsService } from 'src/events/events.service'; -import { ProductsService } from 'src/products/products.service'; -import { ParticipantsService } from 'src/participants/participants.service'; -import { User } from 'src/users/entities/user.entity'; -import { Wish } from 'src/wishes/entities/wish.entity'; -import { Product } from 'src/products/entities/product.entity'; -import { InjectRepository } from '@nestjs/typeorm'; -import { Repository } from 'typeorm'; -import { Event } from 'src/events/entities/event.entity'; - -@Injectable() -export class WishesService { - constructor( - @InjectRepository(Wish) - private readonly wishRepository: Repository, - private readonly eventsService: EventsService, - private readonly productsService: ProductsService, - - private readonly participantsService: ParticipantsService, - ) {} - - async create(user: User, createWishDto: CreateWishDto) { - const { event, participant, product } = await this.getWishItems( - user, - createWishDto.eventId, - createWishDto.productId, - createWishDto.participantId, - ); - - const wish = new Wish(); - wish.user = user; - wish.event = event; - wish.participant = participant; - wish.product = product; - return await wish.save(); - } - - findAllByUserEvent(user: User, event: Event): Promise { - return this.wishRepository - .createQueryBuilder('w') - .leftJoinAndSelect('w.product', 'products') - .where('w.userId = :userId AND w.eventId = :eventId', { - userId: user.id, - eventId: event.id, - }) - .orderBy('w.id', 'DESC') - .getMany(); - } - - async findOneByUserProductEvent(user: User, product: Product, event: Event) { - return this.wishRepository - .createQueryBuilder('w') - .where( - 'w.userId = :userId AND w.eventId = :eventId AND w.productId = :productId', - { - userId: user.id, - eventId: event.id, - productId: product.id, - }, - ) - .getOne(); - } - - async remove(user: User, createWishDto: CreateWishDto) { - const { product, event, participant } = await this.getWishItems( - user, - createWishDto.eventId, - createWishDto.productId, - createWishDto.participantId, - ); - - if (!product || !event || !participant) { - throw new HttpException( - { - message: 'Something went wrong', - }, - HttpStatus.BAD_REQUEST, - ); - } - - const wish = await this.findOneByUserProductEvent(user, product, event); - if (!wish) { - throw new HttpException( - { - message: 'Could not delete wish item', - }, - HttpStatus.BAD_REQUEST, - ); - } - return await wish.remove(); - } - - private async getWishItems( - user: User, - eventId: number, - productId: number, - participantId: number, - ) { - const event = await this.eventsService.findOneForUser(eventId, user); - const product = await this.productsService.findOne(productId); - - if (!event || !product) { - throw new HttpException( - { - message: 'Could not find event or product', - }, - HttpStatus.NOT_FOUND, - ); - } - - const participant = await this.participantsService.findByEventAndUser( - event, - user, - ); - if (!participant) { - if (participant.organizer && !participant.participates) { - throw new HttpException( - { - message: - 'You are not a participant for this group. Swith your status to participant if you want a wishlist', - }, - HttpStatus.BAD_REQUEST, - ); - } - - throw new HttpException( - { - message: 'You are not part of this event', - }, - HttpStatus.BAD_REQUEST, - ); - } - - if (participant.id !== participantId) { - throw new HttpException( - { - message: 'Invalid participant id', - }, - HttpStatus.BAD_REQUEST, - ); - } - - return { event, participant, product }; - } -} diff --git a/test/app.e2e-spec.ts b/test/app.e2e-spec.ts deleted file mode 100644 index 50cda623..00000000 --- a/test/app.e2e-spec.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { INestApplication } from '@nestjs/common'; -import * as request from 'supertest'; -import { AppModule } from './../src/app.module'; - -describe('AppController (e2e)', () => { - let app: INestApplication; - - beforeEach(async () => { - const moduleFixture: TestingModule = await Test.createTestingModule({ - imports: [AppModule], - }).compile(); - - app = moduleFixture.createNestApplication(); - await app.init(); - }); - - it('/ (GET)', () => { - return request(app.getHttpServer()) - .get('/') - .expect(200) - .expect('Hello World!'); - }); -}); diff --git a/test/jest-e2e.json b/test/jest-e2e.json deleted file mode 100644 index e9d912f3..00000000 --- a/test/jest-e2e.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "moduleFileExtensions": ["js", "json", "ts"], - "rootDir": ".", - "testEnvironment": "node", - "testRegex": ".e2e-spec.ts$", - "transform": { - "^.+\\.(t|j)s$": "ts-jest" - } -} diff --git a/ts_types/package-lock.json b/ts_types/package-lock.json new file mode 100644 index 00000000..fe3ce726 --- /dev/null +++ b/ts_types/package-lock.json @@ -0,0 +1,13 @@ +{ + "name": "@giftxtrade/api-types", + "version": "1.1.3", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "@giftxtrade/api-types", + "version": "1.1.3", + "license": "ISC" + } + } +} diff --git a/ts_types/package.json b/ts_types/package.json new file mode 100644 index 00000000..7f5bb2a3 --- /dev/null +++ b/ts_types/package.json @@ -0,0 +1,8 @@ +{ + "author": "ayaanqui", + "description": "", + "license": "ISC", + "main": "types.ts", + "name": "@giftxtrade/api-types", + "version": "1.1.3" +} \ No newline at end of file diff --git a/ts_types/types.ts b/ts_types/types.ts new file mode 100644 index 00000000..58babd89 --- /dev/null +++ b/ts_types/types.ts @@ -0,0 +1,161 @@ +// Code generated by tygo. DO NOT EDIT. + +////////// +// source: dto.go + +export interface Response { + message: string; +} +export interface Result { + data: any; +} +export interface Errors { + errors: string[]; +} +export interface DeleteStatus { + deleted: boolean; +} +export interface User { + id: number /* int64 */; + name: string; + email: string; + imageUrl?: string; + active: boolean; + phone?: string; + admin?: boolean; +} +export interface CreateUser { + name: string; + email: string; + imageUrl?: string; + phone?: string; +} +export interface Auth { + user: User; + token: string; +} +export interface Category { + id: number /* int64 */; + name: string; + description?: string; +} +export interface CreateCategory { + name: string; + description?: string; + url?: string; +} +export interface Product { + id: number /* int64 */; + title: string; + description?: string; + productKey: string; + imageUrl: string; + totalReviews: number /* int32 */; + rating: number /* float32 */; + price: string; + currency: string; + url: string; + categoryId?: number /* int64 */; + category?: Category; + createdAt: string /* RFC3339 */; + updatedAt: string /* RFC3339 */; + origin: string; +} +export interface CreateProduct { + title: string; + description?: string; + productKey: string; + imageUrl?: string; + rating: number /* float32 */; + price: string; + originalUrl: string; + totalReviews: number /* uint */; + category: string; +} +export interface ProductFilter { + search?: string; + limit: number /* int32 */; + page: number /* int32 */; + minPrice?: number /* float32 */; + maxPrice?: number /* float32 */; + sort?: string; +} +export interface CreateWish { + productId?: number /* int64 */; +} +export interface DeleteWish { + wishId: number /* int64 */; +} +export interface Wish { + id: number /* int64 */; + userId: number /* int64 */; + participantId: number /* int64 */; + productId?: number /* int64 */; + product?: Product; + eventId: number /* int64 */; + quantity: number /* int32 */; +} +export interface Participant { + id: number /* int64 */; + name: string; + email: string; + address?: string; + organizer: boolean; + participates: boolean; + accepted: boolean; + eventId?: number /* int64 */; + event?: Event; + userId?: number /* int64 */; + user?: User; + wishes?: Wish[]; +} +export interface CreateParticipant { + email: string; + name?: string; + address?: string; + organizer?: boolean; + participates?: boolean; +} +export interface PatchParticipant { + name?: string; + address?: string; + organizer?: boolean; + participates?: boolean; +} +export interface Link { + id: number /* int64 */; + code: string; + eventId?: number /* int64 */; + event?: Event; + expiration_date: string /* RFC3339 */; +} +export interface Event { + id: number /* int64 */; + name: string; + slug?: string; + description?: string; + budget: string; + invitationMessage?: string; + drawAt: string /* RFC3339 */; + closeAt: string /* RFC3339 */; + createdAt: string /* RFC3339 */; + updatedAt: string /* RFC3339 */; + participants?: Participant[]; + links?: Link[]; +} +export interface CreateEvent { + name: string; + description?: string; + budget: number /* float32 */; + inviteMessage?: string; + drawAt: string /* RFC3339 */; + closeAt: string /* RFC3339 */; + participants?: CreateParticipant[]; +} +export interface UpdateEvent { + name?: string; + description?: string; + budget?: number /* float32 */; + drawAt?: string /* RFC3339 */; + closeAt?: string /* RFC3339 */; +} diff --git a/ts_types/version.go b/ts_types/version.go new file mode 100644 index 00000000..01282e34 --- /dev/null +++ b/ts_types/version.go @@ -0,0 +1,59 @@ +package main + +import ( + "encoding/json" + "fmt" + "os" + "strconv" + "strings" +) + +func update_version(version ...uint8) (major uint8, minor uint8, patch uint8) { + patch = version[2] + minor = version[1] + major = version[0] + if patch < 10 { + patch += 1 + } else if minor < 10 { + patch = 0 + minor += 1 + } else { + patch = 0 + minor = 0 + major += 1 + } + return major, minor, patch +} + +func main() { + file := "./ts_types/package.json" + file_bytes, err := os.ReadFile(file) + if err != nil { + panic(err) + } + var package_json map[string]interface{} + if err := json.Unmarshal(file_bytes, &package_json); err != nil { + panic(err) + } + version := package_json["version"].(string) + split_version := strings.Split(version, ".") + parsed_version := make([]uint8, len(split_version)) + for i, t := range split_version { + v, err := strconv.ParseUint(t, 10, 8) + if err != nil { + panic(err) + } + parsed_version[i] = uint8(v) + } + parsed_version[0], parsed_version[1], parsed_version[2] = update_version(parsed_version...) + for i, t := range parsed_version { + split_version[i] = fmt.Sprint(t) + } + final_version := strings.Join(split_version, ".") + package_json["version"] = final_version + data, err := json.MarshalIndent(package_json, "", " ") + if err != nil { + panic(err) + } + os.WriteFile(file, data, 0644) +} diff --git a/tsconfig.build.json b/tsconfig.build.json deleted file mode 100644 index 64f86c6b..00000000 --- a/tsconfig.build.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "extends": "./tsconfig.json", - "exclude": ["node_modules", "test", "dist", "**/*spec.ts"] -} diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index 9d91d0fc..00000000 --- a/tsconfig.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "compilerOptions": { - "module": "commonjs", - "declaration": true, - "removeComments": true, - "emitDecoratorMetadata": true, - "experimentalDecorators": true, - "allowSyntheticDefaultImports": true, - "target": "es2017", - "sourceMap": true, - "outDir": "./dist", - "baseUrl": "./", - "incremental": true, - "resolveJsonModule": true, - "esModuleInterop": true - } -} diff --git a/tygo.yaml b/tygo.yaml new file mode 100644 index 00000000..8df907e5 --- /dev/null +++ b/tygo.yaml @@ -0,0 +1,9 @@ +packages: + - path: "github.com/giftxtrade/api/src/types" + output_path: "ts_types/types.ts" + exclude_files: + - app.go + - keys.go + - json.go + type_mappings: + time.Time: "string /* RFC3339 */"