From 2e7d42194104263346322d7c6bbfa94a1300a676 Mon Sep 17 00:00:00 2001 From: exAspArk Date: Sat, 19 Jul 2025 22:55:44 -0400 Subject: [PATCH 01/24] Release v1.0.0-beta.1 --- .env.sample | 36 +- .github/workflows/build.yml | 15 +- Dockerfile | 110 +- Dockerfile.test | 113 ++ Makefile | 55 +- README.md | 625 +++---- build/.gitkeep | 0 devbox.json | 5 +- devbox.lock | 111 +- docker/bin-test/minio_configure.sh | 14 + docker/bin-test/minio_start.sh | 8 + docker/bin-test/postgres_configure.sh | 13 + docker/bin-test/postgres_start.sh | 11 + docker/bin-test/test.sh | 43 + docker/bin/run.sh | 62 + docker/bin/trino_configure_and_start.sh | 38 + docker/bin/trino_ensure_started.sh | 10 + docker/trino/bin/health-check.sh | 32 + docker/trino/bin/run.sh | 10 + docker/trino/configure.sql | 16 + docker/trino/etc/catalog/iceberg.properties | 18 + docker/trino/etc/config.properties | 6 + docker/trino/etc/jvm.config | 16 + docker/trino/etc/log.properties | 2 + docker/trino/etc/node.properties | 2 + img/architecture.png | Bin 95887 -> 99796 bytes scripts/build-darwin.sh | 36 - scripts/build-docker.sh | 13 + scripts/build-linux.sh | 28 - scripts/install.sh | 43 - scripts/publish-docker.sh | 28 +- src/config.go | 201 --- src/config_test.go | 214 --- src/duckdb_test.go | 64 - src/go.sum | 1287 --------------- src/iceberg_reader.go | 43 - src/iceberg_writer.go | 23 - src/iceberg_writer_table.go | 189 --- src/iceberg_writer_table_test.go | 1445 ----------------- src/main.go | 108 -- src/pg_schema_column.go | 430 ----- src/query_handler.go | 783 --------- src/server/config.go | 131 ++ src/{ => server}/custom_types.go | 61 +- src/{ => server}/duckdb.go | 87 +- src/{ => server}/error_utils.go | 23 +- src/{ => server}/go.mod | 53 +- src/server/go.sum | 137 ++ src/server/iceberg_catalog.go | 92 ++ src/server/iceberg_reader.go | 33 + src/{ => server}/logger.go | 0 src/server/main.go | 58 + src/{ => server}/parser_a_expr.go | 0 src/{ => server}/parser_column_ref.go | 12 + src/{ => server}/parser_function.go | 11 - src/{ => server}/parser_select.go | 0 src/{ => server}/parser_show.go | 0 src/{ => server}/parser_table.go | 11 +- src/{ => server}/parser_type_cast.go | 0 src/{ => server}/parser_utils.go | 16 - src/{ => server}/pg_constants.go | 4 +- src/server/postgres_client.go | 77 + .../postgres_server.go} | 96 +- src/server/query_handler.go | 342 ++++ src/{ => server}/query_handler_test.go | 863 +++++----- src/{ => server}/query_remapper.go | 4 +- src/{ => server}/query_remapper_expression.go | 19 + src/{ => server}/query_remapper_function.go | 33 +- src/{ => server}/query_remapper_select.go | 0 src/{ => server}/query_remapper_show.go | 0 src/{ => server}/query_remapper_table.go | 4 +- src/server/response_handler.go | 367 +++++ src/server/storage_s3.go | 127 ++ src/server/utils.go | 70 + src/storage_interface.go | 145 -- src/storage_local.go | 400 ----- src/storage_local_test.go | 283 ---- src/storage_s3.go | 532 ------ src/storage_utils.go | 1266 --------------- src/syncer-amplitude/amplitude.go | 100 ++ src/syncer-amplitude/config.go | 95 ++ src/syncer-amplitude/event.go | 330 ++++ src/syncer-amplitude/go.mod | 20 + src/syncer-amplitude/go.sum | 130 ++ src/syncer-amplitude/main.go | 7 + src/syncer-amplitude/syncer.go | 159 ++ src/syncer-common/base_config.go | 43 + src/{ => syncer-common}/capped_buffer.go | 6 +- src/{ => syncer-common}/capped_buffer_test.go | 28 +- src/syncer-common/error_utils.go | 49 + src/syncer-common/go.mod | 17 + src/syncer-common/go.sum | 130 ++ src/syncer-common/logger.go | 51 + src/syncer-common/set.go | 44 + src/syncer-common/trino.go | 88 + src/syncer-common/utils.go | 88 + src/syncer-postgres/config.go | 178 ++ src/syncer-postgres/debezium.go | 28 + src/syncer-postgres/go.mod | 31 + src/syncer-postgres/go.sum | 152 ++ src/{ => syncer-postgres}/init_test.go | 418 ++++- src/syncer-postgres/main.go | 7 + src/syncer-postgres/nats.go | 37 + src/syncer-postgres/pg_schema_column.go | 330 ++++ src/syncer-postgres/pg_schema_table.go | 36 + src/syncer-postgres/postgres.go | 194 +++ src/syncer-postgres/syncer.go | 69 + src/syncer-postgres/syncer_full_refresh.go | 109 ++ src/syncer-postgres/syncer_utils.go | 136 ++ src/syncer.go | 317 ---- src/syncer_table.go | 350 ---- src/syncer_table_test.go | 178 -- src/syncer_test.go | 59 - src/utils.go | 171 -- 114 files changed, 5793 insertions(+), 10055 deletions(-) create mode 100644 Dockerfile.test delete mode 100644 build/.gitkeep create mode 100755 docker/bin-test/minio_configure.sh create mode 100755 docker/bin-test/minio_start.sh create mode 100755 docker/bin-test/postgres_configure.sh create mode 100755 docker/bin-test/postgres_start.sh create mode 100755 docker/bin-test/test.sh create mode 100755 docker/bin/run.sh create mode 100755 docker/bin/trino_configure_and_start.sh create mode 100755 docker/bin/trino_ensure_started.sh create mode 100755 docker/trino/bin/health-check.sh create mode 100755 docker/trino/bin/run.sh create mode 100644 docker/trino/configure.sql create mode 100644 docker/trino/etc/catalog/iceberg.properties create mode 100644 docker/trino/etc/config.properties create mode 100644 docker/trino/etc/jvm.config create mode 100644 docker/trino/etc/log.properties create mode 100644 docker/trino/etc/node.properties delete mode 100755 scripts/build-darwin.sh create mode 100755 scripts/build-docker.sh delete mode 100755 scripts/build-linux.sh delete mode 100755 scripts/install.sh delete mode 100644 src/config.go delete mode 100644 src/config_test.go delete mode 100644 src/duckdb_test.go delete mode 100644 src/go.sum delete mode 100644 src/iceberg_reader.go delete mode 100644 src/iceberg_writer.go delete mode 100644 src/iceberg_writer_table.go delete mode 100644 src/iceberg_writer_table_test.go delete mode 100644 src/main.go delete mode 100644 src/pg_schema_column.go delete mode 100644 src/query_handler.go create mode 100644 src/server/config.go rename src/{ => server}/custom_types.go (60%) rename src/{ => server}/duckdb.go (62%) rename src/{ => server}/error_utils.go (67%) rename src/{ => server}/go.mod (53%) create mode 100644 src/server/go.sum create mode 100644 src/server/iceberg_catalog.go create mode 100644 src/server/iceberg_reader.go rename src/{ => server}/logger.go (100%) create mode 100644 src/server/main.go rename src/{ => server}/parser_a_expr.go (100%) rename src/{ => server}/parser_column_ref.go (73%) rename src/{ => server}/parser_function.go (89%) rename src/{ => server}/parser_select.go (100%) rename src/{ => server}/parser_show.go (100%) rename src/{ => server}/parser_table.go (87%) rename src/{ => server}/parser_type_cast.go (100%) rename src/{ => server}/parser_utils.go (84%) rename src/{ => server}/pg_constants.go (96%) create mode 100644 src/server/postgres_client.go rename src/{postgres.go => server/postgres_server.go} (61%) create mode 100644 src/server/query_handler.go rename src/{ => server}/query_handler_test.go (62%) rename src/{ => server}/query_remapper.go (99%) rename src/{ => server}/query_remapper_expression.go (84%) rename src/{ => server}/query_remapper_function.go (84%) rename src/{ => server}/query_remapper_select.go (100%) rename src/{ => server}/query_remapper_show.go (100%) rename src/{ => server}/query_remapper_table.go (98%) create mode 100644 src/server/response_handler.go create mode 100644 src/server/storage_s3.go create mode 100644 src/server/utils.go delete mode 100644 src/storage_interface.go delete mode 100644 src/storage_local.go delete mode 100644 src/storage_local_test.go delete mode 100644 src/storage_s3.go delete mode 100644 src/storage_utils.go create mode 100644 src/syncer-amplitude/amplitude.go create mode 100644 src/syncer-amplitude/config.go create mode 100644 src/syncer-amplitude/event.go create mode 100644 src/syncer-amplitude/go.mod create mode 100644 src/syncer-amplitude/go.sum create mode 100644 src/syncer-amplitude/main.go create mode 100644 src/syncer-amplitude/syncer.go create mode 100644 src/syncer-common/base_config.go rename src/{ => syncer-common}/capped_buffer.go (95%) rename src/{ => syncer-common}/capped_buffer_test.go (93%) create mode 100644 src/syncer-common/error_utils.go create mode 100644 src/syncer-common/go.mod create mode 100644 src/syncer-common/go.sum create mode 100644 src/syncer-common/logger.go create mode 100644 src/syncer-common/set.go create mode 100644 src/syncer-common/trino.go create mode 100644 src/syncer-common/utils.go create mode 100644 src/syncer-postgres/config.go create mode 100644 src/syncer-postgres/debezium.go create mode 100644 src/syncer-postgres/go.mod create mode 100644 src/syncer-postgres/go.sum rename src/{ => syncer-postgres}/init_test.go (52%) create mode 100644 src/syncer-postgres/main.go create mode 100644 src/syncer-postgres/nats.go create mode 100644 src/syncer-postgres/pg_schema_column.go create mode 100644 src/syncer-postgres/pg_schema_table.go create mode 100644 src/syncer-postgres/postgres.go create mode 100644 src/syncer-postgres/syncer.go create mode 100644 src/syncer-postgres/syncer_full_refresh.go create mode 100644 src/syncer-postgres/syncer_utils.go delete mode 100644 src/syncer.go delete mode 100644 src/syncer_table.go delete mode 100644 src/syncer_table_test.go delete mode 100644 src/syncer_test.go delete mode 100644 src/utils.go diff --git a/.env.sample b/.env.sample index 7f329c7..c5f982f 100644 --- a/.env.sample +++ b/.env.sample @@ -1,29 +1,13 @@ -BEMIDB_PORT=54321 -BEMIDB_DATABASE=bemidb -BEMIDB_USER= -BEMIDB_PASSWORD= -BEMIDB_HOST=127.0.0.1 -BEMIDB_INIT_SQL=./init.sql -BEMIDB_LOG_LEVEL=INFO - -# Local storage -BEMIDB_STORAGE_TYPE=LOCAL -BEMIDB_STORAGE_PATH=./iceberg +AWS_REGION=us-west-1 +AWS_S3_BUCKET=[REPLACE_ME] +AWS_ACCESS_KEY_ID=[REPLACE_ME] +AWS_SECRET_ACCESS_KEY=[REPLACE_ME] +CATALOG_DATABASE_URL=postgres://postgres:postgres@host.docker.internal:5432/catalog -# S3 storage -# BEMIDB_STORAGE_TYPE=S3 -# BEMIDB_STORAGE_PATH=iceberg -# AWS_REGION=us-west-1 -# AWS_ENDPOINT=s3.amazonaws.com -# AWS_S3_BUCKET=[REPLACE_ME] -# AWS_ACCESS_KEY_ID=[REPLACE_ME] -# AWS_SECRET_ACCESS_KEY=[REPLACE_ME] +SOURCE_POSTGRES_DATABASE_URL=postgres://postgres:postgres@host.docker.internal:5432/source -# BEMIDB_DISABLE_ANONYMOUS_ANALYTICS=true +SOURCE_AMPLITUDE_API_KEY=[REPLACE_ME] +SOURCE_AMPLITUDE_SECRET_KEY=[REPLACE_ME] -# Postgres syncing -PG_DATABASE_URL=postgres://[USER]:[PASSWORD]@localhost:5432/[DATABASE] -# PG_SYNC_INTERVAL=1h -# PG_SCHEMA_PREFIX=mydb_ -# PG_INCLUDE_TABLES=public.users,public.posts -# PG_EXCLUDE_TABLES=public.logs +BEMIDB_LOG_LEVEL=INFO +BEMIDB_DISABLE_ANONYMOUS_ANALYTICS=true diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 7de6c7d..15578e6 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -14,15 +14,8 @@ jobs: - name: Checkout Code uses: actions/checkout@v4 - - name: Set Up Go - uses: actions/setup-go@v5 - with: - go-version: '1.24.3' + - name: Build test container + run: docker build -t bemidb-test -f Dockerfile.test --build-arg PLATFORM=linux/amd64 . - - name: Install Dependencies - run: go get . - working-directory: ./src - - - name: Run Tests - run: go test -v ./... - working-directory: ./src + - name: Run tests + run: docker run --rm bemidb-test diff --git a/Dockerfile b/Dockerfile index 2ae9c01..6821965 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,23 +1,107 @@ -ARG PLATFORM -ARG GOOS -ARG GOARCH +ARG PLATFORM=linux/arm64 -FROM --platform=$PLATFORM golang:1.24.3 AS builder +FROM --platform=$PLATFORM debian:12-slim AS base + +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + curl ca-certificates \ + postgresql-client \ + gcc g++ libc6-dev \ + && rm -rf /var/lib/apt/lists/* + +RUN adduser --disabled-login app WORKDIR /app -COPY src/go.mod src/go.sum ./ -RUN go mod download +# Install Java and Trino -COPY src/ . -RUN CGO_ENABLED=1 GOOS=$GOOS GOARCH=$GOARCH go build -o /app/bemidb +ENV JAVA_HOME /opt/jdk-24 +ENV PATH $JAVA_HOME/bin:$PATH -################################################################################ +RUN \ + ARCH=$(dpkg --print-architecture) && case "$ARCH" in \ + "amd64") \ + JDK_URL="https://download.oracle.com/java/24/archive/jdk-24.0.1_linux-x64_bin.tar.gz"; \ + ;; \ + "arm64") \ + JDK_URL="https://download.oracle.com/java/24/archive/jdk-24.0.1_linux-aarch64_bin.tar.gz"; \ + ;; \ + *) \ + echo "Unsupported architecture: $ARCH"; \ + exit 1; \ + ;; \ + esac \ + && curl -L "$JDK_URL" -o jdk.tar.gz \ + && tar -xzf jdk.tar.gz \ + && rm jdk.tar.gz \ + && mkdir -p /opt \ + && mv jdk-24.0.1 /opt/jdk-24 \ + \ + && curl -L https://repo1.maven.org/maven2/io/trino/trino-server/476/trino-server-476.tar.gz -o trino-server-476.tar.gz \ + && tar -xzf trino-server-476.tar.gz \ + && rm trino-server-476.tar.gz \ + && mv trino-server-476 /app/trino \ + && mkdir -p /data/trino \ + && chown -R "app:app" /app/trino /data/trino -FROM --platform=$PLATFORM debian:bookworm-slim +# Set up Trino -WORKDIR /app +HEALTHCHECK --interval=10s --timeout=5s --start-period=10s \ + CMD /app/trino/bin/health-check.sh + +COPY --chown=app:app docker/trino/etc /etc/trino +COPY --chown=app:app docker/trino/bin /app/trino/bin +COPY --chown=app:app docker/trino/configure.sql /app/trino/ + +# Set up syncers and server ######################################################################## + +FROM base AS compile + +# Install Go + +ENV GOROOT /usr/local/go +ENV GOPATH /go +ENV PATH $GOPATH/bin:$GOROOT/bin:$PATH + +RUN \ + ARCH=$(dpkg --print-architecture) \ + && curl -L "https://go.dev/dl/go1.24.4.linux-$ARCH.tar.gz" -o go.tar.gz \ + && tar -C /usr/local -xzf go.tar.gz \ + && rm go.tar.gz \ + && mkdir -p "$GOPATH/src" "$GOPATH/bin" \ + && chmod -R 777 "$GOPATH" + +# Compile syncers and server + +COPY --chown=app:app src/syncer-common/go.mod src/syncer-common/go.sum /app/src/syncer-common/ +RUN cd /app/src/syncer-common && go mod download + +COPY --chown=app:app src/syncer-postgres/go.mod src/syncer-postgres/go.sum /app/src/syncer-postgres/ +RUN cd /app/src/syncer-postgres && go mod download + +COPY --chown=app:app src/syncer-amplitude/go.mod src/syncer-amplitude/go.sum /app/src/syncer-amplitude/ +RUN cd /app/src/syncer-amplitude && go mod download + +COPY --chown=app:app src/server/go.mod src/server/go.sum /app/src/server/ +RUN cd /app/src/server && go mod download + +COPY --chown=app:app src/syncer-common /app/src/syncer-common +COPY --chown=app:app src/syncer-postgres /app/src/syncer-postgres +COPY --chown=app:app src/syncer-amplitude /app/src/syncer-amplitude +COPY --chown=app:app src/server /app/src/server + +RUN ARCH=$(dpkg --print-architecture) \ + && cd /app/src/syncer-postgres && CGO_ENABLED=1 GOOS=linux GOARCH=$ARCH go build -o /app/bin/syncer-postgres \ + && cd /app/src/syncer-amplitude && CGO_ENABLED=1 GOOS=linux GOARCH=$ARCH go build -o /app/bin/syncer-amplitude \ + && cd /app/src/server && CGO_ENABLED=1 GOOS=linux GOARCH=$ARCH go build -o /app/bin/server + +# Prepare final image ############################################################################## + +FROM base AS final + +COPY --chown=app:app --from=compile /app/bin/syncer-postgres /app/bin/syncer-amplitude /app/bin/server /app/bin/ +COPY --chown=app:app docker/bin /app/bin/ -COPY --from=builder /app/bemidb /app/bemidb +USER app -ENTRYPOINT ["/app/bemidb"] +ENTRYPOINT ["/app/bin/run.sh"] diff --git a/Dockerfile.test b/Dockerfile.test new file mode 100644 index 0000000..f74c712 --- /dev/null +++ b/Dockerfile.test @@ -0,0 +1,113 @@ +ARG PLATFORM=linux/arm64 + +FROM --platform=$PLATFORM debian:12-slim AS base + +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + curl ca-certificates \ + postgresql-client \ + gcc g++ libc6-dev \ + && rm -rf /var/lib/apt/lists/* + +RUN adduser --disabled-login app + +WORKDIR /app + +# Install Java and Trino + +ENV JAVA_HOME /opt/jdk-24 +ENV PATH $JAVA_HOME/bin:$PATH + +RUN \ + ARCH=$(dpkg --print-architecture) && case "$ARCH" in \ + "amd64") \ + JDK_URL="https://download.oracle.com/java/24/archive/jdk-24.0.1_linux-x64_bin.tar.gz"; \ + ;; \ + "arm64") \ + JDK_URL="https://download.oracle.com/java/24/archive/jdk-24.0.1_linux-aarch64_bin.tar.gz"; \ + ;; \ + *) \ + echo "Unsupported architecture: $ARCH"; \ + exit 1; \ + ;; \ + esac \ + && curl -L "$JDK_URL" -o jdk.tar.gz \ + && tar -xzf jdk.tar.gz \ + && rm jdk.tar.gz \ + && mkdir -p /opt \ + && mv jdk-24.0.1 /opt/jdk-24 \ + \ + && curl -L https://repo1.maven.org/maven2/io/trino/trino-server/476/trino-server-476.tar.gz -o trino-server-476.tar.gz \ + && tar -xzf trino-server-476.tar.gz \ + && rm trino-server-476.tar.gz \ + && mv trino-server-476 /app/trino \ + && mkdir -p /data/trino \ + && chown -R "app:app" /app/trino /data/trino + +# Set up Trino + +HEALTHCHECK --interval=10s --timeout=5s --start-period=10s \ + CMD /app/trino/bin/health-check.sh + +COPY --chown=app:app docker/trino/etc /etc/trino +COPY --chown=app:app docker/trino/bin /app/trino/bin +COPY --chown=app:app docker/trino/configure.sql /app/trino/ + +# Set up syncers and server ######################################################################## + +FROM base AS test + +# Install Go, MinIO, and PostgreSQL + +ENV GOROOT /usr/local/go +ENV GOPATH /go +ENV PATH $GOPATH/bin:$GOROOT/bin:$PATH + +RUN \ + ARCH=$(dpkg --print-architecture) \ + \ + && curl -L "https://go.dev/dl/go1.24.4.linux-$ARCH.tar.gz" -o go.tar.gz \ + && tar -C /usr/local -xzf go.tar.gz \ + && rm go.tar.gz \ + && mkdir -p "$GOPATH/src" "$GOPATH/bin" \ + && chmod -R 777 "$GOPATH" \ + \ + && curl -L "https://dl.min.io/server/minio/release/linux-$ARCH/minio" -o /usr/local/bin/minio \ + && chmod +x /usr/local/bin/minio \ + && mkdir -p /data/minio \ + && chown -R "app:app" /data/minio \ + && curl -L "https://dl.min.io/client/mc/release/linux-$ARCH/mc" -o /usr/local/bin/mc \ + && chmod +x /usr/local/bin/mc \ + \ + && apt-get update \ + && apt-get install -y --no-install-recommends gnupg \ + && curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor -o /etc/apt/trusted.gpg.d/postgresql.gpg \ + && echo "deb http://apt.postgresql.org/pub/repos/apt bookworm-pgdg main" > /etc/apt/sources.list.d/pgdg.list \ + && apt-get update \ + && apt-get install -y --no-install-recommends postgresql-16 \ + && mkdir -p /var/lib/postgresql/data \ + && chown -R app:app /var/lib/postgresql/data \ + && chmod 700 /var/lib/postgresql/data \ + && mkdir -p /var/run/postgresql \ + && chown -R app:app /var/run/postgresql + +# Prepare syncers and server + +COPY --chown=app:app src/syncer-common/go.mod src/syncer-common/go.sum /app/src/syncer-common/ +RUN cd /app/src/syncer-common && go mod download + +COPY --chown=app:app src/syncer-postgres/go.mod src/syncer-postgres/go.sum /app/src/syncer-postgres/ +RUN cd /app/src/syncer-postgres && go mod download + +COPY --chown=app:app src/server/go.mod src/server/go.sum /app/src/server/ +RUN cd /app/src/server && go mod download + +COPY --chown=app:app src/syncer-common /app/src/syncer-common +COPY --chown=app:app src/syncer-postgres /app/src/syncer-postgres +COPY --chown=app:app src/server /app/src/server + +COPY --chown=app:app docker/bin docker/bin-test /app/bin/ + +USER app + +ENTRYPOINT ["/app/bin/test.sh"] diff --git a/Makefile b/Makefile index 63a934d..7d1a4bb 100644 --- a/Makefile +++ b/Makefile @@ -2,44 +2,55 @@ sh: devbox --env-file .env shell install: - devbox run "cd src && go mod tidy" + devbox run "cd src/syncer-common && go mod tidy && \ + cd ../syncer-postgres && go mod tidy && \ + cd ../syncer-amplitude && go mod tidy && \ + cd ../server && go mod tidy" -up: - devbox run --env-file .env "cd src && go run ." +lint: + devbox run "cd src/syncer-common && go fmt && staticcheck . && \ + cd ../syncer-postgres && go fmt && deadcode . && staticcheck . && \ + cd ../syncer-amplitude && go fmt && deadcode . && staticcheck . && \ + cd ../server && go fmt && deadcode . && staticcheck ." -.PHONY: build build: - rm -rf build/bemidb-* && \ - devbox run "./scripts/build-darwin.sh" && \ - ./scripts/build-linux.sh - -build-local: - rm -rf build/bemidb-* && \ - cd src && go build -o ../build/bemidb-darwin-arm64 + ./scripts/build-docker.sh publish: ./scripts/publish-docker.sh -sync: - devbox run --env-file .env "cd src && go run . sync" +build-local: + docker build --build-arg PLATFORM=linux/arm64 -t bemidb:local . + +server: build-local + docker run -it --rm --env-file .env -p 54321:54321 bemidb:local server + +syncer-postgres: build-local + docker run -it --rm --env-file .env -e DESTINATION_SCHEMA_NAME=postgres bemidb:local syncer-postgres -test: - devbox run "cd src && go test ./..." +syncer-amplitude: build-local + docker run -it --rm --env-file .env -e DESTINATION_SCHEMA_NAME=amplitude bemidb:local syncer-amplitude + +bash: + docker run -it --rm --env-file .env bemidb:local bash + +build-test: + docker build --build-arg PLATFORM=linux/arm64 -t bemidb:test -f Dockerfile.test . + +test: build-test + docker run -it --rm bemidb:test test-function: - devbox run "cd src && go test ./... -run $(FUNC)" + devbox run "cd src/server && go test ./... -run $(FUNC)" debug: - devbox run "cd src && dlv test github.com/BemiHQ/BemiDB" - -lint: - devbox run "cd src && go fmt && deadcode . && staticcheck ." + devbox run "cd src/server && dlv test github.com/BemiHQ/BemiDB" console: - devbox run "cd src && gore" + devbox run "cd src/server && gore" outdated: - devbox run "cd src && go list -u -m -f '{{if and .Update (not .Indirect)}}{{.}}{{end}}' all" + devbox run "cd src/server && go list -u -m -f '{{if and .Update (not .Indirect)}}{{.}}{{end}}' all" .PHONY: benchmark benchmark: diff --git a/README.md b/README.md index 5d61159..e2695d2 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,6 @@ # BemiDB -BemiDB is a Postgres read replica optimized for analytics. -It consists of a single binary that seamlessly connects to a Postgres database, replicates the data in a compressed columnar format, and allows you to run complex queries using its Postgres-compatible analytical query engine. +BemiDB is an open-source Snowflake and Fivetran alternative bundled together. It seamlessly connects to different data sources, syncs data in a compressed columnar format to S3, and allows you to run complex queries using its Postgres-compatible analytical query engine. ![BemiDB](/img/BemiDB.gif) @@ -10,177 +9,47 @@ It consists of a single binary that seamlessly connects to a Postgres database, - [Highlights](#highlights) - [Use cases](#use-cases) - [Quickstart](#quickstart) +- [Usage](#usage) - [Configuration](#configuration) - [Architecture](#architecture) - [Benchmark](#benchmark) - [Data type mapping](#data-type-mapping) -- [Alternatives](#alternatives) -- [Development](#development) +- [Roadmap](#roadmap) - [License](#license) ## Highlights -- **Performance**: runs analytical queries up to 2000x faster than Postgres. -- **Single Binary**: consists of a single binary that can be run on any machine. -- **Postgres Replication**: automatically syncs data from Postgres databases. -- **Compressed Data**: uses an open columnar format for tables with 4x compression. -- **Scalable Storage**: storage is separated from compute and supports a local disk or S3. -- **Query Engine**: leverages a query engine optimized for analytical workloads. -- **Postgres-Compatible**: integrates with services and tools in the Postgres ecosystem. +- **Query Engine**: leverages a analytical query engine that is 2000x faster than regular Postgres. +- **Scalable Storage**: stores data in columnar format in object storage separated from compute. +- **Built-In Connectors**: automatically syncs data from different data sources. +- **Compressed Data**: uses an open table format with 4x data compression. +- **Easy Deployment**: packaged in a single Docker image with stateless processes. +- **Postgres Compatibility**: integrates with services and tools in the Postgres ecosystem. - **Open-Source**: released under an OSI-approved license. ## Use cases -- **Run complex analytical queries like it's your Postgres database**. Without worrying about performance impact and indexing. -- **Simplify your data stack down to a single binary**. No complex setup, no data movement, no weird acronyms like CDC, ETL, DW. -- **Integrate with Postgres-compatible tools and services**. Querying and visualizing data with BI tools, notebooks, and ORMs. -- **Automatically centralize all data in a data lakehouse**. Using Iceberg tables with Parquet data files in object storage. -- **Continuously archive data from your Postgres database**. Keeping and querying historical data without affecting the main database. +- **Centralize data without complex pipelines**. No complex setup and no weird acronyms like CDC or ETL. +- **Integrate with Postgres tools and services**. Querying data with BI tools, notebooks, and ORMs. +- **Run complex analytical queries at high speed**. Without worrying about performance impact or indexing. +- **Continuously archive data from your database**. Offloading and querying historical data. ## Quickstart -Install BemiDB: +#### 1. Configure prerequisites for BemiDB: -```sh -curl -sSL https://raw.githubusercontent.com/BemiHQ/BemiDB/refs/heads/main/scripts/install.sh | bash -``` - -Sync data from a Postgres database: - -```sh -./bemidb --pg-database-url postgres://postgres:postgres@localhost:5432/dbname sync -``` - -Then run BemiDB database: - -```sh -./bemidb start -``` - -Run Postgres queries on top of the BemiDB database: - -```sh -# List all tables -psql postgres://localhost:54321/bemidb -c "SELECT table_schema, table_name FROM information_schema.tables" - -# Query a table -psql postgres://localhost:54321/bemidb -c "SELECT COUNT(*) FROM [table_name]" -``` - - -
-Running in a Docker container - -```sh -# Download the latest Docker image -docker pull ghcr.io/bemihq/bemidb:latest - -# Sync data from a Postgres database -docker run \ - -e PG_DATABASE_URL=postgres://postgres:postgres@host.docker.internal:5432/dbname \ - ghcr.io/bemihq/bemidb:latest sync - -# Start the BemiDB database -docker run ghcr.io/bemihq/bemidb:latest start -``` -
- - -
-Running in a Kubernetes cluster - -You can run 2 deployments in parallel, one for data syncing from a Postgres database and another for running the BemiDB database. - -In that case, you'd need to set up a shared volume or a shared S3 bucket between the two deployments for Iceberg data. -See the [Configuration](#configuration) section for more details. - -```yaml -apiVersion: apps/v1 -kind: Deployment -metadata: - name: bemidb-sync - namespace: default - labels: - app.kubernetes.io/name: bemidb-sync -spec: - replicas: 1 - template: - metadata: - labels: - app.kubernetes.io/name: bemidb-sync - spec: - containers: - - name: bemidb - image: ghcr.io/bemihq/bemidb:latest - command: ["sync"] - env: - - name: PG_DATABASE_URL - value: "postgres://postgres:postgres@postgres-host:5432/dbname" - - name: PG_SYNC_INTERVAL - value: "1h" - ... -``` - -```yaml -apiVersion: apps/v1 -kind: Deployment -metadata: - name: bemidb-start - namespace: default - labels: - app.kubernetes.io/name: bemidb-start -spec: - replicas: 1 - template: - metadata: - labels: - app.kubernetes.io/name: bemidb-start - spec: - containers: - - name: bemidb - image: ghcr.io/bemihq/bemidb:latest - command: ["start"] - ... -``` - -
- -## Configuration - -### Storage configuration - -#### Local disk storage + - Set up a Postgres database as a data catalog for files stored in object storage: -By default, BemiDB stores data on the local disk. -Here is an example of running BemiDB with default settings and storing data in a local `iceberg` directory: - -```sh -./bemidb \ - --storage-type LOCAL \ - --storage-path ./iceberg \ # Data stored in ./iceberg/* - start +```sql +CREATE USER catalog_user LOGIN PASSWORD 'password'; +CREATE DATABASE catalog OWNER catalog_user; ``` -#### S3 block storage - -BemiDB natively supports S3 storage. You can specify the S3 settings using the following flags: - -```sh -./bemidb \ - --storage-type S3 \ - --storage-path iceberg \ # Data stored in s3://[AWS_S3_BUCKET]/iceberg/* - --aws-region [AWS_REGION] \ - --aws-s3-bucket [AWS_S3_BUCKET] \ - --aws-access-key-id [AWS_ACCESS_KEY_ID] \ - --aws-secret-access-key [AWS_SECRET_ACCESS_KEY] \ - start -``` + - Create an S3 bucket and IAM user credentials with access to the bucket.
-AWS IAM policy example - -Here is the minimal IAM policy required for BemiDB to work with S3: +See AWS IAM policy example ```json { @@ -205,221 +74,184 @@ Here is the minimal IAM policy required for BemiDB to work with S3: ```
- -
-MinIO object storage example - -BemiDB can work with various S3-compatible object storage solutions, such as MinIO. - -1. You can run MinIO locally: + - Export the environment variables: ```sh -minio server ./minio-data -# API: http://192.168.68.102:9000 http://127.0.0.1:9000 -# RootUser: minioadmin -# RootPass: minioadmin -# WebUI: http://192.168.68.102:65218 http://127.0.0.1:65218 -# RootUser: minioadmin -# RootPass: minioadmin +# Configured catalog database URL (host.docker.internal allows connecting to localhost from a container) +export CATALOG_DATABASE_URL=postgres://catalog_user:password@host.docker.internal:5432/catalog + +# AWS S3 environment variables (data will be stored in s3://bemidb-bucket/iceberg/*) +export AWS_REGION=us-west-1 +export AWS_S3_BUCKET=bemidb-bucket +export AWS_ACCESS_KEY_ID=[...] +export AWS_SECRET_ACCESS_KEY=[...] ``` -2. Open the MinIO WebUI and create a bucket, for example, `bemidb-bucket`. - -3. Run BemiDB with the following command: +#### 2. Sync data from a source Postgres database: ```sh -./bemidb \ - --storage-type S3 \ - --storage-path iceberg \ - --aws-s3-bucket bemidb-bucket \ - --aws-s3-endpoint 127.0.0.1:9000 \ - --aws-region us-east-1 \ - --aws-access-key-id minioadmin \ - --aws-secret-access-key minioadmin \ - sync +docker run \ + -e SOURCE_POSTGRES_DATABASE_URL=postgres://user:password@host.docker.internal:5432/source \ + -e DESTINATION_SCHEMA_NAME=postgres \ + -e AWS_REGION -e AWS_S3_BUCKET -e AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY -e CATALOG_DATABASE_URL \ + ghcr.io/bemihq/bemidb:latest syncer-postgres ``` -
- -### Syncing configuration - -#### Periodic data syncing - -To sync data periodically from a Postgres database: +#### 3. Start the BemiDB database server: ```sh -./bemidb \ - --pg-sync-interval 1h \ # Supported units: h, m, s - --pg-database-url postgres://postgres:postgres@localhost:5432/dbname \ - sync +docker run \ + -p 54321:54321 \ + -e AWS_REGION -e AWS_S3_BUCKET -e AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY -e CATALOG_DATABASE_URL \ + ghcr.io/bemihq/bemidb:latest server ``` -To check when a table was last synced, you can use the `bemidb_last_synced_at` function. For example: +#### 4. Query BemiDB with with a Postgres client: ```sh -# Check when a table was last synced -psql postgres://localhost:54321/bemidb -c \ - "SELECT bemidb_last_synced_at('public.users')" +# List all tables +psql postgres://localhost:54321/bemidb -c "SELECT table_schema, table_name FROM information_schema.tables" -# Check how long ago a table was last synced -psql postgres://localhost:54321/bemidb -c \ - "SELECT ROUND(EXTRACT(EPOCH FROM age(bemidb_last_synced_at('public.users'))) / 60) AS synced_minutes_ago" +# Query a table +psql postgres://localhost:54321/bemidb -c "SELECT COUNT(*) FROM postgres.[table_name]" ``` -#### Selective table syncing +## Usage + +#### Syncing from Postgres By default, BemiDB syncs all tables from the Postgres database. To include and sync only specific tables from your Postgres database: ```sh -./bemidb \ - --pg-include-tables public.billing_*,public.users \ # A comma-separated list of tables to include, supports wildcards (*) - --pg-database-url postgres://postgres:postgres@localhost:5432/dbname \ - sync +docker run \ + -e SOURCE_POSTGRES_DATABASE_URL=postgres://user:password@host.docker.internal:5432/source \ + -e SOURCE_POSTGRES_INCLUDE_TABLES=public.table1,public.table2 \ # A comma-separated list of tables to include + -e DESTINATION_SCHEMA_NAME=postgres \ + -e AWS_REGION -e AWS_S3_BUCKET -e AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY -e CATALOG_DATABASE_URL \ + ghcr.io/bemihq/bemidb:latest syncer-postgres ``` -To exclude specific tables during the sync: +To include all tables from a specific schema: ```sh -./bemidb \ - --pg-exclude-tables public.*_logs,public.cache \ # A comma-separated list of tables to exclude, supports wildcards (*) - --pg-database-url postgres://postgres:postgres@localhost:5432/dbname \ - sync +docker run \ + -e SOURCE_POSTGRES_DATABASE_URL=postgres://user:password@host.docker.internal:5432/source \ + -e SOURCE_POSTGRES_INCLUDE_SCHEMAS=public \ # A comma-separated list of schemas to include + -e DESTINATION_SCHEMA_NAME=postgres \ + -e AWS_REGION -e AWS_S3_BUCKET -e AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY -e CATALOG_DATABASE_URL \ + ghcr.io/bemihq/bemidb:latest syncer-postgres ``` -Note: if a table matches both `--pg-include-tables` and `--pg-exclude-tables`, it will be excluded. - -For example, to include all tables in the `public` schema except for the `public.cache` table: +To exclude specific tables during the sync: ```sh -./bemidb \ - --pg-include-tables public.* \ # Include all tables in the public schema - --pg-exclude-tables public.cache \ # Except for the public.cache table - --pg-database-url postgres://postgres:postgres@localhost:5432/dbname \ - sync +docker run \ + -e SOURCE_POSTGRES_DATABASE_URL=postgres://user:password@host.docker.internal:5432/source \ + -e SOURCE_POSTGRES_EXCLUDE_TABLES=public.audit_log,public.cache \ # A comma-separated list of tables to exclude + -e DESTINATION_SCHEMA_NAME=postgres \ + -e AWS_REGION -e AWS_S3_BUCKET -e AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY -e CATALOG_DATABASE_URL \ + ghcr.io/bemihq/bemidb:latest syncer-postgres ``` -#### Incremental data syncing - -By default, BemiDB performs a full refresh of the table data during each sync. -For large tables, you can enable incremental syncing to only refresh the rows that have been inserted or updated since the last sync: +#### Syncing from Amplitude ```sh -./bemidb \ - --pg-include-tables * \ # Sync all tables with a full refresh - --pg-incrementally-refreshed-tables public.transactions \ # Refresh only the public.transactions table incrementally - --pg-database-url postgres://postgres:postgres@localhost:5432/dbname \ - sync +docker run \ + -e SOURCE_AMPLITUDE_API_KEY=[...] \ + -e SOURCE_AMPLITUDE_SECRET_KEY=[...] \ + -e SOURCE_AMPLITUDE_START_DATE=2025-01-01 \ + -e DESTINATION_SCHEMA_NAME=amplitude \ + -e AWS_REGION -e AWS_S3_BUCKET -e AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY -e CATALOG_DATABASE_URL \ + ghcr.io/bemihq/bemidb:latest syncer-amplitude ``` -Note: incremental refresh is currently limited to INSERT/UPDATE-modified tables and doesn't detect DELETEd rows. -I.e., in BemiDB, these tables become append-only. +#### Customizing S3 endpoint -#### Sharded data syncing +BemiDB can work with various S3-compatible object storage solutions, such as MinIO. -BemiDB allows running multiple sync processes independently, each responsible its own set of tables ("shards") from the same Postgres database: +You can run MinIO locally: ```sh -./bemidb \ - --pg-include-tables public.table1,public.table2 \ - --pg-preserve-unsynced \ # Don't delete the existing tables in BemiDB that are not part of this sync (public.table3 and public.table4) - --pg-database-url postgres://postgres:postgres@localhost:5432/dbname \ - sync - -./bemidb \ - --pg-include-tables public.table3,public.table4 \ - --pg-preserve-unsynced \ # Don't delete the existing tables in BemiDB that are not part of this sync (public.table1 and public.table2) - --pg-database-url postgres://postgres:postgres@localhost:5432/dbname \ - sync +minio server ./minio-data +# API: http://172.17.0.3:9000 http://127.0.0.1:9000 +# WebUI: http://172.17.0.3:9001 http://127.0.0.1:9001 ``` -#### Syncing from multiple Postgres databases - -BemiDB supports syncing data from multiple Postgres databases into the same BemiDB database by allowing prefixing schemas. - -For example, if two Postgres databases `db1` and `db2` contain `public` schemas, you can prefix them as follows: +Create a bucket named `bemidb-bucket` in MinIO: ```sh -./bemidb \ - --pg-schema-prefix db1_ \ # Prefix all db1 database schemas with db1_ - --pg-preserve-unsynced \ # Don't delete db2 schemas in BemiDB - --pg-database-url postgres://postgres:postgres@localhost:5432/db1 \ - sync - -./bemidb \ - --pg-schema-prefix db2_ \ # Prefix all db2 database schemas with db2_ - --pg-preserve-unsynced \ # Don't delete db1 schemas in BemiDB - --pg-database-url postgres://postgres:postgres@localhost:5432/db2 \ - sync +mc alias set local http://localhost:9000 minioadmin minioadmin123 +mc mb local/bemidb-bucket --ignore-existing ``` -Then you can query and join tables from both Postgres databases in the same BemiDB database: +Export and use environment variables when starting BemiDB: ```sh -./bemidb start - -psql postgres://localhost:54321/bemidb -c \ - "SELECT * FROM db1_public.[TABLE] JOIN db2_public.[TABLE] ON ..." +export AWS_REGION=us-west-1 +export AWS_S3_BUCKET=bemidb-bucket +export AWS_ACCESS_KEY_ID=minioadmin +export AWS_SECRET_ACCESS_KEY=minioadmin123 +export AWS_S3_ENDPOINT=http://localhost:9000 ``` -### Configuration options - -#### `sync` command options - -| CLI argument | Environment variable | Default value | Description | -|---------------------------------------|-------------------------------------|---------------|----------------------------------------------------------------------------------------------------------------------------------------------------------| -| `--pg-database-url` | `PG_DATABASE_URL` | Required | PostgreSQL database URL to sync | -| `--pg-sync-interval` | `PG_SYNC_INTERVAL` | | Interval between syncs. Valid units: `h`, `m`, `s` | -| `--pg-exclude-tables` | `PG_EXCLUDE_TABLES` | | List of tables to exclude from sync. Comma-separated `schema.table`. May contain wildcards (`*`) | -| `--pg-include-tables` | `PG_INCLUDE_TABLES` | | List of tables to include in sync. Comma-separated `schema.table`. May contain wildcards (`*`) | -| `--pg-incrementally-refreshed-tables` | `PG_INCREMENTALLY_REFRESHED_TABLES` | | List of tables to refresh incrementally, currently limited to INSERT/UPDATE-modified tables. Comma-separated `schema.table`. May contain wildcards (`*`) | -| `--pg-schema-prefix` | `PG_SCHEMA_PREFIX` | | Prefix for PostgreSQL schema names | -| `--pg-preserve-unsynced` | `PG_PRESERVE_UNSYNCED` | `false` | Do not delete the existing tables in BemiDB that are not part of the sync | - -#### `start` command options - -| CLI argument | Environment variable | Default value | Description | -|---------------|----------------------|---------------|----------------------------------------| -| `--host` | `BEMIDB_HOST` | `127.0.0.1` | Host for BemiDB to listen on | -| `--port` | `BEMIDB_PORT` | `54321` | Port for BemiDB to listen on | -| `--database` | `BEMIDB_DATABASE` | `bemidb` | Database name | -| `--user` | `BEMIDB_USER` | | Database user. Allows any if empty | -| `--password` | `BEMIDB_PASSWORD` | | Database password. Allows any if empty | - -#### Storage options - -| CLI argument | Environment variable | Default value | Description | -|---------------------------|-------------------------|---------------------------------|----------------------------------------------------------------------------------------------------------| -| `--storage-type` | `BEMIDB_STORAGE_TYPE` | `LOCAL` | Storage type: `LOCAL` or `S3` | -| `--storage-path` | `BEMIDB_STORAGE_PATH` | `iceberg` | Path to the storage folder | -| `--aws-s3-endpoint` | `AWS_S3_ENDPOINT` | `s3.amazonaws.com` | AWS S3 endpoint | -| `--aws-region` | `AWS_REGION` | Required with `S3` storage type | AWS region | -| `--aws-s3-bucket` | `AWS_S3_BUCKET` | Required with `S3` storage type | AWS S3 bucket name | -| `--aws-access-key-id` | `AWS_ACCESS_KEY_ID` | | AWS access key ID. If empty, tries to fetch AWS SDK credentials in this order: config file, STS, SSO | -| `--aws-secret-access-key` | `AWS_SECRET_ACCESS_KEY` | | AWS secret access key. If empty, tries to fetch AWS SDK credentials in this order: config file, STS, SSO | - -#### Other options - -| CLI argument | Environment variable | Default value | Description | -|--------------------------------|--------------------------------------|---------------|-------------------------------------------------------------------------| -| `--log-level` | `BEMIDB_LOG_LEVEL` | `INFO` | Log level: `ERROR`, `WARN`, `INFO`, `DEBUG`, `TRACE` | -| `--disable-anonymous-analytics`| `BEMIDB_DISABLE_ANONYMOUS_ANALYTICS` | `false` | Disable collection of anonymous usage metadata (OS type, database host) | +## Configuration -Note: CLI arguments take precedence over environment variables. I.e. you can override the environment variables with CLI arguments. +#### `syncer-postgres` command options + +| Environment variable | Default value | Description | +|-------------------------------------|---------------|----------------------------------------------------------------------| +| `DESTINATION_SCHEMA_NAME` | Required | Schema name in BemiDB to sync data to. | +| `SOURCE_POSTGRES_DATABASE_URL` | Required | Postgres database URL to sync data from. | +| `SOURCE_POSTGRES_INCLUDE_SCHEMAS` | | List of schemas to include in sync. Comma-separated `schema.table`. | +| `SOURCE_POSTGRES_INCLUDE_TABLES` | | List of tables to include in sync. Comma-separated `schema.table`. | +| `SOURCE_POSTGRES_EXCLUDE_TABLES` | | List of tables to exclude from sync. Comma-separated `schema.table`. | + +#### `syncer-amplitude` command options + +| Environment variable | Default value | Description | +|-------------------------------|---------------|--------------------------------------------------------------------| +| `DESTINATION_SCHEMA_NAME` | Required | Schema name in BemiDB to sync data to. | +| `SOURCE_AMPLITUDE_API_KEY` | Required | Amplitude API key for authentication. | +| `SOURCE_AMPLITUDE_SECRET_KEY` | Required | Amplitude secret key for authentication. | +| `SOURCE_AMPLITUDE_START_DATE` | `2025-01-01` | Start date for syncing data from Amplitude in `YYYY-MM-DD` format. | + +#### `server` command options + +| Environment variable | Default value | Description | +|----------------------|---------------|----------------------------------------| +| `BEMIDB_HOST` | `0.0.0.0` | Host for BemiDB to listen on | +| `BEMIDB_PORT` | `54321` | Port for BemiDB to listen on | +| `BEMIDB_DATABASE` | `bemidb` | Database name | +| `BEMIDB_USER` | | Database user. Allows any if empty | +| `BEMIDB_PASSWORD` | | Database password. Allows any if empty | + +#### Common options + +| Environment variable | Default value | Description | +|--------------------------------------|--------------------|------------------------------------------------------| +| `CATALOG_DATABASE_URL` | Required | Postgres database URL for the catalog | +| `AWS_REGION` | Required | AWS region | +| `AWS_S3_BUCKET` | Required | AWS S3 bucket name | +| `AWS_ACCESS_KEY_ID` | Required | AWS access key ID | +| `AWS_SECRET_ACCESS_KEY` | Required | AWS secret access key | +| `AWS_S3_ENDPOINT` | `s3.amazonaws.com` | Custom S3 endpoint URL | +| `BEMIDB_LOG_LEVEL` | `INFO` | Log level: `ERROR`, `WARN`, `INFO`, `DEBUG`, `TRACE` | +| `BEMIDB_DISABLE_ANONYMOUS_ANALYTICS` | `false` | Disable collection of anonymous usage metadata | ## Architecture -BemiDB consists of the following main components: +BemiDB consists of the following main components packaged in a single Docker image: - **Database Server**: implements the [Postgres protocol](https://www.postgresql.org/docs/current/protocol.html) to enable Postgres compatibility. - **Query Engine**: embeds the [DuckDB](https://duckdb.org/) query engine to run analytical queries. -- **Storage Layer**: uses the [Iceberg](https://iceberg.apache.org/) table format to store data in columnar compressed Parquet files. -- **Postgres Connector**: connects to a Postgres databases to sync tables' schema and data. +- **Storage Layer**: uses the [Iceberg](https://iceberg.apache.org/) open table format to store data in columnar compressed Parquet files. +- **Data Syncers**: to connect to different data sources and sync data to the storage layer. Architecture ## Benchmark -BemiDB is optimized for analytical workloads and can run complex queries up to 2000x faster than Postgres. +BemiDB is optimized for analytical workloads and can run complex queries up to 2000x faster than regular Postgres. On the TPC-H benchmark with 22 sequential queries, BemiDB outperforms Postgres by a significant margin: @@ -438,29 +270,28 @@ See the [benchmark](/benchmark) directory for more details. Primitive data types are mapped as follows: -| PostgreSQL | Parquet | Iceberg | -|-------------------------------------------------------------|---------------------------------------------------|----------------------------------| -| `bool` | `BOOLEAN` | `boolean` | -| `varchar`, `text`, `bpchar`, `bit` | `BYTE_ARRAY` (`UTF8`) | `string` | -| `int2`, `int4` | `INT32` | `int` | -| `int8` | `INT64` | `long` | -| `xid` | `INT32` (`UINT_32`) | `int` | -| `xid8` | `INT64` (`UINT_64`) | `long` | -| `float4`, `float8` | `FLOAT` | `float` | -| `numeric` | `FIXED_LEN_BYTE_ARRAY` (`DECIMAL`) | `decimal(P, S)` | -| `date` | `INT32` (`DATE`) | `date` | -| `time`, `timetz` | `INT64` (`TIME_MICROS` / `TIME_MILLIS`) | `time` | -| `timestamp` | `INT64` (`TIMESTAMP_MICROS` / `TIMESTAMP_MILLIS`) | `timestamp` / `timestamp_ns` | -| `timestamptz` | `INT64` (`TIMESTAMP_MICROS` / `TIMESTAMP_MILLIS`) | `timestamptz` / `timestamptz_ns` | -| `uuid` | `BYTE_ARRAY` (`UTF8`) | `uuid` | -| `bytea` | `BYTE_ARRAY` (`UTF8`) | `binary` | -| `interval` | `BYTE_ARRAY` (`UTF8`) | `string` | -| `point`, `line`, `lseg`, `box`, `path`, `polygon`, `circle` | `BYTE_ARRAY` (`UTF8`) | `string` | -| `cidr`, `inet`, `macaddr`, `macaddr8` | `BYTE_ARRAY` (`UTF8`) | `string` | -| `tsvector`, `xml`, `pg_snapshot` | `BYTE_ARRAY` (`UTF8`) | `string` | -| `json`, `jsonb` | `BYTE_ARRAY` (`UTF8`) | `string` (JSON logical type) | -| `_*` (array) | `LIST` `*` | `list` | -| `*` (user-defined type) | `BYTE_ARRAY` (`UTF8`) | `string` | +| PostgreSQL | Parquet | Iceberg | +|-------------------------------------------------------------|-----------------------------------------------------------------|----------------------------------| +| `bool` | `BOOLEAN` | `boolean` | +| `varchar`, `text`, `bpchar` | `BYTE_ARRAY` (`STRING` / `UTF8`) | `string` | +| `bit`, `int2`, `int4` | `INT32` | `int` | +| `int8`, `xid8` | `FIXED_LEN_BYTE_ARRAY(9)` (`DECIMAL(20, 0)` / `DECIMAL(20, 0)`) | `decimal(20, 0)` | +| `xid` | `INT64` | `long` | +| `float4` | `FLOAT` | `float` | +| `float8` | `DOUBLE` | `double` | +| `numeric` | `FIXED_LEN_BYTE_ARRAY(16)` (`DECIMAL(P, S)` / `DECIMAL(P, S)`) | `decimal(P, S)` | +| `date` | `INT32` (`DATE` / `DATE`) | `date` | +| `time`, `timetz` | `INT64` (`TIME_MICROS`) | `time` | +| `timestamp` | `INT64` (`TIMESTAMP_MICROS`) | `timestamp` | +| `timestamptz` | `INT64` (`TIMESTAMP_MICROS`) | `timestamptz` | +| `bytea` | `BYTE_ARRAY` | `binary` | +| `uuid`, `interval` | `BYTE_ARRAY` (`STRING` / `UTF8`) | `string` | +| `point`, `line`, `lseg`, `box`, `path`, `polygon`, `circle` | `BYTE_ARRAY` (`STRING` / `UTF8`) | `string` | +| `cidr`, `inet`, `macaddr`, `macaddr8` | `BYTE_ARRAY` (`STRING` / `UTF8`) | `string` | +| `tsvector`, `xml`, `pg_snapshot` | `BYTE_ARRAY` (`STRING` / `UTF8`) | `string` | +| `json`, `jsonb` | `BYTE_ARRAY` (`STRING` / `UTF8`) | `string` (JSON logical type) | +| `_*` (array) | `LIST` `*` | `list` | +| `*` (user-defined type) | `BYTE_ARRAY` (`STRING` / `UTF8`) | `string` | Note that Postgres `json` and `jsonb` types are implemented as JSON logical types and stored as strings (Parquet and Iceberg don't support unstructured data types). You can query JSON columns using standard operators, for example: @@ -469,122 +300,28 @@ You can query JSON columns using standard operators, for example: SELECT * FROM [TABLE] WHERE [JSON_COLUMN]->>'[JSON_KEY]' = '[JSON_VALUE]'; ``` -## Alternatives - -#### BemiDB vs PostgreSQL - -PostgreSQL pros: - -- It is the most loved general-purpose transactional (OLTP) database 💛 -- Capable of running analytical queries at small scale - -PostgreSQL cons: - -- Slow for analytical (OLAP) queries on medium and large datasets -- Requires creating indexes for specific analytical queries, which impacts the "write" performance for transactional queries -- Materialized views as a "cache" require manual maintenance and become increasingly slow to refresh as the data grows -- Further tuning may not be possible if executing various ad-hoc analytical queries - -#### BemiDB vs PostgreSQL extensions - -PostgreSQL extensions pros: - -- There is a wide range of extensions available in the PostgreSQL ecosystem -- Open-source community driven - -PostgreSQL extensions cons: - -- Performance overhead when running analytical queries affecting transactional queries -- Limited support for installable extensions in managed PostgreSQL services (for example, AWS Aurora [allowlist](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraPostgreSQLReleaseNotes/AuroraPostgreSQL.Extensions.html#AuroraPostgreSQL.Extensions.16)) -- Increased PostgreSQL maintenance complexity when upgrading versions -- Require manual data syncing and schema mapping if data is stored in a different format - -Main types of extensions for analytics: - -- Foreign data wrapper extensions (parquet_fdw, parquet_s3_fdw, etc.) - - Pros: allow querying external data sources like columnar Parquet files directly from PostgreSQL - - Cons: use not optimized for analytics query engines -- OLAP query engine extensions (pg_duckdb, pg_analytics, etc.) - - Pros: integrate an analytical query engine directly into PostgreSQL - - Cons: cumbersome to use (creating foreign tables, calling custom functions), data layer is not integrated and optimized - -#### BemiDB vs DuckDB - -DuckDB pros: - -- Designed for OLAP use cases -- Easy to run with a single binary - -DuckDB cons: - -- Limited support in the data ecosystem like notebooks, BI tools, etc. -- Requires manual data syncing and schema mapping for best performance -- Limited features compared to a full-fledged database: no support for writing into Iceberg tables, reading from Iceberg according to the spec, etc. - -#### BemiDB vs real-time OLAP databases (ClickHouse, Druid, etc.) - -Real-time OLAP databases pros: - -- High-performance optimized for real-time analytics - -Real-time OLAP databases cons: - -- Require expertise to set up and manage distributed systems -- Limitations on data mutability -- Steeper learning curve -- Require manual data syncing and schema mapping - -#### BemiDB vs big data query engines (Spark, Trino, etc.) - -Big data query engines pros: - -- Distributed SQL query engines for big data analytics - -Big data query engines cons: - -- Complex to set up and manage a distributed query engine (ZooKeeper, JVM, etc.) -- Don't have a storage layer themselves -- Require manual data syncing and schema mapping - -#### BemiDB vs proprietary solutions (Snowflake, Redshift, BigQuery, Databricks, etc.) - -Proprietary solutions pros: - -- Fully managed cloud data warehouses and lakehouses optimized for OLAP - -Proprietary solutions cons: - -- Can be expensive compared to other alternatives -- Vendor lock-in and limited control over the data -- Require separate systems for data syncing and schema mapping - ---- - -For a more detailed comparison of different approaches to running analytics with PostgreSQL, check out our [blog post](https://blog.bemi.io/analytics-with-postgresql/). - -## Development - -We develop BemiDB using [Devbox](https://www.jetify.com/devbox) to ensure a consistent development environment without relying on Docker. - -To start developing BemiDB and run tests, follow these steps: - -```sh -cp .env.sample .env -make install -make test -``` - -To run BemiDB locally, use the following command: - -```sh -make up -``` - -To sync data from a Postgres database, use the following command: - -```sh -make sync -``` +## Roadmap + +- [x] Postgres protocol and query support +- [x] Iceberg write operations +- [x] Selective data syncing from Postgres +- [x] Postgres compatibility with other tools + - [x] psql + - [x] Metabase + - [x] TablePlus + - [x] DBeaver + - [x] pgAdmin +- [x] Data syncing from other sources + - [x] Amplitude (incremental) + - [x] Postgres (full-refresh) + - [ ] HubSpot + - [ ] Stripe + - [ ] Google Sheets + - [ ] MySQL +- [x] Iceberg tables compaction +- [x] Packaging in a Docker image +- [ ] Table compaction without Trino as a dependency (WIP) +- [ ] Real-time CDC data syncing (private beta) ## License diff --git a/build/.gitkeep b/build/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/devbox.json b/devbox.json index c7ba719..fdd18df 100644 --- a/devbox.json +++ b/devbox.json @@ -1,9 +1,8 @@ { "$schema": "https://raw.githubusercontent.com/jetify-com/devbox/0.13.1/.schema/devbox.schema.json", "packages": [ - "go@latest", - "postgresql@latest", - "gcc@latest" + "go@1.24.4", + "postgresql@latest" ], "shell": { "init_hook": [], diff --git a/devbox.lock b/devbox.lock index 4275b73..31d7b11 100644 --- a/devbox.lock +++ b/devbox.lock @@ -1,138 +1,55 @@ { "lockfile_version": "1", "packages": { - "gcc@latest": { - "last_modified": "2025-02-07T11:26:36Z", - "resolved": "github:NixOS/nixpkgs/d98abf5cf5914e5e4e9d57205e3af55ca90ffc1d#gcc", - "source": "devbox-search", - "version": "14-20241116", - "systems": { - "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/3k1dfk03xkmaf6cksgpk492k3m8brvmp-gcc-wrapper-14-20241116", - "default": true - }, - { - "name": "man", - "path": "/nix/store/cf67mihrjf3a1w4sw8jkgw49kfi54wpq-gcc-wrapper-14-20241116-man", - "default": true - }, - { - "name": "info", - "path": "/nix/store/jgsywypzhdim8s6x25cnr31ygm28lhin-gcc-wrapper-14-20241116-info" - } - ], - "store_path": "/nix/store/3k1dfk03xkmaf6cksgpk492k3m8brvmp-gcc-wrapper-14-20241116" - }, - "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/pavcqvq7ycdbpal1mfjsscvgngzsg9sp-gcc-wrapper-14-20241116", - "default": true - }, - { - "name": "man", - "path": "/nix/store/srwbca27wpylwzaqz9ssbhlkx910ryv1-gcc-wrapper-14-20241116-man", - "default": true - }, - { - "name": "info", - "path": "/nix/store/yrdz1bra65cc9i2n2ghsz98g4fx2jra3-gcc-wrapper-14-20241116-info" - } - ], - "store_path": "/nix/store/pavcqvq7ycdbpal1mfjsscvgngzsg9sp-gcc-wrapper-14-20241116" - }, - "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/g2462k2svl4zn5q7yypqirp6xxq0s9aq-gcc-wrapper-14-20241116", - "default": true - }, - { - "name": "man", - "path": "/nix/store/s0vndfpg8gsz40wmf3v11csk3n497kqm-gcc-wrapper-14-20241116-man", - "default": true - }, - { - "name": "info", - "path": "/nix/store/3x75ibh7rj95vm09q38iqj8l5jwbrarl-gcc-wrapper-14-20241116-info" - } - ], - "store_path": "/nix/store/g2462k2svl4zn5q7yypqirp6xxq0s9aq-gcc-wrapper-14-20241116" - }, - "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/4ijy8jbsiqmj37avrk83gn2m903486mr-gcc-wrapper-14-20241116", - "default": true - }, - { - "name": "man", - "path": "/nix/store/vyax7fpbw688qwx32c1i8n1f5jbjkcii-gcc-wrapper-14-20241116-man", - "default": true - }, - { - "name": "info", - "path": "/nix/store/m4641rrm7dw80bn23ab0812pm6aj6402-gcc-wrapper-14-20241116-info" - } - ], - "store_path": "/nix/store/4ijy8jbsiqmj37avrk83gn2m903486mr-gcc-wrapper-14-20241116" - } - } - }, "github:NixOS/nixpkgs/nixpkgs-unstable": { - "resolved": "github:NixOS/nixpkgs/d9b69c3ec2a2e2e971c534065bdd53374bd68b97?lastModified=1740396192&narHash=sha256-ATMHHrg3sG1KgpQA5x8I%2BzcYpp5Sf17FaFj%2FfN%2B8OoQ%3D" + "last_modified": "2025-07-19T04:40:28Z", + "resolved": "github:NixOS/nixpkgs/6b4955211758ba47fac850c040a27f23b9b4008f?lastModified=1752900028&narHash=sha256-dPALCtmik9Wr14MGqVXm%2BOQcv7vhPBXcWNIOThGnB%2FQ%3D" }, - "go@latest": { - "last_modified": "2025-05-16T20:19:48Z", - "resolved": "github:NixOS/nixpkgs/12a55407652e04dcf2309436eb06fef0d3713ef3#go", + "go@1.24.4": { + "last_modified": "2025-07-13T22:45:35Z", + "resolved": "github:NixOS/nixpkgs/a421ac6595024edcfbb1ef950a3712b89161c359#go", "source": "devbox-search", - "version": "1.24.3", + "version": "1.24.4", "systems": { "aarch64-darwin": { "outputs": [ { "name": "out", - "path": "/nix/store/ps3admpzmc1ryvn9q7sw5xfd94dkrb3f-go-1.24.3", + "path": "/nix/store/f4a0g1p943l61wfvqnpdr73v9bsyfhf2-go-1.24.4", "default": true } ], - "store_path": "/nix/store/ps3admpzmc1ryvn9q7sw5xfd94dkrb3f-go-1.24.3" + "store_path": "/nix/store/f4a0g1p943l61wfvqnpdr73v9bsyfhf2-go-1.24.4" }, "aarch64-linux": { "outputs": [ { "name": "out", - "path": "/nix/store/45bnqhyyq40p91k3cjw0farx3hn1swx6-go-1.24.3", + "path": "/nix/store/mdyik6amglpjs533vk927f9w1qmyw239-go-1.24.4", "default": true } ], - "store_path": "/nix/store/45bnqhyyq40p91k3cjw0farx3hn1swx6-go-1.24.3" + "store_path": "/nix/store/mdyik6amglpjs533vk927f9w1qmyw239-go-1.24.4" }, "x86_64-darwin": { "outputs": [ { "name": "out", - "path": "/nix/store/9z2kb6hxij7pqi0fgcn9ijhpb7ajpazs-go-1.24.3", + "path": "/nix/store/b56ngr9p7x6z368w8m7ps95r3x8gdfv7-go-1.24.4", "default": true } ], - "store_path": "/nix/store/9z2kb6hxij7pqi0fgcn9ijhpb7ajpazs-go-1.24.3" + "store_path": "/nix/store/b56ngr9p7x6z368w8m7ps95r3x8gdfv7-go-1.24.4" }, "x86_64-linux": { "outputs": [ { "name": "out", - "path": "/nix/store/5xvi25nqmbrg58aixp4zgczilfnp7pwg-go-1.24.3", + "path": "/nix/store/xrzqlk92h7z5mz9mlc4a9dyy91n5b68i-go-1.24.4", "default": true } ], - "store_path": "/nix/store/5xvi25nqmbrg58aixp4zgczilfnp7pwg-go-1.24.3" + "store_path": "/nix/store/xrzqlk92h7z5mz9mlc4a9dyy91n5b68i-go-1.24.4" } } }, diff --git a/docker/bin-test/minio_configure.sh b/docker/bin-test/minio_configure.sh new file mode 100755 index 0000000..dbc25d6 --- /dev/null +++ b/docker/bin-test/minio_configure.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +set -euo pipefail + +echo "[MinIO] Waiting for server to be ready..." +until curl -f http://localhost:9000/minio/health/live 2>/dev/null; do + echo "MinIO not ready yet, waiting..." + sleep 2 +done +echo "[MinIO] Ready" + +echo "[MinIO] Creating $AWS_S3_BUCKET bucket..." +mc alias set local http://localhost:9000 minioadmin minioadmin123 +mc mb local/$AWS_S3_BUCKET --ignore-existing diff --git a/docker/bin-test/minio_start.sh b/docker/bin-test/minio_start.sh new file mode 100755 index 0000000..e40792c --- /dev/null +++ b/docker/bin-test/minio_start.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +set -euo pipefail + +echo "[MinIO] Starting..." +MINIO_ROOT_USER=minioadmin \ + MINIO_ROOT_PASSWORD=minioadmin123 \ + minio server /data/minio --address ":9000" --console-address ":9001" 2>&1 | sed 's/^/[MinIO] /' diff --git a/docker/bin-test/postgres_configure.sh b/docker/bin-test/postgres_configure.sh new file mode 100755 index 0000000..a2bf8a4 --- /dev/null +++ b/docker/bin-test/postgres_configure.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +set -euo pipefail + +until /usr/lib/postgresql/16/bin/pg_isready -h localhost -p 5432 2>/dev/null; do + echo "[Postgres] Waiting for server to be ready..." + sleep 2 +done + +psql -d postgres -c "CREATE USER postgres WITH PASSWORD 'postgres' SUPERUSER;" 2>&1 | sed 's/^/[Postgres] /' +psql -d postgres -c "CREATE DATABASE catalog OWNER postgres;" 2>&1 | sed 's/^/[Postgres] /' + +echo "[Postgres] Configured successfully" diff --git a/docker/bin-test/postgres_start.sh b/docker/bin-test/postgres_start.sh new file mode 100755 index 0000000..35ddc97 --- /dev/null +++ b/docker/bin-test/postgres_start.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +set -euo pipefail + +export PGDATA="/var/lib/postgresql/data" + +/usr/lib/postgresql/16/bin/initdb -D "$PGDATA" 2>&1 | sed 's/^/[Postgres] /' + +/usr/lib/postgresql/16/bin/pg_ctl -D "$PGDATA" -l "$PGDATA/postgresql.log" start 2>&1 | sed 's/^/[Postgres] /' + +echo "[Postgres] started successfully" diff --git a/docker/bin-test/test.sh b/docker/bin-test/test.sh new file mode 100755 index 0000000..20bd8cb --- /dev/null +++ b/docker/bin-test/test.sh @@ -0,0 +1,43 @@ +#!/bin/bash + +set -euo pipefail + +# Set common environment variables +export CATALOG_DATABASE_URL=postgres://postgres:postgres@localhost:5432/catalog +export AWS_REGION=us-east-1 +export AWS_ACCESS_KEY_ID=minioadmin +export AWS_SECRET_ACCESS_KEY=minioadmin123 +export AWS_S3_ENDPOINT=localhost:9000 +export AWS_S3_BUCKET=bemidb-bucket + +/app/bin/postgres_start.sh & +postgres_pid=$! +/app/bin/postgres_configure.sh + +/app/bin/trino_configure_and_start.sh & +trino_pid=$! +/app/bin/minio_start.sh & +minio_pid=$! +trap 'kill -s TERM $postgres_pid $trino_pid $minio_pid 2>/dev/null' EXIT # kill children on exit + +/app/bin/trino_ensure_started.sh +/app/bin/minio_configure.sh + +# Seed data +cd /app/src/syncer-postgres +TRINO_DATABASE_URL=http://user@localhost:8080 \ + TRINO_CATALOG_NAME=iceberg \ + SOURCE_POSTGRES_SYNC_MODE=FULL_REFRESH \ + DESTINATION_SCHEMA_NAME=postgres \ + go test -v ./... + +# Run tests +cd /app/src/syncer-common +go test -v -count=1 ./... +cd /app/src/server +BEMIDB_USER=user \ + BEMIDB_PASSWORD=password \ + BEMIDB_LOG_LEVEL=ERROR \ + go test -v -count=1 ./... + +kill -s TERM $postgres_pid $trino_pid $minio_pid 2>/dev/null diff --git a/docker/bin/run.sh b/docker/bin/run.sh new file mode 100755 index 0000000..10b8713 --- /dev/null +++ b/docker/bin/run.sh @@ -0,0 +1,62 @@ +#!/bin/bash + +set -euo pipefail + +case "${1:-}" in + bash) + exec /bin/bash + ;; + syncer-postgres) + : "${SOURCE_POSTGRES_DATABASE_URL:?Environment variable SOURCE_POSTGRES_DATABASE_URL must be set}" + : "${DESTINATION_SCHEMA_NAME:?Environment variable DESTINATION_SCHEMA_NAME must be set}" + + /app/bin/trino_configure_and_start.sh & + trino_pid=$! + trap 'kill -s TERM $trino_pid 2>/dev/null' EXIT # kill children on exit + + /app/bin/trino_ensure_started.sh + + echo "Starting Syncer for PostgreSQL..." + TRINO_DATABASE_URL=http://user@localhost:8080 \ + TRINO_CATALOG_NAME=iceberg \ + SOURCE_POSTGRES_SYNC_MODE=FULL_REFRESH \ + ./bin/syncer-postgres 2>&1 | sed 's/^/[Syncer] /' + echo "Syncer for PostgreSQL finished." + + kill -s TERM $trino_pid 2>/dev/null + ;; + syncer-amplitude) + : "${SOURCE_AMPLITUDE_API_KEY:?Environment variable SOURCE_AMPLITUDE_API_KEY must be set}" + : "${SOURCE_AMPLITUDE_SECRET_KEY:?Environment variable SOURCE_AMPLITUDE_SECRET_KEY must be set}" + : "${DESTINATION_SCHEMA_NAME:?Environment variable DESTINATION_SCHEMA_NAME must be set}" + + /app/bin/trino_configure_and_start.sh & + trino_pid=$! + trap 'kill -s TERM $trino_pid 2>/dev/null' EXIT # kill children on exit + + /app/bin/trino_ensure_started.sh + + echo "Starting Syncer for Amplitude..." + TRINO_DATABASE_URL=http://user@localhost:8080 \ + TRINO_CATALOG_NAME=iceberg \ + ./bin/syncer-amplitude 2>&1 | sed 's/^/[Syncer] /' + echo "Syncer for Amplitude finished." + + kill -s TERM $trino_pid 2>/dev/null + ;; + server) + : "${AWS_REGION:?Environment variable AWS_REGION must be set}" + : "${AWS_S3_BUCKET:?Environment variable AWS_S3_BUCKET must be set}" + : "${AWS_ACCESS_KEY_ID:?Environment variable AWS_ACCESS_KEY_ID must be set}" + : "${AWS_SECRET_ACCESS_KEY:?Environment variable AWS_SECRET_ACCESS_KEY must be set}" + : "${CATALOG_DATABASE_URL:?Environment variable CATALOG_DATABASE_URL must be set}" + + echo "Starting server..." + ./bin/server + ;; + *) + echo "Unknown argument: ${1:-}" + echo "Available options: syncer-postgres, bash" + exit 1 + ;; +esac diff --git a/docker/bin/trino_configure_and_start.sh b/docker/bin/trino_configure_and_start.sh new file mode 100755 index 0000000..4fd2fe4 --- /dev/null +++ b/docker/bin/trino_configure_and_start.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +set -euo pipefail + +: "${AWS_REGION:?Environment variable AWS_REGION must be set}" +: "${AWS_S3_BUCKET:?Environment variable AWS_S3_BUCKET must be set}" +: "${AWS_ACCESS_KEY_ID:?Environment variable AWS_ACCESS_KEY_ID must be set}" +: "${AWS_SECRET_ACCESS_KEY:?Environment variable AWS_SECRET_ACCESS_KEY must be set}" +: "${CATALOG_DATABASE_URL:?Environment variable CATALOG_DATABASE_URL must be set}" + +echo "[Trino] Configuring catalog..." + +psql $CATALOG_DATABASE_URL -f /app/trino/configure.sql + +if [[ -z "${AWS_S3_ENDPOINT:-}" || "${AWS_S3_ENDPOINT:-}" == "s3.amazonaws.com" ]]; then + AWS_S3_ENDPOINT="https://s3-${AWS_REGION}.amazonaws.com" +else + if [[ "${AWS_S3_ENDPOINT}" == localhost* ]]; then + AWS_S3_ENDPOINT="http://${AWS_S3_ENDPOINT}" + else + AWS_S3_ENDPOINT="https://${AWS_S3_ENDPOINT}" + fi +fi + +sed -i \ + -e "s#{{AWS_S3_BUCKET}}#${AWS_S3_BUCKET}#g" \ + -e "s#{{AWS_REGION}}#${AWS_REGION}#g" \ + -e "s#{{AWS_ACCESS_KEY_ID}}#${AWS_ACCESS_KEY_ID}#g" \ + -e "s#{{AWS_SECRET_ACCESS_KEY}}#${AWS_SECRET_ACCESS_KEY}#g" \ + -e "s#{{AWS_S3_ENDPOINT}}#${AWS_S3_ENDPOINT}#g" \ + -e "s#{{CATALOG_DATABASE_URL}}#postgresql://$(echo $CATALOG_DATABASE_URL | cut -d'@' -f2)#g" \ + -e "s#{{TRINO_CATALOG_DATABASE_USER}}#$(echo $CATALOG_DATABASE_URL | cut -d'/' -f3 | cut -d':' -f1)#g" \ + -e "s#{{TRINO_CATALOG_DATABASE_PASSWORD}}#$(echo $CATALOG_DATABASE_URL | cut -d'/' -f3 | cut -d':' -f2 | cut -d'@' -f1)#g" \ + /etc/trino/catalog/iceberg.properties + +echo "[Trino] Starting server..." +CATALOG_MANAGEMENT=static \ + ./trino/bin/run.sh >/dev/null 2> >(sed 's/^/[Trino] /') diff --git a/docker/bin/trino_ensure_started.sh b/docker/bin/trino_ensure_started.sh new file mode 100755 index 0000000..01dfd99 --- /dev/null +++ b/docker/bin/trino_ensure_started.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +set -euo pipefail + +export TRINO_DATABASE_URL="http://user@localhost:8080" +while ! curl -sf "${TRINO_DATABASE_URL}/v1/info" > /dev/null; do + echo "[Trino] Waiting for server to be ready..." + sleep 15 +done +echo "[Trino] Server is ready." diff --git a/docker/trino/bin/health-check.sh b/docker/trino/bin/health-check.sh new file mode 100755 index 0000000..0f4d50b --- /dev/null +++ b/docker/trino/bin/health-check.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +set -euo pipefail + +function get_property() { + grep "^$1=" "$2" | cut -d'=' -f2 +} + +scheme=http +port=8080 + +config=/etc/trino/config.properties +# prefer to use http even if https is enabled +if [ "$(get_property 'http-server.http.enabled' "$config")" == "false" ]; then + scheme=https + port=$(get_property http-server.https.port "$config") +else + port=$(get_property http-server.http.port "$config") +fi + +endpoint="$scheme://localhost:$port/v1/info" + +# add --insecure to disable certificate verification in curl, in case a self-signed certificate is being used +if ! info=$(curl --fail --silent --show-error --insecure "$endpoint"); then + echo >&2 "Server is not responding to requests" + exit 1 +fi + +if ! grep -q '"starting":\s*false' <<<"$info" >/dev/null; then + echo >&2 "Server is starting" + exit 1 +fi diff --git a/docker/trino/bin/run.sh b/docker/trino/bin/run.sh new file mode 100755 index 0000000..a72b602 --- /dev/null +++ b/docker/trino/bin/run.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +set -xeuo pipefail + +launcher_opts=(--etc-dir /etc/trino) +if ! grep -s -q 'node.id' /etc/trino/node.properties; then + launcher_opts+=("-Dnode.id=${HOSTNAME}") +fi + +exec /app/trino/bin/launcher run "${launcher_opts[@]}" "$@" diff --git a/docker/trino/configure.sql b/docker/trino/configure.sql new file mode 100644 index 0000000..e2a098d --- /dev/null +++ b/docker/trino/configure.sql @@ -0,0 +1,16 @@ +CREATE TABLE IF NOT EXISTS iceberg_tables ( + catalog_name VARCHAR(255) NOT NULL, + table_namespace VARCHAR(255) NOT NULL, + table_name VARCHAR(255) NOT NULL, + metadata_location VARCHAR(1000), + previous_metadata_location VARCHAR(1000), + PRIMARY KEY (catalog_name, table_namespace, table_name) +); + +CREATE TABLE IF NOT EXISTS iceberg_namespace_properties ( + catalog_name VARCHAR(255) NOT NULL, + namespace VARCHAR(255) NOT NULL, + property_key VARCHAR(255), + property_value VARCHAR(1000), + PRIMARY KEY (catalog_name, namespace, property_key) +); diff --git a/docker/trino/etc/catalog/iceberg.properties b/docker/trino/etc/catalog/iceberg.properties new file mode 100644 index 0000000..781507c --- /dev/null +++ b/docker/trino/etc/catalog/iceberg.properties @@ -0,0 +1,18 @@ +connector.name=iceberg +iceberg.expire-snapshots.min-retention=0m +iceberg.remove-orphan-files.min-retention=0m + +iceberg.catalog.type=jdbc +iceberg.jdbc-catalog.catalog-name=postgres +iceberg.jdbc-catalog.driver-class=org.postgresql.Driver +iceberg.jdbc-catalog.connection-url=jdbc:{{CATALOG_DATABASE_URL}} +iceberg.jdbc-catalog.connection-user={{TRINO_CATALOG_DATABASE_USER}} +iceberg.jdbc-catalog.connection-password={{TRINO_CATALOG_DATABASE_PASSWORD}} +iceberg.jdbc-catalog.default-warehouse-dir=s3://{{AWS_S3_BUCKET}}/iceberg + +fs.native-s3.enabled=true +s3.path-style-access=true +s3.region={{AWS_REGION}} +s3.endpoint={{AWS_S3_ENDPOINT}} +s3.aws-access-key={{AWS_ACCESS_KEY_ID}} +s3.aws-secret-key={{AWS_SECRET_ACCESS_KEY}} diff --git a/docker/trino/etc/config.properties b/docker/trino/etc/config.properties new file mode 100644 index 0000000..be82f44 --- /dev/null +++ b/docker/trino/etc/config.properties @@ -0,0 +1,6 @@ +#single node install config +coordinator=true +node-scheduler.include-coordinator=true +http-server.http.port=8080 +discovery.uri=http://localhost:8080 +catalog.management=${ENV:CATALOG_MANAGEMENT} \ No newline at end of file diff --git a/docker/trino/etc/jvm.config b/docker/trino/etc/jvm.config new file mode 100644 index 0000000..b1b5206 --- /dev/null +++ b/docker/trino/etc/jvm.config @@ -0,0 +1,16 @@ +-server +-XX:InitialRAMPercentage=80 +-XX:MaxRAMPercentage=80 +-XX:G1HeapRegionSize=32M +-XX:+ExplicitGCInvokesConcurrent +-XX:+HeapDumpOnOutOfMemoryError +-XX:+ExitOnOutOfMemoryError +-XX:-OmitStackTraceInFastThrow +-XX:ReservedCodeCacheSize=256M +-XX:PerMethodRecompilationCutoff=10000 +-XX:PerBytecodeRecompilationCutoff=10000 +-Djdk.attach.allowAttachSelf=true +-Djdk.nio.maxCachedBufferSize=2000000 +-Dfile.encoding=UTF-8 +# Allow loading dynamic agent used by JOL +-XX:+EnableDynamicAgentLoading diff --git a/docker/trino/etc/log.properties b/docker/trino/etc/log.properties new file mode 100644 index 0000000..abee45e --- /dev/null +++ b/docker/trino/etc/log.properties @@ -0,0 +1,2 @@ +# Enable verbose logging from Trino +#io.trino=DEBUG diff --git a/docker/trino/etc/node.properties b/docker/trino/etc/node.properties new file mode 100644 index 0000000..25889e2 --- /dev/null +++ b/docker/trino/etc/node.properties @@ -0,0 +1,2 @@ +node.environment=production +node.data-dir=/data/trino diff --git a/img/architecture.png b/img/architecture.png index 82942d7437c8031f43e1397607907b4223fb37a0..a1d3aaa77de75fc857e2d0eab124bfa1c2b394e3 100644 GIT binary patch literal 99796 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 literal 95887 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

UJ-kE4@l8 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

NHQSL5BK+>DxU$772<68zN3aMjTdw+Nr2 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 diff --git a/scripts/build-darwin.sh b/scripts/build-darwin.sh deleted file mode 100755 index 767e87a..0000000 --- a/scripts/build-darwin.sh +++ /dev/null @@ -1,36 +0,0 @@ -cd src -go build -o ../build/bemidb-darwin-arm64 - -create_dir_if_needed() { - local dir=$1 - if [ ! -d "$dir" ]; then - echo "Creating directory: $dir" - sudo mkdir -p "$dir" - sudo chmod 755 "$dir" - fi -} - -create_dir_if_needed "/usr/local/lib" -cd ../build -LIBCPP_OLD_PATH=$(otool -L ./bemidb-darwin-arm64 | grep -o '/.*/libc++\.1\.0\.dylib') -if [ -z "$LIBCPP_OLD_PATH" ]; then - echo "Error: Could not find libc++ dependency in binary" - exit 1 -fi -LIBCPP_NEW_PATH=/usr/local/lib/libc++.1.0.dylib -sudo cp $LIBCPP_OLD_PATH $LIBCPP_NEW_PATH - -LIBCPPABI_OLD_PATH=$(otool -L $LIBCPP_NEW_PATH | grep -o '/.*/libc++abi\.1\.dylib') -if [ -z "$LIBCPPABI_OLD_PATH" ]; then - echo "Error: Could not find libc++abi dependency" - exit 1 -fi -LIBCPPABI_NEW_PATH=/usr/local/lib/libc++abi.1.dylib -sudo cp $LIBCPPABI_OLD_PATH $LIBCPPABI_NEW_PATH - -sudo install_name_tool -change $LIBCPPABI_OLD_PATH $LIBCPPABI_NEW_PATH $LIBCPP_NEW_PATH -sudo install_name_tool -change $LIBCPP_OLD_PATH $LIBCPP_NEW_PATH ./bemidb-darwin-arm64 - -sudo cp $LIBCPP_NEW_PATH ./libc++.1.0.dylib -sudo cp $LIBCPPABI_NEW_PATH ./libc++abi.1.dylib -otool -L ./bemidb-darwin-arm64 diff --git a/scripts/build-docker.sh b/scripts/build-docker.sh new file mode 100755 index 0000000..34217b7 --- /dev/null +++ b/scripts/build-docker.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +VERSION=$(grep -E 'VERSION = "[^"]+"' src/server/config.go | sed -E 's/.*VERSION = "([^"]+)".*/\1/') +if [ -z "$VERSION" ]; then + echo "Error: Could not extract version" + exit 1 +fi + +echo "Building bemidb version $VERSION for linux/amd64" +docker buildx build --build-arg PLATFORM=linux/amd64 -t ghcr.io/bemihq/bemidb:$VERSION-amd64 . + +echo "Building bemidb version $VERSION for linux/arm64" +docker buildx build --build-arg PLATFORM=linux/arm64 -t ghcr.io/bemihq/bemidb:$VERSION-arm64 . diff --git a/scripts/build-linux.sh b/scripts/build-linux.sh deleted file mode 100755 index d7a9740..0000000 --- a/scripts/build-linux.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash - -platforms=("linux/amd64" "linux/arm64") - -version=$(grep -E 'VERSION = "[^"]+"' src/config.go | sed -E 's/.*VERSION = "([^"]+)".*/\1/') -if [ -z "$version" ]; then - echo "Error: Could not extract version from config.go" - exit 1 -fi - -for platform in "${platforms[@]}" -do - os="${platform%/*}" - arch="${platform#*/}" - tag="ghcr.io/bemihq/bemidb:$version-$arch" - - echo "Building bemidb version $version for $os/$arch" - - docker buildx build \ - --build-arg PLATFORM=$platform \ - --build-arg GOOS=$os \ - --build-arg GOARCH="$arch" \ - -t $tag . - - docker create --name temp-container $tag - docker cp temp-container:/app/bemidb ./build/bemidb-$os-$arch - docker rm temp-container -done diff --git a/scripts/install.sh b/scripts/install.sh deleted file mode 100755 index 81dbbb1..0000000 --- a/scripts/install.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/bash - -# Detect OS and architecture -OS=$(uname -s | tr '[:upper:]' '[:lower:]') -ARCH=$(uname -m) - -# Map architecture to Go naming convention -case $ARCH in - x86_64|amd64) - ARCH="amd64" - ;; - aarch64|arm64) - ARCH="arm64" - ;; - *) - echo "Unsupported architecture: $ARCH" - exit 1 - ;; -esac - -# Set the download URL and binary name -BINARY_NAME="bemidb-${OS}-${ARCH}" -DOWNLOAD_URL="https://github.com/BemiHQ/BemiDB/releases/latest/download/$BINARY_NAME" - -# Download the binary -echo "Downloading $DOWNLOAD_URL..." -curl -L "$DOWNLOAD_URL" -o ./bemidb - -if [ "$ARCH" = "arm64" ] && [ "$OS" = "darwin" ]; then - # Ensure /usr/local/lib exists - if [ ! -d "/usr/local/lib" ]; then - sudo mkdir -p /usr/local/lib - fi - - # Download the libc++ dynamic libraries for macOS (can't be statically linked) - curl -sL "https://github.com/BemiHQ/BemiDB/releases/latest/download/libc++.1.0.dylib" -o ./libc++.1.0.dylib - sudo mv ./libc++.1.0.dylib /usr/local/lib/libc++.1.0.dylib - curl -sL "https://github.com/BemiHQ/BemiDB/releases/latest/download/libc++abi.1.dylib" -o ./libc++abi.1.dylib - sudo mv ./libc++abi.1.dylib /usr/local/lib/libc++abi.1.dylib -fi - -# Make the binary executable -chmod +x ./bemidb diff --git a/scripts/publish-docker.sh b/scripts/publish-docker.sh index 488d3a8..684d431 100755 --- a/scripts/publish-docker.sh +++ b/scripts/publish-docker.sh @@ -1,26 +1,26 @@ #!/bin/bash -version=$(grep -E 'VERSION = "[^"]+"' src/config.go | sed -E 's/.*VERSION = "([^"]+)".*/\1/') -if [ -z "$version" ]; then - echo "Error: Could not extract version from config.go" +VERSION=$(grep -E 'VERSION = "[^"]+"' src/server/config.go | sed -E 's/.*VERSION = "([^"]+)".*/\1/') +if [ -z "$VERSION" ]; then + echo "Error: Could not extract version" exit 1 fi -echo "Pushing bemidb version $version to ghcr.io" +echo "Pushing bemidb version $VERSION to ghcr.io" -docker push ghcr.io/bemihq/bemidb:$version-amd64 -docker push ghcr.io/bemihq/bemidb:$version-arm64 +docker push ghcr.io/bemihq/bemidb:$VERSION-amd64 +docker push ghcr.io/bemihq/bemidb:$VERSION-arm64 -docker manifest inspect ghcr.io/bemihq/bemidb:$version &> /dev/null && docker manifest rm ghcr.io/bemihq/bemidb:$version -docker manifest create ghcr.io/bemihq/bemidb:$version ghcr.io/bemihq/bemidb:$version-amd64 ghcr.io/bemihq/bemidb:$version-arm64 -docker manifest annotate ghcr.io/bemihq/bemidb:$version ghcr.io/bemihq/bemidb:$version-amd64 --arch amd64 -docker manifest annotate ghcr.io/bemihq/bemidb:$version ghcr.io/bemihq/bemidb:$version-arm64 --arch arm64 -docker manifest push ghcr.io/bemihq/bemidb:$version +docker manifest inspect ghcr.io/bemihq/bemidb:$VERSION &> /dev/null && docker manifest rm ghcr.io/bemihq/bemidb:$VERSION +docker manifest create ghcr.io/bemihq/bemidb:$VERSION ghcr.io/bemihq/bemidb:$VERSION-amd64 ghcr.io/bemihq/bemidb:$VERSION-arm64 +docker manifest annotate ghcr.io/bemihq/bemidb:$VERSION ghcr.io/bemihq/bemidb:$VERSION-amd64 --arch amd64 +docker manifest annotate ghcr.io/bemihq/bemidb:$VERSION ghcr.io/bemihq/bemidb:$VERSION-arm64 --arch arm64 +docker manifest push ghcr.io/bemihq/bemidb:$VERSION docker manifest inspect ghcr.io/bemihq/bemidb:latest &> /dev/null && docker manifest rm ghcr.io/bemihq/bemidb:latest -docker manifest create ghcr.io/bemihq/bemidb:latest ghcr.io/bemihq/bemidb:$version-amd64 ghcr.io/bemihq/bemidb:$version-arm64 -docker manifest annotate ghcr.io/bemihq/bemidb:latest ghcr.io/bemihq/bemidb:$version-amd64 --arch amd64 -docker manifest annotate ghcr.io/bemihq/bemidb:latest ghcr.io/bemihq/bemidb:$version-arm64 --arch arm64 +docker manifest create ghcr.io/bemihq/bemidb:latest ghcr.io/bemihq/bemidb:$VERSION-amd64 ghcr.io/bemihq/bemidb:$VERSION-arm64 +docker manifest annotate ghcr.io/bemihq/bemidb:latest ghcr.io/bemihq/bemidb:$VERSION-amd64 --arch amd64 +docker manifest annotate ghcr.io/bemihq/bemidb:latest ghcr.io/bemihq/bemidb:$VERSION-arm64 --arch arm64 docker manifest push ghcr.io/bemihq/bemidb:latest echo diff --git a/src/config.go b/src/config.go deleted file mode 100644 index 1c370ef..0000000 --- a/src/config.go +++ /dev/null @@ -1,201 +0,0 @@ -package main - -import ( - "flag" - "os" - "slices" - "strings" -) - -const ( - VERSION = "0.51.1" - - ENV_PORT = "BEMIDB_PORT" - ENV_DATABASE = "BEMIDB_DATABASE" - ENV_USER = "BEMIDB_USER" - ENV_PASSWORD = "BEMIDB_PASSWORD" - ENV_HOST = "BEMIDB_HOST" - ENV_INIT_SQL_FILEPATH = "BEMIDB_INIT_SQL" - - ENV_STORAGE_PATH = "BEMIDB_STORAGE_PATH" - ENV_STORAGE_TYPE = "BEMIDB_STORAGE_TYPE" - ENV_AWS_REGION = "AWS_REGION" - ENV_AWS_S3_ENDPOINT = "AWS_S3_ENDPOINT" - ENV_AWS_S3_BUCKET = "AWS_S3_BUCKET" - ENV_AWS_ACCESS_KEY_ID = "AWS_ACCESS_KEY_ID" - ENV_AWS_SECRET_ACCESS_KEY = "AWS_SECRET_ACCESS_KEY" - - ENV_PG_DATABASE_URL = "PG_DATABASE_URL" - ENV_PG_SYNC_INTERVAL = "PG_SYNC_INTERVAL" - ENV_PG_SCHEMA_PREFIX = "PG_SCHEMA_PREFIX" - ENV_PG_INCLUDE_TABLES = "PG_INCLUDE_TABLES" - ENV_PG_EXCLUDE_TABLES = "PG_EXCLUDE_TABLES" - ENV_PG_INCREMENTALLY_REFRESHED_TABLES = "PG_INCREMENTALLY_REFRESHED_TABLES" - ENV_PG_PRESERVE_UNSYNCED = "PG_PRESERVE_UNSYNCED" - - ENV_LOG_LEVEL = "BEMIDB_LOG_LEVEL" - ENV_DISABLE_ANONYMOUS_ANALYTICS = "BEMIDB_DISABLE_ANONYMOUS_ANALYTICS" - - DEFAULT_PORT = "54321" - DEFAULT_DATABASE = "bemidb" - DEFAULT_USER = "" - DEFAULT_PASSWORD = "" - DEFAULT_HOST = "127.0.0.1" - DEFAULT_STORAGE_PATH = "iceberg" - DEFAULT_LOG_LEVEL = "INFO" - DEFAULT_DB_STORAGE_TYPE = "LOCAL" - - DEFAULT_AWS_S3_ENDPOINT = "s3.amazonaws.com" - - STORAGE_TYPE_LOCAL = "LOCAL" - STORAGE_TYPE_S3 = "S3" -) - -var STORAGE_TYPES = []string{STORAGE_TYPE_LOCAL, STORAGE_TYPE_S3} - -type AwsConfig struct { - Region string - S3Endpoint string // optional - S3Bucket string - AccessKeyId string - SecretAccessKey string -} - -type PgConfig struct { - DatabaseUrl string - SyncInterval string // optional - SchemaPrefix string // optional - IncludeTables []string // optional - ExcludeTables []string // optional - IncrementallyRefreshedTables []string // optional - PreserveUnsynced bool // optional -} - -type Config struct { - Host string - Port string - Database string - User string - EncryptedPassword string - LogLevel string - StorageType string - StoragePath string - Aws AwsConfig - Pg PgConfig - DisableAnonymousAnalytics bool -} - -type configParseValues struct { - password string - pgIncludeTables string - pgExcludeTables string - pgIncrementallyRefreshedTables string -} - -var _config Config -var _configParseValues configParseValues - -func init() { - registerFlags() -} - -func registerFlags() { - flag.StringVar(&_config.Host, "host", os.Getenv(ENV_HOST), "Database host. Default: \""+DEFAULT_HOST+"\"") - flag.StringVar(&_config.Port, "port", os.Getenv(ENV_PORT), "Port for BemiDB to listen on. Default: \""+DEFAULT_PORT+"\"") - flag.StringVar(&_config.Database, "database", os.Getenv(ENV_DATABASE), "Database name. Default: \""+DEFAULT_DATABASE+"\"") - flag.StringVar(&_config.User, "user", os.Getenv(ENV_USER), "Database user. Default: \""+DEFAULT_USER+"\"") - flag.StringVar(&_configParseValues.password, "password", os.Getenv(ENV_PASSWORD), "Database password. Default: \""+DEFAULT_PASSWORD+"\"") - flag.StringVar(&_config.StoragePath, "storage-path", os.Getenv(ENV_STORAGE_PATH), "Path to the storage folder. Default: \""+DEFAULT_STORAGE_PATH+"\"") - flag.StringVar(&_config.LogLevel, "log-level", os.Getenv(ENV_LOG_LEVEL), "Log level: \"ERROR\", \"WARN\", \"INFO\", \"DEBUG\", \"TRACE\". Default: \""+DEFAULT_LOG_LEVEL+"\"") - flag.StringVar(&_config.StorageType, "storage-type", os.Getenv(ENV_STORAGE_TYPE), "Storage type: \"LOCAL\", \"S3\". Default: \""+DEFAULT_DB_STORAGE_TYPE+"\"") - flag.StringVar(&_config.Pg.SchemaPrefix, "pg-schema-prefix", os.Getenv(ENV_PG_SCHEMA_PREFIX), "(Optional) Prefix for PostgreSQL schema names") - flag.StringVar(&_config.Pg.SyncInterval, "pg-sync-interval", os.Getenv(ENV_PG_SYNC_INTERVAL), "(Optional) Interval between syncs. Valid units: \"ns\", \"us\" (or \"µs\"), \"ms\", \"s\", \"m\", \"h\"") - flag.StringVar(&_configParseValues.pgIncludeTables, "pg-include-tables", os.Getenv(ENV_PG_INCLUDE_TABLES), "(Optional) Comma-separated list of tables to include in sync (format: schema.table)") - flag.StringVar(&_configParseValues.pgExcludeTables, "pg-exclude-tables", os.Getenv(ENV_PG_EXCLUDE_TABLES), "(Optional) Comma-separated list of tables to exclude from sync (format: schema.table)") - flag.StringVar(&_configParseValues.pgIncrementallyRefreshedTables, "pg-incrementally-refreshed-tables", os.Getenv(ENV_PG_INCREMENTALLY_REFRESHED_TABLES), "(Optional) Comma-separated list of tables to refresh incrementally (format: schema.table)") - flag.BoolVar(&_config.Pg.PreserveUnsynced, "pg-preserve-unsynced", os.Getenv(ENV_PG_PRESERVE_UNSYNCED) == "true", "(Optional) Do not delete the existing tables in BemiDB that are not part of the sync") - flag.StringVar(&_config.Pg.DatabaseUrl, "pg-database-url", os.Getenv(ENV_PG_DATABASE_URL), "PostgreSQL database URL to sync") - flag.StringVar(&_config.Aws.Region, "aws-region", os.Getenv(ENV_AWS_REGION), "AWS region") - flag.StringVar(&_config.Aws.S3Endpoint, "aws-s3-endpoint", os.Getenv(ENV_AWS_S3_ENDPOINT), "AWS S3 endpoint. Default: \""+DEFAULT_AWS_S3_ENDPOINT+"\"") - flag.StringVar(&_config.Aws.S3Bucket, "aws-s3-bucket", os.Getenv(ENV_AWS_S3_BUCKET), "AWS S3 bucket name") - flag.StringVar(&_config.Aws.AccessKeyId, "aws-access-key-id", os.Getenv(ENV_AWS_ACCESS_KEY_ID), "AWS access key ID") - flag.StringVar(&_config.Aws.SecretAccessKey, "aws-secret-access-key", os.Getenv(ENV_AWS_SECRET_ACCESS_KEY), "AWS secret access key") - flag.BoolVar(&_config.DisableAnonymousAnalytics, "disable-anonymous-analytics", os.Getenv(ENV_DISABLE_ANONYMOUS_ANALYTICS) == "true", "Disable anonymous analytics collection") -} - -func parseFlags() { - flag.Parse() - - if _config.Host == "" { - _config.Host = DEFAULT_HOST - } - if _config.Port == "" { - _config.Port = DEFAULT_PORT - } - if _config.Database == "" { - _config.Database = DEFAULT_DATABASE - } - if _config.User == "" { - _config.User = DEFAULT_USER - } - if _configParseValues.password == "" { - _configParseValues.password = DEFAULT_PASSWORD - } - if _configParseValues.password != "" { - if _config.User == "" { - panic("Password is set without a user") - } - _config.EncryptedPassword = StringToScramSha256(_configParseValues.password) - } - if _config.StoragePath == "" { - _config.StoragePath = DEFAULT_STORAGE_PATH - } - if _config.LogLevel == "" { - _config.LogLevel = DEFAULT_LOG_LEVEL - } else if !slices.Contains(LOG_LEVELS, _config.LogLevel) { - panic("Invalid log level " + _config.LogLevel + ". Must be one of " + strings.Join(LOG_LEVELS, ", ")) - } - if _config.StorageType == "" { - _config.StorageType = DEFAULT_DB_STORAGE_TYPE - } else if !slices.Contains(STORAGE_TYPES, _config.StorageType) { - panic("Invalid storage type " + _config.StorageType + ". Must be one of " + strings.Join(STORAGE_TYPES, ", ")) - } - - if _config.StorageType == STORAGE_TYPE_S3 { - if _config.Aws.Region == "" { - panic("AWS region is required") - } - if _config.Aws.S3Endpoint == "" { - _config.Aws.S3Endpoint = DEFAULT_AWS_S3_ENDPOINT - } - if _config.Aws.S3Bucket == "" { - panic("AWS S3 bucket name is required") - } - if _config.Aws.AccessKeyId != "" && _config.Aws.SecretAccessKey == "" { - panic("AWS secret access key is required") - } - if _config.Aws.AccessKeyId == "" && _config.Aws.SecretAccessKey != "" { - panic("AWS access key ID is required") - } - } - if _configParseValues.pgIncludeTables != "" { - _config.Pg.IncludeTables = strings.Split(_configParseValues.pgIncludeTables, ",") - } - if _configParseValues.pgIncrementallyRefreshedTables != "" { - _config.Pg.IncrementallyRefreshedTables = strings.Split(_configParseValues.pgIncrementallyRefreshedTables, ",") - } - if _configParseValues.pgExcludeTables != "" { - _config.Pg.ExcludeTables = strings.Split(_configParseValues.pgExcludeTables, ",") - } - - _configParseValues = configParseValues{} -} - -func LoadConfig(reRegisterFlags ...bool) *Config { - if reRegisterFlags != nil && reRegisterFlags[0] { - flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ExitOnError) - registerFlags() - } - parseFlags() - return &_config -} diff --git a/src/config_test.go b/src/config_test.go deleted file mode 100644 index 627cfe1..0000000 --- a/src/config_test.go +++ /dev/null @@ -1,214 +0,0 @@ -package main - -import ( - "testing" -) - -func TestLoadConfig(t *testing.T) { - t.Run("Uses default config values with local storage", func(t *testing.T) { - config := LoadConfig(true) - - if config.Port != "54321" { - t.Errorf("Expected port to be 54321, got %s", config.Port) - } - if config.Database != "bemidb" { - t.Errorf("Expected database to be bemidb, got %s", config.Database) - } - if config.StoragePath != "iceberg" { - t.Errorf("Expected StoragePath to be iceberg, got %s", config.StoragePath) - } - if config.LogLevel != "INFO" { - t.Errorf("Expected logLevel to be INFO, got %s", config.LogLevel) - } - if config.StorageType != "LOCAL" { - t.Errorf("Expected storageType to be LOCAL, got %s", config.StorageType) - } - if config.Pg.DatabaseUrl != "" { - t.Errorf("Expected pgDatabaseUrl to be empty, got %s", config.Pg.DatabaseUrl) - } - if config.Pg.SyncInterval != "" { - t.Errorf("Expected interval to be empty, got %s", config.Pg.SyncInterval) - } - if config.Pg.SchemaPrefix != "" { - t.Errorf("Expected schemaPrefix to be empty, got %s", config.Pg.SchemaPrefix) - } - if config.Pg.IncludeTables != nil { - t.Errorf("Expected includeTables to be empty, got %v", config.Pg.IncludeTables) - } - if config.Pg.ExcludeTables != nil { - t.Errorf("Expected includeTables to be empty, got %v", config.Pg.ExcludeTables) - } - }) - - t.Run("Uses config values from environment variables with LOCAL storage", func(t *testing.T) { - t.Setenv("BEMIDB_PORT", "12345") - t.Setenv("BEMIDB_DATABASE", "mydb") - t.Setenv("BEMIDB_INIT_SQL", "./init/duckdb.sql") - t.Setenv("BEMIDB_STORAGE_PATH", "storage-path") - t.Setenv("BEMIDB_LOG_LEVEL", "ERROR") - t.Setenv("BEMIDB_STORAGE_TYPE", "LOCAL") - - config := LoadConfig(true) - - if config.Port != "12345" { - t.Errorf("Expected port to be 12345, got %s", config.Port) - } - if config.Database != "mydb" { - t.Errorf("Expected database to be mydb, got %s", config.Database) - } - if config.StoragePath != "storage-path" { - t.Errorf("Expected StoragePath to be storage-path, got %s", config.StoragePath) - } - if config.LogLevel != "ERROR" { - t.Errorf("Expected logLevel to be ERROR, got %s", config.LogLevel) - } - if config.StorageType != "LOCAL" { - t.Errorf("Expected storageType to be local, got %s", config.StorageType) - } - }) - - t.Run("Uses config values from environment variables with AWS S3 storage", func(t *testing.T) { - t.Setenv("BEMIDB_PORT", "12345") - t.Setenv("BEMIDB_DATABASE", "mydb") - t.Setenv("BEMIDB_INIT_SQL", "./init/duckdb.sql") - t.Setenv("BEMIDB_STORAGE_PATH", "storage-path") - t.Setenv("BEMIDB_LOG_LEVEL", "ERROR") - t.Setenv("BEMIDB_STORAGE_TYPE", "S3") - t.Setenv("AWS_REGION", "us-west-1") - t.Setenv("AWS_S3_ENDPOINT", "s3-us-west-1.amazonaws.com") - t.Setenv("AWS_S3_BUCKET", "my_bucket") - t.Setenv("AWS_ACCESS_KEY_ID", "my_access_key_id") - t.Setenv("AWS_SECRET_ACCESS_KEY", "my_secret_access_key") - - config := LoadConfig(true) - - if config.Port != "12345" { - t.Errorf("Expected port to be 12345, got %s", config.Port) - } - if config.Database != "mydb" { - t.Errorf("Expected database to be mydb, got %s", config.Database) - } - if config.StoragePath != "storage-path" { - t.Errorf("Expected StoragePath to be storage-path, got %s", config.StoragePath) - } - if config.LogLevel != "ERROR" { - t.Errorf("Expected logLevel to be ERROR, got %s", config.LogLevel) - } - if config.StorageType != "S3" { - t.Errorf("Expected storageType to be S3, got %s", config.StorageType) - } - if config.Aws.Region != "us-west-1" { - t.Errorf("Expected awsRegion to be us-west-1, got %s", config.Aws.Region) - } - if config.Aws.S3Endpoint != "s3-us-west-1.amazonaws.com" { - t.Errorf("Expected awsS3Endpoint to be s3-us-west-1.amazonaws.com, got %s", config.Aws.S3Endpoint) - } - if config.Aws.S3Bucket != "my_bucket" { - t.Errorf("Expected awsS3Bucket to be mybucket, got %s", config.Aws.S3Bucket) - } - if config.Aws.AccessKeyId != "my_access_key_id" { - t.Errorf("Expected awsAccessKeyId to be my_access_key_id, got %s", config.Aws.AccessKeyId) - } - if config.Aws.SecretAccessKey != "my_secret_access_key" { - t.Errorf("Expected awsSecretAccessKey to be my_secret_access_key, got %s", config.Aws.SecretAccessKey) - } - }) - - t.Run("Uses config values from environment variables for PG", func(t *testing.T) { - t.Setenv("PG_DATABASE_URL", "postgres://user:password@localhost:5432/template1") - t.Setenv("PG_SYNC_INTERVAL", "1h") - t.Setenv("PG_SCHEMA_PREFIX", "mydb_") - t.Setenv("PG_EXCLUDE_TABLES", "public.users,public.secrets") - - config := LoadConfig(true) - - if config.Pg.DatabaseUrl != "postgres://user:password@localhost:5432/template1" { - t.Errorf("Expected pgDatabaseUrl to be postgres://user:password@localhost:5432/template1, got %s", config.Pg.DatabaseUrl) - } - if config.Pg.SyncInterval != "1h" { - t.Errorf("Expected interval to be 1h, got %s", config.Pg.SyncInterval) - } - if config.Pg.SchemaPrefix != "mydb_" { - t.Errorf("Expected schemaPrefix to be empty, got %s", config.Pg.SchemaPrefix) - } - if !HasExactOrWildcardMatch(config.Pg.ExcludeTables, "public.users") { - t.Errorf("Expected ExcludeTables to contain public.users, got %v", config.Pg.ExcludeTables) - } - if !HasExactOrWildcardMatch(config.Pg.ExcludeTables, "public.secrets") { - t.Errorf("Expected ExcludeTables to contain public.secrets, got %v", config.Pg.ExcludeTables) - } - }) - - t.Run("Panics when only AWS_ACCESS_KEY_ID is set without AWS_SECRET_ACCESS_KEY", func(t *testing.T) { - t.Setenv("BEMIDB_STORAGE_TYPE", "S3") - t.Setenv("AWS_ACCESS_KEY_ID", "my_access_key_id") - - defer func() { - if r := recover(); r == nil { - t.Error("Expected panic when only AWS_ACCESS_KEY_ID is set") - } - }() - - LoadConfig(true) - }) - - t.Run("Panics when only AWS_SECRET_ACCESS_KEY is set without AWS_ACCESS_KEY_ID", func(t *testing.T) { - t.Setenv("BEMIDB_STORAGE_TYPE", "S3") - t.Setenv("AWS_SECRET_ACCESS_KEY", "my_secret_access_key") - - defer func() { - if r := recover(); r == nil { - t.Error("Expected panic when only AWS_SECRET_ACCESS_KEY is set") - } - }() - - LoadConfig(true) - }) - - t.Run("Uses command line arguments", func(t *testing.T) { - setTestArgs([]string{ - "--port", "12345", - "--database", "mydb", - "--storage-path", "storage-path", - "--log-level", "ERROR", - "--storage-type", "LOCAL", - "--pg-database-url", "postgres://user:password@localhost:5432/db", - "--pg-sync-interval", "2h30m", - "--pg-schema-prefix", "mydb_", - "--pg-exclude-tables", "public.users,public.secrets", - }) - - config := LoadConfig(true) - - if config.Port != "12345" { - t.Errorf("Expected port to be 12345, got %s", config.Port) - } - if config.Database != "mydb" { - t.Errorf("Expected database to be mydb, got %s", config.Database) - } - if config.StoragePath != "storage-path" { - t.Errorf("Expected StoragePath to be storage-path, got %s", config.StoragePath) - } - if config.LogLevel != "ERROR" { - t.Errorf("Expected logLevel to be ERROR, got %s", config.LogLevel) - } - if config.StorageType != "LOCAL" { - t.Errorf("Expected storageType to be local, got %s", config.StorageType) - } - if config.Pg.DatabaseUrl != "postgres://user:password@localhost:5432/db" { - t.Errorf("Expected pgDatabaseUrl to be postgres://user:password@localhost:5432/db, got %s", config.Pg.DatabaseUrl) - } - if config.Pg.SyncInterval != "2h30m" { - t.Errorf("Expected interval to be 2h30m, got %s", config.Pg.SyncInterval) - } - if config.Pg.SchemaPrefix != "mydb_" { - t.Errorf("Expected schemaPrefix to be mydb_, got %s", config.Pg.SchemaPrefix) - } - if !HasExactOrWildcardMatch(config.Pg.ExcludeTables, "public.users") { - t.Errorf("Expected ExcludeTables to have public.users, got %v", config.Pg.ExcludeTables) - } - if !HasExactOrWildcardMatch(config.Pg.ExcludeTables, "public.secrets") { - t.Errorf("Expected ExcludeTables to have public.secrets, got %v", config.Pg.ExcludeTables) - } - }) -} diff --git a/src/duckdb_test.go b/src/duckdb_test.go deleted file mode 100644 index efce0c9..0000000 --- a/src/duckdb_test.go +++ /dev/null @@ -1,64 +0,0 @@ -package main - -import ( - "context" - "io" - "strings" - "testing" -) - -func TestNewDuckdb(t *testing.T) { - t.Run("Creates a new DuckDB instance", func(t *testing.T) { - config := loadTestConfig() - - duckdb := NewDuckdb(config, false) - - defer duckdb.Close() - rows, err := duckdb.QueryContext(context.Background(), "SELECT 1") - if err != nil { - t.Errorf("Expected query to succeed") - } - defer rows.Close() - - for rows.Next() { - var result int - err = rows.Scan(&result) - if err != nil { - t.Errorf("Expected query to return a result") - } - if result != 1 { - t.Errorf("Expected query result to be 1, got %d", result) - } - } - }) -} - -func TestExecFile(t *testing.T) { - t.Run("Executes SQL file", func(t *testing.T) { - config := loadTestConfig() - duckdb := NewDuckdb(config, false) - defer duckdb.Close() - fileContent := strings.Join([]string{ - "CREATE TABLE test (id INTEGER);", - "INSERT INTO test VALUES (1);", - }, "\n") - file := io.NopCloser(strings.NewReader(fileContent)) - - duckdb.ExecFile(file) - - rows, err := duckdb.QueryContext(context.Background(), "SELECT COUNT(*) FROM test") - if err != nil { - t.Errorf("Expected query to succeed") - } - defer rows.Close() - var count int - rows.Next() - err = rows.Scan(&count) - if err != nil { - t.Errorf("Expected query to return a result") - } - if count != 1 { - t.Errorf("Expected query result to be 1, got %d", count) - } - }) -} diff --git a/src/go.sum b/src/go.sum deleted file mode 100644 index 8498f86..0000000 --- a/src/go.sum +++ /dev/null @@ -1,1287 +0,0 @@ -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.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.66.0/go.mod h1:dgqGAjKCDxyhGTtC9dAREQGUJpkceNm1yt590Qno0Ko= -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.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.82.0/go.mod h1:vlKccHJGuFBFufnAnuB08dfEH9Y3H7dzDzRECFdC2TA= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= -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 v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.2.0/go.mod h1:xlogom/6gr8RJGBe7nT2eGsQYAFUbbv8dbC29qE3Xmw= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -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/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= -cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= -cloud.google.com/go/iam v0.1.1/go.mod h1:CKqrcnI/suGpybEHxZ7BMehL0oA4LpdyJdUlTl9jVMw= -cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= -cloud.google.com/go/kms v1.1.0/go.mod h1:WdbppnCDMDpOvoYBMn1+gNmOeEoZYqAv+HeuKARGCXI= -cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= -cloud.google.com/go/monitoring v1.1.0/go.mod h1:L81pzz7HKn14QCMaCs6NTQkdBnE87TElyanS95vIcl4= -cloud.google.com/go/monitoring v1.4.0/go.mod h1:y6xnxfwI3hTFWOdkOaD7nfJVlwuC3/mS/5kvtT131p4= -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/pubsub v1.19.0/go.mod h1:/O9kmSe9bb9KRnIAWkzmqhPjHo6LtzGOBYd/kr06XSs= -cloud.google.com/go/secretmanager v1.3.0/go.mod h1:+oLTkouyiYiabAQNugCeTS3PAArGiMJuBqvJnJsyH+U= -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.12.0/go.mod h1:fFLk2dp2oAhDz8QFKwqrjdJvxSp/W2g7nillojlL5Ho= -cloud.google.com/go/storage v1.21.0/go.mod h1:XmRlxkgPjlBONznT2dDUU/5XlpU2OjMnKuqnZI01LAA= -cloud.google.com/go/trace v1.0.0/go.mod h1:4iErSByzxkyHWzzlAj63/Gmjz0NH1ASqhJguHpGcr6A= -cloud.google.com/go/trace v1.2.0/go.mod h1:Wc8y/uYyOhPy12KEnXG9XGrvfMz5F5SrYecQlbW1rwM= -contrib.go.opencensus.io/exporter/aws v0.0.0-20200617204711-c478e41e60e9/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= -contrib.go.opencensus.io/exporter/stackdriver v0.13.10/go.mod h1:I5htMbyta491eUxufwwZPQdcKvvgzMB4O9ni41YnIM8= -contrib.go.opencensus.io/integrations/ocsql v0.1.7/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= -git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= -github.com/Azure/azure-amqp-common-go/v3 v3.2.1/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= -github.com/Azure/azure-amqp-common-go/v3 v3.2.2/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= -github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k= -github.com/Azure/azure-sdk-for-go v51.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v59.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.0.0/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.0.0/go.mod h1:+6sju8gk8FRmSajX3Oz4G5Gm7P+mbqE9FVaXXFYTkCM= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U= -github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.0.0/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.0.0/go.mod h1:ceIuwmxDWptoW3eCqSXlnPsZFKh4X+R38dWPv7GS9Vs= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.0.0/go.mod h1:s1tW/At+xHqjNFvWU4G0c0Qv33KOhvbGNj0RCTQDV8s= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.2.0/go.mod h1:c+Lifp3EDEamAkPVzMooRNOK6CZjNSdEnf1A7jsI9u4= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.1.0/go.mod h1:7QJP7dr2wznCMeqIrhMgWGf7XpAQnVrJqDm9nvV3Cu4= -github.com/Azure/azure-service-bus-go v0.11.5/go.mod h1:MI6ge2CuQWBVq+ly456MY7XqNLJip5LO1iSFodbNLbU= -github.com/Azure/azure-storage-blob-go v0.14.0/go.mod h1:SMqIBi+SuiQH32bvyjngEewEeXoPfKMgWlBDaYf6fck= -github.com/Azure/go-amqp v0.16.0/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= -github.com/Azure/go-amqp v0.16.4/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest v0.11.19/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest v0.11.22/go.mod h1:BAWYUWGPEtKPzjVkp0Q6an0MJcJDsoh5Z1BFAEFs4Xs= -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/adal v0.9.14/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/adal v0.9.17/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= -github.com/Azure/go-autorest/autorest/azure/auth v0.5.9/go.mod h1:hg3/1yw0Bq87O3KvvnJoAh34/0zbP7SFizX/qN5JvjU= -github.com/Azure/go-autorest/autorest/azure/cli v0.4.2/go.mod h1:7qkJkT+j6b+hIpzMOwPChJhTqS8VbsqqgULzMNRugoM= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= -github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/AzureAD/microsoft-authentication-library-for-go v0.4.0/go.mod h1:Vt9sXTKwMyGcOxSmLDMnGPgqsUg7m8pe215qMLrDXw4= -github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/GoogleCloudPlatform/cloudsql-proxy v1.29.0/go.mod h1:spvB9eLJH9dutlbPSRmHvSXXHOwGRyeXh1jVdquA2G8= -github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c h1:RGWPOewvKIROun94nF7v2cua9qP+thov/7M50KEoeSU= -github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= -github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= -github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= -github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= -github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= -github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= -github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA= -github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/apache/arrow-go/v18 v18.0.0 h1:1dBDaSbH3LtulTyOVYaBCHO3yVRwjV+TZaqn3g6V7ZM= -github.com/apache/arrow-go/v18 v18.0.0/go.mod h1:t6+cWRSmKgdQ6HsxisQjok+jBpKGhRDiqcf3p0p/F+A= -github.com/apache/arrow/go/v12 v12.0.1 h1:JsR2+hzYYjgSUkBSaahpqCetqZMr76djX80fF/DiJbg= -github.com/apache/arrow/go/v12 v12.0.1/go.mod h1:weuTY7JvTG/HDPtMQxEUp7pU73vkLWMLpY67QwZ/WWw= -github.com/apache/thrift v0.0.0-20181112125854-24918abba929/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= -github.com/apache/thrift v0.21.0 h1:tdPmh/ptjE1IJnhbhrcl2++TauVjy242rkV/UzJChnE= -github.com/apache/thrift v0.21.0/go.mod h1:W1H8aR/QRtYNvrPeFXBtobyRkd0/YVhTc6i07XIAgDw= -github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= -github.com/aws/aws-sdk-go v1.30.19/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= -github.com/aws/aws-sdk-go v1.37.0/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go v1.43.31 h1:yJZIr8nMV1hXjAvvOLUFqZRJcHV7udPQBfhJqawDzI0= -github.com/aws/aws-sdk-go v1.43.31/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= -github.com/aws/aws-sdk-go-v2 v1.16.2/go.mod h1:ytwTPBG6fXTZLxxeeCCWj2/EMYp/xDUgX+OET6TLNNU= -github.com/aws/aws-sdk-go-v2 v1.23.0/go.mod h1:i1XDttT4rnf6vxc9AuskLc6s7XBee8rlLilKlc03uAA= -github.com/aws/aws-sdk-go-v2 v1.32.3 h1:T0dRlFBKcdaUPGNtkBSwHZxrtis8CQU17UpNBZYd0wk= -github.com/aws/aws-sdk-go-v2 v1.32.3/go.mod h1:2SK5n0a2karNTv5tbP1SjsX0uhttou00v/HpXKM1ZUo= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.1/go.mod h1:n8Bs1ElDD2wJ9kCRTczA83gYbBmjSwZp3umc6zF4EeM= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.1/go.mod h1:t8PYl/6LzdAqsU4/9tz28V/kU+asFePvpOMkdul0gEQ= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.6 h1:pT3hpW0cOHRJx8Y0DfJUEQuqPild8jRGmSFmBgvydr0= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.6/go.mod h1:j/I2++U0xX+cr44QjHay4Cvxj6FUbnxrgmqN3H1jTZA= -github.com/aws/aws-sdk-go-v2/config v1.15.3/go.mod h1:9YL3v07Xc/ohTsxFXzan9ZpFpdTOFl4X65BAKYaz8jg= -github.com/aws/aws-sdk-go-v2/config v1.25.3/go.mod h1:tAByZy03nH5jcq0vZmkcVoo6tRzRHEwSFx3QW4NmDw8= -github.com/aws/aws-sdk-go-v2/config v1.28.1 h1:oxIvOUXy8x0U3fR//0eq+RdCKimWI900+SV+10xsCBw= -github.com/aws/aws-sdk-go-v2/config v1.28.1/go.mod h1:bRQcttQJiARbd5JZxw6wG0yIK3eLeSCPdg6uqmmlIiI= -github.com/aws/aws-sdk-go-v2/credentials v1.11.2/go.mod h1:j8YsY9TXTm31k4eFhspiQicfXPLZ0gYXA50i4gxPE8g= -github.com/aws/aws-sdk-go-v2/credentials v1.16.2/go.mod h1:sDdvGhXrSVT5yzBDR7qXz+rhbpiMpUYfF3vJ01QSdrc= -github.com/aws/aws-sdk-go-v2/credentials v1.17.42 h1:sBP0RPjBU4neGpIYyx8mkU2QqLPl5u9cmdTWVzIpHkM= -github.com/aws/aws-sdk-go-v2/credentials v1.17.42/go.mod h1:FwZBfU530dJ26rv9saAbxa9Ej3eF/AK0OAY86k13n4M= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.3/go.mod h1:uk1vhHHERfSVCUnqSqz8O48LBYDSC+k6brng09jcMOk= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.4/go.mod h1:t4i+yGHMCcUNIX1x7YVYa6bH/Do7civ5I6cG/6PMfyA= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.18 h1:68jFVtt3NulEzojFesM/WVarlFpCaXLKaBxDpzkQ9OQ= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.18/go.mod h1:Fjnn5jQVIo6VyedMc0/EhPpfNlPl7dHV916O6B+49aE= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.3/go.mod h1:0dHuD2HZZSiwfJSy1FO5bX1hQ1TxVV1QXXjpn3XUE44= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.14.0/go.mod h1:UcgIwJ9KHquYxs6Q5skC9qXjhYMK+JASDYcXQ4X7JZE= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.35 h1:ihPPdcCVSN0IvBByXwqVp28/l4VosBZ6sDulcvU2J7w= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.35/go.mod h1:JkgEhs3SVF51Dj3m1Bj+yL8IznpxzkwlA3jLg3x7Kls= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.9/go.mod h1:AnVH5pvai0pAF4lXRq0bmhbes1u9R8wTE+g+183bZNM= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.3/go.mod h1:7sGSz1JCKHWWBHq98m6sMtWQikmYPpxjqOydDemiVoM= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.22 h1:Jw50LwEkVjuVzE1NzkhNKkBf9cRN7MtE1F/b2cOKTUM= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.22/go.mod h1:Y/SmAyPcOTmpeVaWSzSKiILfXTVJwrGmYZhcRbhWuEY= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.3/go.mod h1:ssOhaLpRlh88H3UmEcsBoVKq309quMvm3Ds8e9d4eJM= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.3/go.mod h1:ify42Rb7nKeDDPkFjKn7q1bPscVPu/+gmHH8d2c+anU= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.22 h1:981MHwBaRZM7+9QSR6XamDzF/o7ouUGxFzr+nVSIhrs= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.22/go.mod h1:1RA1+aBEfn+CAB/Mh0MB6LsdCYCnjZm7tKXtnk499ZQ= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.10/go.mod h1:8DcYQcz0+ZJaSxANlHIsbbi6S+zMwjwdDqwW3r9AzaE= -github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.3/go.mod h1:5yzAuE9i2RkVAttBl8yxZgQr5OCq4D5yDnG7j9x2L0U= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.22 h1:yV+hCAHZZYJQcwAaszoBNwLbPItHvApxT0kVIw6jRgs= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.22/go.mod h1:kbR1TL8llqB1eGnVbybcA4/wgScxdylOdyAd51yxPdw= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.1/go.mod h1:GeUru+8VzrTXV/83XyMJ80KpH8xO89VPoUileyNQ+tc= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1/go.mod h1:l9ymW25HOqymeU2m1gbUQ3rUIsTwKs8gYHXkqDQUhiI= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0 h1:TToQNkvGguu209puTojY/ozlqy2d/SFNcoLIqTFi42g= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0/go.mod h1:0jp+ltwkf+SwG2fm/PKo8t4y8pJSgOCO4D8Lz3k0aHQ= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.3/go.mod h1:Seb8KNmD6kVTjwRjVEgOT5hPin6sq+v4C2ycJQDwuH8= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.3/go.mod h1:R+/S1O4TYpcktbVwddeOYg+uwUfLhADP2S/x4QwsCTM= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.3 h1:kT6BcZsmMtNkP/iYMcRG+mIEA/IbeiUimXtGmqF39y0= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.3/go.mod h1:Z8uGua2k4PPaGOYn66pK02rhMrot3Xk3tpBuUFPomZU= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.3/go.mod h1:wlY6SVjuwvh3TVRpTqdy4I1JpBFLX4UGeKZdWntaocw= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.3/go.mod h1:Owv1I59vaghv1Ax8zz8ELY8DN7/Y0rGS+WWAmjgi950= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.3 h1:qcxX0JYlgWH3hpPUnd6U0ikcl6LLA9sLkXE2w1fpMvY= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.3/go.mod h1:cLSNEmI45soc+Ef8K/L+8sEA3A3pYFEYf5B5UI+6bH4= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.3/go.mod h1:Bm/v2IaN6rZ+Op7zX+bOUMdL4fsrYZiD0dsjLhNKwZc= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.3/go.mod h1:KZgs2ny8HsxRIRbDwgvJcHHBZPOzQr/+NtGwnP+w2ec= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.3 h1:ZC7Y/XgKUxwqcdhO5LE8P6oGP1eh6xlQReWNKfhvJno= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.3/go.mod h1:WqfO7M9l9yUAw0HcHaikwRd/H6gzYdz7vjejCA5e2oY= -github.com/aws/aws-sdk-go-v2/service/kms v1.16.3/go.mod h1:QuiHPBqlOFCi4LqdSskYYAWpQlx3PKmohy+rE2F+o5g= -github.com/aws/aws-sdk-go-v2/service/s3 v1.26.3/go.mod h1:g1qvDuRsJY+XghsV6zg00Z4KJ7DtFFCx8fJD2a491Ak= -github.com/aws/aws-sdk-go-v2/service/s3 v1.43.0/go.mod h1:NXRKkiRF+erX2hnybnVU660cYT5/KChRD4iUgJ97cI8= -github.com/aws/aws-sdk-go-v2/service/s3 v1.66.2 h1:p9TNFL8bFUMd+38YIpTAXpoxyz0MxC7FlbFEH4P4E1U= -github.com/aws/aws-sdk-go-v2/service/s3 v1.66.2/go.mod h1:fNjyo0Coen9QTwQLWeV6WO2Nytwiu+cCcWaTdKCAqqE= -github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.15.4/go.mod h1:PJc8s+lxyU8rrre0/4a0pn2wgwiDvOEzoOjcJUBr67o= -github.com/aws/aws-sdk-go-v2/service/sns v1.17.4/go.mod h1:kElt+uCcXxcqFyc+bQqZPFD9DME/eC6oHBXvFzQ9Bcw= -github.com/aws/aws-sdk-go-v2/service/sqs v1.18.3/go.mod h1:skmQo0UPvsjsuYYSYMVmrPc1HWCbHUJyrCEp+ZaLzqM= -github.com/aws/aws-sdk-go-v2/service/ssm v1.24.1/go.mod h1:NR/xoKjdbRJ+qx0pMR4mI+N/H1I1ynHwXnO6FowXJc0= -github.com/aws/aws-sdk-go-v2/service/sso v1.11.3/go.mod h1:7UQ/e69kU7LDPtY40OyoHYgRmgfGM4mgsLYtcObdveU= -github.com/aws/aws-sdk-go-v2/service/sso v1.17.2/go.mod h1:/pE21vno3q1h4bbhUOEi+6Zu/aT26UK2WKkDXd+TssQ= -github.com/aws/aws-sdk-go-v2/service/sso v1.24.3 h1:UTpsIf0loCIWEbrqdLb+0RxnTXfWh2vhw4nQmFi4nPc= -github.com/aws/aws-sdk-go-v2/service/sso v1.24.3/go.mod h1:FZ9j3PFHHAR+w0BSEjK955w5YD2UwB/l/H0yAK3MJvI= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.20.0/go.mod h1:dWqm5G767qwKPuayKfzm4rjzFmVjiBFbOJrpSPnAMDs= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.3 h1:2YCmIXv3tmiItw0LlYf6v7gEHebLY45kBEnPezbUKyU= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.3/go.mod h1:u19stRyNPxGhj6dRm+Cdgu6N75qnbW7+QN0q0dsAk58= -github.com/aws/aws-sdk-go-v2/service/sts v1.16.3/go.mod h1:bfBj0iVmsUyUg4weDB4NxktD9rDGeKSVWnjTnwbx9b8= -github.com/aws/aws-sdk-go-v2/service/sts v1.25.3/go.mod h1:4EqRHDCKP78hq3zOnmFXu5k0j4bXbRFfCh/zQ6KnEfQ= -github.com/aws/aws-sdk-go-v2/service/sts v1.32.3 h1:wVnQ6tigGsRqSWDEEyH6lSAJ9OyFUsSnbaUWChuSGzs= -github.com/aws/aws-sdk-go-v2/service/sts v1.32.3/go.mod h1:VZa9yTFyj4o10YGsmDO4gbQJUvvhY72fhumT8W4LqsE= -github.com/aws/smithy-go v1.11.2/go.mod h1:3xHYmszWVx2c0kIwQeEVf9uSm4fYZt67FBJnwub1bgM= -github.com/aws/smithy-go v1.17.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= -github.com/aws/smithy-go v1.22.0 h1:uunKnWlcoL3zO7q+gG2Pk53joueEOsnNB28QdMsmiMM= -github.com/aws/smithy-go v1.22.0/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/bobg/gcsobj v0.1.2/go.mod h1:vS49EQ1A1Ib8FgrL58C8xXYZyOCR2TgzAdopy6/ipa8= -github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= -github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -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/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/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= -github.com/colinmarc/hdfs/v2 v2.1.1/go.mod h1:M3x+k8UKKmxtFu++uAZ0OtDU8jR3jnaZIAc6yK4Ue0c= -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/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -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/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/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU= -github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= -github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= -github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= -github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= -github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -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/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= -github.com/gin-gonic/gin v1.7.3/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= -github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= -github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= -github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= -github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= -github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= -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-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= -github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= -github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= -github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= -github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= -github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA= -github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= -github.com/goccy/go-reflect v1.2.0 h1:O0T8rZCuNmGXewnATuKYnkL0xm6o8UNOJZd/gOkb9ms= -github.com/goccy/go-reflect v1.2.0/go.mod h1:n0oYZn8VcV2CkWTxi8B9QjkCoq6GTtCEdfmR66YhFtE= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.4.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= -github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188/go.mod h1:vXjM/+wXQnTPR4KqTKDgJukSZ6amVRtWMPEjE6sQoK8= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= -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/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/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -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.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -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/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/flatbuffers v24.3.25+incompatible h1:CX395cjN9Kke9mmalRoL3d81AtFUxJM+yDthflgJGkI= -github.com/google/flatbuffers v24.3.25+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -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.6/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.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -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/go-replayers/grpcreplay v1.1.0/go.mod h1:qzAvJ8/wi57zq7gWqaE6AwLM6miiXUQwP1S+I9icmhk= -github.com/google/go-replayers/httpreplay v1.1.1/go.mod h1:gN9GeLIs7l6NUoVaSSnv2RiqK1NiwAmD0MrKeC9IIks= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+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/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -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-20200905233945-acf8798be1f7/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-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210506205249-923b5ab0fc1a/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.2.0/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.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= -github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/wire v0.5.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU= -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.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hanwen/go-fuse v1.0.0/go.mod h1:unqXarDXqzAk0rt98O2tVndEPIpUgLD9+rwFisZH3Ok= -github.com/hanwen/go-fuse/v2 v2.1.0/go.mod h1:oRyA5eK+pvJyv5otpO/DgccS8y/RvYMaO00GgRLGryc= -github.com/hashicorp/go-uuid v0.0.0-20180228145832-27454136f036/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -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/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/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.11.0/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= -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/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.2.0/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-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= -github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/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.10.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.15.0/go.mod h1:D/zyOyXiaM1TmVWnOM18p0xdDtdakRBa0RsVGI3U3bw= -github.com/jackc/pgx/v5 v5.7.2 h1:mLoDLV6sonKlvjIEsV56SkWNCnuNv531l94GaIzO+XI= -github.com/jackc/pgx/v5 v5.7.2/go.mod h1:ncY89UGWxg82EykZUwSpUKEfccBGGYq1xjrOpsbsfGQ= -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.2.1 h1:gI8os0wpRXFd4FiAY2dWiqRK037tjj3t7rKFeO4X5iw= -github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= -github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= -github.com/jcmturner/gofork v0.0.0-20180107083740-2aebee971930/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= -github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= -github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -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/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= -github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= -github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= -github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= -github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= -github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= -github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= -github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM= -github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= -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/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -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/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -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.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/linkedin/goavro v2.1.0+incompatible h1:DV2aUlj2xZiuxQyvag8Dy7zjY69ENjS66bWkSfdpddY= -github.com/linkedin/goavro v2.1.0+incompatible/go.mod h1:bBCwI2eGYpUI/4820s67MElg9tdeLbINjLjiM2xZFYM= -github.com/marcboeker/go-duckdb v1.8.3 h1:ZkYwiIZhbYsT6MmJsZ3UPTHrTZccDdM4ztoqSlEMXiQ= -github.com/marcboeker/go-duckdb v1.8.3/go.mod h1:C9bYRE1dPYb1hhfu/SSomm78B0FXmNgRvv6YBW/Hooc= -github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= -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.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.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= -github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs= -github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= -github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI= -github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= -github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= -github.com/minio/minio-go/v7 v7.0.34/go.mod h1:nCrRzjoSUQh8hgKKtu3Y708OLvRLtuASMg2/nvmbarw= -github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -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/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= -github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= -github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= -github.com/ncw/swift v1.0.52/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -github.com/pborman/getopt v0.0.0-20180729010549-6fdd0a2c7117/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= -github.com/pganalyze/pg_query_go/v5 v5.1.0 h1:MlxQqHZnvA3cbRQYyIrjxEjzo560P6MyTgtlaf3pmXg= -github.com/pganalyze/pg_query_go/v5 v5.1.0/go.mod h1:FsglvxidZsVN+Ltw3Ai6nTgPVcK2BPukH3jCDEqc1Ug= -github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= -github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= -github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= -github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= -github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= -github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= -github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -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/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= -github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -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/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= -github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -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/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= -github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -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/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.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -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/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.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -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.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/xitongsys/parquet-go v1.5.1/go.mod h1:xUxwM8ELydxh4edHGegYq1pA8NnMKDx0K/GyB0o2bww= -github.com/xitongsys/parquet-go v1.6.3-0.20240813051905-693d3323dee0 h1:wAEO9MFUjoUeLi7ALYvAnBp9kZJDf6B0v48x37d+wqw= -github.com/xitongsys/parquet-go v1.6.3-0.20240813051905-693d3323dee0/go.mod h1:u9udtIEWeBkphB2isZ8V8xVIMWgcUobH+7FRMO/Ld6c= -github.com/xitongsys/parquet-go-source v0.0.0-20190524061010-2b72cbee77d5/go.mod h1:xxCx7Wpym/3QCo6JhujJX51dzSXrwmb0oH6FQb39SEA= -github.com/xitongsys/parquet-go-source v0.0.0-20200817004010-026bad9b25d0/go.mod h1:HYhIKsdns7xz80OgkbgJYrtQY7FjHWHKH6cvN7+czGE= -github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b h1:zbb5qM/t3N+O33Vp5sFyG6yIcWZV1q7rfEjJM8UsRBQ= -github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b/go.mod h1:2ActxmJ4q17Cdruar9nKEkzKSOL1Ol03737Bkz10rTY= -github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= -github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= -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.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= -github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= -github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= -github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= -github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= -go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0= -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.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -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/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -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.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= -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.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= -gocloud.dev v0.26.0/go.mod h1:mkUgejbnbLotorqDyvedJO20XcZNTynmSeVSQS9btVg= -golang.org/x/crypto v0.0.0-20180723164146-c126467f60eb/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -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-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/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-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-20211115234514-b4de73f9ece8/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220511200225-c6db032c6c88/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= -golang.org/x/crypto v0.35.0 h1:b15kiHdrGCHrP6LvwaQ3c03kgNhhiMgvlhxHQhmg2Xs= -golang.org/x/crypto v0.35.0/go.mod h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0YQ= -golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/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-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= -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-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= -golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 h1:e66Fs6Z+fZTbFBAxKfP3PALWBtpfqks2bwGcexMxgtk= -golang.org/x/exp v0.0.0-20240909161429-701f63a606c0/go.mod h1:2TbTHSBQa924w8M6Xs1QcRcFwyucIwBGpK1p2f1YFFY= -golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= -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/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -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/lint v0.0.0-20210508222113-6edffad5e616/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.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0= -golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= -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-20191112182307-2180aed22343/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-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -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-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211020060615-d418f374d309/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220401154927-543a649e0bdd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -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.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -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.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -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-20210220032951-036812b2e83c/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.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= -golang.org/x/sync v0.11.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-20191112214154-59a1497f0cea/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-20200828194041-157a740278f4/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-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/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-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/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-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220204135822-1c1b9b1eba6a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220330033206-e17cdc41300f/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-20220704084225-05e143d24a9e/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.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= -golang.org/x/sys v0.30.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/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -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.5/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.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= -golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= -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/time v0.0.0-20211116232009-f0f3c7e86c11/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220224211638-0e9765cccd65/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -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-20190206041539-40960b6deb8e/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-20190422233926-fe54fb35175b/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-20190927191325-030b2cf1153e/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-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-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-20200828161849-5deb26317202/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20200915173823-2db8f0ff891c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20200918232735-d647fc253266/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/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.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.26.0 h1:v/60pFQmzmT9ExmjDv2gGIfi3OqfKoEP6I5+umXlbnQ= -golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0= -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= -golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= -golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= -gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= -gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA= -gonum.org/v1/gonum v0.15.1 h1:FNy7N6OUZVUaWG9pTiD+jlhdQ3lMP+/LcTpJ6+a8sQ0= -gonum.org/v1/gonum v0.15.1/go.mod h1:eZTZuRFrzu5pcyjN5wJhcIhnUdNijYxX1T2IcrOGY0o= -gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= -gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= -gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo= -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.31.0/go.mod h1:CL+9IBCa2WWU6gRuBWaKqGWLFFwbEUXkfeMkHLQWYWo= -google.golang.org/api v0.32.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -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.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.46.0/go.mod h1:ceL4oozhkAiTID8XMmJBsIxID/9wMXJVVFXPg4ylg3I= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.58.0/go.mod h1:cAbP2FsxoGVNwtgNAmmn3y5G1TWAiVYRmg4yku3lv+E= -google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.64.0/go.mod h1:931CdxA8Rm4t6zqTFGSsgwbAEZ2+GMYurbndwSimebM= -google.golang.org/api v0.66.0/go.mod h1:I1dmXYpX7HGwz/ejRxwQp2qj5bFAz93HiCU1C1oYd9M= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.68.0/go.mod h1:sOM8pTpwgflXRhz+oC8H2Dr+UcbMqkPPWNJo88Q7TH8= -google.golang.org/api v0.69.0/go.mod h1:boanBiw+h5c3s+tBPgEzLDRHfFLWV0qXxRHz3ws7C80= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -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/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-20200513103714-09dca8ec2884/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-20200831141814-d751682dd103/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-20200914193844-75d14daec038/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200921151605-7abf4a1a14d5/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-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210429181445-86c259c2b4ab/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210517163617-5e0236093d7a/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210921142501-181ce0d877f6/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211018162055-cf77aa76bad2/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211223182754-3ac035c7e7cb/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220111164026-67b88f271998/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220114231437-d2e6a121cae0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220201184016-50beb8ab5c44/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220204002441-d6cc3cc0770e/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220211171837-173942840c17/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220216160803-4663080d8bc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220401170504-314d38edb7de/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -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.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -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.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= -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.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= -google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= -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-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= -gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= -gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q= -gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mNfM5bm88whjWx4= -gopkg.in/jcmturner/gokrb5.v7 v7.3.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= -gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8= -gopkg.in/linkedin/goavro.v1 v1.0.5 h1:BJa69CDh0awSsLUmZ9+BowBdokpduDZSM9Zk8oKHfN4= -gopkg.in/linkedin/goavro.v1 v1.0.5/go.mod h1:Aw5GdAbizjOEl0kAMHV9iHmA8reZzW/OKuJAl4Hb9F0= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/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/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= -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= -honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= -lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= -lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= -modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/cc/v3 v3.36.2/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/cc/v3 v3.37.0/go.mod h1:vtL+3mdHx/wcj3iEGz84rQa8vEqR6XM84v5Lcvfph20= -modernc.org/cc/v3 v3.40.0/go.mod h1:/bTg4dnWkSXowUO6ssQKnOV0yMVxDYNIsIrzqTFDGH0= -modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc= -modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw= -modernc.org/ccgo/v3 v3.0.0-20220904174949-82d86e1b6d56/go.mod h1:YSXjPL62P2AMSxBphRHPn7IkzhVHqkvOnRKAKh+W6ZI= -modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= -modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= -modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws= -modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo= -modernc.org/ccgo/v3 v3.16.13-0.20221017192402-261537637ce8/go.mod h1:fUB3Vn0nVPReA+7IG7yZDfjv1TMWjhQP8gCxrFAtL5g= -modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY= -modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= -modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= -modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= -modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A= -modernc.org/libc v1.16.1/go.mod h1:JjJE0eu4yeK7tab2n4S1w8tlWd9MxXLRzheaRnAKymU= -modernc.org/libc v1.16.17/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU= -modernc.org/libc v1.16.19/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= -modernc.org/libc v1.17.0/go.mod h1:XsgLldpP4aWlPlsjqKRdHPqCxCjISdHfM/yeWC5GyW0= -modernc.org/libc v1.17.4/go.mod h1:WNg2ZH56rDEwdropAJeZPQkXmDwh+JCA1s/htl6r2fA= -modernc.org/libc v1.18.0/go.mod h1:vj6zehR5bfc98ipowQOM2nIDUZnVew/wNC/2tOGS+q0= -modernc.org/libc v1.20.3/go.mod h1:ZRfIaEkgrYgZDl6pa4W39HgN5G/yDW+NRmNKZBDFrk0= -modernc.org/libc v1.21.4/go.mod h1:przBsL5RDOZajTVslkugzLBj1evTue36jEomFQOoYuI= -modernc.org/libc v1.22.2/go.mod h1:uvQavJ1pZ0hIoC/jfqNoMLURIMhKzINIWypNM17puug= -modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= -modernc.org/memory v1.2.0/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= -modernc.org/memory v1.3.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= -modernc.org/memory v1.4.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= -modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= -modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/sqlite v1.18.2/go.mod h1:kvrTLEWgxUcHa2GfHBQtanR1H9ht3hTJNtKpzH9k1u0= -modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= -modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= -modernc.org/tcl v1.13.2/go.mod h1:7CLiGIPo1M8Rv1Mitpv5akc2+8fxUd2y2UzC/MfMzy0= -modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -modernc.org/token v1.0.1/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= -nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= -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/src/iceberg_reader.go b/src/iceberg_reader.go deleted file mode 100644 index 92fdd3f..0000000 --- a/src/iceberg_reader.go +++ /dev/null @@ -1,43 +0,0 @@ -package main - -import ( - "io" -) - -type IcebergReader struct { - config *Config - storage StorageInterface -} - -func NewIcebergReader(config *Config) *IcebergReader { - storage := NewStorage(config) - return &IcebergReader{config: config, storage: storage} -} - -func (reader *IcebergReader) Schemas() (icebergSchemas []string, err error) { - LogDebug(reader.config, "Reading Iceberg schemas...") - return reader.storage.IcebergSchemas() -} - -func (reader *IcebergReader) SchemaTables() (icebergSchemaTables Set[IcebergSchemaTable], err error) { - LogDebug(reader.config, "Reading Iceberg tables...") - return reader.storage.IcebergSchemaTables() -} - -func (reader *IcebergReader) TableFields(icebergSchemaTable IcebergSchemaTable) (icebergTableFields []IcebergTableField, err error) { - LogDebug(reader.config, "Reading Iceberg table "+icebergSchemaTable.String()+" fields...") - return reader.storage.IcebergTableFields(icebergSchemaTable) -} - -func (reader *IcebergReader) MetadataFilePath(icebergSchemaTable IcebergSchemaTable) string { - return reader.storage.IcebergMetadataFilePath(icebergSchemaTable) -} - -func (reader *IcebergReader) InternalTableMetadata(pgSchemaTable PgSchemaTable) (internalTableMetadata InternalTableMetadata, err error) { - LogDebug(reader.config, "Reading internal table metadata for "+pgSchemaTable.String()+"...") - return reader.storage.InternalTableMetadata(pgSchemaTable) -} - -func (reader *IcebergReader) InternalStartSqlFile() io.ReadCloser { - return reader.storage.InternalStartSqlFile() -} diff --git a/src/iceberg_writer.go b/src/iceberg_writer.go deleted file mode 100644 index 65b6818..0000000 --- a/src/iceberg_writer.go +++ /dev/null @@ -1,23 +0,0 @@ -package main - -type IcebergWriter struct { - config *Config - storage StorageInterface -} - -func NewIcebergWriter(config *Config) *IcebergWriter { - storage := NewStorage(config) - return &IcebergWriter{config: config, storage: storage} -} - -func (writer *IcebergWriter) DeleteSchema(icebergSchema string) (err error) { - return writer.storage.DeleteSchema(icebergSchema) -} - -func (writer *IcebergWriter) DeleteSchemaTable(icebergSchemaTable IcebergSchemaTable) (err error) { - return writer.storage.DeleteSchemaTable(icebergSchemaTable) -} - -func (writer *IcebergWriter) WriteInternalStartSqlFile(queries []string) (err error) { - return writer.storage.WriteInternalStartSqlFile(queries) -} diff --git a/src/iceberg_writer_table.go b/src/iceberg_writer_table.go deleted file mode 100644 index 1541845..0000000 --- a/src/iceberg_writer_table.go +++ /dev/null @@ -1,189 +0,0 @@ -package main - -type IcebergWriterTable struct { - config *Config - schemaTable IcebergSchemaTable - storage StorageInterface - pgSchemaColumns []PgSchemaColumn - dynamicRowCountPerBatch int - maxParquetPayloadThreshold int - continuedRefresh bool -} - -func NewIcebergWriterTable( - config *Config, - schemaTable IcebergSchemaTable, - pgSchemaColumns []PgSchemaColumn, - dynamicRowCountPerBatch int, - maxParquetPayloadThreshold int, - continuedRefresh bool, -) *IcebergWriterTable { - return &IcebergWriterTable{ - config: config, - schemaTable: schemaTable, - pgSchemaColumns: pgSchemaColumns, - dynamicRowCountPerBatch: dynamicRowCountPerBatch, - maxParquetPayloadThreshold: maxParquetPayloadThreshold, - continuedRefresh: continuedRefresh, - storage: NewStorage(config), - } -} - -func (writer *IcebergWriterTable) Write(loadRows func() ([][]string, InternalTableMetadata)) { - dataDirPath := writer.storage.CreateDataDir(writer.schemaTable) - metadataDirPath := writer.storage.CreateMetadataDir(writer.schemaTable) - - var lastSequenceNumber int - newManifestListItemsSortedDesc := []ManifestListItem{} - existingManifestListItemsSortedDesc := []ManifestListItem{} - finalManifestListFilesSortedAsc := []ManifestListFile{} - - if writer.continuedRefresh { - existingManifestListFilesSortedAsc, err := writer.storage.ExistingManifestListFiles(metadataDirPath) - PanicIfError(writer.config, err) - - existingManifestListItemsSortedDesc, err = writer.storage.ExistingManifestListItems(existingManifestListFilesSortedAsc[len(existingManifestListFilesSortedAsc)-1]) - PanicIfError(writer.config, err) - - lastSequenceNumber = existingManifestListItemsSortedDesc[0].SequenceNumber - finalManifestListFilesSortedAsc = existingManifestListFilesSortedAsc - } - - var firstNewParquetFile ParquetFile - var newParquetCount int - loadMoreRows := true - - for loadMoreRows { - newParquetFile, newInternalTableMetadata, err := writer.storage.CreateParquet( - dataDirPath, - writer.pgSchemaColumns, - writer.maxParquetPayloadThreshold, - loadRows, - ) - PanicIfError(writer.config, err) - - // If Parquet is empty and we are continuing to refresh / process subsequent chunks, delete it, mark the sync as completed and exit (no trailing Parquet files) - if newParquetFile.RecordCount == 0 && (writer.continuedRefresh || newParquetCount > 0) { - err = writer.storage.DeleteParquet(newParquetFile) - PanicIfError(writer.config, err) - - err = writer.storage.WriteInternalTableMetadata(metadataDirPath, newInternalTableMetadata) - PanicIfError(writer.config, err) - - return - } - - newParquetCount++ - if firstNewParquetFile.Path == "" { - firstNewParquetFile = newParquetFile - } - - if writer.continuedRefresh { - var overwrittenManifestListFilesSortedAsc []ManifestListFile - - existingManifestListItemsSortedDesc, overwrittenManifestListFilesSortedAsc, lastSequenceNumber = writer.overwriteExistingFiles( - dataDirPath, - metadataDirPath, - existingManifestListItemsSortedDesc, - newParquetFile, - firstNewParquetFile, - lastSequenceNumber, - ) - - finalManifestListFilesSortedAsc = append(finalManifestListFilesSortedAsc, overwrittenManifestListFilesSortedAsc...) - } - - newManifestFile, err := writer.storage.CreateManifest(metadataDirPath, newParquetFile) - PanicIfError(writer.config, err) - - lastSequenceNumber++ - newManifestListItem := ManifestListItem{SequenceNumber: lastSequenceNumber, ManifestFile: newManifestFile} - newManifestListItemsSortedDesc = append([]ManifestListItem{newManifestListItem}, newManifestListItemsSortedDesc...) - - finalManifestListItemsSortedDesc := append(newManifestListItemsSortedDesc, existingManifestListItemsSortedDesc...) - newManifestListFile, err := writer.storage.CreateManifestList(metadataDirPath, firstNewParquetFile.Uuid, finalManifestListItemsSortedDesc) - PanicIfError(writer.config, err) - - finalManifestListFilesSortedAsc = append(finalManifestListFilesSortedAsc, newManifestListFile) - _, err = writer.storage.CreateMetadata(metadataDirPath, writer.pgSchemaColumns, finalManifestListFilesSortedAsc) - PanicIfError(writer.config, err) - - err = writer.storage.WriteInternalTableMetadata(metadataDirPath, newInternalTableMetadata) - PanicIfError(writer.config, err) - - loadMoreRows = newInternalTableMetadata.IsInProgress() - LogDebug(writer.config, "Written", newParquetCount, "Parquet file(s). Load more rows:", loadMoreRows) - } -} - -func (writer *IcebergWriterTable) overwriteExistingFiles( - dataDirPath string, - metadataDirPath string, - originalExistingManifestListItemsSortedDesc []ManifestListItem, - newParquetFile ParquetFile, - firstNewParquetFile ParquetFile, - originalLastSequenceNumber int, -) (existingManifestListItemsSortedDesc []ManifestListItem, overwrittenManifestListFilesSortedAsc []ManifestListFile, lastSequenceNumber int) { - originalExistingManifestListItemsSortedAsc := Reverse(originalExistingManifestListItemsSortedDesc) - lastSequenceNumber = originalLastSequenceNumber - - for i, existingManifestListItem := range originalExistingManifestListItemsSortedAsc { - existingManifestFile := existingManifestListItem.ManifestFile - existingParquetFilePath, err := writer.storage.ExistingParquetFilePath(existingManifestFile) - PanicIfError(writer.config, err) - - overwrittenParquetFile, err := writer.storage.CreateOverwrittenParquet(dataDirPath, existingParquetFilePath, newParquetFile.Path, writer.pgSchemaColumns, writer.dynamicRowCountPerBatch) - PanicIfError(writer.config, err) - - // Keep as is if no overlapping records found - if overwrittenParquetFile.Path == "" { - LogDebug(writer.config, "No overlapping records found") - existingManifestListItemsSortedDesc = append([]ManifestListItem{existingManifestListItem}, existingManifestListItemsSortedDesc...) - continue - } - - if overwrittenParquetFile.RecordCount == 0 { - // DELETE - LogDebug(writer.config, "Deleting", existingManifestFile.RecordCount, "record(s)...") - - deletedRecsManifestFile, err := writer.storage.CreateDeletedRecordsManifest(metadataDirPath, overwrittenParquetFile.Uuid, existingManifestFile) - PanicIfError(writer.config, err) - - // Constructing a new manifest list without the previous manifest file and with the new "deleted" manifest file - finalManifestListItemsSortedAsc := []ManifestListItem{} - for j, existingItem := range originalExistingManifestListItemsSortedAsc { - if i != j { - finalManifestListItemsSortedAsc = append(finalManifestListItemsSortedAsc, existingItem) - } - } - lastSequenceNumber++ - overwrittenManifestListItem := ManifestListItem{SequenceNumber: lastSequenceNumber, ManifestFile: deletedRecsManifestFile} - finalManifestListItemsSortedAsc = append(finalManifestListItemsSortedAsc, overwrittenManifestListItem) - - overwrittenManifestList, err := writer.storage.CreateManifestList(metadataDirPath, firstNewParquetFile.Uuid, Reverse(finalManifestListItemsSortedAsc)) - PanicIfError(writer.config, err) - overwrittenManifestListFilesSortedAsc = append(overwrittenManifestListFilesSortedAsc, overwrittenManifestList) - continue - } else { - // UPDATE (overwrite) - LogDebug(writer.config, "Overwritting", existingManifestFile.RecordCount, "record(s) with", overwrittenParquetFile.RecordCount, "record(s)...") - - deletedRecsManifestFile, err := writer.storage.CreateDeletedRecordsManifest(metadataDirPath, overwrittenParquetFile.Uuid, existingManifestFile) - PanicIfError(writer.config, err) - - overwrittenManifestFile, err := writer.storage.CreateManifest(metadataDirPath, overwrittenParquetFile) - PanicIfError(writer.config, err) - - lastSequenceNumber++ - overwrittenManifestListItem := ManifestListItem{SequenceNumber: lastSequenceNumber, ManifestFile: overwrittenManifestFile} - deletedRecsManifestListItem := ManifestListItem{SequenceNumber: lastSequenceNumber, ManifestFile: deletedRecsManifestFile} - overwrittenManifestList, err := writer.storage.CreateManifestList(metadataDirPath, firstNewParquetFile.Uuid, []ManifestListItem{overwrittenManifestListItem, deletedRecsManifestListItem}) - PanicIfError(writer.config, err) - - existingManifestListItemsSortedDesc = append([]ManifestListItem{overwrittenManifestListItem}, existingManifestListItemsSortedDesc...) - overwrittenManifestListFilesSortedAsc = append(overwrittenManifestListFilesSortedAsc, overwrittenManifestList) - } - } - - return existingManifestListItemsSortedDesc, overwrittenManifestListFilesSortedAsc, lastSequenceNumber -} diff --git a/src/iceberg_writer_table_test.go b/src/iceberg_writer_table_test.go deleted file mode 100644 index 5e93e63..0000000 --- a/src/iceberg_writer_table_test.go +++ /dev/null @@ -1,1445 +0,0 @@ -package main - -import ( - "context" - "testing" -) - -var TEST_ICEBERG_WRITER_SCHEMA_TABLE = IcebergSchemaTable{ - Schema: "iceberg_writer_test", - Table: "test_table", -} -var TEST_ICEBERG_WRITER_PG_SCHEMA_COLUMNS = []PgSchemaColumn{ - {ColumnName: "id", DataType: "integer", UdtName: "int4", IsNullable: "NO", NumericPrecision: "32", OrdinalPosition: "1", Namespace: "pg_catalog", PartOfPrimaryKey: true}, - {ColumnName: "name", DataType: "character varying", UdtName: "varchar", IsNullable: "YES", CharacterMaximumLength: "255", OrdinalPosition: "2", Namespace: "pg_catalog"}, -} -var TEST_ICEBERG_WRITER_INITIAL_ROWS = [][]string{ - {"1", "John"}, - {"2", PG_NULL_STRING}, -} -var TEST_XMIN0 = uint32(0) -var TEST_XMIN1 = uint32(1) - -func TestWriteFull(t *testing.T) { - config := loadTestConfig() - duckdb := NewDuckdb(config, true) - defer duckdb.Close() - - t.Run("Processes a full sync with a single Parquet file", withTestIcebergTableWriter(config, func(t *testing.T, icebergTableWriter *IcebergWriterTable) { - icebergTableWriter.Write(createTestLoadRows(RefreshModeFull, TEST_ICEBERG_WRITER_INITIAL_ROWS)) - - testManifestListFiles(t, icebergTableWriter.storage, - ManifestListFile{SequenceNumber: 1, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ) - testRecords(t, duckdb, [][]string{ - {"1", "John"}, - {"2", PG_NULL_STRING}, - }) - testInternalTableMetadata(t, icebergTableWriter.storage, - InternalTableMetadata{LastSyncedAt: 123, LastRefreshMode: RefreshModeFull, MaxXmin: &TEST_XMIN1}, - ) - })) - - t.Run("Processes a full sync with two Parquet files", withTestIcebergTableWriter(config, func(t *testing.T, icebergTableWriter *IcebergWriterTable) { - icebergTableWriter.maxParquetPayloadThreshold = 1 - - icebergTableWriter.Write(createTestLoadRowsByOne(RefreshModeFull, TEST_ICEBERG_WRITER_INITIAL_ROWS)) - - testManifestListFiles(t, icebergTableWriter.storage, - ManifestListFile{SequenceNumber: 1, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 2, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ) - testRecords(t, duckdb, [][]string{ - {"1", "John"}, - {"2", PG_NULL_STRING}, - }) - testInternalTableMetadata(t, icebergTableWriter.storage, - InternalTableMetadata{LastSyncedAt: 123, LastRefreshMode: RefreshModeFull, MaxXmin: &TEST_XMIN1}, - ) - })) - - t.Run("Continues and processes a full in-progress sync", withTestIcebergTableWriter(config, func(t *testing.T, icebergTableWriter *IcebergWriterTable) { - icebergTableWriter.Write(createTestLoadRows(RefreshModeFull, TEST_ICEBERG_WRITER_INITIAL_ROWS)) - overrideTestInternalTableMetadata(t, icebergTableWriter.storage, InternalTableMetadata{ - LastSyncedAt: 111, - LastRefreshMode: RefreshModeFullInProgress, - MaxXmin: &TEST_XMIN0, - }) - icebergTableWriter.continuedRefresh = true - - icebergTableWriter.Write(createTestLoadRows(RefreshModeFull, [][]string{ - {"3", "Jane"}, - })) - - testManifestListFiles(t, icebergTableWriter.storage, - ManifestListFile{SequenceNumber: 1, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ManifestListFile{SequenceNumber: 2, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ) - testRecords(t, duckdb, [][]string{ - {"1", "John"}, - {"2", PG_NULL_STRING}, - {"3", "Jane"}, - }) - testInternalTableMetadata(t, icebergTableWriter.storage, - InternalTableMetadata{LastSyncedAt: 123, LastRefreshMode: RefreshModeFull, MaxXmin: &TEST_XMIN1}, - ) - })) -} - -func TestWriteIncremental(t *testing.T) { - config := loadTestConfig() - duckdb := NewDuckdb(config, true) - defer duckdb.Close() - - t.Run("Single incremental sync", func(t *testing.T) { - t.Run("Processes an incremental INSERT", withTestIcebergTableWriter(config, func(t *testing.T, icebergTableWriter *IcebergWriterTable) { - icebergTableWriter.Write(createTestLoadRows(RefreshModeFull, TEST_ICEBERG_WRITER_INITIAL_ROWS)) - icebergTableWriter.continuedRefresh = true - - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"3", "Jane"}, - })) - - testManifestListFiles(t, icebergTableWriter.storage, - ManifestListFile{SequenceNumber: 1, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ManifestListFile{SequenceNumber: 2, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ) - testRecords(t, duckdb, [][]string{ - {"1", "John"}, - {"2", PG_NULL_STRING}, - {"3", "Jane"}, - }) - testInternalTableMetadata(t, icebergTableWriter.storage, - InternalTableMetadata{LastSyncedAt: 123, LastRefreshMode: RefreshModeIncremental, MaxXmin: &TEST_XMIN1}, - ) - })) - - t.Run("Processes an incremental no-op sync", withTestIcebergTableWriter(config, func(t *testing.T, icebergTableWriter *IcebergWriterTable) { - icebergTableWriter.Write(createTestLoadRows(RefreshModeFull, TEST_ICEBERG_WRITER_INITIAL_ROWS)) - icebergTableWriter.continuedRefresh = true - - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{})) - - testManifestListFiles(t, icebergTableWriter.storage, - ManifestListFile{SequenceNumber: 1, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ) - testRecords(t, duckdb, [][]string{ - {"1", "John"}, - {"2", PG_NULL_STRING}, - }) - testInternalTableMetadata(t, icebergTableWriter.storage, - InternalTableMetadata{LastSyncedAt: 123, LastRefreshMode: RefreshModeIncremental, MaxXmin: &TEST_XMIN1}, - ) - })) - - t.Run("Processes an incremental INSERT with two Parquet files", withTestIcebergTableWriter(config, func(t *testing.T, icebergTableWriter *IcebergWriterTable) { - icebergTableWriter.Write(createTestLoadRows(RefreshModeFull, TEST_ICEBERG_WRITER_INITIAL_ROWS)) - icebergTableWriter.continuedRefresh = true - icebergTableWriter.maxParquetPayloadThreshold = 1 - - icebergTableWriter.Write(createTestLoadRowsByOne(RefreshModeIncremental, [][]string{ - {"3", "Jane"}, - {"4", "Alice"}, - })) - - testManifestListFiles(t, icebergTableWriter.storage, - ManifestListFile{SequenceNumber: 1, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ManifestListFile{SequenceNumber: 2, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 3, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ) - testRecords(t, duckdb, [][]string{ - {"1", "John"}, - {"2", PG_NULL_STRING}, - {"3", "Jane"}, - {"4", "Alice"}, - }) - testInternalTableMetadata(t, icebergTableWriter.storage, - InternalTableMetadata{LastSyncedAt: 123, LastRefreshMode: RefreshModeIncremental, MaxXmin: &TEST_XMIN1}, - ) - })) - - t.Run("Processes an incremental UPDATE", withTestIcebergTableWriter(config, func(t *testing.T, icebergTableWriter *IcebergWriterTable) { - icebergTableWriter.Write(createTestLoadRows(RefreshModeFull, TEST_ICEBERG_WRITER_INITIAL_ROWS)) - icebergTableWriter.continuedRefresh = true - - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"1", "John Doe"}, - })) - - testManifestListFiles(t, icebergTableWriter.storage, - ManifestListFile{SequenceNumber: 1, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ManifestListFile{SequenceNumber: 2, Operation: "overwrite", DeletedDataFiles: 1, DeletedRecords: 2, AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 3, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ) - testRecords(t, duckdb, [][]string{ - {"1", "John Doe"}, - {"2", PG_NULL_STRING}, - }) - testInternalTableMetadata(t, icebergTableWriter.storage, - InternalTableMetadata{LastSyncedAt: 123, LastRefreshMode: RefreshModeIncremental, MaxXmin: &TEST_XMIN1}, - ) - })) - - t.Run("Processes an incremental UPDATE with two Parquet files", withTestIcebergTableWriter(config, func(t *testing.T, icebergTableWriter *IcebergWriterTable) { - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"1", "John"}, - {"2", PG_NULL_STRING}, - {"3", "Alice"}, - })) - icebergTableWriter.continuedRefresh = true - icebergTableWriter.maxParquetPayloadThreshold = 1 - - icebergTableWriter.Write(createTestLoadRowsByOne(RefreshModeIncremental, [][]string{ - {"1", "John Doe"}, - {"2", "Jane"}, - })) - - testManifestListFiles(t, icebergTableWriter.storage, - ManifestListFile{SequenceNumber: 1, Operation: "append", AddedDataFiles: 1, AddedRecords: 3}, - ManifestListFile{SequenceNumber: 2, Operation: "overwrite", DeletedDataFiles: 1, DeletedRecords: 3, AddedDataFiles: 1, AddedRecords: 2}, - ManifestListFile{SequenceNumber: 3, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 4, Operation: "overwrite", DeletedDataFiles: 1, DeletedRecords: 2, AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 5, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ) - testRecords(t, duckdb, [][]string{ - {"1", "John Doe"}, - {"2", "Jane"}, - {"3", "Alice"}, - }) - testInternalTableMetadata(t, icebergTableWriter.storage, - InternalTableMetadata{LastSyncedAt: 123, LastRefreshMode: RefreshModeIncremental, MaxXmin: &TEST_XMIN1}, - ) - })) - - t.Run("Processes an incremental full UPDATE", withTestIcebergTableWriter(config, func(t *testing.T, icebergTableWriter *IcebergWriterTable) { - icebergTableWriter.Write(createTestLoadRows(RefreshModeFull, TEST_ICEBERG_WRITER_INITIAL_ROWS)) - icebergTableWriter.continuedRefresh = true - - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"1", "John Doe"}, - {"2", "Jane"}, - })) - - testManifestListFiles(t, icebergTableWriter.storage, - ManifestListFile{SequenceNumber: 1, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ManifestListFile{SequenceNumber: 2, Operation: "delete", DeletedDataFiles: 1, DeletedRecords: 2}, - ManifestListFile{SequenceNumber: 3, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ) - testRecords(t, duckdb, [][]string{ - {"1", "John Doe"}, - {"2", "Jane"}, - }) - testInternalTableMetadata(t, icebergTableWriter.storage, - InternalTableMetadata{LastSyncedAt: 123, LastRefreshMode: RefreshModeIncremental, MaxXmin: &TEST_XMIN1}, - ) - })) - - t.Run("Processes an incremental full UPDATE with three Parquet files", withTestIcebergTableWriter(config, func(t *testing.T, icebergTableWriter *IcebergWriterTable) { - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"1", "John"}, - {"2", PG_NULL_STRING}, - {"3", "Alice"}, - })) - icebergTableWriter.continuedRefresh = true - icebergTableWriter.maxParquetPayloadThreshold = 1 - - icebergTableWriter.Write(createTestLoadRowsByOne(RefreshModeIncremental, [][]string{ - {"1", "John Doe"}, - {"2", "Jane"}, - {"3", "Bob"}, - })) - - testManifestListFiles(t, icebergTableWriter.storage, - ManifestListFile{SequenceNumber: 1, Operation: "append", AddedDataFiles: 1, AddedRecords: 3}, - ManifestListFile{SequenceNumber: 2, Operation: "overwrite", DeletedDataFiles: 1, DeletedRecords: 3, AddedDataFiles: 1, AddedRecords: 2}, - ManifestListFile{SequenceNumber: 3, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 4, Operation: "overwrite", DeletedDataFiles: 1, DeletedRecords: 2, AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 5, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 6, Operation: "delete", DeletedDataFiles: 1, DeletedRecords: 1}, - ManifestListFile{SequenceNumber: 7, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ) - testRecords(t, duckdb, [][]string{ - {"1", "John Doe"}, - {"2", "Jane"}, - {"3", "Bob"}, - }) - testInternalTableMetadata(t, icebergTableWriter.storage, - InternalTableMetadata{LastSyncedAt: 123, LastRefreshMode: RefreshModeIncremental, MaxXmin: &TEST_XMIN1}, - ) - })) - - t.Run("Processes an incremental INSERT & UPDATE", withTestIcebergTableWriter(config, func(t *testing.T, icebergTableWriter *IcebergWriterTable) { - icebergTableWriter.Write(createTestLoadRows(RefreshModeFull, TEST_ICEBERG_WRITER_INITIAL_ROWS)) - icebergTableWriter.continuedRefresh = true - - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"1", "John Doe"}, - {"3", "Jane"}, - })) - - testManifestListFiles(t, icebergTableWriter.storage, - ManifestListFile{SequenceNumber: 1, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ManifestListFile{SequenceNumber: 2, Operation: "overwrite", DeletedDataFiles: 1, DeletedRecords: 2, AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 3, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ) - testRecords(t, duckdb, [][]string{ - {"1", "John Doe"}, - {"2", PG_NULL_STRING}, - {"3", "Jane"}, - }) - testInternalTableMetadata(t, icebergTableWriter.storage, - InternalTableMetadata{LastSyncedAt: 123, LastRefreshMode: RefreshModeIncremental, MaxXmin: &TEST_XMIN1}, - ) - })) - - t.Run("Processes an incremental INSERT & full UPDATE", withTestIcebergTableWriter(config, func(t *testing.T, icebergTableWriter *IcebergWriterTable) { - icebergTableWriter.Write(createTestLoadRows(RefreshModeFull, TEST_ICEBERG_WRITER_INITIAL_ROWS)) - icebergTableWriter.continuedRefresh = true - - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"1", "John Doe"}, - {"2", "Jane"}, - {"3", "Alice"}, - })) - - testManifestListFiles(t, icebergTableWriter.storage, - ManifestListFile{SequenceNumber: 1, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ManifestListFile{SequenceNumber: 2, Operation: "delete", DeletedDataFiles: 1, DeletedRecords: 2}, - ManifestListFile{SequenceNumber: 3, Operation: "append", AddedDataFiles: 1, AddedRecords: 3}, - ) - testRecords(t, duckdb, [][]string{ - {"1", "John Doe"}, - {"2", "Jane"}, - {"3", "Alice"}, - }) - testInternalTableMetadata(t, icebergTableWriter.storage, - InternalTableMetadata{LastSyncedAt: 123, LastRefreshMode: RefreshModeIncremental, MaxXmin: &TEST_XMIN1}, - ) - })) - - t.Run("Continues and processes an incremental INSERT in-progress sync with the same rows (same xmins)", withTestIcebergTableWriter(config, func(t *testing.T, icebergTableWriter *IcebergWriterTable) { - icebergTableWriter.Write(createTestLoadRows(RefreshModeFull, TEST_ICEBERG_WRITER_INITIAL_ROWS)) - overrideTestInternalTableMetadata(t, icebergTableWriter.storage, InternalTableMetadata{ - LastSyncedAt: 111, - LastRefreshMode: RefreshModeIncrementalInProgress, - MaxXmin: &TEST_XMIN0, - }) - icebergTableWriter.continuedRefresh = true - - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"2", PG_NULL_STRING}, - {"3", "Alice"}, - })) - - testManifestListFiles(t, icebergTableWriter.storage, - ManifestListFile{SequenceNumber: 1, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ManifestListFile{SequenceNumber: 2, Operation: "overwrite", DeletedDataFiles: 1, DeletedRecords: 2, AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 3, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ) - testRecords(t, duckdb, [][]string{ - {"1", "John"}, - {"2", PG_NULL_STRING}, - {"3", "Alice"}, - }) - testInternalTableMetadata(t, icebergTableWriter.storage, - InternalTableMetadata{LastSyncedAt: 123, LastRefreshMode: RefreshModeIncremental, MaxXmin: &TEST_XMIN1}, - ) - })) - - t.Run("Continues and processes an incremental INSERT & UPDATE in-progress sync", withTestIcebergTableWriter(config, func(t *testing.T, icebergTableWriter *IcebergWriterTable) { - icebergTableWriter.Write(createTestLoadRows(RefreshModeFull, TEST_ICEBERG_WRITER_INITIAL_ROWS)) - overrideTestInternalTableMetadata(t, icebergTableWriter.storage, InternalTableMetadata{ - LastSyncedAt: 111, - LastRefreshMode: RefreshModeIncrementalInProgress, - MaxXmin: &TEST_XMIN0, - }) - icebergTableWriter.continuedRefresh = true - - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"2", "Jane"}, - {"3", "Alice"}, - })) - - testManifestListFiles(t, icebergTableWriter.storage, - ManifestListFile{SequenceNumber: 1, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ManifestListFile{SequenceNumber: 2, Operation: "overwrite", DeletedDataFiles: 1, DeletedRecords: 2, AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 3, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ) - testRecords(t, duckdb, [][]string{ - {"1", "John"}, - {"2", "Jane"}, - {"3", "Alice"}, - }) - testInternalTableMetadata(t, icebergTableWriter.storage, - InternalTableMetadata{LastSyncedAt: 123, LastRefreshMode: RefreshModeIncremental, MaxXmin: &TEST_XMIN1}, - ) - })) - }) - - t.Run("Two incremental syncs", func(t *testing.T) { - t.Run("Processes incremental INSERT -> INSERT", withTestIcebergTableWriter(config, func(t *testing.T, icebergTableWriter *IcebergWriterTable) { - icebergTableWriter.Write(createTestLoadRows(RefreshModeFull, TEST_ICEBERG_WRITER_INITIAL_ROWS)) - icebergTableWriter.continuedRefresh = true - - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"3", "Jane"}, - })) - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"4", "Alice"}, - })) - - testManifestListFiles(t, icebergTableWriter.storage, - ManifestListFile{SequenceNumber: 1, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ManifestListFile{SequenceNumber: 2, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 3, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ) - testRecords(t, duckdb, [][]string{ - {"1", "John"}, - {"2", PG_NULL_STRING}, - {"3", "Jane"}, - {"4", "Alice"}, - }) - testInternalTableMetadata(t, icebergTableWriter.storage, - InternalTableMetadata{LastSyncedAt: 123, LastRefreshMode: RefreshModeIncremental, MaxXmin: &TEST_XMIN1}, - ) - })) - - t.Run("Processes incremental INSERT -> same-record UPDATE", withTestIcebergTableWriter(config, func(t *testing.T, icebergTableWriter *IcebergWriterTable) { - icebergTableWriter.Write(createTestLoadRows(RefreshModeFull, TEST_ICEBERG_WRITER_INITIAL_ROWS)) - icebergTableWriter.continuedRefresh = true - - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"3", "Jane"}, - })) - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"3", "Alice"}, - })) - - testManifestListFiles(t, icebergTableWriter.storage, - ManifestListFile{SequenceNumber: 1, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ManifestListFile{SequenceNumber: 2, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 3, Operation: "delete", DeletedDataFiles: 1, DeletedRecords: 1}, - ManifestListFile{SequenceNumber: 4, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ) - testRecords(t, duckdb, [][]string{ - {"1", "John"}, - {"2", PG_NULL_STRING}, - {"3", "Alice"}, - }) - testInternalTableMetadata(t, icebergTableWriter.storage, - InternalTableMetadata{LastSyncedAt: 123, LastRefreshMode: RefreshModeIncremental, MaxXmin: &TEST_XMIN1}, - ) - })) - - t.Run("Processes incremental INSERT -> same-record UPDATE & INSERT", withTestIcebergTableWriter(config, func(t *testing.T, icebergTableWriter *IcebergWriterTable) { - icebergTableWriter.Write(createTestLoadRows(RefreshModeFull, TEST_ICEBERG_WRITER_INITIAL_ROWS)) - icebergTableWriter.continuedRefresh = true - - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"3", "Jane"}, - })) - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"3", "Alice"}, - {"4", "Bob"}, - })) - - testManifestListFiles(t, icebergTableWriter.storage, - ManifestListFile{SequenceNumber: 1, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ManifestListFile{SequenceNumber: 2, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 3, Operation: "delete", DeletedDataFiles: 1, DeletedRecords: 1}, - ManifestListFile{SequenceNumber: 4, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ) - testRecords(t, duckdb, [][]string{ - {"1", "John"}, - {"2", PG_NULL_STRING}, - {"3", "Alice"}, - {"4", "Bob"}, - }) - })) - - t.Run("Processes incremental INSERT & UPDATE -> same-record UPDATE", withTestIcebergTableWriter(config, func(t *testing.T, icebergTableWriter *IcebergWriterTable) { - icebergTableWriter.Write(createTestLoadRows(RefreshModeFull, TEST_ICEBERG_WRITER_INITIAL_ROWS)) - icebergTableWriter.continuedRefresh = true - - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"2", "Jane"}, - {"3", "Alice"}, - })) - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"3", "Bob"}, - })) - - testManifestListFiles(t, icebergTableWriter.storage, - ManifestListFile{SequenceNumber: 1, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ManifestListFile{SequenceNumber: 2, Operation: "overwrite", DeletedDataFiles: 1, DeletedRecords: 2, AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 3, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ManifestListFile{SequenceNumber: 4, Operation: "overwrite", DeletedDataFiles: 1, DeletedRecords: 2, AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 5, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ) - testRecords(t, duckdb, [][]string{ - {"1", "John"}, - {"2", "Jane"}, - {"3", "Bob"}, - }) - })) - - t.Run("Processes incremental INSERT -> initial-record UPDATE", withTestIcebergTableWriter(config, func(t *testing.T, icebergTableWriter *IcebergWriterTable) { - icebergTableWriter.Write(createTestLoadRows(RefreshModeFull, TEST_ICEBERG_WRITER_INITIAL_ROWS)) - icebergTableWriter.continuedRefresh = true - - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"3", "Jane"}, - })) - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"1", "Alice"}, - })) - - testManifestListFiles(t, icebergTableWriter.storage, - ManifestListFile{SequenceNumber: 1, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ManifestListFile{SequenceNumber: 2, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 3, Operation: "overwrite", DeletedDataFiles: 1, DeletedRecords: 2, AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 4, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ) - testRecords(t, duckdb, [][]string{ - {"1", "Alice"}, - {"2", PG_NULL_STRING}, - {"3", "Jane"}, - }) - })) - - t.Run("Processes incremental INSERT -> initial-record UPDATE & INSERT", withTestIcebergTableWriter(config, func(t *testing.T, icebergTableWriter *IcebergWriterTable) { - icebergTableWriter.Write(createTestLoadRows(RefreshModeFull, TEST_ICEBERG_WRITER_INITIAL_ROWS)) - icebergTableWriter.continuedRefresh = true - - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"3", "Jane"}, - })) - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"1", "Alice"}, - {"4", "Bob"}, - })) - - testManifestListFiles(t, icebergTableWriter.storage, - ManifestListFile{SequenceNumber: 1, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ManifestListFile{SequenceNumber: 2, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 3, Operation: "overwrite", DeletedDataFiles: 1, DeletedRecords: 2, AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 4, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ) - testRecords(t, duckdb, [][]string{ - {"1", "Alice"}, - {"2", PG_NULL_STRING}, - {"3", "Jane"}, - {"4", "Bob"}, - }) - })) - - t.Run("Processes incremental INSERT -> initial & inserted-record UPDATE", withTestIcebergTableWriter(config, func(t *testing.T, icebergTableWriter *IcebergWriterTable) { - icebergTableWriter.Write(createTestLoadRows(RefreshModeFull, TEST_ICEBERG_WRITER_INITIAL_ROWS)) - icebergTableWriter.continuedRefresh = true - - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"3", "Jane"}, - })) - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"1", "Alice"}, - {"3", "Bob"}, - })) - - testManifestListFiles(t, icebergTableWriter.storage, - ManifestListFile{SequenceNumber: 1, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ManifestListFile{SequenceNumber: 2, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 3, Operation: "overwrite", DeletedDataFiles: 1, DeletedRecords: 2, AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 4, Operation: "delete", DeletedDataFiles: 1, DeletedRecords: 1}, - ManifestListFile{SequenceNumber: 5, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ) - testRecords(t, duckdb, [][]string{ - {"1", "Alice"}, - {"2", PG_NULL_STRING}, - {"3", "Bob"}, - }) - })) - - t.Run("Processes incremental INSERT -> full UPDATE", withTestIcebergTableWriter(config, func(t *testing.T, icebergTableWriter *IcebergWriterTable) { - icebergTableWriter.Write(createTestLoadRows(RefreshModeFull, TEST_ICEBERG_WRITER_INITIAL_ROWS)) - icebergTableWriter.continuedRefresh = true - - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"3", "Jane"}, - })) - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"1", "John Doe"}, - {"2", "Alice"}, - {"3", "Bob"}, - })) - - testManifestListFiles(t, icebergTableWriter.storage, - ManifestListFile{SequenceNumber: 1, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ManifestListFile{SequenceNumber: 2, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 3, Operation: "delete", DeletedDataFiles: 1, DeletedRecords: 2}, - ManifestListFile{SequenceNumber: 4, Operation: "delete", DeletedDataFiles: 1, DeletedRecords: 1}, - ManifestListFile{SequenceNumber: 5, Operation: "append", AddedDataFiles: 1, AddedRecords: 3}, - ) - testRecords(t, duckdb, [][]string{ - {"1", "John Doe"}, - {"2", "Alice"}, - {"3", "Bob"}, - }) - })) - - t.Run("Processes incremental INSERT & UPDATE -> initial-record UPDATE", withTestIcebergTableWriter(config, func(t *testing.T, icebergTableWriter *IcebergWriterTable) { - icebergTableWriter.Write(createTestLoadRows(RefreshModeFull, TEST_ICEBERG_WRITER_INITIAL_ROWS)) - icebergTableWriter.continuedRefresh = true - - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"2", "Jane"}, - {"3", "Alice"}, - })) - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"1", "Bob"}, - })) - - testManifestListFiles(t, icebergTableWriter.storage, - ManifestListFile{SequenceNumber: 1, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ManifestListFile{SequenceNumber: 2, Operation: "overwrite", DeletedDataFiles: 1, DeletedRecords: 2, AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 3, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ManifestListFile{SequenceNumber: 4, Operation: "delete", DeletedDataFiles: 1, DeletedRecords: 1}, - ManifestListFile{SequenceNumber: 5, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ) - testRecords(t, duckdb, [][]string{ - {"1", "Bob"}, - {"2", "Jane"}, - {"3", "Alice"}, - }) - })) - - t.Run("Processes incremental UPDATE -> INSERT", withTestIcebergTableWriter(config, func(t *testing.T, icebergTableWriter *IcebergWriterTable) { - icebergTableWriter.Write(createTestLoadRows(RefreshModeFull, TEST_ICEBERG_WRITER_INITIAL_ROWS)) - icebergTableWriter.continuedRefresh = true - - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"2", "Jane"}, - })) - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"3", "Alice"}, - })) - - testManifestListFiles(t, icebergTableWriter.storage, - ManifestListFile{SequenceNumber: 1, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ManifestListFile{SequenceNumber: 2, Operation: "overwrite", DeletedDataFiles: 1, DeletedRecords: 2, AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 3, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 4, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ) - testRecords(t, duckdb, [][]string{ - {"1", "John"}, - {"2", "Jane"}, - {"3", "Alice"}, - }) - })) - - t.Run("Processes incremental full UPDATE -> INSERT", withTestIcebergTableWriter(config, func(t *testing.T, icebergTableWriter *IcebergWriterTable) { - icebergTableWriter.Write(createTestLoadRows(RefreshModeFull, TEST_ICEBERG_WRITER_INITIAL_ROWS)) - icebergTableWriter.continuedRefresh = true - - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"1", "John Doe"}, - {"2", "Jane"}, - })) - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"3", "Alice"}, - })) - - testManifestListFiles(t, icebergTableWriter.storage, - ManifestListFile{SequenceNumber: 1, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ManifestListFile{SequenceNumber: 2, Operation: "delete", DeletedDataFiles: 1, DeletedRecords: 2}, - ManifestListFile{SequenceNumber: 3, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ManifestListFile{SequenceNumber: 4, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ) - testRecords(t, duckdb, [][]string{ - {"1", "John Doe"}, - {"2", "Jane"}, - {"3", "Alice"}, - }) - })) - - t.Run("Processes incremental full UPDATE -> UPDATE", withTestIcebergTableWriter(config, func(t *testing.T, icebergTableWriter *IcebergWriterTable) { - icebergTableWriter.Write(createTestLoadRows(RefreshModeFull, TEST_ICEBERG_WRITER_INITIAL_ROWS)) - icebergTableWriter.continuedRefresh = true - - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"1", "John Doe"}, - {"2", "Jane"}, - })) - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"1", "Alice"}, - })) - - testManifestListFiles(t, icebergTableWriter.storage, - ManifestListFile{SequenceNumber: 1, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ManifestListFile{SequenceNumber: 2, Operation: "delete", DeletedDataFiles: 1, DeletedRecords: 2}, - ManifestListFile{SequenceNumber: 3, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ManifestListFile{SequenceNumber: 4, Operation: "overwrite", DeletedDataFiles: 1, DeletedRecords: 2, AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 5, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ) - testRecords(t, duckdb, [][]string{ - {"1", "Alice"}, - {"2", "Jane"}, - }) - })) - - t.Run("Processes incremental UPDATE -> full UPDATE", withTestIcebergTableWriter(config, func(t *testing.T, icebergTableWriter *IcebergWriterTable) { - icebergTableWriter.Write(createTestLoadRows(RefreshModeFull, TEST_ICEBERG_WRITER_INITIAL_ROWS)) - icebergTableWriter.continuedRefresh = true - - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"1", "John Doe"}, - })) - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"1", "Jane"}, - {"2", "Alice"}, - })) - - testManifestListFiles(t, icebergTableWriter.storage, - ManifestListFile{SequenceNumber: 1, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ManifestListFile{SequenceNumber: 2, Operation: "overwrite", DeletedDataFiles: 1, DeletedRecords: 2, AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 3, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 4, Operation: "delete", DeletedDataFiles: 1, DeletedRecords: 1}, - ManifestListFile{SequenceNumber: 5, Operation: "delete", DeletedDataFiles: 1, DeletedRecords: 1}, - ManifestListFile{SequenceNumber: 6, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ) - testRecords(t, duckdb, [][]string{ - {"1", "Jane"}, - {"2", "Alice"}, - }) - })) - - t.Run("Processes incremental UPDATE -> same-record UPDATE", withTestIcebergTableWriter(config, func(t *testing.T, icebergTableWriter *IcebergWriterTable) { - icebergTableWriter.Write(createTestLoadRows(RefreshModeFull, TEST_ICEBERG_WRITER_INITIAL_ROWS)) - icebergTableWriter.continuedRefresh = true - - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"2", "Jane"}, - })) - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"2", "Alice"}, - })) - - testManifestListFiles(t, icebergTableWriter.storage, - ManifestListFile{SequenceNumber: 1, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ManifestListFile{SequenceNumber: 2, Operation: "overwrite", DeletedDataFiles: 1, DeletedRecords: 2, AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 3, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 4, Operation: "delete", DeletedDataFiles: 1, DeletedRecords: 1}, - ManifestListFile{SequenceNumber: 5, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ) - testRecords(t, duckdb, [][]string{ - {"1", "John"}, - {"2", "Alice"}, - }) - })) - - t.Run("Processes incremental UPDATE -> same-record UPDATE & INSERT", withTestIcebergTableWriter(config, func(t *testing.T, icebergTableWriter *IcebergWriterTable) { - icebergTableWriter.Write(createTestLoadRows(RefreshModeFull, TEST_ICEBERG_WRITER_INITIAL_ROWS)) - icebergTableWriter.continuedRefresh = true - - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"2", "Jane"}, - })) - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"2", "Alice"}, - {"3", "Bob"}, - })) - - testManifestListFiles(t, icebergTableWriter.storage, - ManifestListFile{SequenceNumber: 1, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ManifestListFile{SequenceNumber: 2, Operation: "overwrite", DeletedDataFiles: 1, DeletedRecords: 2, AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 3, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 4, Operation: "delete", DeletedDataFiles: 1, DeletedRecords: 1}, - ManifestListFile{SequenceNumber: 5, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ) - testRecords(t, duckdb, [][]string{ - {"1", "John"}, - {"2", "Alice"}, - {"3", "Bob"}, - }) - })) - - t.Run("Processes incremental UPDATE -> initial-record UPDATE", withTestIcebergTableWriter(config, func(t *testing.T, icebergTableWriter *IcebergWriterTable) { - icebergTableWriter.Write(createTestLoadRows(RefreshModeFull, TEST_ICEBERG_WRITER_INITIAL_ROWS)) - icebergTableWriter.continuedRefresh = true - - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"2", "Jane"}, - })) - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"1", "Alice"}, - })) - - testManifestListFiles(t, icebergTableWriter.storage, - ManifestListFile{SequenceNumber: 1, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ManifestListFile{SequenceNumber: 2, Operation: "overwrite", DeletedDataFiles: 1, DeletedRecords: 2, AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 3, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 4, Operation: "delete", DeletedDataFiles: 1, DeletedRecords: 1}, - ManifestListFile{SequenceNumber: 5, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ) - - testRecords(t, duckdb, [][]string{ - {"1", "Alice"}, - {"2", "Jane"}, - }) - })) - - t.Run("Processes incremental UPDATE -> initial-record UPDATE & INSERT", withTestIcebergTableWriter(config, func(t *testing.T, icebergTableWriter *IcebergWriterTable) { - icebergTableWriter.Write(createTestLoadRows(RefreshModeFull, TEST_ICEBERG_WRITER_INITIAL_ROWS)) - icebergTableWriter.continuedRefresh = true - - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"2", "Jane"}, - })) - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"1", "Alice"}, - {"3", "Bob"}, - })) - - testManifestListFiles(t, icebergTableWriter.storage, - ManifestListFile{SequenceNumber: 1, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ManifestListFile{SequenceNumber: 2, Operation: "overwrite", DeletedDataFiles: 1, DeletedRecords: 2, AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 3, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 4, Operation: "delete", DeletedDataFiles: 1, DeletedRecords: 1}, - ManifestListFile{SequenceNumber: 5, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ) - - testRecords(t, duckdb, [][]string{ - {"1", "Alice"}, - {"2", "Jane"}, - {"3", "Bob"}, - }) - })) - }) - - t.Run("Three incremental syncs", func(t *testing.T) { - t.Run("Processes incremental INSERT -> INSERT -> last-record UPDATE", withTestIcebergTableWriter(config, func(t *testing.T, icebergTableWriter *IcebergWriterTable) { - icebergTableWriter.Write(createTestLoadRows(RefreshModeFull, TEST_ICEBERG_WRITER_INITIAL_ROWS)) - icebergTableWriter.continuedRefresh = true - - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"3", "Jane"}, - })) - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"4", "Alice"}, - })) - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"4", "Bob"}, - })) - - testManifestListFiles(t, icebergTableWriter.storage, - ManifestListFile{SequenceNumber: 1, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ManifestListFile{SequenceNumber: 2, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 3, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 4, Operation: "delete", DeletedDataFiles: 1, DeletedRecords: 1}, - ManifestListFile{SequenceNumber: 5, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ) - testRecords(t, duckdb, [][]string{ - {"1", "John"}, - {"2", PG_NULL_STRING}, - {"3", "Jane"}, - {"4", "Bob"}, - }) - })) - - t.Run("Processes incremental INSERT -> INSERT -> previous-record UPDATE", withTestIcebergTableWriter(config, func(t *testing.T, icebergTableWriter *IcebergWriterTable) { - icebergTableWriter.Write(createTestLoadRows(RefreshModeFull, TEST_ICEBERG_WRITER_INITIAL_ROWS)) - icebergTableWriter.continuedRefresh = true - - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"3", "Jane"}, - })) - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"4", "Alice"}, - })) - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"3", "Bob"}, - })) - - testManifestListFiles(t, icebergTableWriter.storage, - ManifestListFile{SequenceNumber: 1, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ManifestListFile{SequenceNumber: 2, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 3, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 4, Operation: "delete", DeletedDataFiles: 1, DeletedRecords: 1}, - ManifestListFile{SequenceNumber: 5, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ) - testRecords(t, duckdb, [][]string{ - {"1", "John"}, - {"2", PG_NULL_STRING}, - {"3", "Bob"}, - {"4", "Alice"}, - }) - })) - - t.Run("Processes incremental INSERT -> INSERT -> initial-record UPDATE", withTestIcebergTableWriter(config, func(t *testing.T, icebergTableWriter *IcebergWriterTable) { - icebergTableWriter.Write(createTestLoadRows(RefreshModeFull, TEST_ICEBERG_WRITER_INITIAL_ROWS)) - icebergTableWriter.continuedRefresh = true - - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"3", "Jane"}, - })) - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"4", "Alice"}, - })) - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"2", "Bob"}, - })) - - testManifestListFiles(t, icebergTableWriter.storage, - ManifestListFile{SequenceNumber: 1, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ManifestListFile{SequenceNumber: 2, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 3, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 4, Operation: "overwrite", DeletedDataFiles: 1, DeletedRecords: 2, AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 5, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ) - testRecords(t, duckdb, [][]string{ - {"1", "John"}, - {"2", "Bob"}, - {"3", "Jane"}, - {"4", "Alice"}, - }) - })) - - t.Run("Processes incremental INSERT -> same-record UPDATE -> INSERT", withTestIcebergTableWriter(config, func(t *testing.T, icebergTableWriter *IcebergWriterTable) { - icebergTableWriter.Write(createTestLoadRows(RefreshModeFull, TEST_ICEBERG_WRITER_INITIAL_ROWS)) - icebergTableWriter.continuedRefresh = true - - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"3", "Jane"}, - })) - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"3", "Alice"}, - })) - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"4", "Bob"}, - })) - - testManifestListFiles(t, icebergTableWriter.storage, - ManifestListFile{SequenceNumber: 1, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ManifestListFile{SequenceNumber: 2, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 3, Operation: "delete", DeletedDataFiles: 1, DeletedRecords: 1}, - ManifestListFile{SequenceNumber: 4, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 5, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ) - testRecords(t, duckdb, [][]string{ - {"1", "John"}, - {"2", PG_NULL_STRING}, - {"3", "Alice"}, - {"4", "Bob"}, - }) - })) - - t.Run("Processes incremental INSERT -> initial-record UPDATE -> INSERT", withTestIcebergTableWriter(config, func(t *testing.T, icebergTableWriter *IcebergWriterTable) { - icebergTableWriter.Write(createTestLoadRows(RefreshModeFull, TEST_ICEBERG_WRITER_INITIAL_ROWS)) - icebergTableWriter.continuedRefresh = true - - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"3", "Jane"}, - })) - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"2", "Alice"}, - })) - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"4", "Bob"}, - })) - - testManifestListFiles(t, icebergTableWriter.storage, - ManifestListFile{SequenceNumber: 1, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ManifestListFile{SequenceNumber: 2, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 3, Operation: "overwrite", DeletedDataFiles: 1, DeletedRecords: 2, AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 4, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 5, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ) - testRecords(t, duckdb, [][]string{ - {"1", "John"}, - {"2", "Alice"}, - {"3", "Jane"}, - {"4", "Bob"}, - }) - })) - - t.Run("Processes incremental INSERT -> same-record UPDATE -> same-record UPDATE", withTestIcebergTableWriter(config, func(t *testing.T, icebergTableWriter *IcebergWriterTable) { - icebergTableWriter.Write(createTestLoadRows(RefreshModeFull, TEST_ICEBERG_WRITER_INITIAL_ROWS)) - icebergTableWriter.continuedRefresh = true - - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"3", "Jane"}, - })) - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"3", "Alice"}, - })) - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"3", "Bob"}, - })) - - testManifestListFiles(t, icebergTableWriter.storage, - ManifestListFile{SequenceNumber: 1, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ManifestListFile{SequenceNumber: 2, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 3, Operation: "delete", DeletedDataFiles: 1, DeletedRecords: 1}, - ManifestListFile{SequenceNumber: 4, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 5, Operation: "delete", DeletedDataFiles: 1, DeletedRecords: 1}, - ManifestListFile{SequenceNumber: 6, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ) - testRecords(t, duckdb, [][]string{ - {"1", "John"}, - {"2", PG_NULL_STRING}, - {"3", "Bob"}, - }) - })) - - t.Run("Processes incremental INSERT -> same-record UPDATE -> initial-record UPDATE", withTestIcebergTableWriter(config, func(t *testing.T, icebergTableWriter *IcebergWriterTable) { - icebergTableWriter.Write(createTestLoadRows(RefreshModeFull, TEST_ICEBERG_WRITER_INITIAL_ROWS)) - icebergTableWriter.continuedRefresh = true - - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"3", "Jane"}, - })) - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"3", "Alice"}, - })) - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"2", "Bob"}, - })) - - testManifestListFiles(t, icebergTableWriter.storage, - ManifestListFile{SequenceNumber: 1, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ManifestListFile{SequenceNumber: 2, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 3, Operation: "delete", DeletedDataFiles: 1, DeletedRecords: 1}, - ManifestListFile{SequenceNumber: 4, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 5, Operation: "overwrite", DeletedDataFiles: 1, DeletedRecords: 2, AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 6, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ) - testRecords(t, duckdb, [][]string{ - {"1", "John"}, - {"2", "Bob"}, - {"3", "Alice"}, - }) - })) - - t.Run("Processes incremental INSERT -> initial-record UPDATE -> initial-record UPDATE", withTestIcebergTableWriter(config, func(t *testing.T, icebergTableWriter *IcebergWriterTable) { - icebergTableWriter.Write(createTestLoadRows(RefreshModeFull, TEST_ICEBERG_WRITER_INITIAL_ROWS)) - icebergTableWriter.continuedRefresh = true - - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"3", "Jane"}, - })) - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"2", "Alice"}, - })) - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"1", "Bob"}, - })) - - testManifestListFiles(t, icebergTableWriter.storage, - ManifestListFile{SequenceNumber: 1, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ManifestListFile{SequenceNumber: 2, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 3, Operation: "overwrite", DeletedDataFiles: 1, DeletedRecords: 2, AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 4, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 5, Operation: "delete", DeletedDataFiles: 1, DeletedRecords: 1}, - ManifestListFile{SequenceNumber: 6, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ) - testRecords(t, duckdb, [][]string{ - {"1", "Bob"}, - {"2", "Alice"}, - {"3", "Jane"}, - }) - })) - - t.Run("Processes incremental INSERT -> initial-record UPDATE -> inserted-record UPDATE", withTestIcebergTableWriter(config, func(t *testing.T, icebergTableWriter *IcebergWriterTable) { - icebergTableWriter.Write(createTestLoadRows(RefreshModeFull, TEST_ICEBERG_WRITER_INITIAL_ROWS)) - icebergTableWriter.continuedRefresh = true - - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"3", "Jane"}, - })) - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"2", "Alice"}, - })) - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"3", "Bob"}, - })) - - testManifestListFiles(t, icebergTableWriter.storage, - ManifestListFile{SequenceNumber: 1, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ManifestListFile{SequenceNumber: 2, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 3, Operation: "overwrite", DeletedDataFiles: 1, DeletedRecords: 2, AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 4, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 5, Operation: "delete", DeletedDataFiles: 1, DeletedRecords: 1}, - ManifestListFile{SequenceNumber: 6, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ) - testRecords(t, duckdb, [][]string{ - {"1", "John"}, - {"2", "Alice"}, - {"3", "Bob"}, - }) - })) - - t.Run("Processes incremental INSERT -> initial-record UPDATE -> updated-record UPDATE", withTestIcebergTableWriter(config, func(t *testing.T, icebergTableWriter *IcebergWriterTable) { - icebergTableWriter.Write(createTestLoadRows(RefreshModeFull, TEST_ICEBERG_WRITER_INITIAL_ROWS)) - icebergTableWriter.continuedRefresh = true - - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"3", "Jane"}, - })) - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"2", "Alice"}, - })) - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"2", "Bob"}, - })) - - testManifestListFiles(t, icebergTableWriter.storage, - ManifestListFile{SequenceNumber: 1, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ManifestListFile{SequenceNumber: 2, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 3, Operation: "overwrite", DeletedDataFiles: 1, DeletedRecords: 2, AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 4, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 5, Operation: "delete", DeletedDataFiles: 1, DeletedRecords: 1}, - ManifestListFile{SequenceNumber: 6, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ) - testRecords(t, duckdb, [][]string{ - {"1", "John"}, - {"2", "Bob"}, - {"3", "Jane"}, - }) - })) - - t.Run("Processes incremental UPDATE -> INSERT -> INSERT", withTestIcebergTableWriter(config, func(t *testing.T, icebergTableWriter *IcebergWriterTable) { - icebergTableWriter.Write(createTestLoadRows(RefreshModeFull, TEST_ICEBERG_WRITER_INITIAL_ROWS)) - icebergTableWriter.continuedRefresh = true - - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"2", "Jane"}, - })) - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"3", "Alice"}, - })) - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"4", "Bob"}, - })) - - testManifestListFiles(t, icebergTableWriter.storage, - ManifestListFile{SequenceNumber: 1, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ManifestListFile{SequenceNumber: 2, Operation: "overwrite", DeletedDataFiles: 1, DeletedRecords: 2, AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 3, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 4, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 5, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ) - testRecords(t, duckdb, [][]string{ - {"1", "John"}, - {"2", "Jane"}, - {"3", "Alice"}, - {"4", "Bob"}, - }) - })) - - t.Run("Processes incremental UPDATE -> INSERT -> inserted-record UPDATE", withTestIcebergTableWriter(config, func(t *testing.T, icebergTableWriter *IcebergWriterTable) { - icebergTableWriter.Write(createTestLoadRows(RefreshModeFull, TEST_ICEBERG_WRITER_INITIAL_ROWS)) - icebergTableWriter.continuedRefresh = true - - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"2", "Jane"}, - })) - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"3", "Alice"}, - })) - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"3", "Bob"}, - })) - - testManifestListFiles(t, icebergTableWriter.storage, - ManifestListFile{SequenceNumber: 1, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ManifestListFile{SequenceNumber: 2, Operation: "overwrite", DeletedDataFiles: 1, DeletedRecords: 2, AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 3, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 4, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 5, Operation: "delete", DeletedDataFiles: 1, DeletedRecords: 1}, - ManifestListFile{SequenceNumber: 6, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ) - testRecords(t, duckdb, [][]string{ - {"1", "John"}, - {"2", "Jane"}, - {"3", "Bob"}, - }) - })) - - t.Run("Processes incremental UPDATE -> INSERT -> updated-record UPDATE", withTestIcebergTableWriter(config, func(t *testing.T, icebergTableWriter *IcebergWriterTable) { - icebergTableWriter.Write(createTestLoadRows(RefreshModeFull, TEST_ICEBERG_WRITER_INITIAL_ROWS)) - icebergTableWriter.continuedRefresh = true - - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"2", "Jane"}, - })) - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"3", "Alice"}, - })) - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"2", "Bob"}, - })) - - testManifestListFiles(t, icebergTableWriter.storage, - ManifestListFile{SequenceNumber: 1, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ManifestListFile{SequenceNumber: 2, Operation: "overwrite", DeletedDataFiles: 1, DeletedRecords: 2, AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 3, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 4, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 5, Operation: "delete", DeletedDataFiles: 1, DeletedRecords: 1}, - ManifestListFile{SequenceNumber: 6, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ) - testRecords(t, duckdb, [][]string{ - {"1", "John"}, - {"2", "Bob"}, - {"3", "Alice"}, - }) - })) - - t.Run("Processes incremental UPDATE -> INSERT -> initial-record UPDATE", withTestIcebergTableWriter(config, func(t *testing.T, icebergTableWriter *IcebergWriterTable) { - icebergTableWriter.Write(createTestLoadRows(RefreshModeFull, TEST_ICEBERG_WRITER_INITIAL_ROWS)) - icebergTableWriter.continuedRefresh = true - - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"2", "Jane"}, - })) - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"3", "Alice"}, - })) - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"1", "Bob"}, - })) - - testManifestListFiles(t, icebergTableWriter.storage, - ManifestListFile{SequenceNumber: 1, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ManifestListFile{SequenceNumber: 2, Operation: "overwrite", DeletedDataFiles: 1, DeletedRecords: 2, AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 3, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 4, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 5, Operation: "delete", DeletedDataFiles: 1, DeletedRecords: 1}, - ManifestListFile{SequenceNumber: 6, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ) - testRecords(t, duckdb, [][]string{ - {"1", "Bob"}, - {"2", "Jane"}, - {"3", "Alice"}, - }) - })) - - t.Run("Processes incremental UPDATE -> INSERT -> full UPDATE", withTestIcebergTableWriter(config, func(t *testing.T, icebergTableWriter *IcebergWriterTable) { - icebergTableWriter.Write(createTestLoadRows(RefreshModeFull, TEST_ICEBERG_WRITER_INITIAL_ROWS)) - icebergTableWriter.continuedRefresh = true - - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"2", "Jane"}, - })) - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"3", "Alice"}, - })) - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"1", "John Doe"}, - {"2", "Bob"}, - {"3", "Alice Smith"}, - })) - - testManifestListFiles(t, icebergTableWriter.storage, - ManifestListFile{SequenceNumber: 1, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ManifestListFile{SequenceNumber: 2, Operation: "overwrite", DeletedDataFiles: 1, DeletedRecords: 2, AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 3, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 4, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 5, Operation: "delete", DeletedDataFiles: 1, DeletedRecords: 1}, - ManifestListFile{SequenceNumber: 6, Operation: "delete", DeletedDataFiles: 1, DeletedRecords: 1}, - ManifestListFile{SequenceNumber: 7, Operation: "delete", DeletedDataFiles: 1, DeletedRecords: 1}, - ManifestListFile{SequenceNumber: 8, Operation: "append", AddedDataFiles: 1, AddedRecords: 3}, - ) - testRecords(t, duckdb, [][]string{ - {"1", "John Doe"}, - {"2", "Bob"}, - {"3", "Alice Smith"}, - }) - })) - - t.Run("Processes incremental UPDATE -> INSERT -> updated and inserted-record UPDATE", withTestIcebergTableWriter(config, func(t *testing.T, icebergTableWriter *IcebergWriterTable) { - icebergTableWriter.Write(createTestLoadRows(RefreshModeFull, TEST_ICEBERG_WRITER_INITIAL_ROWS)) - icebergTableWriter.continuedRefresh = true - - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"2", "Jane"}, - })) - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"3", "Alice"}, - })) - icebergTableWriter.Write(createTestLoadRows(RefreshModeIncremental, [][]string{ - {"2", "Bob"}, - {"3", "Alice Smith"}, - })) - - testManifestListFiles(t, icebergTableWriter.storage, - ManifestListFile{SequenceNumber: 1, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ManifestListFile{SequenceNumber: 2, Operation: "overwrite", DeletedDataFiles: 1, DeletedRecords: 2, AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 3, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 4, Operation: "append", AddedDataFiles: 1, AddedRecords: 1}, - ManifestListFile{SequenceNumber: 5, Operation: "delete", DeletedDataFiles: 1, DeletedRecords: 1}, - ManifestListFile{SequenceNumber: 6, Operation: "delete", DeletedDataFiles: 1, DeletedRecords: 1}, - ManifestListFile{SequenceNumber: 7, Operation: "append", AddedDataFiles: 1, AddedRecords: 2}, - ) - testRecords(t, duckdb, [][]string{ - {"1", "John"}, - {"2", "Bob"}, - {"3", "Alice Smith"}, - }) - })) - }) -} - -// --------------------------------------------------------------------------------------------------------------------- - -func withTestIcebergTableWriter(config *Config, testFunc func(t *testing.T, icebergTableWriter *IcebergWriterTable)) func(*testing.T) { - return func(t *testing.T) { - icebergTableWriter := NewIcebergWriterTable(config, TEST_ICEBERG_WRITER_SCHEMA_TABLE, TEST_ICEBERG_WRITER_PG_SCHEMA_COLUMNS, 777, MAX_PARQUET_PAYLOAD_THRESHOLD, false) - - testFunc(t, icebergTableWriter) - - icebergTableWriter.storage.DeleteSchema(TEST_ICEBERG_WRITER_SCHEMA_TABLE.Schema) - } -} - -func createTestLoadRows(refreshMode RefreshMode, testRows [][]string) func() ([][]string, InternalTableMetadata) { - internalTableMetadata := InternalTableMetadata{ - LastSyncedAt: 123, - LastRefreshMode: refreshMode, - MaxXmin: &TEST_XMIN1, - } - - loadedAllRows := false - return func() ([][]string, InternalTableMetadata) { - if loadedAllRows { - return [][]string{}, internalTableMetadata - } - loadedAllRows = true - return testRows, internalTableMetadata - } -} - -func createTestLoadRowsByOne(refreshMode RefreshMode, testRows [][]string) func() ([][]string, InternalTableMetadata) { - var inProgressRefreshMode RefreshMode - if refreshMode == RefreshModeFull { - inProgressRefreshMode = RefreshModeFullInProgress - } else { - inProgressRefreshMode = RefreshModeIncrementalInProgress - } - - internalTableMetadata := InternalTableMetadata{ - LastSyncedAt: 123, - LastRefreshMode: inProgressRefreshMode, - MaxXmin: &TEST_XMIN1, - } - - loadedRowIndex := -1 - return func() ([][]string, InternalTableMetadata) { - if loadedRowIndex == len(testRows)-1 { - return [][]string{}, internalTableMetadata - } - - row := testRows[loadedRowIndex+1] - - loadedRowIndex++ - if loadedRowIndex == len(testRows)-1 { - internalTableMetadata.LastRefreshMode = refreshMode - } - - return [][]string{row}, internalTableMetadata - } -} - -func overrideTestInternalTableMetadata(t *testing.T, storage StorageInterface, internalTableMetadata InternalTableMetadata) { - metadataDirPath := storage.CreateMetadataDir(TEST_ICEBERG_WRITER_SCHEMA_TABLE) - err := storage.WriteInternalTableMetadata(metadataDirPath, internalTableMetadata) - if err != nil { - t.Fatalf("Failed to write internal table metadata: %v", err) - } -} - -func testManifestListFiles(t *testing.T, storage StorageInterface, expectedManifestListFiles ...ManifestListFile) { - metadataDirPath := storage.CreateMetadataDir(TEST_ICEBERG_WRITER_SCHEMA_TABLE) - manifestListFiles, err := storage.ExistingManifestListFiles(metadataDirPath) - if err != nil { - t.Fatalf("Error reading manifest list files: %v", err) - } - - if len(manifestListFiles) != len(expectedManifestListFiles) { - t.Fatalf("Expected %d manifest list files, got %d", len(expectedManifestListFiles), len(manifestListFiles)) - } - - for i, expectedManifestListFile := range expectedManifestListFiles { - actualManifestListFile := manifestListFiles[i] - if actualManifestListFile.SequenceNumber != expectedManifestListFile.SequenceNumber { - t.Fatalf("Expected sequence number %d, got %d", expectedManifestListFile.SequenceNumber, actualManifestListFile.SequenceNumber) - } - if actualManifestListFile.Operation != expectedManifestListFile.Operation { - t.Fatalf("Expected operation '%s', got '%s' (sequence number %d)", expectedManifestListFile.Operation, actualManifestListFile.Operation, actualManifestListFile.SequenceNumber) - } - if actualManifestListFile.AddedDataFiles != expectedManifestListFile.AddedDataFiles { - t.Fatalf("Expected %d added data files, got %d (sequence number %d)", expectedManifestListFile.AddedDataFiles, actualManifestListFile.AddedDataFiles, actualManifestListFile.SequenceNumber) - } - if actualManifestListFile.AddedRecords != expectedManifestListFile.AddedRecords { - t.Fatalf("Expected %d added records, got %d (sequence number %d)", expectedManifestListFile.AddedRecords, actualManifestListFile.AddedRecords, actualManifestListFile.SequenceNumber) - } - if actualManifestListFile.DeletedDataFiles != expectedManifestListFile.DeletedDataFiles { - t.Fatalf("Expected %d deleted data files, got %d (sequence number %d)", expectedManifestListFile.DeletedDataFiles, actualManifestListFile.DeletedDataFiles, actualManifestListFile.SequenceNumber) - } - if actualManifestListFile.DeletedRecords != expectedManifestListFile.DeletedRecords { - t.Fatalf("Expected %d deleted records, got %d (sequence number %d)", expectedManifestListFile.DeletedRecords, actualManifestListFile.DeletedRecords, actualManifestListFile.SequenceNumber) - } - } -} - -func testRecords(t *testing.T, duckdb *Duckdb, expectedRecords [][]string) { - icebergReader := NewIcebergReader(duckdb.config) - metadataFilePath := icebergReader.MetadataFilePath(TEST_ICEBERG_WRITER_SCHEMA_TABLE) - - rows, err := duckdb.QueryContext(context.Background(), "SELECT id::text, COALESCE(name, '"+PG_NULL_STRING+"') FROM iceberg_scan('"+metadataFilePath+"', skip_schema_inference = true) ORDER BY id") - if err != nil { - t.Fatalf("Error querying DuckDB: %v", err) - } - defer rows.Close() - - actualRecords := [][]string{} - for rows.Next() { - row := make([]string, len(expectedRecords[0])) - err := rows.Scan(&row[0], &row[1]) - if err != nil { - t.Fatalf("Error scanning row: %v", err) - } - actualRecords = append(actualRecords, row) - } - - if len(actualRecords) != len(expectedRecords) { - t.Fatalf("Expected %d records, got %d", len(expectedRecords), len(actualRecords)) - } - - for i, expectedRecord := range expectedRecords { - actualRecord := actualRecords[i] - for j, expectedValue := range expectedRecord { - if actualRecord[j] != expectedValue { - t.Fatalf("Expected value '%s' at %d, got '%s'", expectedValue, i, actualRecord[j]) - } - } - } -} - -func testInternalTableMetadata(t *testing.T, storage StorageInterface, expectedInternalTableMetadata InternalTableMetadata) { - actualInternalTableMetadata, err := storage.InternalTableMetadata(PgSchemaTable{ - Schema: TEST_ICEBERG_WRITER_SCHEMA_TABLE.Schema, - Table: TEST_ICEBERG_WRITER_SCHEMA_TABLE.Table, - }) - if err != nil { - t.Fatalf("Error reading internal table metadata: %v", err) - } - - if actualInternalTableMetadata.LastSyncedAt != expectedInternalTableMetadata.LastSyncedAt { - t.Fatalf("Expected LastSyncedAt %d, got %d", expectedInternalTableMetadata.LastSyncedAt, actualInternalTableMetadata.LastSyncedAt) - } - if actualInternalTableMetadata.LastRefreshMode != expectedInternalTableMetadata.LastRefreshMode { - t.Fatalf("Expected LastRefreshMode %s, got %s", expectedInternalTableMetadata.LastRefreshMode, actualInternalTableMetadata.LastRefreshMode) - } - if *actualInternalTableMetadata.MaxXmin != *expectedInternalTableMetadata.MaxXmin { - t.Fatalf("Expected MaxXmin %v, got %v", expectedInternalTableMetadata.MaxXmin, actualInternalTableMetadata.MaxXmin) - } -} diff --git a/src/main.go b/src/main.go deleted file mode 100644 index c128899..0000000 --- a/src/main.go +++ /dev/null @@ -1,108 +0,0 @@ -package main - -import ( - "flag" - "fmt" - "log" - "net/http" - _ "net/http/pprof" - "time" -) - -const ( - COMMAND_START = "start" - COMMAND_SYNC = "sync" - COMMAND_VERSION = "version" -) - -func main() { - config := LoadConfig() - defer handlePanic(config) - - if config.LogLevel == LOG_LEVEL_TRACE { - go enableProfiling() - } - - command := flag.Arg(0) - if len(flag.Args()) == 0 { - command = COMMAND_START - } - - switch command { - case COMMAND_START: - LogDebug(config, "Starting BemiDB v"+VERSION) - start(config) - case COMMAND_SYNC: - LogDebug(config, "Syncing with BemiDB v"+VERSION) - if config.Pg.SyncInterval != "" { - duration, err := time.ParseDuration(config.Pg.SyncInterval) - if err != nil { - PrintErrorAndExit(config, "Invalid interval format: "+config.Pg.SyncInterval+".\n\n"+ - "Supported formats: 1h, 20m, 30s.\n"+ - "See https://github.com/BemiHQ/BemiDB#sync-command-options for more information.", - ) - - } - LogInfo(config, "Starting sync loop with interval:", config.Pg.SyncInterval) - for { - syncFromPg(config) - LogInfo(config, "Sleeping for", config.Pg.SyncInterval) - time.Sleep(duration) - } - } else { - syncFromPg(config) - } - case COMMAND_VERSION: - fmt.Println("BemiDB version:", VERSION) - default: - PrintErrorAndExit(config, "Unknown command: "+command+".\n\n"+ - "Supported commands: "+COMMAND_START+", "+COMMAND_SYNC+", "+COMMAND_VERSION+".\n"+ - "See https://github.com/BemiHQ/BemiDB#quickstart for more information.", - ) - } -} - -func start(config *Config) { - tcpListener := NewTcpListener(config) - LogInfo(config, "BemiDB: Listening on", tcpListener.Addr()) - - duckdb := NewDuckdb(config, true) - LogInfo(config, "DuckDB: Connected") - defer duckdb.Close() - - icebergReader := NewIcebergReader(config) - duckdb.ExecFile(icebergReader.InternalStartSqlFile()) - - queryHandler := NewQueryHandler(config, duckdb, icebergReader) - - for { - conn := AcceptConnection(config, tcpListener) - LogInfo(config, "BemiDB: Accepted connection from", conn.RemoteAddr()) - postgres := NewPostgres(config, &conn) - - go func() { - postgres.Run(queryHandler) - defer postgres.Close() - LogInfo(config, "BemiDB: Closed connection from", conn.RemoteAddr()) - }() - } -} - -func syncFromPg(config *Config) { - syncer := NewSyncer(config) - syncer.SyncFromPostgres() - LogInfo(config, "Sync from PostgreSQL completed successfully.") -} - -func enableProfiling() { - func() { log.Println(http.ListenAndServe(":6060", nil)) }() -} - -func handlePanic(config *Config) { - func() { - if r := recover(); r != nil { - err, _ := r.(error) - HandleUnexpectedError(config, err) - } - }() -} diff --git a/src/pg_schema_column.go b/src/pg_schema_column.go deleted file mode 100644 index 1252db4..0000000 --- a/src/pg_schema_column.go +++ /dev/null @@ -1,430 +0,0 @@ -package main - -import ( - "encoding/csv" - "math" - "strconv" - "strings" - "time" -) - -const ( - PG_NULL_STRING = "BEMIDB_NULL" - PG_TRUE = "YES" - PG_FALSE = "FALSE" - - PG_DATA_TYPE_ARRAY = "ARRAY" - - PARQUET_SCHEMA_REPETITION_TYPE_REQUIRED = "REQUIRED" - PARQUET_SCHEMA_REPETITION_TYPE_OPTIONAL = "OPTIONAL" - - PARQUET_NAN = "NaN" - PARQUET_MAX_DECIMAL_PRECISION = 38 - - // 0000-01-01 00:00:00 +0000 UTC - EPOCH_TIME_MS = -62167219200000 -) - -type PgSchemaColumn struct { - ColumnName string - DataType string - UdtName string - IsNullable string - OrdinalPosition string - CharacterMaximumLength string - NumericPrecision string - NumericScale string - DatetimePrecision string - Namespace string - PartOfPrimaryKey bool - config *Config -} - -// Parquet doesn't allow commas in column names -func (pgSchemaColumn PgSchemaColumn) NormalizedColumnName() string { - return strings.ReplaceAll(pgSchemaColumn.ColumnName, ",", "_") -} - -func NewPgSchemaColumn(config *Config) *PgSchemaColumn { - return &PgSchemaColumn{ - config: config, - } -} - -type ParquetSchemaField struct { - Name string - Type string - RepetitionType string - FieldId string - Length string - ConvertedType string - Scale string - Precision string - NestedType string - NestedConvertedType string -} - -type IcebergSchemaField struct { - Id int `json:"id"` - Name string `json:"name"` - Type interface{} `json:"type"` - Required bool `json:"required"` -} - -func (pgSchemaColumn PgSchemaColumn) ToParquetSchemaFieldMap() map[string]interface{} { - field := pgSchemaColumn.toParquetSchemaField() - - tagKeyVals := []string{ - "name=" + field.Name, - "type=" + field.Type, - "repetitiontype=" + field.RepetitionType, - "fieldid=" + field.FieldId, - } - - if field.Length != "" { - tagKeyVals = append(tagKeyVals, "length="+field.Length) - } - if field.ConvertedType != "" { - tagKeyVals = append(tagKeyVals, "convertedtype="+field.ConvertedType) - } - if field.Scale != "" { - tagKeyVals = append(tagKeyVals, "scale="+field.Scale) - } - if field.Precision != "" { - tagKeyVals = append(tagKeyVals, "precision="+field.Precision) - } - - result := map[string]interface{}{ - "Tag": strings.Join(tagKeyVals, ", "), - } - - if field.NestedType != "" { - nestedTagKeyVals := []string{ - "name=element", - "type=" + field.NestedType, - } - - if field.NestedConvertedType != "" { - nestedTagKeyVals = append(nestedTagKeyVals, "convertedtype="+field.NestedConvertedType) - } - - result["Fields"] = []map[string]interface{}{ - {"Tag": strings.Join(nestedTagKeyVals, ", ")}, - } - } - - return result -} - -func (pgSchemaColumn PgSchemaColumn) ToIcebergSchemaFieldMap() IcebergSchemaField { - icebergSchemaField := IcebergSchemaField{} - - id, err := StringToInt(pgSchemaColumn.OrdinalPosition) - if err != nil { - Panic(pgSchemaColumn.config, err.Error()) - } - - icebergSchemaField.Id = id - icebergSchemaField.Name = pgSchemaColumn.NormalizedColumnName() - - if pgSchemaColumn.IsNullable == PG_TRUE { - icebergSchemaField.Required = false - } else { - icebergSchemaField.Required = true - } - - primitiveType := pgSchemaColumn.icebergPrimitiveType() - if pgSchemaColumn.DataType == PG_DATA_TYPE_ARRAY { - icebergSchemaField.Type = map[string]interface{}{ - "type": "list", - "element": primitiveType, - "element-id": pgSchemaColumn.OrdinalPosition, - "element-required": false, - } - } else { - icebergSchemaField.Type = primitiveType - } - - return icebergSchemaField -} - -func (pgSchemaColumn *PgSchemaColumn) FormatParquetValue(value string) interface{} { - if value == PG_NULL_STRING { - return nil - } - - if pgSchemaColumn.DataType == PG_DATA_TYPE_ARRAY { - var values []interface{} - - csvString := strings.TrimPrefix(value, "{") - csvString = strings.TrimSuffix(csvString, "}") - if csvString == "" { - return values - } - - // Replace escaped double quotes with double quotes according to CSV format rules - csvString = strings.ReplaceAll(csvString, "\\\"", "\"\"") - csvReader := csv.NewReader(strings.NewReader(csvString)) - stringValues, err := csvReader.Read() - PanicIfError(pgSchemaColumn.config, err) - - for _, stringValue := range stringValues { - values = append(values, pgSchemaColumn.parquetPrimitiveValue(stringValue)) - } - - return values - } - - return pgSchemaColumn.parquetPrimitiveValue(value) -} - -func (pgSchemaColumn *PgSchemaColumn) toParquetSchemaField() ParquetSchemaField { - primitiveType, primitiveConvertedType := pgSchemaColumn.parquetPrimitiveTypes() - - parquetSchemaField := ParquetSchemaField{ - Name: pgSchemaColumn.NormalizedColumnName(), - FieldId: pgSchemaColumn.OrdinalPosition, - Type: primitiveType, - ConvertedType: primitiveConvertedType, - } - - // Set RepetitionType - if pgSchemaColumn.IsNullable == PG_TRUE { - parquetSchemaField.RepetitionType = PARQUET_SCHEMA_REPETITION_TYPE_OPTIONAL - } else { - parquetSchemaField.RepetitionType = PARQUET_SCHEMA_REPETITION_TYPE_REQUIRED - } - - // Set other field properties - switch pgSchemaColumn.UdtName { - case "numeric": - scale, err := StringToInt(pgSchemaColumn.NumericScale) - PanicIfError(pgSchemaColumn.config, err) - precision, err := StringToInt(pgSchemaColumn.NumericPrecision) - PanicIfError(pgSchemaColumn.config, err) - if precision > PARQUET_MAX_DECIMAL_PRECISION { - precision = PARQUET_MAX_DECIMAL_PRECISION - } else if precision == 0 { - precision = PARQUET_MAX_DECIMAL_PRECISION / 2 - scale = PARQUET_MAX_DECIMAL_PRECISION / 2 - } - - parquetSchemaField.Scale = IntToString(scale) - parquetSchemaField.Precision = IntToString(precision) - parquetSchemaField.Length = IntToString(scale + precision) - default: - if pgSchemaColumn.DataType == PG_DATA_TYPE_ARRAY { - parquetSchemaField.NestedType = parquetSchemaField.Type - parquetSchemaField.NestedConvertedType = parquetSchemaField.ConvertedType - parquetSchemaField.Type = "LIST" - parquetSchemaField.ConvertedType = "" - } - } - - return parquetSchemaField -} - -func (pgSchemaColumn *PgSchemaColumn) parquetPrimitiveValue(value string) interface{} { - switch strings.TrimLeft(pgSchemaColumn.UdtName, "_") { - case "varchar", "char", "text", "bit", "bytea", "jsonb", "json", "numeric", "uuid", "interval", - "point", "line", "lseg", "box", "path", "polygon", "circle", - "cidr", "inet", "macaddr", "macaddr8", - "tsvector", "xml", "pg_snapshot": - return value - case "bpchar": - trimmedValue := strings.TrimRight(value, " ") - return trimmedValue - case "int2", "int4": - intValue, err := StringToInt(value) - PanicIfError(pgSchemaColumn.config, err) - return int32(intValue) - case "int8": - intValue, err := strconv.ParseInt(value, 10, 64) - PanicIfError(pgSchemaColumn.config, err) - return intValue - case "xid": - intValue, err := strconv.ParseUint(value, 10, 32) - PanicIfError(pgSchemaColumn.config, err) - return intValue - case "xid8": - intValue, err := strconv.ParseUint(value, 10, 64) - PanicIfError(pgSchemaColumn.config, err) - return intValue - case "float4": - floatValue, err := strconv.ParseFloat(value, 32) - PanicIfError(pgSchemaColumn.config, err) - if math.IsNaN(floatValue) { - return PARQUET_NAN - } - return float32(floatValue) - case "float8": - floatValue, err := strconv.ParseFloat(value, 64) - PanicIfError(pgSchemaColumn.config, err) - if math.IsNaN(floatValue) { - return PARQUET_NAN - } - return floatValue - case "bool": - boolValue, err := strconv.ParseBool(value) - PanicIfError(pgSchemaColumn.config, err) - return boolValue - case "timestamp": - if pgSchemaColumn.DatetimePrecision == "6" { - parsedTime, err := time.Parse("2006-01-02 15:04:05.999999", value) - PanicIfError(pgSchemaColumn.config, err) - return parsedTime.UnixMicro() - } else { - parsedTime, err := time.Parse("2006-01-02 15:04:05.999", value) - PanicIfError(pgSchemaColumn.config, err) - return parsedTime.UnixMilli() - } - case "timestamptz": - if pgSchemaColumn.DatetimePrecision == "6" { - parsedTime, err := time.Parse("2006-01-02 15:04:05.999999-07:00", value) - if err != nil { - parsedTime, err = time.Parse("2006-01-02 15:04:05.999999-07", value) - PanicIfError(pgSchemaColumn.config, err) - } - return parsedTime.UnixMicro() - } else { - parsedTime, err := time.Parse("2006-01-02 15:04:05.999-07:00", value) - if err != nil { - parsedTime, err = time.Parse("2006-01-02 15:04:05.999-07", value) - PanicIfError(pgSchemaColumn.config, err) - } - return parsedTime.UnixMilli() - } - case "time": - if pgSchemaColumn.DatetimePrecision == "6" { - parsedTime, err := time.Parse("15:04:05.999999", value) - PanicIfError(pgSchemaColumn.config, err) - return int64(-EPOCH_TIME_MS*1000 + parsedTime.UnixMicro()) - } else { - parsedTime, err := time.Parse("15:04:05.999", value) - PanicIfError(pgSchemaColumn.config, err) - return -EPOCH_TIME_MS + parsedTime.UnixMilli() - } - case "timetz": - if pgSchemaColumn.DatetimePrecision == "6" { - parsedTime, err := time.Parse("15:04:05.999999-07", value) - PanicIfError(pgSchemaColumn.config, err) - return int64(-EPOCH_TIME_MS*1000 + parsedTime.UnixMicro()) - } else { - parsedTime, err := time.Parse("15:04:05.999-07", value) - PanicIfError(pgSchemaColumn.config, err) - return -EPOCH_TIME_MS + parsedTime.UnixMilli() - } - case "date": - parsedTime, err := StringDateToTime(value) - PanicIfError(pgSchemaColumn.config, err) - return parsedTime.Unix() / 86400 - default: - // User-defined types - if pgSchemaColumn.Namespace != PG_SCHEMA_PG_CATALOG { - return value - } - } - - Panic(pgSchemaColumn.config, "Unsupported PostgreSQL value: "+value) - return nil -} - -func (pgSchemaColumn *PgSchemaColumn) parquetPrimitiveTypes() (primitiveType string, primitiveConvertedType string) { - switch strings.TrimLeft(pgSchemaColumn.UdtName, "_") { - case "varchar", "char", "text", "bpchar", "bit", "bytea", "interval", "jsonb", "json", - "point", "line", "lseg", "box", "path", "polygon", "circle", - "cidr", "inet", "macaddr", "macaddr8", - "uuid", // DuckDB doesn't support BLOB (FIXED_LEN_BYTE_ARRAY) -> UUID type casting, use a string instead - "tsvector", "xml", "pg_snapshot": - return "BYTE_ARRAY", "UTF8" - case "date": - return "INT32", "DATE" - case "int2", "int4": - return "INT32", "" - case "int8": - return "INT64", "" - case "float4": - return "FLOAT", "" - case "float8": - return "DOUBLE", "" - case "numeric": - return "FIXED_LEN_BYTE_ARRAY", "DECIMAL" - case "xid": - return "INT32", "UINT_32" - case "xid8": - return "INT64", "UINT_64" - case "bool": - return "BOOLEAN", "" - case "time", "timetz": - if pgSchemaColumn.DatetimePrecision == "6" { - return "INT64", "TIME_MICROS" - } else { - return "INT32", "TIME_MILLIS" - } - case "timestamp", "timestamptz": - if pgSchemaColumn.DatetimePrecision == "6" { - return "INT64", "TIMESTAMP_MICROS" - } else { - return "INT64", "TIMESTAMP_MILLIS" - } - default: - // User-defined types - if pgSchemaColumn.Namespace != PG_SCHEMA_PG_CATALOG { - return "BYTE_ARRAY", "UTF8" - } - } - - Panic(pgSchemaColumn.config, "Unsupported PostgreSQL type: "+pgSchemaColumn.UdtName) - return "", "" -} - -func (pgSchemaColumn *PgSchemaColumn) icebergPrimitiveType() string { - switch strings.TrimLeft(pgSchemaColumn.UdtName, "_") { - case "varchar", "char", "text", "interval", "jsonb", "json", "bpchar", "bit", - "point", "line", "lseg", "box", "path", "polygon", "circle", - "cidr", "inet", "macaddr", "macaddr8", - "tsvector", "xml", "pg_snapshot": - return "string" - case "uuid": - return "uuid" - case "int2", "int4", "xid": - return "int" - case "int8", "xid8": - return "long" - case "float4", "float8": - return "float" - case "numeric": - if pgSchemaColumn.NumericScale == "0" { - return "decimal" - } - - precision, err := StringToInt(pgSchemaColumn.NumericPrecision) - PanicIfError(pgSchemaColumn.config, err) - if precision > PARQUET_MAX_DECIMAL_PRECISION { - precision = PARQUET_MAX_DECIMAL_PRECISION - } - return "decimal(" + IntToString(precision) + ", " + pgSchemaColumn.NumericScale + ")" - case "bool": - return "boolean" - case "date": - return "date" - case "bytea": - return "binary" - case "timestamp", "timestamptz": - if pgSchemaColumn.DatetimePrecision == "9" { - return "timestamp_ns" - } else { - return "timestamp" - } - case "time", "timetz": - return "time" - default: - // User-defined types - if pgSchemaColumn.Namespace != PG_SCHEMA_PG_CATALOG { - return "string" - } - } - - Panic(pgSchemaColumn.config, "Unsupported PostgreSQL type: "+pgSchemaColumn.UdtName) - return "" -} diff --git a/src/query_handler.go b/src/query_handler.go deleted file mode 100644 index 8f8b2c6..0000000 --- a/src/query_handler.go +++ /dev/null @@ -1,783 +0,0 @@ -package main - -import ( - "bytes" - "context" - "database/sql" - "encoding/binary" - "encoding/csv" - "fmt" - "math/big" - "strings" - - "github.com/google/uuid" - "github.com/jackc/pgx/v5/pgproto3" - "github.com/jackc/pgx/v5/pgtype" - duckDb "github.com/marcboeker/go-duckdb" -) - -const ( - FALLBACK_SQL_QUERY = "SELECT 1" - INSPECT_SQL_COMMENT = " --INSPECT" -) - -type QueryHandler struct { - duckdb *Duckdb - icebergReader *IcebergReader - queryRemapper *QueryRemapper - config *Config -} - -//////////////////////////////////////////////////////////////////////////////////////////////////// - -type PreparedStatement struct { - // Parse - Name string - OriginalQuery string - Query string - Statement *sql.Stmt - ParameterOIDs []uint32 - - // Bind - Bound bool - Variables []interface{} - Portal string - - // Describe - Described bool - - // Describe/Execute - Rows *sql.Rows -} - -//////////////////////////////////////////////////////////////////////////////////////////////////// - -type NullDecimal struct { - Present bool - Value duckDb.Decimal -} - -func (nullDecimal *NullDecimal) Scan(value interface{}) error { - if value == nil { - nullDecimal.Present = false - return nil - } - - nullDecimal.Present = true - nullDecimal.Value = value.(duckDb.Decimal) - return nil -} - -func (nullDecimal NullDecimal) String() string { - if nullDecimal.Present { - return fmt.Sprintf("%v", nullDecimal.Value.Float64()) - } - return "" -} - -//////////////////////////////////////////////////////////////////////////////////////////////////// - -type NullInterval struct { - Present bool - Value duckDb.Interval -} - -func (nullInterval *NullInterval) Scan(value interface{}) error { - if value == nil { - nullInterval.Present = false - return nil - } - - nullInterval.Present = true - nullInterval.Value = value.(duckDb.Interval) - return nil -} - -func (nullInterval NullInterval) String() string { - if nullInterval.Present { - return fmt.Sprintf("%d months %d days %d microseconds", nullInterval.Value.Months, nullInterval.Value.Days, nullInterval.Value.Micros) - } - return "" -} - -//////////////////////////////////////////////////////////////////////////////////////////////////// - -type NullUint32 struct { - Present bool - Value uint32 -} - -func (nullUint32 *NullUint32) Scan(value interface{}) error { - if value == nil { - nullUint32.Present = false - return nil - } - - nullUint32.Present = true - nullUint32.Value = value.(uint32) - return nil -} - -func (nullUint32 NullUint32) String() string { - if nullUint32.Present { - return fmt.Sprintf("%v", nullUint32.Value) - } - return "" -} - -//////////////////////////////////////////////////////////////////////////////////////////////////// - -type NullUint64 struct { - Present bool - Value uint64 -} - -func (nullUint64 *NullUint64) Scan(value interface{}) error { - if value == nil { - nullUint64.Present = false - return nil - } - - nullUint64.Present = true - nullUint64.Value = value.(uint64) - return nil -} - -func (nullUint64 NullUint64) String() string { - if nullUint64.Present { - return fmt.Sprintf("%v", nullUint64.Value) - } - return "" -} - -//////////////////////////////////////////////////////////////////////////////////////////////////// - -type NullBigInt struct { - Present bool - Value *big.Int -} - -func (nullBigInt *NullBigInt) Scan(value interface{}) error { - if value == nil { - nullBigInt.Present = false - return nil - } - - nullBigInt.Present = true - nullBigInt.Value = value.(*big.Int) - return nil -} - -func (nullBigInt NullBigInt) String() string { - if nullBigInt.Present { - return fmt.Sprintf("%v", nullBigInt.Value) - } - return "" -} - -//////////////////////////////////////////////////////////////////////////////////////////////////// - -type NullUuid struct { - Present bool - Value []uint8 -} - -func (nullUuid *NullUuid) Scan(value interface{}) error { - if value == nil { - nullUuid.Present = false - return nil - } - - nullUuid.Present = true - nullUuid.Value = value.([]uint8) - return nil -} - -func (nullUuid NullUuid) String() string { - if nullUuid.Present { - uuidString := string(nullUuid.Value) - return fmt.Sprintf("%x-%x-%x-%x-%x", uuidString[:4], uuidString[4:6], uuidString[6:8], uuidString[8:10], uuidString[10:]) - } - return "" -} - -//////////////////////////////////////////////////////////////////////////////////////////////////// - -type NullArray struct { - Present bool - Value []interface{} -} - -func (nullArray *NullArray) Scan(value interface{}) error { - if value == nil { - nullArray.Present = false - return nil - } - - nullArray.Present = true - nullArray.Value = value.([]interface{}) - return nil -} - -func (nullArray NullArray) String() string { - if nullArray.Present { - var stringVals []string - for _, v := range nullArray.Value { - switch v.(type) { - case []uint8: - stringVals = append(stringVals, fmt.Sprintf("%s", v)) - default: - stringVals = append(stringVals, fmt.Sprintf("%v", v)) - } - } - buffer := &bytes.Buffer{} - csvWriter := csv.NewWriter(buffer) - err := csvWriter.Write(stringVals) - if err != nil { - return "" - } - csvWriter.Flush() - return "{" + strings.TrimRight(buffer.String(), "\n") + "}" - } - return "" -} - -//////////////////////////////////////////////////////////////////////////////////////////////////// - -func NewQueryHandler(config *Config, duckdb *Duckdb, icebergReader *IcebergReader) *QueryHandler { - queryHandler := &QueryHandler{ - duckdb: duckdb, - icebergReader: icebergReader, - queryRemapper: NewQueryRemapper(config, icebergReader, duckdb), - config: config, - } - - queryHandler.createSchemas() - - return queryHandler -} - -func (queryHandler *QueryHandler) HandleSimpleQuery(originalQuery string) ([]pgproto3.Message, error) { - queryStatements, originalQueryStatements, err := queryHandler.queryRemapper.ParseAndRemapQuery(originalQuery) - if err != nil { - return nil, err - } - if len(queryStatements) == 0 { - return []pgproto3.Message{&pgproto3.EmptyQueryResponse{}}, nil - } - - var queriesMessages []pgproto3.Message - - for i, queryStatement := range queryStatements { - rows, err := queryHandler.duckdb.QueryContext(context.Background(), queryStatement) - if err != nil { - errorMessage := err.Error() - if errorMessage == "Binder Error: UNNEST requires a single list as input" { - // https://github.com/duckdb/duckdb/issues/11693 - LogWarn(queryHandler.config, "Couldn't handle query via DuckDB:", queryStatement+"\n"+err.Error()) - queriesMsgs, err := queryHandler.HandleSimpleQuery(FALLBACK_SQL_QUERY) // self-recursion - if err != nil { - return nil, err - } - queriesMessages = append(queriesMessages, queriesMsgs...) - continue - } else { - return nil, err - } - } - defer rows.Close() - - var queryMessages []pgproto3.Message - descriptionMessages, err := queryHandler.rowsToDescriptionMessages(rows, originalQueryStatements[i]) - if err != nil { - return nil, err - } - queryMessages = append(queryMessages, descriptionMessages...) - dataMessages, err := queryHandler.rowsToDataMessages(rows, originalQueryStatements[i]) - if err != nil { - return nil, err - } - queryMessages = append(queryMessages, dataMessages...) - - queriesMessages = append(queriesMessages, queryMessages...) - } - - return queriesMessages, nil -} - -func (queryHandler *QueryHandler) HandleParseQuery(message *pgproto3.Parse) ([]pgproto3.Message, *PreparedStatement, error) { - ctx := context.Background() - originalQuery := string(message.Query) - queryStatements, _, err := queryHandler.queryRemapper.ParseAndRemapQuery(originalQuery) - if err != nil { - return nil, nil, err - } - if len(queryStatements) > 1 { - return nil, nil, fmt.Errorf("multiple queries in a single parse message are not supported: %s", originalQuery) - } - - preparedStatement := &PreparedStatement{ - Name: message.Name, - OriginalQuery: originalQuery, - ParameterOIDs: message.ParameterOIDs, - } - if len(queryStatements) == 0 { - return []pgproto3.Message{&pgproto3.ParseComplete{}}, preparedStatement, nil - } - - query := queryStatements[0] - preparedStatement.Query = query - statement, err := queryHandler.duckdb.PrepareContext(ctx, query) - preparedStatement.Statement = statement - if err != nil { - return nil, nil, err - } - - return []pgproto3.Message{&pgproto3.ParseComplete{}}, preparedStatement, nil -} - -func (queryHandler *QueryHandler) HandleBindQuery(message *pgproto3.Bind, preparedStatement *PreparedStatement) ([]pgproto3.Message, *PreparedStatement, error) { - if message.PreparedStatement != preparedStatement.Name { - return nil, nil, fmt.Errorf("prepared statement mismatch, %s instead of %s: %s", message.PreparedStatement, preparedStatement.Name, preparedStatement.OriginalQuery) - } - - var variables []interface{} - paramFormatCodes := message.ParameterFormatCodes - - for i, param := range message.Parameters { - if param == nil { - continue - } - - textFormat := true - if len(paramFormatCodes) == 1 { - textFormat = paramFormatCodes[0] == 0 - } else if len(paramFormatCodes) > 1 { - textFormat = paramFormatCodes[i] == 0 - } - - if textFormat { - variables = append(variables, string(param)) - } else if len(param) == 4 { - variables = append(variables, int32(binary.BigEndian.Uint32(param))) - } else if len(param) == 8 { - variables = append(variables, int64(binary.BigEndian.Uint64(param))) - } else if len(param) == 16 { - variables = append(variables, uuid.UUID(param).String()) - } else { - return nil, nil, fmt.Errorf("unsupported parameter format: %v (length %d). Original query: %s", param, len(param), preparedStatement.OriginalQuery) - } - } - - LogDebug(queryHandler.config, "Bound variables:", variables) - preparedStatement.Bound = true - preparedStatement.Variables = variables - preparedStatement.Portal = message.DestinationPortal - - messages := []pgproto3.Message{&pgproto3.BindComplete{}} - - return messages, preparedStatement, nil -} - -func (queryHandler *QueryHandler) HandleDescribeQuery(message *pgproto3.Describe, preparedStatement *PreparedStatement) ([]pgproto3.Message, *PreparedStatement, error) { - switch message.ObjectType { - case 'S': // Statement - if message.Name != preparedStatement.Name { - return nil, nil, fmt.Errorf("statement mismatch, %s instead of %s: %s", message.Name, preparedStatement.Name, preparedStatement.OriginalQuery) - } - case 'P': // Portal - if message.Name != preparedStatement.Portal { - return nil, nil, fmt.Errorf("portal mismatch, %s instead of %s: %s", message.Name, preparedStatement.Portal, preparedStatement.OriginalQuery) - } - } - - preparedStatement.Described = true - if preparedStatement.Query == "" || !preparedStatement.Bound { // Empty query or Parse->[No Bind]->Describe - return []pgproto3.Message{&pgproto3.NoData{}}, preparedStatement, nil - } - - rows, err := preparedStatement.Statement.QueryContext(context.Background(), preparedStatement.Variables...) - if err != nil { - return nil, nil, fmt.Errorf("couldn't execute statement: %w. Original query: %s", err, preparedStatement.OriginalQuery) - } - preparedStatement.Rows = rows - - messages, err := queryHandler.rowsToDescriptionMessages(preparedStatement.Rows, preparedStatement.OriginalQuery) - if err != nil { - return nil, nil, err - } - return messages, preparedStatement, nil -} - -func (queryHandler *QueryHandler) HandleExecuteQuery(message *pgproto3.Execute, preparedStatement *PreparedStatement) ([]pgproto3.Message, error) { - if message.Portal != preparedStatement.Portal { - return nil, fmt.Errorf("portal mismatch, %s instead of %s: %s", message.Portal, preparedStatement.Portal, preparedStatement.OriginalQuery) - } - - if preparedStatement.Query == "" { - return []pgproto3.Message{&pgproto3.EmptyQueryResponse{}}, nil - } - - if preparedStatement.Rows == nil { // Parse->[No Bind]->Describe->Execute or Parse->Bind->[No Describe]->Execute - rows, err := preparedStatement.Statement.QueryContext(context.Background(), preparedStatement.Variables...) - if err != nil { - return nil, err - } - preparedStatement.Rows = rows - } - - defer preparedStatement.Rows.Close() - - return queryHandler.rowsToDataMessages(preparedStatement.Rows, preparedStatement.OriginalQuery) -} - -func (queryHandler *QueryHandler) createSchemas() { - ctx := context.Background() - schemas, err := queryHandler.icebergReader.Schemas() - PanicIfError(queryHandler.config, err) - - for _, schema := range schemas { - _, err := queryHandler.duckdb.ExecContext( - ctx, - "CREATE SCHEMA IF NOT EXISTS \"$schema\"", - map[string]string{"schema": schema}, - ) - PanicIfError(queryHandler.config, err) - } -} - -func (queryHandler *QueryHandler) rowsToDescriptionMessages(rows *sql.Rows, originalQuery string) ([]pgproto3.Message, error) { - cols, err := rows.ColumnTypes() - if err != nil { - return nil, fmt.Errorf("couldn't get column types: %w. Original query: %s", err, originalQuery) - } - - var messages []pgproto3.Message - - rowDescription := queryHandler.generateRowDescription(cols) - if rowDescription != nil { - messages = append(messages, rowDescription) - } - - return messages, nil -} - -func (queryHandler *QueryHandler) rowsToDataMessages(rows *sql.Rows, originalQuery string) ([]pgproto3.Message, error) { - cols, err := rows.ColumnTypes() - if err != nil { - return nil, fmt.Errorf("couldn't get column types: %w. Original query: %s", err, originalQuery) - } - - var messages []pgproto3.Message - for rows.Next() { - dataRow, err := queryHandler.generateDataRow(rows, cols) - if err != nil { - return nil, fmt.Errorf("couldn't get data row: %w. Original query: %s", err, originalQuery) - } - messages = append(messages, dataRow) - } - - commandTag := FALLBACK_SQL_QUERY - upperOriginalQueryStatement := strings.ToUpper(originalQuery) - switch { - case strings.HasPrefix(upperOriginalQueryStatement, "SET "): - commandTag = "SET" - case strings.HasPrefix(upperOriginalQueryStatement, "SHOW "): - commandTag = "SHOW" - case strings.HasPrefix(upperOriginalQueryStatement, "DISCARD ALL"): - commandTag = "DISCARD ALL" - case strings.HasPrefix(upperOriginalQueryStatement, "BEGIN"): - commandTag = "BEGIN" - } - - messages = append(messages, &pgproto3.CommandComplete{CommandTag: []byte(commandTag)}) - return messages, nil -} - -func (queryHandler *QueryHandler) generateRowDescription(cols []*sql.ColumnType) *pgproto3.RowDescription { - description := pgproto3.RowDescription{Fields: []pgproto3.FieldDescription{}} - - for _, col := range cols { - typeIod := queryHandler.columnTypeOid(col) - - if col.Name() == "Success" && typeIod == pgtype.BoolOID && len(cols) == 1 { - // Skip the "Success" DuckDB column returned from SET ... commands - return nil - } - - description.Fields = append(description.Fields, pgproto3.FieldDescription{ - Name: []byte(col.Name()), - TableOID: 0, - TableAttributeNumber: 0, - DataTypeOID: typeIod, - DataTypeSize: -1, - TypeModifier: -1, - Format: 0, - }) - } - return &description -} - -// https://pkg.go.dev/github.com/jackc/pgx/v5/pgtype#pkg-constants -func (queryHandler *QueryHandler) columnTypeOid(col *sql.ColumnType) uint32 { - switch col.DatabaseTypeName() { - case "BOOLEAN": - return pgtype.BoolOID - case "BOOLEAN[]": - return pgtype.BoolArrayOID - case "SMALLINT": - return pgtype.Int2OID - case "SMALLINT[]": - return pgtype.Int2ArrayOID - case "INTEGER": - return pgtype.Int4OID - case "INTEGER[]": - return pgtype.Int4ArrayOID - case "UINTEGER": - return pgtype.XIDOID - case "UINTEGER[]": - return pgtype.XIDArrayOID - case "BIGINT": - if isSystemTableOidColumn(col.Name()) { - return pgtype.OIDOID - } - return pgtype.Int8OID - case "BIGINT[]": - return pgtype.Int8ArrayOID - case "UBIGINT": - return pgtype.XID8OID - case "UBIGINT[]": - return pgtype.XID8ArrayOID - case "HUGEINT": - return pgtype.NumericOID - case "HUGEINT[]": - return pgtype.NumericArrayOID - case "FLOAT": - return pgtype.Float4OID - case "FLOAT[]": - return pgtype.Float4ArrayOID - case "DOUBLE": - return pgtype.Float8OID - case "DOUBLE[]": - return pgtype.Float8ArrayOID - case "VARCHAR": - return pgtype.TextOID - case "VARCHAR[]": - return pgtype.TextArrayOID - case "TIME": - return pgtype.TimeOID - case "TIME[]": - return pgtype.TimeArrayOID - case "DATE": - return pgtype.DateOID - case "DATE[]": - return pgtype.DateArrayOID - case "TIMESTAMP": - return pgtype.TimestampOID - case "TIMESTAMP[]": - return pgtype.TimestampArrayOID - case "TIMESTAMPTZ": - return pgtype.TimestamptzOID - case "TIMESTAMPTZ[]": - return pgtype.TimestamptzArrayOID - case "UUID": - return pgtype.UUIDOID - case "UUID[]": - return pgtype.UUIDArrayOID - case "INTERVAL": - return pgtype.IntervalOID - case "INTERVAL[]": - return pgtype.IntervalArrayOID - default: - if strings.HasPrefix(col.DatabaseTypeName(), "DECIMAL") { - if strings.HasSuffix(col.DatabaseTypeName(), "[]") { - return pgtype.NumericArrayOID - } else { - return pgtype.NumericOID - } - } - - Panic(queryHandler.config, "Unsupported serialized column type: "+col.DatabaseTypeName()) - return 0 - } -} - -func isSystemTableOidColumn(colName string) bool { - oidColumns := map[string]bool{ - "oid": true, - "tableoid": true, - "relnamespace": true, - "relowner": true, - "relfilenode": true, - "did": true, - "objoid": true, - "classoid": true, - } - - return oidColumns[colName] -} - -func (queryHandler *QueryHandler) generateDataRow(rows *sql.Rows, cols []*sql.ColumnType) (*pgproto3.DataRow, error) { - valuePtrs := make([]interface{}, len(cols)) - for i, col := range cols { - switch col.ScanType().String() { - case "int16": - var value sql.NullInt16 - valuePtrs[i] = &value - case "int32": - var value sql.NullInt32 - valuePtrs[i] = &value - case "int64": - var value sql.NullInt64 - valuePtrs[i] = &value - case "uint32": // xid - var value NullUint32 - valuePtrs[i] = &value - case "uint64": // xid8 - var value NullUint64 - valuePtrs[i] = &value - case "float64", "float32": - var value sql.NullFloat64 - valuePtrs[i] = &value - case "string": - var value sql.NullString - valuePtrs[i] = &value - case "[]uint8": // uuid - var value NullUuid - valuePtrs[i] = &value - case "bool": - var value sql.NullBool - valuePtrs[i] = &value - case "time.Time": - var value sql.NullTime - valuePtrs[i] = &value - case "*big.Int": - var value NullBigInt - valuePtrs[i] = &value - case "duckdb.Decimal": - var value NullDecimal - valuePtrs[i] = &value - case "duckdb.Interval": - var value NullInterval - valuePtrs[i] = &value - case "[]interface {}": - var value NullArray - valuePtrs[i] = &value - default: - Panic(queryHandler.config, "Unsupported data row type: "+col.ScanType().String()) - } - } - - err := rows.Scan(valuePtrs...) - if err != nil { - return nil, err - } - - var values [][]byte - for i, valuePtr := range valuePtrs { - switch value := valuePtr.(type) { - case *sql.NullInt16: - if value.Valid { - values = append(values, []byte(IntToString(int(value.Int16)))) - } else { - values = append(values, nil) - } - case *sql.NullInt32: - if value.Valid { - values = append(values, []byte(IntToString(int(value.Int32)))) - } else { - values = append(values, nil) - } - case *sql.NullInt64: - if value.Valid { - values = append(values, []byte(IntToString(int(value.Int64)))) - } else { - values = append(values, nil) - } - case *NullUint32: - if value.Present { - values = append(values, []byte(value.String())) - } else { - values = append(values, nil) - } - case *NullUint64: - if value.Present { - values = append(values, []byte(value.String())) - } else { - values = append(values, nil) - } - case *sql.NullFloat64: - if value.Valid { - values = append(values, []byte(fmt.Sprintf("%v", value.Float64))) - } else { - values = append(values, nil) - } - case *sql.NullString: - if value.Valid { - values = append(values, []byte(value.String)) - } else { - values = append(values, nil) - } - case *sql.NullBool: - if value.Valid { - values = append(values, []byte(fmt.Sprintf("%v", value.Bool)[0:1])) - } else { - values = append(values, nil) - } - case *sql.NullTime: - if value.Valid { - switch cols[i].DatabaseTypeName() { - case "DATE": - values = append(values, []byte(value.Time.Format("2006-01-02"))) - case "TIME": - values = append(values, []byte(value.Time.Format("15:04:05.999999"))) - case "TIMESTAMP": - values = append(values, []byte(value.Time.Format("2006-01-02 15:04:05.999999"))) - case "TIMESTAMPTZ": - values = append(values, []byte(value.Time.Format("2006-01-02 15:04:05.999999-07:00"))) - default: - Panic(queryHandler.config, "Unsupported scanned time type: "+cols[i].DatabaseTypeName()) - } - } else { - values = append(values, nil) - } - case *NullBigInt: - if value.Present { - values = append(values, []byte(value.String())) - } else { - values = append(values, nil) - } - case *NullDecimal: - if value.Present { - values = append(values, []byte(value.String())) - } else { - values = append(values, nil) - } - case *NullInterval: - if value.Present { - values = append(values, []byte(value.String())) - } else { - values = append(values, nil) - } - case *NullArray: - if value.Present { - values = append(values, []byte(value.String())) - } else { - values = append(values, nil) - } - case *NullUuid: - if value.Present { - values = append(values, []byte(value.String())) - } else { - values = append(values, nil) - } - case *string: - values = append(values, []byte(*value)) - default: - Panic(queryHandler.config, "Unsupported scanned row type: "+cols[i].ScanType().Name()) - } - } - dataRow := pgproto3.DataRow{Values: values} - - return &dataRow, nil -} diff --git a/src/server/config.go b/src/server/config.go new file mode 100644 index 0000000..3238ba4 --- /dev/null +++ b/src/server/config.go @@ -0,0 +1,131 @@ +package main + +import ( + "flag" + "os" + "slices" + "strings" +) + +const ( + VERSION = "1.0.0-beta.1" + + ENV_PORT = "BEMIDB_PORT" + ENV_DATABASE = "BEMIDB_DATABASE" + ENV_USER = "BEMIDB_USER" + ENV_PASSWORD = "BEMIDB_PASSWORD" + ENV_HOST = "BEMIDB_HOST" + + ENV_LOG_LEVEL = "BEMIDB_LOG_LEVEL" + ENV_DISABLE_ANONYMOUS_ANALYTICS = "BEMIDB_DISABLE_ANONYMOUS_ANALYTICS" + + ENV_CATALOG_DATABASE_URL = "CATALOG_DATABASE_URL" + + ENV_AWS_REGION = "AWS_REGION" + ENV_AWS_S3_ENDPOINT = "AWS_S3_ENDPOINT" + ENV_AWS_S3_BUCKET = "AWS_S3_BUCKET" + ENV_AWS_ACCESS_KEY_ID = "AWS_ACCESS_KEY_ID" + ENV_AWS_SECRET_ACCESS_KEY = "AWS_SECRET_ACCESS_KEY" + + DEFAULT_LOG_LEVEL = "INFO" + DEFAULT_HOST = "0.0.0.0" + DEFAULT_PORT = "54321" + DEFAULT_DATABASE = "bemidb" + DEFAULT_AWS_S3_ENDPOINT = "s3.amazonaws.com" +) + +type AwsConfig struct { + Region string + S3Endpoint string // optional + S3Bucket string + AccessKeyId string + SecretAccessKey string +} + +type Config struct { + Host string + Port string + Database string + User string + EncryptedPassword string + LogLevel string + CatalogDatabaseUrl string + Aws AwsConfig + DisableAnonymousAnalytics bool +} + +type configParseValues struct { + password string +} + +var _config Config +var _configParseValues configParseValues + +func init() { + registerFlags() +} + +func registerFlags() { + flag.StringVar(&_config.Host, "host", os.Getenv(ENV_HOST), "Host for BemiDB to listen on") + flag.StringVar(&_config.Port, "port", os.Getenv(ENV_PORT), "Port for BemiDB to listen on") + flag.StringVar(&_config.Database, "database", os.Getenv(ENV_DATABASE), "Database name") + flag.StringVar(&_config.User, "user", os.Getenv(ENV_USER), "Database user") + flag.StringVar(&_configParseValues.password, "password", os.Getenv(ENV_PASSWORD), "Database password") + flag.StringVar(&_config.LogLevel, "log-level", os.Getenv(ENV_LOG_LEVEL), "Log level: \"ERROR\", \"WARN\", \"INFO\", \"DEBUG\", \"TRACE\". Default: \""+DEFAULT_LOG_LEVEL+`"`) + flag.StringVar(&_config.CatalogDatabaseUrl, "catalog-database-url", os.Getenv(ENV_CATALOG_DATABASE_URL), "Catalog database URL") + flag.StringVar(&_config.Aws.Region, "aws-region", os.Getenv(ENV_AWS_REGION), "AWS region") + flag.StringVar(&_config.Aws.S3Endpoint, "aws-s3-endpoint", os.Getenv(ENV_AWS_S3_ENDPOINT), "AWS S3 endpoint. Default: \""+DEFAULT_AWS_S3_ENDPOINT+`"`) + flag.StringVar(&_config.Aws.S3Bucket, "aws-s3-bucket", os.Getenv(ENV_AWS_S3_BUCKET), "AWS S3 bucket name") + flag.StringVar(&_config.Aws.AccessKeyId, "aws-access-key-id", os.Getenv(ENV_AWS_ACCESS_KEY_ID), "AWS access key ID") + flag.StringVar(&_config.Aws.SecretAccessKey, "aws-secret-access-key", os.Getenv(ENV_AWS_SECRET_ACCESS_KEY), "AWS secret access key") + flag.BoolVar(&_config.DisableAnonymousAnalytics, "disable-anonymous-analytics", os.Getenv(ENV_DISABLE_ANONYMOUS_ANALYTICS) == "true", "Disable anonymous analytics collection") +} + +func parseFlags() { + flag.Parse() + + if _config.Host == "" { + _config.Host = DEFAULT_HOST + } + if _config.Port == "" { + _config.Port = DEFAULT_PORT + } + if _config.Database == "" { + _config.Database = DEFAULT_DATABASE + } + if _configParseValues.password != "" { + _config.EncryptedPassword = StringToScramSha256(_configParseValues.password) + } + + if _config.LogLevel == "" { + _config.LogLevel = DEFAULT_LOG_LEVEL + } else if !slices.Contains(LOG_LEVELS, _config.LogLevel) { + panic("Invalid log level " + _config.LogLevel + ". Must be one of " + strings.Join(LOG_LEVELS, ", ")) + } + if _config.CatalogDatabaseUrl == "" { + panic("Catalog database URL is required") + } + + if _config.Aws.Region == "" { + panic("AWS region is required") + } + if _config.Aws.S3Endpoint == "" { + _config.Aws.S3Endpoint = DEFAULT_AWS_S3_ENDPOINT + } + if _config.Aws.S3Bucket == "" { + panic("AWS S3 bucket name is required") + } + if _config.Aws.AccessKeyId != "" && _config.Aws.SecretAccessKey == "" { + panic("AWS secret access key is required") + } + if _config.Aws.AccessKeyId == "" && _config.Aws.SecretAccessKey != "" { + panic("AWS access key ID is required") + } + + _configParseValues = configParseValues{} +} + +func LoadConfig() *Config { + parseFlags() + return &_config +} diff --git a/src/custom_types.go b/src/server/custom_types.go similarity index 60% rename from src/custom_types.go rename to src/server/custom_types.go index 7d480f6..e03c9e6 100644 --- a/src/custom_types.go +++ b/src/server/custom_types.go @@ -9,20 +9,23 @@ import ( type Set[T comparable] map[T]struct{} -func NewSet[T comparable](items []T) Set[T] { +func NewSet[T comparable]() Set[T] { set := make(Set[T]) + return set +} +func (set Set[T]) Add(item T) Set[T] { + set[item] = struct{}{} + return set +} + +func (set Set[T]) AddAll(items []T) Set[T] { for _, item := range items { set.Add(item) } - return set } -func (set Set[T]) Add(item T) { - set[item] = struct{}{} -} - func (set Set[T]) Contains(item T) bool { _, ok := set[item] return ok @@ -39,17 +42,6 @@ func (set Set[T]) Values() []T { //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -type IcebergSchemaTable struct { - Schema string - Table string -} - -func (schemaTable IcebergSchemaTable) String() string { - return fmt.Sprintf(`"%s"."%s"`, schemaTable.Schema, schemaTable.Table) -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - type IcebergTableField struct { Name string Type string @@ -90,10 +82,10 @@ func NewQuerySchemaTableFromString(schemaTable string) QuerySchemaTable { } if !StringContainsUpper(qSchemaTable.Schema) { - qSchemaTable.Schema = strings.ReplaceAll(qSchemaTable.Schema, "\"", "") + qSchemaTable.Schema = strings.ReplaceAll(qSchemaTable.Schema, `"`, "") } if !StringContainsUpper(qSchemaTable.Table) { - qSchemaTable.Table = strings.ReplaceAll(qSchemaTable.Table, "\"", "") + qSchemaTable.Table = strings.ReplaceAll(qSchemaTable.Table, `"`, "") } return qSchemaTable @@ -119,34 +111,3 @@ type QuerySchemaFunction struct { Schema string Function string } - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -type PgSchemaTable struct { - Schema string - Table string - ParentPartitionedTable string -} - -func (pgSchemaTable PgSchemaTable) String() string { - return fmt.Sprintf(`"%s"."%s"`, pgSchemaTable.Schema, pgSchemaTable.Table) -} - -func (pgSchemaTable PgSchemaTable) ParentPartitionedTableString() string { - if pgSchemaTable.ParentPartitionedTable == "" { - return "" - } - - return fmt.Sprintf(`"%s"."%s"`, pgSchemaTable.Schema, pgSchemaTable.ParentPartitionedTable) -} - -func (pgSchemaTable PgSchemaTable) ToConfigArg() string { - return fmt.Sprintf(`%s.%s`, pgSchemaTable.Schema, pgSchemaTable.Table) -} - -func (pgSchemaTable PgSchemaTable) ToIcebergSchemaTable() IcebergSchemaTable { - return IcebergSchemaTable{ - Schema: pgSchemaTable.Schema, - Table: pgSchemaTable.Table, - } -} diff --git a/src/duckdb.go b/src/server/duckdb.go similarity index 62% rename from src/duckdb.go rename to src/server/duckdb.go index d454084..8b6e610 100644 --- a/src/duckdb.go +++ b/src/server/duckdb.go @@ -1,21 +1,17 @@ package main import ( - "bufio" "context" "database/sql" - "io" "regexp" "slices" "strings" - "time" - _ "github.com/marcboeker/go-duckdb" + _ "github.com/marcboeker/go-duckdb/v2" ) const ( - DUCKDB_SCHEMA_MAIN = "main" - REFRESH_IMPLICIT_AWS_CREDENTIALS_INTERVAL = 10 * time.Minute + DUCKDB_SCHEMA_MAIN = "main" ) var DUCKDB_INIT_BOOT_QUERIES = []string{ @@ -73,30 +69,24 @@ func NewDuckdb(config *Config, withPgCompatibility bool) *Duckdb { PanicIfError(config, err) } - switch config.StorageType { - case STORAGE_TYPE_S3: - if duckdb.config.Aws.AccessKeyId != "" && duckdb.config.Aws.SecretAccessKey != "" { - duckdb.setExplicitAwsCredentials(ctx) - } else { - duckdb.setImplicitAwsCredentials(ctx) - duckdb.autoRefreshImplicitAwsCredentials(ctx) - } + duckdb.setExplicitAwsCredentials(ctx) - if IsLocalHost(config.Aws.S3Endpoint) { - _, err = duckdb.ExecContext(ctx, "SET s3_use_ssl=false", nil) - PanicIfError(config, err) - } + if IsLocalHost(config.Aws.S3Endpoint) { + _, err = duckdb.ExecContext(ctx, "SET s3_use_ssl=false", nil) + PanicIfError(config, err) + } - if config.Aws.S3Endpoint != DEFAULT_AWS_S3_ENDPOINT { - // Use endpoint/bucket/key (path, deprecated on AWS) instead of bucket.endpoint/key (vhost) - _, err = duckdb.ExecContext(ctx, "SET s3_url_style='path'", nil) - PanicIfError(config, err) - } + if config.Aws.S3Endpoint != DEFAULT_AWS_S3_ENDPOINT { + // Use endpoint/bucket/key (path, deprecated on AWS) instead of bucket.endpoint/key (vhost) + _, err = duckdb.ExecContext(ctx, "SET s3_url_style='path'", nil) + PanicIfError(config, err) + } - if config.LogLevel == LOG_LEVEL_TRACE { - _, err = duckdb.ExecContext(ctx, "SET enable_http_logging=true", nil) - PanicIfError(config, err) - } + if config.LogLevel == LOG_LEVEL_TRACE { + _, err = duckdb.ExecContext(ctx, "PRAGMA enable_logging('HTTP')", nil) + PanicIfError(config, err) + _, err = duckdb.ExecContext(ctx, "SET logging_storage = 'stdout'", nil) + PanicIfError(config, err) } return duckdb @@ -142,23 +132,6 @@ func (duckdb *Duckdb) ExecTransactionContext(ctx context.Context, queries []stri return tx.Commit() } -func (duckdb *Duckdb) ExecFile(reader io.ReadCloser) { - defer reader.Close() - - lines := []string{} - scanner := bufio.NewScanner(reader) - for scanner.Scan() { - lines = append(lines, scanner.Text()) - } - PanicIfError(duckdb.config, scanner.Err()) - - ctx := context.Background() - for _, sql := range lines { - _, err := duckdb.ExecContext(ctx, sql, nil) - PanicIfError(duckdb.config, err) - } -} - func (duckdb *Duckdb) setExplicitAwsCredentials(ctx context.Context) { config := duckdb.config query := "CREATE OR REPLACE SECRET aws_s3_secret (TYPE S3, KEY_ID '$accessKeyId', SECRET '$secretAccessKey', REGION '$region', ENDPOINT '$endpoint', SCOPE '$s3Bucket')" @@ -172,32 +145,6 @@ func (duckdb *Duckdb) setExplicitAwsCredentials(ctx context.Context) { PanicIfError(config, err) } -func (duckdb *Duckdb) setImplicitAwsCredentials(ctx context.Context) { - config := duckdb.config - query := "CREATE OR REPLACE SECRET aws_s3_secret (TYPE S3, PROVIDER CREDENTIAL_CHAIN, REGION '$region', ENDPOINT '$endpoint', SCOPE '$s3Bucket')" - _, err := duckdb.ExecContext(ctx, query, map[string]string{ - "region": config.Aws.Region, - "endpoint": config.Aws.S3Endpoint, - "s3Bucket": "s3://" + config.Aws.S3Bucket, - }) - PanicIfError(config, err) -} - -func (duckdb *Duckdb) autoRefreshImplicitAwsCredentials(ctx context.Context) { - ticker := time.NewTicker(REFRESH_IMPLICIT_AWS_CREDENTIALS_INTERVAL) - go func() { - for { - select { - case <-ticker.C: - duckdb.setImplicitAwsCredentials(ctx) - case <-duckdb.stopImplicitAwsCredentialsRefreshChan: - ticker.Stop() - return - } - } - }() -} - func replaceNamedStringArgs(query string, args map[string]string) string { re := regexp.MustCompile(`['";]`) // Escape single quotes, double quotes, and semicolons from args diff --git a/src/error_utils.go b/src/server/error_utils.go similarity index 67% rename from src/error_utils.go rename to src/server/error_utils.go index db6be5a..74fb89d 100644 --- a/src/error_utils.go +++ b/src/server/error_utils.go @@ -4,14 +4,11 @@ import ( "bytes" "encoding/json" "errors" - "flag" "fmt" "net/http" - "net/url" "os" "runtime" "runtime/debug" - "strings" "time" ) @@ -43,22 +40,8 @@ func printUnexpectedError(config *Config, err error) { errorMessage := err.Error() stackTrace := string(debug.Stack()) - title := "Unexpected error: " + strings.Split(errorMessage, "\n")[0] - body := "* Version: " + VERSION + - "\n* OS: " + runtime.GOOS + "-" + runtime.GOARCH + - "\n\n```\n" + errorMessage + "\n\n" + stackTrace + "\n```" - fmt.Println("Unexpected error:", errorMessage) fmt.Println(stackTrace) - fmt.Println("________________________________________________________________________________") - fmt.Println("\nPlease submit a new issue by simply visiting the following link:") - fmt.Println( - "https://github.com/BemiHQ/BemiDB/issues/new?title=" + - url.QueryEscape(title) + - "&body=" + - url.QueryEscape(body), - ) - fmt.Println("\nAlternatively, send us an email at hi@bemidb.com") } type AnonymousErrorData struct { @@ -67,7 +50,7 @@ type AnonymousErrorData struct { Version string `json:"version"` Error string `json:"error"` StackTrace string `json:"stackTrace"` - PgHost string `json:"pgHost"` + S3Bucket string `json:"s3Bucket"` } func sendAnonymousErrorReport(config *Config, err error) { @@ -76,12 +59,12 @@ func sendAnonymousErrorReport(config *Config, err error) { } data := AnonymousErrorData{ - Command: flag.Arg(0), + Command: "server", OsName: runtime.GOOS + "-" + runtime.GOARCH, Version: VERSION, Error: err.Error(), StackTrace: string(debug.Stack()), - PgHost: ParseDatabaseHost(config.Pg.DatabaseUrl), + S3Bucket: config.Aws.S3Endpoint + "/" + config.Aws.S3Bucket, } jsonData, err := json.Marshal(data) diff --git a/src/go.mod b/src/server/go.mod similarity index 53% rename from src/go.mod rename to src/server/go.mod index b04d2d9..bf5c013 100644 --- a/src/go.mod +++ b/src/server/go.mod @@ -1,32 +1,22 @@ -module github.com/BemiHQ/BemiDB +module github.com/BemiHQ/BemiDB/src/server -go 1.24.3 +go 1.24.4 require ( github.com/aws/aws-sdk-go-v2 v1.32.3 github.com/aws/aws-sdk-go-v2/config v1.28.1 github.com/aws/aws-sdk-go-v2/credentials v1.17.42 - github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.35 github.com/aws/aws-sdk-go-v2/service/s3 v1.66.2 github.com/google/uuid v1.6.0 github.com/jackc/pgx/v5 v5.7.2 - github.com/linkedin/goavro v2.1.0+incompatible - github.com/marcboeker/go-duckdb v1.8.3 + github.com/marcboeker/go-duckdb/v2 v2.3.2 github.com/pganalyze/pg_query_go/v5 v5.1.0 - github.com/xitongsys/parquet-go v1.6.3-0.20240813051905-693d3323dee0 ) -require ( - github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b - golang.org/x/crypto v0.35.0 - golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 -) +require golang.org/x/crypto v0.35.0 require ( - github.com/andybalholm/brotli v1.1.1 // indirect - github.com/apache/arrow-go/v18 v18.0.0 // indirect - github.com/apache/arrow/go/v12 v12.0.1 // indirect - github.com/apache/thrift v0.21.0 // indirect + github.com/apache/arrow-go/v18 v18.1.0 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.6 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.18 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.22 // indirect @@ -41,26 +31,29 @@ require ( github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.3 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.32.3 // indirect github.com/aws/smithy-go v1.22.0 // indirect - github.com/goccy/go-json v0.10.3 // indirect - github.com/goccy/go-reflect v1.2.0 // indirect - github.com/golang/snappy v0.0.4 // indirect - github.com/google/flatbuffers v24.3.25+incompatible // indirect + github.com/duckdb/duckdb-go-bindings v0.1.16 // indirect + github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11 // indirect + github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11 // indirect + github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11 // indirect + github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11 // indirect + github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect + github.com/goccy/go-json v0.10.5 // indirect + github.com/google/flatbuffers v25.1.24+incompatible // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect - github.com/klauspost/asmfmt v1.3.2 // indirect github.com/klauspost/compress v1.17.11 // indirect - github.com/klauspost/cpuid/v2 v2.2.8 // indirect - github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 // indirect - github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 // indirect - github.com/mitchellh/mapstructure v1.5.0 // indirect - github.com/pierrec/lz4/v4 v4.1.21 // indirect + github.com/klauspost/cpuid/v2 v2.2.9 // indirect + github.com/marcboeker/go-duckdb/arrowmapping v0.0.9 // indirect + github.com/marcboeker/go-duckdb/mapping v0.0.10 // indirect + github.com/pierrec/lz4/v4 v4.1.22 // indirect github.com/zeebo/xxh3 v1.0.2 // indirect - golang.org/x/mod v0.21.0 // indirect + golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c // indirect + golang.org/x/mod v0.22.0 // indirect golang.org/x/sync v0.11.0 // indirect golang.org/x/sys v0.30.0 // indirect golang.org/x/text v0.22.0 // indirect - golang.org/x/tools v0.26.0 // indirect - golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect - google.golang.org/protobuf v1.35.1 // indirect - gopkg.in/linkedin/goavro.v1 v1.0.5 // indirect + golang.org/x/tools v0.29.0 // indirect + golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect + google.golang.org/protobuf v1.36.1 // indirect ) diff --git a/src/server/go.sum b/src/server/go.sum new file mode 100644 index 0000000..d9f6ab0 --- /dev/null +++ b/src/server/go.sum @@ -0,0 +1,137 @@ +github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA= +github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA= +github.com/apache/arrow-go/v18 v18.1.0 h1:agLwJUiVuwXZdwPYVrlITfx7bndULJ/dggbnLFgDp/Y= +github.com/apache/arrow-go/v18 v18.1.0/go.mod h1:tigU/sIgKNXaesf5d7Y95jBBKS5KsxTqYBKXFsvKzo0= +github.com/apache/thrift v0.21.0 h1:tdPmh/ptjE1IJnhbhrcl2++TauVjy242rkV/UzJChnE= +github.com/apache/thrift v0.21.0/go.mod h1:W1H8aR/QRtYNvrPeFXBtobyRkd0/YVhTc6i07XIAgDw= +github.com/aws/aws-sdk-go-v2 v1.32.3 h1:T0dRlFBKcdaUPGNtkBSwHZxrtis8CQU17UpNBZYd0wk= +github.com/aws/aws-sdk-go-v2 v1.32.3/go.mod h1:2SK5n0a2karNTv5tbP1SjsX0uhttou00v/HpXKM1ZUo= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.6 h1:pT3hpW0cOHRJx8Y0DfJUEQuqPild8jRGmSFmBgvydr0= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.6/go.mod h1:j/I2++U0xX+cr44QjHay4Cvxj6FUbnxrgmqN3H1jTZA= +github.com/aws/aws-sdk-go-v2/config v1.28.1 h1:oxIvOUXy8x0U3fR//0eq+RdCKimWI900+SV+10xsCBw= +github.com/aws/aws-sdk-go-v2/config v1.28.1/go.mod h1:bRQcttQJiARbd5JZxw6wG0yIK3eLeSCPdg6uqmmlIiI= +github.com/aws/aws-sdk-go-v2/credentials v1.17.42 h1:sBP0RPjBU4neGpIYyx8mkU2QqLPl5u9cmdTWVzIpHkM= +github.com/aws/aws-sdk-go-v2/credentials v1.17.42/go.mod h1:FwZBfU530dJ26rv9saAbxa9Ej3eF/AK0OAY86k13n4M= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.18 h1:68jFVtt3NulEzojFesM/WVarlFpCaXLKaBxDpzkQ9OQ= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.18/go.mod h1:Fjnn5jQVIo6VyedMc0/EhPpfNlPl7dHV916O6B+49aE= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.22 h1:Jw50LwEkVjuVzE1NzkhNKkBf9cRN7MtE1F/b2cOKTUM= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.22/go.mod h1:Y/SmAyPcOTmpeVaWSzSKiILfXTVJwrGmYZhcRbhWuEY= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.22 h1:981MHwBaRZM7+9QSR6XamDzF/o7ouUGxFzr+nVSIhrs= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.22/go.mod h1:1RA1+aBEfn+CAB/Mh0MB6LsdCYCnjZm7tKXtnk499ZQ= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.22 h1:yV+hCAHZZYJQcwAaszoBNwLbPItHvApxT0kVIw6jRgs= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.22/go.mod h1:kbR1TL8llqB1eGnVbybcA4/wgScxdylOdyAd51yxPdw= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0 h1:TToQNkvGguu209puTojY/ozlqy2d/SFNcoLIqTFi42g= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0/go.mod h1:0jp+ltwkf+SwG2fm/PKo8t4y8pJSgOCO4D8Lz3k0aHQ= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.3 h1:kT6BcZsmMtNkP/iYMcRG+mIEA/IbeiUimXtGmqF39y0= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.3/go.mod h1:Z8uGua2k4PPaGOYn66pK02rhMrot3Xk3tpBuUFPomZU= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.3 h1:qcxX0JYlgWH3hpPUnd6U0ikcl6LLA9sLkXE2w1fpMvY= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.3/go.mod h1:cLSNEmI45soc+Ef8K/L+8sEA3A3pYFEYf5B5UI+6bH4= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.3 h1:ZC7Y/XgKUxwqcdhO5LE8P6oGP1eh6xlQReWNKfhvJno= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.3/go.mod h1:WqfO7M9l9yUAw0HcHaikwRd/H6gzYdz7vjejCA5e2oY= +github.com/aws/aws-sdk-go-v2/service/s3 v1.66.2 h1:p9TNFL8bFUMd+38YIpTAXpoxyz0MxC7FlbFEH4P4E1U= +github.com/aws/aws-sdk-go-v2/service/s3 v1.66.2/go.mod h1:fNjyo0Coen9QTwQLWeV6WO2Nytwiu+cCcWaTdKCAqqE= +github.com/aws/aws-sdk-go-v2/service/sso v1.24.3 h1:UTpsIf0loCIWEbrqdLb+0RxnTXfWh2vhw4nQmFi4nPc= +github.com/aws/aws-sdk-go-v2/service/sso v1.24.3/go.mod h1:FZ9j3PFHHAR+w0BSEjK955w5YD2UwB/l/H0yAK3MJvI= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.3 h1:2YCmIXv3tmiItw0LlYf6v7gEHebLY45kBEnPezbUKyU= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.3/go.mod h1:u19stRyNPxGhj6dRm+Cdgu6N75qnbW7+QN0q0dsAk58= +github.com/aws/aws-sdk-go-v2/service/sts v1.32.3 h1:wVnQ6tigGsRqSWDEEyH6lSAJ9OyFUsSnbaUWChuSGzs= +github.com/aws/aws-sdk-go-v2/service/sts v1.32.3/go.mod h1:VZa9yTFyj4o10YGsmDO4gbQJUvvhY72fhumT8W4LqsE= +github.com/aws/smithy-go v1.22.0 h1:uunKnWlcoL3zO7q+gG2Pk53joueEOsnNB28QdMsmiMM= +github.com/aws/smithy-go v1.22.0/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= +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/duckdb/duckdb-go-bindings v0.1.16 h1:XPCk9hzP06PoWIxDPVU3gAy0m1XmLaZHTzLggNx/U9k= +github.com/duckdb/duckdb-go-bindings v0.1.16/go.mod h1:pBnfviMzANT/9hi4bg+zW4ykRZZPCXlVuvBWEcZofkc= +github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11 h1:GXQkG4HmEbwPtqCSabJTp9wZQQ7Gqr3KveLNesQWQOs= +github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11/go.mod h1:Ezo7IbAfB8NP7CqPIN8XEHKUg5xdRRQhcPPlCXImXYA= +github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11 h1:ATJMSBIDA/YAm/6CKeBDRtGK1OOwqfTZbWg9Y5fAc9E= +github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11/go.mod h1:eS7m/mLnPQgVF4za1+xTyorKRBuK0/BA44Oy6DgrGXI= +github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11 h1:AjvnGst1avyOECYiykthyHR4DTYTaqNDPr5W/0t5j0k= +github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11/go.mod h1:1GOuk1PixiESxLaCGFhag+oFi7aP+9W8byymRAvunBk= +github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11 h1:j3B1biawuhtxe2Chkiqcwf1Kxe8VJc8lLVmjBIcJrkI= +github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11/go.mod h1:o7crKMpT2eOIi5/FY6HPqaXcvieeLSqdXXaXbruGX7w= +github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11 h1:xR3vRE8y+48U6xDNkUlOfbl7/OTA7FVcDXJ+5vETuHU= +github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11/go.mod h1:IlOhJdVKUJCAPj3QsDszUo8DVdvp1nBFp4TUJVdw99s= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= +github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/flatbuffers v25.1.24+incompatible h1:4wPqL3K7GzBd1CwyhSd3usxLKOaJN/AC6puCca6Jm7o= +github.com/google/flatbuffers v25.1.24+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +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/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +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/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.7.2 h1:mLoDLV6sonKlvjIEsV56SkWNCnuNv531l94GaIzO+XI= +github.com/jackc/pgx/v5 v5.7.2/go.mod h1:ncY89UGWxg82EykZUwSpUKEfccBGGYq1xjrOpsbsfGQ= +github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= +github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= +github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= +github.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY= +github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8= +github.com/marcboeker/go-duckdb/arrowmapping v0.0.9 h1:xj+kFOqR2gH3Mcxx9LmAVHebSnCiPm303N+uxfkWVmY= +github.com/marcboeker/go-duckdb/arrowmapping v0.0.9/go.mod h1:o56AqVS90v5bpxhPnOK9La7AfNTOrMORiqTQrlRbdPQ= +github.com/marcboeker/go-duckdb/mapping v0.0.10 h1:b/y2W8/hNlD0Dwjq0mCqIlLXpjQMnWy0WqDV9b9lHQQ= +github.com/marcboeker/go-duckdb/mapping v0.0.10/go.mod h1:Ro6Tw6sGG50O8S0daZsA8TrQJz/DvGrzGvMD7Jihirw= +github.com/marcboeker/go-duckdb/v2 v2.3.2 h1:96zG2JPyIhCFjHdBjjSpOdhzJzehoGTdl7LskkuMUTs= +github.com/marcboeker/go-duckdb/v2 v2.3.2/go.mod h1:VeXz9ZM6klNvICHrXEUzaHSgNqBeTdyMxr4CICw/UaY= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= +github.com/pganalyze/pg_query_go/v5 v5.1.0 h1:MlxQqHZnvA3cbRQYyIrjxEjzo560P6MyTgtlaf3pmXg= +github.com/pganalyze/pg_query_go/v5 v5.1.0/go.mod h1:FsglvxidZsVN+Ltw3Ai6nTgPVcK2BPukH3jCDEqc1Ug= +github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= +github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +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/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= +github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= +github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= +golang.org/x/crypto v0.35.0 h1:b15kiHdrGCHrP6LvwaQ3c03kgNhhiMgvlhxHQhmg2Xs= +golang.org/x/crypto v0.35.0/go.mod h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0YQ= +golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c h1:KL/ZBHXgKGVmuZBZ01Lt57yE5ws8ZPSkkihmEyq7FXc= +golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c/go.mod h1:tujkw807nyEEAamNbDrEGzRav+ilXA7PCRAd6xsmwiU= +golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= +golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= +golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= +golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= +golang.org/x/tools v0.29.0 h1:Xx0h3TtM9rzQpQuR4dKLrdglAmCEN5Oi+P74JdhdzXE= +golang.org/x/tools v0.29.0/go.mod h1:KMQVMRsVxU6nHCFXrBPhDB8XncLNLM0lIy/F14RP588= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.15.1 h1:FNy7N6OUZVUaWG9pTiD+jlhdQ3lMP+/LcTpJ6+a8sQ0= +gonum.org/v1/gonum v0.15.1/go.mod h1:eZTZuRFrzu5pcyjN5wJhcIhnUdNijYxX1T2IcrOGY0o= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.36.1 h1:yBPeRvTftaleIgM3PZ/WBIZ7XM/eEYAaEyCwvyjq/gk= +google.golang.org/protobuf v1.36.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/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= diff --git a/src/server/iceberg_catalog.go b/src/server/iceberg_catalog.go new file mode 100644 index 0000000..5d5eedd --- /dev/null +++ b/src/server/iceberg_catalog.go @@ -0,0 +1,92 @@ +package main + +import ( + "context" + "fmt" +) + +const ( + TEMP_TABLE_SUFFIX_SYNCING = "-bemidb-syncing" + TEMP_TABLE_SUFFIX_DELETING = "-bemidb-deleting" +) + +type IcebergSchemaTable struct { + Schema string + Table string +} + +func (schemaTable IcebergSchemaTable) String() string { + return fmt.Sprintf(`"%s"."%s"`, schemaTable.Schema, schemaTable.Table) +} + +type IcebergCatalog struct { + Config *Config +} + +func NewIcebergCatalog(config *Config) *IcebergCatalog { + return &IcebergCatalog{Config: config} +} + +func (catalog *IcebergCatalog) Schemas() ([]string, error) { + pgClient := catalog.newPgClient() + defer pgClient.Close() + + ctx := context.Background() + rows, err := pgClient.Query(ctx, "SELECT namespace FROM iceberg_namespace_properties") + if err != nil { + return nil, err + } + defer rows.Close() + + var schemas []string + for rows.Next() { + var schema string + err := rows.Scan(&schema) + if err != nil { + return nil, err + } + schemas = append(schemas, schema) + } + return schemas, nil +} + +func (catalog *IcebergCatalog) SchemaTables() (Set[IcebergSchemaTable], error) { + pgClient := catalog.newPgClient() + defer pgClient.Close() + + ctx := context.Background() + rows, err := pgClient.Query(ctx, "SELECT table_namespace, table_name FROM iceberg_tables WHERE table_name NOT LIKE '%"+TEMP_TABLE_SUFFIX_SYNCING+"' AND table_name NOT LIKE '%"+TEMP_TABLE_SUFFIX_DELETING+"'") + if err != nil { + return nil, err + } + defer rows.Close() + + schemaTables := make(Set[IcebergSchemaTable]) + for rows.Next() { + var schema, table string + err := rows.Scan(&schema, &table) + if err != nil { + return nil, err + } + schemaTables.Add(IcebergSchemaTable{Schema: schema, Table: table}) + } + return schemaTables, nil +} + +func (catalog *IcebergCatalog) MetadataFilePath(t IcebergSchemaTable) string { + pgClient := catalog.newPgClient() + defer pgClient.Close() + + ctx := context.Background() + row := pgClient.QueryRow(ctx, "SELECT metadata_location FROM iceberg_tables WHERE table_namespace=$1 AND table_name=$2", t.Schema, t.Table) + + var path string + err := row.Scan(&path) + PanicIfError(nil, err) + + return path +} + +func (catalog *IcebergCatalog) newPgClient() *PostgresClient { + return NewPostgresClient(catalog.Config, catalog.Config.CatalogDatabaseUrl) +} diff --git a/src/server/iceberg_reader.go b/src/server/iceberg_reader.go new file mode 100644 index 0000000..e70c9ae --- /dev/null +++ b/src/server/iceberg_reader.go @@ -0,0 +1,33 @@ +package main + +type IcebergReader struct { + Config *Config + Storage *StorageS3 + Catalog *IcebergCatalog +} + +func NewIcebergReader(config *Config, catalog *IcebergCatalog) *IcebergReader { + return &IcebergReader{ + Config: config, + Catalog: catalog, + Storage: NewS3Storage(config), + } +} + +func (reader *IcebergReader) Schemas() (icebergSchemas []string, err error) { + return reader.Catalog.Schemas() +} + +func (reader *IcebergReader) SchemaTables() (icebergSchemaTables Set[IcebergSchemaTable], err error) { + return reader.Catalog.SchemaTables() +} + +func (reader *IcebergReader) TableFields(icebergSchemaTable IcebergSchemaTable) (icebergTableFields []IcebergTableField, err error) { + metadataPath := reader.MetadataFilePath(icebergSchemaTable) + LogDebug(reader.Config, "Reading Iceberg table "+icebergSchemaTable.String()+" fields from "+metadataPath+" ...") + return reader.Storage.IcebergTableFields(metadataPath) +} + +func (reader *IcebergReader) MetadataFilePath(icebergSchemaTable IcebergSchemaTable) string { + return reader.Catalog.MetadataFilePath(icebergSchemaTable) +} diff --git a/src/logger.go b/src/server/logger.go similarity index 100% rename from src/logger.go rename to src/server/logger.go diff --git a/src/server/main.go b/src/server/main.go new file mode 100644 index 0000000..8237cbf --- /dev/null +++ b/src/server/main.go @@ -0,0 +1,58 @@ +package main + +import ( + "log" + "net/http" + _ "net/http/pprof" +) + +const ( + COMMAND_START = "start" + COMMAND_VERSION = "version" +) + +func main() { + config := LoadConfig() + defer handlePanic(config) + + if config.LogLevel == LOG_LEVEL_TRACE { + go enableProfiling() + } + + tcpListener := NewTcpListener(config) + LogInfo(config, "BemiDB: Listening on", tcpListener.Addr()) + + duckdb := NewDuckdb(config, true) + LogInfo(config, "DuckDB: Connected") + defer duckdb.Close() + + catalog := NewIcebergCatalog(config) + + icebergReader := NewIcebergReader(config, catalog) + queryHandler := NewQueryHandler(config, duckdb, icebergReader) + + for { + conn := AcceptConnection(config, tcpListener) + LogInfo(config, "BemiDB: Accepted connection from", conn.RemoteAddr()) + server := NewPostgresServer(config, &conn) + + go func() { + server.Run(queryHandler) + defer server.Close() + LogInfo(config, "BemiDB: Closed connection from", conn.RemoteAddr()) + }() + } +} + +func enableProfiling() { + func() { log.Println(http.ListenAndServe(":6060", nil)) }() +} + +func handlePanic(config *Config) { + func() { + if r := recover(); r != nil { + err, _ := r.(error) + HandleUnexpectedError(config, err) + } + }() +} diff --git a/src/parser_a_expr.go b/src/server/parser_a_expr.go similarity index 100% rename from src/parser_a_expr.go rename to src/server/parser_a_expr.go diff --git a/src/parser_column_ref.go b/src/server/parser_column_ref.go similarity index 73% rename from src/parser_column_ref.go rename to src/server/parser_column_ref.go index 603bd02..2352832 100644 --- a/src/parser_column_ref.go +++ b/src/server/parser_column_ref.go @@ -36,3 +36,15 @@ func (parser *ParserColumnRef) SetFields(node *pgQuery.Node, fields []string) { columnRef.Fields[i] = pgQuery.MakeStrNode(field) } } + +// expression -> NOT expression +func (parser *ParserColumnRef) NotBooleanExpression(node *pgQuery.Node) *pgQuery.Node { + return &pgQuery.Node{ + Node: &pgQuery.Node_BoolExpr{ + BoolExpr: &pgQuery.BoolExpr{ + Boolop: pgQuery.BoolExprType_NOT_EXPR, + Args: []*pgQuery.Node{node}, + }, + }, + } +} diff --git a/src/parser_function.go b/src/server/parser_function.go similarity index 89% rename from src/parser_function.go rename to src/server/parser_function.go index 86451b3..ff07d54 100644 --- a/src/parser_function.go +++ b/src/server/parser_function.go @@ -101,14 +101,3 @@ func (parser *ParserFunction) RemoveEncode(functionCall *pgQuery.FuncCall) { functionCall.Funcname = nestedFunctionCall.Funcname functionCall.Args = nestedFunctionCall.Args } - -// to_timestamp(...) -func (parser *ParserFunction) RemapToTimestamp(functionCall *pgQuery.FuncCall, timestamp int64) { - functionCall.Funcname = []*pgQuery.Node{pgQuery.MakeStrNode("to_timestamp")} - - if timestamp == 0 { - functionCall.Args[0] = parser.utils.MakeNullNode() - } else { - functionCall.Args[0] = pgQuery.MakeAConstIntNode(timestamp, 0) - } -} diff --git a/src/parser_select.go b/src/server/parser_select.go similarity index 100% rename from src/parser_select.go rename to src/server/parser_select.go diff --git a/src/parser_show.go b/src/server/parser_show.go similarity index 100% rename from src/parser_show.go rename to src/server/parser_show.go diff --git a/src/parser_table.go b/src/server/parser_table.go similarity index 87% rename from src/parser_table.go rename to src/server/parser_table.go index ad7df8a..83a21ad 100644 --- a/src/parser_table.go +++ b/src/server/parser_table.go @@ -42,8 +42,8 @@ func (parser *ParserTable) IsTableFromInformationSchema(qSchemaTable QuerySchema return qSchemaTable.Schema == PG_SCHEMA_INFORMATION_SCHEMA } -// public.table -> FROM iceberg_scan('path', skip_schema_inference = true) table -// schema.table -> FROM iceberg_scan('path', skip_schema_inference = true) schema_table +// public.table -> FROM iceberg_scan('path') table +// schema.table -> FROM iceberg_scan('path') schema_table func (parser *ParserTable) MakeIcebergTableNode(queryToIcebergTable QueryToIcebergTable) *pgQuery.Node { node := pgQuery.MakeSimpleRangeFunctionNode([]*pgQuery.Node{ pgQuery.MakeListNode([]*pgQuery.Node{ @@ -56,13 +56,6 @@ func (parser *ParserTable) MakeIcebergTableNode(queryToIcebergTable QueryToIcebe queryToIcebergTable.IcebergTablePath, 0, ), - pgQuery.MakeAExprNode( - pgQuery.A_Expr_Kind_AEXPR_OP, - []*pgQuery.Node{pgQuery.MakeStrNode("=")}, - pgQuery.MakeColumnRefNode([]*pgQuery.Node{pgQuery.MakeStrNode("skip_schema_inference")}, 0), - parser.utils.MakeAConstBoolNode(true), - 0, - ), }, 0, ), diff --git a/src/parser_type_cast.go b/src/server/parser_type_cast.go similarity index 100% rename from src/parser_type_cast.go rename to src/server/parser_type_cast.go diff --git a/src/parser_utils.go b/src/server/parser_utils.go similarity index 84% rename from src/parser_utils.go rename to src/server/parser_utils.go index 1214051..d070db7 100644 --- a/src/parser_utils.go +++ b/src/server/parser_utils.go @@ -59,22 +59,6 @@ func (utils *ParserUtils) MakeSubselectFromNode(qSchemaTable QuerySchemaTable, t } } -func (utils *ParserUtils) MakeAConstBoolNode(val bool) *pgQuery.Node { - return &pgQuery.Node{ - Node: &pgQuery.Node_AConst{ - AConst: &pgQuery.A_Const{ - Val: &pgQuery.A_Const_Boolval{ - Boolval: &pgQuery.Boolean{ - Boolval: val, - }, - }, - Isnull: false, - Location: 0, - }, - }, - } -} - func (utils *ParserUtils) MakeNullNode() *pgQuery.Node { return &pgQuery.Node{ Node: &pgQuery.Node_AConst{ diff --git a/src/pg_constants.go b/src/server/pg_constants.go similarity index 96% rename from src/pg_constants.go rename to src/server/pg_constants.go index 7ad5229..d4f5515 100644 --- a/src/pg_constants.go +++ b/src/server/pg_constants.go @@ -15,7 +15,7 @@ const ( PG_VAR_SEARCH_PATH = "search_path" ) -var PG_SYSTEM_TABLES = NewSet([]string{ +var PG_SYSTEM_TABLES = NewSet[string]().AddAll([]string{ "pg_aggregate", "pg_am", "pg_amop", @@ -88,7 +88,7 @@ var PG_SYSTEM_TABLES = NewSet([]string{ "pg_views", }) -var PG_SYSTEM_VIEWS = NewSet([]string{ +var PG_SYSTEM_VIEWS = NewSet[string]().AddAll([]string{ "pg_stat_activity", "pg_stat_replication", "pg_stat_wal_receiver", diff --git a/src/server/postgres_client.go b/src/server/postgres_client.go new file mode 100644 index 0000000..10316d7 --- /dev/null +++ b/src/server/postgres_client.go @@ -0,0 +1,77 @@ +package main + +import ( + "context" + "net/url" + "strings" + "time" + + "github.com/jackc/pgx/v5" +) + +const ( + CONNECTION_TIMEOUT = 30 * time.Second +) + +type PostgresClient struct { + Conn *pgx.Conn + Config *Config +} + +func NewPostgresClient(config *Config, databaseUrl string) *PostgresClient { + ctx, cancel := context.WithTimeout(context.Background(), CONNECTION_TIMEOUT) + defer cancel() + + conn, err := pgx.Connect(ctx, urlEncodePassword(databaseUrl)) + PanicIfError(config, err) + + return &PostgresClient{ + Config: config, + Conn: conn, + } +} + +func (client *PostgresClient) Close() { + err := client.Conn.Close(context.Background()) + PanicIfError(client.Config, err) +} + +func (client *PostgresClient) Query(ctx context.Context, query string, args ...any) (pgx.Rows, error) { + LogDebug(client.Config, "Postgres query:", query) + return client.Conn.Query(ctx, query, args...) +} + +func (client *PostgresClient) QueryRow(ctx context.Context, query string, args ...any) pgx.Row { + LogDebug(client.Config, "Postgres query:", query) + return client.Conn.QueryRow(ctx, query, args...) +} + +// Example: +// - From postgres://username:pas$:wor^d#@host:port/database +// - To postgres://username:pas%24%3Awor%5Ed%23@host:port/database +func urlEncodePassword(pgDatabaseUrl string) string { + // No credentials + if !strings.Contains(pgDatabaseUrl, "@") { + return pgDatabaseUrl + } + + password := strings.TrimPrefix(pgDatabaseUrl, "postgresql://") + password = strings.TrimPrefix(password, "postgres://") + passwordEndIndex := strings.LastIndex(password, "@") + password = password[:passwordEndIndex] + + // Credentials without password + if !strings.Contains(password, ":") { + return pgDatabaseUrl + } + + _, password, _ = strings.Cut(password, ":") + encodedPassword := url.QueryEscape(password) + + // Password is already encoded + if encodedPassword == password { + return pgDatabaseUrl + } + + return strings.Replace(pgDatabaseUrl, ":"+password+"@", ":"+encodedPassword+"@", 1) +} diff --git a/src/postgres.go b/src/server/postgres_server.go similarity index 61% rename from src/postgres.go rename to src/server/postgres_server.go index a5a1f6a..d2e7a08 100644 --- a/src/postgres.go +++ b/src/server/postgres_server.go @@ -15,14 +15,14 @@ const ( SYSTEM_AUTH_USER = "bemidb" ) -type Postgres struct { +type PostgresServer struct { backend *pgproto3.Backend conn *net.Conn config *Config } -func NewPostgres(config *Config, conn *net.Conn) *Postgres { - return &Postgres{ +func NewPostgresServer(config *Config, conn *net.Conn) *PostgresServer { + return &PostgresServer{ conn: conn, backend: pgproto3.NewBackend(*conn, *conn), config: config, @@ -55,64 +55,64 @@ func AcceptConnection(config *Config, listener net.Listener) net.Conn { return conn } -func (postgres *Postgres) Run(queryHandler *QueryHandler) { - err := postgres.handleStartup() +func (server *PostgresServer) Run(queryHandler *QueryHandler) { + err := server.handleStartup() if err != nil { - LogError(postgres.config, "Error handling startup:", err) + LogError(server.config, "Error handling startup:", err) return // Terminate connection } for { - message, err := postgres.backend.Receive() + message, err := server.backend.Receive() if err != nil { return // Terminate connection } switch message := message.(type) { case *pgproto3.Query: - postgres.handleSimpleQuery(queryHandler, message) + server.handleSimpleQuery(queryHandler, message) case *pgproto3.Parse: - err = postgres.handleExtendedQuery(queryHandler, message) + err = server.handleExtendedQuery(queryHandler, message) if err != nil { return // Terminate connection } case *pgproto3.Terminate: - LogDebug(postgres.config, "Client terminated connection") + LogDebug(server.config, "Client terminated connection") return default: - LogError(postgres.config, "Received message other than Query from client:", message) + LogError(server.config, "Received message other than Query from client:", message) return // Terminate connection } } } -func (postgres *Postgres) Close() error { - return (*postgres.conn).Close() +func (server *PostgresServer) Close() error { + return (*server.conn).Close() } -func (postgres *Postgres) handleSimpleQuery(queryHandler *QueryHandler, queryMessage *pgproto3.Query) { - LogDebug(postgres.config, "Received query:", queryMessage.String) +func (server *PostgresServer) handleSimpleQuery(queryHandler *QueryHandler, queryMessage *pgproto3.Query) { + LogDebug(server.config, "Received query:", queryMessage.String) messages, err := queryHandler.HandleSimpleQuery(queryMessage.String) if err != nil { - postgres.writeError(err) + server.writeError(err) return } messages = append(messages, &pgproto3.ReadyForQuery{TxStatus: PG_TX_STATUS_IDLE}) - postgres.writeMessages(messages...) + server.writeMessages(messages...) } -func (postgres *Postgres) handleExtendedQuery(queryHandler *QueryHandler, parseMessage *pgproto3.Parse) error { - LogDebug(postgres.config, "Parsing query", parseMessage.Query) +func (server *PostgresServer) handleExtendedQuery(queryHandler *QueryHandler, parseMessage *pgproto3.Parse) error { + LogDebug(server.config, "Parsing query", parseMessage.Query) messages, preparedStatement, err := queryHandler.HandleParseQuery(parseMessage) if err != nil { - postgres.writeError(err) + server.writeError(err) return nil } - postgres.writeMessages(messages...) + server.writeMessages(messages...) var previousErr error for { - message, err := postgres.backend.Receive() + message, err := server.backend.Receive() if err != nil { return err } @@ -123,41 +123,41 @@ func (postgres *Postgres) handleExtendedQuery(queryHandler *QueryHandler, parseM continue } - LogDebug(postgres.config, "Binding query", message.PreparedStatement) + LogDebug(server.config, "Binding query", message.PreparedStatement) messages, preparedStatement, err = queryHandler.HandleBindQuery(message, preparedStatement) if err != nil { - postgres.writeError(err) + server.writeError(err) previousErr = err } - postgres.writeMessages(messages...) + server.writeMessages(messages...) case *pgproto3.Describe: if previousErr != nil { // Skip processing the next message if there was an error in the previous message continue } - LogDebug(postgres.config, "Describing query", message.Name, "("+string(message.ObjectType)+")") + LogDebug(server.config, "Describing query", message.Name, "("+string(message.ObjectType)+")") var messages []pgproto3.Message messages, preparedStatement, err = queryHandler.HandleDescribeQuery(message, preparedStatement) if err != nil { - postgres.writeError(err) + server.writeError(err) previousErr = err } - postgres.writeMessages(messages...) + server.writeMessages(messages...) case *pgproto3.Execute: if previousErr != nil { // Skip processing the next message if there was an error in the previous message continue } - LogDebug(postgres.config, "Executing query", message.Portal) + LogDebug(server.config, "Executing query", message.Portal) messages, err := queryHandler.HandleExecuteQuery(message, preparedStatement) if err != nil { - postgres.writeError(err) + server.writeError(err) previousErr = err } - postgres.writeMessages(messages...) + server.writeMessages(messages...) case *pgproto3.Sync: - LogDebug(postgres.config, "Syncing query") - postgres.writeMessages( + LogDebug(server.config, "Syncing query") + server.writeMessages( &pgproto3.ReadyForQuery{TxStatus: PG_TX_STATUS_IDLE}, ) @@ -172,18 +172,18 @@ func (postgres *Postgres) handleExtendedQuery(queryHandler *QueryHandler, parseM } } -func (postgres *Postgres) writeMessages(messages ...pgproto3.Message) { +func (server *PostgresServer) writeMessages(messages ...pgproto3.Message) { var buf []byte for _, message := range messages { buf, _ = message.Encode(buf) } - (*postgres.conn).Write(buf) + (*server.conn).Write(buf) } -func (postgres *Postgres) writeError(err error) { - LogError(postgres.config, err.Error()) +func (server *PostgresServer) writeError(err error) { + LogError(server.config, err.Error()) - postgres.writeMessages( + server.writeMessages( &pgproto3.ErrorResponse{ Severity: "ERROR", Message: err.Error(), @@ -192,8 +192,8 @@ func (postgres *Postgres) writeError(err error) { ) } -func (postgres *Postgres) handleStartup() error { - startupMessage, err := postgres.backend.ReceiveStartupMessage() +func (server *PostgresServer) handleStartup() error { + startupMessage, err := server.backend.ReceiveStartupMessage() if err != nil { return err } @@ -201,19 +201,19 @@ func (postgres *Postgres) handleStartup() error { switch startupMessage := startupMessage.(type) { case *pgproto3.StartupMessage: params := startupMessage.Parameters - LogDebug(postgres.config, "BemiDB: startup message", params) + LogDebug(server.config, "BemiDB: startup message", params) - if params["database"] != postgres.config.Database { - postgres.writeError(errors.New("database " + params["database"] + " does not exist")) + if params["database"] != server.config.Database { + server.writeError(errors.New("database " + params["database"] + " does not exist")) return errors.New("database does not exist") } - if postgres.config.User != "" && params["user"] != postgres.config.User && params["user"] != SYSTEM_AUTH_USER { - postgres.writeError(errors.New("role \"" + params["user"] + "\" does not exist")) + if server.config.User != "" && params["user"] != server.config.User && params["user"] != SYSTEM_AUTH_USER { + server.writeError(errors.New("role \"" + params["user"] + "\" does not exist")) return errors.New("role does not exist") } - postgres.writeMessages( + server.writeMessages( &pgproto3.AuthenticationOk{}, &pgproto3.ParameterStatus{Name: "client_encoding", Value: PG_ENCODING}, &pgproto3.ParameterStatus{Name: "server_version", Value: PG_VERSION}, @@ -221,11 +221,11 @@ func (postgres *Postgres) handleStartup() error { ) return nil case *pgproto3.SSLRequest: - _, err = (*postgres.conn).Write([]byte("N")) + _, err = (*server.conn).Write([]byte("N")) if err != nil { return err } - postgres.handleStartup() + server.handleStartup() return nil default: return errors.New("unknown startup message") diff --git a/src/server/query_handler.go b/src/server/query_handler.go new file mode 100644 index 0000000..0d29d8f --- /dev/null +++ b/src/server/query_handler.go @@ -0,0 +1,342 @@ +package main + +import ( + "context" + "database/sql" + "encoding/binary" + "fmt" + "strings" + + "github.com/google/uuid" + "github.com/jackc/pgx/v5/pgproto3" + "github.com/jackc/pgx/v5/pgtype" +) + +const ( + FALLBACK_SQL_QUERY = "SELECT 1" + INSPECT_SQL_COMMENT = " --INSPECT" +) + +type QueryHandler struct { + duckdb *Duckdb + icebergReader *IcebergReader + queryRemapper *QueryRemapper + config *Config + ResponseHandler *ResponseHandler +} + +type PreparedStatement struct { + // Parse + Name string + OriginalQuery string + Query string + Statement *sql.Stmt + ParameterOIDs []uint32 + + // Bind + Bound bool + Variables []interface{} + Portal string + + // Describe + Described bool + + // Describe/Execute + Rows *sql.Rows +} + +func NewQueryHandler(config *Config, duckdb *Duckdb, icebergReader *IcebergReader) *QueryHandler { + queryHandler := &QueryHandler{ + duckdb: duckdb, + icebergReader: icebergReader, + queryRemapper: NewQueryRemapper(config, icebergReader, duckdb), + config: config, + ResponseHandler: NewResponseHandler(config), + } + + queryHandler.createSchemas() + + return queryHandler +} + +func (queryHandler *QueryHandler) HandleSimpleQuery(originalQuery string) ([]pgproto3.Message, error) { + queryStatements, originalQueryStatements, err := queryHandler.queryRemapper.ParseAndRemapQuery(originalQuery) + if err != nil { + return nil, err + } + if len(queryStatements) == 0 { + return []pgproto3.Message{&pgproto3.EmptyQueryResponse{}}, nil + } + + var queriesMessages []pgproto3.Message + + for i, queryStatement := range queryStatements { + rows, err := queryHandler.duckdb.QueryContext(context.Background(), queryStatement) + if err != nil { + errorMessage := err.Error() + if errorMessage == "Binder Error: UNNEST requires a single list as input" { + // https://github.com/duckdb/duckdb/issues/11693 + LogWarn(queryHandler.config, "Couldn't handle query via DuckDB:", queryStatement+"\n"+err.Error()) + queriesMsgs, err := queryHandler.HandleSimpleQuery(FALLBACK_SQL_QUERY) // self-recursion + if err != nil { + return nil, err + } + queriesMessages = append(queriesMessages, queriesMsgs...) + continue + } else { + return nil, err + } + } + defer rows.Close() + + var queryMessages []pgproto3.Message + descriptionMessages, err := queryHandler.rowsToDescriptionMessages(rows, originalQueryStatements[i]) + if err != nil { + return nil, err + } + queryMessages = append(queryMessages, descriptionMessages...) + dataMessages, err := queryHandler.rowsToDataMessages(rows, originalQueryStatements[i]) + if err != nil { + return nil, err + } + queryMessages = append(queryMessages, dataMessages...) + + queriesMessages = append(queriesMessages, queryMessages...) + } + + return queriesMessages, nil +} + +func (queryHandler *QueryHandler) HandleParseQuery(message *pgproto3.Parse) ([]pgproto3.Message, *PreparedStatement, error) { + ctx := context.Background() + originalQuery := string(message.Query) + queryStatements, _, err := queryHandler.queryRemapper.ParseAndRemapQuery(originalQuery) + if err != nil { + return nil, nil, err + } + if len(queryStatements) > 1 { + return nil, nil, fmt.Errorf("multiple queries in a single parse message are not supported: %s", originalQuery) + } + + preparedStatement := &PreparedStatement{ + Name: message.Name, + OriginalQuery: originalQuery, + ParameterOIDs: message.ParameterOIDs, + } + if len(queryStatements) == 0 { + return []pgproto3.Message{&pgproto3.ParseComplete{}}, preparedStatement, nil + } + + query := queryStatements[0] + preparedStatement.Query = query + statement, err := queryHandler.duckdb.PrepareContext(ctx, query) + preparedStatement.Statement = statement + if err != nil { + return nil, nil, err + } + + return []pgproto3.Message{&pgproto3.ParseComplete{}}, preparedStatement, nil +} + +func (queryHandler *QueryHandler) HandleBindQuery(message *pgproto3.Bind, preparedStatement *PreparedStatement) ([]pgproto3.Message, *PreparedStatement, error) { + if message.PreparedStatement != preparedStatement.Name { + return nil, nil, fmt.Errorf("prepared statement mismatch, %s instead of %s: %s", message.PreparedStatement, preparedStatement.Name, preparedStatement.OriginalQuery) + } + + var variables []interface{} + paramFormatCodes := message.ParameterFormatCodes + + for i, param := range message.Parameters { + if param == nil { + continue + } + + textFormat := true + if len(paramFormatCodes) == 1 { + textFormat = paramFormatCodes[0] == 0 + } else if len(paramFormatCodes) > 1 { + textFormat = paramFormatCodes[i] == 0 + } + + if textFormat { + variables = append(variables, string(param)) + } else if len(param) == 4 { + variables = append(variables, int32(binary.BigEndian.Uint32(param))) + } else if len(param) == 8 { + variables = append(variables, int64(binary.BigEndian.Uint64(param))) + } else if len(param) == 16 { + variables = append(variables, uuid.UUID(param).String()) + } else { + return nil, nil, fmt.Errorf("unsupported parameter format: %v (length %d). Original query: %s", param, len(param), preparedStatement.OriginalQuery) + } + } + + LogDebug(queryHandler.config, "Bound variables:", variables) + preparedStatement.Bound = true + preparedStatement.Variables = variables + preparedStatement.Portal = message.DestinationPortal + + messages := []pgproto3.Message{&pgproto3.BindComplete{}} + + return messages, preparedStatement, nil +} + +func (queryHandler *QueryHandler) HandleDescribeQuery(message *pgproto3.Describe, preparedStatement *PreparedStatement) ([]pgproto3.Message, *PreparedStatement, error) { + switch message.ObjectType { + case 'S': // Statement + if message.Name != preparedStatement.Name { + return nil, nil, fmt.Errorf("statement mismatch, %s instead of %s: %s", message.Name, preparedStatement.Name, preparedStatement.OriginalQuery) + } + case 'P': // Portal + if message.Name != preparedStatement.Portal { + return nil, nil, fmt.Errorf("portal mismatch, %s instead of %s: %s", message.Name, preparedStatement.Portal, preparedStatement.OriginalQuery) + } + } + + preparedStatement.Described = true + if preparedStatement.Query == "" || !preparedStatement.Bound { // Empty query or Parse->[No Bind]->Describe + return []pgproto3.Message{&pgproto3.NoData{}}, preparedStatement, nil + } + + rows, err := preparedStatement.Statement.QueryContext(context.Background(), preparedStatement.Variables...) + if err != nil { + return nil, nil, fmt.Errorf("couldn't execute statement: %w. Original query: %s", err, preparedStatement.OriginalQuery) + } + preparedStatement.Rows = rows + + messages, err := queryHandler.rowsToDescriptionMessages(preparedStatement.Rows, preparedStatement.OriginalQuery) + if err != nil { + return nil, nil, err + } + return messages, preparedStatement, nil +} + +func (queryHandler *QueryHandler) HandleExecuteQuery(message *pgproto3.Execute, preparedStatement *PreparedStatement) ([]pgproto3.Message, error) { + if message.Portal != preparedStatement.Portal { + return nil, fmt.Errorf("portal mismatch, %s instead of %s: %s", message.Portal, preparedStatement.Portal, preparedStatement.OriginalQuery) + } + + if preparedStatement.Query == "" { + return []pgproto3.Message{&pgproto3.EmptyQueryResponse{}}, nil + } + + if preparedStatement.Rows == nil { // Parse->[No Bind]->Describe->Execute or Parse->Bind->[No Describe]->Execute + rows, err := preparedStatement.Statement.QueryContext(context.Background(), preparedStatement.Variables...) + if err != nil { + return nil, err + } + preparedStatement.Rows = rows + } + + defer preparedStatement.Rows.Close() + + return queryHandler.rowsToDataMessages(preparedStatement.Rows, preparedStatement.OriginalQuery) +} + +func (queryHandler *QueryHandler) createSchemas() { + ctx := context.Background() + schemas, err := queryHandler.icebergReader.Schemas() + PanicIfError(queryHandler.config, err) + + for _, schema := range schemas { + _, err := queryHandler.duckdb.ExecContext( + ctx, + "CREATE SCHEMA IF NOT EXISTS \"$schema\"", + map[string]string{"schema": schema}, + ) + PanicIfError(queryHandler.config, err) + } +} + +func (queryHandler *QueryHandler) rowsToDescriptionMessages(rows *sql.Rows, originalQuery string) ([]pgproto3.Message, error) { + cols, err := rows.ColumnTypes() + if err != nil { + return nil, fmt.Errorf("couldn't get column types: %w. Original query: %s", err, originalQuery) + } + + var messages []pgproto3.Message + + rowDescription := queryHandler.generateRowDescription(cols) + if rowDescription != nil { + messages = append(messages, rowDescription) + } + + return messages, nil +} + +func (queryHandler *QueryHandler) rowsToDataMessages(rows *sql.Rows, originalQuery string) ([]pgproto3.Message, error) { + cols, err := rows.ColumnTypes() + if err != nil { + return nil, fmt.Errorf("couldn't get column types: %w. Original query: %s", err, originalQuery) + } + + var messages []pgproto3.Message + for rows.Next() { + dataRow, err := queryHandler.generateDataRow(rows, cols) + if err != nil { + return nil, fmt.Errorf("couldn't get data row: %w. Original query: %s", err, originalQuery) + } + messages = append(messages, dataRow) + } + + commandTag := FALLBACK_SQL_QUERY + upperOriginalQueryStatement := strings.ToUpper(originalQuery) + switch { + case strings.HasPrefix(upperOriginalQueryStatement, "SET "): + commandTag = "SET" + case strings.HasPrefix(upperOriginalQueryStatement, "SHOW "): + commandTag = "SHOW" + case strings.HasPrefix(upperOriginalQueryStatement, "DISCARD ALL"): + commandTag = "DISCARD ALL" + case strings.HasPrefix(upperOriginalQueryStatement, "BEGIN"): + commandTag = "BEGIN" + } + + messages = append(messages, &pgproto3.CommandComplete{CommandTag: []byte(commandTag)}) + return messages, nil +} + +func (queryHandler *QueryHandler) generateRowDescription(cols []*sql.ColumnType) *pgproto3.RowDescription { + description := pgproto3.RowDescription{Fields: []pgproto3.FieldDescription{}} + + for _, col := range cols { + typeIod := queryHandler.ResponseHandler.ColumnDescriptionTypeOid(col) + + if col.Name() == "Success" && typeIod == pgtype.BoolOID && len(cols) == 1 { + // Skip the "Success" DuckDB column returned from SET ... commands + return nil + } + + description.Fields = append(description.Fields, pgproto3.FieldDescription{ + Name: []byte(col.Name()), + TableOID: 0, + TableAttributeNumber: 0, + DataTypeOID: typeIod, + DataTypeSize: -1, + TypeModifier: -1, + Format: 0, + }) + } + return &description +} + +func (queryHandler *QueryHandler) generateDataRow(rows *sql.Rows, cols []*sql.ColumnType) (*pgproto3.DataRow, error) { + valuePointers := make([]interface{}, len(cols)) + for i, col := range cols { + valuePointers[i] = queryHandler.ResponseHandler.RowValuePointer(col) + } + + err := rows.Scan(valuePointers...) + if err != nil { + return nil, err + } + + var values [][]byte + for i, valuePointer := range valuePointers { + value := queryHandler.ResponseHandler.RowValueBytes(valuePointer, cols[i]) + values = append(values, value) + } + dataRow := pgproto3.DataRow{Values: values} + + return &dataRow, nil +} diff --git a/src/query_handler_test.go b/src/server/query_handler_test.go similarity index 62% rename from src/query_handler_test.go rename to src/server/query_handler_test.go index 94cc656..15598c4 100644 --- a/src/query_handler_test.go +++ b/src/server/query_handler_test.go @@ -2,7 +2,10 @@ package main import ( "encoding/binary" + "flag" + "os" "reflect" + "strconv" "strings" "testing" @@ -12,7 +15,6 @@ import ( ) func TestHandleQuery(t *testing.T) { - createTestTables(t) queryHandler := initQueryHandler() defer queryHandler.duckdb.Close() @@ -20,37 +22,37 @@ func TestHandleQuery(t *testing.T) { testResponseByQuery(t, queryHandler, map[string]map[string][]string{ "SELECT VERSION()": { "description": {"version"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {"PostgreSQL 17.0, compiled by BemiDB"}, }, "SELECT pg_catalog.pg_get_userbyid(p.proowner) AS owner, 'Foo' AS foo FROM pg_catalog.pg_proc p LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace LIMIT 1": { "description": {"owner", "foo"}, - "types": {Uint32ToString(pgtype.TextOID), Uint32ToString(pgtype.TextOID)}, - "values": {"bemidb", "Foo"}, + "types": {uint32ToString(pgtype.TextOID), uint32ToString(pgtype.TextOID)}, + "values": {"user", "Foo"}, }, "SELECT QUOTE_IDENT('fooBar') AS quote_ident": { "description": {"quote_ident"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {"\"fooBar\""}, }, "SELECT setting from pg_show_all_settings() WHERE name = 'default_null_order'": { "description": {"setting"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {"nulls_last"}, }, "SELECT setting from pg_catalog.pg_show_all_settings() WHERE name = 'default_null_order'": { "description": {"setting"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {"nulls_last"}, }, "SELECT pg_catalog.pg_get_partkeydef(c.oid) AS pg_get_partkeydef FROM pg_catalog.pg_class c LIMIT 1": { "description": {"pg_get_partkeydef"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {""}, }, "SELECT pg_tablespace_location(t.oid) loc FROM pg_catalog.pg_tablespace": { "description": {"loc"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {""}, }, "SELECT pg_catalog.pg_get_expr(adbin, drelid) AS def_value FROM pg_catalog.pg_attrdef": { @@ -61,112 +63,112 @@ func TestHandleQuery(t *testing.T) { }, "SELECT pg_catalog.pg_get_viewdef(NULL, TRUE) AS viewdef": { "description": {"viewdef"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {""}, }, "SELECT set_config('bytea_output', 'hex', false) AS set_config": { "description": {"set_config"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {"hex"}, }, "SELECT pg_catalog.pg_encoding_to_char(6) AS pg_encoding_to_char": { "description": {"pg_encoding_to_char"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {"UTF8"}, }, "SELECT pg_backend_pid() AS pg_backend_pid": { "description": {"pg_backend_pid"}, - "types": {Uint32ToString(pgtype.Int4OID)}, + "types": {uint32ToString(pgtype.Int4OID)}, "values": {"0"}, }, "SELECT * from pg_is_in_recovery()": { "description": {"pg_is_in_recovery"}, - "types": {Uint32ToString(pgtype.BoolOID)}, + "types": {uint32ToString(pgtype.BoolOID)}, "values": {"f"}, }, - "SELECT row_to_json(t) AS row_to_json FROM (SELECT usename, passwd FROM pg_shadow WHERE usename='bemidb') t": { + "SELECT row_to_json(t) AS row_to_json FROM (SELECT usename FROM pg_shadow WHERE usename='user') t": { "description": {"row_to_json"}, - "types": {Uint32ToString(pgtype.TextOID)}, - "values": {`{"usename":"bemidb","passwd":"bemidb-encrypted"}`}, + "types": {uint32ToString(pgtype.JSONOID)}, + "values": {`{"usename":"user"}`}, }, "SELECT current_setting('default_tablespace') AS current_setting": { "description": {"current_setting"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {""}, }, "SELECT main.array_to_string('[1, 2, 3]', '') as str": { "description": {"str"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {"123"}, }, "SELECT pg_catalog.array_to_string('[1, 2, 3]', '') as str": { "description": {"str"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {"123"}, }, "SELECT array_to_string('[1, 2, 3]', '') as str": { "description": {"str"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {"123"}, }, "SELECT * FROM pg_catalog.generate_series(1, 1)": { "description": {"generate_series"}, - "types": {Uint32ToString(pgtype.Int8OID)}, + "types": {uint32ToString(pgtype.Int8OID)}, "values": {"1"}, }, "SELECT pg_catalog.aclexplode(db.datacl) AS d FROM pg_catalog.pg_database db": { "description": {"d"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.JSONOID)}, "values": {""}, }, "SELECT TRIM (BOTH '\"' FROM pg_catalog.pg_get_indexdef(1, 1, false)) AS trim": { "description": {"trim"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {""}, }, "SELECT (d).grantee AS grantee, (d).grantor AS grantor, (d).is_grantable AS is_grantable, (d).privilege_type AS privilege_type FROM (SELECT pg_catalog.aclexplode(db.datacl) AS d FROM pg_catalog.pg_database db WHERE db.oid = 16388::OID) a": { "description": {"grantee", "grantor", "is_grantable", "privilege_type"}, - "types": {Uint32ToString(pgtype.TextOID), Uint32ToString(pgtype.TextOID), Uint32ToString(pgtype.TextOID), Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.JSONOID), uint32ToString(pgtype.JSONOID), uint32ToString(pgtype.JSONOID), uint32ToString(pgtype.JSONOID)}, "values": {"", "", "", ""}, }, "SELECT format('Hello %s, %s, %1$s', 'World', 'Earth') AS str": { "description": {"str"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {"Hello World, Earth, World"}, }, - "SELECT format('%s', \"test_table\".\"varchar_column\") AS str FROM test_table LIMIT 1": { + "SELECT format('%s', \"postgres\".\"test_table\".\"varchar_column\") AS str FROM postgres.test_table LIMIT 1": { "description": {"str"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {"varchar"}, }, - "SELECT jsonb_extract_path_text(json_column, 'key') AS jsonb_extract_path_text FROM test_table LIMIT 1": { + "SELECT jsonb_extract_path_text(json_column, 'key') AS jsonb_extract_path_text FROM postgres.test_table LIMIT 1": { "description": {"jsonb_extract_path_text"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {"value"}, }, - "SELECT jsonb_extract_path_text(json_column, VARIADIC ARRAY['key']) AS jsonb_extract_path_text FROM test_table LIMIT 1": { + "SELECT jsonb_extract_path_text(json_column, VARIADIC ARRAY['key']) AS jsonb_extract_path_text FROM postgres.test_table LIMIT 1": { "description": {"jsonb_extract_path_text"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {"value"}, }, "SELECT encode(sha256('foo'), 'hex'::text) AS encode": { "description": {"encode"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {"2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae"}, }, "SELECT json_build_object('min', 1, 'max', 2) AS json_build_object": { "description": {"json_build_object"}, - "types": {Uint32ToString(pgtype.TextOID)}, - "values": {"{\"min\":1,\"max\":2}"}, + "types": {uint32ToString(pgtype.JSONOID)}, + "values": {"{\"max\":2,\"min\":1}"}, }, "SELECT pg_catalog.pg_get_statisticsobjdef_columns(1) AS pg_get_statisticsobjdef_columns": { "description": {"pg_get_statisticsobjdef_columns"}, - "types": {Uint32ToString(pgtype.Int4OID)}, + "types": {uint32ToString(pgtype.Int4OID)}, "values": {""}, }, "SELECT pg_catalog.pg_relation_is_publishable('1') AS pg_relation_is_publishable": { "description": {"pg_relation_is_publishable"}, - "types": {Uint32ToString(pgtype.Int4OID)}, + "types": {uint32ToString(pgtype.Int4OID)}, "values": {""}, }, }) @@ -176,122 +178,122 @@ func TestHandleQuery(t *testing.T) { testResponseByQuery(t, queryHandler, map[string]map[string][]string{ "SELECT oid, typname AS typename FROM pg_type WHERE typname='geometry' OR typname='geography'": { "description": {"oid", "typename"}, - "types": {Uint32ToString(pgtype.OIDOID), Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.OIDOID), uint32ToString(pgtype.TextOID)}, "values": {}, }, - "SELECT relname FROM pg_catalog.pg_class WHERE relnamespace = (SELECT oid FROM pg_catalog.pg_namespace WHERE nspname = 'public' LIMIT 1) ORDER BY relname DESC LIMIT 1": { + "SELECT relname FROM pg_catalog.pg_class WHERE relnamespace = (SELECT oid FROM pg_catalog.pg_namespace WHERE nspname = 'postgres' LIMIT 1) ORDER BY relname DESC LIMIT 1": { "description": {"relname"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {"test_table"}, }, "SELECT oid FROM pg_catalog.pg_extension": { "description": {"oid"}, - "types": {Uint32ToString(pgtype.OIDOID)}, + "types": {uint32ToString(pgtype.OIDOID)}, "values": {"13823"}, }, "SELECT slot_name FROM pg_replication_slots": { "description": {"slot_name"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {}, }, "SELECT oid, datname, datdba FROM pg_catalog.pg_database where oid = 16388": { "description": {"oid", "datname", "datdba"}, - "types": {Uint32ToString(pgtype.OIDOID), Uint32ToString(pgtype.TextOID), Uint32ToString(pgtype.Int8OID)}, + "types": {uint32ToString(pgtype.OIDOID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.Int8OID)}, "values": {"16388", "bemidb", "10"}, }, "SELECT COALESCE(NULL, (SELECT datname FROM pg_database WHERE datname = 'bemidb')) AS datname": { "description": {"datname"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {"bemidb"}, }, "SELECT * FROM pg_catalog.pg_stat_gssapi": { "description": {"pid", "gss_authenticated", "principal", "encrypted", "credentials_delegated"}, - "types": {Uint32ToString(pgtype.Int4OID), Uint32ToString(pgtype.BoolOID), Uint32ToString(pgtype.TextOID), Uint32ToString(pgtype.BoolOID), Uint32ToString(pgtype.BoolOID)}, + "types": {uint32ToString(pgtype.Int4OID), uint32ToString(pgtype.BoolOID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.BoolOID), uint32ToString(pgtype.BoolOID)}, "values": {}, }, "SELECT * FROM pg_catalog.pg_user": { "description": {"usename", "usesysid", "usecreatedb", "usesuper", "userepl", "usebypassrls", "passwd", "valuntil", "useconfig"}, - "types": {Uint32ToString(pgtype.TextOID)}, - "values": {"bemidb", "10", "t", "t", "t", "t", "", "", ""}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"user", "10", "t", "t", "t", "t", "", "", ""}, }, "SELECT datid FROM pg_catalog.pg_stat_activity": { "description": {"datid"}, - "types": {Uint32ToString(pgtype.Int8OID)}, + "types": {uint32ToString(pgtype.Int8OID)}, "values": {}, }, "SELECT schemaname, matviewname AS objectname FROM pg_catalog.pg_matviews": { "description": {"schemaname", "objectname"}, - "types": {Uint32ToString(pgtype.TextOID), Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID), uint32ToString(pgtype.TextOID)}, "values": {}, }, "SELECT * FROM pg_catalog.pg_views": { "description": {"schemaname", "viewname", "viewowner", "definition"}, - "types": {Uint32ToString(pgtype.TextOID), Uint32ToString(pgtype.TextOID), Uint32ToString(pgtype.TextOID), Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.TextOID)}, }, "SELECT oid FROM pg_collation": { "description": {"oid"}, - "types": {Uint32ToString(pgtype.OIDOID)}, + "types": {uint32ToString(pgtype.OIDOID)}, "values": {"100"}, }, "SELECT * FROM pg_opclass": { "description": {"oid", "opcmethod", "opcname", "opcnamespace", "opcowner", "opcfamily", "opcintype", "opcdefault", "opckeytype"}, - "types": {Uint32ToString(pgtype.OIDOID), Uint32ToString(pgtype.Int8OID), Uint32ToString(pgtype.TextOID), Uint32ToString(pgtype.Int8OID), Uint32ToString(pgtype.Int8OID), Uint32ToString(pgtype.Int8OID), Uint32ToString(pgtype.Int8OID), Uint32ToString(pgtype.BoolOID), Uint32ToString(pgtype.Int8OID)}, + "types": {uint32ToString(pgtype.OIDOID), uint32ToString(pgtype.Int8OID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.Int8OID), uint32ToString(pgtype.Int8OID), uint32ToString(pgtype.Int8OID), uint32ToString(pgtype.Int8OID), uint32ToString(pgtype.BoolOID), uint32ToString(pgtype.Int8OID)}, }, - "SELECT schemaname, relname, n_live_tup FROM pg_stat_user_tables WHERE schemaname = 'public' ORDER BY relname DESC LIMIT 1": { + "SELECT schemaname, relname, n_live_tup FROM pg_stat_user_tables WHERE schemaname = 'postgres' ORDER BY relname DESC LIMIT 1": { "description": {"schemaname", "relname", "n_live_tup"}, - "types": {Uint32ToString(pgtype.TextOID), Uint32ToString(pgtype.TextOID), Uint32ToString(pgtype.Int8OID)}, - "values": {"public", "test_table", "1"}, + "types": {uint32ToString(pgtype.TextOID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.Int8OID)}, + "values": {"postgres", "test_table", "1"}, }, - "SELECT DISTINCT(nspname) FROM pg_catalog.pg_namespace WHERE nspname != 'information_schema' AND nspname != 'pg_catalog' ORDER BY nspname DESC LIMIT 1": { + "SELECT DISTINCT(nspname) FROM pg_catalog.pg_namespace WHERE nspname != 'information_schema' AND nspname != 'pg_catalog' ORDER BY nspname LIMIT 1": { "description": {"nspname"}, - "types": {Uint32ToString(pgtype.TextOID)}, - "values": {"test"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"postgres"}, }, "SELECT nspname FROM pg_catalog.pg_namespace WHERE nspname == 'main'": { "description": {"nspname"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {}, }, - "SELECT n.nspname FROM pg_catalog.pg_namespace n LEFT OUTER JOIN pg_catalog.pg_description d ON d.objoid = n.oid ORDER BY n.nspname DESC LIMIT 1": { + "SELECT n.nspname FROM pg_catalog.pg_namespace n LEFT OUTER JOIN pg_catalog.pg_description d ON d.objoid = n.oid ORDER BY n.nspname LIMIT 1": { "description": {"nspname"}, - "types": {Uint32ToString(pgtype.TextOID)}, - "values": {"test"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"postgres"}, }, "SELECT rel.oid FROM pg_class rel LEFT JOIN pg_extension ON rel.oid = pg_extension.oid ORDER BY rel.oid LIMIT 1;": { "description": {"oid"}, - "types": {Uint32ToString(pgtype.OIDOID)}, - "values": {"1262"}, + "types": {uint32ToString(pgtype.OIDOID)}, + "values": {"1978"}, }, - "SELECT pg_total_relation_size(relid) AS total_size FROM pg_catalog.pg_statio_user_tables WHERE schemaname = 'public'": { + "SELECT pg_total_relation_size(relid) AS total_size FROM pg_catalog.pg_statio_user_tables WHERE schemaname = 'postgres'": { "description": {"total_size"}, - "types": {Uint32ToString(pgtype.Int4OID)}, + "types": {uint32ToString(pgtype.Int4OID)}, }, - "SELECT pg_total_relation_size(relid) AS total_size FROM pg_catalog.pg_statio_user_tables WHERE schemaname = 'public' UNION SELECT NULL AS total_size FROM pg_catalog.pg_proc p LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace WHERE n.nspname = 'public'": { + "SELECT pg_total_relation_size(relid) AS total_size FROM pg_catalog.pg_statio_user_tables WHERE schemaname = 'postgres' UNION SELECT NULL AS total_size FROM pg_catalog.pg_proc p LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace WHERE n.nspname = 'postgres'": { "description": {"total_size"}, - "types": {Uint32ToString(pgtype.Int4OID)}, + "types": {uint32ToString(pgtype.Int4OID)}, }, "SELECT * FROM pg_catalog.pg_shdescription": { "description": {"objoid", "classoid", "description"}, - "types": {Uint32ToString(pgtype.OIDOID), Uint32ToString(pgtype.OIDOID), Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.OIDOID), uint32ToString(pgtype.OIDOID), uint32ToString(pgtype.TextOID)}, }, "SELECT * FROM pg_catalog.pg_roles": { "description": {"oid", "rolname", "rolsuper", "rolinherit", "rolcreaterole", "rolcreatedb", "rolcanlogin", "rolreplication", "rolconnlimit", "rolpassword", "rolvaliduntil", "rolbypassrls", "rolconfig"}, "types": { - Uint32ToString(pgtype.OIDOID), - Uint32ToString(pgtype.TextOID), - Uint32ToString(pgtype.BoolOID), - Uint32ToString(pgtype.BoolOID), - Uint32ToString(pgtype.BoolOID), - Uint32ToString(pgtype.BoolOID), - Uint32ToString(pgtype.BoolOID), - Uint32ToString(pgtype.BoolOID), - Uint32ToString(pgtype.Int4OID), - Uint32ToString(pgtype.TextOID), - Uint32ToString(pgtype.TimestampOID), - Uint32ToString(pgtype.BoolOID), - Uint32ToString(pgtype.TextArrayOID), + uint32ToString(pgtype.OIDOID), + uint32ToString(pgtype.TextOID), + uint32ToString(pgtype.BoolOID), + uint32ToString(pgtype.BoolOID), + uint32ToString(pgtype.BoolOID), + uint32ToString(pgtype.BoolOID), + uint32ToString(pgtype.BoolOID), + uint32ToString(pgtype.BoolOID), + uint32ToString(pgtype.Int4OID), + uint32ToString(pgtype.TextOID), + uint32ToString(pgtype.TimestampOID), + uint32ToString(pgtype.BoolOID), + uint32ToString(pgtype.TextArrayOID), }, - "values": {"10", "bemidb", "t", "t", "t", "t", "t", "f", "-1", "", "", "f", ""}, + "values": {"10", "user", "t", "t", "t", "t", "t", "f", "-1", "", "", "f", ""}, }, "SELECT * FROM pg_catalog.pg_inherits": { "description": {"inhrelid", "inhparent", "inhseqno", "inhdetachpending"}, @@ -301,60 +303,60 @@ func TestHandleQuery(t *testing.T) { }, "SELECT ARRAY(select pg_get_indexdef(indexrelid, attnum, true) FROM pg_attribute WHERE attrelid = indexrelid ORDER BY attnum) AS expressions FROM pg_index": { "description": {"expressions"}, - "types": {Uint32ToString(pgtype.TextArrayOID)}, + "types": {uint32ToString(pgtype.TextArrayOID)}, "values": {}, }, "SELECT indnullsnotdistinct FROM pg_index": { "description": {"indnullsnotdistinct"}, - "types": {Uint32ToString(pgtype.BoolOID)}, + "types": {uint32ToString(pgtype.BoolOID)}, }, - "SELECT n.nspname, c.relname FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relname OPERATOR(pg_catalog.~) '^(test_table)$' COLLATE pg_catalog.default AND n.nspname OPERATOR(pg_catalog.~) '^(public)$' COLLATE pg_catalog.default": { + "SELECT n.nspname, c.relname FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relname OPERATOR(pg_catalog.~) '^(test_table)$' COLLATE pg_catalog.default AND n.nspname OPERATOR(pg_catalog.~) '^(postgres)$' COLLATE pg_catalog.default": { "description": {"nspname", "relname"}, - "types": {Uint32ToString(pgtype.TextOID), Uint32ToString(pgtype.TextOID)}, - "values": {"public", "test_table"}, + "types": {uint32ToString(pgtype.TextOID), uint32ToString(pgtype.TextOID)}, + "values": {"postgres", "test_table"}, }, "SELECT * FROM pg_catalog.pg_policy": { "description": {"oid", "polname", "polrelid", "polcmd", "polpermissive", "polroles", "polqual", "polwithcheck"}, - "types": {Uint32ToString(pgtype.OIDOID), Uint32ToString(pgtype.TextOID), Uint32ToString(pgtype.Int8OID), Uint32ToString(pgtype.TextOID), Uint32ToString(pgtype.BoolOID), Uint32ToString(pgtype.Int8OID), Uint32ToString(pgtype.TextOID), Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.OIDOID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.Int8OID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.BoolOID), uint32ToString(pgtype.Int8OID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.TextOID)}, }, "SELECT * FROM pg_catalog.pg_statistic_ext": { "description": {"oid", "stxrelid", "stxname", "stxnamespace", "stxowner", "stxstattarget", "stxkeys", "stxkind", "stxexprs"}, - "types": {Uint32ToString(pgtype.OIDOID), Uint32ToString(pgtype.Int8OID), Uint32ToString(pgtype.TextOID), Uint32ToString(pgtype.Int8OID), Uint32ToString(pgtype.Int8OID), Uint32ToString(pgtype.Int4OID), Uint32ToString(pgtype.Int8OID), Uint32ToString(pgtype.TextOID), Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.OIDOID), uint32ToString(pgtype.Int8OID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.Int8OID), uint32ToString(pgtype.Int8OID), uint32ToString(pgtype.Int4OID), uint32ToString(pgtype.Int8OID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.TextOID)}, }, "SELECT * FROM pg_catalog.pg_publication": { "description": {"oid", "pubname", "pubowner", "puballtables", "pubinsert", "pubupdate", "pubdelete", "pubtruncate", "pubviaroot"}, - "types": {Uint32ToString(pgtype.OIDOID), Uint32ToString(pgtype.TextOID), Uint32ToString(pgtype.Int8OID), Uint32ToString(pgtype.BoolOID), Uint32ToString(pgtype.BoolOID), Uint32ToString(pgtype.BoolOID), Uint32ToString(pgtype.BoolOID), Uint32ToString(pgtype.BoolOID), Uint32ToString(pgtype.BoolOID)}, + "types": {uint32ToString(pgtype.OIDOID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.Int8OID), uint32ToString(pgtype.BoolOID), uint32ToString(pgtype.BoolOID), uint32ToString(pgtype.BoolOID), uint32ToString(pgtype.BoolOID), uint32ToString(pgtype.BoolOID), uint32ToString(pgtype.BoolOID)}, }, "SELECT * FROM pg_catalog.pg_publication_rel": { "description": {"oid", "prpubid", "prrelid", "prqual", "prattrs"}, - "types": {Uint32ToString(pgtype.OIDOID), Uint32ToString(pgtype.Int8OID), Uint32ToString(pgtype.Int8OID), Uint32ToString(pgtype.TextOID), Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.OIDOID), uint32ToString(pgtype.Int8OID), uint32ToString(pgtype.Int8OID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.TextOID)}, }, "SELECT * FROM pg_catalog.pg_publication_namespace": { "description": {"oid", "pnpubid", "pnnspid"}, - "types": {Uint32ToString(pgtype.OIDOID), Uint32ToString(pgtype.Int8OID), Uint32ToString(pgtype.Int8OID)}, + "types": {uint32ToString(pgtype.OIDOID), uint32ToString(pgtype.Int8OID), uint32ToString(pgtype.Int8OID)}, }, "SELECT pubname, NULL, NULL FROM pg_catalog.pg_publication p JOIN pg_catalog.pg_publication_namespace pn ON p.oid = pn.pnpubid JOIN pg_catalog.pg_class pc ON pc.relnamespace = pn.pnnspid UNION SELECT pubname, pg_get_expr(pr.prqual, c.oid), (CASE WHEN pr.prattrs IS NOT NULL THEN (SELECT string_agg(attname, ', ') FROM pg_catalog.generate_series(0, pg_catalog.array_upper(pr.prattrs::pg_catalog.int2[], 1)) s, pg_catalog.pg_attribute WHERE attrelid = pr.prrelid AND attnum = prattrs[s]) ELSE NULL END) FROM pg_catalog.pg_publication p JOIN pg_catalog.pg_publication_rel pr ON p.oid = pr.prpubid JOIN pg_catalog.pg_class c ON c.oid = pr.prrelid UNION SELECT pubname, NULL, NULL FROM pg_catalog.pg_publication p ORDER BY 1": { "description": {"pubname", "NULL", "NULL"}, - "types": {Uint32ToString(pgtype.TextOID), Uint32ToString(pgtype.TextOID), Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.TextOID)}, }, "SELECT * FROM user": { "description": {"user"}, - "types": {Uint32ToString(pgtype.TextOID)}, - "values": {"bemidb"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"user"}, }, }) }) t.Run("Information schema", func(t *testing.T) { testResponseByQuery(t, queryHandler, map[string]map[string][]string{ - "SELECT * FROM information_schema.tables WHERE table_schema = 'public' ORDER BY table_name DESC LIMIT 1": { + "SELECT * FROM information_schema.tables WHERE table_schema = 'postgres' ORDER BY table_name DESC LIMIT 1": { "description": {"table_catalog", "table_schema", "table_name", "table_type", "self_referencing_column_name", "reference_generation", "user_defined_type_catalog", "user_defined_type_schema", "user_defined_type_name", "is_insertable_into", "is_typed", "commit_action", "TABLE_COMMENT"}, - "types": {Uint32ToString(pgtype.TextOID)}, - "values": {"memory", "public", "test_table", "BASE TABLE", "", "", "", "", "", "YES", "NO", "", ""}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"memory", "postgres", "test_table", "BASE TABLE", "", "", "", "", "", "YES", "NO", "", ""}, }, - "SELECT column_name, udt_schema, udt_name FROM information_schema.columns WHERE table_schema = 'public' AND table_name = 'test_table' ORDER BY ordinal_position LIMIT 1": { + "SELECT column_name, udt_schema, udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' ORDER BY ordinal_position LIMIT 1": { "description": {"column_name", "udt_schema", "udt_name"}, - "types": {Uint32ToString(pgtype.TextOID), Uint32ToString(pgtype.TextOID), Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.TextOID)}, "values": {"id", "pg_catalog", "int4"}, }, }) @@ -364,12 +366,12 @@ func TestHandleQuery(t *testing.T) { testResponseByQuery(t, queryHandler, map[string]map[string][]string{ "SHOW search_path": { "description": {"search_path"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {`"$user", public`}, }, "SHOW timezone": { "description": {"timezone"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {"UTC"}, }, }) @@ -377,453 +379,434 @@ func TestHandleQuery(t *testing.T) { t.Run("Iceberg tables", func(t *testing.T) { testResponseByQuery(t, queryHandler, map[string]map[string][]string{ - "SELECT COUNT(*) AS count FROM public.test_table": { - "description": {"count"}, - "types": {Uint32ToString(pgtype.Int8OID)}, - "values": {"2"}, - }, - "SELECT COUNT(*) AS count FROM test_table": { + "SELECT COUNT(*) AS count FROM postgres.test_table": { "description": {"count"}, - "types": {Uint32ToString(pgtype.Int8OID)}, + "types": {uint32ToString(pgtype.Int8OID)}, "values": {"2"}, }, - "SELECT COUNT(DISTINCT public.test_table.id) AS count FROM public.test_table": { + "SELECT COUNT(DISTINCT postgres.test_table.id) AS count FROM postgres.test_table": { "description": {"count"}, - "types": {Uint32ToString(pgtype.Int8OID)}, + "types": {uint32ToString(pgtype.Int8OID)}, "values": {"2"}, }, - "SELECT x.id FROM public.test_table x WHERE x.id = 1": { + "SELECT x.id FROM postgres.test_table x WHERE x.id = 1": { "description": {"id"}, - "types": {Uint32ToString(pgtype.Int4OID)}, + "types": {uint32ToString(pgtype.Int4OID)}, "values": {"1"}, }, - "SELECT public.test_table.id FROM public.test_table WHERE public.test_table.id = 1": { + "SELECT postgres.test_table.id FROM postgres.test_table WHERE postgres.test_table.id = 1": { "description": {"id"}, - "types": {Uint32ToString(pgtype.Int4OID)}, + "types": {uint32ToString(pgtype.Int4OID)}, "values": {"1"}, }, - "SELECT test.empty_table.id FROM test.empty_table": { + "SELECT postgres.test_empty_table.id FROM postgres.test_empty_table": { "description": {"id"}, - "types": {Uint32ToString(pgtype.Int4OID)}, + "types": {uint32ToString(pgtype.Int4OID)}, }, - "SELECT test_table.id FROM public.test_table WHERE id = 1": { + "SELECT postgres.test_table.id FROM postgres.test_table WHERE id = 1": { "description": {"id"}, - "types": {Uint32ToString(pgtype.Int4OID)}, + "types": {uint32ToString(pgtype.Int4OID)}, "values": {"1"}, }, - "SELECT COUNT(*) FROM partitioned_table": { - "description": {"count"}, - "types": {Uint32ToString(pgtype.Int8OID)}, - "values": {"3"}, - }, - }) - }) - - t.Run("BemiDB functions", func(t *testing.T) { - testResponseByQuery(t, queryHandler, map[string]map[string][]string{ - "SELECT bemidb_last_synced_at('public.test_table')": { - "description": {"bemidb_last_synced_at"}, - "types": {Uint32ToString(pgtype.TimestamptzOID)}, - "values": {"2025-04-16 14:28:33+00:00"}, - }, - "SELECT bemidb_last_synced_at('table_does_not_exist')": { - "description": {"bemidb_last_synced_at"}, - "types": {Uint32ToString(pgtype.TimestamptzOID)}, - "values": {""}, - }, + // TODO: add support for partitioned tables + // "SELECT COUNT(*) FROM postgres.partitioned_table": { + // "description": {"count"}, + // "types": {uint32ToString(pgtype.Int8OID)}, + // "values": {"3"}, + // }, }) }) t.Run("Column types", func(t *testing.T) { testResponseByQuery(t, queryHandler, map[string]map[string][]string{ - "SELECT bit_column FROM public.test_table WHERE bit_column IS NOT NULL": { + "SELECT bit_column FROM postgres.test_table WHERE bit_column IS NOT NULL": { "description": {"bit_column"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.Int4OID)}, "values": {"1"}, }, - "SELECT bit_column FROM public.test_table WHERE bit_column IS NULL": { + "SELECT bit_column FROM postgres.test_table WHERE bit_column IS NULL": { "description": {"bit_column"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.Int4OID)}, "values": {""}, }, - "SELECT bool_column FROM public.test_table WHERE bool_column = TRUE": { + "SELECT bool_column FROM postgres.test_table WHERE bool_column = TRUE": { "description": {"bool_column"}, - "types": {Uint32ToString(pgtype.BoolOID)}, + "types": {uint32ToString(pgtype.BoolOID)}, "values": {"t"}, }, - "SELECT bool_column FROM public.test_table WHERE bool_column = FALSE": { + "SELECT bool_column FROM postgres.test_table WHERE bool_column = FALSE": { "description": {"bool_column"}, - "types": {Uint32ToString(pgtype.BoolOID)}, + "types": {uint32ToString(pgtype.BoolOID)}, "values": {"f"}, }, - "SELECT bpchar_column FROM public.test_table WHERE bool_column = TRUE": { + "SELECT bpchar_column FROM postgres.test_table WHERE bool_column = TRUE": { "description": {"bpchar_column"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {"bpchar"}, }, - "SELECT bpchar_column FROM public.test_table WHERE bool_column = FALSE": { + "SELECT bpchar_column FROM postgres.test_table WHERE bool_column = FALSE": { "description": {"bpchar_column"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {""}, }, - "SELECT varchar_column FROM public.test_table WHERE varchar_column IS NOT NULL": { + "SELECT varchar_column FROM postgres.test_table WHERE varchar_column IS NOT NULL": { "description": {"varchar_column"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {"varchar"}, }, - "SELECT varchar_column FROM public.test_table WHERE varchar_column IS NULL": { + "SELECT varchar_column FROM postgres.test_table WHERE varchar_column IS NULL": { "description": {"varchar_column"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {""}, }, - "SELECT text_column FROM public.test_table WHERE bool_column = TRUE": { + "SELECT text_column FROM postgres.test_table WHERE bool_column = TRUE": { "description": {"text_column"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {"text"}, }, - "SELECT text_column FROM public.test_table WHERE bool_column = FALSE": { + "SELECT text_column FROM postgres.test_table WHERE bool_column = FALSE": { "description": {"text_column"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {""}, }, - "SELECT int2_column FROM public.test_table WHERE bool_column = TRUE": { + "SELECT int2_column FROM postgres.test_table WHERE bool_column = TRUE": { "description": {"int2_column"}, - "types": {Uint32ToString(pgtype.Int4OID)}, + "types": {uint32ToString(pgtype.Int4OID)}, "values": {"32767"}, }, - "SELECT int2_column FROM public.test_table WHERE bool_column = FALSE": { + "SELECT int2_column FROM postgres.test_table WHERE bool_column = FALSE": { "description": {"int2_column"}, - "types": {Uint32ToString(pgtype.Int4OID)}, + "types": {uint32ToString(pgtype.Int4OID)}, "values": {"-32767"}, }, - "SELECT int4_column FROM public.test_table WHERE int4_column IS NOT NULL": { + "SELECT int4_column FROM postgres.test_table WHERE int4_column IS NOT NULL": { "description": {"int4_column"}, - "types": {Uint32ToString(pgtype.Int4OID)}, + "types": {uint32ToString(pgtype.Int4OID)}, "values": {"2147483647"}, }, - "SELECT int4_column FROM public.test_table WHERE int4_column IS NULL": { + "SELECT int4_column FROM postgres.test_table WHERE int4_column IS NULL": { "description": {"int4_column"}, - "types": {Uint32ToString(pgtype.Int4OID)}, + "types": {uint32ToString(pgtype.Int4OID)}, "values": {""}, }, - "SELECT int8_column FROM public.test_table WHERE bool_column = TRUE": { + "SELECT int8_column FROM postgres.test_table WHERE bool_column = TRUE": { "description": {"int8_column"}, - "types": {Uint32ToString(pgtype.Int8OID)}, - "values": {"9223372036854775807"}, + "types": {uint32ToString(pgtype.NumericOID)}, + "values": {"9.223372036854776e+18"}, }, - "SELECT int8_column FROM public.test_table WHERE bool_column = FALSE": { + "SELECT int8_column FROM postgres.test_table WHERE bool_column = FALSE": { "description": {"int8_column"}, - "types": {Uint32ToString(pgtype.Int8OID)}, - "values": {"-9223372036854775807"}, + "types": {uint32ToString(pgtype.NumericOID)}, + "values": {"-9.223372036854776e+18"}, }, - "SELECT hugeint_column FROM public.test_table WHERE hugeint_column IS NOT NULL": { + "SELECT hugeint_column FROM postgres.test_table WHERE hugeint_column IS NOT NULL": { "description": {"hugeint_column"}, - "types": {Uint32ToString(pgtype.NumericOID)}, + "types": {uint32ToString(pgtype.NumericOID)}, "values": {"1e+19"}, }, - "SELECT hugeint_column FROM public.test_table WHERE hugeint_column IS NULL": { + "SELECT hugeint_column FROM postgres.test_table WHERE hugeint_column IS NULL": { "description": {"hugeint_column"}, - "types": {Uint32ToString(pgtype.NumericOID)}, + "types": {uint32ToString(pgtype.NumericOID)}, "values": {""}, }, - "SELECT xid_column FROM public.test_table WHERE xid_column IS NOT NULL": { + "SELECT xid_column FROM postgres.test_table WHERE xid_column IS NOT NULL": { "description": {"xid_column"}, - "types": {Uint32ToString(pgtype.XIDOID)}, + "types": {uint32ToString(pgtype.Int8OID)}, "values": {"4294967295"}, }, - "SELECT xid_column FROM public.test_table WHERE xid_column IS NULL": { + "SELECT xid_column FROM postgres.test_table WHERE xid_column IS NULL": { "description": {"xid_column"}, - "types": {Uint32ToString(pgtype.XIDOID)}, + "types": {uint32ToString(pgtype.Int8OID)}, "values": {""}, }, - "SELECT xid8_column FROM public.test_table WHERE xid8_column IS NOT NULL": { + "SELECT xid8_column FROM postgres.test_table WHERE xid8_column IS NOT NULL": { "description": {"xid8_column"}, - "types": {Uint32ToString(pgtype.XID8OID)}, - "values": {"18446744073709551615"}, + "types": {uint32ToString(pgtype.NumericOID)}, + "values": {"1.8446744073709552e+19"}, }, - "SELECT xid8_column FROM public.test_table WHERE xid8_column IS NULL": { + "SELECT xid8_column FROM postgres.test_table WHERE xid8_column IS NULL": { "description": {"xid8_column"}, - "types": {Uint32ToString(pgtype.XID8OID)}, + "types": {uint32ToString(pgtype.NumericOID)}, "values": {""}, }, - "SELECT float4_column FROM public.test_table WHERE float4_column = 3.14": { + "SELECT float4_column FROM postgres.test_table WHERE float4_column = 3.14": { "description": {"float4_column"}, - "types": {Uint32ToString(pgtype.Float4OID)}, + "types": {uint32ToString(pgtype.Float4OID)}, "values": {"3.14"}, }, - "SELECT float4_column FROM public.test_table WHERE float4_column != 3.14": { + "SELECT float4_column FROM postgres.test_table WHERE float4_column != 3.14": { "description": {"float4_column"}, - "types": {Uint32ToString(pgtype.Float4OID)}, + "types": {uint32ToString(pgtype.Float4OID)}, "values": {"NaN"}, }, - "SELECT float8_column FROM public.test_table WHERE bool_column = TRUE": { + "SELECT float8_column FROM postgres.test_table WHERE bool_column = TRUE": { "description": {"float8_column"}, - "types": {Uint32ToString(pgtype.Float8OID)}, + "types": {uint32ToString(pgtype.Float8OID)}, "values": {"3.141592653589793"}, }, - "SELECT float8_column FROM public.test_table WHERE bool_column = FALSE": { + "SELECT float8_column FROM postgres.test_table WHERE bool_column = FALSE": { "description": {"float8_column"}, - "types": {Uint32ToString(pgtype.Float8OID)}, + "types": {uint32ToString(pgtype.Float8OID)}, "values": {"-3.141592653589793"}, }, - "SELECT numeric_column FROM public.test_table WHERE bool_column = TRUE": { + "SELECT numeric_column FROM postgres.test_table WHERE bool_column = TRUE": { "description": {"numeric_column"}, - "types": {Uint32ToString(pgtype.NumericOID)}, + "types": {uint32ToString(pgtype.NumericOID)}, "values": {"12345.67"}, }, - "SELECT numeric_column FROM public.test_table WHERE bool_column = FALSE": { + "SELECT numeric_column FROM postgres.test_table WHERE bool_column = FALSE": { "description": {"numeric_column"}, - "types": {Uint32ToString(pgtype.NumericOID)}, + "types": {uint32ToString(pgtype.NumericOID)}, "values": {"-12345"}, }, - "SELECT numeric_column_without_precision FROM public.test_table WHERE numeric_column_without_precision IS NOT NULL": { + "SELECT numeric_column_without_precision FROM postgres.test_table WHERE numeric_column_without_precision IS NOT NULL": { "description": {"numeric_column_without_precision"}, - "types": {Uint32ToString(pgtype.NumericOID)}, + "types": {uint32ToString(pgtype.NumericOID)}, "values": {"12345.67"}, }, - "SELECT numeric_column_without_precision FROM public.test_table WHERE numeric_column_without_precision IS NULL": { + "SELECT numeric_column_without_precision FROM postgres.test_table WHERE numeric_column_without_precision IS NULL": { "description": {"numeric_column_without_precision"}, - "types": {Uint32ToString(pgtype.NumericOID)}, + "types": {uint32ToString(pgtype.NumericOID)}, "values": {""}, }, - "SELECT date_column FROM public.test_table LIMIT 1": { + "SELECT date_column FROM postgres.test_table LIMIT 1": { "description": {"date_column"}, - "types": {Uint32ToString(pgtype.DateOID)}, - "values": {"2021-01-01"}, + "types": {uint32ToString(pgtype.DateOID)}, + "values": {"2024-01-01"}, }, - "SELECT date_column FROM public.test_table LIMIT 1 OFFSET 1": { + "SELECT date_column FROM postgres.test_table LIMIT 1 OFFSET 1": { "description": {"date_column"}, - "types": {Uint32ToString(pgtype.DateOID)}, + "types": {uint32ToString(pgtype.DateOID)}, "values": {"20025-11-12"}, }, - "SELECT time_column FROM public.test_table WHERE bool_column = TRUE": { + "SELECT time_column FROM postgres.test_table WHERE bool_column = TRUE": { "description": {"time_column"}, - "types": {Uint32ToString(pgtype.TimeOID)}, + "types": {uint32ToString(pgtype.TimeOID)}, "values": {"12:00:00.123456"}, }, - "SELECT time_column FROM public.test_table WHERE bool_column = FALSE": { + "SELECT time_column FROM postgres.test_table WHERE bool_column = FALSE": { "description": {"time_column"}, - "types": {Uint32ToString(pgtype.TimeOID)}, + "types": {uint32ToString(pgtype.TimeOID)}, "values": {"12:00:00.123"}, }, - "SELECT timeMsColumn FROM public.test_table WHERE timeMsColumn IS NOT NULL": { - "description": {"timeMsColumn"}, - "types": {Uint32ToString(pgtype.TimeOID)}, + "SELECT timeMsColumn FROM postgres.test_table WHERE timeMsColumn IS NOT NULL": { + "description": {"timemscolumn"}, + "types": {uint32ToString(pgtype.TimeOID)}, "values": {"12:00:00.123"}, }, - "SELECT timeMsColumn FROM public.test_table WHERE timeMsColumn IS NULL": { - "description": {"timeMsColumn"}, - "types": {Uint32ToString(pgtype.TimeOID)}, + "SELECT timeMsColumn FROM postgres.test_table WHERE timeMsColumn IS NULL": { + "description": {"timemscolumn"}, + "types": {uint32ToString(pgtype.TimeOID)}, "values": {""}, }, - "SELECT timetz_column FROM public.test_table WHERE bool_column = TRUE": { + "SELECT timetz_column FROM postgres.test_table WHERE bool_column = TRUE": { "description": {"timetz_column"}, - "types": {Uint32ToString(pgtype.TimeOID)}, + "types": {uint32ToString(pgtype.TimeOID)}, "values": {"17:00:00.123456"}, }, - "SELECT timetz_column FROM public.test_table WHERE bool_column = FALSE": { + "SELECT timetz_column FROM postgres.test_table WHERE bool_column = FALSE": { "description": {"timetz_column"}, - "types": {Uint32ToString(pgtype.TimeOID)}, + "types": {uint32ToString(pgtype.TimeOID)}, "values": {"07:00:00.123"}, }, - "SELECT timestamp_column FROM public.test_table WHERE bool_column = TRUE": { + "SELECT timestamp_column FROM postgres.test_table WHERE bool_column = TRUE": { "description": {"timestamp_column"}, - "types": {Uint32ToString(pgtype.TimestampOID)}, + "types": {uint32ToString(pgtype.TimestampOID)}, "values": {"2024-01-01 12:00:00.123456"}, }, - "SELECT timestamp_column FROM public.test_table WHERE bool_column = FALSE": { + "SELECT timestamp_column FROM postgres.test_table WHERE bool_column = FALSE": { "description": {"timestamp_column"}, - "types": {Uint32ToString(pgtype.TimestampOID)}, + "types": {uint32ToString(pgtype.TimestampOID)}, "values": {"2024-01-01 12:00:00"}, }, - "SELECT timestamp_ms_column FROM public.test_table WHERE timestamp_ms_column IS NOT NULL": { + "SELECT timestamp_ms_column FROM postgres.test_table WHERE timestamp_ms_column IS NOT NULL": { "description": {"timestamp_ms_column"}, - "types": {Uint32ToString(pgtype.TimestampOID)}, + "types": {uint32ToString(pgtype.TimestampOID)}, "values": {"2024-01-01 12:00:00.123"}, }, - "SELECT timestamp_ms_column FROM public.test_table WHERE timestamp_ms_column IS NULL": { + "SELECT timestamp_ms_column FROM postgres.test_table WHERE timestamp_ms_column IS NULL": { "description": {"timestamp_ms_column"}, - "types": {Uint32ToString(pgtype.TimestampOID)}, + "types": {uint32ToString(pgtype.TimestampOID)}, "values": {""}, }, - "SELECT timestamptz_column FROM public.test_table WHERE bool_column = TRUE": { + "SELECT timestamptz_column FROM postgres.test_table WHERE bool_column = TRUE": { "description": {"timestamptz_column"}, - "types": {Uint32ToString(pgtype.TimestampOID)}, - "values": {"2024-01-01 17:00:00.123456"}, + "types": {uint32ToString(pgtype.TimestamptzOID)}, + "values": {"2024-01-01 17:00:00.123456+00:00"}, }, - "SELECT timestamptz_column FROM public.test_table WHERE bool_column = FALSE": { + "SELECT timestamptz_column FROM postgres.test_table WHERE bool_column = FALSE": { "description": {"timestamptz_column"}, - "types": {Uint32ToString(pgtype.TimestampOID)}, - "values": {"2024-01-01 07:00:00.000123"}, + "types": {uint32ToString(pgtype.TimestamptzOID)}, + "values": {"2024-01-01 06:30:00.000123+00:00"}, }, - "SELECT timestamptz_ms_column FROM public.test_table WHERE bool_column = TRUE": { + "SELECT timestamptz_ms_column FROM postgres.test_table WHERE bool_column = TRUE": { "description": {"timestamptz_ms_column"}, - "types": {Uint32ToString(pgtype.TimestampOID)}, - "values": {"2024-01-01 17:00:00.123"}, + "types": {uint32ToString(pgtype.TimestamptzOID)}, + "values": {"2024-01-01 17:00:00.123+00:00"}, }, - "SELECT timestamptz_ms_column FROM public.test_table WHERE bool_column = FALSE": { + "SELECT timestamptz_ms_column FROM postgres.test_table WHERE bool_column = FALSE": { "description": {"timestamptz_ms_column"}, - "types": {Uint32ToString(pgtype.TimestampOID)}, - "values": {"2024-01-01 07:00:00.12"}, + "types": {uint32ToString(pgtype.TimestamptzOID)}, + "values": {"2024-01-01 07:00:00.12+00:00"}, }, - "SELECT uuid_column FROM public.test_table WHERE uuid_column = '58a7c845-af77-44b2-8664-7ca613d92f04'": { + "SELECT uuid_column FROM postgres.test_table WHERE uuid_column = '58a7c845-af77-44b2-8664-7ca613d92f04'": { "description": {"uuid_column"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {"58a7c845-af77-44b2-8664-7ca613d92f04"}, }, - "SELECT uuid_column FROM public.test_table WHERE uuid_column IS NULL": { + "SELECT uuid_column FROM postgres.test_table WHERE uuid_column IS NULL": { "description": {"uuid_column"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {""}, }, - "SELECT bytea_column FROM public.test_table WHERE bytea_column IS NOT NULL": { + "SELECT bytea_column FROM postgres.test_table WHERE bytea_column IS NOT NULL": { "description": {"bytea_column"}, - "types": {Uint32ToString(pgtype.TextOID)}, - "values": {"\\x1234"}, + "types": {uint32ToString(pgtype.ByteaOID)}, + "values": {"\\x48656c6c6f"}, }, - "SELECT bytea_column FROM public.test_table WHERE bytea_column IS NULL": { + "SELECT bytea_column FROM postgres.test_table WHERE bytea_column IS NULL": { "description": {"bytea_column"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.ByteaOID)}, "values": {""}, }, - "SELECT interval_column FROM public.test_table WHERE interval_column IS NOT NULL": { + "SELECT interval_column FROM postgres.test_table WHERE interval_column IS NOT NULL": { "description": {"interval_column"}, - "types": {Uint32ToString(pgtype.TextOID)}, - "values": {"1 mon 2 days 01:00:01.000001"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"2806201000001us"}, }, - "SELECT interval_column FROM public.test_table WHERE interval_column IS NULL": { + "SELECT interval_column FROM postgres.test_table WHERE interval_column IS NULL": { "description": {"interval_column"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {""}, }, - "SELECT json_column FROM public.test_table WHERE json_column IS NOT NULL": { + "SELECT json_column FROM postgres.test_table WHERE json_column IS NOT NULL": { "description": {"json_column"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {"{\"key\": \"value\"}"}, }, - "SELECT json_column FROM public.test_table WHERE json_column IS NULL": { + "SELECT json_column FROM postgres.test_table WHERE json_column IS NULL": { "description": {"json_column"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {""}, }, - "SELECT jsonb_column FROM public.test_table WHERE bool_column = TRUE": { + "SELECT jsonb_column FROM postgres.test_table WHERE bool_column = TRUE": { "description": {"jsonb_column"}, - "types": {Uint32ToString(pgtype.TextOID)}, - "values": {"{\"key\": \"value\"}"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"{\"key\": \"value\", \"nestedKey\": { \"key\": \"value\" }}"}, }, - "SELECT jsonb_column->'key' AS key FROM public.test_table WHERE jsonb_column->>'key' = 'value'": { + "SELECT jsonb_column->'key' AS key FROM postgres.test_table WHERE jsonb_column->'nestedKey'->>'key' = 'value'": { "description": {"key"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.JSONOID)}, "values": {"\"value\""}, }, - "SELECT jsonb_column FROM public.test_table WHERE bool_column = FALSE": { + "SELECT jsonb_column FROM postgres.test_table WHERE bool_column = FALSE": { "description": {"jsonb_column"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {"{}"}, }, - "SELECT tsvector_column FROM public.test_table WHERE tsvector_column IS NOT NULL": { + "SELECT tsvector_column FROM postgres.test_table WHERE tsvector_column IS NOT NULL": { "description": {"tsvector_column"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {"'sampl':1 'text':2 'tsvector':4"}, }, - "SELECT tsvector_column FROM public.test_table WHERE tsvector_column IS NULL": { + "SELECT tsvector_column FROM postgres.test_table WHERE tsvector_column IS NULL": { "description": {"tsvector_column"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {""}, }, - "SELECT xml_column FROM public.test_table WHERE xml_column IS NOT NULL": { + "SELECT xml_column FROM postgres.test_table WHERE xml_column IS NOT NULL": { "description": {"xml_column"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {"text"}, }, - "SELECT xml_column FROM public.test_table WHERE xml_column IS NULL": { + "SELECT xml_column FROM postgres.test_table WHERE xml_column IS NULL": { "description": {"xml_column"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {""}, }, - "SELECT pg_snapshot_column FROM public.test_table WHERE pg_snapshot_column IS NOT NULL": { + "SELECT pg_snapshot_column FROM postgres.test_table WHERE pg_snapshot_column IS NOT NULL": { "description": {"pg_snapshot_column"}, - "types": {Uint32ToString(pgtype.TextOID)}, - "values": {"2784:2784:"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"1896:1896:"}, }, - "SELECT pg_snapshot_column FROM public.test_table WHERE pg_snapshot_column IS NULL": { + "SELECT pg_snapshot_column FROM postgres.test_table WHERE pg_snapshot_column IS NULL": { "description": {"pg_snapshot_column"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {""}, }, - "SELECT point_column FROM public.test_table WHERE point_column IS NOT NULL": { + "SELECT point_column FROM postgres.test_table WHERE point_column IS NOT NULL": { "description": {"point_column"}, - "types": {Uint32ToString(pgtype.TextOID)}, - "values": {"(37.347301483154,45.002101898193)"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"0101000000D6FFFF5F74AC4240CDFFFFDF44804640"}, }, - "SELECT point_column FROM public.test_table WHERE point_column IS NULL": { + "SELECT point_column FROM postgres.test_table WHERE point_column IS NULL": { "description": {"point_column"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {""}, }, - "SELECT inet_column FROM public.test_table WHERE inet_column IS NOT NULL": { + "SELECT inet_column FROM postgres.test_table WHERE inet_column IS NOT NULL": { "description": {"inet_column"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {"192.168.0.1"}, }, - "SELECT inet_column FROM public.test_table WHERE inet_column IS NULL": { + "SELECT inet_column FROM postgres.test_table WHERE inet_column IS NULL": { "description": {"inet_column"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {""}, }, - "SELECT array_text_column FROM public.test_table WHERE array_text_column IS NOT NULL": { + "SELECT array_text_column FROM postgres.test_table WHERE array_text_column IS NOT NULL": { "description": {"array_text_column"}, - "types": {Uint32ToString(pgtype.TextArrayOID)}, + "types": {uint32ToString(pgtype.TextArrayOID)}, "values": {"{one,two,three}"}, }, - "SELECT array_text_column FROM public.test_table WHERE array_text_column IS NULL": { + "SELECT array_text_column FROM postgres.test_table WHERE array_text_column IS NULL": { "description": {"array_text_column"}, - "types": {Uint32ToString(pgtype.TextArrayOID)}, + "types": {uint32ToString(pgtype.TextArrayOID)}, "values": {""}, }, - "SELECT array_int_column FROM public.test_table WHERE bool_column = TRUE": { + "SELECT array_int_column FROM postgres.test_table WHERE bool_column = TRUE": { "description": {"array_int_column"}, - "types": {Uint32ToString(pgtype.Int4ArrayOID)}, + "types": {uint32ToString(pgtype.Int4ArrayOID)}, "values": {"{1,2,3}"}, }, - "SELECT array_int_column FROM public.test_table WHERE bool_column = FALSE": { + "SELECT array_int_column FROM postgres.test_table WHERE bool_column = FALSE": { "description": {"array_int_column"}, - "types": {Uint32ToString(pgtype.Int4ArrayOID)}, - "values": {""}, + "types": {uint32ToString(pgtype.Int4ArrayOID)}, + "values": {"{}"}, }, - "SELECT array_jsonb_column FROM public.test_table WHERE array_jsonb_column IS NOT NULL": { + "SELECT array_jsonb_column FROM postgres.test_table WHERE array_jsonb_column IS NOT NULL": { "description": {"array_jsonb_column"}, - "types": {Uint32ToString(pgtype.TextArrayOID)}, + "types": {uint32ToString(pgtype.TextArrayOID)}, "values": {`{"{""key"": ""value1""}","{""key"": ""value2""}"}`}, }, - "SELECT array_jsonb_column FROM public.test_table WHERE array_jsonb_column IS NULL": { + "SELECT array_jsonb_column FROM postgres.test_table WHERE array_jsonb_column IS NULL": { "description": {"array_jsonb_column"}, - "types": {Uint32ToString(pgtype.TextArrayOID)}, + "types": {uint32ToString(pgtype.TextArrayOID)}, "values": {""}, }, - "SELECT array_ltree_column FROM public.test_table WHERE array_ltree_column IS NOT NULL": { + "SELECT array_ltree_column FROM postgres.test_table WHERE array_ltree_column IS NOT NULL": { "description": {"array_ltree_column"}, - "types": {Uint32ToString(pgtype.TextArrayOID)}, + "types": {uint32ToString(pgtype.TextArrayOID)}, "values": {"{a.b,c.d}"}, }, - "SELECT array_ltree_column FROM public.test_table WHERE array_ltree_column IS NULL": { + "SELECT array_ltree_column FROM postgres.test_table WHERE array_ltree_column IS NULL": { "description": {"array_ltree_column"}, - "types": {Uint32ToString(pgtype.TextArrayOID)}, + "types": {uint32ToString(pgtype.TextArrayOID)}, "values": {""}, }, - "SELECT user_defined_column FROM public.test_table WHERE user_defined_column IS NOT NULL": { + "SELECT user_defined_column FROM postgres.test_table WHERE user_defined_column IS NOT NULL": { "description": {"user_defined_column"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {"(Toronto)"}, }, - "SELECT user_defined_column FROM public.test_table WHERE user_defined_column IS NULL": { + "SELECT user_defined_column FROM postgres.test_table WHERE user_defined_column IS NULL": { "description": {"user_defined_column"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {""}, }, "SELECT relforcerowsecurity FROM pg_catalog.pg_class LIMIT 1": { "description": {"relforcerowsecurity"}, - "types": {Uint32ToString(pgtype.BoolOID)}, + "types": {uint32ToString(pgtype.BoolOID)}, "values": {"f"}, }, }) @@ -831,109 +814,109 @@ func TestHandleQuery(t *testing.T) { t.Run("Type casts", func(t *testing.T) { testResponseByQuery(t, queryHandler, map[string]map[string][]string{ - "SELECT '\"public\".\"test_table\"'::regclass::oid > 0 AS oid": { + "SELECT '\"postgres\".\"test_table\"'::regclass::oid > 0 AS oid": { "description": {"oid"}, - "types": {Uint32ToString(pgtype.BoolOID)}, + "types": {uint32ToString(pgtype.BoolOID)}, "values": {"t"}, }, - "SELECT FORMAT('%I.%I', 'public', 'test_table')::regclass::oid > 0 AS oid": { // NOTE: ::regclass::oid on non-constants is not fully supported yet + "SELECT FORMAT('%I.%I', 'postgres', 'test_table')::regclass::oid > 0 AS oid": { // NOTE: ::regclass::oid on non-constants is not fully supported yet "description": {"oid"}, - "types": {Uint32ToString(pgtype.BoolOID)}, + "types": {uint32ToString(pgtype.BoolOID)}, "values": {""}, }, - "SELECT attrelid > 0 AS attrelid FROM pg_attribute WHERE attrelid = '\"public\".\"test_table\"'::regclass LIMIT 1": { + "SELECT attrelid > 0 AS attrelid FROM pg_attribute WHERE attrelid = '\"postgres\".\"test_table\"'::regclass LIMIT 1": { "description": {"attrelid"}, - "types": {Uint32ToString(pgtype.BoolOID)}, + "types": {uint32ToString(pgtype.BoolOID)}, "values": {"t"}, }, - "SELECT COUNT(*) AS count FROM pg_attribute WHERE attrelid = '\"public\".\"test_table\"'::regclass": { + "SELECT COUNT(*) AS count FROM pg_attribute WHERE attrelid = '\"postgres\".\"test_table\"'::regclass": { "description": {"count"}, - "types": {Uint32ToString(pgtype.Int8OID)}, - "values": {"41"}, + "types": {uint32ToString(pgtype.Int8OID)}, + "values": {"40"}, }, "SELECT objoid, classoid, objsubid, description FROM pg_description WHERE classoid = 'pg_class'::regclass": { "description": {"objoid", "classoid", "objsubid", "description"}, - "types": {Uint32ToString(pgtype.OIDOID), Uint32ToString(pgtype.TextOID), Uint32ToString(pgtype.Int4OID), Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.OIDOID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.Int4OID), uint32ToString(pgtype.TextOID)}, "values": {}, }, "SELECT d.objoid, d.classoid, c.relname, d.description FROM pg_description d JOIN pg_class c ON d.classoid = 'pg_class'::regclass": { "description": {"objoid", "classoid", "relname", "description"}, - "types": {Uint32ToString(pgtype.OIDOID), Uint32ToString(pgtype.TextOID), Uint32ToString(pgtype.TextOID), Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.OIDOID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.TextOID)}, "values": {}, }, "SELECT objoid, classoid, objsubid, description FROM (SELECT * FROM pg_description WHERE classoid = 'pg_class'::regclass) d": { "description": {"objoid", "classoid", "objsubid", "description"}, - "types": {Uint32ToString(pgtype.OIDOID), Uint32ToString(pgtype.TextOID), Uint32ToString(pgtype.Int4OID), Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.OIDOID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.Int4OID), uint32ToString(pgtype.TextOID)}, "values": {}, }, "SELECT objoid, classoid, objsubid, description FROM pg_description WHERE (classoid = 'pg_class'::regclass AND objsubid = 0) OR classoid = 'pg_type'::regclass": { "description": {"objoid", "classoid", "objsubid", "description"}, - "types": {Uint32ToString(pgtype.OIDOID), Uint32ToString(pgtype.TextOID), Uint32ToString(pgtype.Int4OID), Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.OIDOID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.Int4OID), uint32ToString(pgtype.TextOID)}, "values": {}, }, "SELECT objoid, classoid, objsubid, description FROM pg_description WHERE classoid IN ('pg_class'::regclass, 'pg_type'::regclass)": { "description": {"objoid", "classoid", "objsubid", "description"}, - "types": {Uint32ToString(pgtype.OIDOID), Uint32ToString(pgtype.TextOID), Uint32ToString(pgtype.Int4OID), Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.OIDOID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.Int4OID), uint32ToString(pgtype.TextOID)}, "values": {}, }, "SELECT objoid FROM pg_description WHERE classoid = CASE WHEN true THEN 'pg_class'::regclass ELSE 'pg_type'::regclass END": { "description": {"objoid"}, - "types": {Uint32ToString(pgtype.OIDOID)}, + "types": {uint32ToString(pgtype.OIDOID)}, "values": {}, }, "SELECT word FROM (VALUES ('abort', 'U', 't', 'unreserved', 'can be bare label')) t(word, catcode, barelabel, catdesc, baredesc) WHERE word <> ALL('{a,abs,absolute,action}'::text[])": { "description": {"word"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {"abort"}, }, "SELECT NULL::text AS word": { "description": {"word"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {""}, }, "SELECT t.x FROM (VALUES (1::int2, 'pg_type'::regclass)) t(x, y)": { "description": {"x"}, - "types": {Uint32ToString(pgtype.Int2OID)}, + "types": {uint32ToString(pgtype.Int2OID)}, "values": {"1"}, }, "SELECT 'pg_catalog.array_in'::regproc AS regproc": { "description": {"regproc"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {"array_in"}, }, - "SELECT uuid_column FROM test_table WHERE uuid_column IN ('58a7c845-af77-44b2-8664-7ca613d92f04'::uuid)": { + "SELECT uuid_column FROM postgres.test_table WHERE uuid_column IN ('58a7c845-af77-44b2-8664-7ca613d92f04'::uuid)": { "description": {"uuid_column"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {"58a7c845-af77-44b2-8664-7ca613d92f04"}, }, "SELECT '1 week'::INTERVAL AS interval": { "description": {"interval"}, - "types": {Uint32ToString(pgtype.IntervalOID)}, + "types": {uint32ToString(pgtype.IntervalOID)}, "values": {"0 months 7 days 0 microseconds"}, }, "SELECT date_trunc('month', '2025-02-24 15:58:23-05'::timestamptz + '-1 month'::interval) AS date": { "description": {"date"}, - "types": {Uint32ToString(pgtype.TimestamptzOID)}, + "types": {uint32ToString(pgtype.TimestamptzOID)}, "values": {"2025-01-01 00:00:00+00:00"}, }, "SELECT 'foo'::pg_catalog.text AS text": { "description": {"text"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {"foo"}, }, "SELECT 1::pg_catalog.regtype::pg_catalog.text AS text": { "description": {"text"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {"1"}, }, "SELECT 1 AS value ORDER BY 1::pg_catalog.regclass::pg_catalog.text": { "description": {"value"}, - "types": {Uint32ToString(pgtype.Int4OID)}, + "types": {uint32ToString(pgtype.Int4OID)}, "values": {"1"}, }, "SELECT stxnamespace::pg_catalog.regnamespace::pg_catalog.text AS text FROM pg_catalog.pg_statistic_ext": { "description": {"text"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {}, }, }) @@ -943,32 +926,32 @@ func TestHandleQuery(t *testing.T) { testResponseByQuery(t, queryHandler, map[string]map[string][]string{ "SELECT * FROM pg_catalog.pg_get_keywords() LIMIT 1": { "description": {"word", "catcode", "barelabel", "catdesc", "baredesc"}, - "types": {Uint32ToString(pgtype.TextOID), Uint32ToString(pgtype.TextOID), Uint32ToString(pgtype.BoolOID), Uint32ToString(pgtype.TextOID), Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.BoolOID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.TextOID)}, "values": {"abort", "U", "t", "unreserved", "can be bare label"}, }, "SELECT pg_get_keywords.word FROM pg_catalog.pg_get_keywords() LIMIT 1": { "description": {"word"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {"abort"}, }, "SELECT * FROM generate_series(1, 2) AS series(index) LIMIT 1": { "description": {"index"}, - "types": {Uint32ToString(pgtype.Int8OID)}, + "types": {uint32ToString(pgtype.Int8OID)}, "values": {"1"}, }, "SELECT * FROM generate_series(1, array_upper(current_schemas(FALSE), 1)) AS series(index) LIMIT 1": { "description": {"index"}, - "types": {Uint32ToString(pgtype.Int8OID)}, + "types": {uint32ToString(pgtype.Int8OID)}, "values": {"1"}, }, "SELECT (information_schema._pg_expandarray(ARRAY[10])).n": { "description": {"n"}, - "types": {Uint32ToString(pgtype.Int8OID)}, + "types": {uint32ToString(pgtype.Int8OID)}, "values": {"1"}, }, "SELECT (information_schema._pg_expandarray(ARRAY[10])).x AS value": { "description": {"value"}, - "types": {Uint32ToString(pgtype.Int4OID)}, + "types": {uint32ToString(pgtype.Int4OID)}, "values": {"10"}, }, }) @@ -978,17 +961,17 @@ func TestHandleQuery(t *testing.T) { testResponseByQuery(t, queryHandler, map[string]map[string][]string{ "SELECT s.usename, r.rolconfig FROM pg_catalog.pg_shadow s LEFT JOIN pg_catalog.pg_roles r ON s.usename = r.rolname": { "description": {"usename", "rolconfig"}, - "types": {Uint32ToString(pgtype.TextOID)}, - "values": {"bemidb", ""}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"user", ""}, }, "SELECT a.oid, pd.description FROM pg_catalog.pg_roles a LEFT JOIN pg_catalog.pg_shdescription pd ON a.oid = pd.objoid": { "description": {"oid", "description"}, - "types": {Uint32ToString(pgtype.OIDOID), Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.OIDOID), uint32ToString(pgtype.TextOID)}, "values": {"10", ""}, }, "SELECT (SELECT 1 FROM (SELECT 1 AS inner_val) JOIN (SELECT NULL) ON inner_val = indclass[1]) AS test FROM pg_index": { "description": {"test"}, - "types": {Uint32ToString(pgtype.Int4OID)}, + "types": {uint32ToString(pgtype.Int4OID)}, }, }) }) @@ -997,52 +980,52 @@ func TestHandleQuery(t *testing.T) { testResponseByQuery(t, queryHandler, map[string]map[string][]string{ "SELECT CASE WHEN true THEN 'yes' ELSE 'no' END AS case": { "description": {"case"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {"yes"}, }, "SELECT CASE WHEN false THEN 'yes' ELSE 'no' END AS case": { "description": {"case"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {"no"}, }, "SELECT CASE WHEN true THEN 'one' WHEN false THEN 'two' ELSE 'three' END AS case": { "description": {"case"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {"one"}, }, "SELECT CASE WHEN (SELECT count(extname) FROM pg_catalog.pg_extension WHERE extname = 'bdr') > 0 THEN 'pgd' WHEN (SELECT count(*) FROM pg_replication_slots) > 0 THEN 'log' ELSE NULL END AS type": { "description": {"type"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {""}, }, "SELECT roles.oid AS id, roles.rolname AS name, roles.rolsuper AS is_superuser, CASE WHEN roles.rolsuper THEN true ELSE false END AS can_create_role FROM pg_catalog.pg_roles roles WHERE rolname = current_user": { "description": {"id", "name", "is_superuser", "can_create_role"}, - "types": {Uint32ToString(pgtype.Int8OID), Uint32ToString(pgtype.TextOID), Uint32ToString(pgtype.BoolOID), Uint32ToString(pgtype.BoolOID)}, + "types": {uint32ToString(pgtype.Int8OID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.BoolOID), uint32ToString(pgtype.BoolOID)}, "values": {}, }, "SELECT roles.oid AS id, roles.rolname AS name, roles.rolsuper AS is_superuser, CASE WHEN roles.rolsuper THEN true ELSE roles.rolcreaterole END AS can_create_role FROM pg_catalog.pg_roles roles WHERE rolname = current_user": { "description": {"id", "name", "is_superuser", "can_create_role"}, - "types": {Uint32ToString(pgtype.Int8OID), Uint32ToString(pgtype.TextOID), Uint32ToString(pgtype.BoolOID), Uint32ToString(pgtype.BoolOID)}, + "types": {uint32ToString(pgtype.Int8OID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.BoolOID), uint32ToString(pgtype.BoolOID)}, "values": {}, }, "SELECT CASE WHEN TRUE THEN pg_catalog.pg_is_in_recovery() END AS CASE": { "description": {"case"}, - "types": {Uint32ToString(pgtype.BoolOID)}, + "types": {uint32ToString(pgtype.BoolOID)}, "values": {"f"}, }, "SELECT CASE WHEN FALSE THEN true ELSE pg_catalog.pg_is_in_recovery() END AS CASE": { "description": {"case"}, - "types": {Uint32ToString(pgtype.BoolOID)}, + "types": {uint32ToString(pgtype.BoolOID)}, "values": {"f"}, }, - "SELECT CASE WHEN nsp.nspname = ANY('{information_schema}') THEN false ELSE true END AS db_support FROM pg_catalog.pg_namespace nsp WHERE nsp.oid = 1268::OID;": { + "SELECT CASE WHEN nsp.nspname = ANY('{information_schema}') THEN false ELSE true END AS db_support FROM pg_catalog.pg_namespace nsp WHERE nsp.oid = 1980::OID;": { "description": {"db_support"}, - "types": {Uint32ToString(pgtype.BoolOID)}, + "types": {uint32ToString(pgtype.BoolOID)}, "values": {"t"}, }, - "SELECT CASE WHEN FORMAT('%s', test_table.varchar_column) = 'varchar' THEN 1 ELSE 2 END AS test_case FROM test_table LIMIT 1": { + "SELECT CASE WHEN FORMAT('%s', postgres.test_table.varchar_column) = 'varchar' THEN 1 ELSE 2 END AS test_case FROM postgres.test_table LIMIT 1": { "description": {"test_case"}, - "types": {Uint32ToString(pgtype.Int4OID)}, + "types": {uint32ToString(pgtype.Int4OID)}, "values": {"1"}, }, }) @@ -1052,7 +1035,7 @@ func TestHandleQuery(t *testing.T) { testResponseByQuery(t, queryHandler, map[string]map[string][]string{ "SELECT gss_authenticated, encrypted FROM (SELECT false, false, false, false, false WHERE false) t(pid, gss_authenticated, principal, encrypted, credentials_delegated) WHERE pid = pg_backend_pid()": { "description": {"gss_authenticated", "encrypted"}, - "types": {Uint32ToString(pgtype.BoolOID), Uint32ToString(pgtype.BoolOID)}, + "types": {uint32ToString(pgtype.BoolOID), uint32ToString(pgtype.BoolOID)}, "values": {}, }, }) @@ -1060,9 +1043,9 @@ func TestHandleQuery(t *testing.T) { t.Run("WHERE with nested SELECT", func(t *testing.T) { testResponseByQuery(t, queryHandler, map[string]map[string][]string{ - "SELECT int2_column FROM test_table WHERE int2_column > 0 AND int2_column = (SELECT int2_column FROM test_table WHERE int2_column = 32767)": { + "SELECT int2_column FROM postgres.test_table WHERE int2_column > 0 AND int2_column = (SELECT int2_column FROM postgres.test_table WHERE int2_column = 32767)": { "description": {"int2_column"}, - "types": {Uint32ToString(pgtype.Int4OID)}, + "types": {uint32ToString(pgtype.Int4OID)}, "values": {"32767"}, }, }) @@ -1070,9 +1053,9 @@ func TestHandleQuery(t *testing.T) { t.Run("WHERE ANY(column reference)", func(t *testing.T) { testResponseByQuery(t, queryHandler, map[string]map[string][]string{ - "SELECT id FROM test_table WHERE id = ANY(id)": { // NOTE: ... = ANY() on non-constants is not fully supported yet + "SELECT id FROM postgres.test_table WHERE id = ANY(id)": { // NOTE: ... = ANY() on non-constants is not fully supported yet "description": {"id"}, - "types": {Uint32ToString(pgtype.Int4OID)}, + "types": {uint32ToString(pgtype.Int4OID)}, }, }) }) @@ -1081,8 +1064,8 @@ func TestHandleQuery(t *testing.T) { testResponseByQuery(t, queryHandler, map[string]map[string][]string{ "WITH RECURSIVE simple_cte AS (SELECT oid, rolname FROM pg_roles WHERE rolname = 'postgres' UNION ALL SELECT oid, rolname FROM pg_roles) SELECT * FROM simple_cte": { "description": {"oid", "rolname"}, - "types": {Uint32ToString(pgtype.OIDOID), Uint32ToString(pgtype.TextOID)}, - "values": {"10", "bemidb"}, + "types": {uint32ToString(pgtype.OIDOID), uint32ToString(pgtype.TextOID)}, + "values": {"10", "user"}, }, }) }) @@ -1091,12 +1074,12 @@ func TestHandleQuery(t *testing.T) { testResponseByQuery(t, queryHandler, map[string]map[string][]string{ "SELECT ARRAY(SELECT 1 FROM pg_enum ORDER BY enumsortorder) AS array": { "description": {"array"}, - "types": {Uint32ToString(pgtype.Int4ArrayOID)}, + "types": {uint32ToString(pgtype.Int4ArrayOID)}, "values": {"{}"}, }, - "SELECT test_table.id FROM public.test_table ORDER BY public.test_table.id DESC LIMIT 1": { + "SELECT postgres.test_table.id FROM postgres.test_table ORDER BY postgres.test_table.id DESC LIMIT 1": { "description": {"id"}, - "types": {Uint32ToString(pgtype.Int4OID)}, + "types": {uint32ToString(pgtype.Int4OID)}, "values": {"2"}, }, }) @@ -1104,9 +1087,9 @@ func TestHandleQuery(t *testing.T) { t.Run("GROUP BY", func(t *testing.T) { testResponseByQuery(t, queryHandler, map[string]map[string][]string{ - "SELECT MAX(id) AS max FROM public.test_table GROUP BY public.test_table.id LIMIT 1": { + "SELECT MAX(id) AS max FROM postgres.test_table GROUP BY postgres.test_table.id ORDER BY max LIMIT 1": { "description": {"max"}, - "types": {Uint32ToString(pgtype.Int4OID)}, + "types": {uint32ToString(pgtype.Int4OID)}, "values": {"1"}, }, }) @@ -1116,52 +1099,52 @@ func TestHandleQuery(t *testing.T) { testResponseByQuery(t, queryHandler, map[string]map[string][]string{ "SELECT pg_shadow.usename FROM pg_shadow": { "description": {"usename"}, - "types": {Uint32ToString(pgtype.TextOID)}, - "values": {"bemidb"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"user"}, }, "SELECT pg_roles.rolname FROM pg_roles": { "description": {"rolname"}, - "types": {Uint32ToString(pgtype.TextOID)}, - "values": {"bemidb"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"user"}, }, "SELECT pg_extension.extname FROM pg_extension": { "description": {"extname"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {"plpgsql"}, }, "SELECT pg_database.datname FROM pg_database": { "description": {"datname"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {"bemidb"}, }, "SELECT pg_inherits.inhrelid FROM pg_inherits": { "description": {"inhrelid"}, - "types": {Uint32ToString(pgtype.Int8OID)}, + "types": {uint32ToString(pgtype.Int8OID)}, "values": {}, }, "SELECT pg_shdescription.objoid FROM pg_shdescription": { "description": {"objoid"}, - "types": {Uint32ToString(pgtype.OIDOID)}, + "types": {uint32ToString(pgtype.OIDOID)}, "values": {}, }, "SELECT pg_statio_user_tables.relid FROM pg_statio_user_tables": { "description": {"relid"}, - "types": {Uint32ToString(pgtype.Int8OID)}, + "types": {uint32ToString(pgtype.Int8OID)}, "values": {}, }, "SELECT pg_replication_slots.slot_name FROM pg_replication_slots": { "description": {"slot_name"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {}, }, "SELECT pg_stat_gssapi.pid FROM pg_stat_gssapi": { "description": {"pid"}, - "types": {Uint32ToString(pgtype.Int4OID)}, + "types": {uint32ToString(pgtype.Int4OID)}, "values": {}, }, "SELECT pg_auth_members.oid FROM pg_auth_members": { "description": {"oid"}, - "types": {Uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.TextOID)}, "values": {}, }, }) @@ -1169,10 +1152,10 @@ func TestHandleQuery(t *testing.T) { t.Run("Sublink", func(t *testing.T) { testResponseByQuery(t, queryHandler, map[string]map[string][]string{ - "SELECT x.usename, (SELECT passwd FROM pg_shadow WHERE usename = x.usename) as password FROM pg_shadow x WHERE x.usename = 'bemidb'": { + "SELECT x.usename, (SELECT split_part(passwd, ':', 1) FROM pg_shadow WHERE usename = x.usename) as password FROM pg_shadow x WHERE x.usename = 'user'": { "description": {"usename", "password"}, - "types": {Uint32ToString(pgtype.TextOID), Uint32ToString(pgtype.TextOID)}, - "values": {"bemidb", "bemidb-encrypted"}, + "types": {uint32ToString(pgtype.TextOID), uint32ToString(pgtype.TextOID)}, + "values": {"user", "SCRAM-SHA-256$4096"}, }, }) }) @@ -1182,14 +1165,14 @@ func TestHandleQuery(t *testing.T) { "SELECT db.oid AS did, db.datname AS name, ta.spcname AS spcname, db.datallowconn, db.datistemplate AS is_template, pg_catalog.has_database_privilege(db.oid, 'CREATE') AS cancreate, datdba AS owner, descr.description FROM pg_catalog.pg_database db LEFT OUTER JOIN pg_catalog.pg_tablespace ta ON db.dattablespace = ta.oid LEFT OUTER JOIN pg_catalog.pg_shdescription descr ON (db.oid = descr.objoid AND descr.classoid = 'pg_database'::regclass) WHERE db.oid > 1145::OID OR db.datname IN ('postgres', 'edb') ORDER BY datname": { "description": {"did", "name", "spcname", "datallowconn", "is_template", "cancreate", "owner", "description"}, "types": { - Uint32ToString(pgtype.OIDOID), - Uint32ToString(pgtype.TextOID), - Uint32ToString(pgtype.TextOID), - Uint32ToString(pgtype.BoolOID), - Uint32ToString(pgtype.BoolOID), - Uint32ToString(pgtype.BoolOID), - Uint32ToString(pgtype.Int8OID), - Uint32ToString(pgtype.TextOID), + uint32ToString(pgtype.OIDOID), + uint32ToString(pgtype.TextOID), + uint32ToString(pgtype.TextOID), + uint32ToString(pgtype.BoolOID), + uint32ToString(pgtype.BoolOID), + uint32ToString(pgtype.BoolOID), + uint32ToString(pgtype.Int8OID), + uint32ToString(pgtype.TextOID), }, "values": {"16388", "bemidb", "", "t", "f", "t", "10", ""}, }, @@ -1205,7 +1188,8 @@ func TestHandleQuery(t *testing.T) { expectedErrorMessage := strings.Join([]string{ "Catalog Error: Table with name non_existent_table does not exist!", - "Did you mean \"test_table\"?", + "Did you mean \"pg_statio_user_tables\"?", + "", "LINE 1: SELECT * FROM non_existent_table", " ^", }, "\n") @@ -1235,7 +1219,7 @@ func TestHandleQuery(t *testing.T) { &pgproto3.DataRow{}, &pgproto3.CommandComplete{}, }) - testRowDescription(t, messages[0], []string{"timezone"}, []string{Uint32ToString(pgtype.TextOID)}) + testRowDescription(t, messages[0], []string{"timezone"}, []string{uint32ToString(pgtype.TextOID)}) testDataRowValues(t, messages[1], []string{"UTC"}) testCommandCompleteTag(t, messages[2], "SHOW") }) @@ -1314,7 +1298,6 @@ func TestHandleParseQuery(t *testing.T) { } func TestHandleBindQuery(t *testing.T) { - createTestTables(t) queryHandler := initQueryHandler() defer queryHandler.duckdb.Close() @@ -1324,7 +1307,7 @@ func TestHandleBindQuery(t *testing.T) { testNoError(t, err) bindMessage := &pgproto3.Bind{ - Parameters: [][]byte{[]byte("bemidb")}, + Parameters: [][]byte{[]byte("user")}, ParameterFormatCodes: []int16{0}, // Text format } messages, preparedStatement, err := queryHandler.HandleBindQuery(bindMessage, preparedStatement) @@ -1336,8 +1319,8 @@ func TestHandleBindQuery(t *testing.T) { if len(preparedStatement.Variables) != 1 { t.Errorf("Expected the prepared statement to have 1 variable, got %v", len(preparedStatement.Variables)) } - if preparedStatement.Variables[0] != "bemidb" { - t.Errorf("Expected the prepared statement variable to be 'bemidb', got %v", preparedStatement.Variables[0]) + if preparedStatement.Variables[0] != "user" { + t.Errorf("Expected the prepared statement variable to be 'user', got %v", preparedStatement.Variables[0]) } }) @@ -1396,7 +1379,7 @@ func TestHandleBindQuery(t *testing.T) { }) t.Run("Handles BIND extended query step with binary format 16-byte (uuid) parameter", func(t *testing.T) { - parseMessage := &pgproto3.Parse{Query: "SELECT uuid_column FROM public.test_table WHERE uuid_column = $1"} + parseMessage := &pgproto3.Parse{Query: "SELECT uuid_column FROM postgres.test_table WHERE uuid_column = $1"} _, preparedStatement, err := queryHandler.HandleParseQuery(parseMessage) testNoError(t, err) @@ -1430,7 +1413,7 @@ func TestHandleDescribeQuery(t *testing.T) { query := "SELECT usename, passwd FROM pg_shadow WHERE usename=$1" parseMessage := &pgproto3.Parse{Query: query} _, preparedStatement, _ := queryHandler.HandleParseQuery(parseMessage) - bindMessage := &pgproto3.Bind{Parameters: [][]byte{[]byte("bemidb")}} + bindMessage := &pgproto3.Bind{Parameters: [][]byte{[]byte("user")}} _, preparedStatement, _ = queryHandler.HandleBindQuery(bindMessage, preparedStatement) message := &pgproto3.Describe{ObjectType: 'P'} @@ -1440,7 +1423,7 @@ func TestHandleDescribeQuery(t *testing.T) { testMessageTypes(t, messages, []pgproto3.Message{ &pgproto3.RowDescription{}, }) - testRowDescription(t, messages[0], []string{"usename", "passwd"}, []string{Uint32ToString(pgtype.TextOID), Uint32ToString(pgtype.TextOID)}) + testRowDescription(t, messages[0], []string{"usename", "passwd"}, []string{uint32ToString(pgtype.TextOID), uint32ToString(pgtype.TextOID)}) if preparedStatement.Rows == nil { t.Errorf("Expected the prepared statement to have rows") } @@ -1481,10 +1464,10 @@ func TestHandleExecuteQuery(t *testing.T) { defer queryHandler.duckdb.Close() t.Run("Handles EXECUTE extended query step", func(t *testing.T) { - query := "SELECT usename, passwd FROM pg_shadow WHERE usename=$1" + query := "SELECT usename, split_part(passwd, ':', 1) FROM pg_shadow WHERE usename=$1" parseMessage := &pgproto3.Parse{Query: query} _, preparedStatement, _ := queryHandler.HandleParseQuery(parseMessage) - bindMessage := &pgproto3.Bind{Parameters: [][]byte{[]byte("bemidb")}} + bindMessage := &pgproto3.Bind{Parameters: [][]byte{[]byte("user")}} _, preparedStatement, _ = queryHandler.HandleBindQuery(bindMessage, preparedStatement) describeMessage := &pgproto3.Describe{ObjectType: 'P'} _, preparedStatement, _ = queryHandler.HandleDescribeQuery(describeMessage, preparedStatement) @@ -1497,7 +1480,7 @@ func TestHandleExecuteQuery(t *testing.T) { &pgproto3.DataRow{}, &pgproto3.CommandComplete{}, }) - testDataRowValues(t, messages[0], []string{"bemidb", "bemidb-encrypted"}) + testDataRowValues(t, messages[0], []string{"user", "SCRAM-SHA-256$4096"}) }) t.Run("Handles EXECUTE extended query step if query is empty", func(t *testing.T) { @@ -1542,7 +1525,7 @@ SET standard_conforming_strings = on;` t.Run("Handles mixed SET and SELECT statements", func(t *testing.T) { query := `SET client_encoding TO 'UTF8'; -SELECT passwd FROM pg_shadow WHERE usename='bemidb';` +SELECT split_part(passwd, ':', 1) FROM pg_shadow WHERE usename='user';` messages, err := queryHandler.HandleSimpleQuery(query) @@ -1554,13 +1537,13 @@ SELECT passwd FROM pg_shadow WHERE usename='bemidb';` &pgproto3.CommandComplete{}, }) testCommandCompleteTag(t, messages[0], "SET") - testDataRowValues(t, messages[2], []string{"bemidb-encrypted"}) + testDataRowValues(t, messages[2], []string{"SCRAM-SHA-256$4096"}) testCommandCompleteTag(t, messages[3], "SELECT 1") }) t.Run("Handles multiple SELECT statements", func(t *testing.T) { query := `SELECT 1; -SELECT passwd FROM pg_shadow WHERE usename='bemidb';` +SELECT split_part(passwd, ':', 1) FROM pg_shadow WHERE usename='user';` messages, err := queryHandler.HandleSimpleQuery(query) @@ -1575,7 +1558,7 @@ SELECT passwd FROM pg_shadow WHERE usename='bemidb';` }) testDataRowValues(t, messages[1], []string{"1"}) testCommandCompleteTag(t, messages[2], "SELECT 1") - testDataRowValues(t, messages[4], []string{"bemidb-encrypted"}) + testDataRowValues(t, messages[4], []string{"SCRAM-SHA-256$4096"}) testCommandCompleteTag(t, messages[5], "SELECT 1") }) @@ -1600,53 +1583,23 @@ SET standard_conforming_strings = on;` func initQueryHandler() *QueryHandler { config := loadTestConfig() duckdb := NewDuckdb(config, true) - icebergReader := NewIcebergReader(config) - duckdb.ExecFile(icebergReader.InternalStartSqlFile()) + catalog := NewIcebergCatalog(config) + icebergReader := NewIcebergReader(config, catalog) return NewQueryHandler(config, duckdb, icebergReader) } -func createTestTables(t *testing.T) { - config := loadTestConfig() +func loadTestConfig() *Config { + setTestArgs([]string{}) - createTestTable(config, IcebergSchemaTable{Schema: "public", Table: "test_table"}, PUBLIC_SCHEMA_TEST_TABLE_PG_SCHEMA_COLUMNS, PUBLIC_SCHEMA_TEST_TABLE_LOADED_ROWS) - createTestTable(config, IcebergSchemaTable{Schema: "public", Table: "partitioned_table1"}, PUBLIC_SCHEMA_PARTITIONED_TABLE_PG_SCHEMA_COLUMNS, PUBLIC_SCHEMA_PARTITIONED_TABLE1_LOADED_ROWS) - createTestTable(config, IcebergSchemaTable{Schema: "public", Table: "partitioned_table2"}, PUBLIC_SCHEMA_PARTITIONED_TABLE_PG_SCHEMA_COLUMNS, PUBLIC_SCHEMA_PARTITIONED_TABLE2_LOADED_ROWS) - createTestTable(config, IcebergSchemaTable{Schema: "public", Table: "partitioned_table3"}, PUBLIC_SCHEMA_PARTITIONED_TABLE_PG_SCHEMA_COLUMNS, PUBLIC_SCHEMA_PARTITIONED_TABLE3_LOADED_ROWS) - createTestTable(config, IcebergSchemaTable{Schema: "test", Table: "empty_table"}, TEST_SCHEMA_EMPTY_TABLE_PG_SCHEMA_COLUMNS, TEST_SCHEMA_EMPTY_TABLE_LOADED_ROWS) - - syncer := NewSyncer(config) - syncer.WriteInternalStartSqlFile([]PgSchemaTable{ - {Schema: "public", Table: "test_table"}, - {Schema: "public", Table: "partitioned_table1", ParentPartitionedTable: "partitioned_table"}, - {Schema: "public", Table: "partitioned_table2", ParentPartitionedTable: "partitioned_table"}, - {Schema: "public", Table: "partitioned_table3", ParentPartitionedTable: "partitioned_table"}, - {Schema: "test", Table: "empty_table"}, - }) + _config.DisableAnonymousAnalytics = true - t.Cleanup(func() { - syncer.icebergWriter.DeleteSchema("public") - syncer.icebergWriter.DeleteSchema("test") - syncer.icebergWriter.WriteInternalStartSqlFile([]string{}) - }) + return LoadConfig() } -func createTestTable(config *Config, icebergSchemaTable IcebergSchemaTable, pgSchemaColumns []PgSchemaColumn, rows [][]string) StorageInterface { - xmin := uint32(0) - internalTableMetadata := InternalTableMetadata{LastSyncedAt: 1744813713, LastRefreshMode: RefreshModeFull, MaxXmin: &xmin} - icebergTableWriter := NewIcebergWriterTable(config, icebergSchemaTable, pgSchemaColumns, 777, MAX_PARQUET_PAYLOAD_THRESHOLD, false) - i := 0 - icebergTableWriter.Write( - func() ([][]string, InternalTableMetadata) { - if i > 0 { - return [][]string{}, internalTableMetadata - } - - i++ - return rows, internalTableMetadata - }, - ) - - return icebergTableWriter.storage +func setTestArgs(args []string) { + os.Args = append([]string{"cmd"}, args...) + flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ExitOnError) + registerFlags() } func testNoError(t *testing.T, err error) { @@ -1681,8 +1634,8 @@ func testRowDescription(t *testing.T, rowDescriptionMessage pgproto3.Message, ex } for i, expectedColumnType := range expectedColumnTypes { - if Uint32ToString(rowDescription.Fields[i].DataTypeOID) != expectedColumnType { - t.Errorf("Expected the %v row description field data type to be %v, got %v", i, expectedColumnType, Uint32ToString(rowDescription.Fields[i].DataTypeOID)) + if uint32ToString(rowDescription.Fields[i].DataTypeOID) != expectedColumnType { + t.Errorf("Expected the %v row description field data type to be %v, got %v", i, expectedColumnType, uint32ToString(rowDescription.Fields[i].DataTypeOID)) } } } @@ -1732,3 +1685,7 @@ func testResponseByQuery(t *testing.T, queryHandler *QueryHandler, responseByQue }) } } + +func uint32ToString(i uint32) string { + return strconv.FormatUint(uint64(i), 10) +} diff --git a/src/query_remapper.go b/src/server/query_remapper.go similarity index 99% rename from src/query_remapper.go rename to src/server/query_remapper.go index 0257d17..32a229a 100644 --- a/src/query_remapper.go +++ b/src/server/query_remapper.go @@ -8,11 +8,11 @@ import ( pgQuery "github.com/pganalyze/pg_query_go/v5" ) -var SUPPORTED_SET_STATEMENTS = NewSet([]string{ +var SUPPORTED_SET_STATEMENTS = NewSet[string]().AddAll([]string{ "timezone", // SET SESSION timezone TO 'UTC' }) -var KNOWN_SET_STATEMENTS = NewSet([]string{ +var KNOWN_SET_STATEMENTS = NewSet[string]().AddAll([]string{ "client_encoding", // SET client_encoding TO 'UTF8' "client_min_messages", // SET client_min_messages TO 'warning' "standard_conforming_strings", // SET standard_conforming_strings = on diff --git a/src/query_remapper_expression.go b/src/server/query_remapper_expression.go similarity index 84% rename from src/query_remapper_expression.go rename to src/server/query_remapper_expression.go index 50049f0..85208b9 100644 --- a/src/query_remapper_expression.go +++ b/src/server/query_remapper_expression.go @@ -27,6 +27,7 @@ func (remapper *QueryRemapperExpression) RemappedExpression(node *pgQuery.Node) node = remapper.remappedTypeCast(node) node = remapper.remappedArithmeticExpression(node) node = remapper.remappedCollateClause(node) + node = remapper.remappedNullColumnExpression(node) remapper.remapColumnReference(node) return node @@ -91,6 +92,24 @@ func (remapper *QueryRemapperExpression) remappedArithmeticExpression(node *pgQu return node } +// DuckDB v2 doesn't return results with "WHERE [column] IS NOT NULL" +// * [column] IS NOT NULL -> NOT [column] IS NULL +// * [column] IS NULL -> NOT [column] IS NOT NULL +func (remapper *QueryRemapperExpression) remappedNullColumnExpression(node *pgQuery.Node) *pgQuery.Node { + nullTest := node.GetNullTest() + if nullTest == nil || nullTest.Arg == nil || nullTest.Arg.GetColumnRef() == nil { + return node + } + + if nullTest.Nulltesttype == pgQuery.NullTestType_IS_NOT_NULL { + nullTest.Nulltesttype = pgQuery.NullTestType_IS_NULL + } else if nullTest.Nulltesttype == pgQuery.NullTestType_IS_NULL { + nullTest.Nulltesttype = pgQuery.NullTestType_IS_NOT_NULL + } + + return remapper.parserColumnRef.NotBooleanExpression(node) +} + // public.table.column -> table.column // schema.table.column -> schema_table.column func (remapper *QueryRemapperExpression) remapColumnReference(node *pgQuery.Node) { diff --git a/src/query_remapper_function.go b/src/server/query_remapper_function.go similarity index 84% rename from src/query_remapper_function.go rename to src/server/query_remapper_function.go index 76f64e0..4d528dd 100644 --- a/src/query_remapper_function.go +++ b/src/server/query_remapper_function.go @@ -2,15 +2,10 @@ package main import ( "regexp" - "strings" pgQuery "github.com/pganalyze/pg_query_go/v5" ) -const ( - BEMIDB_FUNCTION_LAST_SYNCED_AT = "bemidb_last_synced_at" -) - var PG_CATALOG_MACRO_FUNCTION_NAMES = Set[string]{} var PG_INFORMATION_SCHEMA_MACRO_FUNCTION_NAMES = Set[string]{} @@ -25,7 +20,7 @@ func CreatePgCatalogMacroQueries(config *Config) []string { "CREATE MACRO pg_get_function_identity_arguments(func_oid) AS ''", "CREATE MACRO pg_get_indexdef(index_oid) AS '', (index_oid, column_int) AS '', (index_oid, column_int, pretty_bool) AS ''", "CREATE MACRO pg_get_partkeydef(table_oid) AS ''", - "CREATE MACRO pg_get_userbyid(role_id) AS 'bemidb'", + "CREATE MACRO pg_get_userbyid(role_id) AS '" + config.User + "'", "CREATE MACRO pg_get_viewdef(view_oid) AS pg_catalog.pg_get_viewdef(view_oid), (view_oid, pretty_bool) AS pg_catalog.pg_get_viewdef(view_oid)", "CREATE MACRO pg_indexes_size(regclass) AS 0", "CREATE MACRO pg_is_in_recovery() AS false", @@ -94,7 +89,7 @@ func CreateInformationSchemaMacroQueries(config *Config) []string { return result } -var BUILTIN_DUCKDB_PG_FUNCTION_NAMES = NewSet([]string{ +var BUILTIN_DUCKDB_PG_FUNCTION_NAMES = NewSet[string]().AddAll([]string{ "array_to_string", "generate_series", }) @@ -150,30 +145,6 @@ func (remapper *QueryRemapperFunction) RemapFunctionCall(functionCall *pgQuery.F case schemaFunction.Function == PG_FUNCTION_ENCODE: remapper.parserFunction.RemoveEncode(functionCall) return schemaFunction - - // bemidb_last_synced_at('schema.table') -> to_timestamp(internalTableMetadata.LastSyncedAt) - case schemaFunction.Function == BEMIDB_FUNCTION_LAST_SYNCED_AT: - schemaTableName := remapper.parserFunction.FirstArgumentToString(functionCall) - schemaTableParts := strings.Split(schemaTableName, ".") - var pgSchemaTable PgSchemaTable - if len(schemaTableParts) == 2 { - pgSchemaTable.Schema = schemaTableParts[0] - pgSchemaTable.Table = schemaTableParts[1] - } else { - pgSchemaTable.Schema = PG_SCHEMA_PUBLIC - pgSchemaTable.Table = schemaTableParts[0] - } - - internalTableMetadata, err := remapper.icebergReader.InternalTableMetadata(pgSchemaTable) - - if err != nil { - LogError(remapper.config, "Failed to get internal table metadata for %s: %v", pgSchemaTable, err) - remapper.parserFunction.RemapToTimestamp(functionCall, 0) - } else { - remapper.parserFunction.RemapToTimestamp(functionCall, internalTableMetadata.LastSyncedAt) - } - - return schemaFunction } return nil diff --git a/src/query_remapper_select.go b/src/server/query_remapper_select.go similarity index 100% rename from src/query_remapper_select.go rename to src/server/query_remapper_select.go diff --git a/src/query_remapper_show.go b/src/server/query_remapper_show.go similarity index 100% rename from src/query_remapper_show.go rename to src/server/query_remapper_show.go diff --git a/src/query_remapper_table.go b/src/server/query_remapper_table.go similarity index 98% rename from src/query_remapper_table.go rename to src/server/query_remapper_table.go index 3e73d58..b55bb8a 100644 --- a/src/query_remapper_table.go +++ b/src/server/query_remapper_table.go @@ -167,8 +167,8 @@ func (remapper *QueryRemapperTable) RemapTable(node *pgQuery.Node) *pgQuery.Node return node } - // public.table -> FROM iceberg_scan('path', skip_schema_inference = true) table - // schema.table -> FROM iceberg_scan('path', skip_schema_inference = true) schema_table + // public.table -> FROM iceberg_scan('path') table + // schema.table -> FROM iceberg_scan('path') schema_table schemaTable := qSchemaTable.ToIcebergSchemaTable() if !remapper.icebergSchemaTables.Contains(schemaTable) { // Reload Iceberg tables if not found remapper.reloadIceberSchemaTables() diff --git a/src/server/response_handler.go b/src/server/response_handler.go new file mode 100644 index 0000000..86ba0cc --- /dev/null +++ b/src/server/response_handler.go @@ -0,0 +1,367 @@ +package main + +import ( + "bytes" + "database/sql" + "encoding/csv" + "encoding/json" + "fmt" + "strings" + + "github.com/jackc/pgx/v5/pgtype" + duckDb "github.com/marcboeker/go-duckdb/v2" +) + +type ResponseHandler struct { + Config *Config +} + +func NewResponseHandler(config *Config) *ResponseHandler { + return &ResponseHandler{ + Config: config, + } +} + +// https://pkg.go.dev/github.com/jackc/pgx/v5/pgtype#pkg-constants +func (responseHandler *ResponseHandler) ColumnDescriptionTypeOid(col *sql.ColumnType) uint32 { + switch col.DatabaseTypeName() { + case "BOOLEAN": + return pgtype.BoolOID + case "BOOLEAN[]": + return pgtype.BoolArrayOID + case "SMALLINT": + return pgtype.Int2OID + case "SMALLINT[]": + return pgtype.Int2ArrayOID + case "INTEGER": + return pgtype.Int4OID + case "INTEGER[]": + return pgtype.Int4ArrayOID + case "UINTEGER": + return pgtype.XIDOID + case "UINTEGER[]": + return pgtype.XIDArrayOID + case "BIGINT": + if responseHandler.isSystemTableOidColumn(col.Name()) { + return pgtype.OIDOID + } + return pgtype.Int8OID + case "BIGINT[]": + return pgtype.Int8ArrayOID + case "UBIGINT": + return pgtype.XID8OID + case "UBIGINT[]": + return pgtype.XID8ArrayOID + case "HUGEINT": + return pgtype.NumericOID + case "HUGEINT[]": + return pgtype.NumericArrayOID + case "FLOAT": + return pgtype.Float4OID + case "FLOAT[]": + return pgtype.Float4ArrayOID + case "DOUBLE": + return pgtype.Float8OID + case "DOUBLE[]": + return pgtype.Float8ArrayOID + case "VARCHAR": + return pgtype.TextOID + case "VARCHAR[]": + return pgtype.TextArrayOID + case "TIME": + return pgtype.TimeOID + case "TIME[]": + return pgtype.TimeArrayOID + case "DATE": + return pgtype.DateOID + case "DATE[]": + return pgtype.DateArrayOID + case "TIMESTAMP": + return pgtype.TimestampOID + case "TIMESTAMP[]": + return pgtype.TimestampArrayOID + case "TIMESTAMPTZ": + return pgtype.TimestamptzOID + case "TIMESTAMPTZ[]": + return pgtype.TimestamptzArrayOID + case "UUID": + return pgtype.UUIDOID + case "UUID[]": + return pgtype.UUIDArrayOID + case "INTERVAL": + return pgtype.IntervalOID + case "INTERVAL[]": + return pgtype.IntervalArrayOID + case "BLOB": + return pgtype.ByteaOID + case "JSON": + return pgtype.JSONOID + } + + if strings.HasPrefix(col.DatabaseTypeName(), "DECIMAL") { + if strings.HasSuffix(col.DatabaseTypeName(), "[]") { + return pgtype.NumericArrayOID + } else { + return pgtype.NumericOID + } + } + + Panic(responseHandler.Config, "Unsupported serialized column type: "+col.DatabaseTypeName()) + return 0 +} + +func (responseHandler *ResponseHandler) RowValuePointer(col *sql.ColumnType) interface{} { + switch col.ScanType().String() { + case "int16": + return new(sql.NullInt16) + case "int32": // ints, xid + return new(sql.NullInt32) + case "int64", "*big.Int": + return new(sql.NullInt64) + case "float64", "float32": + return new(sql.NullFloat64) + case "string": + // return a *sql.NullString so Scan writes into the right type + return new(sql.NullString) + case "[]uint8": // uuid, bytea + return new(sql.NullString) + case "bool": + return new(sql.NullBool) + case "time.Time": + return new(sql.NullTime) + case "duckdb.Decimal": // xid8 + return new(NullDecimal) + case "duckdb.Interval": + return new(NullInterval) + case "interface {}": // json, jsonb + return new(NullJson) + case "[]interface {}": + return new(NullArray) + } + + Panic(responseHandler.Config, "Unsupported data row type: "+col.ScanType().String()) + return nil +} + +func (responseHandler *ResponseHandler) RowValueBytes(valuePtr interface{}, col *sql.ColumnType) []byte { + switch value := valuePtr.(type) { + case *sql.NullInt16: + if value.Valid { + return []byte(IntToString(int(value.Int16))) + } else { + return nil + } + case *sql.NullInt32: + if value.Valid { + return []byte(IntToString(int(value.Int32))) + } else { + return nil + } + case *sql.NullInt64: + if value.Valid { + return []byte(IntToString(int(value.Int64))) + } else { + return nil + } + case *sql.NullFloat64: + if value.Valid { + return []byte(fmt.Sprintf("%v", value.Float64)) + } else { + return nil + } + case *sql.NullString: + if value.Valid { + return []byte(value.String) + } else { + return nil + } + case *sql.NullBool: + if value.Valid { + return []byte(fmt.Sprintf("%v", value.Bool)[0:1]) + } else { + return nil + } + case *sql.NullTime: + if value.Valid { + switch col.DatabaseTypeName() { + case "DATE": + return []byte(value.Time.Format("2006-01-02")) + case "TIME": + return []byte(value.Time.Format("15:04:05.999999")) + case "TIMESTAMP": + return []byte(value.Time.Format("2006-01-02 15:04:05.999999")) + case "TIMESTAMPTZ": + return []byte(value.Time.Format("2006-01-02 15:04:05.999999-07:00")) + default: + Panic(responseHandler.Config, "Unsupported scanned time type: "+col.DatabaseTypeName()) + } + } else { + return nil + } + case *NullDecimal: + if value.Present { + return []byte(value.String()) + } else { + return nil + } + case *NullInterval: + if value.Present { + return []byte(value.String()) + } else { + return nil + } + case *NullJson: + if value.Present { + return []byte(value.String()) + } else { + return nil + } + case *NullArray: + if value.Present { + return []byte(value.String()) + } else { + return nil + } + case *string: + return []byte(*value) + } + + Panic(responseHandler.Config, "Unsupported scanned row type: "+col.ScanType().Name()) + return nil +} + +func (responseHandler *ResponseHandler) isSystemTableOidColumn(colName string) bool { + oidColumns := map[string]bool{ + "oid": true, + "tableoid": true, + "relnamespace": true, + "relowner": true, + "relfilenode": true, + "did": true, + "objoid": true, + "classoid": true, + } + + return oidColumns[colName] +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +type NullDecimal struct { + Present bool + Value duckDb.Decimal +} + +func (nullDecimal *NullDecimal) Scan(value interface{}) error { + if value == nil { + nullDecimal.Present = false + return nil + } + + nullDecimal.Present = true + nullDecimal.Value = value.(duckDb.Decimal) + return nil +} + +func (nullDecimal NullDecimal) String() string { + if nullDecimal.Present { + return fmt.Sprintf("%v", nullDecimal.Value.Float64()) + } + return "" +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +type NullInterval struct { + Present bool + Value duckDb.Interval +} + +func (nullInterval *NullInterval) Scan(value interface{}) error { + if value == nil { + nullInterval.Present = false + return nil + } + + nullInterval.Present = true + nullInterval.Value = value.(duckDb.Interval) + return nil +} + +func (nullInterval NullInterval) String() string { + if nullInterval.Present { + return fmt.Sprintf("%d months %d days %d microseconds", nullInterval.Value.Months, nullInterval.Value.Days, nullInterval.Value.Micros) + } + return "" +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +type NullJson struct { + Present bool + Value interface{} +} + +func (nullJson *NullJson) Scan(value interface{}) error { + if value == nil { + nullJson.Present = false + return nil + } + nullJson.Present = true + nullJson.Value = value + return nil +} + +func (nullJson NullJson) String() string { + if nullJson.Present { + // Serialize the JSON value to a string with marshaling + jsonBytes, err := json.Marshal(nullJson.Value) + if err != nil { + return "" + } + return string(jsonBytes) + } + + return "" +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +type NullArray struct { + Present bool + Value []interface{} +} + +func (nullArray *NullArray) Scan(value interface{}) error { + if value == nil { + nullArray.Present = false + return nil + } + + nullArray.Present = true + nullArray.Value = value.([]interface{}) + return nil +} + +func (nullArray NullArray) String() string { + if nullArray.Present { + var stringVals []string + for _, v := range nullArray.Value { + switch v.(type) { + case []uint8: + stringVals = append(stringVals, fmt.Sprintf("%s", v)) + default: + stringVals = append(stringVals, fmt.Sprintf("%v", v)) + } + } + buffer := &bytes.Buffer{} + csvWriter := csv.NewWriter(buffer) + err := csvWriter.Write(stringVals) + if err != nil { + return "" + } + csvWriter.Flush() + return "{" + strings.TrimRight(buffer.String(), "\n") + "}" + } + return "" +} diff --git a/src/server/storage_s3.go b/src/server/storage_s3.go new file mode 100644 index 0000000..a57908e --- /dev/null +++ b/src/server/storage_s3.go @@ -0,0 +1,127 @@ +package main + +import ( + "context" + "encoding/json" + "io" + "reflect" + "strings" + + "github.com/aws/aws-sdk-go-v2/aws" + awsConfig "github.com/aws/aws-sdk-go-v2/config" + "github.com/aws/aws-sdk-go-v2/credentials" + "github.com/aws/aws-sdk-go-v2/service/s3" +) + +type MetadataJson struct { + Schemas []struct { + Fields []struct { + ID int `json:"id"` + Name string `json:"name"` + Type interface{} `json:"type"` + Required bool `json:"required"` + } `json:"fields"` + } `json:"schemas"` +} + +type StorageS3 struct { + s3Client *s3.Client + config *Config +} + +func NewS3Storage(config *Config) *StorageS3 { + var awsConfigOptions = []func(*awsConfig.LoadOptions) error{ + awsConfig.WithRegion(config.Aws.Region), + } + + if config.LogLevel == LOG_LEVEL_TRACE { + awsConfigOptions = append(awsConfigOptions, awsConfig.WithClientLogMode(aws.LogRequest)) + } + + if IsLocalHost(config.Aws.S3Endpoint) { + awsConfigOptions = append(awsConfigOptions, awsConfig.WithBaseEndpoint("http://"+config.Aws.S3Endpoint)) + } else { + awsConfigOptions = append(awsConfigOptions, awsConfig.WithBaseEndpoint("https://"+config.Aws.S3Endpoint)) + } + + awsCredentials := credentials.NewStaticCredentialsProvider( + config.Aws.AccessKeyId, + config.Aws.SecretAccessKey, + "", + ) + awsConfigOptions = append(awsConfigOptions, awsConfig.WithCredentialsProvider(awsCredentials)) + + loadedAwsConfig, err := awsConfig.LoadDefaultConfig(context.Background(), awsConfigOptions...) + PanicIfError(config, err) + + s3Client := s3.NewFromConfig(loadedAwsConfig, func(o *s3.Options) { + if config.Aws.S3Endpoint != DEFAULT_AWS_S3_ENDPOINT { + o.UsePathStyle = true + } + }) + + return &StorageS3{ + s3Client: s3Client, + config: config, + } +} + +func (storage *StorageS3) IcebergTableFields(metadataPath string) ([]IcebergTableField, error) { + metadataKey := strings.TrimPrefix(metadataPath, "s3://"+storage.config.Aws.S3Bucket+"/") + metadataContent, err := storage.readFileContent(metadataKey) + if err != nil { + return nil, err + } + + return storage.parseIcebergTableFields(metadataContent) +} + +func (storage *StorageS3) readFileContent(fileKey string) ([]byte, error) { + ctx := context.Background() + getObjectResponse, err := storage.s3Client.GetObject(ctx, &s3.GetObjectInput{ + Bucket: aws.String(storage.config.Aws.S3Bucket), + Key: aws.String(fileKey), + }) + if err != nil { + return nil, err + } + + fileContent, err := io.ReadAll(getObjectResponse.Body) + if err != nil { + return nil, err + } + + return fileContent, nil +} + +func (storage *StorageS3) parseIcebergTableFields(metadataContent []byte) ([]IcebergTableField, error) { + var metadataJson MetadataJson + err := json.Unmarshal(metadataContent, &metadataJson) + if err != nil { + return nil, err + } + + var icebergTableFields []IcebergTableField + schema := metadataJson.Schemas[len(metadataJson.Schemas)-1] // Get the last schema + if schema.Fields != nil { + for _, field := range schema.Fields { + icebergTableField := IcebergTableField{ + Name: field.Name, + } + + if reflect.TypeOf(field.Type).Kind() == reflect.String { + icebergTableField.Type = field.Type.(string) + icebergTableField.Required = field.Required + } else { + listType := field.Type.(map[string]interface{}) + icebergTableField.Type = listType["element"].(string) + icebergTableField.Required = listType["element-required"].(bool) + icebergTableField.IsList = true + } + + icebergTableFields = append(icebergTableFields, icebergTableField) + } + } + + return icebergTableFields, nil +} diff --git a/src/server/utils.go b/src/server/utils.go new file mode 100644 index 0000000..b77a4df --- /dev/null +++ b/src/server/utils.go @@ -0,0 +1,70 @@ +package main + +import ( + "crypto/hmac" + "crypto/rand" + "crypto/sha256" + "encoding/base64" + "fmt" + "strconv" + "strings" + "unicode" + + "golang.org/x/crypto/pbkdf2" +) + +func IntToString(i int) string { + return strconv.Itoa(i) +} + +func StringToScramSha256(password string) string { + saltLength := 16 + digestLength := 32 + iterations := 4096 + clientKey := []byte("Client Key") + serverKey := []byte("Server Key") + + salt := make([]byte, saltLength) + _, err := rand.Read(salt) + if err != nil { + return "" + } + + digestKey := pbkdf2.Key([]byte(password), salt, iterations, digestLength, sha256.New) + clientKeyHash := hmacSha256Hash(digestKey, clientKey) + serverKeyHash := hmacSha256Hash(digestKey, serverKey) + storedKeyHash := sha256Hash(clientKeyHash) + + return fmt.Sprintf( + "SCRAM-SHA-256$%d:%s$%s:%s", + iterations, + base64.StdEncoding.EncodeToString(salt), + base64.StdEncoding.EncodeToString(storedKeyHash), + base64.StdEncoding.EncodeToString(serverKeyHash), + ) +} + +func StringContainsUpper(str string) bool { + for _, char := range str { + if unicode.IsUpper(char) { + return true + } + } + return false +} + +func IsLocalHost(host string) bool { + return strings.HasPrefix(host, "127.0.0.1") || strings.HasPrefix(host, "localhost") +} + +func hmacSha256Hash(key []byte, message []byte) []byte { + hash := hmac.New(sha256.New, key) + hash.Write(message) + return hash.Sum(nil) +} + +func sha256Hash(data []byte) []byte { + hash := sha256.New() + hash.Write(data) + return hash.Sum(nil) +} diff --git a/src/storage_interface.go b/src/storage_interface.go deleted file mode 100644 index 0da6023..0000000 --- a/src/storage_interface.go +++ /dev/null @@ -1,145 +0,0 @@ -package main - -import ( - "fmt" - "io" -) - -type RefreshMode string - -const ( - RefreshModeFull RefreshMode = "FULL" - RefreshModeFullInProgress RefreshMode = "FULL_IN_PROGRESS" - RefreshModeIncremental RefreshMode = "INCREMENTAL" - RefreshModeIncrementalInProgress RefreshMode = "INCREMENTAL_IN_PROGRESS" - - INTERNAL_START_SQL_FILE_NAME = "bemidb-start.sql" -) - -type ParquetFileStats struct { - ColumnSizes map[int]int64 - ValueCounts map[int]int64 - NullValueCounts map[int]int64 - LowerBounds map[int][]byte - UpperBounds map[int][]byte - SplitOffsets []int64 -} - -type ParquetFile struct { - Uuid string - Path string - Size int64 - RecordCount int64 - Stats ParquetFileStats -} - -type ManifestFile struct { - RecordsDeleted bool - SnapshotId int64 - Path string - Size int64 - RecordCount int64 - DataFileSize int64 -} - -type ManifestListItem struct { - SequenceNumber int - ManifestFile ManifestFile -} - -type ManifestListFile struct { - SequenceNumber int - SnapshotId int64 - TimestampMs int64 - Path string - Operation string - AddedFilesSize int64 - AddedDataFiles int64 - AddedRecords int64 - RemovedFilesSize int64 - DeletedDataFiles int64 - DeletedRecords int64 -} - -type MetadataFile struct { - Version int64 - Path string -} - -type InternalTableMetadata struct { - LastRefreshMode RefreshMode `json:"last-refresh-mode"` - LastSyncedAt int64 `json:"last-synced-at"` - LastTxid int64 `json:"last-txid"` - MaxXmin *uint32 `json:"max-xmin"` -} - -func (internalTableMetadata InternalTableMetadata) IsInProgress() bool { - return internalTableMetadata.LastRefreshMode == RefreshModeIncrementalInProgress || internalTableMetadata.LastRefreshMode == RefreshModeFullInProgress -} - -func (internalTableMetadata InternalTableMetadata) MaxXminString() string { - if internalTableMetadata.MaxXmin == nil { - panic("MaxXmin is unexpectedly null. " + internalTableMetadata.String()) - } - return Uint32ToString(*internalTableMetadata.MaxXmin) -} - -func (internalTableMetadata InternalTableMetadata) LastWrappedAroundTxidString() string { - return Int64ToString(PgWraparoundTxid(internalTableMetadata.LastTxid)) -} - -func (internalTableMetadata InternalTableMetadata) String() string { - maxXmin := "null" - if internalTableMetadata.MaxXmin != nil { - maxXmin = Uint32ToString(*internalTableMetadata.MaxXmin) - } - - return fmt.Sprintf( - "LastRefreshMode: %s, LastSyncedAt: %d, MaxXmin: %s", - internalTableMetadata.LastRefreshMode, - internalTableMetadata.LastSyncedAt, - maxXmin, - ) -} - -type StorageInterface interface { - // Read - IcebergSchemas() (icebergSchemas []string, err error) - IcebergSchemaTables() (icebersSchemaTables Set[IcebergSchemaTable], err error) - IcebergMetadataFilePath(icebergSchemaTable IcebergSchemaTable) (path string) - IcebergTableFields(icebergSchemaTable IcebergSchemaTable) (icebergTableFields []IcebergTableField, err error) - ExistingManifestListFiles(metadataDirPath string) (manifestListFilesSortedAsc []ManifestListFile, err error) - ExistingManifestListItems(manifestListFile ManifestListFile) (manifestListItemsSortedDesc []ManifestListItem, err error) - ExistingParquetFilePath(manifestFile ManifestFile) (parquetFilePath string, err error) - - // Write - DeleteSchema(schema string) (err error) - DeleteSchemaTable(schemaTable IcebergSchemaTable) (err error) - CreateDataDir(schemaTable IcebergSchemaTable) (dataDirPath string) - CreateMetadataDir(schemaTable IcebergSchemaTable) (metadataDirPath string) - CreateParquet(dataDirPath string, pgSchemaColumns []PgSchemaColumn, maxPayloadThreshold int, loadRows func() ([][]string, InternalTableMetadata)) (parquetFile ParquetFile, internalTableMetadata InternalTableMetadata, err error) - CreateOverwrittenParquet(dataDirPath string, existingParquetFilePath string, newParquetFilePath string, pgSchemaColumns []PgSchemaColumn, dynamicRowCountPerBatch int) (overwrittenParquetFile ParquetFile, err error) - DeleteParquet(parquetFile ParquetFile) (err error) - CreateManifest(metadataDirPath string, parquetFile ParquetFile) (manifestFile ManifestFile, err error) - CreateDeletedRecordsManifest(metadataDirPath string, uuid string, existingManifestFile ManifestFile) (deletedRecsManifestFile ManifestFile, err error) - CreateManifestList(metadataDirPath string, parquetFileUuid string, manifestListItemsSortedDesc []ManifestListItem) (manifestListFile ManifestListFile, err error) - CreateMetadata(metadataDirPath string, pgSchemaColumns []PgSchemaColumn, manifestListFilesSortedAsc []ManifestListFile) (metadataFile MetadataFile, err error) - - // Read (internal) - InternalStartSqlFile() (sqlFile io.ReadCloser) - InternalTableMetadata(pgSchemaTable PgSchemaTable) (internalTableMetadata InternalTableMetadata, err error) - // Write (internal) - WriteInternalStartSqlFile(queries []string) (err error) - WriteInternalTableMetadata(metadataDirPath string, internalTableMetadata InternalTableMetadata) (err error) -} - -func NewStorage(config *Config) StorageInterface { - switch config.StorageType { - case STORAGE_TYPE_LOCAL: - return NewLocalStorage(config) - case STORAGE_TYPE_S3: - return NewS3Storage(config) - } - - return nil -} diff --git a/src/storage_local.go b/src/storage_local.go deleted file mode 100644 index b45f7cb..0000000 --- a/src/storage_local.go +++ /dev/null @@ -1,400 +0,0 @@ -package main - -import ( - "fmt" - "io" - "os" - "path/filepath" - "strings" - - "github.com/google/uuid" - "github.com/xitongsys/parquet-go-source/local" -) - -type StorageLocal struct { - config *Config - storageUtils *StorageUtils -} - -func NewLocalStorage(config *Config) *StorageLocal { - return &StorageLocal{config: config, storageUtils: &StorageUtils{config: config}} -} - -// Read ---------------------------------------------------------------------------------------------------------------- - -func (storage *StorageLocal) IcebergMetadataFilePath(icebergSchemaTable IcebergSchemaTable) string { - tablePath := storage.tablePath(icebergSchemaTable, true) - return filepath.Join(tablePath, "metadata", ICEBERG_METADATA_FILE_NAME) -} - -func (storage *StorageLocal) IcebergSchemas() (icebergSchemas []string, err error) { - schemasPath := storage.absoluteIcebergPath() - icebergSchemas, err = storage.nestedDirectories(schemasPath) - if err != nil { - return nil, err - } - - return icebergSchemas, nil -} - -func (storage *StorageLocal) IcebergSchemaTables() (Set[IcebergSchemaTable], error) { - icebergSchemaTables := make(Set[IcebergSchemaTable]) - schemasPath := storage.absoluteIcebergPath() - icebergSchemas, err := storage.IcebergSchemas() - if err != nil { - return nil, err - } - - for _, icebergSchema := range icebergSchemas { - tablesPath := filepath.Join(schemasPath, icebergSchema) - tables, err := storage.nestedDirectories(tablesPath) - if err != nil { - return nil, err - } - - for _, table := range tables { - icebergSchemaTables.Add(IcebergSchemaTable{Schema: icebergSchema, Table: table}) - } - } - - return icebergSchemaTables, nil -} - -func (storage *StorageLocal) IcebergTableFields(icebergSchemaTable IcebergSchemaTable) ([]IcebergTableField, error) { - metadataPath := storage.IcebergMetadataFilePath(icebergSchemaTable) - metadataContent, err := storage.readFileContent(metadataPath) - if err != nil { - return nil, err - } - - return storage.storageUtils.ParseIcebergTableFields(metadataContent) -} - -func (storage *StorageLocal) ExistingManifestListFiles(metadataDirPath string) ([]ManifestListFile, error) { - metadataPath := filepath.Join(metadataDirPath, ICEBERG_METADATA_FILE_NAME) - metadataContent, err := storage.readFileContent(metadataPath) - if err != nil { - return nil, err - } - - return storage.storageUtils.ParseManifestListFiles(storage.fileSystemPrefix(), metadataContent) -} - -func (storage *StorageLocal) ExistingManifestListItems(manifestListFile ManifestListFile) ([]ManifestListItem, error) { - manifestListContent, err := storage.readFileContent(manifestListFile.Path) - if err != nil { - return nil, err - } - - return storage.storageUtils.ParseManifestFiles(storage.fileSystemPrefix(), manifestListContent) -} - -func (storage *StorageLocal) ExistingParquetFilePath(manifestFile ManifestFile) (string, error) { - manifestContent, err := storage.readFileContent(manifestFile.Path) - if err != nil { - return "", err - } - - return storage.storageUtils.ParseParquetFilePath(storage.fileSystemPrefix(), manifestContent) -} - -// Write --------------------------------------------------------------------------------------------------------------- - -func (storage *StorageLocal) DeleteSchema(schema string) error { - schemaPath := storage.absoluteIcebergPath(schema) - - _, err := os.Stat(schemaPath) - if !os.IsNotExist(err) { - err := os.RemoveAll(schemaPath) - return err - } - - return nil -} - -func (storage *StorageLocal) DeleteSchemaTable(schemaTable IcebergSchemaTable) error { - tablePath := storage.tablePath(schemaTable) - - _, err := os.Stat(tablePath) - if !os.IsNotExist(err) { - err := os.RemoveAll(tablePath) - return err - } - - return nil -} - -func (storage *StorageLocal) CreateDataDir(schemaTable IcebergSchemaTable) string { - tablePath := storage.tablePath(schemaTable) - dataPath := filepath.Join(tablePath, "data") - err := os.MkdirAll(dataPath, os.ModePerm) - PanicIfError(storage.config, err) - return dataPath -} - -func (storage *StorageLocal) CreateMetadataDir(schemaTable IcebergSchemaTable) string { - tablePath := storage.tablePath(schemaTable) - metadataPath := filepath.Join(tablePath, "metadata") - err := os.MkdirAll(metadataPath, os.ModePerm) - PanicIfError(storage.config, err) - return metadataPath -} - -func (storage *StorageLocal) CreateParquet(dataDirPath string, pgSchemaColumns []PgSchemaColumn, maxPayloadThreshold int, loadRows func() ([][]string, InternalTableMetadata)) (parquetFile ParquetFile, internalTableMetadata InternalTableMetadata, err error) { - uuid := uuid.New().String() - fileName := fmt.Sprintf("00000-0-%s.parquet", uuid) - filePath := filepath.Join(dataDirPath, fileName) - - fileWriter, err := local.NewLocalFileWriter(filePath) - if err != nil { - return parquetFile, internalTableMetadata, fmt.Errorf("failed to open Parquet file for writing: %v", err) - } - - var recordCount int64 - recordCount, internalTableMetadata, err = storage.storageUtils.WriteParquetFile(fileWriter, pgSchemaColumns, maxPayloadThreshold, loadRows) - if err != nil { - return parquetFile, internalTableMetadata, err - } - LogDebug(storage.config, "Parquet file with", recordCount, "record(s) created at:", filePath) - - fileInfo, err := os.Stat(filePath) - if err != nil { - return parquetFile, internalTableMetadata, fmt.Errorf("failed to get Parquet file info: %v", err) - } - fileSize := fileInfo.Size() - - fileReader, err := local.NewLocalFileReader(filePath) - if err != nil { - return parquetFile, internalTableMetadata, fmt.Errorf("failed to open Parquet file for reading: %v", err) - } - parquetStats, err := storage.storageUtils.ReadParquetStats(fileReader) - if err != nil { - return parquetFile, internalTableMetadata, err - } - - return ParquetFile{ - Uuid: uuid, - Path: filePath, - Size: fileSize, - RecordCount: recordCount, - Stats: parquetStats, - }, internalTableMetadata, nil -} - -func (storage *StorageLocal) CreateOverwrittenParquet(dataDirPath string, existingParquetFilePath string, newParquetFilePath string, pgSchemaColumns []PgSchemaColumn, dynamicRowCountPerBatch int) (overwrittenParquetFile ParquetFile, err error) { - uuid := uuid.New().String() - fileName := fmt.Sprintf("00000-0-%s.parquet", uuid) - filePath := filepath.Join(dataDirPath, fileName) - - fileWriter, err := local.NewLocalFileWriter(filePath) - if err != nil { - return ParquetFile{}, fmt.Errorf("failed to open Parquet file for writing: %v", err) - } - - duckdb, err := storage.storageUtils.NewDuckDBIfHasOverlappingRows(storage.fileSystemPrefix(), existingParquetFilePath, newParquetFilePath, pgSchemaColumns) - if err != nil { - return ParquetFile{}, err - } - if duckdb == nil { - fileWriter.Close() - storage.DeleteParquet(ParquetFile{Path: filePath}) - return ParquetFile{}, nil - } - defer duckdb.Close() - - recordCount, err := storage.storageUtils.WriteOverwrittenParquetFile(duckdb, fileWriter, pgSchemaColumns, dynamicRowCountPerBatch) - if err != nil { - return ParquetFile{}, err - } - LogDebug(storage.config, "Parquet file with", recordCount, "record(s) created at:", filePath) - - fileInfo, err := os.Stat(filePath) - if err != nil { - return ParquetFile{}, fmt.Errorf("failed to get Parquet file info: %v", err) - } - fileSize := fileInfo.Size() - - fileReader, err := local.NewLocalFileReader(filePath) - if err != nil { - return ParquetFile{}, fmt.Errorf("failed to open Parquet file for reading: %v", err) - } - parquetStats, err := storage.storageUtils.ReadParquetStats(fileReader) - if err != nil { - return ParquetFile{}, err - } - - return ParquetFile{ - Uuid: uuid, - Path: filePath, - Size: fileSize, - RecordCount: recordCount, - Stats: parquetStats, - }, nil -} - -func (storage *StorageLocal) DeleteParquet(parquetFile ParquetFile) error { - err := os.Remove(parquetFile.Path) - return err -} - -func (storage *StorageLocal) CreateManifest(metadataDirPath string, parquetFile ParquetFile) (manifestFile ManifestFile, err error) { - fileName := fmt.Sprintf("%s-m0.avro", parquetFile.Uuid) - filePath := filepath.Join(metadataDirPath, fileName) - - manifestFile, err = storage.storageUtils.WriteManifestFile(storage.fileSystemPrefix(), filePath, parquetFile) - if err != nil { - return ManifestFile{}, err - } - LogDebug(storage.config, "Manifest file created at:", filePath) - - return manifestFile, nil -} - -func (storage *StorageLocal) CreateDeletedRecordsManifest(metadataDirPath string, uuid string, existingManifestFile ManifestFile) (deletedRecsManifestFile ManifestFile, err error) { - fileName := fmt.Sprintf("%s-m1.avro", uuid) - filePath := filepath.Join(metadataDirPath, fileName) - - existingManifestContent, err := storage.readFileContent(existingManifestFile.Path) - if err != nil { - return ManifestFile{}, err - } - - deletedRecsManifestFile, err = storage.storageUtils.WriteDeletedRecordsManifestFile(storage.fileSystemPrefix(), filePath, existingManifestContent) - if err != nil { - return ManifestFile{}, err - } - LogDebug(storage.config, "Manifest file created at:", filePath) - - return deletedRecsManifestFile, nil -} - -func (storage *StorageLocal) CreateManifestList(metadataDirPath string, parquetFileUuid string, manifestListItemsSortedDesc []ManifestListItem) (manifestListFile ManifestListFile, err error) { - fileName := fmt.Sprintf("snap-%d-0-%s.avro", manifestListItemsSortedDesc[0].ManifestFile.SnapshotId, parquetFileUuid) - filePath := filepath.Join(metadataDirPath, fileName) - - manifestListFile, err = storage.storageUtils.WriteManifestListFile(storage.fileSystemPrefix(), filePath, manifestListItemsSortedDesc) - if err != nil { - return ManifestListFile{}, err - } - LogDebug(storage.config, "Manifest list file created at:", filePath) - - return manifestListFile, nil -} - -func (storage *StorageLocal) CreateMetadata(metadataDirPath string, pgSchemaColumns []PgSchemaColumn, manifestListFilesSortedAsc []ManifestListFile) (metadataFile MetadataFile, err error) { - filePath := filepath.Join(metadataDirPath, ICEBERG_METADATA_FILE_NAME) - - err = storage.storageUtils.WriteMetadataFile(storage.fileSystemPrefix(), filePath, pgSchemaColumns, manifestListFilesSortedAsc) - if err != nil { - return MetadataFile{}, err - } - LogDebug(storage.config, "Metadata file created at:", filePath) - - return MetadataFile{Version: 1, Path: filePath}, nil -} - -// Read (internal) ----------------------------------------------------------------------------------------------------- - -func (storage *StorageLocal) InternalStartSqlFile() io.ReadCloser { - filePath := storage.absoluteIcebergPath(INTERNAL_START_SQL_FILE_NAME) - if !storage.fileExists(filePath) { - return io.NopCloser(strings.NewReader("")) - } - - file, err := os.Open(filePath) - PanicIfError(storage.config, err) - return file -} - -func (storage *StorageLocal) InternalTableMetadata(pgSchemaTable PgSchemaTable) (InternalTableMetadata, error) { - internalMetadataPath := storage.internalTableMetadataFilePath(pgSchemaTable) - if !storage.fileExists(internalMetadataPath) { - return InternalTableMetadata{}, nil - } - - internalMetadataContent, err := storage.readFileContent(internalMetadataPath) - PanicIfError(storage.config, err) - return storage.storageUtils.ParseInternalTableMetadata(internalMetadataContent) -} - -func (storage *StorageLocal) fileExists(filePath string) bool { - _, err := os.Stat(filePath) - if err != nil { - if os.IsNotExist(err) { - return false - } - PanicIfError(storage.config, err) - } - return true -} - -// Write (internal) ---------------------------------------------------------------------------------------------------- - -func (storage *StorageLocal) WriteInternalStartSqlFile(queries []string) error { - filePath := storage.absoluteIcebergPath(INTERNAL_START_SQL_FILE_NAME) - return storage.storageUtils.WriteInternalStartSqlFile(filePath, queries) -} - -func (storage *StorageLocal) WriteInternalTableMetadata(metadataDirPath string, internalTableMetadata InternalTableMetadata) error { - filePath := filepath.Join(metadataDirPath, INTERNAL_METADATA_FILE_NAME) - - err := storage.storageUtils.WriteInternalTableMetadataFile(filePath, internalTableMetadata) - if err != nil { - return err - } - LogDebug(storage.config, "Internal table metadata file created at:", filePath) - - return nil -} - -// --------------------------------------------------------------------------------------------------------------------- - -func (storage *StorageLocal) readFileContent(filePath string) ([]byte, error) { - file, err := os.Open(filePath) - if err != nil { - return nil, err - } - defer file.Close() - - return io.ReadAll(file) -} - -func (storage *StorageLocal) internalTableMetadataFilePath(pgSchemaTable PgSchemaTable) string { - return filepath.Join(storage.tablePath(pgSchemaTable.ToIcebergSchemaTable()), "metadata", INTERNAL_METADATA_FILE_NAME) -} - -func (storage *StorageLocal) tablePath(schemaTable IcebergSchemaTable, readWithoutSchemaPrefix ...bool) string { - if len(readWithoutSchemaPrefix) > 0 && readWithoutSchemaPrefix[0] { - return storage.absoluteIcebergPath(schemaTable.Schema, schemaTable.Table) - } - return storage.absoluteIcebergPath(storage.config.Pg.SchemaPrefix+schemaTable.Schema, schemaTable.Table) -} - -func (storage *StorageLocal) absoluteIcebergPath(relativePaths ...string) string { - if filepath.IsAbs(storage.config.StoragePath) { - return filepath.Join(storage.config.StoragePath, filepath.Join(relativePaths...)) - } - - execPath, err := os.Getwd() - PanicIfError(storage.config, err) - return filepath.Join(execPath, storage.config.StoragePath, filepath.Join(relativePaths...)) -} - -func (storage *StorageLocal) fileSystemPrefix() string { - return "" // DuckDB doesn't support file:// prefixes -} - -func (storage *StorageLocal) nestedDirectories(path string) (dirs []string, err error) { - files, err := os.ReadDir(path) - if err != nil { - return nil, fmt.Errorf("no Iceberg directory found (%v)", err.Error()) - } - - for _, file := range files { - if file.IsDir() { - dirs = append(dirs, file.Name()) - } - } - - return dirs, nil -} diff --git a/src/storage_local_test.go b/src/storage_local_test.go deleted file mode 100644 index 406895c..0000000 --- a/src/storage_local_test.go +++ /dev/null @@ -1,283 +0,0 @@ -package main - -import ( - "encoding/binary" - "os" - "testing" -) - -var TEST_STORAGE_PG_SCHEMA_COLUMNS = []PgSchemaColumn{ - {ColumnName: "id", DataType: "integer", UdtName: "int4", IsNullable: "NO", NumericPrecision: "32", OrdinalPosition: "1", Namespace: "pg_catalog"}, - {ColumnName: "name", DataType: "character varying", UdtName: "varchar", IsNullable: "YES", CharacterMaximumLength: "255", OrdinalPosition: "2", Namespace: "pg_catalog"}, -} -var TEST_STORAGE_ROWS = [][]string{ - {"1", "John"}, - {"2", PG_NULL_STRING}, -} - -func TestCreateParquet(t *testing.T) { - t.Run("Creates a parquet file", func(t *testing.T) { - tempDir := os.TempDir() - config := loadTestConfig() - storage := NewLocalStorage(config) - loadedRows := false - loadRows := func() ([][]string, InternalTableMetadata) { - if loadedRows { - return [][]string{}, InternalTableMetadata{} - } - loadedRows = true - return TEST_STORAGE_ROWS, InternalTableMetadata{} - } - - parquetFile, _, err := storage.CreateParquet(tempDir, TEST_STORAGE_PG_SCHEMA_COLUMNS, 0, loadRows) - - if err != nil { - t.Errorf("Expected no error, got %v", err) - } - if parquetFile.Uuid == "" { - t.Errorf("Expected a non-empty UUID, got %v", parquetFile.Uuid) - } - if parquetFile.Path == "" { - t.Errorf("Expected a non-empty path, got %v", parquetFile.Path) - } - if parquetFile.Size == 0 { - t.Errorf("Expected a non-zero size, got %v", parquetFile.Size) - } - if parquetFile.RecordCount != 2 { - t.Errorf("Expected a non-zero record count, got %v", parquetFile.RecordCount) - } - if len(parquetFile.Stats.ColumnSizes) != 2 { - t.Errorf("Expected 2 column sizes, got %v", len(parquetFile.Stats.ColumnSizes)) - } - if parquetFile.Stats.ColumnSizes[1] == 0 { - t.Errorf("Expected a non-zero column size, got %v", parquetFile.Stats.ColumnSizes[1]) - } - if parquetFile.Stats.ColumnSizes[2] == 0 { - t.Errorf("Expected a non-zero value count, got %v", parquetFile.Stats.ColumnSizes[2]) - } - if parquetFile.Stats.ValueCounts[1] != 2 { - t.Errorf("Expected a value count of 2, got %v", parquetFile.Stats.ValueCounts[1]) - } - if parquetFile.Stats.ValueCounts[2] != 2 { - t.Errorf("Expected a value count of 1, got %v", parquetFile.Stats.ValueCounts[2]) - } - if parquetFile.Stats.NullValueCounts[1] != 0 { - t.Errorf("Expected a null value count of 0, got %v", parquetFile.Stats.NullValueCounts[1]) - } - if parquetFile.Stats.NullValueCounts[2] != 1 { - t.Errorf("Expected a null value count of 1, got %v", parquetFile.Stats.NullValueCounts[2]) - } - if binary.LittleEndian.Uint32(parquetFile.Stats.LowerBounds[1]) != 1 { - t.Errorf("Expected a lower bound of 1, got %v", binary.LittleEndian.Uint32(parquetFile.Stats.LowerBounds[1])) - } - if string(parquetFile.Stats.LowerBounds[2]) != "John" { - t.Errorf("Expected a lower bound of John, got %v", parquetFile.Stats.LowerBounds[2]) - } - if binary.LittleEndian.Uint32(parquetFile.Stats.UpperBounds[1]) != 2 { - t.Errorf("Expected an upper bound of 2, got %v", binary.LittleEndian.Uint32(parquetFile.Stats.UpperBounds[1])) - } - if string(parquetFile.Stats.UpperBounds[2]) != "John" { - t.Errorf("Expected an upper bound of John, got %v", parquetFile.Stats.UpperBounds[2]) - } - if len(parquetFile.Stats.SplitOffsets) != 0 { - t.Errorf("Expected 0 split offsets, got %v", len(parquetFile.Stats.SplitOffsets)) - } - }) -} - -func TestCreateManifest(t *testing.T) { - t.Run("Creates a manifest file", func(t *testing.T) { - tempDir := os.TempDir() - config := loadTestConfig() - storage := NewLocalStorage(config) - parquetFile := createTestParquetFile(storage, tempDir) - - manifestFile, err := storage.CreateManifest(tempDir, parquetFile) - - if err != nil { - t.Errorf("Expected no error, got %v", err) - } - if manifestFile.SnapshotId == 0 { - t.Errorf("Expected a non-zero snapshot ID, got %v", manifestFile.SnapshotId) - } - if manifestFile.Path == "" { - t.Errorf("Expected a non-empty path, got %v", manifestFile.Path) - } - if manifestFile.Size == 0 { - t.Errorf("Expected a non-zero size, got %v", manifestFile.Size) - } - if manifestFile.RecordCount != parquetFile.RecordCount { - t.Errorf("Expected a record count of %v, got %v", parquetFile.RecordCount, manifestFile.RecordCount) - } - if manifestFile.DataFileSize != parquetFile.Size { - t.Errorf("Expected a data file size of %v, got %v", parquetFile.Size, manifestFile.DataFileSize) - } - }) -} - -func TestCreateManifestList(t *testing.T) { - t.Run("Creates a manifest list file", func(t *testing.T) { - tempDir := os.TempDir() - config := loadTestConfig() - storage := NewLocalStorage(config) - parquetFile := createTestParquetFile(storage, tempDir) - manifestFile, err := storage.CreateManifest(tempDir, parquetFile) - PanicIfError(config, err) - manifestListItem := ManifestListItem{SequenceNumber: 1, ManifestFile: manifestFile} - - manifestListFile, err := storage.CreateManifestList(tempDir, parquetFile.Uuid, []ManifestListItem{manifestListItem}) - - if err != nil { - t.Errorf("Expected no error, got %v", err) - } - if manifestListFile.SnapshotId != manifestFile.SnapshotId { - t.Errorf("Expected a snapshot ID of %v, got %v", manifestFile.SnapshotId, manifestListFile.SnapshotId) - } - if manifestListFile.TimestampMs == 0 { - t.Errorf("Expected a non-zero timestamp, got %v", manifestListFile.TimestampMs) - } - if manifestListFile.Path == "" { - t.Errorf("Expected a non-empty path, got %v", manifestListFile.Path) - } - if manifestListFile.Operation != "append" { - t.Errorf("Expected an operation of append, got %v", manifestListFile.Operation) - } - if manifestListFile.AddedFilesSize != parquetFile.Size { - t.Errorf("Expected an added files size of %v, got %v", parquetFile.Size, manifestListFile.AddedFilesSize) - } - if manifestListFile.AddedDataFiles != 1 { - t.Errorf("Expected an added data files count of 1, got %v", manifestListFile.AddedDataFiles) - } - if manifestListFile.AddedRecords != parquetFile.RecordCount { - t.Errorf("Expected an added records count of %v, got %v", parquetFile.RecordCount, manifestListFile.AddedRecords) - } - }) -} - -func TestCreateMetadata(t *testing.T) { - t.Run("Creates a metadata file", func(t *testing.T) { - tempDir := os.TempDir() - config := loadTestConfig() - storage := NewLocalStorage(config) - parquetFile := createTestParquetFile(storage, tempDir) - manifestFile, err := storage.CreateManifest(tempDir, parquetFile) - PanicIfError(config, err) - manifestListItem := ManifestListItem{SequenceNumber: 1, ManifestFile: manifestFile} - manifestListFile, err := storage.CreateManifestList(tempDir, parquetFile.Uuid, []ManifestListItem{manifestListItem}) - PanicIfError(config, err) - - metadataFile, err := storage.CreateMetadata(tempDir, TEST_STORAGE_PG_SCHEMA_COLUMNS, []ManifestListFile{manifestListFile}) - - if err != nil { - t.Errorf("Expected no error, got %v", err) - } - if metadataFile.Version != 1 { - t.Errorf("Expected a version of 1, got %v", metadataFile.Version) - } - if metadataFile.Path == "" { - t.Errorf("Expected a non-empty path, got %v", metadataFile.Path) - } - }) -} - -func TestExistingManifestListFiles(t *testing.T) { - t.Run("Returns existing manifest list files", func(t *testing.T) { - tempDir := os.TempDir() - config := loadTestConfig() - storage := NewLocalStorage(config) - parquetFile := createTestParquetFile(storage, tempDir) - manifestFile, err := storage.CreateManifest(tempDir, parquetFile) - PanicIfError(config, err) - manifestListItem := ManifestListItem{SequenceNumber: 1, ManifestFile: manifestFile} - manifestListFile, err := storage.CreateManifestList(tempDir, parquetFile.Uuid, []ManifestListItem{manifestListItem}) - PanicIfError(config, err) - _, err = storage.CreateMetadata(tempDir, TEST_STORAGE_PG_SCHEMA_COLUMNS, []ManifestListFile{manifestListFile}) - PanicIfError(config, err) - - existingManifestListFiles, err := storage.ExistingManifestListFiles(tempDir) - - if err != nil { - t.Errorf("Expected no error, got %v", err) - } - if len(existingManifestListFiles) != 1 { - t.Errorf("Expected 1 existing manifest list file, got %v", len(existingManifestListFiles)) - } - if existingManifestListFiles[0].SnapshotId != manifestListFile.SnapshotId { - t.Errorf("Expected a snapshot ID of %v, got %v", manifestListFile.SnapshotId, existingManifestListFiles[0].SnapshotId) - } - if existingManifestListFiles[0].TimestampMs != manifestListFile.TimestampMs { - t.Errorf("Expected a timestamp of %v, got %v", manifestListFile.TimestampMs, existingManifestListFiles[0].TimestampMs) - } - if existingManifestListFiles[0].Path != manifestListFile.Path { - t.Errorf("Expected a path of %v, got %v", manifestListFile.Path, existingManifestListFiles[0].Path) - } - if existingManifestListFiles[0].Operation != manifestListFile.Operation { - t.Errorf("Expected an operation of %v, got %v", manifestListFile.Operation, existingManifestListFiles[0].Operation) - } - if existingManifestListFiles[0].AddedFilesSize != manifestListFile.AddedFilesSize { - t.Errorf("Expected an added files size of %v, got %v", manifestListFile.AddedFilesSize, existingManifestListFiles[0].AddedFilesSize) - } - if existingManifestListFiles[0].AddedDataFiles != manifestListFile.AddedDataFiles { - t.Errorf("Expected an added data files count of %v, got %v", manifestListFile.AddedDataFiles, existingManifestListFiles[0].AddedDataFiles) - } - if existingManifestListFiles[0].AddedRecords != manifestListFile.AddedRecords { - t.Errorf("Expected an added records count of %v, got %v", manifestListFile.AddedRecords, existingManifestListFiles[0].AddedRecords) - } - }) -} - -func TestExistingManifestFiles(t *testing.T) { - t.Run("Returns existing manifest files", func(t *testing.T) { - tempDir := os.TempDir() - config := loadTestConfig() - storage := NewLocalStorage(config) - parquetFile := createTestParquetFile(storage, tempDir) - manifestFile, err := storage.CreateManifest(tempDir, parquetFile) - PanicIfError(config, err) - manifestListItem := ManifestListItem{SequenceNumber: 1, ManifestFile: manifestFile} - manifestListFile, err := storage.CreateManifestList(tempDir, parquetFile.Uuid, []ManifestListItem{manifestListItem}) - PanicIfError(config, err) - - existingManifestListItems, err := storage.ExistingManifestListItems(manifestListFile) - - if err != nil { - t.Errorf("Expected no error, got %v", err) - } - if len(existingManifestListItems) != 1 { - t.Errorf("Expected 1 existing manifest file, got %v", len(existingManifestListItems)) - } - if existingManifestListItems[0].SequenceNumber != 1 { - t.Errorf("Expected a sequence number of 1, got %v", existingManifestListItems[0].SequenceNumber) - } - if existingManifestListItems[0].ManifestFile.SnapshotId != manifestFile.SnapshotId { - t.Errorf("Expected a snapshot ID of %v, got %v", manifestFile.SnapshotId, existingManifestListItems[0].ManifestFile.SnapshotId) - } - if existingManifestListItems[0].ManifestFile.Path != manifestFile.Path { - t.Errorf("Expected a path of %v, got %v", manifestFile.Path, existingManifestListItems[0].ManifestFile.Path) - } - if existingManifestListItems[0].ManifestFile.Size != manifestFile.Size { - t.Errorf("Expected a size of %v, got %v", manifestFile.Size, existingManifestListItems[0].ManifestFile.Size) - } - if existingManifestListItems[0].ManifestFile.RecordCount != manifestFile.RecordCount { - t.Errorf("Expected a record count of %v, got %v", manifestFile.RecordCount, existingManifestListItems[0].ManifestFile.RecordCount) - } - }) -} - -func createTestParquetFile(storage *StorageLocal, dir string) ParquetFile { - loadedRows := false - loadRows := func() ([][]string, InternalTableMetadata) { - if loadedRows { - return [][]string{}, InternalTableMetadata{} - } - loadedRows = true - return TEST_STORAGE_ROWS, InternalTableMetadata{} - } - - parquetFile, _, err := storage.CreateParquet(dir, TEST_STORAGE_PG_SCHEMA_COLUMNS, 0, loadRows) - if err != nil { - panic(err) - } - - return parquetFile -} diff --git a/src/storage_s3.go b/src/storage_s3.go deleted file mode 100644 index 3f6f574..0000000 --- a/src/storage_s3.go +++ /dev/null @@ -1,532 +0,0 @@ -package main - -import ( - "context" - "errors" - "fmt" - "io" - "os" - "strings" - - "github.com/aws/aws-sdk-go-v2/aws" - awsConfig "github.com/aws/aws-sdk-go-v2/config" - "github.com/aws/aws-sdk-go-v2/credentials" - "github.com/aws/aws-sdk-go-v2/feature/s3/manager" - "github.com/aws/aws-sdk-go-v2/service/s3" - "github.com/aws/aws-sdk-go-v2/service/s3/types" - "github.com/google/uuid" - "github.com/xitongsys/parquet-go-source/s3v2" -) - -type StorageS3 struct { - s3Client *s3.Client - config *Config - storageUtils *StorageUtils -} - -func NewS3Storage(config *Config) *StorageS3 { - var awsConfigOptions = []func(*awsConfig.LoadOptions) error{ - awsConfig.WithRegion(config.Aws.Region), - } - - if config.LogLevel == LOG_LEVEL_TRACE { - awsConfigOptions = append(awsConfigOptions, awsConfig.WithClientLogMode(aws.LogRequest)) - } - - if IsLocalHost(config.Aws.S3Endpoint) { - awsConfigOptions = append(awsConfigOptions, awsConfig.WithBaseEndpoint("http://"+config.Aws.S3Endpoint)) - } else { - awsConfigOptions = append(awsConfigOptions, awsConfig.WithBaseEndpoint("https://"+config.Aws.S3Endpoint)) - } - - if config.Aws.AccessKeyId != "" && config.Aws.SecretAccessKey != "" { - awsCredentials := credentials.NewStaticCredentialsProvider( - config.Aws.AccessKeyId, - config.Aws.SecretAccessKey, - "", - ) - awsConfigOptions = append(awsConfigOptions, awsConfig.WithCredentialsProvider(awsCredentials)) - } - - loadedAwsConfig, err := awsConfig.LoadDefaultConfig(context.Background(), awsConfigOptions...) - PanicIfError(config, err) - - return &StorageS3{ - s3Client: s3.NewFromConfig(loadedAwsConfig), - config: config, - storageUtils: &StorageUtils{config: config}, - } -} - -// Read ---------------------------------------------------------------------------------------------------------------- - -func (storage *StorageS3) IcebergMetadataFilePath(icebergSchemaTable IcebergSchemaTable) string { - return storage.fullBucketPath() + storage.tablePrefix(icebergSchemaTable, true) + "metadata/" + ICEBERG_METADATA_FILE_NAME -} - -func (storage *StorageS3) IcebergSchemas() (icebergSchemas []string, err error) { - schemasPrefix := storage.config.StoragePath + "/" - icebergSchemas, err = storage.nestedDirectoryPrefixes(schemasPrefix) - if err != nil { - return nil, err - } - - for i, schema := range icebergSchemas { - schemaParts := strings.Split(schema, "/") - icebergSchemas[i] = schemaParts[len(schemaParts)-2] - } - - return icebergSchemas, nil -} - -func (storage *StorageS3) IcebergSchemaTables() (Set[IcebergSchemaTable], error) { - icebergSchemaTables := make(Set[IcebergSchemaTable]) - icebergSchemas, err := storage.IcebergSchemas() - if err != nil { - return nil, err - } - - for _, icebergSchema := range icebergSchemas { - tables, err := storage.nestedDirectoryPrefixes(storage.config.StoragePath + "/" + icebergSchema + "/") - if err != nil { - return nil, err - } - - for _, tablePrefix := range tables { - tableParts := strings.Split(tablePrefix, "/") - table := tableParts[len(tableParts)-2] - - icebergSchemaTables.Add(IcebergSchemaTable{Schema: icebergSchema, Table: table}) - } - } - - return icebergSchemaTables, nil -} - -func (storage *StorageS3) IcebergTableFields(icebergSchemaTable IcebergSchemaTable) ([]IcebergTableField, error) { - metadataPath := storage.tablePrefix(icebergSchemaTable, true) + "metadata/" + ICEBERG_METADATA_FILE_NAME - metadataContent, err := storage.readFileContent(metadataPath) - if err != nil { - return nil, err - } - - return storage.storageUtils.ParseIcebergTableFields(metadataContent) -} - -func (storage *StorageS3) ExistingManifestListFiles(metadataDirPath string) ([]ManifestListFile, error) { - metadataPath := metadataDirPath + "/" + ICEBERG_METADATA_FILE_NAME - metadataContent, err := storage.readFileContent(metadataPath) - if err != nil { - return nil, err - } - - return storage.storageUtils.ParseManifestListFiles(storage.fullBucketPath(), metadataContent) -} - -func (storage *StorageS3) ExistingManifestListItems(manifestListFile ManifestListFile) ([]ManifestListItem, error) { - manifestListContent, err := storage.readFileContent(manifestListFile.Path) - if err != nil { - return nil, err - } - - return storage.storageUtils.ParseManifestFiles(storage.fullBucketPath(), manifestListContent) -} - -func (storage *StorageS3) ExistingParquetFilePath(manifestFile ManifestFile) (string, error) { - manifestListContent, err := storage.readFileContent(manifestFile.Path) - if err != nil { - return "", err - } - - return storage.storageUtils.ParseParquetFilePath(storage.fullBucketPath(), manifestListContent) -} - -// Write --------------------------------------------------------------------------------------------------------------- - -func (storage *StorageS3) DeleteSchema(schema string) (err error) { - return storage.deleteNestedObjects(storage.config.StoragePath + "/" + schema + "/") -} - -func (storage *StorageS3) DeleteSchemaTable(schemaTable IcebergSchemaTable) (err error) { - tablePrefix := storage.tablePrefix(schemaTable) - return storage.deleteNestedObjects(tablePrefix) -} - -func (storage *StorageS3) CreateDataDir(schemaTable IcebergSchemaTable) (dataDirPath string) { - tablePrefix := storage.tablePrefix(schemaTable) - return tablePrefix + "data" -} - -func (storage *StorageS3) CreateMetadataDir(schemaTable IcebergSchemaTable) (metadataDirPath string) { - tablePrefix := storage.tablePrefix(schemaTable) - return tablePrefix + "metadata" -} - -func (storage *StorageS3) CreateParquet(dataDirPath string, pgSchemaColumns []PgSchemaColumn, maxPayloadThreshold int, loadRows func() ([][]string, InternalTableMetadata)) (parquetFile ParquetFile, internalTableMetadata InternalTableMetadata, err error) { - ctx := context.Background() - uuid := uuid.New().String() - fileName := fmt.Sprintf("00000-0-%s.parquet", uuid) - fileKey := dataDirPath + "/" + fileName - - fileWriter, err := s3v2.NewS3FileWriterWithClient(ctx, storage.s3Client, storage.config.Aws.S3Bucket, fileKey, nil) - if err != nil { - return parquetFile, internalTableMetadata, fmt.Errorf("failed to open Parquet file for writing: %v", err) - } - - var recordCount int64 - recordCount, internalTableMetadata, err = storage.storageUtils.WriteParquetFile(fileWriter, pgSchemaColumns, maxPayloadThreshold, loadRows) - if err != nil { - return parquetFile, internalTableMetadata, err - } - LogDebug(storage.config, "Parquet file with", recordCount, "record(s) created at:", fileKey) - - headObjectResponse, err := storage.s3Client.HeadObject(ctx, &s3.HeadObjectInput{ - Bucket: aws.String(storage.config.Aws.S3Bucket), - Key: aws.String(fileKey), - }) - if err != nil { - return parquetFile, internalTableMetadata, fmt.Errorf("failed to get Parquet file info: %v", err) - } - fileSize := *headObjectResponse.ContentLength - - fileReader, err := s3v2.NewS3FileReaderWithClient(ctx, storage.s3Client, storage.config.Aws.S3Bucket, fileKey) - if err != nil { - return parquetFile, internalTableMetadata, fmt.Errorf("failed to open Parquet file for reading: %v", err) - } - parquetStats, err := storage.storageUtils.ReadParquetStats(fileReader) - if err != nil { - return parquetFile, internalTableMetadata, err - } - - return ParquetFile{ - Uuid: uuid, - Path: fileKey, - Size: fileSize, - RecordCount: recordCount, - Stats: parquetStats, - }, internalTableMetadata, nil -} - -func (storage *StorageS3) CreateOverwrittenParquet(dataDirPath string, existingParquetFilePath string, newParquetFilePath string, pgSchemaColumns []PgSchemaColumn, dynamicRowCountPerBatch int) (overwrittenParquetFile ParquetFile, err error) { - ctx := context.Background() - uuid := uuid.New().String() - fileName := fmt.Sprintf("00000-0-%s.parquet", uuid) - fileKey := dataDirPath + "/" + fileName - - fileWriter, err := s3v2.NewS3FileWriterWithClient(ctx, storage.s3Client, storage.config.Aws.S3Bucket, fileKey, nil) - if err != nil { - return ParquetFile{}, fmt.Errorf("failed to open Parquet file for writing: %v", err) - } - - duckdb, err := storage.storageUtils.NewDuckDBIfHasOverlappingRows(storage.fullBucketPath(), existingParquetFilePath, newParquetFilePath, pgSchemaColumns) - if err != nil { - return ParquetFile{}, err - } - if duckdb == nil { - fileWriter.Close() - storage.DeleteParquet(ParquetFile{Path: fileKey}) - return ParquetFile{}, nil - } - defer duckdb.Close() - - recordCount, err := storage.storageUtils.WriteOverwrittenParquetFile(duckdb, fileWriter, pgSchemaColumns, dynamicRowCountPerBatch) - if err != nil { - return ParquetFile{}, err - } - LogDebug(storage.config, "Parquet file with", recordCount, "record(s) created at:", fileKey) - - headObjectResponse, err := storage.s3Client.HeadObject(ctx, &s3.HeadObjectInput{ - Bucket: aws.String(storage.config.Aws.S3Bucket), - Key: aws.String(fileKey), - }) - if err != nil { - return ParquetFile{}, fmt.Errorf("failed to get Parquet file info: %v", err) - } - fileSize := *headObjectResponse.ContentLength - - fileReader, err := s3v2.NewS3FileReaderWithClient(ctx, storage.s3Client, storage.config.Aws.S3Bucket, fileKey) - if err != nil { - return ParquetFile{}, fmt.Errorf("failed to open Parquet file for reading: %v", err) - } - parquetStats, err := storage.storageUtils.ReadParquetStats(fileReader) - if err != nil { - return ParquetFile{}, err - } - - return ParquetFile{ - Uuid: uuid, - Path: fileKey, - Size: fileSize, - RecordCount: recordCount, - Stats: parquetStats, - }, nil -} - -func (storage *StorageS3) DeleteParquet(parquetFile ParquetFile) (err error) { - ctx := context.Background() - _, err = storage.s3Client.DeleteObject(ctx, &s3.DeleteObjectInput{ - Bucket: aws.String(storage.config.Aws.S3Bucket), - Key: aws.String(parquetFile.Path), - }) - return err -} - -func (storage *StorageS3) CreateManifest(metadataDirPath string, parquetFile ParquetFile) (manifestFile ManifestFile, err error) { - fileName := fmt.Sprintf("%s-m0.avro", parquetFile.Uuid) - filePath := metadataDirPath + "/" + fileName - - err = storage.uploadTemporaryFile("manifest", filePath, func(tempFile *os.File) error { - manifestFile, err = storage.storageUtils.WriteManifestFile(storage.fullBucketPath(), tempFile.Name(), parquetFile) - return err - }) - if err != nil { - return manifestFile, err - } - LogDebug(storage.config, "Manifest file created at:", filePath) - - manifestFile.Path = filePath - return manifestFile, nil -} - -func (storage *StorageS3) CreateDeletedRecordsManifest(metadataDirPath string, uuid string, existingManifestFile ManifestFile) (deletedRecsManifestFile ManifestFile, err error) { - fileName := fmt.Sprintf("%s-m1.avro", uuid) - filePath := metadataDirPath + "/" + fileName - - existingManifestContent, err := storage.readFileContent(existingManifestFile.Path) - if err != nil { - return ManifestFile{}, err - } - - err = storage.uploadTemporaryFile("deleted-records-manifest", filePath, func(tempFile *os.File) error { - deletedRecsManifestFile, err = storage.storageUtils.WriteDeletedRecordsManifestFile(storage.fullBucketPath(), tempFile.Name(), existingManifestContent) - return err - }) - if err != nil { - return deletedRecsManifestFile, err - } - LogDebug(storage.config, "Manifest file created at:", filePath) - - return deletedRecsManifestFile, nil -} - -func (storage *StorageS3) CreateManifestList(metadataDirPath string, parquetFileUuid string, manifestListItemsSortedDesc []ManifestListItem) (manifestListFile ManifestListFile, err error) { - fileName := fmt.Sprintf("snap-%d-0-%s.avro", manifestListItemsSortedDesc[0].ManifestFile.SnapshotId, parquetFileUuid) - filePath := metadataDirPath + "/" + fileName - - err = storage.uploadTemporaryFile("manifest-list", filePath, func(tempFile *os.File) error { - manifestListFile, err = storage.storageUtils.WriteManifestListFile(storage.fullBucketPath(), tempFile.Name(), manifestListItemsSortedDesc) - return err - }) - if err != nil { - return manifestListFile, err - } - LogDebug(storage.config, "Manifest list file created at:", filePath) - - manifestListFile.Path = filePath - return manifestListFile, nil -} - -func (storage *StorageS3) CreateMetadata(metadataDirPath string, pgSchemaColumns []PgSchemaColumn, manifestListFilesSortedAsc []ManifestListFile) (metadataFile MetadataFile, err error) { - filePath := metadataDirPath + "/" + ICEBERG_METADATA_FILE_NAME - - err = storage.uploadTemporaryFile("metadata", filePath, func(tempFile *os.File) error { - return storage.storageUtils.WriteMetadataFile(storage.fullBucketPath(), tempFile.Name(), pgSchemaColumns, manifestListFilesSortedAsc) - }) - if err != nil { - return metadataFile, err - } - LogDebug(storage.config, "Metadata file created at:", filePath) - - return MetadataFile{Version: 1, Path: filePath}, nil -} - -// Read (internal) ----------------------------------------------------------------------------------------------------- - -func (storage *StorageS3) InternalStartSqlFile() io.ReadCloser { - filePath := storage.config.StoragePath + "/" + INTERNAL_START_SQL_FILE_NAME - - if !storage.fileExists(filePath) { - return io.NopCloser(strings.NewReader("")) - } - - ctx := context.Background() - getObjectResponse, err := storage.s3Client.GetObject(ctx, &s3.GetObjectInput{ - Bucket: aws.String(storage.config.Aws.S3Bucket), - Key: aws.String(filePath), - }) - PanicIfError(storage.config, err) - - return getObjectResponse.Body -} - -func (storage *StorageS3) InternalTableMetadata(pgSchemaTable PgSchemaTable) (InternalTableMetadata, error) { - internalMetadataPath := storage.internalTableMetadataFilePath(pgSchemaTable) - if !storage.fileExists(internalMetadataPath) { - return InternalTableMetadata{}, nil - } - - internalMetadataContent, err := storage.readFileContent(internalMetadataPath) - PanicIfError(storage.config, err) - return storage.storageUtils.ParseInternalTableMetadata(internalMetadataContent) -} - -// Write (internal) ---------------------------------------------------------------------------------------------------- - -func (storage *StorageS3) WriteInternalStartSqlFile(queries []string) error { - filePath := storage.config.StoragePath + "/" + INTERNAL_START_SQL_FILE_NAME - return storage.uploadTemporaryFile("internal-start-sql", filePath, func(tempFile *os.File) error { - return storage.storageUtils.WriteInternalStartSqlFile(tempFile.Name(), queries) - }) -} - -func (storage *StorageS3) WriteInternalTableMetadata(metadataDirPath string, internalTableMetadata InternalTableMetadata) error { - filePath := metadataDirPath + "/" + INTERNAL_METADATA_FILE_NAME - - err := storage.uploadTemporaryFile("internal-metadata", filePath, func(tempFile *os.File) error { - return storage.storageUtils.WriteInternalTableMetadataFile(tempFile.Name(), internalTableMetadata) - }) - if err != nil { - return err - } - LogDebug(storage.config, "Internal metadata file created at:", filePath) - - return nil -} - -// --------------------------------------------------------------------------------------------------------------------- - -func (storage *StorageS3) fileExists(filePath string) bool { - ctx := context.Background() - _, err := storage.s3Client.HeadObject(ctx, &s3.HeadObjectInput{ - Bucket: aws.String(storage.config.Aws.S3Bucket), - Key: aws.String(filePath), - }) - if err != nil { - var notFoundType *types.NotFound - if errors.As(err, ¬FoundType) { - return false - } - PanicIfError(storage.config, err) - } - return true -} - -func (storage *StorageS3) readFileContent(filePath string) ([]byte, error) { - ctx := context.Background() - getObjectResponse, err := storage.s3Client.GetObject(ctx, &s3.GetObjectInput{ - Bucket: aws.String(storage.config.Aws.S3Bucket), - Key: aws.String(filePath), - }) - if err != nil { - return nil, err - } - - fileContent, err := io.ReadAll(getObjectResponse.Body) - if err != nil { - return nil, err - } - - return fileContent, nil -} - -func (storage *StorageS3) uploadTemporaryFile(tempFilePattern string, uploadFilePath string, writeTempFileFunc func(*os.File) error) error { - tempFile, err := os.CreateTemp("", tempFilePattern) - if err != nil { - return err - } - defer func() { - os.Remove(tempFile.Name()) - }() - - err = writeTempFileFunc(tempFile) - if err != nil { - return err - } - - uploader := manager.NewUploader(storage.s3Client) - _, err = uploader.Upload(context.Background(), &s3.PutObjectInput{ - Bucket: aws.String(storage.config.Aws.S3Bucket), - Key: aws.String(uploadFilePath), - Body: tempFile, - }) - if err != nil { - return fmt.Errorf("failed to upload file: %v", err) - } - - err = tempFile.Close() - if err != nil { - return err - } - - return nil -} - -func (storage *StorageS3) internalTableMetadataFilePath(pgSchemaTable PgSchemaTable) string { - return storage.tablePrefix(pgSchemaTable.ToIcebergSchemaTable()) + "metadata/" + INTERNAL_METADATA_FILE_NAME -} - -func (storage *StorageS3) tablePrefix(schemaTable IcebergSchemaTable, isIcebergSchemaTable ...bool) string { - if len(isIcebergSchemaTable) > 0 && isIcebergSchemaTable[0] { - return storage.config.StoragePath + "/" + schemaTable.Schema + "/" + schemaTable.Table + "/" - } - - return storage.config.StoragePath + "/" + storage.config.Pg.SchemaPrefix + schemaTable.Schema + "/" + schemaTable.Table + "/" -} - -func (storage *StorageS3) fullBucketPath() string { - return "s3://" + storage.config.Aws.S3Bucket + "/" -} - -func (storage *StorageS3) nestedDirectoryPrefixes(prefix string) (dirs []string, err error) { - ctx := context.Background() - listResponse, err := storage.s3Client.ListObjectsV2(ctx, &s3.ListObjectsV2Input{ - Bucket: aws.String(storage.config.Aws.S3Bucket), - Prefix: aws.String(prefix), - Delimiter: aws.String("/"), - }) - if err != nil { - return nil, fmt.Errorf("failed to list objects: %v", err) - } - - for _, prefix := range listResponse.CommonPrefixes { - dirs = append(dirs, *prefix.Prefix) - } - - return dirs, nil -} - -func (storage *StorageS3) deleteNestedObjects(prefix string) (err error) { - ctx := context.Background() - - listResponse, err := storage.s3Client.ListObjectsV2(ctx, &s3.ListObjectsV2Input{ - Bucket: aws.String(storage.config.Aws.S3Bucket), - Prefix: aws.String(prefix), - }) - if err != nil { - return fmt.Errorf("failed to list objects: %v", err) - } - - var objectsToDelete []types.ObjectIdentifier - for _, obj := range listResponse.Contents { - LogDebug(storage.config, "Object to delete:", *obj.Key) - objectsToDelete = append(objectsToDelete, types.ObjectIdentifier{Key: obj.Key}) - } - - if len(objectsToDelete) > 0 { - _, err = storage.s3Client.DeleteObjects(ctx, &s3.DeleteObjectsInput{ - Bucket: aws.String(storage.config.Aws.S3Bucket), - Delete: &types.Delete{ - Objects: objectsToDelete, - Quiet: aws.Bool(true), - }, - }) - if err != nil { - return fmt.Errorf("failed to delete objects: %v", err) - } - LogDebug(storage.config, "Deleted", len(objectsToDelete), "object(s).") - } else { - LogDebug(storage.config, "No objects to delete.") - } - - return nil -} diff --git a/src/storage_utils.go b/src/storage_utils.go deleted file mode 100644 index 9001a19..0000000 --- a/src/storage_utils.go +++ /dev/null @@ -1,1266 +0,0 @@ -package main - -import ( - "bytes" - "context" - "encoding/json" - "fmt" - "os" - "reflect" - "strings" - "time" - - "github.com/google/uuid" - "github.com/linkedin/goavro" - "github.com/xitongsys/parquet-go/parquet" - "github.com/xitongsys/parquet-go/reader" - "github.com/xitongsys/parquet-go/schema" - "github.com/xitongsys/parquet-go/source" - "github.com/xitongsys/parquet-go/writer" - "golang.org/x/exp/maps" -) - -const ( - PARQUET_PARALLEL_NUMBER = 4 - PARQUET_ROW_GROUP_SIZE = 128 * 1024 * 1024 // 128 MB - PARQUET_PAGE_SIZE = 8 * 1024 // 8 KB - PARQUET_COMPRESSION_TYPE = parquet.CompressionCodec_ZSTD - - ICEBERG_MANIFEST_STATUS_ADDED = 1 - ICEBERG_MANIFEST_STATUS_DELETED = 2 - - ICEBERG_MANIFEST_LIST_OPERATION_APPEND = "append" - ICEBERG_MANIFEST_LIST_OPERATION_OVERWRITE = "overwrite" - ICEBERG_MANIFEST_LIST_OPERATION_DELETE = "delete" - - ICEBERG_METADATA_FILE_NAME = "v1.metadata.json" - INTERNAL_METADATA_FILE_NAME = "bemidb.json" - - MANIFEST_SCHEMA = `{ - "type" : "record", - "name" : "manifest_entry", - "fields" : [ { - "name" : "status", - "type" : "int", - "field-id" : 0 - }, { - "name" : "snapshot_id", - "type" : [ "null", "long" ], - "default" : null, - "field-id" : 1 - }, { - "name" : "sequence_number", - "type" : [ "null", "long" ], - "default" : null, - "field-id" : 3 - }, { - "name" : "file_sequence_number", - "type" : [ "null", "long" ], - "default" : null, - "field-id" : 4 - }, { - "name" : "data_file", - "type" : { - "type" : "record", - "name" : "r2", - "fields" : [ { - "name" : "content", - "type" : "int", - "doc" : "File format name: avro, orc, or parquet", - "field-id" : 134 - }, { - "name" : "file_path", - "type" : "string", - "doc" : "Location URI with FS scheme", - "field-id" : 100 - }, { - "name" : "file_format", - "type" : "string", - "doc" : "File format name: avro, orc, or parquet", - "field-id" : 101 - }, { - "name" : "record_count", - "type" : "long", - "doc" : "Number of records in the file", - "field-id" : 103 - }, { - "name" : "file_size_in_bytes", - "type" : "long", - "doc" : "Total file size in bytes", - "field-id" : 104 - }, { - "name" : "column_sizes", - "type" : [ "null", { - "type" : "array", - "items" : { - "type" : "record", - "name" : "k117_v118", - "fields" : [ { - "name" : "key", - "type" : "int", - "field-id" : 117 - }, { - "name" : "value", - "type" : "long", - "field-id" : 118 - } ] - }, - "logicalType" : "map" - } ], - "doc" : "Map of column id to total size on disk", - "default" : null, - "field-id" : 108 - }, { - "name" : "value_counts", - "type" : [ "null", { - "type" : "array", - "items" : { - "type" : "record", - "name" : "k119_v120", - "fields" : [ { - "name" : "key", - "type" : "int", - "field-id" : 119 - }, { - "name" : "value", - "type" : "long", - "field-id" : 120 - } ] - }, - "logicalType" : "map" - } ], - "doc" : "Map of column id to total count, including null and NaN", - "default" : null, - "field-id" : 109 - }, { - "name" : "null_value_counts", - "type" : [ "null", { - "type" : "array", - "items" : { - "type" : "record", - "name" : "k121_v122", - "fields" : [ { - "name" : "key", - "type" : "int", - "field-id" : 121 - }, { - "name" : "value", - "type" : "long", - "field-id" : 122 - } ] - }, - "logicalType" : "map" - } ], - "doc" : "Map of column id to null value count", - "default" : null, - "field-id" : 110 - }, { - "name" : "nan_value_counts", - "type" : [ "null", { - "type" : "array", - "items" : { - "type" : "record", - "name" : "k138_v139", - "fields" : [ { - "name" : "key", - "type" : "int", - "field-id" : 138 - }, { - "name" : "value", - "type" : "long", - "field-id" : 139 - } ] - }, - "logicalType" : "map" - } ], - "doc" : "Map of column id to number of NaN values in the column", - "default" : null, - "field-id" : 137 - }, { - "name" : "lower_bounds", - "type" : [ "null", { - "type" : "array", - "items" : { - "type" : "record", - "name" : "k126_v127", - "fields" : [ { - "name" : "key", - "type" : "int", - "field-id" : 126 - }, { - "name" : "value", - "type" : "bytes", - "field-id" : 127 - } ] - }, - "logicalType" : "map" - } ], - "doc" : "Map of column id to lower bound", - "default" : null, - "field-id" : 125 - }, { - "name" : "upper_bounds", - "type" : [ "null", { - "type" : "array", - "items" : { - "type" : "record", - "name" : "k129_v130", - "fields" : [ { - "name" : "key", - "type" : "int", - "field-id" : 129 - }, { - "name" : "value", - "type" : "bytes", - "field-id" : 130 - } ] - }, - "logicalType" : "map" - } ], - "doc" : "Map of column id to upper bound", - "default" : null, - "field-id" : 128 - }, { - "name" : "key_metadata", - "type" : [ "null", "bytes" ], - "doc" : "Encryption key metadata blob", - "default" : null, - "field-id" : 131 - }, { - "name" : "split_offsets", - "type" : [ "null", { - "type" : "array", - "items" : "long", - "element-id" : 133 - } ], - "doc" : "Splittable offsets", - "default" : null, - "field-id" : 132 - }, { - "name" : "equality_ids", - "type" : [ "null", { - "type" : "array", - "items" : "long", - "element-id" : 136 - } ], - "doc" : "Field ids used to determine row equality in equality delete files.", - "default" : null, - "field-id" : 135 - }, { - "name" : "sort_order_id", - "type" : [ "null", "int" ], - "doc" : "ID representing sort order for this file", - "default" : null, - "field-id" : 140 - } ] - }, - "field-id" : 2 - } ] - }` - MANIFEST_LIST_SCHEMA = `{ - "type" : "record", - "name" : "manifest_file", - "fields" : [ { - "name" : "manifest_path", - "type" : "string", - "doc" : "Location URI with FS scheme", - "field-id" : 500 - }, { - "name" : "manifest_length", - "type" : "long", - "field-id" : 501 - }, { - "name" : "partition_spec_id", - "type" : "int", - "field-id" : 502 - }, { - "name" : "content", - "type" : "int", - "field-id" : 517 - }, { - "name" : "sequence_number", - "type" : "long", - "field-id" : 515 - }, { - "name" : "min_sequence_number", - "type" : "long", - "field-id" : 516 - }, { - "name" : "added_snapshot_id", - "type" : "long", - "field-id" : 503 - }, { - "name" : "added_files_count", - "type" : "int", - "field-id" : 504 - }, { - "name" : "existing_files_count", - "type" : "int", - "field-id" : 505 - }, { - "name" : "deleted_files_count", - "type" : "int", - "field-id" : 506 - }, { - "name" : "added_rows_count", - "type" : "long", - "field-id" : 512 - }, { - "name" : "existing_rows_count", - "type" : "long", - "field-id" : 513 - }, { - "name" : "deleted_rows_count", - "type" : "long", - "field-id" : 514 - }, { - "name" : "partitions", - "type" : [ "null", { - "type" : "array", - "items" : { - "type" : "record", - "name" : "r508", - "fields" : [ { - "name" : "contains_null", - "type" : "boolean", - "field-id" : 509 - }, { - "name" : "contains_nan", - "type" : [ "null", "boolean" ], - "default" : null, - "field-id" : 518 - }, { - "name" : "lower_bound", - "type" : [ "null", "bytes" ], - "default" : null, - "field-id" : 510 - }, { - "name" : "upper_bound", - "type" : [ "null", "bytes" ], - "default" : null, - "field-id" : 511 - } ] - }, - "element-id" : 508 - } ], - "default" : null, - "field-id" : 507 - }, { - "name" : "key_metadata", - "type" : [ "null", "bytes" ], - "default" : null, - "field-id" : 519 - } ] - }` -) - -type MetadataJson struct { - Schemas []struct { - Fields []struct { - ID int `json:"id"` - Name string `json:"name"` - Type interface{} `json:"type"` - Required bool `json:"required"` - } `json:"fields"` - } `json:"schemas"` -} - -type ManifestListsJson struct { - Snapshots []struct { - SequenceNumber int `json:"sequence-number"` - SnapshotId int64 `json:"snapshot-id"` - TimestampMs int64 `json:"timestamp-ms"` - Path string `json:"manifest-list"` - Summary struct { - Operation string `json:"operation"` - AddedFilesSize string `json:"added-files-size"` - AddedDataFiles string `json:"added-data-files"` - AddedRecords string `json:"added-records"` - RemovedFilesSize string `json:"removed-files-size"` - DeletedDataFiles string `json:"deleted-data-files"` - DeletedRecords string `json:"deleted-records"` - } `json:"summary"` - } `json:"snapshots"` -} - -type ManifestListSequenceStats struct { - AddedFilesSize int64 - AddedDataFiles int64 - AddedRecords int64 - RemovedFilesSize int64 - DeletedDataFiles int64 - DeletedRecords int64 -} - -type StorageUtils struct { - config *Config -} - -// Read ---------------------------------------------------------------------------------------------------------------- - -func (storage *StorageUtils) ParseIcebergTableFields(metadataContent []byte) ([]IcebergTableField, error) { - var metadataJson MetadataJson - err := json.Unmarshal(metadataContent, &metadataJson) - if err != nil { - return nil, err - } - - var icebergTableFields []IcebergTableField - for _, schema := range metadataJson.Schemas { - if schema.Fields != nil { - for _, field := range schema.Fields { - icebergTableField := IcebergTableField{ - Name: field.Name, - } - - if reflect.TypeOf(field.Type).Kind() == reflect.String { - icebergTableField.Type = field.Type.(string) - icebergTableField.Required = field.Required - } else { - listType := field.Type.(map[string]interface{}) - icebergTableField.Type = listType["element"].(string) - icebergTableField.Required = listType["element-required"].(bool) - icebergTableField.IsList = true - } - - icebergTableFields = append(icebergTableFields, icebergTableField) - } - } - } - - return icebergTableFields, nil -} - -func (storage *StorageUtils) ParseInternalTableMetadata(internalMetadataContent []byte) (InternalTableMetadata, error) { - var internalTableMetadata InternalTableMetadata - err := json.Unmarshal(internalMetadataContent, &internalTableMetadata) - if err != nil { - return InternalTableMetadata{}, err - } - return internalTableMetadata, nil -} - -func (storage *StorageUtils) ParseManifestListFiles(fileSystemPrefix string, metadataContent []byte) ([]ManifestListFile, error) { - var manifestListsJson ManifestListsJson - err := json.Unmarshal(metadataContent, &manifestListsJson) - if err != nil { - return nil, err - } - - manifestListFilesSortedAsc := []ManifestListFile{} - for _, snapshot := range manifestListsJson.Snapshots { - addedFilesSize, err := StringToInt64(snapshot.Summary.AddedFilesSize) - if err != nil { - return nil, err - } - addedDataFiles, err := StringToInt64(snapshot.Summary.AddedDataFiles) - if err != nil { - return nil, err - } - addedRecords, err := StringToInt64(snapshot.Summary.AddedRecords) - if err != nil { - return nil, err - } - removedFilesSize, err := StringToInt64(snapshot.Summary.RemovedFilesSize) - if err != nil { - return nil, err - } - deletedDataFiles, err := StringToInt64(snapshot.Summary.DeletedDataFiles) - if err != nil { - return nil, err - } - deletedRecords, err := StringToInt64(snapshot.Summary.DeletedRecords) - if err != nil { - return nil, err - } - - manifestListFile := ManifestListFile{ - SequenceNumber: snapshot.SequenceNumber, - SnapshotId: snapshot.SnapshotId, - TimestampMs: snapshot.TimestampMs, - Path: strings.TrimPrefix(snapshot.Path, fileSystemPrefix), - Operation: snapshot.Summary.Operation, - AddedFilesSize: addedFilesSize, - AddedDataFiles: addedDataFiles, - AddedRecords: addedRecords, - RemovedFilesSize: removedFilesSize, - DeletedDataFiles: deletedDataFiles, - DeletedRecords: deletedRecords, - } - - manifestListFilesSortedAsc = append(manifestListFilesSortedAsc, manifestListFile) - } - - return manifestListFilesSortedAsc, nil -} - -func (storage *StorageUtils) ParseManifestFiles(fileSystemPrefix string, manifestListContent []byte) ([]ManifestListItem, error) { - ocfReader, err := goavro.NewOCFReader(strings.NewReader(string(manifestListContent))) - if err != nil { - return nil, err - } - - manifestListItemsSortedDesc := []ManifestListItem{} - - for ocfReader.Scan() { - record, err := ocfReader.Read() - if err != nil { - return nil, err - } - - recordMap := record.(map[string]interface{}) - - manifestListItemsSortedDesc = append(manifestListItemsSortedDesc, ManifestListItem{ - ManifestFile: ManifestFile{ - SnapshotId: recordMap["added_snapshot_id"].(int64), - Path: strings.TrimPrefix(recordMap["manifest_path"].(string), fileSystemPrefix), - Size: recordMap["manifest_length"].(int64), - RecordCount: recordMap["added_rows_count"].(int64), - }, - SequenceNumber: int(recordMap["sequence_number"].(int64)), - }) - } - - return manifestListItemsSortedDesc, nil -} - -func (storage *StorageUtils) ParseParquetFilePath(fileSystemPrefix string, manifestContent []byte) (string, error) { - ocfReader, err := goavro.NewOCFReader(strings.NewReader(string(manifestContent))) - if err != nil { - return "", err - } - - ocfReader.Scan() - record, err := ocfReader.Read() - if err != nil { - return "", err - } - - recordMap := record.(map[string]interface{}) - dataFile := recordMap["data_file"].(map[string]interface{}) - - return strings.TrimPrefix(dataFile["file_path"].(string), fileSystemPrefix), nil -} - -// Write --------------------------------------------------------------------------------------------------------------- - -func (storage *StorageUtils) WriteParquetFile(fileWriter source.ParquetFile, pgSchemaColumns []PgSchemaColumn, maxPayloadThreshold int, loadRows func() ([][]string, InternalTableMetadata)) (recordCount int64, internalTableMetadata InternalTableMetadata, err error) { - defer fileWriter.Close() - - schemaJson := storage.buildSchemaJson(pgSchemaColumns) - LogDebug(storage.config, "Parquet schema:", schemaJson) - parquetWriter, err := writer.NewJSONWriter(schemaJson, fileWriter, PARQUET_PARALLEL_NUMBER) - if err != nil { - return recordCount, internalTableMetadata, fmt.Errorf("failed to create Parquet writer: %v", err) - } - parquetWriter.RowGroupSize = PARQUET_ROW_GROUP_SIZE - parquetWriter.PageSize = PARQUET_PAGE_SIZE - parquetWriter.CompressionType = PARQUET_COMPRESSION_TYPE - - writtenPayloadSize := 0 - rows, lastInternalTableMetadata := loadRows() - - for len(rows) > 0 { - for _, row := range rows { - rowMap := make(map[string]interface{}) - for i, rowValue := range row { - rowMap[pgSchemaColumns[i].NormalizedColumnName()] = pgSchemaColumns[i].FormatParquetValue(rowValue) - } - rowJson, err := json.Marshal(rowMap) - PanicIfError(storage.config, err) - - if err = parquetWriter.Write(string(rowJson)); err != nil { - return recordCount, internalTableMetadata, fmt.Errorf("Write error: %v", err) - } - writtenPayloadSize += len(rowJson) - recordCount++ - } - - if maxPayloadThreshold > 0 && writtenPayloadSize >= maxPayloadThreshold { - break - } - - rows, lastInternalTableMetadata = loadRows() - } - - LogDebug(storage.config, "Stopping Parquet writer...") - if err := parquetWriter.WriteStop(); err != nil { - return recordCount, internalTableMetadata, fmt.Errorf("failed to stop Parquet writer: %v", err) - } - - return recordCount, lastInternalTableMetadata, nil -} - -func (storage *StorageUtils) NewDuckDBIfHasOverlappingRows(fileSystemPrefix string, existingParquetFilePath string, newParquetFilePath string, pgSchemaColumns []PgSchemaColumn) (*Duckdb, error) { - duckdb := NewDuckdb(storage.config, false) - - ctx := context.Background() - _, err := duckdb.ExecContext(ctx, "CREATE TABLE existing_parquet AS SELECT * FROM read_parquet('"+fileSystemPrefix+existingParquetFilePath+"')", nil) - if err != nil { - return nil, err - } - - _, err = duckdb.ExecContext(ctx, "CREATE TABLE new_parquet AS SELECT * FROM read_parquet('"+fileSystemPrefix+newParquetFilePath+"')", nil) - if err != nil { - return nil, err - } - - var pkColumnNames []string - for _, pgSchemaColumn := range pgSchemaColumns { - if pgSchemaColumn.PartOfPrimaryKey { - pkColumnNames = append(pkColumnNames, pgSchemaColumn.ColumnName) - } - } - - hasOverlappingRows, err := storage.hasOverlappingRows(pkColumnNames, duckdb) - if err != nil { - return nil, err - } - - if hasOverlappingRows { - return duckdb, nil - } - return nil, nil -} - -func (storage *StorageUtils) WriteOverwrittenParquetFile(duckdb *Duckdb, fileWriter source.ParquetFile, pgSchemaColumns []PgSchemaColumn, dynamicRowCountPerBatch int) (recordCount int64, err error) { - defer fileWriter.Close() - - schemaJson := storage.buildSchemaJson(pgSchemaColumns) - LogDebug(storage.config, "Parquet schema:", schemaJson) - parquetWriter, err := writer.NewJSONWriter(schemaJson, fileWriter, PARQUET_PARALLEL_NUMBER) - if err != nil { - return 0, fmt.Errorf("failed to create Parquet writer: %v", err) - } - parquetWriter.RowGroupSize = PARQUET_ROW_GROUP_SIZE - parquetWriter.CompressionType = PARQUET_COMPRESSION_TYPE - - existingColumnNames := storage.existingColumnNames(duckdb) - var pkColumnNames []string - var columnNames []string - for _, pgSchemaColumn := range pgSchemaColumns { - if !existingColumnNames.Contains(pgSchemaColumn.ColumnName) { - continue - } - if pgSchemaColumn.PartOfPrimaryKey { - pkColumnNames = append(pkColumnNames, pgSchemaColumn.ColumnName) - } - columnNames = append(columnNames, pgSchemaColumn.ColumnName) - } - - batch := 0 - ctx := context.Background() - sql := storage.selectNonOverlappingRowsSql(columnNames, pkColumnNames) - for { - rowCountInBatch := 0 - rows, err := duckdb.QueryContext(ctx, sql+" LIMIT "+IntToString(dynamicRowCountPerBatch)+" OFFSET "+IntToString(batch*dynamicRowCountPerBatch)) - if err != nil { - return 0, fmt.Errorf("failed to query non-overlapping rows: %v", err) - } - defer rows.Close() - - for rows.Next() { - var rowJson string - if err = rows.Scan(&rowJson); err != nil { - return 0, fmt.Errorf("failed to scan row: %v", err) - } - - if err = parquetWriter.Write(string(rowJson)); err != nil { - return 0, fmt.Errorf("Write error: %v", err) - } - - rowCountInBatch++ - recordCount++ - } - - if rowCountInBatch < dynamicRowCountPerBatch { - break - } - - batch++ - } - - LogDebug(storage.config, "Stopping Parquet writer...") - if err := parquetWriter.WriteStop(); err != nil { - return 0, fmt.Errorf("failed to stop overwritten-Parquet writer: %v", err) - } - - return recordCount, nil -} - -func (storage *StorageUtils) ReadParquetStats(fileReader source.ParquetFile) (parquetFileStats ParquetFileStats, err error) { - defer fileReader.Close() - - pr, err := reader.NewParquetReader(fileReader, nil, 1) - if err != nil { - return ParquetFileStats{}, fmt.Errorf("failed to create Parquet reader: %v", err) - } - defer pr.ReadStop() - - parquetStats := ParquetFileStats{ - ColumnSizes: make(map[int]int64), - ValueCounts: make(map[int]int64), - NullValueCounts: make(map[int]int64), - LowerBounds: make(map[int][]byte), - UpperBounds: make(map[int][]byte), - SplitOffsets: []int64{}, - } - - fieldIDMap := storage.buildFieldIDMap(pr.SchemaHandler) - - for _, rowGroup := range pr.Footer.RowGroups { - if rowGroup.FileOffset != nil { - parquetStats.SplitOffsets = append(parquetStats.SplitOffsets, *rowGroup.FileOffset) - } - - for _, columnChunk := range rowGroup.Columns { - columnMetaData := columnChunk.MetaData - columnPath := columnMetaData.PathInSchema - columnName := strings.Join(columnPath, ".") - fieldID, ok := fieldIDMap[columnName] - if !ok { - continue - } - parquetStats.ColumnSizes[fieldID] += columnMetaData.TotalCompressedSize - parquetStats.ValueCounts[fieldID] += int64(columnMetaData.NumValues) - - if columnMetaData.Statistics != nil { - if columnMetaData.Statistics.NullCount != nil { - parquetStats.NullValueCounts[fieldID] += *columnMetaData.Statistics.NullCount - } - - minValue := columnMetaData.Statistics.Min - maxValue := columnMetaData.Statistics.Max - - if parquetStats.LowerBounds[fieldID] == nil || bytes.Compare(parquetStats.LowerBounds[fieldID], minValue) > 0 { - parquetStats.LowerBounds[fieldID] = minValue - } - if parquetStats.UpperBounds[fieldID] == nil || bytes.Compare(parquetStats.UpperBounds[fieldID], maxValue) < 0 { - parquetStats.UpperBounds[fieldID] = maxValue - } - } - } - } - - // Todo: convert lower/upper bytes to BigEndianBytes? - - return parquetStats, nil -} - -func (storage *StorageUtils) WriteManifestFile(fileSystemPrefix string, filePath string, parquetFile ParquetFile) (manifestFile ManifestFile, err error) { - snapshotId := time.Now().UnixNano() - codec, err := goavro.NewCodec(MANIFEST_SCHEMA) - if err != nil { - return ManifestFile{}, fmt.Errorf("failed to create Avro codec: %v", err) - } - - columnSizesArr := []interface{}{} - for fieldID, size := range parquetFile.Stats.ColumnSizes { - columnSizesArr = append(columnSizesArr, map[string]interface{}{ - "key": fieldID, - "value": size, - }) - } - - valueCountsArr := []interface{}{} - for fieldID, count := range parquetFile.Stats.ValueCounts { - valueCountsArr = append(valueCountsArr, map[string]interface{}{ - "key": fieldID, - "value": count, - }) - } - - nullValueCountsArr := []interface{}{} - for fieldID, count := range parquetFile.Stats.NullValueCounts { - nullValueCountsArr = append(nullValueCountsArr, map[string]interface{}{ - "key": fieldID, - "value": count, - }) - } - - lowerBoundsArr := []interface{}{} - for fieldID, value := range parquetFile.Stats.LowerBounds { - lowerBoundsArr = append(lowerBoundsArr, map[string]interface{}{ - "key": fieldID, - "value": value, - }) - } - - upperBoundsArr := []interface{}{} - for fieldID, value := range parquetFile.Stats.UpperBounds { - upperBoundsArr = append(upperBoundsArr, map[string]interface{}{ - "key": fieldID, - "value": value, - }) - } - - dataFile := map[string]interface{}{ - "content": 0, // 0: DATA, 1: POSITION DELETES, 2: EQUALITY DELETES - "file_path": fileSystemPrefix + parquetFile.Path, - "file_format": "PARQUET", - "partition": map[string]interface{}{}, - "record_count": parquetFile.RecordCount, - "file_size_in_bytes": parquetFile.Size, - "column_sizes": map[string]interface{}{ - "array": columnSizesArr, - }, - "value_counts": map[string]interface{}{ - "array": valueCountsArr, - }, - "null_value_counts": map[string]interface{}{ - "array": nullValueCountsArr, - }, - "nan_value_counts": map[string]interface{}{ - "array": []interface{}{}, - }, - "lower_bounds": map[string]interface{}{ - "array": lowerBoundsArr, - }, - "upper_bounds": map[string]interface{}{ - "array": upperBoundsArr, - }, - "key_metadata": nil, - "split_offsets": map[string]interface{}{ - "array": parquetFile.Stats.SplitOffsets, - }, - "equality_ids": nil, - "sort_order_id": nil, - } - - manifestEntry := map[string]interface{}{ - "status": ICEBERG_MANIFEST_STATUS_ADDED, - "snapshot_id": map[string]interface{}{"long": snapshotId}, - "sequence_number": nil, - "file_sequence_number": nil, - "data_file": dataFile, - } - - avroFile, err := os.Create(filePath) - if err != nil { - return ManifestFile{}, fmt.Errorf("failed to create manifest file: %v", err) - } - defer avroFile.Close() - - ocfWriter, err := goavro.NewOCFWriter(goavro.OCFConfig{ - W: avroFile, - Codec: codec, - Schema: MANIFEST_SCHEMA, - }) - if err != nil { - return ManifestFile{}, fmt.Errorf("failed to create Avro OCF writer: %v", err) - } - - err = ocfWriter.Append([]interface{}{manifestEntry}) - if err != nil { - return ManifestFile{}, fmt.Errorf("failed to write to manifest file: %v", err) - } - - fileInfo, err := os.Stat(filePath) - if err != nil { - return ManifestFile{}, fmt.Errorf("failed to get manifest file info: %v", err) - } - fileSize := fileInfo.Size() - - return ManifestFile{ - SnapshotId: snapshotId, - Path: filePath, - Size: fileSize, - RecordCount: parquetFile.RecordCount, - DataFileSize: parquetFile.Size, - }, nil -} - -func (storage *StorageUtils) WriteDeletedRecordsManifestFile(fileSystemPrefix string, filePath string, existingManifestContent []byte) (ManifestFile, error) { - ocfReader, err := goavro.NewOCFReader(strings.NewReader(string(existingManifestContent))) - if err != nil { - return ManifestFile{}, err - } - - ocfReader.Scan() - record, err := ocfReader.Read() - if err != nil { - return ManifestFile{}, err - } - - recordMap := record.(map[string]interface{}) - recordMap["status"] = ICEBERG_MANIFEST_STATUS_DELETED - recordMap["sequence_number"] = map[string]interface{}{"long": 1} - recordMap["file_sequence_number"] = map[string]interface{}{"long": 1} - - avroFile, err := os.Create(filePath) - if err != nil { - return ManifestFile{}, fmt.Errorf("failed to create deleted-records manifest file: %v", err) - } - defer avroFile.Close() - - codec, err := goavro.NewCodec(MANIFEST_SCHEMA) - if err != nil { - return ManifestFile{}, fmt.Errorf("failed to create Avro codec: %v", err) - } - - ocfWriter, err := goavro.NewOCFWriter(goavro.OCFConfig{ - W: avroFile, - Codec: codec, - Schema: MANIFEST_SCHEMA, - }) - if err != nil { - return ManifestFile{}, fmt.Errorf("failed to create Avro OCF writer: %v", err) - } - - err = ocfWriter.Append([]interface{}{recordMap}) - if err != nil { - return ManifestFile{}, fmt.Errorf("failed to write to manifest file: %v", err) - } - - fileInfo, err := os.Stat(filePath) - if err != nil { - return ManifestFile{}, fmt.Errorf("failed to get manifest file info: %v", err) - } - fileSize := fileInfo.Size() - - return ManifestFile{ - RecordsDeleted: true, - SnapshotId: recordMap["snapshot_id"].(map[string]interface{})["long"].(int64), - Path: filePath, - Size: fileSize, - RecordCount: recordMap["data_file"].(map[string]interface{})["record_count"].(int64), - DataFileSize: recordMap["data_file"].(map[string]interface{})["file_size_in_bytes"].(int64), - }, nil -} - -func (storage *StorageUtils) WriteManifestListFile(fileSystemPrefix string, filePath string, manifestListItemsSortedDesc []ManifestListItem) (ManifestListFile, error) { - codec, err := goavro.NewCodec(MANIFEST_LIST_SCHEMA) - if err != nil { - return ManifestListFile{}, fmt.Errorf("failed to create Avro codec for manifest list: %v", err) - } - - var manifestListRecords []interface{} - - statsBySequenceNumber := make(map[string]ManifestListSequenceStats) - - for _, manifestListItem := range manifestListItemsSortedDesc { - sequenceNumber := manifestListItem.SequenceNumber - sequenceStats := statsBySequenceNumber[IntToString(sequenceNumber)] - manifestFile := manifestListItem.ManifestFile - - manifestListRecord := map[string]interface{}{ - "added_snapshot_id": manifestFile.SnapshotId, - "manifest_length": manifestFile.Size, - "manifest_path": fileSystemPrefix + manifestFile.Path, - "min_sequence_number": sequenceNumber, - "sequence_number": sequenceNumber, - "content": 0, - "deleted_files_count": 0, - "deleted_rows_count": 0, - "existing_files_count": 0, - "existing_rows_count": 0, - "key_metadata": nil, - "partition_spec_id": 0, - "partitions": map[string]interface{}{"array": []string{}}, - } - - if manifestFile.RecordsDeleted { - manifestListRecord["added_files_count"] = 0 - manifestListRecord["added_rows_count"] = 0 - manifestListRecord["deleted_files_count"] = 1 - manifestListRecord["deleted_rows_count"] = manifestFile.RecordCount - sequenceStats.RemovedFilesSize += manifestFile.DataFileSize - sequenceStats.DeletedDataFiles += 1 - sequenceStats.DeletedRecords += manifestFile.RecordCount - } else { - manifestListRecord["added_files_count"] = 1 - manifestListRecord["added_rows_count"] = manifestFile.RecordCount - manifestListRecord["deleted_files_count"] = 0 - manifestListRecord["deleted_rows_count"] = 0 - sequenceStats.AddedFilesSize += manifestFile.DataFileSize - sequenceStats.AddedDataFiles += 1 - sequenceStats.AddedRecords += manifestFile.RecordCount - } - - statsBySequenceNumber[IntToString(sequenceNumber)] = sequenceStats - manifestListRecords = append(manifestListRecords, manifestListRecord) - } - - avroFile, err := os.Create(filePath) - if err != nil { - return ManifestListFile{}, fmt.Errorf("failed to create manifest list file: %v", err) - } - defer avroFile.Close() - - ocfWriter, err := goavro.NewOCFWriter(goavro.OCFConfig{ - W: avroFile, - Codec: codec, - Schema: MANIFEST_LIST_SCHEMA, - }) - if err != nil { - return ManifestListFile{}, fmt.Errorf("failed to create OCF writer for manifest list: %v", err) - } - - err = ocfWriter.Append(manifestListRecords) - if err != nil { - return ManifestListFile{}, fmt.Errorf("failed to write manifest list record: %v", err) - } - - sequenceNumbers := maps.Keys(statsBySequenceNumber) - lastManifestListItem := manifestListItemsSortedDesc[0] - lastSequenceStats := statsBySequenceNumber[IntToString(lastManifestListItem.SequenceNumber)] - - operation := ICEBERG_MANIFEST_LIST_OPERATION_APPEND - if len(sequenceNumbers) == 1 && len(manifestListRecords) == 2 && lastSequenceStats.AddedDataFiles == 1 && lastSequenceStats.DeletedDataFiles == 1 { - operation = ICEBERG_MANIFEST_LIST_OPERATION_OVERWRITE - } else if lastSequenceStats.AddedDataFiles == 0 && lastSequenceStats.DeletedDataFiles > 0 { - operation = ICEBERG_MANIFEST_LIST_OPERATION_DELETE - } - - manifestListFile := ManifestListFile{ - SequenceNumber: lastManifestListItem.SequenceNumber, - SnapshotId: lastManifestListItem.ManifestFile.SnapshotId, - TimestampMs: time.Now().UnixNano() / int64(time.Millisecond), - Path: filePath, - Operation: operation, - AddedFilesSize: lastSequenceStats.AddedFilesSize, - AddedDataFiles: lastSequenceStats.AddedDataFiles, - AddedRecords: lastSequenceStats.AddedRecords, - RemovedFilesSize: lastSequenceStats.RemovedFilesSize, - DeletedDataFiles: lastSequenceStats.DeletedDataFiles, - DeletedRecords: lastSequenceStats.DeletedRecords, - } - return manifestListFile, nil -} - -func (storage *StorageUtils) WriteMetadataFile(fileSystemPrefix string, filePath string, pgSchemaColumns []PgSchemaColumn, manifestListFilesSortedAsc []ManifestListFile) (err error) { - tableUuid := uuid.New().String() - lastColumnID := 3 - - icebergSchemaFields := make([]interface{}, len(pgSchemaColumns)) - for i, pgSchemaColumn := range pgSchemaColumns { - icebergSchemaFields[i] = pgSchemaColumn.ToIcebergSchemaFieldMap() - } - - snapshots := make([]map[string]interface{}, len(manifestListFilesSortedAsc)) - snapshotLog := make([]map[string]interface{}, len(manifestListFilesSortedAsc)) - - var totalDataFiles, totalFilesSize, totalRecords int64 - - for i, manifestListFile := range manifestListFilesSortedAsc { - totalDataFiles += manifestListFile.AddedDataFiles - manifestListFile.DeletedDataFiles - totalFilesSize += manifestListFile.AddedFilesSize - manifestListFile.RemovedFilesSize - totalRecords += manifestListFile.AddedRecords - manifestListFile.DeletedRecords - - snapshot := map[string]interface{}{ - "schema-id": 0, - "snapshot-id": manifestListFile.SnapshotId, - "sequence-number": manifestListFile.SequenceNumber, - "timestamp-ms": manifestListFile.TimestampMs, - "manifest-list": fileSystemPrefix + manifestListFile.Path, - "summary": map[string]interface{}{ - "operation": manifestListFile.Operation, - "added-data-files": Int64ToString(manifestListFile.AddedDataFiles), - "added-files-size": Int64ToString(manifestListFile.AddedFilesSize), - "added-records": Int64ToString(manifestListFile.AddedRecords), - "deleted-data-files": Int64ToString(manifestListFile.DeletedDataFiles), - "deleted-records": Int64ToString(manifestListFile.DeletedRecords), - "removed-files-size": Int64ToString(manifestListFile.RemovedFilesSize), - "total-data-files": Int64ToString(totalDataFiles), - "total-files-size": Int64ToString(totalFilesSize), - "total-records": Int64ToString(totalRecords), - "total-delete-files": "0", - "total-equality-deletes": "0", - "total-position-deletes": "0", - }, - } - if i != 0 { - snapshot["parent-snapshot-id"] = manifestListFilesSortedAsc[i-1].SnapshotId - } - snapshots[i] = snapshot - - snapshotLog[i] = map[string]interface{}{ - "snapshot-id": manifestListFile.SnapshotId, - "timestamp-ms": manifestListFile.TimestampMs, - } - } - - lastManifestListFile := manifestListFilesSortedAsc[len(manifestListFilesSortedAsc)-1] - metadata := map[string]interface{}{ - "format-version": 2, - "table-uuid": tableUuid, - "statistics": []interface{}{}, - "location": fileSystemPrefix + filePath, - "last-sequence-number": lastManifestListFile.SequenceNumber, - "last-updated-ms": lastManifestListFile.TimestampMs, - "last-column-id": lastColumnID, - "schemas": []interface{}{ - map[string]interface{}{ - "type": "struct", - "schema-id": 0, - "fields": icebergSchemaFields, - "identifier-field-ids": []interface{}{}, - }, - }, - "current-schema-id": 0, - "partition-specs": []interface{}{ - map[string]interface{}{ - "spec-id": 0, - "fields": []interface{}{}, - }, - }, - "default-spec-id": 0, - "default-sort-order-id": 0, - "last-partition-id": 999, // Assuming no partitions; set to a placeholder - "properties": map[string]string{}, - "current-snapshot-id": lastManifestListFile.SnapshotId, - "refs": map[string]interface{}{ - "main": map[string]interface{}{ - "snapshot-id": lastManifestListFile.SnapshotId, - "type": "branch", - }, - }, - "snapshots": snapshots, - "snapshot-log": snapshotLog, - "metadata-log": []interface{}{}, - "sort-orders": []interface{}{ - map[string]interface{}{ - "order-id": 0, - "fields": []interface{}{}, - }, - }, - } - - file, err := os.Create(filePath) - if err != nil { - return fmt.Errorf("failed to create metadata file: %v", err) - } - defer file.Close() - - encoder := json.NewEncoder(file) - encoder.SetIndent("", " ") - err = encoder.Encode(metadata) - if err != nil { - return fmt.Errorf("failed to write metadata to file: %v", err) - } - - return nil -} - -func (storage *StorageUtils) WriteVersionHintFile(filePath string, metadataFile MetadataFile) (err error) { - file, err := os.Create(filePath) - if err != nil { - return fmt.Errorf("failed to create version hint file: %v", err) - } - defer file.Close() - - _, err = file.WriteString(fmt.Sprintf("%d", metadataFile.Version)) - if err != nil { - return fmt.Errorf("failed to write to version hint file: %v", err) - } - - return nil -} - -func (storage *StorageUtils) WriteInternalStartSqlFile(filePath string, queries []string) (err error) { - file, err := os.Create(filePath) - if err != nil { - return fmt.Errorf("failed to create internal start SQL file: %v", err) - } - defer file.Close() - - _, err = file.WriteString(strings.Join(queries, "\n")) - if err != nil { - return fmt.Errorf("failed to write to internal start SQL file: %v", err) - } - - return nil -} - -func (storage *StorageUtils) WriteInternalTableMetadataFile(filePath string, internalTableMetadata InternalTableMetadata) error { - file, err := os.Create(filePath) - if err != nil { - return fmt.Errorf("failed to create internal table metadata file: %v", err) - } - defer file.Close() - - jsonData, err := json.Marshal(internalTableMetadata) - if err != nil { - return fmt.Errorf("failed to serialize internal table metadata to JSON: %v", err) - } - - _, err = file.Write(jsonData) - if err != nil { - return fmt.Errorf("failed to write internal table metadata to file: %v", err) - } - - return nil - -} - -// --------------------------------------------------------------------------------------------------------------------- - -func (storage *StorageUtils) existingColumnNames(duckdb *Duckdb) Set[string] { - rows, err := duckdb.QueryContext(context.Background(), "SELECT * FROM existing_parquet LIMIT 0") - PanicIfError(storage.config, err) - defer rows.Close() - - columns, err := rows.Columns() - PanicIfError(storage.config, err) - - return NewSet(columns) -} - -func (storage *StorageUtils) hasOverlappingRows(pkColumnNames []string, duckdb *Duckdb) (bool, error) { - sql := "SELECT 1 FROM existing_parquet JOIN new_parquet USING (" + strings.Join(pkColumnNames, ", ") + ") LIMIT 1" - if len(pkColumnNames) == 0 { - sql = "SELECT 1 FROM existing_parquet JOIN new_parquet LIMIT 1" - } - - ctx := context.Background() - rows, err := duckdb.QueryContext(ctx, sql) - if err != nil { - return false, fmt.Errorf("failed to query for overlapping rows: %v", err) - } - defer rows.Close() - - return rows.Next(), nil -} - -func (storage *StorageUtils) selectNonOverlappingRowsSql(columnNames []string, pkColumnNames []string) string { - selectExpressions := []string{} - for _, columnName := range columnNames { - selectExpressions = append(selectExpressions, "\""+columnName+"\""+" := existing_parquet."+columnName) - } - whereConditions := []string{} - if len(pkColumnNames) == 0 { - for _, columnName := range columnNames { - whereConditions = append(whereConditions, "existing_parquet."+columnName+" = new_parquet."+columnName) - } - } else { - for _, pkColumnName := range pkColumnNames { - whereConditions = append(whereConditions, "existing_parquet."+pkColumnName+" = new_parquet."+pkColumnName) - } - } - return "SELECT to_json(struct_pack(" + strings.Join(selectExpressions, ", ") + ")) FROM existing_parquet WHERE NOT EXISTS (SELECT 1 FROM new_parquet WHERE " + strings.Join(whereConditions, " AND ") + ")" -} - -func (storage *StorageUtils) buildSchemaJson(pgSchemaColumns []PgSchemaColumn) string { - schemaMap := map[string]interface{}{ - "Tag": "name=root", - "Fields": []map[string]interface{}{}, - } - for _, pgSchemaColumn := range pgSchemaColumns { - fieldMap := pgSchemaColumn.ToParquetSchemaFieldMap() - schemaMap["Fields"] = append(schemaMap["Fields"].([]map[string]interface{}), fieldMap) - } - schemaJson, err := json.Marshal(schemaMap) - PanicIfError(storage.config, err) - - return string(schemaJson) -} - -func (storage *StorageUtils) buildFieldIDMap(schemaHandler *schema.SchemaHandler) map[string]int { - fieldIDMap := make(map[string]int) - for _, schema := range schemaHandler.SchemaElements { - if schema.FieldID != nil { - fieldIDMap[schema.Name] = int(*schema.FieldID) - } - } - return fieldIDMap -} diff --git a/src/syncer-amplitude/amplitude.go b/src/syncer-amplitude/amplitude.go new file mode 100644 index 0000000..ba86710 --- /dev/null +++ b/src/syncer-amplitude/amplitude.go @@ -0,0 +1,100 @@ +package main + +import ( + "archive/zip" + "bytes" + "compress/gzip" + "encoding/json" + "fmt" + "io" + "net/http" + "time" + + "github.com/BemiHQ/BemiDB/src/syncer-common" +) + +const ( + AMPLITUDE_API_URL = "https://amplitude.com/api/2/export" + AMPLITUDE_TIME_FORMAT = "20060102T15" +) + +type Amplitude struct { + Config *Config + HttpClient *http.Client +} + +func NewAmplitude(config *Config) *Amplitude { + return &Amplitude{ + Config: config, + HttpClient: &http.Client{Timeout: 5 * time.Minute}, + } +} + +func (c *Amplitude) Export(startTime, endTime time.Time) ([]Event, error) { + startString := startTime.UTC().Format(AMPLITUDE_TIME_FORMAT) + endString := endTime.UTC().Format(AMPLITUDE_TIME_FORMAT) + + req, err := http.NewRequest("GET", AMPLITUDE_API_URL, nil) + if err != nil { + return nil, err + } + q := req.URL.Query() + q.Add("start", startString) + q.Add("end", endString) + req.URL.RawQuery = q.Encode() + req.SetBasicAuth(c.Config.ApiKey, c.Config.SecretKey) + + common.LogInfo(c.Config.BaseConfig, "Fetching data from Amplitude from", startString, "to", endString) + resp, err := c.HttpClient.Do(req) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + body, _ := io.ReadAll(resp.Body) + return nil, fmt.Errorf("amplitude API returned status %d: %s", resp.StatusCode, string(body)) + } + common.LogDebug(c.Config.BaseConfig, "Received response from Amplitude:", resp.Status) + + body, err := io.ReadAll(resp.Body) + if err != nil { + return nil, err + } + + zipReader, err := zip.NewReader(bytes.NewReader(body), int64(len(body))) + if err != nil { + return nil, err + } + + var events []Event + for _, zipFile := range zipReader.File { + common.LogInfo(c.Config.BaseConfig, "Processing file:", zipFile.Name) + unzippedFile, err := zipFile.Open() + if err != nil { + return nil, err + } + defer unzippedFile.Close() + + gzipReader, err := gzip.NewReader(unzippedFile) + if err != nil { + return nil, err + } + defer gzipReader.Close() + + decoder := json.NewDecoder(gzipReader) + for { + var event Event + err := decoder.Decode(&event) + if err != nil { + if err == io.EOF { + break // We're done + } + common.PanicIfError(c.Config.BaseConfig, err) + } + events = append(events, event) + } + } + + return events, nil +} diff --git a/src/syncer-amplitude/config.go b/src/syncer-amplitude/config.go new file mode 100644 index 0000000..eb3682a --- /dev/null +++ b/src/syncer-amplitude/config.go @@ -0,0 +1,95 @@ +package main + +import ( + "flag" + "os" + "slices" + "strings" + "time" + + "github.com/BemiHQ/BemiDB/src/syncer-common" +) + +const ( + ENV_API_KEY = "SOURCE_AMPLITUDE_API_KEY" + ENV_SECRET_KEY = "SOURCE_AMPLITUDE_SECRET_KEY" + ENV_START_DATE = "SOURCE_AMPLITUDE_START_DATE" + + DEFAULT_START_DATE = "2025-01-01" +) + +type Config struct { + BaseConfig *common.BaseConfig + ApiKey string + SecretKey string + StartDate time.Time +} + +type configParseValues struct { + StartDate string +} + +var _config Config +var _configParseValues configParseValues + +func init() { + registerFlags() +} + +func registerFlags() { + _config.BaseConfig = &common.BaseConfig{} + + flag.StringVar(&_config.BaseConfig.LogLevel, "log-level", os.Getenv(common.ENV_LOG_LEVEL), `Log level: "ERROR", "WARN", "INFO", "DEBUG", "TRACE". Default: "`+common.DEFAULT_LOG_LEVEL+`"`) + flag.StringVar(&_config.BaseConfig.DestinationSchemaName, "destination-schema-name", os.Getenv(common.ENV_DESTINATION_SCHEMA_NAME), "Destination schema name to store the synced data") + flag.StringVar(&_config.BaseConfig.Trino.DatabaseUrl, "trino-database-url", os.Getenv(common.ENV_TRINO_DATABASE_URL), "Trino database URL to sync to") + flag.StringVar(&_config.BaseConfig.Trino.CatalogName, "trino-catalog-name", os.Getenv(common.ENV_TRINO_CATALOG_NAME), "Trino catalog name") + flag.StringVar(&_config.BaseConfig.Aws.Region, "aws-region", os.Getenv(common.ENV_AWS_REGION), "AWS region") + flag.StringVar(&_config.BaseConfig.Aws.S3Endpoint, "aws-s3-endpoint", os.Getenv(common.ENV_AWS_S3_ENDPOINT), "AWS S3 endpoint. Default: \""+common.DEFAULT_AWS_S3_ENDPOINT+`"`) + flag.StringVar(&_config.BaseConfig.Aws.S3Bucket, "aws-s3-bucket", os.Getenv(common.ENV_AWS_S3_BUCKET), "AWS S3 bucket name") + flag.StringVar(&_config.BaseConfig.Aws.AccessKeyId, "aws-access-key-id", os.Getenv(common.ENV_AWS_ACCESS_KEY_ID), "AWS access key ID") + flag.StringVar(&_config.BaseConfig.Aws.SecretAccessKey, "aws-secret-access-key", os.Getenv(common.ENV_AWS_SECRET_ACCESS_KEY), "AWS secret access key") + flag.BoolVar(&_config.BaseConfig.DisableAnonymousAnalytics, "disable-anonymous-analytics", os.Getenv(common.ENV_DISABLE_ANONYMOUS_ANALYTICS) == "true", "Disable anonymous analytics collection") + + flag.StringVar(&_config.ApiKey, "api-key", os.Getenv(ENV_API_KEY), "Amplitude API Key") + flag.StringVar(&_config.SecretKey, "secret-key", os.Getenv(ENV_SECRET_KEY), "Amplitude Secret Key") + flag.StringVar(&_configParseValues.StartDate, "start-date", os.Getenv(ENV_START_DATE), "Amplitude start date in YYYY-MM-DD format") +} + +func parseFlags() { + flag.Parse() + + if _config.BaseConfig.LogLevel == "" { + _config.BaseConfig.LogLevel = common.DEFAULT_LOG_LEVEL + } else if !slices.Contains(common.LOG_LEVELS, _config.BaseConfig.LogLevel) { + panic("Invalid log level " + _config.BaseConfig.LogLevel + ". Must be one of " + strings.Join(common.LOG_LEVELS, ", ")) + } + if _config.BaseConfig.DestinationSchemaName == "" { + panic("Destination schema name is required") + } + if _config.BaseConfig.Trino.DatabaseUrl == "" { + panic("Trino database URL is required") + } + if _config.BaseConfig.Trino.CatalogName == "" { + panic("Trino catalog name is required") + } + if _config.ApiKey == "" { + panic("Amplitude API key is required") + } + if _config.SecretKey == "" { + panic("Amplitude Secret key is required") + } + + if _configParseValues.StartDate == "" { + _configParseValues.StartDate = DEFAULT_START_DATE + } + parsedStartDate, err := time.Parse("2006-01-02", _configParseValues.StartDate) + if err != nil { + panic("Invalid start date format. Expected YYYY-MM-DD, got: " + _configParseValues.StartDate) + } + _config.StartDate = parsedStartDate +} + +func LoadConfig() *Config { + parseFlags() + return &_config +} diff --git a/src/syncer-amplitude/event.go b/src/syncer-amplitude/event.go new file mode 100644 index 0000000..a90cff1 --- /dev/null +++ b/src/syncer-amplitude/event.go @@ -0,0 +1,330 @@ +package main + +import ( + "encoding/json" + "fmt" + "strconv" + "strings" + "time" + + "github.com/BemiHQ/BemiDB/src/syncer-common" +) + +const ( + EVENTS_TABLE_NAME = "events" +) + +type Event struct { + Adid string `json:"adid"` + AmplitudeAttributionIDs interface{} `json:"amplitude_attribution_ids"` + AmplitudeEventType interface{} `json:"amplitude_event_type"` + AmplitudeID int64 `json:"amplitude_id"` + App int `json:"app"` + City string `json:"city"` + ClientEventTime string `json:"client_event_time"` + ClientUploadTime string `json:"client_upload_time"` + Country string `json:"country"` + Data map[string]interface{} `json:"data"` + DataType string `json:"data_type"` + DeviceBrand string `json:"device_brand"` + DeviceCarrier string `json:"device_carrier"` + DeviceFamily string `json:"device_family"` + DeviceID string `json:"device_id"` + DeviceManufacturer string `json:"device_manufacturer"` + DeviceModel string `json:"device_model"` + DeviceType string `json:"device_type"` + DMA string `json:"dma"` + EventID int64 `json:"event_id"` + EventProperties map[string]interface{} `json:"event_properties"` + EventTime string `json:"event_time"` + EventType string `json:"event_type"` + GlobalUserProperties map[string]interface{} `json:"global_user_properties"` + GroupProperties map[string]interface{} `json:"group_properties"` + Groups map[string]interface{} `json:"groups"` + IDFA string `json:"idfa"` + InsertID string `json:"$insert_id"` + InsertKey interface{} `json:"$insert_key"` + IPAddress string `json:"ip_address"` + IsAttributionEvent interface{} `json:"is_attribution_event"` + Language string `json:"language"` + Library string `json:"library"` + LocationLat interface{} `json:"location_lat"` + LocationLng interface{} `json:"location_lng"` + OSName string `json:"os_name"` + OSVersion string `json:"os_version"` + PartnerID interface{} `json:"partner_id"` + Paying interface{} `json:"paying"` + Plan map[string]interface{} `json:"plan"` + Platform string `json:"platform"` + ProcessedTime string `json:"processed_time"` + Region string `json:"region"` + SampleRate interface{} `json:"sample_rate"` + Schema interface{} `json:"$schema"` + ServerReceivedTime string `json:"server_received_time"` + ServerUploadTime string `json:"server_upload_time"` + SessionID int64 `json:"session_id"` + SourceID interface{} `json:"source_id"` + StartVersion string `json:"start_version"` + UserCreationTime string `json:"user_creation_time"` + UserID string `json:"user_id"` + UserProperties map[string]interface{} `json:"user_properties"` + UUID string `json:"uuid"` + VersionName string `json:"version_name"` +} + +func (e *Event) ToTrinoRow() string { + toVarchar := func(s string) string { + if s == "" { + return "NULL" + } + return "'" + strings.ReplaceAll(s, "'", "''") + "'" + } + + toJsonVarchar := func(data map[string]interface{}) string { + if len(data) == 0 { + return "NULL" + } + bytes, err := json.Marshal(data) + if err != nil { + return "NULL" + } + return toVarchar(string(bytes)) + } + + toInterfaceVarchar := func(i interface{}) string { + if i == nil { + return "NULL" + } + s, ok := i.(string) + if !ok { + bytes, err := json.Marshal(i) + if err != nil { + return "NULL" + } + return toVarchar(string(bytes)) + } + return toVarchar(s) + } + + toFloat64String := func(f interface{}) string { + if f == nil { + return "NULL" + } + val, ok := f.(float64) + if !ok { + return "NULL" + } + return strconv.FormatFloat(val, 'f', -1, 64) + } + + toBoolString := func(b interface{}) string { + if b == nil { + return "NULL" + } + val, ok := b.(bool) + if !ok { + return "NULL" + } + return strconv.FormatBool(val) + } + + parseTime := func(t string) string { + if t == "" { + return "NULL" + } + parsedTime, err := time.Parse("2006-01-02 15:04:05.999999", t) + if err != nil { + parsedTime, err = time.Parse("2006-01-02 15:04:05", t) + if err != nil { + parsedTime, err = time.Parse(time.RFC3339, t) + if err != nil { + return "NULL" + } + } + } + return "TIMESTAMP '" + common.TimeToUtcStringMs(parsedTime) + "'" + } + + return fmt.Sprintf("(%s, %s, %s, %d, %d, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %d, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %d, %s, %s, %s, %s, %s, %s, %s)", + toVarchar(e.Adid), + toInterfaceVarchar(e.AmplitudeAttributionIDs), + toInterfaceVarchar(e.AmplitudeEventType), + e.AmplitudeID, + e.App, + toVarchar(e.City), + parseTime(e.ClientEventTime), + parseTime(e.ClientUploadTime), + toVarchar(e.Country), + toJsonVarchar(e.Data), + toVarchar(e.DataType), + toVarchar(e.DeviceBrand), + toVarchar(e.DeviceCarrier), + toVarchar(e.DeviceFamily), + toVarchar(e.DeviceID), + toVarchar(e.DeviceManufacturer), + toVarchar(e.DeviceModel), + toVarchar(e.DeviceType), + toVarchar(e.DMA), + e.EventID, + toJsonVarchar(e.EventProperties), + parseTime(e.EventTime), + toVarchar(e.EventType), + toJsonVarchar(e.GlobalUserProperties), + toJsonVarchar(e.GroupProperties), + toJsonVarchar(e.Groups), + toVarchar(e.IDFA), + toVarchar(e.InsertID), + toInterfaceVarchar(e.InsertKey), + toVarchar(e.IPAddress), + toBoolString(e.IsAttributionEvent), + toVarchar(e.Language), + toVarchar(e.Library), + toFloat64String(e.LocationLat), + toFloat64String(e.LocationLng), + toVarchar(e.OSName), + toVarchar(e.OSVersion), + toInterfaceVarchar(e.PartnerID), + toBoolString(e.Paying), + toJsonVarchar(e.Plan), + toVarchar(e.Platform), + parseTime(e.ProcessedTime), + toVarchar(e.Region), + toFloat64String(e.SampleRate), + toInterfaceVarchar(e.Schema), + parseTime(e.ServerReceivedTime), + parseTime(e.ServerUploadTime), + e.SessionID, + toInterfaceVarchar(e.SourceID), + toVarchar(e.StartVersion), + parseTime(e.UserCreationTime), + toVarchar(e.UserID), + toJsonVarchar(e.UserProperties), + toVarchar(e.UUID), + toVarchar(e.VersionName), + ) +} + +func (e *Event) String() string { + return fmt.Sprintf("Event{Adid: %s, AmplitudeAttributionIDs: %v, AmplitudeEventType: %v, AmplitudeID: %d, App: %d, City: %s, ClientEventTime: %s, ClientUploadTime: %s, Country: %s, Data: %v, DataType: %s, DeviceBrand: %s, DeviceCarrier: %s, DeviceFamily: %s, DeviceID: %s, DeviceManufacturer: %s, DeviceModel: %s, DeviceType: %s, DMA: %s, EventID: %d, EventProperties: %v, EventTime: %s, EventType: %s, GlobalUserProperties: %v, GroupProperties: %v, Groups: %v, IDFA: %s, InsertID: %s, InsertKey: %v, IPAddress: %s, IsAttributionEvent: %v, Language: %s, Library: %s, LocationLat: %v, LocationLng: %v, OSName: %s, OSVersion: %s, PartnerID: %v, Paying: %v, Plan: %v, Platform: %s, ProcessedTime: %s, Region: %s, SampleRate: %v, Schema: %v, ServerReceivedTime: %s, ServerUploadTime: %s, SessionID: %d, SourceID: %v, StartVersion: %s, UserCreationTime: %s, UserID: %s, UserProperties: %v, UUID: %s, VersionName: %s}", + e.Adid, e.AmplitudeAttributionIDs, e.AmplitudeEventType, e.AmplitudeID, e.App, e.City, e.ClientEventTime, e.ClientUploadTime, e.Country, e.Data, e.DataType, e.DeviceBrand, e.DeviceCarrier, e.DeviceFamily, e.DeviceID, e.DeviceManufacturer, e.DeviceModel, e.DeviceType, e.DMA, e.EventID, e.EventProperties, e.EventTime, e.EventType, e.GlobalUserProperties, e.GroupProperties, e.Groups, e.IDFA, e.InsertID, e.InsertKey, e.IPAddress, e.IsAttributionEvent, e.Language, e.Library, e.LocationLat, e.LocationLng, e.OSName, e.OSVersion, e.PartnerID, e.Paying, e.Plan, e.Platform, e.ProcessedTime, e.Region, e.SampleRate, e.Schema, e.ServerReceivedTime, e.ServerUploadTime, e.SessionID, e.SourceID, e.StartVersion, e.UserCreationTime, e.UserID, e.UserProperties, e.UUID, e.VersionName) +} + +func EventsTableSchema() string { + return `( + "adid" VARCHAR, + "amplitude_attribution_ids" VARCHAR, + "amplitude_event_type" VARCHAR, + "amplitude_id" BIGINT, + "app" INTEGER, + "city" VARCHAR, + "client_event_time" TIMESTAMP(6), + "client_upload_time" TIMESTAMP(6), + "country" VARCHAR, + "data" VARCHAR, + "data_type" VARCHAR, + "device_brand" VARCHAR, + "device_carrier" VARCHAR, + "device_family" VARCHAR, + "device_id" VARCHAR, + "device_manufacturer" VARCHAR, + "device_model" VARCHAR, + "device_type" VARCHAR, + "dma" VARCHAR, + "event_id" BIGINT, + "event_properties" VARCHAR, + "event_time" TIMESTAMP(6), + "event_type" VARCHAR, + "global_user_properties" VARCHAR, + "group_properties" VARCHAR, + "groups" VARCHAR, + "idfa" VARCHAR, + "insert_id" VARCHAR, + "insert_key" VARCHAR, + "ip_address" VARCHAR, + "is_attribution_event" BOOLEAN, + "language" VARCHAR, + "library" VARCHAR, + "location_lat" DOUBLE, + "location_lng" DOUBLE, + "os_name" VARCHAR, + "os_version" VARCHAR, + "partner_id" VARCHAR, + "paying" BOOLEAN, + "plan" VARCHAR, + "platform" VARCHAR, + "processed_time" TIMESTAMP(6), + "region" VARCHAR, + "sample_rate" DOUBLE, + "schema" VARCHAR, + "server_received_time" TIMESTAMP(6), + "server_upload_time" TIMESTAMP(6), + "session_id" BIGINT, + "source_id" VARCHAR, + "start_version" VARCHAR, + "user_creation_time" TIMESTAMP(6), + "user_id" VARCHAR, + "user_properties" VARCHAR, + "uuid" VARCHAR, + "version_name" VARCHAR + )` +} + +func QuotedEventsTableColumnNames() string { + return strings.Join([]string{ + "adid", + "amplitude_attribution_ids", + "amplitude_event_type", + "amplitude_id", + "app", + "city", + "client_event_time", + "client_upload_time", + "country", + "data", + "data_type", + "device_brand", + "device_carrier", + "device_family", + "device_id", + "device_manufacturer", + "device_model", + "device_type", + "dma", + "event_id", + "event_properties", + "event_time", + "event_type", + "global_user_properties", + "group_properties", + "groups", + "idfa", + "insert_id", + "insert_key", + "ip_address", + "is_attribution_event", + "language", + "library", + "location_lat", + "location_lng", + "os_name", + "os_version", + "partner_id", + "paying", + "plan", + "platform", + "processed_time", + "region", + "sample_rate", + "schema", + "server_received_time", + "server_upload_time", + "session_id", + "source_id", + "start_version", + "user_creation_time", + "user_id", + "user_properties", + "uuid", + "version_name", + }, ",") +} diff --git a/src/syncer-amplitude/go.mod b/src/syncer-amplitude/go.mod new file mode 100644 index 0000000..7df65ca --- /dev/null +++ b/src/syncer-amplitude/go.mod @@ -0,0 +1,20 @@ +module github.com/BemiHQ/bemidb-services/syncers/syncer-amplitude + +go 1.24.4 + +require github.com/BemiHQ/BemiDB/src/syncer-common v0.0.1 + +replace github.com/BemiHQ/BemiDB/src/syncer-common => ../syncer-common + +require ( + github.com/hashicorp/go-uuid v1.0.3 // indirect + github.com/jcmturner/aescts/v2 v2.0.0 // indirect + github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect + github.com/jcmturner/gofork v1.7.6 // indirect + github.com/jcmturner/goidentity/v6 v6.0.1 // indirect + github.com/jcmturner/gokrb5/v8 v8.4.4 // indirect + github.com/jcmturner/rpc/v2 v2.0.3 // indirect + github.com/trinodb/trino-go-client v0.323.0 // indirect + golang.org/x/crypto v0.37.0 // indirect + golang.org/x/net v0.24.0 // indirect +) diff --git a/src/syncer-amplitude/go.sum b/src/syncer-amplitude/go.sum new file mode 100644 index 0000000..dfe4965 --- /dev/null +++ b/src/syncer-amplitude/go.sum @@ -0,0 +1,130 @@ +dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= +dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +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/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/ahmetb/dlog v0.0.0-20170105205344-4fb5f8204f26 h1:3YVZUqkoev4mL+aCwVOSWV4M7pN+NURHL38Z2zq5JKA= +github.com/ahmetb/dlog v0.0.0-20170105205344-4fb5f8204f26/go.mod h1:ymXt5bw5uSNu4jveerFxE0vNYxF8ncqbptntMaFMg3k= +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/containerd/continuity v0.4.3 h1:6HVkalIp+2u1ZLH1J/pYX2oBVXlJZvh1X1A7bEZ9Su8= +github.com/containerd/continuity v0.4.3/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ= +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/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= +github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +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/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ= +github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= +github.com/gorilla/sessions v1.2.1 h1:DHd3rPN5lE3Ts3D8rKkQ8x/0kqfeNmBAaiSi+o7FsgI= +github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= +github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= +github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= +github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= +github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo= +github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= +github.com/jcmturner/gofork v1.7.6 h1:QH0l3hzAU1tfT3rZCnW5zXl+orbkNMMRGJfdJjHVETg= +github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo= +github.com/jcmturner/goidentity/v6 v6.0.1 h1:VKnZd2oEIMorCTsFBnJWbExfNN7yZr3EhJAxwOkZg6o= +github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= +github.com/jcmturner/gokrb5/v8 v8.4.4 h1:x1Sv4HaTpepFkXbt2IkL29DXRf8sOfZXo8eRKh687T8= +github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs= +github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY= +github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= +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/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +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/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +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.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +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.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/trinodb/trino-go-client v0.323.0 h1:I7Y67um1NnrwKCThzGr8o0xYUldb+n4vPn5R/qUxW2E= +github.com/trinodb/trino-go-client v0.323.0/go.mod h1:F+7TZRD0+0M8XqYsgXT8+EJT1pSlbxTECVD1BDzCc70= +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.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= +golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= +golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/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-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.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= +golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/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-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= +golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +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.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.2/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.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/src/syncer-amplitude/main.go b/src/syncer-amplitude/main.go new file mode 100644 index 0000000..4f94206 --- /dev/null +++ b/src/syncer-amplitude/main.go @@ -0,0 +1,7 @@ +package main + +func main() { + config := LoadConfig() + syncer := NewSyncer(config) + syncer.Sync() +} diff --git a/src/syncer-amplitude/syncer.go b/src/syncer-amplitude/syncer.go new file mode 100644 index 0000000..a543d21 --- /dev/null +++ b/src/syncer-amplitude/syncer.go @@ -0,0 +1,159 @@ +package main + +import ( + "context" + "database/sql" + "strings" + "time" + + "github.com/BemiHQ/BemiDB/src/syncer-common" +) + +const ( + PAGINATION_TIME_INTERVAL = time.Hour + AMPLITUDE_DATA_DELAY = time.Hour // Amplitude data is available for export after an up to 2-hour delay (1 full hour + truncated). https://amplitude.com/docs/apis/analytics/export +) + +type Syncer struct { + Config *Config + Amplitude *Amplitude +} + +func NewSyncer(config *Config) *Syncer { + return &Syncer{ + Config: config, + Amplitude: NewAmplitude(config), + } +} + +func (syncer *Syncer) Sync() { + common.SendAnonymousAnalytics(syncer.Config.BaseConfig, "syncer-amplitude-start", syncer.name()) + + trino := common.NewTrino(syncer.Config.BaseConfig) + defer trino.Close() + + trino.CreateSchemaIfNotExists() + trino.CreateTableIfNotExists(EVENTS_TABLE_NAME, EventsTableSchema()) + + quotedTablePath := trino.Schema() + `."` + EVENTS_TABLE_NAME + `"` + + lastSyncedTime := syncer.findLastCursorValue(trino) + if lastSyncedTime.IsZero() { + lastSyncedTime = syncer.Config.StartDate + } else { + common.LogInfo(syncer.Config.BaseConfig, "Last synced time found:", lastSyncedTime) + syncer.deleteHourFromTable(trino, quotedTablePath, lastSyncedTime) + } + + now := time.Now().UTC() + endOfSyncWindow := now.Add(-AMPLITUDE_DATA_DELAY).Truncate(time.Hour) + common.LogInfo(syncer.Config.BaseConfig, "Starting incremental sync from", lastSyncedTime, "to", endOfSyncWindow) + + for t := lastSyncedTime; t.Before(endOfSyncWindow); t = t.Add(PAGINATION_TIME_INTERVAL) { + startTime := t + endTime := t.Add(PAGINATION_TIME_INTERVAL - time.Hour) // -1 hour to ensure we don't overlap (Amplitude uses an inclusive end time) + + events, err := syncer.Amplitude.Export(startTime, endTime) + if err != nil && strings.Contains(err.Error(), "Raw data files were not found.") { + common.LogInfo(syncer.Config.BaseConfig, "No data found for the time range", startTime, "to", endTime, "- will retry later.") + break + } + common.PanicIfError(syncer.Config.BaseConfig, err) + + if len(events) > 0 { + syncer.insertEvents(trino, quotedTablePath, events) + } + + // Compact every 24 hours + if t.Hour() == 23 { + common.LogInfo(syncer.Config.BaseConfig, "Compacting...") + trino.CompactTable(quotedTablePath) + } + } + + common.LogInfo(syncer.Config.BaseConfig, "Compacting...") + trino.CompactTable(quotedTablePath) + + common.SendAnonymousAnalytics(syncer.Config.BaseConfig, "syncer-amplitude-finish", syncer.name()) +} + +func (syncer *Syncer) findLastCursorValue(trino *common.Trino) time.Time { + var nullString sql.NullString + query := `SELECT CAST(max("server_upload_time") AS VARCHAR) FROM ` + trino.Schema() + `."` + EVENTS_TABLE_NAME + `"` + err := trino.QueryRowContext( + context.Background(), + query, + ).Scan(&nullString) + + if err != nil { + if err == sql.ErrNoRows { + return time.Time{} + } + if strings.Contains(err.Error(), "does not exist") || strings.Contains(err.Error(), "Table not found") { + common.LogInfo(syncer.Config.BaseConfig, "Table", EVENTS_TABLE_NAME, "does not exist yet. Starting from scratch.") + return time.Time{} + } + common.PanicIfError(syncer.Config.BaseConfig, err) + } + + if !nullString.Valid || nullString.String == "" { + return time.Time{} + } + + return common.StringMsToUtcTime(nullString.String).Truncate(time.Hour) +} + +func (syncer *Syncer) insertEvents(trino *common.Trino, quotedTrinoTablePath string, events []Event) { + if len(events) == 0 { + return + } + ctx := context.Background() + quotedColumnNames := QuotedEventsTableColumnNames() + + insertSqlPrefix := "INSERT INTO " + quotedTrinoTablePath + "(" + quotedColumnNames + ")" + " VALUES " + currentSql := insertSqlPrefix + currentRowCount := 0 + + for _, event := range events { + rowValuesStatement := event.ToTrinoRow() + if rowValuesStatement == "" { + continue + } + + currentRowCount++ + if len(currentSql)+len(rowValuesStatement)+1 < common.TRINO_MAX_QUERY_LENGTH { // +1 for the comma + if currentSql != insertSqlPrefix { + currentSql += "," + } + currentSql += rowValuesStatement + } else { + _, err := trino.ExecContext(ctx, currentSql) + common.PanicIfError(syncer.Config.BaseConfig, err) + common.LogInfo(syncer.Config.BaseConfig, "Inserted", currentRowCount, "rows into table:", quotedTrinoTablePath) + currentSql = insertSqlPrefix + rowValuesStatement + currentRowCount = 1 + } + } + + if currentSql != insertSqlPrefix { + _, err := trino.ExecContext(ctx, currentSql) + common.PanicIfError(syncer.Config.BaseConfig, err) + common.LogInfo(syncer.Config.BaseConfig, "Inserted", currentRowCount, "rows into table:", quotedTrinoTablePath) + } +} + +func (syncer *Syncer) deleteHourFromTable(trino *common.Trino, quotedTablePath string, startTime time.Time) { + result, err := trino.ExecContext( + context.Background(), + `DELETE FROM `+quotedTablePath+` WHERE "server_upload_time" >= TIMESTAMP '`+common.TimeToUtcStringMs(startTime)+`'`, + ) + common.PanicIfError(syncer.Config.BaseConfig, err) + + rowCount, err := result.RowsAffected() + common.PanicIfError(syncer.Config.BaseConfig, err) + common.LogInfo(syncer.Config.BaseConfig, "Deleted", rowCount, "rows after", startTime) +} + +func (syncer *Syncer) name() string { + return syncer.Config.ApiKey[:5] + "..." +} diff --git a/src/syncer-common/base_config.go b/src/syncer-common/base_config.go new file mode 100644 index 0000000..0f2525b --- /dev/null +++ b/src/syncer-common/base_config.go @@ -0,0 +1,43 @@ +package common + +const ( + VERSION = "1.0.0-beta.1" + + ENV_LOG_LEVEL = "BEMIDB_LOG_LEVEL" + ENV_DISABLE_ANONYMOUS_ANALYTICS = "BEMIDB_DISABLE_ANONYMOUS_ANALYTICS" + + ENV_DESTINATION_SCHEMA_NAME = "DESTINATION_SCHEMA_NAME" + + ENV_TRINO_DATABASE_URL = "TRINO_DATABASE_URL" + ENV_TRINO_CATALOG_NAME = "TRINO_CATALOG_NAME" + + ENV_AWS_REGION = "AWS_REGION" + ENV_AWS_S3_ENDPOINT = "AWS_S3_ENDPOINT" + ENV_AWS_S3_BUCKET = "AWS_S3_BUCKET" + ENV_AWS_ACCESS_KEY_ID = "AWS_ACCESS_KEY_ID" + ENV_AWS_SECRET_ACCESS_KEY = "AWS_SECRET_ACCESS_KEY" + + DEFAULT_LOG_LEVEL = "INFO" + DEFAULT_AWS_S3_ENDPOINT = "s3.amazonaws.com" +) + +type TrinoConfig struct { + DatabaseUrl string + CatalogName string +} + +type AwsConfig struct { + Region string + S3Endpoint string // optional + S3Bucket string + AccessKeyId string + SecretAccessKey string +} + +type BaseConfig struct { + LogLevel string + Trino TrinoConfig + Aws AwsConfig + DestinationSchemaName string + DisableAnonymousAnalytics bool +} diff --git a/src/capped_buffer.go b/src/syncer-common/capped_buffer.go similarity index 95% rename from src/capped_buffer.go rename to src/syncer-common/capped_buffer.go index 0c00d10..3e310ee 100644 --- a/src/capped_buffer.go +++ b/src/syncer-common/capped_buffer.go @@ -1,4 +1,4 @@ -package main +package common import ( "errors" @@ -7,7 +7,7 @@ import ( ) type CappedBuffer struct { - config *Config + config *BaseConfig maxSizeBytes int buffer []byte @@ -18,7 +18,7 @@ type CappedBuffer struct { closed bool } -func NewCappedBuffer(maxSizeBytes int, config *Config) *CappedBuffer { +func NewCappedBuffer(config *BaseConfig, maxSizeBytes int) *CappedBuffer { sizedBuffer := &CappedBuffer{ config: config, buffer: make([]byte, 0, maxSizeBytes), diff --git a/src/capped_buffer_test.go b/src/syncer-common/capped_buffer_test.go similarity index 93% rename from src/capped_buffer_test.go rename to src/syncer-common/capped_buffer_test.go index 17046b2..94ba941 100644 --- a/src/capped_buffer_test.go +++ b/src/syncer-common/capped_buffer_test.go @@ -1,4 +1,4 @@ -package main +package common import ( "bytes" @@ -8,8 +8,8 @@ import ( "time" ) -func initTestConfig() *Config { - return &Config{ +func initTestConfig() *BaseConfig { + return &BaseConfig{ LogLevel: LOG_LEVEL_INFO, // Use INFO to avoid excessive logging during tests } } @@ -18,7 +18,7 @@ func TestCappedBufferWrite(t *testing.T) { t.Run("Writes data to buffer", func(t *testing.T) { config := initTestConfig() bufferSize := 100 // 100 bytes - buffer := NewCappedBuffer(bufferSize, config) + buffer := NewCappedBuffer(config, bufferSize) writeData := []byte("hello world") writtenBytes, err := buffer.Write(writeData) @@ -34,7 +34,7 @@ func TestCappedBufferWrite(t *testing.T) { t.Run("Waits to write data to a full buffer", func(t *testing.T) { config := initTestConfig() bufferSize := 11 - buffer := NewCappedBuffer(bufferSize, config) + buffer := NewCappedBuffer(config, bufferSize) writeDataFull := []byte("hello world") buffer.Write(writeDataFull) writeDataOverflow := []byte("overflow") @@ -56,7 +56,7 @@ func TestCappedBufferWrite(t *testing.T) { t.Run("Writes data to a buffer after it was read (more space available)", func(t *testing.T) { config := initTestConfig() bufferSize := 11 - buffer := NewCappedBuffer(bufferSize, config) + buffer := NewCappedBuffer(config, bufferSize) writeDataFull := []byte("hello world") buffer.Write(writeDataFull) writeDataOverflow := []byte("over") @@ -94,7 +94,7 @@ func TestCappedBufferWrite(t *testing.T) { t.Run("Receive error when writing to a closed buffer", func(t *testing.T) { config := initTestConfig() bufferSize := 100 - buffer := NewCappedBuffer(bufferSize, config) + buffer := NewCappedBuffer(config, bufferSize) writeData := []byte("hello world") buffer.Close() @@ -117,7 +117,7 @@ func TestCappedBufferRead(t *testing.T) { t.Run("Reads data from buffer", func(t *testing.T) { config := initTestConfig() bufferSize := 100 // 100 bytes - buffer := NewCappedBuffer(bufferSize, config) + buffer := NewCappedBuffer(config, bufferSize) writeData := []byte("hello world") buffer.Write(writeData) readData := make([]byte, len(writeData)) @@ -138,7 +138,7 @@ func TestCappedBufferRead(t *testing.T) { t.Run("Waits to read data from an empty buffer", func(t *testing.T) { config := initTestConfig() bufferSize := 100 // 100 bytes - buffer := NewCappedBuffer(bufferSize, config) + buffer := NewCappedBuffer(config, bufferSize) done := make(chan struct{}) // Create a channel to signal when read is done readData := make([]byte, 10) @@ -160,7 +160,7 @@ func TestCappedBufferRead(t *testing.T) { t.Run("Waits and reads data from a buffer after it was closed", func(t *testing.T) { config := initTestConfig() bufferSize := 100 // 100 bytes - buffer := NewCappedBuffer(bufferSize, config) + buffer := NewCappedBuffer(config, bufferSize) writeData := []byte("hello world") buffer.Write(writeData) done := make(chan struct{}) // Create a channel to signal when read is done @@ -194,7 +194,7 @@ func TestCappedBufferRead(t *testing.T) { t.Run("Reads data from a buffer after it was written to (more data available)", func(t *testing.T) { config := initTestConfig() bufferSize := 11 - buffer := NewCappedBuffer(bufferSize, config) + buffer := NewCappedBuffer(config, bufferSize) readData := make([]byte, 5) done := make(chan struct{}) writeData := []byte("hello world") @@ -226,7 +226,7 @@ func TestCappedBufferRead(t *testing.T) { t.Run("Receive EOF when reading from a closed and empty buffer", func(t *testing.T) { config := initTestConfig() bufferSize := 100 - buffer := NewCappedBuffer(bufferSize, config) + buffer := NewCappedBuffer(config, bufferSize) readData := make([]byte, 10) buffer.Close() @@ -246,7 +246,7 @@ func TestCappedBufferConcurrentReadWrite(t *testing.T) { t.Run("Concurrent read and write operations", func(t *testing.T) { config := initTestConfig() bufferSize := 100 // 100 bytes - buffer := NewCappedBuffer(bufferSize, config) + buffer := NewCappedBuffer(config, bufferSize) iterations := 100 writeData := []byte("test data") @@ -290,7 +290,7 @@ func TestCappedBufferConcurrentReadWrite(t *testing.T) { t.Run("Multiple sequential read and write operations", func(t *testing.T) { config := initTestConfig() bufferSize := 20 - buffer := NewCappedBuffer(bufferSize, config) + buffer := NewCappedBuffer(config, bufferSize) data1 := []byte("first") data2 := []byte("second") data3 := []byte("third") diff --git a/src/syncer-common/error_utils.go b/src/syncer-common/error_utils.go new file mode 100644 index 0000000..4fc7d6a --- /dev/null +++ b/src/syncer-common/error_utils.go @@ -0,0 +1,49 @@ +package common + +import ( + "bytes" + "encoding/json" + "net/http" + "runtime" + "runtime/debug" + "time" +) + +func PanicIfError(config *BaseConfig, err error) { + if err != nil { + sendAnonymousErrorReport(config, err) + panic(err) + } +} + +type AnonymousErrorData struct { + Command string `json:"command"` + OsName string `json:"osName"` + Version string `json:"version"` + Error string `json:"error"` + StackTrace string `json:"stackTrace"` + S3Bucket string `json:"s3Bucket"` +} + +func sendAnonymousErrorReport(config *BaseConfig, err error) { + if config.DisableAnonymousAnalytics { + return + } + + data := AnonymousErrorData{ + Command: "syncer", + OsName: runtime.GOOS + "-" + runtime.GOARCH, + Version: VERSION, + Error: err.Error(), + StackTrace: string(debug.Stack()), + S3Bucket: config.Aws.S3Endpoint + "/" + config.Aws.S3Bucket, + } + + jsonData, err := json.Marshal(data) + if err != nil { + return + } + + client := http.Client{Timeout: 5 * time.Second} + _, _ = client.Post("https://api.bemidb.com/api/errors", "application/json", bytes.NewBuffer(jsonData)) +} diff --git a/src/syncer-common/go.mod b/src/syncer-common/go.mod new file mode 100644 index 0000000..b625102 --- /dev/null +++ b/src/syncer-common/go.mod @@ -0,0 +1,17 @@ +module github.com/BemiHQ/BemiDB/src/syncer-common + +go 1.24.4 + +require github.com/trinodb/trino-go-client v0.323.0 + +require ( + github.com/hashicorp/go-uuid v1.0.3 // indirect + github.com/jcmturner/aescts/v2 v2.0.0 // indirect + github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect + github.com/jcmturner/gofork v1.7.6 // indirect + github.com/jcmturner/goidentity/v6 v6.0.1 // indirect + github.com/jcmturner/gokrb5/v8 v8.4.4 // indirect + github.com/jcmturner/rpc/v2 v2.0.3 // indirect + golang.org/x/crypto v0.37.0 // indirect + golang.org/x/net v0.24.0 // indirect +) diff --git a/src/syncer-common/go.sum b/src/syncer-common/go.sum new file mode 100644 index 0000000..dfe4965 --- /dev/null +++ b/src/syncer-common/go.sum @@ -0,0 +1,130 @@ +dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= +dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +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/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/ahmetb/dlog v0.0.0-20170105205344-4fb5f8204f26 h1:3YVZUqkoev4mL+aCwVOSWV4M7pN+NURHL38Z2zq5JKA= +github.com/ahmetb/dlog v0.0.0-20170105205344-4fb5f8204f26/go.mod h1:ymXt5bw5uSNu4jveerFxE0vNYxF8ncqbptntMaFMg3k= +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/containerd/continuity v0.4.3 h1:6HVkalIp+2u1ZLH1J/pYX2oBVXlJZvh1X1A7bEZ9Su8= +github.com/containerd/continuity v0.4.3/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ= +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/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= +github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +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/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ= +github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= +github.com/gorilla/sessions v1.2.1 h1:DHd3rPN5lE3Ts3D8rKkQ8x/0kqfeNmBAaiSi+o7FsgI= +github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= +github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= +github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= +github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= +github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo= +github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= +github.com/jcmturner/gofork v1.7.6 h1:QH0l3hzAU1tfT3rZCnW5zXl+orbkNMMRGJfdJjHVETg= +github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo= +github.com/jcmturner/goidentity/v6 v6.0.1 h1:VKnZd2oEIMorCTsFBnJWbExfNN7yZr3EhJAxwOkZg6o= +github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= +github.com/jcmturner/gokrb5/v8 v8.4.4 h1:x1Sv4HaTpepFkXbt2IkL29DXRf8sOfZXo8eRKh687T8= +github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs= +github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY= +github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= +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/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +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/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +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.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +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.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/trinodb/trino-go-client v0.323.0 h1:I7Y67um1NnrwKCThzGr8o0xYUldb+n4vPn5R/qUxW2E= +github.com/trinodb/trino-go-client v0.323.0/go.mod h1:F+7TZRD0+0M8XqYsgXT8+EJT1pSlbxTECVD1BDzCc70= +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.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= +golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= +golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/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-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.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= +golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/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-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= +golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +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.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.2/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.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/src/syncer-common/logger.go b/src/syncer-common/logger.go new file mode 100644 index 0000000..7ceaf04 --- /dev/null +++ b/src/syncer-common/logger.go @@ -0,0 +1,51 @@ +package common + +import ( + "log" +) + +type LogLevel string + +const ( + LOG_LEVEL_TRACE = "TRACE" + LOG_LEVEL_DEBUG = "DEBUG" + LOG_LEVEL_WARN = "WARN" + LOG_LEVEL_INFO = "INFO" + LOG_LEVEL_ERROR = "ERROR" +) + +var LOG_LEVELS = []string{ + LOG_LEVEL_TRACE, + LOG_LEVEL_DEBUG, + LOG_LEVEL_WARN, + LOG_LEVEL_INFO, + LOG_LEVEL_ERROR, +} + +func LogError(config *BaseConfig, message ...interface{}) { + log.Println(append([]interface{}{"[ERROR]"}, message...)...) +} + +func LogWarn(config *BaseConfig, message ...interface{}) { + if config.LogLevel != LOG_LEVEL_ERROR { + log.Println(append([]interface{}{"[WARN]"}, message...)...) + } +} + +func LogInfo(config *BaseConfig, message ...interface{}) { + if config.LogLevel != LOG_LEVEL_ERROR && config.LogLevel != LOG_LEVEL_WARN { + log.Println(append([]interface{}{"[INFO]"}, message...)...) + } +} + +func LogDebug(config *BaseConfig, message ...interface{}) { + if config.LogLevel == LOG_LEVEL_DEBUG || config.LogLevel == LOG_LEVEL_TRACE { + log.Println(append([]interface{}{"[DEBUG]"}, message...)...) + } +} + +func LogTrace(config *BaseConfig, message ...interface{}) { + if config.LogLevel == LOG_LEVEL_TRACE { + log.Println(append([]interface{}{"[TRACE]"}, message...)...) + } +} diff --git a/src/syncer-common/set.go b/src/syncer-common/set.go new file mode 100644 index 0000000..cd684ff --- /dev/null +++ b/src/syncer-common/set.go @@ -0,0 +1,44 @@ +package common + +type Set[T comparable] map[T]struct{} + +func NewSet[T comparable]() Set[T] { + set := make(Set[T]) + return set +} + +func (set Set[T]) Add(item T) Set[T] { + set[item] = struct{}{} + return set +} + +func (set Set[T]) AddAll(items []T) Set[T] { + for _, item := range items { + set.Add(item) + } + return set +} + +func (set Set[T]) Contains(item T) bool { + _, ok := set[item] + return ok +} + +func (set Set[T]) Values() []T { + values := make([]T, 0, len(set)) + for val := range set { + values = append(values, val) + } + + return values +} + +func (set Set[T]) Reset() { + for key := range set { + delete(set, key) + } +} + +func (set Set[T]) IsEmpty() bool { + return len(set) == 0 +} diff --git a/src/syncer-common/trino.go b/src/syncer-common/trino.go new file mode 100644 index 0000000..b4863a6 --- /dev/null +++ b/src/syncer-common/trino.go @@ -0,0 +1,88 @@ +package common + +import ( + "context" + "database/sql" + + _ "github.com/trinodb/trino-go-client/trino" +) + +const ( + TRINO_MAX_DECIMAL_PRECISION = 38 + TRINO_MAX_QUERY_LENGTH = 1_000_000 +) + +type Trino struct { + Config *BaseConfig + Db *sql.DB +} + +func NewTrino(config *BaseConfig) *Trino { + db, err := sql.Open("trino", config.Trino.DatabaseUrl) + PanicIfError(config, err) + + return &Trino{ + Config: config, + Db: db, + } +} + +func (trino *Trino) Schema() string { + return trino.Config.Trino.CatalogName + "." + trino.Config.DestinationSchemaName +} + +func (trino *Trino) Close() { + if err := trino.Db.Close(); err != nil { + PanicIfError(trino.Config, err) + } +} + +func (trino *Trino) ExecContext(ctx context.Context, query string, args ...interface{}) (sql.Result, error) { + LogDebug(trino.Config, "Trino query:", query) + result, err := trino.Db.ExecContext(ctx, query, args...) + if err != nil { + LogError(trino.Config, "Trino query failed:", query) + return nil, err + } + + return result, nil +} + +func (trino *Trino) QueryContext(ctx context.Context, query string, args ...interface{}) (*sql.Rows, error) { + LogDebug(trino.Config, "Trino query:", query) + return trino.Db.QueryContext(ctx, query, args...) +} + +func (trino *Trino) QueryRowContext(ctx context.Context, query string, args ...interface{}) *sql.Row { + LogDebug(trino.Config, "Trino query:", query) + return trino.Db.QueryRowContext(ctx, query, args...) +} + +func (trino *Trino) CompactTable(quotedTrinoTablePath string) { + ctx := context.Background() + + _, err := trino.ExecContext(ctx, "ALTER TABLE "+quotedTrinoTablePath+" EXECUTE optimize") + PanicIfError(trino.Config, err) + + _, err = trino.ExecContext(ctx, "ALTER TABLE "+quotedTrinoTablePath+" EXECUTE remove_orphan_files(retention_threshold => '0m')") + PanicIfError(trino.Config, err) + + _, err = trino.ExecContext(ctx, "ALTER TABLE "+quotedTrinoTablePath+" EXECUTE optimize_manifests") + PanicIfError(trino.Config, err) + + _, err = trino.ExecContext(ctx, "ALTER TABLE "+quotedTrinoTablePath+" EXECUTE expire_snapshots(retention_threshold => '0m')") + PanicIfError(trino.Config, err) +} + +func (trino *Trino) CreateSchemaIfNotExists() { + _, err := trino.ExecContext(context.Background(), "CREATE SCHEMA IF NOT EXISTS "+trino.Schema()) + PanicIfError(trino.Config, err) +} + +func (trino *Trino) CreateTableIfNotExists(tableName string, tableSchema string) { + ctx := context.Background() + + createTableSql := "CREATE TABLE IF NOT EXISTS " + trino.Schema() + `."` + tableName + `"` + tableSchema + _, err := trino.ExecContext(ctx, createTableSql) + PanicIfError(trino.Config, err) +} diff --git a/src/syncer-common/utils.go b/src/syncer-common/utils.go new file mode 100644 index 0000000..5392287 --- /dev/null +++ b/src/syncer-common/utils.go @@ -0,0 +1,88 @@ +package common + +import ( + "bytes" + "encoding/base64" + "encoding/hex" + "encoding/json" + "net/http" + "runtime" + "strconv" + "strings" + "time" +) + +func IntToString(i int) string { + return strconv.Itoa(i) +} + +func Float64ToString(i float64) string { + return strconv.FormatFloat(i, 'f', -1, 64) +} + +func StringToInt(s string) int { + int, err := strconv.Atoi(s) + if err != nil { + panic(err) + } + + return int +} + +func HexToString(s string) (string, error) { + decoded, err := hex.DecodeString(s) + if err != nil { + return "", err + } + return string(decoded), nil +} + +func Base64ToHex(s string) string { + decoded, err := base64.StdEncoding.DecodeString(s) + if err != nil { + panic(err) + } + return strings.ToUpper(hex.EncodeToString(decoded)) +} + +func TimeToUtcStringMs(t time.Time) string { + return t.UTC().Format("2006-01-02 15:04:05.999999") +} + +func StringMsToUtcTime(s string) time.Time { + t, err := time.Parse("2006-01-02 15:04:05.999999", s) + if err != nil { + panic(err) + } + return t.UTC() +} + +type AnonymousAnalyticsData struct { + Command string `json:"command"` + OsName string `json:"osName"` + Version string `json:"version"` + S3Bucket string `json:"s3Bucket"` + Name string `json:"name"` +} + +func SendAnonymousAnalytics(config *BaseConfig, command string, name string) { + if config.DisableAnonymousAnalytics { + return + } + + data := AnonymousAnalyticsData{ + Command: command, + OsName: runtime.GOOS + "-" + runtime.GOARCH, + Version: VERSION, + S3Bucket: config.Aws.S3Endpoint + "/" + config.Aws.S3Bucket, + Name: name, + } + + jsonData, err := json.Marshal(data) + if err != nil { + return + } + + client := http.Client{Timeout: 5 * time.Second} + _, _ = client.Post("https://api.bemidb.com/api/analytics", "application/json", bytes.NewBuffer(jsonData)) +} diff --git a/src/syncer-postgres/config.go b/src/syncer-postgres/config.go new file mode 100644 index 0000000..85c0b5f --- /dev/null +++ b/src/syncer-postgres/config.go @@ -0,0 +1,178 @@ +package main + +import ( + "flag" + "os" + "slices" + "strings" + + "github.com/BemiHQ/BemiDB/src/syncer-common" +) + +type SyncMode string + +const ( + SyncModeFullRefresh SyncMode = "FULL_REFRESH" + SyncModeCDC SyncMode = "CDC" + SyncModeIncremental SyncMode = "INCREMENTAL" + + ENV_NATS_URL = "NATS_URL" + ENV_NATS_STREAM = "NATS_JETSTREAM_STREAM" + ENV_NATS_SUBJECT = "NATS_JETSTREAM_SUBJECT" + ENV_NATS_CONSUMER_NAME = "NATS_JETSTREAM_CONSUMER_NAME" + ENV_NATS_FETCH_TIMEOUT_SECONDS = "NATS_FETCH_TIMEOUT_SECONDS" + + ENV_DATABASE_URL = "SOURCE_POSTGRES_DATABASE_URL" + ENV_SYNC_MODE = "SOURCE_POSTGRES_SYNC_MODE" + ENV_INCLUDE_SCHEMAS = "SOURCE_POSTGRES_INCLUDE_SCHEMAS" + ENV_INCLUDE_TABLES = "SOURCE_POSTGRES_INCLUDE_TABLES" + ENV_EXCLUDE_TABLES = "SOURCE_POSTGRES_EXCLUDE_TABLES" + ENV_CURSOR_COLUMNS = "SOURCE_POSTGRES_CURSOR_COLUMNS" + ENV_IGNORE_UPDATE_COLUMNS = "SOURCE_POSTGRES_IGNORE_UPDATE_COLUMNS" + + DEFAULT_NATS_FETCH_TIMEOUT_SECONDS = 30 +) + +type NatsConfig struct { + Url string + Stream string + Subject string + ConsumerName string + FetchTimeoutSeconds int +} + +type Config struct { + BaseConfig *common.BaseConfig + SyncMode SyncMode + DatabaseUrl string + IncludeSchemas common.Set[string] + IncludeTables common.Set[string] + ExcludeTables common.Set[string] + CursorColumnNameByTableName map[string]string // Incremental sync + IgnoreUpdateColumns common.Set[string] // CDC sync + Nats NatsConfig // CDC sync +} + +type configParseValues struct { + IncludeSchemas string + IncludeTables string + ExcludeTables string + IgnoreUpdateColumns string + CursorColumns string +} + +var _config Config +var _configParseValues configParseValues + +func init() { + registerFlags() +} + +func registerFlags() { + _config.BaseConfig = &common.BaseConfig{} + + flag.StringVar(&_config.BaseConfig.LogLevel, "log-level", os.Getenv(common.ENV_LOG_LEVEL), `Log level: "ERROR", "WARN", "INFO", "DEBUG", "TRACE". Default: "`+common.DEFAULT_LOG_LEVEL+`"`) + flag.StringVar(&_config.BaseConfig.DestinationSchemaName, "destination-schema-name", os.Getenv(common.ENV_DESTINATION_SCHEMA_NAME), "Destination schema name to store the synced data") + flag.StringVar(&_config.BaseConfig.Trino.DatabaseUrl, "trino-database-url", os.Getenv(common.ENV_TRINO_DATABASE_URL), "Trino database URL to sync to") + flag.StringVar(&_config.BaseConfig.Trino.CatalogName, "trino-catalog-name", os.Getenv(common.ENV_TRINO_CATALOG_NAME), "Trino catalog name") + flag.StringVar(&_config.BaseConfig.Aws.Region, "aws-region", os.Getenv(common.ENV_AWS_REGION), "AWS region") + flag.StringVar(&_config.BaseConfig.Aws.S3Endpoint, "aws-s3-endpoint", os.Getenv(common.ENV_AWS_S3_ENDPOINT), "AWS S3 endpoint. Default: \""+common.DEFAULT_AWS_S3_ENDPOINT+`"`) + flag.StringVar(&_config.BaseConfig.Aws.S3Bucket, "aws-s3-bucket", os.Getenv(common.ENV_AWS_S3_BUCKET), "AWS S3 bucket name") + flag.StringVar(&_config.BaseConfig.Aws.AccessKeyId, "aws-access-key-id", os.Getenv(common.ENV_AWS_ACCESS_KEY_ID), "AWS access key ID") + flag.StringVar(&_config.BaseConfig.Aws.SecretAccessKey, "aws-secret-access-key", os.Getenv(common.ENV_AWS_SECRET_ACCESS_KEY), "AWS secret access key") + flag.BoolVar(&_config.BaseConfig.DisableAnonymousAnalytics, "disable-anonymous-analytics", os.Getenv(common.ENV_DISABLE_ANONYMOUS_ANALYTICS) == "true", "Disable anonymous analytics collection") + + flag.StringVar(&_config.DatabaseUrl, "database-url", os.Getenv(ENV_DATABASE_URL), "PostgreSQL database URL") + flag.StringVar((*string)(&_config.SyncMode), "sync-mode", os.Getenv(ENV_SYNC_MODE), `Sync mode: "FULL_REFRESH", "CDC", or "INCREMENTAL"`) + flag.StringVar(&_configParseValues.IncludeSchemas, "include-schemas", os.Getenv(ENV_INCLUDE_SCHEMAS), "Comma-separated list of schemas to include in the sync. Default: all schemas included") + flag.StringVar(&_configParseValues.IncludeTables, "include-tables", os.Getenv(ENV_INCLUDE_TABLES), "Comma-separated list of tables to include in the sync. Default: all tables included") + flag.StringVar(&_configParseValues.ExcludeTables, "exclude-tables", os.Getenv(ENV_EXCLUDE_TABLES), "Comma-separated list of tables to exclude from the sync. Default: no tables excluded") + flag.StringVar(&_configParseValues.CursorColumns, "cursor-columns", os.Getenv(ENV_CURSOR_COLUMNS), "Cursor columns to use for incremental sync. Format: schema.table=column,schema2.table2=column2. Default: no cursor columns specified") + flag.StringVar(&_configParseValues.IgnoreUpdateColumns, "ignore-update-columns", os.Getenv(ENV_IGNORE_UPDATE_COLUMNS), "Comma-separated list of columns to ignore for updates in CDC mode. Default: no columns ignored") + flag.StringVar(&_config.Nats.Url, "nats-url", os.Getenv(ENV_NATS_URL), "NATS URL") + flag.StringVar(&_config.Nats.Stream, "nats-stream", os.Getenv(ENV_NATS_STREAM), "NATS stream to read from") + flag.StringVar(&_config.Nats.Subject, "nats-subject", os.Getenv(ENV_NATS_SUBJECT), "NATS subject to read from") + flag.StringVar(&_config.Nats.ConsumerName, "nats-consumer-name", os.Getenv(ENV_NATS_CONSUMER_NAME), "NATS consumer name for the JetStream consumer") + flag.IntVar(&_config.Nats.FetchTimeoutSeconds, "nats-fetch-timeout-seconds", DEFAULT_NATS_FETCH_TIMEOUT_SECONDS, "NATS fetch timeout in seconds") + fetchTimeoutSeconds := os.Getenv(ENV_NATS_FETCH_TIMEOUT_SECONDS) + if fetchTimeoutSeconds != "" { + _config.Nats.FetchTimeoutSeconds = common.StringToInt(fetchTimeoutSeconds) + } +} + +func parseFlags() { + flag.Parse() + + if _config.BaseConfig.LogLevel == "" { + _config.BaseConfig.LogLevel = common.DEFAULT_LOG_LEVEL + } else if !slices.Contains(common.LOG_LEVELS, _config.BaseConfig.LogLevel) { + panic("Invalid log level " + _config.BaseConfig.LogLevel + ". Must be one of " + strings.Join(common.LOG_LEVELS, ", ")) + } + if _config.BaseConfig.DestinationSchemaName == "" { + panic("Destination schema name is required") + } + if _config.BaseConfig.Trino.DatabaseUrl == "" { + panic("Trino database URL is required") + } + if _config.BaseConfig.Trino.CatalogName == "" { + panic("Trino catalog name is required") + } + + if _configParseValues.IncludeSchemas != "" { + _config.IncludeSchemas = common.NewSet[string]().AddAll(strings.Split(_configParseValues.IncludeSchemas, ",")) + } + if _configParseValues.IncludeTables != "" && _configParseValues.ExcludeTables != "" { + panic("Cannot specify both include-tables and exclude-tables. Please use one or the other.") + } + if _configParseValues.IncludeTables != "" { + _config.IncludeTables = common.NewSet[string]().AddAll(strings.Split(_configParseValues.IncludeTables, ",")) + } + if _configParseValues.ExcludeTables != "" { + _config.ExcludeTables = common.NewSet[string]().AddAll(strings.Split(_configParseValues.ExcludeTables, ",")) + } + if _configParseValues.IgnoreUpdateColumns != "" { + _config.IgnoreUpdateColumns = common.NewSet[string]().AddAll(strings.Split(_configParseValues.IgnoreUpdateColumns, ",")) + } + if _configParseValues.CursorColumns != "" { + _config.CursorColumnNameByTableName = make(map[string]string) + cursorColumns := strings.Split(_configParseValues.CursorColumns, ",") + for _, cursorColumn := range cursorColumns { + parts := strings.Split(cursorColumn, "=") + if len(parts) != 2 { + panic("Invalid cursor column format. Expected schema.table=column, got: " + cursorColumn) + } + _config.CursorColumnNameByTableName[parts[0]] = parts[1] + } + } + + if _config.SyncMode == "" { + panic("Sync mode is required") + } else if _config.SyncMode != SyncModeFullRefresh && _config.SyncMode != SyncModeCDC && _config.SyncMode != SyncModeIncremental { + panic("Invalid sync mode " + string(_config.SyncMode) + ". Must be one of FULL_REFRESH, CDC, or INCREMENTAL") + } + + switch _config.SyncMode { + case SyncModeCDC: + if _config.Nats.Url == "" { + panic("NATS URL is required") + } + if _config.Nats.Stream == "" { + panic("NATS stream is required") + } + if _config.Nats.Subject == "" { + panic("NATS subject is required") + } + if _config.Nats.FetchTimeoutSeconds <= 0 { + panic("NATS fetch timeout must be greater than 0") + } + } + + if _config.DatabaseUrl == "" { + panic("Source PostgreSQL database URL is required") + } +} + +func LoadConfig() *Config { + parseFlags() + return &_config +} diff --git a/src/syncer-postgres/debezium.go b/src/syncer-postgres/debezium.go new file mode 100644 index 0000000..51be277 --- /dev/null +++ b/src/syncer-postgres/debezium.go @@ -0,0 +1,28 @@ +package main + +type DebeziumData struct { + Operation string `json:"op"` +} + +type DebeziumOperation string + +const ( + InsertOperation DebeziumOperation = "c" + UpdateOperation DebeziumOperation = "u" + DeleteOperation DebeziumOperation = "d" + MessageOperation DebeziumOperation = "m" + SnapshotOperation DebeziumOperation = "r" +) + +type DebeziumRowSource struct { + Schema string `json:"schema"` + Table string `json:"table"` + CommittedAtNs int64 `json:"ts_ns"` +} + +type DebeziumRowData struct { + Operation string `json:"op"` + Before map[string]interface{} `json:"before"` + After map[string]interface{} `json:"after"` + Source DebeziumRowSource `json:"source"` +} diff --git a/src/syncer-postgres/go.mod b/src/syncer-postgres/go.mod new file mode 100644 index 0000000..4f7cbce --- /dev/null +++ b/src/syncer-postgres/go.mod @@ -0,0 +1,31 @@ +module github.com/BemiHQ/BemiDB/src/syncer-postgres + +go 1.24.4 + +require ( + github.com/BemiHQ/BemiDB/src/syncer-common v0.0.1 + github.com/jackc/pgx/v5 v5.7.4 + github.com/nats-io/nats.go v1.43.0 +) + +replace github.com/BemiHQ/BemiDB/src/syncer-common => ../syncer-common + +require ( + github.com/hashicorp/go-uuid v1.0.3 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect + github.com/jcmturner/aescts/v2 v2.0.0 // indirect + github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect + github.com/jcmturner/gofork v1.7.6 // indirect + github.com/jcmturner/goidentity/v6 v6.0.1 // indirect + github.com/jcmturner/gokrb5/v8 v8.4.4 // indirect + github.com/jcmturner/rpc/v2 v2.0.3 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/nats-io/nkeys v0.4.11 // indirect + github.com/nats-io/nuid v1.0.1 // indirect + github.com/trinodb/trino-go-client v0.323.0 // indirect + golang.org/x/crypto v0.37.0 // indirect + golang.org/x/net v0.24.0 // indirect + golang.org/x/sys v0.32.0 // indirect + golang.org/x/text v0.24.0 // indirect +) diff --git a/src/syncer-postgres/go.sum b/src/syncer-postgres/go.sum new file mode 100644 index 0000000..c878f6d --- /dev/null +++ b/src/syncer-postgres/go.sum @@ -0,0 +1,152 @@ +dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= +dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +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/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/ahmetb/dlog v0.0.0-20170105205344-4fb5f8204f26 h1:3YVZUqkoev4mL+aCwVOSWV4M7pN+NURHL38Z2zq5JKA= +github.com/ahmetb/dlog v0.0.0-20170105205344-4fb5f8204f26/go.mod h1:ymXt5bw5uSNu4jveerFxE0vNYxF8ncqbptntMaFMg3k= +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/containerd/continuity v0.4.3 h1:6HVkalIp+2u1ZLH1J/pYX2oBVXlJZvh1X1A7bEZ9Su8= +github.com/containerd/continuity v0.4.3/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ= +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/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= +github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +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/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ= +github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= +github.com/gorilla/sessions v1.2.1 h1:DHd3rPN5lE3Ts3D8rKkQ8x/0kqfeNmBAaiSi+o7FsgI= +github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= +github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= +github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +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/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.7.4 h1:9wKznZrhWa2QiHL+NjTSPP6yjl3451BX3imWDnokYlg= +github.com/jackc/pgx/v5 v5.7.4/go.mod h1:ncY89UGWxg82EykZUwSpUKEfccBGGYq1xjrOpsbsfGQ= +github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= +github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= +github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= +github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo= +github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= +github.com/jcmturner/gofork v1.7.6 h1:QH0l3hzAU1tfT3rZCnW5zXl+orbkNMMRGJfdJjHVETg= +github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo= +github.com/jcmturner/goidentity/v6 v6.0.1 h1:VKnZd2oEIMorCTsFBnJWbExfNN7yZr3EhJAxwOkZg6o= +github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= +github.com/jcmturner/gokrb5/v8 v8.4.4 h1:x1Sv4HaTpepFkXbt2IkL29DXRf8sOfZXo8eRKh687T8= +github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs= +github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY= +github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +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/nats-io/nats.go v1.43.0 h1:uRFZ2FEoRvP64+UUhaTokyS18XBCR/xM2vQZKO4i8ug= +github.com/nats-io/nats.go v1.43.0/go.mod h1:iRWIPokVIFbVijxuMQq4y9ttaBTMe0SFdlZfMDd+33g= +github.com/nats-io/nkeys v0.4.11 h1:q44qGV008kYd9W1b1nEBkNzvnWxtRSQ7A8BoqRrcfa0= +github.com/nats-io/nkeys v0.4.11/go.mod h1:szDimtgmfOi9n25JpfIdGw12tZFYXqhGxjhVxsatHVE= +github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +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/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +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/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +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.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +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.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/trinodb/trino-go-client v0.323.0 h1:I7Y67um1NnrwKCThzGr8o0xYUldb+n4vPn5R/qUxW2E= +github.com/trinodb/trino-go-client v0.323.0/go.mod h1:F+7TZRD0+0M8XqYsgXT8+EJT1pSlbxTECVD1BDzCc70= +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.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= +golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= +golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/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-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.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= +golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/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.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610= +golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/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-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= +golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +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.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0= +golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.2/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.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/src/init_test.go b/src/syncer-postgres/init_test.go similarity index 52% rename from src/init_test.go rename to src/syncer-postgres/init_test.go index c227db2..31df8e8 100644 --- a/src/init_test.go +++ b/src/syncer-postgres/init_test.go @@ -1,11 +1,14 @@ package main import ( + "encoding/csv" "flag" "os" + + "github.com/BemiHQ/BemiDB/src/syncer-common" ) -var PUBLIC_SCHEMA_TEST_TABLE_PG_SCHEMA_COLUMNS = []PgSchemaColumn{ +var PG_SCHEMA_COLUMNS_TEST_TABLE = []PgSchemaColumn{ { ColumnName: "id", DataType: "integer", @@ -184,13 +187,6 @@ var PUBLIC_SCHEMA_TEST_TABLE_PG_SCHEMA_COLUMNS = []PgSchemaColumn{ DatetimePrecision: "3", Namespace: "pg_catalog", }, - { - ColumnName: "timestamptz_column_timezone_mins", - DataType: "timestamp with time zone", - UdtName: "timestamptz", - DatetimePrecision: "6", - Namespace: "pg_catalog", - }, { ColumnName: "uuid_column", DataType: "uuid", @@ -283,11 +279,40 @@ var PUBLIC_SCHEMA_TEST_TABLE_PG_SCHEMA_COLUMNS = []PgSchemaColumn{ Namespace: "public", }, } -var PUBLIC_SCHEMA_TEST_TABLE_LOADED_ROWS = [][]string{ +var PG_SCHEMA_COLUMNS_PARTITIONED_TABLE = []PgSchemaColumn{ + { + ColumnName: "timestamp_column", + DataType: "timestamp without time zone", + UdtName: "timestamp", + IsNullable: "NO", + OrdinalPosition: "1", + CharacterMaximumLength: "0", + NumericPrecision: "0", + NumericScale: "0", + DatetimePrecision: "6", + Namespace: "pg_catalog", + }, +} +var PG_SCHEMA_COLUMNS_EMPTY_TABLE = []PgSchemaColumn{ + { + ColumnName: "id", + DataType: "integer", + UdtName: "int4", + IsNullable: "NO", + OrdinalPosition: "1", + CharacterMaximumLength: "0", + NumericPrecision: "32", + NumericScale: "0", + DatetimePrecision: "0", + Namespace: "pg_catalog", + }, +} + +var CSV_ROWS_TEST_TABLE = [][]string{ { "1", // id "1", // bit_column - "true", // bool_column + "t", // bool_column "bpchar", // bpchar_column "varchar", // varchar_column "text", // text_column @@ -301,7 +326,7 @@ var PUBLIC_SCHEMA_TEST_TABLE_LOADED_ROWS = [][]string{ "3.141592653589793", // float8_column "12345.67", // numeric_column "12345.67", // numeric_column_without_precision - "2021-01-01", // date_column + "2024-01-01", // date_column "12:00:00.123456", // time_column "12:00:00.123", // timeMsColumn "12:00:00.123456-05", // timetz_column @@ -310,19 +335,18 @@ var PUBLIC_SCHEMA_TEST_TABLE_LOADED_ROWS = [][]string{ "2024-01-01 12:00:00.123", // timestamp_ms_column "2024-01-01 12:00:00.123456-05", // timestamptz_column "2024-01-01 12:00:00.123-05", // timestamptz_ms_column - "2024-01-01 12:00:00.123456-05:30", // timestamptz_column_timezone_mins "58a7c845-af77-44b2-8664-7ca613d92f04", // uuid_column - "\\x1234", // bytea_column + "\\x48656c6c6f", // bytea_column "1 mon 2 days 01:00:01.000001", // interval_column "'sampl':1 'text':2 'tsvector':4", // tsvector_column "text", // xml_column - "2784:2784:", // pg_snapshot_column + "1896:1896:", // pg_snapshot_column "(37.347301483154,45.002101898193)", // point_column "192.168.0.1", // inet_column "{\"key\": \"value\"}", // json_column - "{\"key\": \"value\"}", // jsonb_column - "{one,two,three}", // array_text_column - "{1,2,3}", // array_int_column + "{\"key\": \"value\", \"nestedKey\": { \"key\": \"value\" }}", // jsonb_column + "{one,two,three}", // array_text_column + "{1,2,3}", // array_int_column `{"{\"key\": \"value1\"}","{\"key\": \"value2\"}"}`, // array_jsonb_column "{\"a.b\",\"c.d\"}", // array_ltree_column "(Toronto)", // user_defined_column @@ -330,7 +354,7 @@ var PUBLIC_SCHEMA_TEST_TABLE_LOADED_ROWS = [][]string{ { "2", // id PG_NULL_STRING, // bit_column - "false", // bool_column + "f", // bool_column "", // bpchar_column PG_NULL_STRING, // varchar_column "", // text_column @@ -351,9 +375,8 @@ var PUBLIC_SCHEMA_TEST_TABLE_LOADED_ROWS = [][]string{ "12:00:00.1+05", // timetz_ms_column "2024-01-01 12:00:00", // timestamp_column PG_NULL_STRING, // timestamp_ms_column - "2024-01-01 12:00:00.000123+05", // timestamptz_column + "2024-01-01 12:00:00.000123+05:30", // timestamptz_column "2024-01-01 12:00:00.12+05", // timestamptz_ms_column - "2024-01-01 12:00:00.000123+05:30", // timestamptz_column_timezone_mins PG_NULL_STRING, // uuid_column PG_NULL_STRING, // bytea_column PG_NULL_STRING, // interval_column @@ -371,73 +394,330 @@ var PUBLIC_SCHEMA_TEST_TABLE_LOADED_ROWS = [][]string{ PG_NULL_STRING, // user_defined_column }, } +var CSV_ROWS_PARTITIONED_TABLE1 = [][]string{{"2024-01-01 01:02:03.123456"}} +var CSV_ROWS_PARTITIONED_TABLE2 = [][]string{{"2024-02-12 11:12:13"}} +var CSV_ROWS_PARTITIONED_TABLE3 = [][]string{{"2024-03-30 23:59:59"}} -var TEST_SCHEMA_EMPTY_TABLE_PG_SCHEMA_COLUMNS = []PgSchemaColumn{ - { - ColumnName: "id", - DataType: "integer", - UdtName: "int4", - IsNullable: "NO", - OrdinalPosition: "1", - CharacterMaximumLength: "0", - NumericPrecision: "32", - NumericScale: "0", - DatetimePrecision: "0", - Namespace: "pg_catalog", - }, -} -var TEST_SCHEMA_EMPTY_TABLE_LOADED_ROWS = [][]string{} +var JSON_ROWS_TEST_TABLE = []string{ + `{ + "before":null, + "after":{ + "id":1, + "bit_column":true, + "bool_column":true, + "bpchar_column":"bpchar ", + "varchar_column":"varchar", + "text_column":"text", + "int2_column":32767, + "int4_column":2147483647, + "int8_column":9223372036854775807, + "hugeint_column":1.0E19, + "xid_column":4294967295, + "xid8_column":1.8446744073709552E19, + "float4_column":3.14, + "float8_column":3.141592653589793, + "numeric_column":12345.67, + "numeric_column_without_precision":12345.67, + "date_column":19723, + "time_column":43200123456, + "timemscolumn":43200123, + "timetz_column":"17:00:00.123456Z", + "timetz_ms_column":"17:00:00.123Z", + "timestamp_column":1704110400123456, + "timestamp_ms_column":1704110400123, + "timestamptz_column":"2024-01-01T17:00:00.123456Z", + "timestamptz_ms_column":"2024-01-01T17:00:00.123Z", + "uuid_column":"58a7c845-af77-44b2-8664-7ca613d92f04", + "bytea_column":"48656c6c6f", + "interval_column":2806201000001, + "point_column":{ + "x":37.347301483154, + "y":45.002101898193, + "wkb":"AQEAAADW//9fdKxCQM3//99EgEZA", + "srid":null + }, + "inet_column":"192.168.0.1", + "json_column":"{\"key\": \"value\"}", + "jsonb_column":"{\"key\": \"value\", \"nestedKey\": { \"key\": \"value\" }}", + "tsvector_column":"'sampl':1 'text':2 'tsvector':4", + "xml_column":"text", + "pg_snapshot_column":"1896:1896:", + "array_text_column":[ + "one", + "two", + "three" + ], + "array_int_column":[ + 1, + 2, + 3 + ], + "array_jsonb_column":[ + "{\"key\": \"value1\"}", + "{\"key\": \"value2\"}" + ], + "array_ltree_column":[ + "a.b", + "c.d" + ], + "user_defined_column":"28546f726f6e746f29" + }, + "source":{ + "version":"3.1.3.Final", + "connector":"postgresql", + "name":"prefix", + "ts_ms":1750942485790, + "snapshot":"first_in_data_collection", + "db":"tpch", + "sequence":"[null,\"98162912\"]", + "ts_us":1750942485790370, + "ts_ns":1750942485790370000, + "schema":"public", + "table":"test_table", + "txId":2352, + "lsn":98162912, + "xmin":null + }, + "transaction":null, + "op":"r", + "ts_ms":1750942485897, + "ts_us":1750942485897437, + "ts_ns":1750942485897437000 + }`, + `{ + "before":null, + "after":{ + "id":2, + "bit_column":null, + "bool_column":false, + "bpchar_column":" ", + "varchar_column":null, + "text_column":"", + "int2_column":-32767, + "int4_column":null, + "int8_column":-9223372036854775807, + "hugeint_column":null, + "xid_column":null, + "xid8_column":null, + "float4_column":"NaN", + "float8_column":-3.141592653589793, + "numeric_column":-12345.0, + "numeric_column_without_precision":null, + "date_column":6594769, + "time_column":43200123000, + "timemscolumn":null, + "timetz_column":"07:00:00.123Z", + "timetz_ms_column":"07:00:00.1Z", + "timestamp_column":1704110400000000, + "timestamp_ms_column":null, + "timestamptz_column":"2024-01-01T06:30:00.000123Z", + "timestamptz_ms_column":"2024-01-01T07:00:00.120Z", + "uuid_column":null, + "bytea_column":null, + "interval_column":null, + "point_column":null, + "inet_column":null, + "json_column":null, + "jsonb_column":"{}", + "tsvector_column":null, + "xml_column":null, + "pg_snapshot_column":null, + "array_text_column":null, + "array_int_column":[ -var PUBLIC_SCHEMA_PARTITIONED_TABLE_PG_SCHEMA_COLUMNS = []PgSchemaColumn{ - { - ColumnName: "timestamp_column", - DataType: "timestamp without time zone", - UdtName: "timestamp", - IsNullable: "NO", - OrdinalPosition: "1", - CharacterMaximumLength: "0", - NumericPrecision: "0", - NumericScale: "0", - DatetimePrecision: "6", - Namespace: "pg_catalog", - }, + ], + "array_jsonb_column":null, + "array_ltree_column":null, + "user_defined_column":null + }, + "source":{ + "version":"3.1.3.Final", + "connector":"postgresql", + "name":"prefix", + "ts_ms":1750942485790, + "snapshot":"last", + "db":"tpch", + "sequence":"[null,\"98162912\"]", + "ts_us":1750942485790370, + "ts_ns":1750942485790370000, + "schema":"public", + "table":"test_table", + "txId":2352, + "lsn":98162912, + "xmin":null + }, + "transaction":null, + "op":"r", + "ts_ms":1750942485898, + "ts_us":1750942485898829, + "ts_ns":1750942485898829000 + }`, +} +var JSON_ROWS_PARTITIONED_TABLE1 = []string{ + `{ + "before":null, + "after":{ + "timestamp_column":1704070923123456 + }, + "source":{ + "version":"3.1.3.Final", + "connector":"postgresql", + "name":"prefix", + "ts_ms":1750942485790, + "snapshot":"last_in_data_collection", + "db":"tpch", + "sequence":"[null,\"98162912\"]", + "ts_us":1750942485790370, + "ts_ns":1750942485790370000, + "schema":"public", + "table":"partitioned_table1", + "txId":2352, + "lsn":98162912, + "xmin":null + }, + "transaction":null, + "op":"r", + "ts_ms":1750942485881, + "ts_us":1750942485881498, + "ts_ns":1750942485881498000 + }`, +} +var JSON_ROWS_PARTITIONED_TABLE2 = []string{ + `{ + "before":null, + "after":{ + "timestamp_column":1707736333000000 + }, + "source":{ + "version":"3.1.3.Final", + "connector":"postgresql", + "name":"prefix", + "ts_ms":1750942485790, + "snapshot":"last_in_data_collection", + "db":"tpch", + "sequence":"[null,\"98162912\"]", + "ts_us":1750942485790370, + "ts_ns":1750942485790370000, + "schema":"public", + "table":"partitioned_table2", + "txId":2352, + "lsn":98162912, + "xmin":null + }, + "transaction":null, + "op":"r", + "ts_ms":1750942485882, + "ts_us":1750942485882849, + "ts_ns":1750942485882849000 + }`, +} +var JSON_ROWS_PARTITIONED_TABLE3 = []string{ + `{ + "before":null, + "after":{ + "timestamp_column":1711843199000000 + }, + "source":{ + "version":"3.1.3.Final", + "connector":"postgresql", + "name":"prefix", + "ts_ms":1750942485790, + "snapshot":"last_in_data_collection", + "db":"tpch", + "sequence":"[null,\"98162912\"]", + "ts_us":1750942485790370, + "ts_ns":1750942485790370000, + "schema":"public", + "table":"partitioned_table3", + "txId":2352, + "lsn":98162912, + "xmin":null + }, + "transaction":null, + "op":"r", + "ts_ms":1750942485884, + "ts_us":1750942485884078, + "ts_ns":1750942485884078000 + }`, } -var PUBLIC_SCHEMA_PARTITIONED_TABLE1_LOADED_ROWS = [][]string{{"2024-01-01 01:02:03.123456"}} -var PUBLIC_SCHEMA_PARTITIONED_TABLE2_LOADED_ROWS = [][]string{{"2024-02-12 11:12:13"}} -var PUBLIC_SCHEMA_PARTITIONED_TABLE3_LOADED_ROWS = [][]string{{"2024-03-30 23:59:59"}} func init() { - loadTestConfig() + config := loadTestConfig() + trino := common.NewTrino(config.BaseConfig) + defer trino.Close() - for i := range PUBLIC_SCHEMA_TEST_TABLE_PG_SCHEMA_COLUMNS { - PUBLIC_SCHEMA_TEST_TABLE_PG_SCHEMA_COLUMNS[i].OrdinalPosition = IntToString(i + 1) - if PUBLIC_SCHEMA_TEST_TABLE_PG_SCHEMA_COLUMNS[i].IsNullable == "" { - PUBLIC_SCHEMA_TEST_TABLE_PG_SCHEMA_COLUMNS[i].IsNullable = "YES" + utils := NewSyncerUtils(config) + trino.CreateSchemaIfNotExists() + utils.DropOldTables(trino, common.NewSet[string]()) + + // Prepare PgSchemaColumns + for i := range PG_SCHEMA_COLUMNS_TEST_TABLE { + PG_SCHEMA_COLUMNS_TEST_TABLE[i].OrdinalPosition = common.IntToString(i + 1) + if PG_SCHEMA_COLUMNS_TEST_TABLE[i].IsNullable == "" { + PG_SCHEMA_COLUMNS_TEST_TABLE[i].IsNullable = "YES" } + PG_SCHEMA_COLUMNS_TEST_TABLE[i].Config = config + } + for i := range PG_SCHEMA_COLUMNS_PARTITIONED_TABLE { + PG_SCHEMA_COLUMNS_PARTITIONED_TABLE[i].Config = config + } + for i := range PG_SCHEMA_COLUMNS_EMPTY_TABLE { + PG_SCHEMA_COLUMNS_EMPTY_TABLE[i].Config = config + } + + switch config.SyncMode { + case SyncModeFullRefresh: + createTestTableViaFullRefresh(config, trino, PgSchemaTable{Schema: "public", Table: "test_table"}, PG_SCHEMA_COLUMNS_TEST_TABLE, CSV_ROWS_TEST_TABLE) + createTestTableViaFullRefresh(config, trino, PgSchemaTable{Schema: "public", Table: "partitioned_table1"}, PG_SCHEMA_COLUMNS_PARTITIONED_TABLE, CSV_ROWS_PARTITIONED_TABLE1) + createTestTableViaFullRefresh(config, trino, PgSchemaTable{Schema: "public", Table: "partitioned_table2"}, PG_SCHEMA_COLUMNS_PARTITIONED_TABLE, CSV_ROWS_PARTITIONED_TABLE2) + createTestTableViaFullRefresh(config, trino, PgSchemaTable{Schema: "public", Table: "partitioned_table3"}, PG_SCHEMA_COLUMNS_PARTITIONED_TABLE, CSV_ROWS_PARTITIONED_TABLE3) + createTestTableViaFullRefresh(config, trino, PgSchemaTable{Schema: "test", Table: "empty_table"}, PG_SCHEMA_COLUMNS_EMPTY_TABLE, [][]string{}) + case SyncModeCDC: + createTestTableViaCdc(config, trino, PgSchemaTable{Schema: "public", Table: "test_table"}, PG_SCHEMA_COLUMNS_TEST_TABLE, JSON_ROWS_TEST_TABLE) + createTestTableViaCdc(config, trino, PgSchemaTable{Schema: "public", Table: "partitioned_table1"}, PG_SCHEMA_COLUMNS_PARTITIONED_TABLE, JSON_ROWS_PARTITIONED_TABLE1) + createTestTableViaCdc(config, trino, PgSchemaTable{Schema: "public", Table: "partitioned_table2"}, PG_SCHEMA_COLUMNS_PARTITIONED_TABLE, JSON_ROWS_PARTITIONED_TABLE2) + createTestTableViaCdc(config, trino, PgSchemaTable{Schema: "public", Table: "partitioned_table3"}, PG_SCHEMA_COLUMNS_PARTITIONED_TABLE, JSON_ROWS_PARTITIONED_TABLE3) + createTestTableViaCdc(config, trino, PgSchemaTable{Schema: "test", Table: "empty_table"}, PG_SCHEMA_COLUMNS_EMPTY_TABLE, []string{}) } } func loadTestConfig() *Config { setTestArgs([]string{}) - config := LoadConfig(true) - config.User = "bemidb" - config.EncryptedPassword = "bemidb-encrypted" - config.StorageType = STORAGE_TYPE_LOCAL - config.StoragePath = "../iceberg-test" - config.LogLevel = "ERROR" - config.DisableAnonymousAnalytics = true - config.Pg.DatabaseUrl = "postgresql://postgres:postgres@localhost:5432/dbname" + _config.DatabaseUrl = "postgres://test:test@localhost:5432/dummy" - return config + return LoadConfig() } func setTestArgs(args []string) { - // Reset state - _config = Config{} - _configParseValues = configParseValues{} - os.Args = append([]string{"cmd"}, args...) flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ExitOnError) registerFlags() } + +func createTestTableViaCdc(config *Config, trino *common.Trino, pgSchemaTable PgSchemaTable, pgSchemaColumns []PgSchemaColumn, messagesStrings []string) { + panic("CDC is not supported") +} + +func createTestTableViaFullRefresh(config *Config, trino *common.Trino, pgSchemaTable PgSchemaTable, pgSchemaColumns []PgSchemaColumn, rows [][]string) { + cappedBuffer := common.NewCappedBuffer(config.BaseConfig, MAX_IN_MEMORY_BUFFER_SIZE) + writer := csv.NewWriter(cappedBuffer) + + headerRow := []string{} + for _, pgSchemaColumn := range pgSchemaColumns { + headerRow = append(headerRow, pgSchemaColumn.ColumnName) + } + err := writer.Write(headerRow) + common.PanicIfError(config.BaseConfig, err) + + for _, row := range rows { + err := writer.Write(row) + common.PanicIfError(config.BaseConfig, err) + } + + writer.Flush() + cappedBuffer.Close() + + syncer := NewSyncerFullRefresh(config) + syncer.writeToIceberg(trino, pgSchemaTable, pgSchemaColumns, cappedBuffer) +} diff --git a/src/syncer-postgres/main.go b/src/syncer-postgres/main.go new file mode 100644 index 0000000..4f94206 --- /dev/null +++ b/src/syncer-postgres/main.go @@ -0,0 +1,7 @@ +package main + +func main() { + config := LoadConfig() + syncer := NewSyncer(config) + syncer.Sync() +} diff --git a/src/syncer-postgres/nats.go b/src/syncer-postgres/nats.go new file mode 100644 index 0000000..ca2b907 --- /dev/null +++ b/src/syncer-postgres/nats.go @@ -0,0 +1,37 @@ +package main + +import ( + "context" + + nts "github.com/nats-io/nats.go" + js "github.com/nats-io/nats.go/jetstream" + + "github.com/BemiHQ/BemiDB/src/syncer-common" +) + +const () + +type Nats struct { + Config *Config +} + +func NewNats(config *Config) *Nats { + return &Nats{ + Config: config, + } +} + +func (nats *Nats) Stream(ctx context.Context) js.Stream { + jetstream := nats.newJetstream() + stream, err := jetstream.Stream(ctx, nats.Config.Nats.Stream) + common.PanicIfError(nats.Config.BaseConfig, err) + return stream +} + +func (nats *Nats) newJetstream() js.JetStream { + nc, err := nts.Connect(nats.Config.Nats.Url) + common.PanicIfError(nats.Config.BaseConfig, err) + jetstream, err := js.New(nc) + common.PanicIfError(nats.Config.BaseConfig, err) + return jetstream +} diff --git a/src/syncer-postgres/pg_schema_column.go b/src/syncer-postgres/pg_schema_column.go new file mode 100644 index 0000000..e0690f0 --- /dev/null +++ b/src/syncer-postgres/pg_schema_column.go @@ -0,0 +1,330 @@ +package main + +import ( + "encoding/csv" + "fmt" + "reflect" + "strings" + "time" + + "github.com/BemiHQ/BemiDB/src/syncer-common" +) + +const ( + PG_DATA_TYPE_ARRAY = "ARRAY" +) + +type PgSchemaColumn struct { + ColumnName string + DataType string + UdtName string + IsNullable string + OrdinalPosition string + CharacterMaximumLength string + NumericPrecision string + NumericScale string + DatetimePrecision string + Namespace string + PartOfPrimaryKey bool + Config *Config +} + +func NewPgSchemaColumn(config *Config) *PgSchemaColumn { + return &PgSchemaColumn{ + Config: config, + } +} + +func (pgSchemaColumn *PgSchemaColumn) TrinoType() string { + primitiveType := pgSchemaColumn.primitiveTrinoType() + + if pgSchemaColumn.DataType == PG_DATA_TYPE_ARRAY { + return "ARRAY(" + primitiveType + ")" + } + return primitiveType +} + +func (pgSchemaColumn *PgSchemaColumn) JsonToTrinoValue(jsonValue interface{}) string { + if pgSchemaColumn.DataType == PG_DATA_TYPE_ARRAY { + if jsonValue == nil { + return "NULL" + } + + var values []string + + for _, value := range jsonValue.([]interface{}) { + values = append(values, pgSchemaColumn.jsonToPrimitiveTrinoValue(value)) + } + + return "ARRAY[" + strings.Join(values, ",") + "]" + } + + return pgSchemaColumn.jsonToPrimitiveTrinoValue(jsonValue) +} + +func (pgSchemaColumn *PgSchemaColumn) CsvToTrinoValue(csvValue string) string { + if pgSchemaColumn.DataType == PG_DATA_TYPE_ARRAY { + if csvValue == PG_NULL_STRING { + return "NULL" + } + + csvString := strings.TrimPrefix(csvValue, "{") + csvString = strings.TrimSuffix(csvString, "}") + if csvString == "" { + return "ARRAY[]" + } + + // Replace escaped double quotes with double quotes according to CSV format rules + csvString = strings.ReplaceAll(csvString, "\\\"", "\"\"") + csvReader := csv.NewReader(strings.NewReader(csvString)) + stringValues, err := csvReader.Read() + common.PanicIfError(pgSchemaColumn.Config.BaseConfig, err) + + var values []string + for _, stringValue := range stringValues { + values = append(values, pgSchemaColumn.csvToPrimitiveTrinoValue(stringValue)) + } + return "ARRAY[" + strings.Join(values, ",") + "]" + } + + return pgSchemaColumn.csvToPrimitiveTrinoValue(csvValue) +} + +func (pgSchemaColumn *PgSchemaColumn) jsonToPrimitiveTrinoValue(jsonValue interface{}) string { + if jsonValue == nil { + return "NULL" + } + + kind := reflect.TypeOf(jsonValue).Kind() + + switch strings.TrimLeft(pgSchemaColumn.UdtName, "_") { + case "bool": + if jsonValue.(bool) { + return "true" + } + return "false" + case "bit": + if jsonValue.(bool) { + return "1" + } + return "0" + case "int2", "int4", "xid": + return common.Float64ToString(jsonValue.(float64)) + case "float4": + if kind == reflect.String { + return "nan()" + } + return common.Float64ToString(jsonValue.(float64)) + case "float8": + if kind == reflect.String { + return "nan()" + } + return "CAST('" + common.Float64ToString(jsonValue.(float64)) + "' AS DOUBLE)" + case "int8", "xid8", "numeric": + return "DECIMAL '" + common.Float64ToString(jsonValue.(float64)) + "'" + case "date": + return "DATE '1970-01-01' + INTERVAL '" + common.Float64ToString(jsonValue.(float64)) + "' DAY" + case "timestamp": + if pgSchemaColumn.DatetimePrecision == "6" { + return "from_unixtime_nanos(" + common.Float64ToString(jsonValue.(float64)) + " * 1000)" + } + return "from_unixtime_nanos(" + common.Float64ToString(jsonValue.(float64)) + " * 1000000)" + case "timestamptz": + return "from_iso8601_timestamp_nanos('" + jsonValue.(string) + "')" + case "time": + if pgSchemaColumn.DatetimePrecision == "6" { + microseconds := int64(jsonValue.(float64)) + hours := microseconds / 3_600_000_000 + microseconds %= 3_600_000_000 + minutes := microseconds / 60_000_000 + microseconds %= 60_000_000 + seconds := microseconds / 1_000_000 + microseconds %= 1_000_000 + return fmt.Sprintf("TIME '%02d:%02d:%02d.%06d'", int(hours), int(minutes), int(seconds), int(microseconds)) + } + milliseconds := int64(jsonValue.(float64)) + hours := milliseconds / 3_600_000 + milliseconds %= 3_600_000 + minutes := milliseconds / 60_000 + milliseconds %= 60_000 + seconds := milliseconds / 1_000 + milliseconds %= 1_000 + return fmt.Sprintf("TIME '%02d:%02d:%02d.%03d'", int(hours), int(minutes), int(seconds), int(milliseconds)) + case "timetz": + return "TIME '" + strings.TrimRight(jsonValue.(string), "Z") + "' AT TIME ZONE 'UTC'" + case "interval": + return "'" + common.Float64ToString(jsonValue.(float64)) + "us'" + case "varchar", "char", "text", "jsonb", "json", "uuid", + "line", "lseg", "box", "path", "polygon", "circle", + "cidr", "inet", "macaddr", "macaddr8", + "ltree", "tsvector", "xml", "pg_snapshot": + return "'" + strings.ReplaceAll(jsonValue.(string), "'", "''") + "'" + case "bytea": + return "CAST('\\x" + jsonValue.(string) + "' AS VARBINARY)" + case "bpchar": + trimmedValue := strings.TrimRight(jsonValue.(string), " ") + return "'" + strings.ReplaceAll(trimmedValue, "'", "''") + "'" + case "point", "geometry": + point := jsonValue.(map[string]interface{}) + if point["wkb"] == nil { + return "NULL" + } + return "'" + common.Base64ToHex(point["wkb"].(string)) + "'" + default: + // User-defined types -> VARCHAR value + if pgSchemaColumn.Namespace != PG_SCHEMA_PG_CATALOG { + if kind == reflect.String { + stringValue, err := common.HexToString(jsonValue.(string)) + if err == nil { + return "'" + stringValue + "'" + } else { + // Fallback to regular string value if not a valid hex string + return "'" + strings.ReplaceAll(jsonValue.(string), "'", "''") + "'" + } + } else { + panic(fmt.Sprintf("Unsupported user-defined type %+v with value %v of type %T", pgSchemaColumn, jsonValue, jsonValue)) + } + } + } + + panic("Unsupported PostgreSQL type: " + pgSchemaColumn.UdtName) +} + +func (pgSchemaColumn *PgSchemaColumn) csvToPrimitiveTrinoValue(csvValue string) string { + if csvValue == PG_NULL_STRING { + return "NULL" + } + + switch strings.TrimLeft(pgSchemaColumn.UdtName, "_") { + case "bool": + if csvValue == "t" { + return "TRUE" + } + return "FALSE" + case "bit", "int2", "int4", "xid": + return csvValue + case "float4": + if csvValue == "NaN" { + return "nan()" + } + return csvValue + case "float8": + if csvValue == "NaN" { + return "nan()" + } + return "CAST('" + csvValue + "' AS DOUBLE)" + case "int8", "xid8", "numeric": + return "DECIMAL '" + csvValue + "'" + case "date": + return "DATE '" + csvValue + "'" + case "timestamp", "timestamptz": + return "TIMESTAMP '" + csvValue + "'" + case "time": + return "TIME '" + csvValue + "'" + case "timetz": + var parsedTime time.Time + var err error + if pgSchemaColumn.DatetimePrecision == "6" { + parsedTime, err = time.Parse("15:04:05.999999-07", csvValue) + } else if pgSchemaColumn.DatetimePrecision == "3" { + parsedTime, err = time.Parse("15:04:05.999-07", csvValue) + } + common.PanicIfError(pgSchemaColumn.Config.BaseConfig, err) + + parsedTime = parsedTime.In(time.UTC) + return "TIME '" + parsedTime.Format("15:04:05.999999-07:00") + "' AT TIME ZONE 'UTC'" + case "interval": // 1 mon 2 days 01:00:01.000001 -> '_us' (microseconds) + microseconds := 0 + + parts := strings.Split(csvValue, " ") + for i, part := range parts { + if strings.HasPrefix(part, "mon") { + months := common.StringToInt(parts[i-1]) + microseconds += months * 30_437_500 * 24 * 60 * 60 // Approximation: 30.4375 days per month + } else if strings.HasPrefix(part, "day") { + days := common.StringToInt(parts[i-1]) + microseconds += days * 24 * 60 * 60 * 1_000_000 + } else if strings.Contains(part, ":") { + timeParts := strings.Split(part, ":") + hours := common.StringToInt(timeParts[0]) + minutes := common.StringToInt(timeParts[1]) + secondsParts := strings.Split(timeParts[2], ".") + seconds := common.StringToInt(secondsParts[0]) + microseconds += (hours * 60 * 60 * 1_000_000) + (minutes * 60 * 1_000_000) + (seconds * 1_000_000) + if len(secondsParts) > 1 && len(secondsParts[1]) == 6 { + microseconds += common.StringToInt(secondsParts[1]) + } + } + } + return "'" + common.IntToString(microseconds) + "us'" + case "varchar", "char", "text", "jsonb", "json", "uuid", + "line", "lseg", "box", "path", "polygon", "circle", + "cidr", "inet", "macaddr", "macaddr8", + "ltree", "tsvector", "xml", "pg_snapshot": + return "'" + strings.ReplaceAll(csvValue, "'", "''") + "'" + case "bytea": + return "CAST('" + csvValue + "' AS VARBINARY)" + case "bpchar": + trimmedValue := strings.TrimRight(csvValue, " ") + return "'" + strings.ReplaceAll(trimmedValue, "'", "''") + "'" + case "point": + return "to_hex(ST_AsBinary(ST_Point" + csvValue + "))" // to_hex(ST_AsBinary(ST_Point(1, 2))) + // TODO "geometry": + default: + // User-defined types -> VARCHAR value + if pgSchemaColumn.Namespace != PG_SCHEMA_PG_CATALOG { + return "'" + strings.ReplaceAll(csvValue, "'", "''") + "'" + } + } + + panic("Unsupported PostgreSQL type: " + pgSchemaColumn.UdtName) +} + +func (pgSchemaColumn *PgSchemaColumn) primitiveTrinoType() string { + switch strings.TrimLeft(pgSchemaColumn.UdtName, "_") { + case "bool": + return "BOOLEAN" + case "bit", "int2", "int4": + return "INTEGER" + case "xid": + return "BIGINT" + case "int8", "xid8": + return "DECIMAL(20, 0)" + case "float4": + return "REAL" + case "float8": + return "DOUBLE" + case "numeric": + scale := common.StringToInt(pgSchemaColumn.NumericScale) + precision := common.StringToInt(pgSchemaColumn.NumericPrecision) + if precision > common.TRINO_MAX_DECIMAL_PRECISION { + precision = common.TRINO_MAX_DECIMAL_PRECISION + } else if precision == 0 { + precision = common.TRINO_MAX_DECIMAL_PRECISION + scale = common.TRINO_MAX_DECIMAL_PRECISION / 2 + } + return "DECIMAL(" + common.IntToString(precision) + ", " + common.IntToString(scale) + ")" + case "date": + return "DATE" + case "time", "timetz": // TIME(6) WITH TIME ZONE in Iceberg is not supported by Trino + return "TIME(6)" + case "timestamp": + return "TIMESTAMP(6)" + case "timestamptz": + return "TIMESTAMP(6) WITH TIME ZONE" + case "varchar", "char", "text", "jsonb", "json", "bpchar", "uuid", + "point", "line", "lseg", "box", "path", "polygon", "circle", + "cidr", "inet", "macaddr", "macaddr8", + "interval", "ltree", "tsvector", "xml", "pg_snapshot": + return "VARCHAR" + case "bytea": + return "VARBINARY" + default: + // User-defined types -> VARCHAR + if pgSchemaColumn.Namespace != PG_SCHEMA_PG_CATALOG { + return "VARCHAR" + } + } + + panic("Unsupported PostgreSQL type: " + pgSchemaColumn.UdtName) +} diff --git a/src/syncer-postgres/pg_schema_table.go b/src/syncer-postgres/pg_schema_table.go new file mode 100644 index 0000000..d824cbd --- /dev/null +++ b/src/syncer-postgres/pg_schema_table.go @@ -0,0 +1,36 @@ +package main + +import ( + "fmt" + "strings" +) + +type PgSchemaTable struct { + Schema string + Table string + ParentPartitionedTable string +} + +func (pgSchemaTable PgSchemaTable) String() string { + return fmt.Sprintf(`"%s"."%s"`, pgSchemaTable.Schema, pgSchemaTable.Table) +} + +func (pgSchemaTable PgSchemaTable) ToConfigArg() string { + return fmt.Sprintf(`%s.%s`, pgSchemaTable.Schema, pgSchemaTable.Table) +} + +// public.table -> table +// CustomSchema.TableName -> custom_schema_table_name +func (pgSchemaTable PgSchemaTable) IcebergTableName() string { + if pgSchemaTable.Schema != PG_SCHEMA_PUBLIC { + return strings.ToLower(pgSchemaTable.Schema) + "_" + strings.ToLower(pgSchemaTable.Table) + } + return strings.ToLower(pgSchemaTable.Table) +} + +func (pgSchemaTable PgSchemaTable) IcebergParentPartitionedTableName() string { + if pgSchemaTable.Schema != PG_SCHEMA_PUBLIC { + return pgSchemaTable.Schema + "_" + pgSchemaTable.ParentPartitionedTable + } + return pgSchemaTable.ParentPartitionedTable +} diff --git a/src/syncer-postgres/postgres.go b/src/syncer-postgres/postgres.go new file mode 100644 index 0000000..73cb6f0 --- /dev/null +++ b/src/syncer-postgres/postgres.go @@ -0,0 +1,194 @@ +package main + +import ( + "context" + "net/url" + "strings" + "time" + + "github.com/BemiHQ/BemiDB/src/syncer-common" + "github.com/jackc/pgx/v5" +) + +const ( + PG_SCHEMA_PUBLIC = "public" + PG_SCHEMA_PG_CATALOG = "pg_catalog" + + PG_CONNECTION_TIMEOUT = 30 * time.Second + PG_SESSION_TIMEOUT = "2h" +) + +type Postgres struct { + Conn *pgx.Conn + Config *Config +} + +func NewPostgres(config *Config) *Postgres { + ctx, cancel := context.WithTimeout(context.Background(), PG_CONNECTION_TIMEOUT) + defer cancel() + + conn, err := pgx.Connect(ctx, urlEncodePassword(config.DatabaseUrl)) + common.PanicIfError(config.BaseConfig, err) + + _, err = conn.Exec(ctx, "SET SESSION statement_timeout = '"+PG_SESSION_TIMEOUT+"'") + common.PanicIfError(config.BaseConfig, err) + + return &Postgres{ + Config: config, + Conn: conn, + } +} + +func (postgres *Postgres) Close() { + err := postgres.Conn.Close(context.Background()) + common.PanicIfError(postgres.Config.BaseConfig, err) +} + +func (postgres *Postgres) Schemas() []string { + var schemas []string + + schemasRows, err := postgres.query( + context.Background(), + "SELECT schema_name FROM information_schema.schemata WHERE schema_name NOT IN ('pg_catalog', 'pg_toast', 'information_schema')", + ) + common.PanicIfError(postgres.Config.BaseConfig, err) + defer schemasRows.Close() + + for schemasRows.Next() { + var schema string + err = schemasRows.Scan(&schema) + common.PanicIfError(postgres.Config.BaseConfig, err) + schemas = append(schemas, schema) + } + + return schemas +} + +func (postgres *Postgres) SchemaTables(schema string) []PgSchemaTable { + var pgSchemaTables []PgSchemaTable + + tablesRows, err := postgres.query( + context.Background(), + ` + SELECT pg_class.relname AS table, COALESCE(parent.relname, '') AS parent_partitioned_table + FROM pg_class + JOIN pg_namespace ON pg_namespace.oid = pg_class.relnamespace + LEFT JOIN pg_inherits ON pg_inherits.inhrelid = pg_class.oid + LEFT JOIN pg_class AS parent ON pg_inherits.inhparent = parent.oid + WHERE pg_namespace.nspname = $1 AND pg_class.relkind = 'r' AND has_table_privilege(pg_class.oid, 'SELECT') + `, + schema, + ) + common.PanicIfError(postgres.Config.BaseConfig, err) + defer tablesRows.Close() + + for tablesRows.Next() { + pgSchemaTable := PgSchemaTable{Schema: schema} + err = tablesRows.Scan(&pgSchemaTable.Table, &pgSchemaTable.ParentPartitionedTable) + common.PanicIfError(postgres.Config.BaseConfig, err) + pgSchemaTables = append(pgSchemaTables, pgSchemaTable) + } + + return pgSchemaTables +} + +func (postgres *Postgres) PgSchemaColumns(pgSchemaTable PgSchemaTable) []PgSchemaColumn { + var pgSchemaColumns []PgSchemaColumn + + rows, err := postgres.query( + context.Background(), + `SELECT + columns.column_name, + columns.data_type, + columns.udt_name, + columns.is_nullable, + columns.ordinal_position, + COALESCE(columns.character_maximum_length, 0), + COALESCE(columns.numeric_precision, 0), + COALESCE(columns.numeric_scale, 0), + COALESCE(columns.datetime_precision, 0), + pg_namespace.nspname, + CASE WHEN pk.constraint_name IS NOT NULL THEN true ELSE false END + FROM information_schema.columns + JOIN pg_type ON pg_type.typname = columns.udt_name + JOIN pg_namespace ON pg_namespace.oid = pg_type.typnamespace + LEFT JOIN ( + SELECT + tc.constraint_name, + kcu.column_name, + kcu.table_schema, + kcu.table_name + FROM information_schema.table_constraints tc + JOIN information_schema.key_column_usage kcu + ON tc.constraint_name = kcu.constraint_name + AND tc.table_schema = kcu.table_schema + AND tc.table_name = kcu.table_name + WHERE tc.constraint_type = 'PRIMARY KEY' + ) pk ON pk.column_name = columns.column_name AND pk.table_schema = columns.table_schema AND pk.table_name = columns.table_name + WHERE columns.table_schema = $1 AND columns.table_name = $2 AND columns.is_generated = 'NEVER' + ORDER BY columns.ordinal_position`, + pgSchemaTable.Schema, + pgSchemaTable.Table, + ) + common.PanicIfError(postgres.Config.BaseConfig, err) + defer rows.Close() + + for rows.Next() { + pgSchemaColumn := NewPgSchemaColumn(postgres.Config) + err = rows.Scan( + &pgSchemaColumn.ColumnName, + &pgSchemaColumn.DataType, + &pgSchemaColumn.UdtName, + &pgSchemaColumn.IsNullable, + &pgSchemaColumn.OrdinalPosition, + &pgSchemaColumn.CharacterMaximumLength, + &pgSchemaColumn.NumericPrecision, + &pgSchemaColumn.NumericScale, + &pgSchemaColumn.DatetimePrecision, + &pgSchemaColumn.Namespace, + &pgSchemaColumn.PartOfPrimaryKey, + ) + common.PanicIfError(postgres.Config.BaseConfig, err) + pgSchemaColumns = append(pgSchemaColumns, *pgSchemaColumn) + } + + return pgSchemaColumns +} + +// Example: +// - From postgres://username:pas$:wor^d@host:port/database +// - To postgres://username:pas%24%3Awor%5Ed@host:port/database +func urlEncodePassword(pgDatabaseUrl string) string { + // No credentials + if !strings.Contains(pgDatabaseUrl, "@") { + return pgDatabaseUrl + } + + password := strings.TrimPrefix(pgDatabaseUrl, "postgresql://") + password = strings.TrimPrefix(password, "postgres://") + passwordEndIndex := strings.LastIndex(password, "@") + password = password[:passwordEndIndex] + + // Credentials without password + if !strings.Contains(password, ":") { + return pgDatabaseUrl + } + + _, password, _ = strings.Cut(password, ":") + decodedPassword, err := url.QueryUnescape(password) + if err != nil { + return pgDatabaseUrl + } + + // Password is already encoded + if decodedPassword != password { + return pgDatabaseUrl + } + + return strings.Replace(pgDatabaseUrl, ":"+password+"@", ":"+url.QueryEscape(password)+"@", 1) +} + +func (postgres *Postgres) query(ctx context.Context, query string, args ...any) (pgx.Rows, error) { + common.LogDebug(postgres.Config.BaseConfig, "Postgres query:", query) + return postgres.Conn.Query(ctx, query, args...) +} diff --git a/src/syncer-postgres/syncer.go b/src/syncer-postgres/syncer.go new file mode 100644 index 0000000..a363a72 --- /dev/null +++ b/src/syncer-postgres/syncer.go @@ -0,0 +1,69 @@ +package main + +import ( + "net/url" + + "github.com/BemiHQ/BemiDB/src/syncer-common" +) + +type Syncer struct { + Config *Config + Utils *SyncerUtils +} + +func NewSyncer(config *Config) *Syncer { + return &Syncer{ + Config: config, + Utils: NewSyncerUtils(config), + } +} + +func (syncer *Syncer) Sync() { + common.SendAnonymousAnalytics(syncer.Config.BaseConfig, "syncer-postgres-start", syncer.name()) + + postgres := NewPostgres(syncer.Config) + defer postgres.Close() + + trino := common.NewTrino(syncer.Config.BaseConfig) + defer trino.Close() + + trino.CreateSchemaIfNotExists() + + pgSchemaTables := syncer.pgSchemaTables(postgres, trino) + + switch syncer.Config.SyncMode { + case SyncModeCDC: + common.LogInfo(syncer.Config.BaseConfig, "Starting CDC sync...") + panic("CDC is not supported") + case SyncModeIncremental: + common.LogInfo(syncer.Config.BaseConfig, "Starting incremental sync...") + panic("Incremental sync is not supported") + case SyncModeFullRefresh: + common.LogInfo(syncer.Config.BaseConfig, "Starting full-refresh sync...") + NewSyncerFullRefresh(syncer.Config).Sync(postgres, trino, pgSchemaTables) + } + + common.SendAnonymousAnalytics(syncer.Config.BaseConfig, "syncer-postgres-finish", syncer.name()) +} + +func (syncer *Syncer) pgSchemaTables(postgres *Postgres, trino *common.Trino) []PgSchemaTable { + pgSchemaTables := make([]PgSchemaTable, 0) + for _, schema := range postgres.Schemas() { + for _, pgSchemaTable := range postgres.SchemaTables(schema) { + if !syncer.Utils.ShouldSyncTable(pgSchemaTable) { + continue + } + pgSchemaTables = append(pgSchemaTables, pgSchemaTable) + } + } + return pgSchemaTables +} + +func (syncer *Syncer) name() string { + url, err := url.Parse(syncer.Config.DatabaseUrl) + if err != nil { + return "" + } + + return url.Hostname() +} diff --git a/src/syncer-postgres/syncer_full_refresh.go b/src/syncer-postgres/syncer_full_refresh.go new file mode 100644 index 0000000..dbced0d --- /dev/null +++ b/src/syncer-postgres/syncer_full_refresh.go @@ -0,0 +1,109 @@ +package main + +import ( + "context" + "strings" + + "github.com/BemiHQ/BemiDB/src/syncer-common" + "github.com/jackc/pgx/v5" +) + +const ( + TEMP_TABLE_SUFFIX_SYNCING = "-bemidb-syncing" + TEMP_TABLE_SUFFIX_DELETING = "-bemidb-deleting" +) + +type SyncerFullRefresh struct { + Config *Config + Utils *SyncerUtils +} + +func NewSyncerFullRefresh(config *Config) *SyncerFullRefresh { + return &SyncerFullRefresh{ + Config: config, + Utils: NewSyncerUtils(config), + } +} + +func (syncer *SyncerFullRefresh) Sync(postgres *Postgres, trino *common.Trino, pgSchemaTables []PgSchemaTable) { + _, err := postgres.Conn.Exec(context.Background(), "BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE READ ONLY DEFERRABLE") + common.PanicIfError(syncer.Config.BaseConfig, err) + + icebergTableNames := common.NewSet[string]() + + for _, pgSchemaTable := range pgSchemaTables { + pgSchemaColumns := postgres.PgSchemaColumns(pgSchemaTable) + + common.LogInfo(syncer.Config.BaseConfig, "Syncing table:", pgSchemaTable.String()+"...") + syncer.syncTable(postgres, trino, pgSchemaTable, pgSchemaColumns) + + icebergTableNames.Add(pgSchemaTable.IcebergTableName()) + } + + syncer.Utils.DropOldTables(trino, icebergTableNames) +} + +func (syncer *SyncerFullRefresh) syncTable(postgres *Postgres, trino *common.Trino, pgSchemaTable PgSchemaTable, pgSchemaColumns []PgSchemaColumn) { + // Create a capped buffer read and written in parallel + cappedBuffer := common.NewCappedBuffer(syncer.Config.BaseConfig, MAX_IN_MEMORY_BUFFER_SIZE) + + // Copy from PG to cappedBuffer in a separate goroutine in parallel + go func() { + syncer.copyFromPgTable(postgres.Conn, pgSchemaTable, cappedBuffer) + }() + + // Read from cappedBuffer and write to Iceberg + syncer.writeToIceberg(trino, pgSchemaTable, pgSchemaColumns, cappedBuffer) +} + +func (syncer *SyncerFullRefresh) writeToIceberg(trino *common.Trino, pgSchemaTable PgSchemaTable, pgSchemaColumns []PgSchemaColumn, cappedBuffer *common.CappedBuffer) { + columnSchemas := []string{} + for _, pgSchemaColumn := range pgSchemaColumns { + columnSchemas = append(columnSchemas, `"`+pgSchemaColumn.ColumnName+"\" "+pgSchemaColumn.TrinoType()) + } + + syncingQuotedTrinoTablePath := trino.Schema() + `."` + pgSchemaTable.IcebergTableName() + TEMP_TABLE_SUFFIX_SYNCING + `"` + deletingQuotedTrinoTablePath := trino.Schema() + `."` + pgSchemaTable.IcebergTableName() + TEMP_TABLE_SUFFIX_DELETING + `"` + newQuotedTrinoTablePath := trino.Schema() + `."` + pgSchemaTable.IcebergTableName() + `"` + + syncer.recreateTable(trino, syncingQuotedTrinoTablePath, "("+strings.Join(columnSchemas, ",")+")") + + syncer.Utils.InsertFromCappedBuffer(trino, syncingQuotedTrinoTablePath, pgSchemaTable, pgSchemaColumns, cappedBuffer) + + syncer.swapTable(trino, syncingQuotedTrinoTablePath, deletingQuotedTrinoTablePath, newQuotedTrinoTablePath) + + common.LogInfo(syncer.Config.BaseConfig, "Compacting...") + trino.CompactTable(newQuotedTrinoTablePath) +} + +func (syncer *SyncerFullRefresh) copyFromPgTable(copyConn *pgx.Conn, pgSchemaTable PgSchemaTable, cappedBuffer *common.CappedBuffer) { + copySql := "COPY " + pgSchemaTable.String() + " TO STDOUT WITH CSV HEADER NULL '" + PG_NULL_STRING + "'" + result, err := copyConn.PgConn().CopyTo(context.Background(), cappedBuffer, copySql) + common.PanicIfError(syncer.Config.BaseConfig, err) + + common.LogInfo(syncer.Config.BaseConfig, "Copied", result.RowsAffected(), "row(s) into", pgSchemaTable.String()) + cappedBuffer.Close() +} + +func (syncer *SyncerFullRefresh) recreateTable(trino *common.Trino, syncingQuotedTrinoTablePath string, columnSchemasStatement string) { + ctx := context.Background() + + _, err := trino.ExecContext(ctx, "DROP TABLE IF EXISTS "+syncingQuotedTrinoTablePath) + common.PanicIfError(syncer.Config.BaseConfig, err) + + _, err = trino.ExecContext(ctx, "CREATE TABLE "+syncingQuotedTrinoTablePath+columnSchemasStatement) + common.PanicIfError(syncer.Config.BaseConfig, err) +} + +func (syncer *SyncerFullRefresh) swapTable(trino *common.Trino, syncingQuotedTrinoTablePath string, deletingQuotedTrinoTablePath string, newQuotedTrinoTablePath string) { + ctx := context.Background() + + _, err := trino.ExecContext(ctx, "DROP TABLE IF EXISTS "+deletingQuotedTrinoTablePath) + common.PanicIfError(syncer.Config.BaseConfig, err) + + _, err = trino.ExecContext(ctx, "ALTER TABLE IF EXISTS "+newQuotedTrinoTablePath+" RENAME TO "+deletingQuotedTrinoTablePath) + common.PanicIfError(syncer.Config.BaseConfig, err) + + _, err = trino.ExecContext(ctx, "ALTER TABLE "+syncingQuotedTrinoTablePath+" RENAME TO "+newQuotedTrinoTablePath) + common.PanicIfError(syncer.Config.BaseConfig, err) +} diff --git a/src/syncer-postgres/syncer_utils.go b/src/syncer-postgres/syncer_utils.go new file mode 100644 index 0000000..2aa5370 --- /dev/null +++ b/src/syncer-postgres/syncer_utils.go @@ -0,0 +1,136 @@ +package main + +import ( + "context" + "encoding/csv" + "io" + "strings" + + "github.com/BemiHQ/BemiDB/src/syncer-common" +) + +var ( + MAX_IN_MEMORY_BUFFER_SIZE = 8 * 1024 * 1024 // 8 MB + + PG_NULL_STRING = "BEMIDB_NULL" + + COMPACT_AFTER_INSERT_BATCH_COUNT = 40 // Compact the table after every N insert batches +) + +type SyncerUtils struct { + Config *Config +} + +func NewSyncerUtils(config *Config) *SyncerUtils { + return &SyncerUtils{ + Config: config, + } +} + +func (utils *SyncerUtils) ShouldSyncTable(pgSchemaTable PgSchemaTable) bool { + if utils.Config.IncludeSchemas != nil && !utils.Config.IncludeSchemas.Contains(pgSchemaTable.Schema) { + return false + } + + if utils.Config.IncludeTables != nil && !utils.Config.IncludeTables.Contains(pgSchemaTable.ToConfigArg()) { + return false + } + + if utils.Config.ExcludeTables != nil && utils.Config.ExcludeTables.Contains(pgSchemaTable.ToConfigArg()) { + return false + } + + return true +} + +func (utils *SyncerUtils) CreateTableIfNotExists(trino *common.Trino, pgSchemaTable PgSchemaTable, pgSchemaColumns []PgSchemaColumn) { + columnSchemas := []string{} + for _, pgSchemaColumn := range pgSchemaColumns { + columnSchemas = append(columnSchemas, `"`+pgSchemaColumn.ColumnName+"\" "+pgSchemaColumn.TrinoType()) + } + + trino.CreateTableIfNotExists(pgSchemaTable.IcebergTableName(), "("+strings.Join(columnSchemas, ",")+")") +} + +func (utils *SyncerUtils) DropOldTables(trino *common.Trino, keepIcebergTableNames common.Set[string]) { + ctx := context.Background() + trinoTableNames := make([]string, 0) + + rows, err := trino.QueryContext(ctx, "SHOW TABLES FROM "+trino.Schema()) + common.PanicIfError(utils.Config.BaseConfig, err) + + for rows.Next() { + var tableName string + err := rows.Scan(&tableName) + common.PanicIfError(utils.Config.BaseConfig, err) + trinoTableNames = append(trinoTableNames, tableName) + } + + for _, trinoTableName := range trinoTableNames { + if keepIcebergTableNames.Contains(trinoTableName) { + continue + } + + common.LogInfo(utils.Config.BaseConfig, "Dropping old table: "+trinoTableName) + _, err = trino.ExecContext(ctx, "DROP TABLE IF EXISTS "+trino.Schema()+`."`+trinoTableName+`"`) + common.PanicIfError(utils.Config.BaseConfig, err) + } +} + +func (utils *SyncerUtils) InsertFromCappedBuffer(trino *common.Trino, quotedTrinoTablePath string, pgSchemaTable PgSchemaTable, pgSchemaColumns []PgSchemaColumn, cappedBuffer *common.CappedBuffer) { + ctx := context.Background() + csvReader := csv.NewReader(cappedBuffer) + _, err := csvReader.Read() // Read the header row + common.PanicIfError(utils.Config.BaseConfig, err) + + quotedColumnNames := []string{} + for _, pgSchemaColumn := range pgSchemaColumns { + quotedColumnNames = append(quotedColumnNames, `"`+pgSchemaColumn.ColumnName+`"`) + } + + insertSqlPrefix := "INSERT INTO " + quotedTrinoTablePath + "(" + strings.Join(quotedColumnNames, ",") + ")" + " VALUES " + currentSql := insertSqlPrefix + currentRowCount := 0 + batchCount := 0 + + for { + row, err := csvReader.Read() + if err == io.EOF { + break + } + if err != nil { + common.PanicIfError(utils.Config.BaseConfig, err) + } + + rowValues := []string{} + for i, pgSchemaColumn := range pgSchemaColumns { + rowValues = append(rowValues, pgSchemaColumn.CsvToTrinoValue(row[i])) + } + rowValuesStatement := "(" + strings.Join(rowValues, ",") + ")" + + currentRowCount++ + if len(currentSql)+len(rowValuesStatement)+1 < common.TRINO_MAX_QUERY_LENGTH { // +1 for the comma + if currentSql != insertSqlPrefix { + currentSql += "," + } + currentSql += rowValuesStatement + } else { + _, err := trino.ExecContext(ctx, currentSql) + common.PanicIfError(utils.Config.BaseConfig, err) + common.LogInfo(utils.Config.BaseConfig, "Inserted", currentRowCount, "rows into table:", pgSchemaTable.String()) + currentSql = insertSqlPrefix + rowValuesStatement + currentRowCount = 1 + batchCount++ + if batchCount%COMPACT_AFTER_INSERT_BATCH_COUNT == 0 { + common.LogInfo(utils.Config.BaseConfig, "Compacting table:", pgSchemaTable.String(), "after", batchCount, "insert batches") + trino.CompactTable(quotedTrinoTablePath) + } + } + } + + if currentSql != insertSqlPrefix { + _, err := trino.ExecContext(ctx, currentSql) + common.PanicIfError(utils.Config.BaseConfig, err) + common.LogInfo(utils.Config.BaseConfig, "Inserted", currentRowCount, "rows into table:", pgSchemaTable.String()) + } +} diff --git a/src/syncer.go b/src/syncer.go deleted file mode 100644 index 85d79e9..0000000 --- a/src/syncer.go +++ /dev/null @@ -1,317 +0,0 @@ -package main - -import ( - "bytes" - "context" - "encoding/json" - "fmt" - "net/http" - "net/url" - "runtime" - "strings" - "time" - - "github.com/jackc/pgx/v5" -) - -const ( - MAX_IN_MEMORY_BUFFER_SIZE = 128 * 1024 * 1024 // 128 MB (expands to ~160 MB memory usage) - MAX_PG_ROWS_BATCH_SIZE = 1 * 1024 * 1024 // 1 MB - PING_PG_INTERVAL_SECONDS = 24 - - MAX_PARQUET_PAYLOAD_THRESHOLD = 2 * 1024 * 1024 * 1024 // 2 GB (compressed to ~256 MB Parquet) -) - -type Syncer struct { - config *Config - icebergWriter *IcebergWriter - icebergReader *IcebergReader - syncerTable *SyncerTable -} - -func NewSyncer(config *Config) *Syncer { - if config.Pg.DatabaseUrl == "" { - PrintErrorAndExit(config, "Missing PostgreSQL database URL.\n\n"+ - "See https://github.com/BemiHQ/BemiDB#sync-command-options for more information.", - ) - } - - icebergWriter := NewIcebergWriter(config) - icebergReader := NewIcebergReader(config) - return &Syncer{ - config: config, - icebergWriter: icebergWriter, - icebergReader: icebergReader, - syncerTable: NewSyncerTable(config), - } -} - -func (syncer *Syncer) SyncFromPostgres() { - ctx := context.Background() - if syncer.config.Pg.IncrementallyRefreshedTables == nil { - syncer.sendAnonymousAnalytics("sync-start") - } else { - syncer.sendAnonymousAnalytics("sync-start-incremental") - } - - databaseUrl := syncer.urlEncodePassword(syncer.config.Pg.DatabaseUrl) - icebergSchemaTables, icebergSchemaTablesErr := syncer.icebergReader.SchemaTables() - - structureConn := syncer.newConnection(ctx, databaseUrl) - defer structureConn.Close(ctx) - - copyConn := syncer.newConnection(ctx, databaseUrl) - defer copyConn.Close(ctx) - - syncedPgSchemaTables := []PgSchemaTable{} - - for _, schema := range syncer.listPgSchemas(structureConn) { - for _, pgSchemaTable := range syncer.listPgSchemaTables(structureConn, schema) { - if syncer.shouldSyncTable(pgSchemaTable) { - var internalTableMetadata InternalTableMetadata - syncedPreviously := icebergSchemaTablesErr == nil && icebergSchemaTables.Contains(pgSchemaTable.ToIcebergSchemaTable()) - if syncedPreviously { - internalTableMetadata = syncer.readInternalTableMetadata(pgSchemaTable) - } - - incrementalRefresh := syncer.config.Pg.IncrementallyRefreshedTables != nil && HasExactOrWildcardMatch(syncer.config.Pg.IncrementallyRefreshedTables, pgSchemaTable.ToConfigArg()) - - syncer.syncerTable.SyncPgTable(pgSchemaTable, structureConn, copyConn, internalTableMetadata, incrementalRefresh) - LogInfo(syncer.config, "Finished writing to Iceberg\n") - - syncedPgSchemaTables = append(syncedPgSchemaTables, pgSchemaTable) - } - } - } - - syncer.WriteInternalStartSqlFile(syncedPgSchemaTables) - - if !syncer.config.Pg.PreserveUnsynced { - syncer.deleteOldIcebergSchemaTables(syncedPgSchemaTables) - } - - if syncer.config.Pg.IncrementallyRefreshedTables == nil { - syncer.sendAnonymousAnalytics("sync-finish") - } else { - syncer.sendAnonymousAnalytics("sync-finish-incremental") - } -} - -func (syncer *Syncer) WriteInternalStartSqlFile(pgSchemaTables []PgSchemaTable) { - childTablesByParentTable := make(map[string][]string) - for _, pgSchemaTable := range pgSchemaTables { - if pgSchemaTable.ParentPartitionedTable != "" { - parent := pgSchemaTable.ParentPartitionedTableString() - childTablesByParentTable[parent] = append(childTablesByParentTable[parent], pgSchemaTable.String()) - } - } - - queryRemapper := NewQueryRemapper(syncer.config, syncer.icebergReader, nil) - queries := []string{} - - for parent, children := range childTablesByParentTable { - // CREATE OR REPLACE TABLE test_table AS - // SELECT * FROM iceberg_scan('/iceberg/public/test_table_q1/metadata/v1.metadata.json', skip_schema_inference = true) - // UNION ALL - // SELECT * FROM iceberg_scan('/iceberg/public/test_table_q2/metadata/v1.metadata.json', skip_schema_inference = true) - - subqueries := []string{} - for _, child := range children { - originalSubquery := fmt.Sprintf("SELECT * FROM %s", child) - queryStatements, _, err := queryRemapper.ParseAndRemapQuery(originalSubquery) - PanicIfError(syncer.config, err) - subqueries = append(subqueries, queryStatements[0]) - } - queries = append(queries, fmt.Sprintf("CREATE OR REPLACE TABLE %s AS %s", parent, strings.Join(subqueries, " UNION ALL "))) - } - - syncer.icebergWriter.WriteInternalStartSqlFile(queries) -} - -// Example: -// - From postgres://username:pas$:wor^d@host:port/database -// - To postgres://username:pas%24%3Awor%5Ed@host:port/database -func (syncer *Syncer) urlEncodePassword(databaseUrl string) string { - // No credentials - if !strings.Contains(databaseUrl, "@") { - return databaseUrl - } - - password := strings.TrimPrefix(databaseUrl, "postgresql://") - password = strings.TrimPrefix(password, "postgres://") - passwordEndIndex := strings.LastIndex(password, "@") - password = password[:passwordEndIndex] - - // Credentials without password - if !strings.Contains(password, ":") { - return databaseUrl - } - - _, password, _ = strings.Cut(password, ":") - decodedPassword, err := url.QueryUnescape(password) - if err != nil { - return databaseUrl - } - - // Password is already encoded - if decodedPassword != password { - return databaseUrl - } - - return strings.Replace(databaseUrl, ":"+password+"@", ":"+url.QueryEscape(password)+"@", 1) -} - -func (syncer *Syncer) shouldSyncTable(pgSchemaTable PgSchemaTable) bool { - if syncer.config.Pg.ExcludeTables != nil && HasExactOrWildcardMatch(syncer.config.Pg.ExcludeTables, pgSchemaTable.ToConfigArg()) { - return false - } - - if syncer.config.Pg.IncludeTables != nil { - return HasExactOrWildcardMatch(syncer.config.Pg.IncludeTables, pgSchemaTable.ToConfigArg()) - } - - return true -} - -func (syncer *Syncer) listPgSchemas(conn *pgx.Conn) []string { - var schemas []string - - schemasRows, err := conn.Query( - context.Background(), - "SELECT schema_name FROM information_schema.schemata WHERE schema_name NOT IN ('pg_catalog', 'pg_toast', 'information_schema')", - ) - PanicIfError(syncer.config, err) - defer schemasRows.Close() - - for schemasRows.Next() { - var schema string - err = schemasRows.Scan(&schema) - PanicIfError(syncer.config, err) - schemas = append(schemas, schema) - } - - return schemas -} - -func (syncer *Syncer) listPgSchemaTables(conn *pgx.Conn, schema string) []PgSchemaTable { - var pgSchemaTables []PgSchemaTable - - tablesRows, err := conn.Query( - context.Background(), - ` - SELECT pg_class.relname AS table, COALESCE(parent.relname, '') AS parent_partitioned_table - FROM pg_class - JOIN pg_namespace ON pg_namespace.oid = pg_class.relnamespace - LEFT JOIN pg_inherits ON pg_inherits.inhrelid = pg_class.oid - LEFT JOIN pg_class AS parent ON pg_inherits.inhparent = parent.oid - WHERE pg_namespace.nspname = $1 AND pg_class.relkind = 'r'; - `, - schema, - ) - PanicIfError(syncer.config, err) - defer tablesRows.Close() - - for tablesRows.Next() { - pgSchemaTable := PgSchemaTable{Schema: schema} - err = tablesRows.Scan(&pgSchemaTable.Table, &pgSchemaTable.ParentPartitionedTable) - PanicIfError(syncer.config, err) - pgSchemaTables = append(pgSchemaTables, pgSchemaTable) - } - - return pgSchemaTables -} - -func (syncer *Syncer) newConnection(ctx context.Context, databaseUrl string) *pgx.Conn { - conn, err := pgx.Connect(ctx, databaseUrl) - PanicIfError(syncer.config, err) - - _, err = conn.Exec(ctx, "BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE READ ONLY DEFERRABLE") - PanicIfError(syncer.config, err) - - return conn -} - -func (syncer *Syncer) readInternalTableMetadata(pgSchemaTable PgSchemaTable) InternalTableMetadata { - internalTableMetadata, err := syncer.icebergReader.InternalTableMetadata(pgSchemaTable) - PanicIfError(syncer.config, err) - return internalTableMetadata -} - -func (syncer *Syncer) deleteOldIcebergSchemaTables(pgSchemaTables []PgSchemaTable) { - var prefixedPgSchemaTables []PgSchemaTable - for _, pgSchemaTable := range pgSchemaTables { - prefixedPgSchemaTables = append( - prefixedPgSchemaTables, - PgSchemaTable{Schema: syncer.config.Pg.SchemaPrefix + pgSchemaTable.Schema, Table: pgSchemaTable.Table}, - ) - } - - icebergSchemas, err := syncer.icebergReader.Schemas() - PanicIfError(syncer.config, err) - - for _, icebergSchema := range icebergSchemas { - found := false - for _, pgSchemaTable := range prefixedPgSchemaTables { - if icebergSchema == pgSchemaTable.Schema { - found = true - break - } - } - - if !found { - LogInfo(syncer.config, "Deleting", icebergSchema, "...") - err := syncer.icebergWriter.DeleteSchema(icebergSchema) - PanicIfError(syncer.config, err) - } - } - - icebergSchemaTables, err := syncer.icebergReader.SchemaTables() - PanicIfError(syncer.config, err) - - for _, icebergSchemaTable := range icebergSchemaTables.Values() { - found := false - for _, pgSchemaTable := range prefixedPgSchemaTables { - if icebergSchemaTable.String() == pgSchemaTable.String() { - found = true - break - } - } - - if !found { - LogInfo(syncer.config, "Deleting", icebergSchemaTable.String(), "...") - err := syncer.icebergWriter.DeleteSchemaTable(icebergSchemaTable) - PanicIfError(syncer.config, err) - } - } -} - -type AnonymousAnalyticsData struct { - Command string `json:"command"` - OsName string `json:"osName"` - Version string `json:"version"` - PgHost string `json:"pgHost"` -} - -func (syncer *Syncer) sendAnonymousAnalytics(command string) { - if syncer.config.DisableAnonymousAnalytics { - return - } - - data := AnonymousAnalyticsData{ - Command: command, - OsName: runtime.GOOS + "-" + runtime.GOARCH, - Version: VERSION, - PgHost: ParseDatabaseHost(syncer.config.Pg.DatabaseUrl), - } - if data.PgHost == "" || IsLocalHost(data.PgHost) { - return - } - - jsonData, err := json.Marshal(data) - if err != nil { - return - } - - client := http.Client{Timeout: 5 * time.Second} - _, _ = client.Post("https://api.bemidb.com/api/analytics", "application/json", bytes.NewBuffer(jsonData)) -} diff --git a/src/syncer_table.go b/src/syncer_table.go deleted file mode 100644 index ea07aad..0000000 --- a/src/syncer_table.go +++ /dev/null @@ -1,350 +0,0 @@ -package main - -import ( - "context" - "encoding/csv" - "errors" - "io" - "runtime" - "sync" - "time" - - "github.com/jackc/pgx/v5" -) - -type SyncerTable struct { - config *Config -} - -func NewSyncerTable(config *Config) *SyncerTable { - return &SyncerTable{config: config} -} - -func (syncer *SyncerTable) SyncPgTable(pgSchemaTable PgSchemaTable, structureConn *pgx.Conn, copyConn *pgx.Conn, existingInternalTableMetadata InternalTableMetadata, incrementalRefresh bool) { - // If there is the previous internal metadata and (we perform an incremental refresh or perform a full refresh with the previous full-in-progress mode) - continuedRefresh := existingInternalTableMetadata.MaxXmin != nil && - (incrementalRefresh || existingInternalTableMetadata.LastRefreshMode == RefreshModeFullInProgress) - currentTxid := syncer.currentTxid(structureConn) - - // Create a capped buffer read and written in parallel - cappedBuffer := NewCappedBuffer(MAX_IN_MEMORY_BUFFER_SIZE, syncer.config) - var waitGroup sync.WaitGroup - - // Copy from PG to cappedBuffer in a separate goroutine in parallel ------------------------------------------------ - waitGroup.Add(1) - go func() { - LogInfo(syncer.config, "Reading from Postgres:", pgSchemaTable.String()+"...") - copySql := syncer.CopyFromPgTableSql(pgSchemaTable, existingInternalTableMetadata, currentTxid, continuedRefresh) - syncer.copyFromPgTable(copySql, copyConn, cappedBuffer, &waitGroup) - }() - - // Ping PG using structureConn in a separate goroutine in parallel to keep the connection alive -------------------- - stopPingChannel := make(chan struct{}) - waitGroup.Add(1) - go func() { - syncer.pingPg(structureConn, &stopPingChannel, &waitGroup) - }() - - // Read from cappedBuffer and write to Iceberg --------------------------------------------------------------------- - - var lastTxid int64 - if existingInternalTableMetadata.LastRefreshMode == RefreshModeFullInProgress && existingInternalTableMetadata.LastTxid != 0 { - lastTxid = existingInternalTableMetadata.LastTxid // We'll continue from the initial txid after a full sync is completed - } else { - lastTxid = currentTxid - } - - // Identify the batch size dynamically based on the table stats - dynamicRowCountPerBatch := syncer.calculatedynamicRowCountPerBatch(pgSchemaTable, structureConn) - LogDebug(syncer.config, "Calculated row count per batch:", dynamicRowCountPerBatch, "Continued refresh:", continuedRefresh, "Incremental refresh:", incrementalRefresh) - - // Read the header to get the column information - csvReader := csv.NewReader(cappedBuffer) - csvHeaders, err := csvReader.Read() - PanicIfError(syncer.config, err) - csvHeaders = csvHeaders[:len(csvHeaders)-1] // Ignore the last column (xmin) - pgSchemaColumns := syncer.pgTableSchemaColumns(structureConn, pgSchemaTable, csvHeaders) - - icebergTableWriter := NewIcebergWriterTable( - syncer.config, - pgSchemaTable.ToIcebergSchemaTable(), - pgSchemaColumns, - dynamicRowCountPerBatch, - MAX_PARQUET_PAYLOAD_THRESHOLD, - continuedRefresh, - ) - - reachedEnd := false - totalRowCount := 0 - var maxXmin uint32 - if existingInternalTableMetadata.MaxXmin != nil { - maxXmin = *existingInternalTableMetadata.MaxXmin - } - - LogInfo(syncer.config, "Writing to Iceberg...") - icebergTableWriter.Write(func() ([][]string, InternalTableMetadata) { - var newInternalTableMetadata InternalTableMetadata - var rows [][]string - - for { - row, err := csvReader.Read() - if err == io.EOF { - reachedEnd = true - break - } - if err != nil { - PanicIfError(syncer.config, err) - } - - maxXmin, err = StringToUint32(row[len(row)-1]) - PanicIfError(syncer.config, err) - - row = row[:len(row)-1] // Ignore the last column (xmin) - rows = append(rows, row) - - if len(rows) >= dynamicRowCountPerBatch { - break - } - } - - totalRowCount += len(rows) - LogDebug(syncer.config, "Current total rows written to Parquet files:", totalRowCount, "...") - runtime.GC() // To reduce Parquet Go memory leakage - - newInternalTableMetadata.LastSyncedAt = time.Now().Unix() - newInternalTableMetadata.LastTxid = lastTxid - if maxXmin != 0 { - newInternalTableMetadata.MaxXmin = &maxXmin - } - if reachedEnd { - if incrementalRefresh { - newInternalTableMetadata.LastRefreshMode = RefreshModeIncremental - } else { - newInternalTableMetadata.LastRefreshMode = RefreshModeFull - } - } else { - if incrementalRefresh { - newInternalTableMetadata.LastRefreshMode = RefreshModeIncrementalInProgress - } else { - newInternalTableMetadata.LastRefreshMode = RefreshModeFullInProgress - } - } - - return rows, newInternalTableMetadata - }) - - close(stopPingChannel) // Stop the pingPg goroutine - waitGroup.Wait() // Wait for the Read goroutine to finish -} - -func (syncer *SyncerTable) CopyFromPgTableSql( - pgSchemaTable PgSchemaTable, - existingInternalTableMetadata InternalTableMetadata, - currentTxid int64, - continuedRefresh bool, -) string { - initialWraparoundTxid := PgWraparoundTxid(existingInternalTableMetadata.LastTxid) - currentWraparoundTxid := PgWraparoundTxid(currentTxid) - var previousMaxXmin int64 - if existingInternalTableMetadata.MaxXmin != nil { - previousMaxXmin = int64(*existingInternalTableMetadata.MaxXmin) - } - - if continuedRefresh { - if previousMaxXmin <= currentWraparoundTxid { - // When no wraparound occurred after an incremental or interrupted full sync - // - // [-----------------------|************************|************************|------------------------] - // 0 prev max xmin init (wraparound) txid curr (wraparound) txid 32^2 - // - // [-----------------------|------------------------|************************|------------------------] - // 0 init (wraparound) txid prev max xmin curr (wraparound) txid 32^2 - // - // [-----------------------|************************|------------------------|------------------------] - // 0 prev max xmin curr wraparound txid init (wraparound) txid 32^2 - operator := ">" - if existingInternalTableMetadata.IsInProgress() { - operator = ">=" - } - return "COPY (SELECT *, xmin::text::bigint AS xmin FROM " + pgSchemaTable.String() + - " WHERE xmin::text::bigint " + operator + " " + existingInternalTableMetadata.MaxXminString() + - " AND xmin::text::bigint <= " + Int64ToString(currentWraparoundTxid) + - " ORDER BY xmin::text::bigint ASC)" + - " TO STDOUT WITH CSV HEADER NULL '" + PG_NULL_STRING + "'" - } else if IsPgWraparoundTxid(currentTxid) { - // When a wraparound occurred after an incremental or interrupted full sync - // - // [***********************|------------------------|************************|************************] - // 0 curr wraparound txid prev max xmin init (wraparound) txid 32^2 - // - // [***********************|------------------------|------------------------|************************] - // 0 curr wraparound txid init (wraparound) txid prev max xmin 32^2 - // - // [***********************|************************|------------------------|************************] - // 0 init (wraparound) txid curr wraparound txid prev max xmin 32^2 - operator := ">" - if existingInternalTableMetadata.IsInProgress() { - operator = ">=" - } - return "COPY (SELECT *, xmin::text::bigint AS xmin FROM " + pgSchemaTable.String() + - " WHERE xmin::text::bigint " + operator + " " + existingInternalTableMetadata.MaxXminString() + - " OR xmin::text::bigint <= " + Int64ToString(currentWraparoundTxid) + - " ORDER BY xmin::text::bigint <= " + Int64ToString(currentWraparoundTxid) + " ASC, xmin::text::bigint ASC)" + // Ordered by FALSE, then TRUE - " TO STDOUT WITH CSV HEADER NULL '" + PG_NULL_STRING + "'" - } else { - Panic(syncer.config, "Unexpected case for the COPY SQL statement. Previous max xmin: "+ - Int64ToString(previousMaxXmin)+ - ", initial wraparound txid: "+ - Int64ToString(initialWraparoundTxid)+ - ", current wraparound txid: "+ - Int64ToString(currentWraparoundTxid)) - return "" - } - } else { - // When a new full sync after a successful one or when missing the previous internal metadata (e.g., old BemiDB version) - // - // [**************************************************************************************************] - // 0 curr max xmin - return "COPY (SELECT *, xmin::text::bigint AS xmin FROM " + pgSchemaTable.String() + - " ORDER BY xmin::text::bigint ASC)" + - " TO STDOUT WITH CSV HEADER NULL '" + PG_NULL_STRING + "'" - } -} - -func (syncer *SyncerTable) pgTableSchemaColumns(conn *pgx.Conn, pgSchemaTable PgSchemaTable, csvHeaders []string) []PgSchemaColumn { - if len(csvHeaders) == 0 { - PanicIfError(syncer.config, errors.New("couldn't read data from "+pgSchemaTable.String())) - } - - var pgSchemaColumns []PgSchemaColumn - - rows, err := conn.Query( - context.Background(), - `SELECT - columns.column_name, - columns.data_type, - columns.udt_name, - columns.is_nullable, - columns.ordinal_position, - COALESCE(columns.character_maximum_length, 0), - COALESCE(columns.numeric_precision, 0), - COALESCE(columns.numeric_scale, 0), - COALESCE(columns.datetime_precision, 0), - pg_namespace.nspname, - CASE WHEN pk.constraint_name IS NOT NULL THEN true ELSE false END - FROM information_schema.columns - JOIN pg_type ON pg_type.typname = columns.udt_name - JOIN pg_namespace ON pg_namespace.oid = pg_type.typnamespace - LEFT JOIN ( - SELECT - tc.constraint_name, - kcu.column_name, - kcu.table_schema, - kcu.table_name - FROM information_schema.table_constraints tc - JOIN information_schema.key_column_usage kcu - ON tc.constraint_name = kcu.constraint_name - AND tc.table_schema = kcu.table_schema - AND tc.table_name = kcu.table_name - WHERE tc.constraint_type = 'PRIMARY KEY' - ) pk ON pk.column_name = columns.column_name AND pk.table_schema = columns.table_schema AND pk.table_name = columns.table_name - WHERE columns.table_schema = $1 AND columns.table_name = $2 - ORDER BY array_position($3, columns.column_name)`, - pgSchemaTable.Schema, - pgSchemaTable.Table, - csvHeaders, - ) - PanicIfError(syncer.config, err) - defer rows.Close() - - for rows.Next() { - pgSchemaColumn := NewPgSchemaColumn(syncer.config) - err = rows.Scan( - &pgSchemaColumn.ColumnName, - &pgSchemaColumn.DataType, - &pgSchemaColumn.UdtName, - &pgSchemaColumn.IsNullable, - &pgSchemaColumn.OrdinalPosition, - &pgSchemaColumn.CharacterMaximumLength, - &pgSchemaColumn.NumericPrecision, - &pgSchemaColumn.NumericScale, - &pgSchemaColumn.DatetimePrecision, - &pgSchemaColumn.Namespace, - &pgSchemaColumn.PartOfPrimaryKey, - ) - PanicIfError(syncer.config, err) - pgSchemaColumns = append(pgSchemaColumns, *pgSchemaColumn) - } - - return pgSchemaColumns -} - -func (syncer *SyncerTable) copyFromPgTable(copySql string, copyConn *pgx.Conn, cappedBuffer *CappedBuffer, waitGroup *sync.WaitGroup) { - LogDebug(syncer.config, copySql) - result, err := copyConn.PgConn().CopyTo(context.Background(), cappedBuffer, copySql) - PanicIfError(syncer.config, err) - LogInfo(syncer.config, "Copied", result.RowsAffected(), "row(s)...") - - cappedBuffer.Close() - waitGroup.Done() -} - -func (syncer *SyncerTable) currentTxid(conn *pgx.Conn) int64 { - var txid int64 - err := conn.QueryRow(context.Background(), `SELECT txid_snapshot_xmin(txid_current_snapshot())`).Scan(&txid) - PanicIfError(syncer.config, err) - return txid -} - -func (syncer *SyncerTable) calculatedynamicRowCountPerBatch(pgSchemaTable PgSchemaTable, conn *pgx.Conn) int { - var tableSize int64 - var rowCount int64 - - err := conn.QueryRow( - context.Background(), - ` - SELECT - pg_total_relation_size(c.oid) AS table_size, - CASE - WHEN c.reltuples >= 0 THEN c.reltuples::bigint - ELSE (SELECT count(*) FROM `+pgSchemaTable.String()+`) - END AS row_count - FROM pg_class c - JOIN pg_namespace n ON n.oid = c.relnamespace - WHERE n.nspname = $1 AND c.relname = $2 AND c.relkind = 'r'`, - pgSchemaTable.Schema, - pgSchemaTable.Table, - ).Scan(&tableSize, &rowCount) - PanicIfError(syncer.config, err) - LogDebug(syncer.config, "Read table size:", tableSize, "Approximate row count:", rowCount) - - if tableSize == 0 || rowCount == 0 { - return 1 - } - - rowSize := tableSize / rowCount - dynamicRowCountPerBatch := int(MAX_PG_ROWS_BATCH_SIZE / rowSize) - if dynamicRowCountPerBatch == 0 { - return 1 - } - - return dynamicRowCountPerBatch -} - -func (syncer *SyncerTable) pingPg(conn *pgx.Conn, stopPingChannel *chan struct{}, waitGroup *sync.WaitGroup) { - ticker := time.NewTicker(PING_PG_INTERVAL_SECONDS * time.Second) - - for { - select { - case <-*stopPingChannel: - LogDebug(syncer.config, "Stopping the ping...") - waitGroup.Done() - ticker.Stop() - return - case <-ticker.C: - LogDebug(syncer.config, "Pinging the database...") - _, err := conn.Exec(context.Background(), "SELECT 1") - PanicIfError(syncer.config, err) - } - } -} diff --git a/src/syncer_table_test.go b/src/syncer_table_test.go deleted file mode 100644 index 1997383..0000000 --- a/src/syncer_table_test.go +++ /dev/null @@ -1,178 +0,0 @@ -package main - -import ( - "testing" -) - -func TestCopyFromPgTableSql(t *testing.T) { - config := &Config{} - syncer := NewSyncerTable(config) - pgSchemaTable := PgSchemaTable{Schema: "public", Table: "users"} - - t.Run("Full refresh", func(t *testing.T) { - // [**************************************************************************************************] - // 0 curr max xmin - t.Run("Runs a full refresh if there is no previous internalTableMetadata", func(t *testing.T) { - internalTableMetadata := InternalTableMetadata{} - currentTxid := int64(100) - - sql := syncer.CopyFromPgTableSql(pgSchemaTable, internalTableMetadata, currentTxid, false) - - expected := "COPY (SELECT *, xmin::text::bigint AS xmin FROM \"public\".\"users\" ORDER BY xmin::text::bigint ASC) TO STDOUT WITH CSV HEADER NULL 'BEMIDB_NULL'" - if sql != expected { - t.Errorf("Expected SQL:\n%s\nGot:\n%s", expected, sql) - } - }) - - // [**************************************************************************************************] - // 0 curr max xmin - t.Run("Runs a full refresh after successful full sync", func(t *testing.T) { - previousMaxXmin := uint32(500) - initialTxid := int64(800) - currentTxid := int64(1000) - internalTableMetadata := InternalTableMetadata{LastRefreshMode: RefreshModeFull, LastTxid: initialTxid, MaxXmin: &previousMaxXmin} - - sql := syncer.CopyFromPgTableSql(pgSchemaTable, internalTableMetadata, currentTxid, false) - - expected := "COPY (SELECT *, xmin::text::bigint AS xmin FROM \"public\".\"users\" ORDER BY xmin::text::bigint ASC) TO STDOUT WITH CSV HEADER NULL 'BEMIDB_NULL'" - if sql != expected { - t.Errorf("Expected SQL:\n%s\nGot:\n%s", expected, sql) - } - }) - }) - - t.Run("Continued in-progress refresh without a wraparound", func(t *testing.T) { - // Full refresh in progress - // [-----------------------|************************|************************|------------------------] - // 0 prev max xmin init (wraparound) txid curr (wraparound) txid 32^2 - t.Run("Continues a full refresh before reaching the initial txid", func(t *testing.T) { - previousMaxXmin := uint32(1_000_000_000) - initialTxid := int64(2_000_000_000) + (int64(1) << 32) - currentTxid := int64(3_000_000_000) + (int64(1) << 32) - internalTableMetadata := InternalTableMetadata{LastRefreshMode: RefreshModeFullInProgress, LastTxid: initialTxid, MaxXmin: &previousMaxXmin} - - sql := syncer.CopyFromPgTableSql(pgSchemaTable, internalTableMetadata, currentTxid, true) - - expected := "COPY (SELECT *, xmin::text::bigint AS xmin FROM \"public\".\"users\" WHERE xmin::text::bigint >= 1000000000 AND xmin::text::bigint <= 3000000000 ORDER BY xmin::text::bigint ASC) TO STDOUT WITH CSV HEADER NULL 'BEMIDB_NULL'" - if sql != expected { - t.Errorf("Expected SQL:\n%s\nGot:\n%s", expected, sql) - } - }) - - // Incremental refresh - // [-----------------------|************************|************************|------------------------] - // 0 prev max xmin init (wraparound) txid curr (wraparound) txid 32^2 - t.Run("Starts an incremental refresh before reaching the initial txid equal to the current txid", func(t *testing.T) { - previousMaxXmin := uint32(1_000_000_000) - initialTxid := int64(2_000_000_000) + (int64(1) << 32) - currentTxid := int64(3_000_000_000) + (int64(1) << 32) - internalTableMetadata := InternalTableMetadata{LastRefreshMode: RefreshModeIncremental, LastTxid: initialTxid, MaxXmin: &previousMaxXmin} - - sql := syncer.CopyFromPgTableSql(pgSchemaTable, internalTableMetadata, currentTxid, true) - - expected := "COPY (SELECT *, xmin::text::bigint AS xmin FROM \"public\".\"users\" WHERE xmin::text::bigint > 1000000000 AND xmin::text::bigint <= 3000000000 ORDER BY xmin::text::bigint ASC) TO STDOUT WITH CSV HEADER NULL 'BEMIDB_NULL'" - if sql != expected { - t.Errorf("Expected SQL:\n%s\nGot:\n%s", expected, sql) - } - }) - - // [-----------------------|************************|-------------------------------------------------] - // 0 prev max xmin init (wraparound) txid 32^2 - // curr (wraparound) txid - t.Run("Continues a full refresh before reaching the initial txid equal to the current txid", func(t *testing.T) { - previousMaxXmin := uint32(1_000_000_000) - initialTxid := int64(2_000_000_000) + (int64(1) << 32) - currentTxid := int64(2_000_000_000) + (int64(1) << 32) - internalTableMetadata := InternalTableMetadata{LastRefreshMode: RefreshModeFullInProgress, LastTxid: initialTxid, MaxXmin: &previousMaxXmin} - - sql := syncer.CopyFromPgTableSql(pgSchemaTable, internalTableMetadata, currentTxid, true) - - expected := "COPY (SELECT *, xmin::text::bigint AS xmin FROM \"public\".\"users\" WHERE xmin::text::bigint >= 1000000000 AND xmin::text::bigint <= 2000000000 ORDER BY xmin::text::bigint ASC) TO STDOUT WITH CSV HEADER NULL 'BEMIDB_NULL'" - if sql != expected { - t.Errorf("Expected SQL:\n%s\nGot:\n%s", expected, sql) - } - }) - - // [-----------------------|------------------------|************************|------------------------] - // 0 init (wraparound) txid prev max xmin curr (wraparound) txid 32^2 - t.Run("Continues a full refresh after reaching the initial txid", func(t *testing.T) { - initialTxid := int64(1_000_000_000) - previousMaxXmin := uint32(2_000_000_000) - currentTxid := int64(3_000_000_000) - internalTableMetadata := InternalTableMetadata{LastRefreshMode: RefreshModeFullInProgress, LastTxid: initialTxid, MaxXmin: &previousMaxXmin} - - sql := syncer.CopyFromPgTableSql(pgSchemaTable, internalTableMetadata, currentTxid, true) - - expected := "COPY (SELECT *, xmin::text::bigint AS xmin FROM \"public\".\"users\" WHERE xmin::text::bigint >= 2000000000 AND xmin::text::bigint <= 3000000000 ORDER BY xmin::text::bigint ASC) TO STDOUT WITH CSV HEADER NULL 'BEMIDB_NULL'" - if sql != expected { - t.Errorf("Expected SQL:\n%s\nGot:\n%s", expected, sql) - } - }) - }) - - t.Run("Continued in-progress refresh with a wraparound", func(t *testing.T) { - // [***********************|------------------------|************************|************************] - // 0 curr wraparound txid prev max xmin init (wraparound) txid 32^2 - t.Run("Continues a full refresh before reaching the initial txid", func(t *testing.T) { - currentTxid := int64(1_000_000_000) + (int64(1) << 32) - previousMaxXmin := uint32(2_000_000_000) - initialTxid := int64(3_000_000_000) - internalTableMetadata := InternalTableMetadata{LastRefreshMode: RefreshModeFullInProgress, LastTxid: initialTxid, MaxXmin: &previousMaxXmin} - - sql := syncer.CopyFromPgTableSql(pgSchemaTable, internalTableMetadata, currentTxid, true) - - expected := "COPY (SELECT *, xmin::text::bigint AS xmin FROM \"public\".\"users\" WHERE xmin::text::bigint >= 2000000000 OR xmin::text::bigint <= 1000000000 ORDER BY xmin::text::bigint <= 1000000000 ASC, xmin::text::bigint ASC) TO STDOUT WITH CSV HEADER NULL 'BEMIDB_NULL'" - if sql != expected { - t.Errorf("Expected SQL:\n%s\nGot:\n%s", expected, sql) - } - }) - - // [***********************|------------------------|------------------------|************************] - // 0 curr wraparound txid init (wraparound) txid prev max xmin 32^2 - t.Run("Continues a full refresh after reaching the initial txid", func(t *testing.T) { - currentTxid := int64(1_000_000_000) + (int64(1) << 32) - initialTxid := int64(2_000_000_000) - previousMaxXmin := uint32(3_000_000_000) - internalTableMetadata := InternalTableMetadata{LastRefreshMode: RefreshModeFullInProgress, LastTxid: initialTxid, MaxXmin: &previousMaxXmin} - - sql := syncer.CopyFromPgTableSql(pgSchemaTable, internalTableMetadata, currentTxid, true) - - expected := "COPY (SELECT *, xmin::text::bigint AS xmin FROM \"public\".\"users\" WHERE xmin::text::bigint >= 3000000000 OR xmin::text::bigint <= 1000000000 ORDER BY xmin::text::bigint <= 1000000000 ASC, xmin::text::bigint ASC) TO STDOUT WITH CSV HEADER NULL 'BEMIDB_NULL'" - if sql != expected { - t.Errorf("Expected SQL:\n%s\nGot:\n%s", expected, sql) - } - }) - - // [-----------------------|************************|------------------------|------------------------] - // 0 prev max xmin curr wraparound txid init (wraparound) txid 32^2 - t.Run("Continues a full refresh if a wraparound occurred during a full sync and max xmin was reset", func(t *testing.T) { - previousMaxXmin := uint32(1_000_000_000) - currentTxid := int64(2_000_000_000) + (int64(1) << 32) - initialTxid := int64(3_000_000_000) - internalTableMetadata := InternalTableMetadata{LastRefreshMode: RefreshModeFullInProgress, LastTxid: initialTxid, MaxXmin: &previousMaxXmin} - - sql := syncer.CopyFromPgTableSql(pgSchemaTable, internalTableMetadata, currentTxid, true) - - expected := "COPY (SELECT *, xmin::text::bigint AS xmin FROM \"public\".\"users\" WHERE xmin::text::bigint >= 1000000000 AND xmin::text::bigint <= 2000000000 ORDER BY xmin::text::bigint ASC) TO STDOUT WITH CSV HEADER NULL 'BEMIDB_NULL'" - if sql != expected { - t.Errorf("Expected SQL:\n%s\nGot:\n%s", expected, sql) - } - }) - - // [***********************|************************|------------------------|************************] - // 0 init (wraparound) txid curr wraparound txid prev max xmin 32^2 - t.Run("Continues a full refresh after the current wrapparound txid exceeds the initial txid", func(t *testing.T) { - initialTxid := int64(1_000_000_000) - currentTxid := int64(2_000_000_000) + (int64(1) << 32) - previousMaxXmin := uint32(3_000_000_000) - internalTableMetadata := InternalTableMetadata{LastRefreshMode: RefreshModeFullInProgress, LastTxid: initialTxid, MaxXmin: &previousMaxXmin} - - sql := syncer.CopyFromPgTableSql(pgSchemaTable, internalTableMetadata, currentTxid, true) - - expected := "COPY (SELECT *, xmin::text::bigint AS xmin FROM \"public\".\"users\" WHERE xmin::text::bigint >= 3000000000 OR xmin::text::bigint <= 2000000000 ORDER BY xmin::text::bigint <= 2000000000 ASC, xmin::text::bigint ASC) TO STDOUT WITH CSV HEADER NULL 'BEMIDB_NULL'" - if sql != expected { - t.Errorf("Expected SQL:\n%s\nGot:\n%s", expected, sql) - } - }) - }) -} diff --git a/src/syncer_test.go b/src/syncer_test.go deleted file mode 100644 index b753baf..0000000 --- a/src/syncer_test.go +++ /dev/null @@ -1,59 +0,0 @@ -package main - -import "testing" - -func TestShouldSyncTable(t *testing.T) { - t.Run("returns true when no filters are set", func(t *testing.T) { - config := &Config{ - Pg: PgConfig{ - DatabaseUrl: "postgres://user:pass@localhost:5432/db", - }, - } - syncer := NewSyncer(config) - pgSchemaTable := PgSchemaTable{Schema: "public", Table: "users"} - - if !syncer.shouldSyncTable(pgSchemaTable) { - t.Error("Expected shouldSyncTable to return true when no filters are set") - } - }) - - t.Run("respects include filter", func(t *testing.T) { - config := &Config{ - Pg: PgConfig{ - DatabaseUrl: "postgres://user:pass@localhost:5432/db", - IncludeTables: []string{"public.users", "public.orders"}, - }, - } - syncer := NewSyncer(config) - - pgSchemaTableIncluded := PgSchemaTable{Schema: "public", Table: "users"} - if !syncer.shouldSyncTable(pgSchemaTableIncluded) { - t.Error("Expected shouldSyncTable to return true for included table") - } - - pgSchemaTableExcluded := PgSchemaTable{Schema: "public", Table: "secrets"} - if syncer.shouldSyncTable(pgSchemaTableExcluded) { - t.Error("Expected shouldSyncTable to return false for non-included table") - } - }) - - t.Run("respects exclude filter", func(t *testing.T) { - config := &Config{ - Pg: PgConfig{ - DatabaseUrl: "postgres://user:pass@localhost:5432/db", - ExcludeTables: []string{"public.secrets", "public.cache"}, - }, - } - syncer := NewSyncer(config) - - pgSchemaTableIncluded := PgSchemaTable{Schema: "public", Table: "users"} - if !syncer.shouldSyncTable(pgSchemaTableIncluded) { - t.Error("Expected shouldSyncTable to return true for non-excluded table") - } - - pgSchemaTableExcluded := PgSchemaTable{Schema: "public", Table: "secrets"} - if syncer.shouldSyncTable(pgSchemaTableExcluded) { - t.Error("Expected shouldSyncTable to return false for excluded table") - } - }) -} diff --git a/src/utils.go b/src/utils.go deleted file mode 100644 index 43b2c73..0000000 --- a/src/utils.go +++ /dev/null @@ -1,171 +0,0 @@ -package main - -import ( - "crypto/hmac" - "crypto/rand" - "crypto/sha256" - "encoding/base64" - "errors" - "fmt" - "net/url" - "regexp" - "strconv" - "strings" - "time" - "unicode" - - "golang.org/x/crypto/pbkdf2" -) - -func IntToString(i int) string { - return strconv.Itoa(i) -} - -func Int64ToString(i int64) string { - return strconv.FormatInt(i, 10) -} - -func Uint32ToString(i uint32) string { - return strconv.FormatUint(uint64(i), 10) -} - -func StringToInt(s string) (int, error) { - return strconv.Atoi(s) -} - -func StringToInt64(s string) (int64, error) { - return strconv.ParseInt(s, 10, 64) -} - -func StringToUint32(s string) (uint32, error) { - i, err := strconv.ParseUint(s, 10, 32) - return uint32(i), err -} - -func StringToScramSha256(password string) string { - saltLength := 16 - digestLength := 32 - iterations := 4096 - clientKey := []byte("Client Key") - serverKey := []byte("Server Key") - - salt := make([]byte, saltLength) - _, err := rand.Read(salt) - if err != nil { - return "" - } - - digestKey := pbkdf2.Key([]byte(password), salt, iterations, digestLength, sha256.New) - clientKeyHash := hmacSha256Hash(digestKey, clientKey) - serverKeyHash := hmacSha256Hash(digestKey, serverKey) - storedKeyHash := sha256Hash(clientKeyHash) - - return fmt.Sprintf( - "SCRAM-SHA-256$%d:%s$%s:%s", - iterations, - base64.StdEncoding.EncodeToString(salt), - base64.StdEncoding.EncodeToString(storedKeyHash), - base64.StdEncoding.EncodeToString(serverKeyHash), - ) -} - -func StringDateToTime(str string) (time.Time, error) { - // Golang's time.Parse() function does not support parsing dates with 5+ digit years - // So we need to handle this case manually by parsing the year separately - var nonStandardYear int - var err error - parts := strings.Split(str, "-") - if len(parts) == 3 && len(parts[0]) > 4 { - nonStandardYear, err = StringToInt(parts[0]) - if err != nil { - return time.Time{}, errors.New("Invalid year: " + parts[0]) - } - - str = str[len(parts[0])-4:] // Remove the prefix from str leaving only the standard 10 characters (YYYY-MM-DD) - } - - parsedTime, err := time.Parse("2006-01-02", str) - - // If the year is non-standard, add the year difference to the parsed time after parsing - if err == nil && nonStandardYear != 0 { - parsedTime = parsedTime.AddDate(nonStandardYear-parsedTime.Year(), 0, 0) - return parsedTime, nil - } - - return parsedTime, err -} - -func StringContainsUpper(str string) bool { - for _, char := range str { - if unicode.IsUpper(char) { - return true - } - } - return false -} - -func Reverse[T any](originalSlice []T) []T { - length := len(originalSlice) - reversedSlice := make([]T, length) - - for i, elem := range originalSlice { - reversedSlice[length-1-i] = elem - } - - return reversedSlice -} - -func HasExactOrWildcardMatch(strs []string, value string) bool { - for _, str := range strs { - if str == value { - return true - } - - if strings.Contains(str, "*") { - pattern := strings.ReplaceAll(regexp.QuoteMeta(str), "\\*", ".*") - matched, _ := regexp.MatchString("\\A"+pattern+"\\z", value) - if matched { - return true - } - } - } - - return false -} - -func ParseDatabaseHost(dbUrl string) string { - if dbUrl == "" { - return "" - } - - url, err := url.Parse(dbUrl) - if err != nil { - return "" - } - - return url.Hostname() -} - -func IsLocalHost(host string) bool { - return strings.HasPrefix(host, "127.0.0.1") || strings.HasPrefix(host, "localhost") -} - -func PgWraparoundTxid(txid int64) int64 { - return txid % (int64(1) << 32) -} - -func IsPgWraparoundTxid(txid int64) bool { - return txid > (int64(1) << 32) -} - -func hmacSha256Hash(key []byte, message []byte) []byte { - hash := hmac.New(sha256.New, key) - hash.Write(message) - return hash.Sum(nil) -} - -func sha256Hash(data []byte) []byte { - hash := sha256.New() - hash.Write(data) - return hash.Sum(nil) -} From 084a90d8f24774d65ce97471c997c91d17ae0d90 Mon Sep 17 00:00:00 2001 From: exAspArk Date: Fri, 25 Jul 2025 18:37:27 -0400 Subject: [PATCH 02/24] Update roadmap --- README.md | 5 +++++ src/syncer-amplitude/config.go | 3 --- src/syncer-common/base_config.go | 7 ++----- src/syncer-postgres/config.go | 3 --- 4 files changed, 7 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index e2695d2..494ba41 100644 --- a/README.md +++ b/README.md @@ -311,6 +311,7 @@ SELECT * FROM [TABLE] WHERE [JSON_COLUMN]->>'[JSON_KEY]' = '[JSON_VALUE]'; - [x] TablePlus - [x] DBeaver - [x] pgAdmin + - [ ] Jupyter notebooks ([#27](https://github.com/BemiHQ/BemiDB/issues/27)) - [x] Data syncing from other sources - [x] Amplitude (incremental) - [x] Postgres (full-refresh) @@ -318,10 +319,14 @@ SELECT * FROM [TABLE] WHERE [JSON_COLUMN]->>'[JSON_KEY]' = '[JSON_VALUE]'; - [ ] Stripe - [ ] Google Sheets - [ ] MySQL + - [ ] SQLite ([#24](https://github.com/BemiHQ/BemiDB/issues/24)) - [x] Iceberg tables compaction - [x] Packaging in a Docker image - [ ] Table compaction without Trino as a dependency (WIP) - [ ] Real-time CDC data syncing (private beta) +- [ ] Partitioned tables ([#15](https://github.com/BemiHQ/BemiDB/issues/15)) +- [ ] Transformations with dbt ([#25](https://github.com/BemiHQ/BemiDB/issues/25)) + ## License diff --git a/src/syncer-amplitude/config.go b/src/syncer-amplitude/config.go index eb3682a..32c443b 100644 --- a/src/syncer-amplitude/config.go +++ b/src/syncer-amplitude/config.go @@ -43,11 +43,8 @@ func registerFlags() { flag.StringVar(&_config.BaseConfig.DestinationSchemaName, "destination-schema-name", os.Getenv(common.ENV_DESTINATION_SCHEMA_NAME), "Destination schema name to store the synced data") flag.StringVar(&_config.BaseConfig.Trino.DatabaseUrl, "trino-database-url", os.Getenv(common.ENV_TRINO_DATABASE_URL), "Trino database URL to sync to") flag.StringVar(&_config.BaseConfig.Trino.CatalogName, "trino-catalog-name", os.Getenv(common.ENV_TRINO_CATALOG_NAME), "Trino catalog name") - flag.StringVar(&_config.BaseConfig.Aws.Region, "aws-region", os.Getenv(common.ENV_AWS_REGION), "AWS region") flag.StringVar(&_config.BaseConfig.Aws.S3Endpoint, "aws-s3-endpoint", os.Getenv(common.ENV_AWS_S3_ENDPOINT), "AWS S3 endpoint. Default: \""+common.DEFAULT_AWS_S3_ENDPOINT+`"`) flag.StringVar(&_config.BaseConfig.Aws.S3Bucket, "aws-s3-bucket", os.Getenv(common.ENV_AWS_S3_BUCKET), "AWS S3 bucket name") - flag.StringVar(&_config.BaseConfig.Aws.AccessKeyId, "aws-access-key-id", os.Getenv(common.ENV_AWS_ACCESS_KEY_ID), "AWS access key ID") - flag.StringVar(&_config.BaseConfig.Aws.SecretAccessKey, "aws-secret-access-key", os.Getenv(common.ENV_AWS_SECRET_ACCESS_KEY), "AWS secret access key") flag.BoolVar(&_config.BaseConfig.DisableAnonymousAnalytics, "disable-anonymous-analytics", os.Getenv(common.ENV_DISABLE_ANONYMOUS_ANALYTICS) == "true", "Disable anonymous analytics collection") flag.StringVar(&_config.ApiKey, "api-key", os.Getenv(ENV_API_KEY), "Amplitude API Key") diff --git a/src/syncer-common/base_config.go b/src/syncer-common/base_config.go index 0f2525b..036f641 100644 --- a/src/syncer-common/base_config.go +++ b/src/syncer-common/base_config.go @@ -27,11 +27,8 @@ type TrinoConfig struct { } type AwsConfig struct { - Region string - S3Endpoint string // optional - S3Bucket string - AccessKeyId string - SecretAccessKey string + S3Endpoint string // optional, for anonymous analytics + S3Bucket string // optional, for anonymous analytics } type BaseConfig struct { diff --git a/src/syncer-postgres/config.go b/src/syncer-postgres/config.go index 85c0b5f..7d87b92 100644 --- a/src/syncer-postgres/config.go +++ b/src/syncer-postgres/config.go @@ -75,11 +75,8 @@ func registerFlags() { flag.StringVar(&_config.BaseConfig.DestinationSchemaName, "destination-schema-name", os.Getenv(common.ENV_DESTINATION_SCHEMA_NAME), "Destination schema name to store the synced data") flag.StringVar(&_config.BaseConfig.Trino.DatabaseUrl, "trino-database-url", os.Getenv(common.ENV_TRINO_DATABASE_URL), "Trino database URL to sync to") flag.StringVar(&_config.BaseConfig.Trino.CatalogName, "trino-catalog-name", os.Getenv(common.ENV_TRINO_CATALOG_NAME), "Trino catalog name") - flag.StringVar(&_config.BaseConfig.Aws.Region, "aws-region", os.Getenv(common.ENV_AWS_REGION), "AWS region") flag.StringVar(&_config.BaseConfig.Aws.S3Endpoint, "aws-s3-endpoint", os.Getenv(common.ENV_AWS_S3_ENDPOINT), "AWS S3 endpoint. Default: \""+common.DEFAULT_AWS_S3_ENDPOINT+`"`) flag.StringVar(&_config.BaseConfig.Aws.S3Bucket, "aws-s3-bucket", os.Getenv(common.ENV_AWS_S3_BUCKET), "AWS S3 bucket name") - flag.StringVar(&_config.BaseConfig.Aws.AccessKeyId, "aws-access-key-id", os.Getenv(common.ENV_AWS_ACCESS_KEY_ID), "AWS access key ID") - flag.StringVar(&_config.BaseConfig.Aws.SecretAccessKey, "aws-secret-access-key", os.Getenv(common.ENV_AWS_SECRET_ACCESS_KEY), "AWS secret access key") flag.BoolVar(&_config.BaseConfig.DisableAnonymousAnalytics, "disable-anonymous-analytics", os.Getenv(common.ENV_DISABLE_ANONYMOUS_ANALYTICS) == "true", "Disable anonymous analytics collection") flag.StringVar(&_config.DatabaseUrl, "database-url", os.Getenv(ENV_DATABASE_URL), "PostgreSQL database URL") From 02575cd3d880e1c7d89c9647fe629c2a7924f8df Mon Sep 17 00:00:00 2001 From: exAspArk Date: Tue, 29 Jul 2025 10:36:43 -0400 Subject: [PATCH 03/24] Speed up full-refresh syncing and write to Iceberg w/o Trino as a dependency --- img/architecture.png | Bin 99796 -> 98298 bytes src/server/config.go | 2 +- src/server/duckdb.go | 6 +- src/server/query_handler_test.go | 10 +- src/server/storage_s3.go | 36 +- src/syncer-amplitude/config.go | 23 + src/syncer-amplitude/go.mod | 57 +- src/syncer-amplitude/go.sum | 1125 +++++++++++++++++++- src/syncer-common/base_config.go | 12 +- src/syncer-common/duckdb.go | 100 ++ src/syncer-common/go.mod | 62 +- src/syncer-common/go.sum | 1125 +++++++++++++++++++- src/syncer-common/iceberg_catalog.go | 111 ++ src/syncer-common/iceberg_schema_column.go | 281 +++++ src/syncer-common/iceberg_table.go | 48 + src/syncer-common/iceberg_writer.go | 60 ++ src/syncer-common/postgres_client.go | 83 ++ src/syncer-common/storage_s3.go | 290 +++++ src/syncer-common/storage_utils.go | 867 +++++++++++++++ src/syncer-common/trino.go | 5 +- src/syncer-common/utils.go | 48 + src/syncer-postgres/config.go | 23 + src/syncer-postgres/go.mod | 57 +- src/syncer-postgres/go.sum | 1121 ++++++++++++++++++- src/syncer-postgres/init_test.go | 137 ++- src/syncer-postgres/pg_schema_column.go | 84 +- src/syncer-postgres/postgres.go | 2 - src/syncer-postgres/syncer.go | 2 +- src/syncer-postgres/syncer_full_refresh.go | 86 +- src/syncer-postgres/syncer_utils.go | 63 +- 30 files changed, 5716 insertions(+), 210 deletions(-) create mode 100644 src/syncer-common/duckdb.go create mode 100644 src/syncer-common/iceberg_catalog.go create mode 100644 src/syncer-common/iceberg_schema_column.go create mode 100644 src/syncer-common/iceberg_table.go create mode 100644 src/syncer-common/iceberg_writer.go create mode 100644 src/syncer-common/postgres_client.go create mode 100644 src/syncer-common/storage_s3.go create mode 100644 src/syncer-common/storage_utils.go diff --git a/img/architecture.png b/img/architecture.png index a1d3aaa77de75fc857e2d0eab124bfa1c2b394e3..6975438b31dc7b941c5b9f59308ab158fbd809f4 100644 GIT binary patch literal 98298 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 literal 99796 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 diff --git a/src/server/config.go b/src/server/config.go index 3238ba4..37a4309 100644 --- a/src/server/config.go +++ b/src/server/config.go @@ -8,7 +8,7 @@ import ( ) const ( - VERSION = "1.0.0-beta.1" + VERSION = "1.0.0-beta.2" ENV_PORT = "BEMIDB_PORT" ENV_DATABASE = "BEMIDB_DATABASE" diff --git a/src/server/duckdb.go b/src/server/duckdb.go index 8b6e610..a9a3589 100644 --- a/src/server/duckdb.go +++ b/src/server/duckdb.go @@ -3,7 +3,6 @@ package main import ( "context" "database/sql" - "regexp" "slices" "strings" @@ -26,6 +25,7 @@ var DUCKDB_INIT_BOOT_QUERIES = []string{ // Configure DuckDB "SET scalar_subquery_error_on_multiple_rows=false", "SET timezone='UTC'", + "SET memory_limit='2GB'", } type Duckdb struct { @@ -146,10 +146,8 @@ func (duckdb *Duckdb) setExplicitAwsCredentials(ctx context.Context) { } func replaceNamedStringArgs(query string, args map[string]string) string { - re := regexp.MustCompile(`['";]`) // Escape single quotes, double quotes, and semicolons from args - for key, value := range args { - query = strings.ReplaceAll(query, "$"+key, re.ReplaceAllString(value, "")) + query = strings.ReplaceAll(query, "$"+key, value) } return query } diff --git a/src/server/query_handler_test.go b/src/server/query_handler_test.go index 15598c4..c3a379b 100644 --- a/src/server/query_handler_test.go +++ b/src/server/query_handler_test.go @@ -537,7 +537,7 @@ func TestHandleQuery(t *testing.T) { "SELECT float4_column FROM postgres.test_table WHERE float4_column != 3.14": { "description": {"float4_column"}, "types": {uint32ToString(pgtype.Float4OID)}, - "values": {"NaN"}, + "values": {"0"}, }, "SELECT float8_column FROM postgres.test_table WHERE bool_column = TRUE": { "description": {"float8_column"}, @@ -590,12 +590,12 @@ func TestHandleQuery(t *testing.T) { "values": {"12:00:00.123"}, }, "SELECT timeMsColumn FROM postgres.test_table WHERE timeMsColumn IS NOT NULL": { - "description": {"timemscolumn"}, + "description": {"timeMsColumn"}, "types": {uint32ToString(pgtype.TimeOID)}, "values": {"12:00:00.123"}, }, "SELECT timeMsColumn FROM postgres.test_table WHERE timeMsColumn IS NULL": { - "description": {"timemscolumn"}, + "description": {"timeMsColumn"}, "types": {uint32ToString(pgtype.TimeOID)}, "values": {""}, }, @@ -672,7 +672,7 @@ func TestHandleQuery(t *testing.T) { "SELECT interval_column FROM postgres.test_table WHERE interval_column IS NOT NULL": { "description": {"interval_column"}, "types": {uint32ToString(pgtype.TextOID)}, - "values": {"2806201000001us"}, + "values": {"1 mon 2 days 01:00:01.000001"}, }, "SELECT interval_column FROM postgres.test_table WHERE interval_column IS NULL": { "description": {"interval_column"}, @@ -737,7 +737,7 @@ func TestHandleQuery(t *testing.T) { "SELECT point_column FROM postgres.test_table WHERE point_column IS NOT NULL": { "description": {"point_column"}, "types": {uint32ToString(pgtype.TextOID)}, - "values": {"0101000000D6FFFF5F74AC4240CDFFFFDF44804640"}, + "values": {"(37.347301483154,45.002101898193)"}, }, "SELECT point_column FROM postgres.test_table WHERE point_column IS NULL": { "description": {"point_column"}, diff --git a/src/server/storage_s3.go b/src/server/storage_s3.go index a57908e..5d40bc6 100644 --- a/src/server/storage_s3.go +++ b/src/server/storage_s3.go @@ -25,49 +25,49 @@ type MetadataJson struct { } type StorageS3 struct { - s3Client *s3.Client - config *Config + S3Client *s3.Client + Config *Config } -func NewS3Storage(config *Config) *StorageS3 { +func NewS3Storage(Config *Config) *StorageS3 { var awsConfigOptions = []func(*awsConfig.LoadOptions) error{ - awsConfig.WithRegion(config.Aws.Region), + awsConfig.WithRegion(Config.Aws.Region), } - if config.LogLevel == LOG_LEVEL_TRACE { + if Config.LogLevel == LOG_LEVEL_TRACE { awsConfigOptions = append(awsConfigOptions, awsConfig.WithClientLogMode(aws.LogRequest)) } - if IsLocalHost(config.Aws.S3Endpoint) { - awsConfigOptions = append(awsConfigOptions, awsConfig.WithBaseEndpoint("http://"+config.Aws.S3Endpoint)) + if IsLocalHost(Config.Aws.S3Endpoint) { + awsConfigOptions = append(awsConfigOptions, awsConfig.WithBaseEndpoint("http://"+Config.Aws.S3Endpoint)) } else { - awsConfigOptions = append(awsConfigOptions, awsConfig.WithBaseEndpoint("https://"+config.Aws.S3Endpoint)) + awsConfigOptions = append(awsConfigOptions, awsConfig.WithBaseEndpoint("https://"+Config.Aws.S3Endpoint)) } awsCredentials := credentials.NewStaticCredentialsProvider( - config.Aws.AccessKeyId, - config.Aws.SecretAccessKey, + Config.Aws.AccessKeyId, + Config.Aws.SecretAccessKey, "", ) awsConfigOptions = append(awsConfigOptions, awsConfig.WithCredentialsProvider(awsCredentials)) loadedAwsConfig, err := awsConfig.LoadDefaultConfig(context.Background(), awsConfigOptions...) - PanicIfError(config, err) + PanicIfError(Config, err) - s3Client := s3.NewFromConfig(loadedAwsConfig, func(o *s3.Options) { - if config.Aws.S3Endpoint != DEFAULT_AWS_S3_ENDPOINT { + S3Client := s3.NewFromConfig(loadedAwsConfig, func(o *s3.Options) { + if Config.Aws.S3Endpoint != DEFAULT_AWS_S3_ENDPOINT { o.UsePathStyle = true } }) return &StorageS3{ - s3Client: s3Client, - config: config, + S3Client: S3Client, + Config: Config, } } func (storage *StorageS3) IcebergTableFields(metadataPath string) ([]IcebergTableField, error) { - metadataKey := strings.TrimPrefix(metadataPath, "s3://"+storage.config.Aws.S3Bucket+"/") + metadataKey := strings.TrimPrefix(metadataPath, "s3://"+storage.Config.Aws.S3Bucket+"/") metadataContent, err := storage.readFileContent(metadataKey) if err != nil { return nil, err @@ -78,8 +78,8 @@ func (storage *StorageS3) IcebergTableFields(metadataPath string) ([]IcebergTabl func (storage *StorageS3) readFileContent(fileKey string) ([]byte, error) { ctx := context.Background() - getObjectResponse, err := storage.s3Client.GetObject(ctx, &s3.GetObjectInput{ - Bucket: aws.String(storage.config.Aws.S3Bucket), + getObjectResponse, err := storage.S3Client.GetObject(ctx, &s3.GetObjectInput{ + Bucket: aws.String(storage.Config.Aws.S3Bucket), Key: aws.String(fileKey), }) if err != nil { diff --git a/src/syncer-amplitude/config.go b/src/syncer-amplitude/config.go index 32c443b..19da01c 100644 --- a/src/syncer-amplitude/config.go +++ b/src/syncer-amplitude/config.go @@ -40,11 +40,15 @@ func registerFlags() { _config.BaseConfig = &common.BaseConfig{} flag.StringVar(&_config.BaseConfig.LogLevel, "log-level", os.Getenv(common.ENV_LOG_LEVEL), `Log level: "ERROR", "WARN", "INFO", "DEBUG", "TRACE". Default: "`+common.DEFAULT_LOG_LEVEL+`"`) + flag.StringVar(&_config.BaseConfig.CatalogDatabaseUrl, "catalog-database-url", os.Getenv(common.ENV_CATALOG_DATABASE_URL), "Catalog database URL") flag.StringVar(&_config.BaseConfig.DestinationSchemaName, "destination-schema-name", os.Getenv(common.ENV_DESTINATION_SCHEMA_NAME), "Destination schema name to store the synced data") flag.StringVar(&_config.BaseConfig.Trino.DatabaseUrl, "trino-database-url", os.Getenv(common.ENV_TRINO_DATABASE_URL), "Trino database URL to sync to") flag.StringVar(&_config.BaseConfig.Trino.CatalogName, "trino-catalog-name", os.Getenv(common.ENV_TRINO_CATALOG_NAME), "Trino catalog name") + flag.StringVar(&_config.BaseConfig.Aws.Region, "aws-region", os.Getenv(common.ENV_AWS_REGION), "AWS region") flag.StringVar(&_config.BaseConfig.Aws.S3Endpoint, "aws-s3-endpoint", os.Getenv(common.ENV_AWS_S3_ENDPOINT), "AWS S3 endpoint. Default: \""+common.DEFAULT_AWS_S3_ENDPOINT+`"`) flag.StringVar(&_config.BaseConfig.Aws.S3Bucket, "aws-s3-bucket", os.Getenv(common.ENV_AWS_S3_BUCKET), "AWS S3 bucket name") + flag.StringVar(&_config.BaseConfig.Aws.AccessKeyId, "aws-access-key-id", os.Getenv(common.ENV_AWS_ACCESS_KEY_ID), "AWS access key ID") + flag.StringVar(&_config.BaseConfig.Aws.SecretAccessKey, "aws-secret-access-key", os.Getenv(common.ENV_AWS_SECRET_ACCESS_KEY), "AWS secret access key") flag.BoolVar(&_config.BaseConfig.DisableAnonymousAnalytics, "disable-anonymous-analytics", os.Getenv(common.ENV_DISABLE_ANONYMOUS_ANALYTICS) == "true", "Disable anonymous analytics collection") flag.StringVar(&_config.ApiKey, "api-key", os.Getenv(ENV_API_KEY), "Amplitude API Key") @@ -60,6 +64,9 @@ func parseFlags() { } else if !slices.Contains(common.LOG_LEVELS, _config.BaseConfig.LogLevel) { panic("Invalid log level " + _config.BaseConfig.LogLevel + ". Must be one of " + strings.Join(common.LOG_LEVELS, ", ")) } + if _config.BaseConfig.CatalogDatabaseUrl == "" { + panic("Catalog database URL is required") + } if _config.BaseConfig.DestinationSchemaName == "" { panic("Destination schema name is required") } @@ -69,6 +76,22 @@ func parseFlags() { if _config.BaseConfig.Trino.CatalogName == "" { panic("Trino catalog name is required") } + if _config.BaseConfig.Aws.Region == "" { + panic("AWS region is required") + } + if _config.BaseConfig.Aws.S3Endpoint == "" { + _config.BaseConfig.Aws.S3Endpoint = common.DEFAULT_AWS_S3_ENDPOINT + } + if _config.BaseConfig.Aws.S3Bucket == "" { + panic("AWS S3 bucket name is required") + } + if _config.BaseConfig.Aws.AccessKeyId != "" && _config.BaseConfig.Aws.SecretAccessKey == "" { + panic("AWS secret access key is required") + } + if _config.BaseConfig.Aws.AccessKeyId == "" && _config.BaseConfig.Aws.SecretAccessKey != "" { + panic("AWS access key ID is required") + } + if _config.ApiKey == "" { panic("Amplitude API key is required") } diff --git a/src/syncer-amplitude/go.mod b/src/syncer-amplitude/go.mod index 7df65ca..536e97d 100644 --- a/src/syncer-amplitude/go.mod +++ b/src/syncer-amplitude/go.mod @@ -7,14 +7,67 @@ require github.com/BemiHQ/BemiDB/src/syncer-common v0.0.1 replace github.com/BemiHQ/BemiDB/src/syncer-common => ../syncer-common require ( + github.com/apache/arrow-go/v18 v18.1.0 // indirect + github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 // indirect + github.com/apache/thrift v0.21.0 // indirect + github.com/aws/aws-sdk-go-v2 v1.36.6 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.11 // indirect + github.com/aws/aws-sdk-go-v2/config v1.29.18 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.17.71 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.33 // indirect + github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.85 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.37 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.37 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.37 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.4 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.5 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.18 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.18 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.84.1 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.25.6 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.4 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.34.1 // indirect + github.com/aws/smithy-go v1.22.4 // indirect + github.com/duckdb/duckdb-go-bindings v0.1.17 // indirect + github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.12 // indirect + github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.12 // indirect + github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.12 // indirect + github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.12 // indirect + github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.12 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect + github.com/goccy/go-json v0.10.5 // indirect + github.com/golang/snappy v0.0.4 // indirect + github.com/google/flatbuffers v25.1.24+incompatible // indirect + github.com/google/uuid v1.6.0 // indirect github.com/hashicorp/go-uuid v1.0.3 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect + github.com/jackc/pgx/v5 v5.7.5 // indirect github.com/jcmturner/aescts/v2 v2.0.0 // indirect github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect github.com/jcmturner/gofork v1.7.6 // indirect github.com/jcmturner/goidentity/v6 v6.0.1 // indirect github.com/jcmturner/gokrb5/v8 v8.4.4 // indirect github.com/jcmturner/rpc/v2 v2.0.3 // indirect + github.com/klauspost/compress v1.17.11 // indirect + github.com/klauspost/cpuid/v2 v2.2.9 // indirect + github.com/linkedin/goavro v2.1.0+incompatible // indirect + github.com/marcboeker/go-duckdb/arrowmapping v0.0.10 // indirect + github.com/marcboeker/go-duckdb/mapping v0.0.11 // indirect + github.com/marcboeker/go-duckdb/v2 v2.3.3 // indirect + github.com/pierrec/lz4/v4 v4.1.22 // indirect github.com/trinodb/trino-go-client v0.323.0 // indirect - golang.org/x/crypto v0.37.0 // indirect - golang.org/x/net v0.24.0 // indirect + github.com/xitongsys/parquet-go v1.6.2 // indirect + github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b // indirect + github.com/zeebo/xxh3 v1.0.2 // indirect + golang.org/x/crypto v0.40.0 // indirect + golang.org/x/exp v0.0.0-20250718183923-645b1fa84792 // indirect + golang.org/x/mod v0.26.0 // indirect + golang.org/x/net v0.42.0 // indirect + golang.org/x/sync v0.16.0 // indirect + golang.org/x/sys v0.34.0 // indirect + golang.org/x/text v0.27.0 // indirect + golang.org/x/tools v0.35.0 // indirect + golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect ) diff --git a/src/syncer-amplitude/go.sum b/src/syncer-amplitude/go.sum index dfe4965..b616521 100644 --- a/src/syncer-amplitude/go.sum +++ b/src/syncer-amplitude/go.sum @@ -1,20 +1,261 @@ +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.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.66.0/go.mod h1:dgqGAjKCDxyhGTtC9dAREQGUJpkceNm1yt590Qno0Ko= +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.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.82.0/go.mod h1:vlKccHJGuFBFufnAnuB08dfEH9Y3H7dzDzRECFdC2TA= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= +cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +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 v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= +cloud.google.com/go/compute v1.2.0/go.mod h1:xlogom/6gr8RJGBe7nT2eGsQYAFUbbv8dbC29qE3Xmw= +cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= +cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= +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/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= +cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= +cloud.google.com/go/iam v0.1.1/go.mod h1:CKqrcnI/suGpybEHxZ7BMehL0oA4LpdyJdUlTl9jVMw= +cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= +cloud.google.com/go/kms v1.1.0/go.mod h1:WdbppnCDMDpOvoYBMn1+gNmOeEoZYqAv+HeuKARGCXI= +cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= +cloud.google.com/go/monitoring v1.1.0/go.mod h1:L81pzz7HKn14QCMaCs6NTQkdBnE87TElyanS95vIcl4= +cloud.google.com/go/monitoring v1.4.0/go.mod h1:y6xnxfwI3hTFWOdkOaD7nfJVlwuC3/mS/5kvtT131p4= +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/pubsub v1.19.0/go.mod h1:/O9kmSe9bb9KRnIAWkzmqhPjHo6LtzGOBYd/kr06XSs= +cloud.google.com/go/secretmanager v1.3.0/go.mod h1:+oLTkouyiYiabAQNugCeTS3PAArGiMJuBqvJnJsyH+U= +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.12.0/go.mod h1:fFLk2dp2oAhDz8QFKwqrjdJvxSp/W2g7nillojlL5Ho= +cloud.google.com/go/storage v1.21.0/go.mod h1:XmRlxkgPjlBONznT2dDUU/5XlpU2OjMnKuqnZI01LAA= +cloud.google.com/go/trace v1.0.0/go.mod h1:4iErSByzxkyHWzzlAj63/Gmjz0NH1ASqhJguHpGcr6A= +cloud.google.com/go/trace v1.2.0/go.mod h1:Wc8y/uYyOhPy12KEnXG9XGrvfMz5F5SrYecQlbW1rwM= +contrib.go.opencensus.io/exporter/aws v0.0.0-20200617204711-c478e41e60e9/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= +contrib.go.opencensus.io/exporter/stackdriver v0.13.10/go.mod h1:I5htMbyta491eUxufwwZPQdcKvvgzMB4O9ni41YnIM8= +contrib.go.opencensus.io/integrations/ocsql v0.1.7/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= 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= +github.com/Azure/azure-amqp-common-go/v3 v3.2.1/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= +github.com/Azure/azure-amqp-common-go/v3 v3.2.2/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= +github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k= +github.com/Azure/azure-sdk-for-go v51.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v59.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.0.0/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.0.0/go.mod h1:+6sju8gk8FRmSajX3Oz4G5Gm7P+mbqE9FVaXXFYTkCM= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U= +github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.0.0/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.0.0/go.mod h1:ceIuwmxDWptoW3eCqSXlnPsZFKh4X+R38dWPv7GS9Vs= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.0.0/go.mod h1:s1tW/At+xHqjNFvWU4G0c0Qv33KOhvbGNj0RCTQDV8s= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.2.0/go.mod h1:c+Lifp3EDEamAkPVzMooRNOK6CZjNSdEnf1A7jsI9u4= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.1.0/go.mod h1:7QJP7dr2wznCMeqIrhMgWGf7XpAQnVrJqDm9nvV3Cu4= +github.com/Azure/azure-service-bus-go v0.11.5/go.mod h1:MI6ge2CuQWBVq+ly456MY7XqNLJip5LO1iSFodbNLbU= +github.com/Azure/azure-storage-blob-go v0.14.0/go.mod h1:SMqIBi+SuiQH32bvyjngEewEeXoPfKMgWlBDaYf6fck= +github.com/Azure/go-amqp v0.16.0/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= +github.com/Azure/go-amqp v0.16.4/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= 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/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= +github.com/Azure/go-autorest/autorest v0.11.19/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= +github.com/Azure/go-autorest/autorest v0.11.22/go.mod h1:BAWYUWGPEtKPzjVkp0Q6an0MJcJDsoh5Z1BFAEFs4Xs= +github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= +github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/adal v0.9.14/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/adal v0.9.17/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= +github.com/Azure/go-autorest/autorest/azure/auth v0.5.9/go.mod h1:hg3/1yw0Bq87O3KvvnJoAh34/0zbP7SFizX/qN5JvjU= +github.com/Azure/go-autorest/autorest/azure/cli v0.4.2/go.mod h1:7qkJkT+j6b+hIpzMOwPChJhTqS8VbsqqgULzMNRugoM= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= +github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= +github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= +github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= +github.com/AzureAD/microsoft-authentication-library-for-go v0.4.0/go.mod h1:Vt9sXTKwMyGcOxSmLDMnGPgqsUg7m8pe215qMLrDXw4= +github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/GoogleCloudPlatform/cloudsql-proxy v1.29.0/go.mod h1:spvB9eLJH9dutlbPSRmHvSXXHOwGRyeXh1jVdquA2G8= +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/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/ahmetb/dlog v0.0.0-20170105205344-4fb5f8204f26 h1:3YVZUqkoev4mL+aCwVOSWV4M7pN+NURHL38Z2zq5JKA= github.com/ahmetb/dlog v0.0.0-20170105205344-4fb5f8204f26/go.mod h1:ymXt5bw5uSNu4jveerFxE0vNYxF8ncqbptntMaFMg3k= +github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA= +github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apache/arrow-go/v18 v18.1.0 h1:agLwJUiVuwXZdwPYVrlITfx7bndULJ/dggbnLFgDp/Y= +github.com/apache/arrow-go/v18 v18.1.0/go.mod h1:tigU/sIgKNXaesf5d7Y95jBBKS5KsxTqYBKXFsvKzo0= +github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 h1:byKBBF2CKWBjjA4J1ZL2JXttJULvWSl50LegTyRZ728= +github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516/go.mod h1:QNYViu/X0HXDHw7m3KXzWSVXIbfUvJqBFe6Gj8/pYA0= +github.com/apache/thrift v0.0.0-20181112125854-24918abba929/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.14.2/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.21.0 h1:tdPmh/ptjE1IJnhbhrcl2++TauVjy242rkV/UzJChnE= +github.com/apache/thrift v0.21.0/go.mod h1:W1H8aR/QRtYNvrPeFXBtobyRkd0/YVhTc6i07XIAgDw= +github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= +github.com/aws/aws-sdk-go v1.30.19/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= +github.com/aws/aws-sdk-go v1.37.0/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= +github.com/aws/aws-sdk-go v1.43.31 h1:yJZIr8nMV1hXjAvvOLUFqZRJcHV7udPQBfhJqawDzI0= +github.com/aws/aws-sdk-go v1.43.31/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= +github.com/aws/aws-sdk-go-v2 v1.16.2/go.mod h1:ytwTPBG6fXTZLxxeeCCWj2/EMYp/xDUgX+OET6TLNNU= +github.com/aws/aws-sdk-go-v2 v1.23.0/go.mod h1:i1XDttT4rnf6vxc9AuskLc6s7XBee8rlLilKlc03uAA= +github.com/aws/aws-sdk-go-v2 v1.36.6 h1:zJqGjVbRdTPojeCGWn5IR5pbJwSQSBh5RWFTQcEQGdU= +github.com/aws/aws-sdk-go-v2 v1.36.6/go.mod h1:EYrzvCCN9CMUTa5+6lf6MM4tq3Zjp8UhSGR/cBsjai0= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.1/go.mod h1:n8Bs1ElDD2wJ9kCRTczA83gYbBmjSwZp3umc6zF4EeM= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.1/go.mod h1:t8PYl/6LzdAqsU4/9tz28V/kU+asFePvpOMkdul0gEQ= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.11 h1:12SpdwU8Djs+YGklkinSSlcrPyj3H4VifVsKf78KbwA= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.11/go.mod h1:dd+Lkp6YmMryke+qxW/VnKyhMBDTYP41Q2Bb+6gNZgY= +github.com/aws/aws-sdk-go-v2/config v1.15.3/go.mod h1:9YL3v07Xc/ohTsxFXzan9ZpFpdTOFl4X65BAKYaz8jg= +github.com/aws/aws-sdk-go-v2/config v1.25.3/go.mod h1:tAByZy03nH5jcq0vZmkcVoo6tRzRHEwSFx3QW4NmDw8= +github.com/aws/aws-sdk-go-v2/config v1.29.18 h1:x4T1GRPnqKV8HMJOMtNktbpQMl3bIsfx8KbqmveUO2I= +github.com/aws/aws-sdk-go-v2/config v1.29.18/go.mod h1:bvz8oXugIsH8K7HLhBv06vDqnFv3NsGDt2Znpk7zmOU= +github.com/aws/aws-sdk-go-v2/credentials v1.11.2/go.mod h1:j8YsY9TXTm31k4eFhspiQicfXPLZ0gYXA50i4gxPE8g= +github.com/aws/aws-sdk-go-v2/credentials v1.16.2/go.mod h1:sDdvGhXrSVT5yzBDR7qXz+rhbpiMpUYfF3vJ01QSdrc= +github.com/aws/aws-sdk-go-v2/credentials v1.17.71 h1:r2w4mQWnrTMJjOyIsZtGp3R3XGY3nqHn8C26C2lQWgA= +github.com/aws/aws-sdk-go-v2/credentials v1.17.71/go.mod h1:E7VF3acIup4GB5ckzbKFrCK0vTvEQxOxgdq4U3vcMCY= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.3/go.mod h1:uk1vhHHERfSVCUnqSqz8O48LBYDSC+k6brng09jcMOk= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.4/go.mod h1:t4i+yGHMCcUNIX1x7YVYa6bH/Do7civ5I6cG/6PMfyA= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.33 h1:D9ixiWSG4lyUBL2DDNK924Px9V/NBVpML90MHqyTADY= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.33/go.mod h1:caS/m4DI+cij2paz3rtProRBI4s/+TCiWoaWZuQ9010= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.3/go.mod h1:0dHuD2HZZSiwfJSy1FO5bX1hQ1TxVV1QXXjpn3XUE44= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.14.0/go.mod h1:UcgIwJ9KHquYxs6Q5skC9qXjhYMK+JASDYcXQ4X7JZE= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.85 h1:AfpstoiaenxGSCUheWiicgZE5XXS5Fi4CcQ4PA/x+Qw= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.85/go.mod h1:HxiF0Fd6WHWjdjOffLkCauq7JqzWqMMq0iUVLS7cPQc= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.9/go.mod h1:AnVH5pvai0pAF4lXRq0bmhbes1u9R8wTE+g+183bZNM= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.3/go.mod h1:7sGSz1JCKHWWBHq98m6sMtWQikmYPpxjqOydDemiVoM= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.37 h1:osMWfm/sC/L4tvEdQ65Gri5ZZDCUpuYJZbTTDrsn4I0= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.37/go.mod h1:ZV2/1fbjOPr4G4v38G3Ww5TBT4+hmsK45s/rxu1fGy0= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.3/go.mod h1:ssOhaLpRlh88H3UmEcsBoVKq309quMvm3Ds8e9d4eJM= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.3/go.mod h1:ify42Rb7nKeDDPkFjKn7q1bPscVPu/+gmHH8d2c+anU= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.37 h1:v+X21AvTb2wZ+ycg1gx+orkB/9U6L7AOp93R7qYxsxM= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.37/go.mod h1:G0uM1kyssELxmJ2VZEfG0q2npObR3BAkF3c1VsfVnfs= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.10/go.mod h1:8DcYQcz0+ZJaSxANlHIsbbi6S+zMwjwdDqwW3r9AzaE= +github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.3/go.mod h1:5yzAuE9i2RkVAttBl8yxZgQr5OCq4D5yDnG7j9x2L0U= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.37 h1:XTZZ0I3SZUHAtBLBU6395ad+VOblE0DwQP6MuaNeics= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.37/go.mod h1:Pi6ksbniAWVwu2S8pEzcYPyhUkAcLaufxN7PfAUQjBk= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.1/go.mod h1:GeUru+8VzrTXV/83XyMJ80KpH8xO89VPoUileyNQ+tc= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1/go.mod h1:l9ymW25HOqymeU2m1gbUQ3rUIsTwKs8gYHXkqDQUhiI= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.4 h1:CXV68E2dNqhuynZJPB80bhPQwAKqBWVer887figW6Jc= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.4/go.mod h1:/xFi9KtvBXP97ppCz1TAEvU1Uf66qvid89rbem3wCzQ= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.3/go.mod h1:Seb8KNmD6kVTjwRjVEgOT5hPin6sq+v4C2ycJQDwuH8= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.3/go.mod h1:R+/S1O4TYpcktbVwddeOYg+uwUfLhADP2S/x4QwsCTM= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.5 h1:M5/B8JUaCI8+9QD+u3S/f4YHpvqE9RpSkV3rf0Iks2w= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.5/go.mod h1:Bktzci1bwdbpuLiu3AOksiNPMl/LLKmX1TWmqp2xbvs= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.3/go.mod h1:wlY6SVjuwvh3TVRpTqdy4I1JpBFLX4UGeKZdWntaocw= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.3/go.mod h1:Owv1I59vaghv1Ax8zz8ELY8DN7/Y0rGS+WWAmjgi950= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.18 h1:vvbXsA2TVO80/KT7ZqCbx934dt6PY+vQ8hZpUZ/cpYg= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.18/go.mod h1:m2JJHledjBGNMsLOF1g9gbAxprzq3KjC8e4lxtn+eWg= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.3/go.mod h1:Bm/v2IaN6rZ+Op7zX+bOUMdL4fsrYZiD0dsjLhNKwZc= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.3/go.mod h1:KZgs2ny8HsxRIRbDwgvJcHHBZPOzQr/+NtGwnP+w2ec= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.18 h1:OS2e0SKqsU2LiJPqL8u9x41tKc6MMEHrWjLVLn3oysg= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.18/go.mod h1:+Yrk+MDGzlNGxCXieljNeWpoZTCQUQVL+Jk9hGGJ8qM= +github.com/aws/aws-sdk-go-v2/service/kms v1.16.3/go.mod h1:QuiHPBqlOFCi4LqdSskYYAWpQlx3PKmohy+rE2F+o5g= +github.com/aws/aws-sdk-go-v2/service/s3 v1.26.3/go.mod h1:g1qvDuRsJY+XghsV6zg00Z4KJ7DtFFCx8fJD2a491Ak= +github.com/aws/aws-sdk-go-v2/service/s3 v1.43.0/go.mod h1:NXRKkiRF+erX2hnybnVU660cYT5/KChRD4iUgJ97cI8= +github.com/aws/aws-sdk-go-v2/service/s3 v1.84.1 h1:RkHXU9jP0DptGy7qKI8CBGsUJruWz0v5IgwBa2DwWcU= +github.com/aws/aws-sdk-go-v2/service/s3 v1.84.1/go.mod h1:3xAOf7tdKF+qbb+XpU+EPhNXAdun3Lu1RcDrj8KC24I= +github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.15.4/go.mod h1:PJc8s+lxyU8rrre0/4a0pn2wgwiDvOEzoOjcJUBr67o= +github.com/aws/aws-sdk-go-v2/service/sns v1.17.4/go.mod h1:kElt+uCcXxcqFyc+bQqZPFD9DME/eC6oHBXvFzQ9Bcw= +github.com/aws/aws-sdk-go-v2/service/sqs v1.18.3/go.mod h1:skmQo0UPvsjsuYYSYMVmrPc1HWCbHUJyrCEp+ZaLzqM= +github.com/aws/aws-sdk-go-v2/service/ssm v1.24.1/go.mod h1:NR/xoKjdbRJ+qx0pMR4mI+N/H1I1ynHwXnO6FowXJc0= +github.com/aws/aws-sdk-go-v2/service/sso v1.11.3/go.mod h1:7UQ/e69kU7LDPtY40OyoHYgRmgfGM4mgsLYtcObdveU= +github.com/aws/aws-sdk-go-v2/service/sso v1.17.2/go.mod h1:/pE21vno3q1h4bbhUOEi+6Zu/aT26UK2WKkDXd+TssQ= +github.com/aws/aws-sdk-go-v2/service/sso v1.25.6 h1:rGtWqkQbPk7Bkwuv3NzpE/scwwL9sC1Ul3tn9x83DUI= +github.com/aws/aws-sdk-go-v2/service/sso v1.25.6/go.mod h1:u4ku9OLv4TO4bCPdxf4fA1upaMaJmP9ZijGk3AAOC6Q= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.20.0/go.mod h1:dWqm5G767qwKPuayKfzm4rjzFmVjiBFbOJrpSPnAMDs= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.4 h1:OV/pxyXh+eMA0TExHEC4jyWdumLxNbzz1P0zJoezkJc= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.4/go.mod h1:8Mm5VGYwtm+r305FfPSuc+aFkrypeylGYhFim6XEPoc= +github.com/aws/aws-sdk-go-v2/service/sts v1.16.3/go.mod h1:bfBj0iVmsUyUg4weDB4NxktD9rDGeKSVWnjTnwbx9b8= +github.com/aws/aws-sdk-go-v2/service/sts v1.25.3/go.mod h1:4EqRHDCKP78hq3zOnmFXu5k0j4bXbRFfCh/zQ6KnEfQ= +github.com/aws/aws-sdk-go-v2/service/sts v1.34.1 h1:aUrLQwJfZtwv3/ZNG2xRtEen+NqI3iesuacjP51Mv1s= +github.com/aws/aws-sdk-go-v2/service/sts v1.34.1/go.mod h1:3wFBZKoWnX3r+Sm7in79i54fBmNfwhdNdQuscCw7QIk= +github.com/aws/smithy-go v1.11.2/go.mod h1:3xHYmszWVx2c0kIwQeEVf9uSm4fYZt67FBJnwub1bgM= +github.com/aws/smithy-go v1.17.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= +github.com/aws/smithy-go v1.22.4 h1:uqXzVZNuNexwc/xrh6Tb56u89WDlJY6HS+KC0S4QSjw= +github.com/aws/smithy-go v1.22.4/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/bobg/gcsobj v0.1.2/go.mod h1:vS49EQ1A1Ib8FgrL58C8xXYZyOCR2TgzAdopy6/ipa8= 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/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +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/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/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= +github.com/colinmarc/hdfs/v2 v2.1.1/go.mod h1:M3x+k8UKKmxtFu++uAZ0OtDU8jR3jnaZIAc6yK4Ue0c= 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/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= 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/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU= +github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= +github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= +github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= +github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= +github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= 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= @@ -23,23 +264,237 @@ github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj 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/duckdb/duckdb-go-bindings v0.1.17 h1:SjpRwrJ7v0vqnIvLeVFHlhuS72+Lp8xxQ5jIER2LZP4= +github.com/duckdb/duckdb-go-bindings v0.1.17/go.mod h1:pBnfviMzANT/9hi4bg+zW4ykRZZPCXlVuvBWEcZofkc= +github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.12 h1:8CLBnsq9YDhi2Gmt3sjSUeXxMzyMQAKefjqUy9zVPFk= +github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.12/go.mod h1:Ezo7IbAfB8NP7CqPIN8XEHKUg5xdRRQhcPPlCXImXYA= +github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.12 h1:wjO4I0GhMh2xIpiUgRpzuyOT4KxXLoUS/rjU7UUVvCE= +github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.12/go.mod h1:eS7m/mLnPQgVF4za1+xTyorKRBuK0/BA44Oy6DgrGXI= +github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.12 h1:HzKQi2C+1jzmwANsPuYH6x9Sfw62SQTjNAEq3OySKFI= +github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.12/go.mod h1:1GOuk1PixiESxLaCGFhag+oFi7aP+9W8byymRAvunBk= +github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.12 h1:YGSR7AFLw2gJ7IbgLE6DkKYmgKv1LaRSd/ZKF1yh2oE= +github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.12/go.mod h1:o7crKMpT2eOIi5/FY6HPqaXcvieeLSqdXXaXbruGX7w= +github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.12 h1:2aduW6fnFnT2Q45PlIgHbatsPOxV9WSZ5B2HzFfxaxA= +github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.12/go.mod h1:IlOhJdVKUJCAPj3QsDszUo8DVdvp1nBFp4TUJVdw99s= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +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/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= +github.com/gin-gonic/gin v1.7.3/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= +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-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +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-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= +github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= +github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= +github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +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/golang-jwt/jwt v3.2.1+incompatible h1:73Z+4BJcrTC+KczS6WvTPvRGOp1WmfEP4Q1lOd9Z/+c= +github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-jwt/jwt/v4 v4.4.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188/go.mod h1:vXjM/+wXQnTPR4KqTKDgJukSZ6amVRtWMPEjE6sQoK8= +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/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/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +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.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +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/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/flatbuffers v25.1.24+incompatible h1:4wPqL3K7GzBd1CwyhSd3usxLKOaJN/AC6puCca6Jm7o= +github.com/google/flatbuffers v25.1.24+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +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.6/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.8/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/go-replayers/grpcreplay v1.1.0/go.mod h1:qzAvJ8/wi57zq7gWqaE6AwLM6miiXUQwP1S+I9icmhk= +github.com/google/go-replayers/httpreplay v1.1.1/go.mod h1:gN9GeLIs7l6NUoVaSSnv2RiqK1NiwAmD0MrKeC9IIks= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+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/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +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-20200905233945-acf8798be1f7/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-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210506205249-923b5ab0fc1a/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= 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/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.2.0/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.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/wire v0.5.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU= +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.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ= github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/gorilla/sessions v1.2.1 h1:DHd3rPN5lE3Ts3D8rKkQ8x/0kqfeNmBAaiSi+o7FsgI= github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/hanwen/go-fuse v1.0.0/go.mod h1:unqXarDXqzAk0rt98O2tVndEPIpUgLD9+rwFisZH3Ok= +github.com/hanwen/go-fuse/v2 v2.1.0/go.mod h1:oRyA5eK+pvJyv5otpO/DgccS8y/RvYMaO00GgRLGryc= +github.com/hashicorp/go-uuid v0.0.0-20180228145832-27454136f036/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +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/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/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.11.0/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= +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/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.2.0/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-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/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.10.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.15.0/go.mod h1:D/zyOyXiaM1TmVWnOM18p0xdDtdakRBa0RsVGI3U3bw= +github.com/jackc/pgx/v5 v5.7.5 h1:JHGfMnQY+IEtGM63d+NGMjoRpysB2JBwDr5fsngwmJs= +github.com/jackc/pgx/v5 v5.7.5/go.mod h1:aruU7o91Tc2q2cFp5h4uP3f6ztExVpyVv88Xl/8Vl8M= +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.2.1 h1:gI8os0wpRXFd4FiAY2dWiqRK037tjj3t7rKFeO4X5iw= +github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= +github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo= github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= +github.com/jcmturner/gofork v0.0.0-20180107083740-2aebee971930/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= github.com/jcmturner/gofork v1.7.6 h1:QH0l3hzAU1tfT3rZCnW5zXl+orbkNMMRGJfdJjHVETg= github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo= github.com/jcmturner/goidentity/v6 v6.0.1 h1:VKnZd2oEIMorCTsFBnJWbExfNN7yZr3EhJAxwOkZg6o= @@ -48,12 +503,84 @@ github.com/jcmturner/gokrb5/v8 v8.4.4 h1:x1Sv4HaTpepFkXbt2IkL29DXRf8sOfZXo8eRKh6 github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs= github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY= github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= +github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +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/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= +github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= +github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.13.1/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= +github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY= +github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8= +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/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +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/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +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.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/linkedin/goavro v2.1.0+incompatible h1:DV2aUlj2xZiuxQyvag8Dy7zjY69ENjS66bWkSfdpddY= +github.com/linkedin/goavro v2.1.0+incompatible/go.mod h1:bBCwI2eGYpUI/4820s67MElg9tdeLbINjLjiM2xZFYM= +github.com/marcboeker/go-duckdb/arrowmapping v0.0.10 h1:G1W+GVnUefR8uy7jHdNO+CRMsmFG5mFPIHVAespfFCA= +github.com/marcboeker/go-duckdb/arrowmapping v0.0.10/go.mod h1:jccUb8TYD0p5TsEEeN4SXuslNJHo23QaKOqKD+U6uFU= +github.com/marcboeker/go-duckdb/mapping v0.0.11 h1:fusN1b1l7Myxafifp596I6dNLNhN5Uv/rw31qAqBwqw= +github.com/marcboeker/go-duckdb/mapping v0.0.11/go.mod h1:aYBjFLgfKO0aJIbDtXPiaL5/avRQISveX/j9tMf9JhU= +github.com/marcboeker/go-duckdb/v2 v2.3.3 h1:PQhWS1vLtotByrXmUg6YqmTS59WPJEqlCPhp464ZGUU= +github.com/marcboeker/go-duckdb/v2 v2.3.3/go.mod h1:RZgwGE22rly6aWbqO8lsfYjMvNuMd3YoTroWxL37H9E= +github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= +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.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= +github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= +github.com/minio/minio-go/v7 v7.0.34/go.mod h1:nCrRzjoSUQh8hgKKtu3Y708OLvRLtuASMg2/nvmbarw= +github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= 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/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= +github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/ncw/swift v1.0.52/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= 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= @@ -62,69 +589,651 @@ github.com/opencontainers/runc v1.1.13 h1:98S2srgG9vw0zWcDpFMn5TRrh8kLxa/5OFUstu 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/pborman/getopt v0.0.0-20180729010549-6fdd0a2c7117/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= +github.com/pierrec/lz4/v4 v4.1.8/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= +github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= +github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= +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/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/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +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/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +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/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.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= 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.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +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.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +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.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/trinodb/trino-go-client v0.323.0 h1:I7Y67um1NnrwKCThzGr8o0xYUldb+n4vPn5R/qUxW2E= github.com/trinodb/trino-go-client v0.323.0/go.mod h1:F+7TZRD0+0M8XqYsgXT8+EJT1pSlbxTECVD1BDzCc70= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= 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/xitongsys/parquet-go v1.5.1/go.mod h1:xUxwM8ELydxh4edHGegYq1pA8NnMKDx0K/GyB0o2bww= +github.com/xitongsys/parquet-go v1.6.2 h1:MhCaXii4eqceKPu9BwrjLqyK10oX9WF+xGhwvwbw7xM= +github.com/xitongsys/parquet-go v1.6.2/go.mod h1:IulAQyalCm0rPiZVNnCgm/PCL64X2tdSVGMQ/UeKqWA= +github.com/xitongsys/parquet-go-source v0.0.0-20190524061010-2b72cbee77d5/go.mod h1:xxCx7Wpym/3QCo6JhujJX51dzSXrwmb0oH6FQb39SEA= +github.com/xitongsys/parquet-go-source v0.0.0-20200817004010-026bad9b25d0/go.mod h1:HYhIKsdns7xz80OgkbgJYrtQY7FjHWHKH6cvN7+czGE= +github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b h1:zbb5qM/t3N+O33Vp5sFyG6yIcWZV1q7rfEjJM8UsRBQ= +github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b/go.mod h1:2ActxmJ4q17Cdruar9nKEkzKSOL1Ol03737Bkz10rTY= +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.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= +github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= +github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= +github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= +go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0= +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.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +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/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +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.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= +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.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= +gocloud.dev v0.26.0/go.mod h1:mkUgejbnbLotorqDyvedJO20XcZNTynmSeVSQS9btVg= +golang.org/x/crypto v0.0.0-20180723164146-c126467f60eb/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= 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-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/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-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-20211115234514-b4de73f9ece8/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220511200225-c6db032c6c88/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= -golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= -golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= +golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM= +golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY= +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-20250718183923-645b1fa84792 h1:R9PFI6EUdfVKgwKjZef7QIwGcBKu86OEFpJ9nUEP2l4= +golang.org/x/exp v0.0.0-20250718183923-645b1fa84792/go.mod h1:A+z0yzpGtvnG90cToK5n2tu8UJVP2XUATh+r+sfOOOc= +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/lint v0.0.0-20210508222113-6edffad5e616/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.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg= +golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ= +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-20191112182307-2180aed22343/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-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +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-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211020060615-d418f374d309/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220401154927-543a649e0bdd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= 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.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= -golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs= +golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8= +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.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +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-20210220032951-036812b2e83c/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.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= +golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +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-20191112214154-59a1497f0cea/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-20200828194041-157a740278f4/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-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/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-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/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-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220204135822-1c1b9b1eba6a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220330033206-e17cdc41300f/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-20220704084225-05e143d24a9e/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.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= -golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA= +golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +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/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +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.5/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.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4= +golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU= +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/time v0.0.0-20211116232009-f0f3c7e86c11/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220224211638-0e9765cccd65/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-20190422233926-fe54fb35175b/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-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-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-20200828161849-5deb26317202/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20200915173823-2db8f0ff891c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20200918232735-d647fc253266/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +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.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0= +golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw= +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= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.15.1 h1:FNy7N6OUZVUaWG9pTiD+jlhdQ3lMP+/LcTpJ6+a8sQ0= +gonum.org/v1/gonum v0.15.1/go.mod h1:eZTZuRFrzu5pcyjN5wJhcIhnUdNijYxX1T2IcrOGY0o= +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.31.0/go.mod h1:CL+9IBCa2WWU6gRuBWaKqGWLFFwbEUXkfeMkHLQWYWo= +google.golang.org/api v0.32.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +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.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.46.0/go.mod h1:ceL4oozhkAiTID8XMmJBsIxID/9wMXJVVFXPg4ylg3I= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.58.0/go.mod h1:cAbP2FsxoGVNwtgNAmmn3y5G1TWAiVYRmg4yku3lv+E= +google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.64.0/go.mod h1:931CdxA8Rm4t6zqTFGSsgwbAEZ2+GMYurbndwSimebM= +google.golang.org/api v0.66.0/go.mod h1:I1dmXYpX7HGwz/ejRxwQp2qj5bFAz93HiCU1C1oYd9M= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.68.0/go.mod h1:sOM8pTpwgflXRhz+oC8H2Dr+UcbMqkPPWNJo88Q7TH8= +google.golang.org/api v0.69.0/go.mod h1:boanBiw+h5c3s+tBPgEzLDRHfFLWV0qXxRHz3ws7C80= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= +google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +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/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-20200513103714-09dca8ec2884/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-20200831141814-d751682dd103/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-20200914193844-75d14daec038/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200921151605-7abf4a1a14d5/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-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210429181445-86c259c2b4ab/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210517163617-5e0236093d7a/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210921142501-181ce0d877f6/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211018162055-cf77aa76bad2/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211223182754-3ac035c7e7cb/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220111164026-67b88f271998/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220114231437-d2e6a121cae0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220201184016-50beb8ab5c44/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220204002441-d6cc3cc0770e/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220211171837-173942840c17/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220216160803-4663080d8bc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220401170504-314d38edb7de/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +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.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +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.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +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.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= 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-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= +gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= +gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q= +gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mNfM5bm88whjWx4= +gopkg.in/jcmturner/gokrb5.v7 v7.3.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= +gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8= +gopkg.in/linkedin/goavro.v1 v1.0.5 h1:BJa69CDh0awSsLUmZ9+BowBdokpduDZSM9Zk8oKHfN4= +gopkg.in/linkedin/goavro.v1 v1.0.5/go.mod h1:Aw5GdAbizjOEl0kAMHV9iHmA8reZzW/OKuJAl4Hb9F0= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/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= +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= +nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= +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/src/syncer-common/base_config.go b/src/syncer-common/base_config.go index 036f641..1024a79 100644 --- a/src/syncer-common/base_config.go +++ b/src/syncer-common/base_config.go @@ -1,11 +1,13 @@ package common const ( - VERSION = "1.0.0-beta.1" + VERSION = "1.0.0-beta.2" ENV_LOG_LEVEL = "BEMIDB_LOG_LEVEL" ENV_DISABLE_ANONYMOUS_ANALYTICS = "BEMIDB_DISABLE_ANONYMOUS_ANALYTICS" + ENV_CATALOG_DATABASE_URL = "CATALOG_DATABASE_URL" + ENV_DESTINATION_SCHEMA_NAME = "DESTINATION_SCHEMA_NAME" ENV_TRINO_DATABASE_URL = "TRINO_DATABASE_URL" @@ -27,14 +29,18 @@ type TrinoConfig struct { } type AwsConfig struct { - S3Endpoint string // optional, for anonymous analytics - S3Bucket string // optional, for anonymous analytics + Region string + S3Endpoint string // optional + S3Bucket string + AccessKeyId string + SecretAccessKey string } type BaseConfig struct { LogLevel string Trino TrinoConfig Aws AwsConfig + CatalogDatabaseUrl string DestinationSchemaName string DisableAnonymousAnalytics bool } diff --git a/src/syncer-common/duckdb.go b/src/syncer-common/duckdb.go new file mode 100644 index 0000000..b082009 --- /dev/null +++ b/src/syncer-common/duckdb.go @@ -0,0 +1,100 @@ +package common + +import ( + "context" + "database/sql" + "strings" + + goDuckdb "github.com/marcboeker/go-duckdb/v2" +) + +var DUCKDB_INIT_BOOT_QUERIES = []string{ + "INSTALL iceberg", + "LOAD iceberg", + "SET timezone='UTC'", + "SET memory_limit='2GB'", +} + +type Duckdb struct { + Db *sql.DB + Connector *goDuckdb.Connector + Config *BaseConfig +} + +func NewDuckdb(config *BaseConfig) *Duckdb { + ctx := context.Background() + connector, err := goDuckdb.NewConnector("", nil) + PanicIfError(config, err) + db := sql.OpenDB(connector) + PanicIfError(config, err) + + duckdb := &Duckdb{ + Db: db, + Connector: connector, + Config: config, + } + + for _, query := range DUCKDB_INIT_BOOT_QUERIES { + _, err := duckdb.ExecContext(ctx, query, nil) + PanicIfError(config, err) + } + + duckdb.setExplicitAwsCredentials(ctx) + + if IsLocalHost(config.Aws.S3Endpoint) { + _, err = duckdb.ExecContext(ctx, "SET s3_use_ssl=false", nil) + PanicIfError(config, err) + } + + if config.Aws.S3Endpoint != DEFAULT_AWS_S3_ENDPOINT { + // Use endpoint/bucket/key (path, deprecated on AWS) instead of bucket.endpoint/key (vhost) + _, err = duckdb.ExecContext(ctx, "SET s3_url_style='path'", nil) + PanicIfError(config, err) + } + + if config.LogLevel == LOG_LEVEL_TRACE { + _, err = duckdb.ExecContext(ctx, "PRAGMA enable_logging('HTTP')", nil) + PanicIfError(config, err) + _, err = duckdb.ExecContext(ctx, "SET logging_storage = 'stdout'", nil) + PanicIfError(config, err) + } + + return duckdb +} + +func (duckdb *Duckdb) ExecContext(ctx context.Context, query string, args map[string]string) (sql.Result, error) { + LogDebug(duckdb.Config, "Querying DuckDB:", query, args) + return duckdb.Db.ExecContext(ctx, replaceNamedStringArgs(query, args)) +} + +func (duckdb *Duckdb) Appender(schema string, table string) (*goDuckdb.Appender, error) { + conn, err := duckdb.Connector.Connect(context.Background()) + if err != nil { + return nil, err + } + return goDuckdb.NewAppenderFromConn(conn, schema, table) +} + +func (duckdb *Duckdb) Close() { + duckdb.Db.Close() +} + +func (duckdb *Duckdb) setExplicitAwsCredentials(ctx context.Context) { + Config := duckdb.Config + query := "CREATE OR REPLACE SECRET aws_s3_secret (TYPE S3, KEY_ID '$accessKeyId', SECRET '$secretAccessKey', REGION '$region', ENDPOINT '$endpoint', SCOPE '$s3Bucket')" + _, err := duckdb.ExecContext(ctx, query, map[string]string{ + "accessKeyId": Config.Aws.AccessKeyId, + "secretAccessKey": Config.Aws.SecretAccessKey, + "region": Config.Aws.Region, + "endpoint": Config.Aws.S3Endpoint, + "s3Bucket": "s3://" + Config.Aws.S3Bucket, + }) + PanicIfError(Config, err) +} + +func replaceNamedStringArgs(query string, args map[string]string) string { + for key, value := range args { + query = strings.ReplaceAll(query, "$"+key, value) + } + return query +} diff --git a/src/syncer-common/go.mod b/src/syncer-common/go.mod index b625102..c175670 100644 --- a/src/syncer-common/go.mod +++ b/src/syncer-common/go.mod @@ -2,16 +2,72 @@ module github.com/BemiHQ/BemiDB/src/syncer-common go 1.24.4 -require github.com/trinodb/trino-go-client v0.323.0 +require ( + github.com/aws/aws-sdk-go-v2 v1.36.6 + github.com/aws/aws-sdk-go-v2/config v1.29.18 + github.com/aws/aws-sdk-go-v2/credentials v1.17.71 + github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.85 + github.com/aws/aws-sdk-go-v2/service/s3 v1.84.1 + github.com/google/uuid v1.6.0 + github.com/jackc/pgx/v5 v5.7.5 + github.com/linkedin/goavro v2.1.0+incompatible + github.com/marcboeker/go-duckdb/v2 v2.3.3 + github.com/trinodb/trino-go-client v0.323.0 + github.com/xitongsys/parquet-go v1.6.2 + github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b + golang.org/x/exp v0.0.0-20250718183923-645b1fa84792 +) require ( + github.com/apache/arrow-go/v18 v18.1.0 // indirect + github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 // indirect + github.com/apache/thrift v0.21.0 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.11 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.33 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.37 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.37 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.37 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.4 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.5 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.18 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.18 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.25.6 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.4 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.34.1 // indirect + github.com/aws/smithy-go v1.22.4 // indirect + github.com/duckdb/duckdb-go-bindings v0.1.17 // indirect + github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.12 // indirect + github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.12 // indirect + github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.12 // indirect + github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.12 // indirect + github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.12 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect + github.com/goccy/go-json v0.10.5 // indirect + github.com/golang/snappy v0.0.4 // indirect + github.com/google/flatbuffers v25.1.24+incompatible // indirect github.com/hashicorp/go-uuid v1.0.3 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect github.com/jcmturner/aescts/v2 v2.0.0 // indirect github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect github.com/jcmturner/gofork v1.7.6 // indirect github.com/jcmturner/goidentity/v6 v6.0.1 // indirect github.com/jcmturner/gokrb5/v8 v8.4.4 // indirect github.com/jcmturner/rpc/v2 v2.0.3 // indirect - golang.org/x/crypto v0.37.0 // indirect - golang.org/x/net v0.24.0 // indirect + github.com/klauspost/compress v1.17.11 // indirect + github.com/klauspost/cpuid/v2 v2.2.9 // indirect + github.com/marcboeker/go-duckdb/arrowmapping v0.0.10 // indirect + github.com/marcboeker/go-duckdb/mapping v0.0.11 // indirect + github.com/pierrec/lz4/v4 v4.1.22 // indirect + github.com/zeebo/xxh3 v1.0.2 // indirect + golang.org/x/crypto v0.40.0 // indirect + golang.org/x/mod v0.26.0 // indirect + golang.org/x/net v0.42.0 // indirect + golang.org/x/sync v0.16.0 // indirect + golang.org/x/sys v0.34.0 // indirect + golang.org/x/text v0.27.0 // indirect + golang.org/x/tools v0.35.0 // indirect + golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect + gopkg.in/linkedin/goavro.v1 v1.0.5 // indirect ) diff --git a/src/syncer-common/go.sum b/src/syncer-common/go.sum index dfe4965..b616521 100644 --- a/src/syncer-common/go.sum +++ b/src/syncer-common/go.sum @@ -1,20 +1,261 @@ +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.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.66.0/go.mod h1:dgqGAjKCDxyhGTtC9dAREQGUJpkceNm1yt590Qno0Ko= +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.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.82.0/go.mod h1:vlKccHJGuFBFufnAnuB08dfEH9Y3H7dzDzRECFdC2TA= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= +cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +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 v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= +cloud.google.com/go/compute v1.2.0/go.mod h1:xlogom/6gr8RJGBe7nT2eGsQYAFUbbv8dbC29qE3Xmw= +cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= +cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= +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/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= +cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= +cloud.google.com/go/iam v0.1.1/go.mod h1:CKqrcnI/suGpybEHxZ7BMehL0oA4LpdyJdUlTl9jVMw= +cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= +cloud.google.com/go/kms v1.1.0/go.mod h1:WdbppnCDMDpOvoYBMn1+gNmOeEoZYqAv+HeuKARGCXI= +cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= +cloud.google.com/go/monitoring v1.1.0/go.mod h1:L81pzz7HKn14QCMaCs6NTQkdBnE87TElyanS95vIcl4= +cloud.google.com/go/monitoring v1.4.0/go.mod h1:y6xnxfwI3hTFWOdkOaD7nfJVlwuC3/mS/5kvtT131p4= +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/pubsub v1.19.0/go.mod h1:/O9kmSe9bb9KRnIAWkzmqhPjHo6LtzGOBYd/kr06XSs= +cloud.google.com/go/secretmanager v1.3.0/go.mod h1:+oLTkouyiYiabAQNugCeTS3PAArGiMJuBqvJnJsyH+U= +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.12.0/go.mod h1:fFLk2dp2oAhDz8QFKwqrjdJvxSp/W2g7nillojlL5Ho= +cloud.google.com/go/storage v1.21.0/go.mod h1:XmRlxkgPjlBONznT2dDUU/5XlpU2OjMnKuqnZI01LAA= +cloud.google.com/go/trace v1.0.0/go.mod h1:4iErSByzxkyHWzzlAj63/Gmjz0NH1ASqhJguHpGcr6A= +cloud.google.com/go/trace v1.2.0/go.mod h1:Wc8y/uYyOhPy12KEnXG9XGrvfMz5F5SrYecQlbW1rwM= +contrib.go.opencensus.io/exporter/aws v0.0.0-20200617204711-c478e41e60e9/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= +contrib.go.opencensus.io/exporter/stackdriver v0.13.10/go.mod h1:I5htMbyta491eUxufwwZPQdcKvvgzMB4O9ni41YnIM8= +contrib.go.opencensus.io/integrations/ocsql v0.1.7/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= 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= +github.com/Azure/azure-amqp-common-go/v3 v3.2.1/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= +github.com/Azure/azure-amqp-common-go/v3 v3.2.2/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= +github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k= +github.com/Azure/azure-sdk-for-go v51.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v59.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.0.0/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.0.0/go.mod h1:+6sju8gk8FRmSajX3Oz4G5Gm7P+mbqE9FVaXXFYTkCM= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U= +github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.0.0/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.0.0/go.mod h1:ceIuwmxDWptoW3eCqSXlnPsZFKh4X+R38dWPv7GS9Vs= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.0.0/go.mod h1:s1tW/At+xHqjNFvWU4G0c0Qv33KOhvbGNj0RCTQDV8s= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.2.0/go.mod h1:c+Lifp3EDEamAkPVzMooRNOK6CZjNSdEnf1A7jsI9u4= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.1.0/go.mod h1:7QJP7dr2wznCMeqIrhMgWGf7XpAQnVrJqDm9nvV3Cu4= +github.com/Azure/azure-service-bus-go v0.11.5/go.mod h1:MI6ge2CuQWBVq+ly456MY7XqNLJip5LO1iSFodbNLbU= +github.com/Azure/azure-storage-blob-go v0.14.0/go.mod h1:SMqIBi+SuiQH32bvyjngEewEeXoPfKMgWlBDaYf6fck= +github.com/Azure/go-amqp v0.16.0/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= +github.com/Azure/go-amqp v0.16.4/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= 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/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= +github.com/Azure/go-autorest/autorest v0.11.19/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= +github.com/Azure/go-autorest/autorest v0.11.22/go.mod h1:BAWYUWGPEtKPzjVkp0Q6an0MJcJDsoh5Z1BFAEFs4Xs= +github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= +github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/adal v0.9.14/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/adal v0.9.17/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= +github.com/Azure/go-autorest/autorest/azure/auth v0.5.9/go.mod h1:hg3/1yw0Bq87O3KvvnJoAh34/0zbP7SFizX/qN5JvjU= +github.com/Azure/go-autorest/autorest/azure/cli v0.4.2/go.mod h1:7qkJkT+j6b+hIpzMOwPChJhTqS8VbsqqgULzMNRugoM= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= +github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= +github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= +github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= +github.com/AzureAD/microsoft-authentication-library-for-go v0.4.0/go.mod h1:Vt9sXTKwMyGcOxSmLDMnGPgqsUg7m8pe215qMLrDXw4= +github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/GoogleCloudPlatform/cloudsql-proxy v1.29.0/go.mod h1:spvB9eLJH9dutlbPSRmHvSXXHOwGRyeXh1jVdquA2G8= +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/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/ahmetb/dlog v0.0.0-20170105205344-4fb5f8204f26 h1:3YVZUqkoev4mL+aCwVOSWV4M7pN+NURHL38Z2zq5JKA= github.com/ahmetb/dlog v0.0.0-20170105205344-4fb5f8204f26/go.mod h1:ymXt5bw5uSNu4jveerFxE0vNYxF8ncqbptntMaFMg3k= +github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA= +github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apache/arrow-go/v18 v18.1.0 h1:agLwJUiVuwXZdwPYVrlITfx7bndULJ/dggbnLFgDp/Y= +github.com/apache/arrow-go/v18 v18.1.0/go.mod h1:tigU/sIgKNXaesf5d7Y95jBBKS5KsxTqYBKXFsvKzo0= +github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 h1:byKBBF2CKWBjjA4J1ZL2JXttJULvWSl50LegTyRZ728= +github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516/go.mod h1:QNYViu/X0HXDHw7m3KXzWSVXIbfUvJqBFe6Gj8/pYA0= +github.com/apache/thrift v0.0.0-20181112125854-24918abba929/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.14.2/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.21.0 h1:tdPmh/ptjE1IJnhbhrcl2++TauVjy242rkV/UzJChnE= +github.com/apache/thrift v0.21.0/go.mod h1:W1H8aR/QRtYNvrPeFXBtobyRkd0/YVhTc6i07XIAgDw= +github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= +github.com/aws/aws-sdk-go v1.30.19/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= +github.com/aws/aws-sdk-go v1.37.0/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= +github.com/aws/aws-sdk-go v1.43.31 h1:yJZIr8nMV1hXjAvvOLUFqZRJcHV7udPQBfhJqawDzI0= +github.com/aws/aws-sdk-go v1.43.31/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= +github.com/aws/aws-sdk-go-v2 v1.16.2/go.mod h1:ytwTPBG6fXTZLxxeeCCWj2/EMYp/xDUgX+OET6TLNNU= +github.com/aws/aws-sdk-go-v2 v1.23.0/go.mod h1:i1XDttT4rnf6vxc9AuskLc6s7XBee8rlLilKlc03uAA= +github.com/aws/aws-sdk-go-v2 v1.36.6 h1:zJqGjVbRdTPojeCGWn5IR5pbJwSQSBh5RWFTQcEQGdU= +github.com/aws/aws-sdk-go-v2 v1.36.6/go.mod h1:EYrzvCCN9CMUTa5+6lf6MM4tq3Zjp8UhSGR/cBsjai0= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.1/go.mod h1:n8Bs1ElDD2wJ9kCRTczA83gYbBmjSwZp3umc6zF4EeM= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.1/go.mod h1:t8PYl/6LzdAqsU4/9tz28V/kU+asFePvpOMkdul0gEQ= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.11 h1:12SpdwU8Djs+YGklkinSSlcrPyj3H4VifVsKf78KbwA= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.11/go.mod h1:dd+Lkp6YmMryke+qxW/VnKyhMBDTYP41Q2Bb+6gNZgY= +github.com/aws/aws-sdk-go-v2/config v1.15.3/go.mod h1:9YL3v07Xc/ohTsxFXzan9ZpFpdTOFl4X65BAKYaz8jg= +github.com/aws/aws-sdk-go-v2/config v1.25.3/go.mod h1:tAByZy03nH5jcq0vZmkcVoo6tRzRHEwSFx3QW4NmDw8= +github.com/aws/aws-sdk-go-v2/config v1.29.18 h1:x4T1GRPnqKV8HMJOMtNktbpQMl3bIsfx8KbqmveUO2I= +github.com/aws/aws-sdk-go-v2/config v1.29.18/go.mod h1:bvz8oXugIsH8K7HLhBv06vDqnFv3NsGDt2Znpk7zmOU= +github.com/aws/aws-sdk-go-v2/credentials v1.11.2/go.mod h1:j8YsY9TXTm31k4eFhspiQicfXPLZ0gYXA50i4gxPE8g= +github.com/aws/aws-sdk-go-v2/credentials v1.16.2/go.mod h1:sDdvGhXrSVT5yzBDR7qXz+rhbpiMpUYfF3vJ01QSdrc= +github.com/aws/aws-sdk-go-v2/credentials v1.17.71 h1:r2w4mQWnrTMJjOyIsZtGp3R3XGY3nqHn8C26C2lQWgA= +github.com/aws/aws-sdk-go-v2/credentials v1.17.71/go.mod h1:E7VF3acIup4GB5ckzbKFrCK0vTvEQxOxgdq4U3vcMCY= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.3/go.mod h1:uk1vhHHERfSVCUnqSqz8O48LBYDSC+k6brng09jcMOk= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.4/go.mod h1:t4i+yGHMCcUNIX1x7YVYa6bH/Do7civ5I6cG/6PMfyA= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.33 h1:D9ixiWSG4lyUBL2DDNK924Px9V/NBVpML90MHqyTADY= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.33/go.mod h1:caS/m4DI+cij2paz3rtProRBI4s/+TCiWoaWZuQ9010= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.3/go.mod h1:0dHuD2HZZSiwfJSy1FO5bX1hQ1TxVV1QXXjpn3XUE44= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.14.0/go.mod h1:UcgIwJ9KHquYxs6Q5skC9qXjhYMK+JASDYcXQ4X7JZE= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.85 h1:AfpstoiaenxGSCUheWiicgZE5XXS5Fi4CcQ4PA/x+Qw= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.85/go.mod h1:HxiF0Fd6WHWjdjOffLkCauq7JqzWqMMq0iUVLS7cPQc= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.9/go.mod h1:AnVH5pvai0pAF4lXRq0bmhbes1u9R8wTE+g+183bZNM= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.3/go.mod h1:7sGSz1JCKHWWBHq98m6sMtWQikmYPpxjqOydDemiVoM= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.37 h1:osMWfm/sC/L4tvEdQ65Gri5ZZDCUpuYJZbTTDrsn4I0= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.37/go.mod h1:ZV2/1fbjOPr4G4v38G3Ww5TBT4+hmsK45s/rxu1fGy0= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.3/go.mod h1:ssOhaLpRlh88H3UmEcsBoVKq309quMvm3Ds8e9d4eJM= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.3/go.mod h1:ify42Rb7nKeDDPkFjKn7q1bPscVPu/+gmHH8d2c+anU= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.37 h1:v+X21AvTb2wZ+ycg1gx+orkB/9U6L7AOp93R7qYxsxM= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.37/go.mod h1:G0uM1kyssELxmJ2VZEfG0q2npObR3BAkF3c1VsfVnfs= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.10/go.mod h1:8DcYQcz0+ZJaSxANlHIsbbi6S+zMwjwdDqwW3r9AzaE= +github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.3/go.mod h1:5yzAuE9i2RkVAttBl8yxZgQr5OCq4D5yDnG7j9x2L0U= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.37 h1:XTZZ0I3SZUHAtBLBU6395ad+VOblE0DwQP6MuaNeics= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.37/go.mod h1:Pi6ksbniAWVwu2S8pEzcYPyhUkAcLaufxN7PfAUQjBk= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.1/go.mod h1:GeUru+8VzrTXV/83XyMJ80KpH8xO89VPoUileyNQ+tc= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1/go.mod h1:l9ymW25HOqymeU2m1gbUQ3rUIsTwKs8gYHXkqDQUhiI= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.4 h1:CXV68E2dNqhuynZJPB80bhPQwAKqBWVer887figW6Jc= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.4/go.mod h1:/xFi9KtvBXP97ppCz1TAEvU1Uf66qvid89rbem3wCzQ= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.3/go.mod h1:Seb8KNmD6kVTjwRjVEgOT5hPin6sq+v4C2ycJQDwuH8= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.3/go.mod h1:R+/S1O4TYpcktbVwddeOYg+uwUfLhADP2S/x4QwsCTM= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.5 h1:M5/B8JUaCI8+9QD+u3S/f4YHpvqE9RpSkV3rf0Iks2w= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.5/go.mod h1:Bktzci1bwdbpuLiu3AOksiNPMl/LLKmX1TWmqp2xbvs= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.3/go.mod h1:wlY6SVjuwvh3TVRpTqdy4I1JpBFLX4UGeKZdWntaocw= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.3/go.mod h1:Owv1I59vaghv1Ax8zz8ELY8DN7/Y0rGS+WWAmjgi950= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.18 h1:vvbXsA2TVO80/KT7ZqCbx934dt6PY+vQ8hZpUZ/cpYg= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.18/go.mod h1:m2JJHledjBGNMsLOF1g9gbAxprzq3KjC8e4lxtn+eWg= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.3/go.mod h1:Bm/v2IaN6rZ+Op7zX+bOUMdL4fsrYZiD0dsjLhNKwZc= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.3/go.mod h1:KZgs2ny8HsxRIRbDwgvJcHHBZPOzQr/+NtGwnP+w2ec= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.18 h1:OS2e0SKqsU2LiJPqL8u9x41tKc6MMEHrWjLVLn3oysg= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.18/go.mod h1:+Yrk+MDGzlNGxCXieljNeWpoZTCQUQVL+Jk9hGGJ8qM= +github.com/aws/aws-sdk-go-v2/service/kms v1.16.3/go.mod h1:QuiHPBqlOFCi4LqdSskYYAWpQlx3PKmohy+rE2F+o5g= +github.com/aws/aws-sdk-go-v2/service/s3 v1.26.3/go.mod h1:g1qvDuRsJY+XghsV6zg00Z4KJ7DtFFCx8fJD2a491Ak= +github.com/aws/aws-sdk-go-v2/service/s3 v1.43.0/go.mod h1:NXRKkiRF+erX2hnybnVU660cYT5/KChRD4iUgJ97cI8= +github.com/aws/aws-sdk-go-v2/service/s3 v1.84.1 h1:RkHXU9jP0DptGy7qKI8CBGsUJruWz0v5IgwBa2DwWcU= +github.com/aws/aws-sdk-go-v2/service/s3 v1.84.1/go.mod h1:3xAOf7tdKF+qbb+XpU+EPhNXAdun3Lu1RcDrj8KC24I= +github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.15.4/go.mod h1:PJc8s+lxyU8rrre0/4a0pn2wgwiDvOEzoOjcJUBr67o= +github.com/aws/aws-sdk-go-v2/service/sns v1.17.4/go.mod h1:kElt+uCcXxcqFyc+bQqZPFD9DME/eC6oHBXvFzQ9Bcw= +github.com/aws/aws-sdk-go-v2/service/sqs v1.18.3/go.mod h1:skmQo0UPvsjsuYYSYMVmrPc1HWCbHUJyrCEp+ZaLzqM= +github.com/aws/aws-sdk-go-v2/service/ssm v1.24.1/go.mod h1:NR/xoKjdbRJ+qx0pMR4mI+N/H1I1ynHwXnO6FowXJc0= +github.com/aws/aws-sdk-go-v2/service/sso v1.11.3/go.mod h1:7UQ/e69kU7LDPtY40OyoHYgRmgfGM4mgsLYtcObdveU= +github.com/aws/aws-sdk-go-v2/service/sso v1.17.2/go.mod h1:/pE21vno3q1h4bbhUOEi+6Zu/aT26UK2WKkDXd+TssQ= +github.com/aws/aws-sdk-go-v2/service/sso v1.25.6 h1:rGtWqkQbPk7Bkwuv3NzpE/scwwL9sC1Ul3tn9x83DUI= +github.com/aws/aws-sdk-go-v2/service/sso v1.25.6/go.mod h1:u4ku9OLv4TO4bCPdxf4fA1upaMaJmP9ZijGk3AAOC6Q= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.20.0/go.mod h1:dWqm5G767qwKPuayKfzm4rjzFmVjiBFbOJrpSPnAMDs= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.4 h1:OV/pxyXh+eMA0TExHEC4jyWdumLxNbzz1P0zJoezkJc= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.4/go.mod h1:8Mm5VGYwtm+r305FfPSuc+aFkrypeylGYhFim6XEPoc= +github.com/aws/aws-sdk-go-v2/service/sts v1.16.3/go.mod h1:bfBj0iVmsUyUg4weDB4NxktD9rDGeKSVWnjTnwbx9b8= +github.com/aws/aws-sdk-go-v2/service/sts v1.25.3/go.mod h1:4EqRHDCKP78hq3zOnmFXu5k0j4bXbRFfCh/zQ6KnEfQ= +github.com/aws/aws-sdk-go-v2/service/sts v1.34.1 h1:aUrLQwJfZtwv3/ZNG2xRtEen+NqI3iesuacjP51Mv1s= +github.com/aws/aws-sdk-go-v2/service/sts v1.34.1/go.mod h1:3wFBZKoWnX3r+Sm7in79i54fBmNfwhdNdQuscCw7QIk= +github.com/aws/smithy-go v1.11.2/go.mod h1:3xHYmszWVx2c0kIwQeEVf9uSm4fYZt67FBJnwub1bgM= +github.com/aws/smithy-go v1.17.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= +github.com/aws/smithy-go v1.22.4 h1:uqXzVZNuNexwc/xrh6Tb56u89WDlJY6HS+KC0S4QSjw= +github.com/aws/smithy-go v1.22.4/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/bobg/gcsobj v0.1.2/go.mod h1:vS49EQ1A1Ib8FgrL58C8xXYZyOCR2TgzAdopy6/ipa8= 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/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +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/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/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= +github.com/colinmarc/hdfs/v2 v2.1.1/go.mod h1:M3x+k8UKKmxtFu++uAZ0OtDU8jR3jnaZIAc6yK4Ue0c= 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/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= 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/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU= +github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= +github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= +github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= +github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= +github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= 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= @@ -23,23 +264,237 @@ github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj 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/duckdb/duckdb-go-bindings v0.1.17 h1:SjpRwrJ7v0vqnIvLeVFHlhuS72+Lp8xxQ5jIER2LZP4= +github.com/duckdb/duckdb-go-bindings v0.1.17/go.mod h1:pBnfviMzANT/9hi4bg+zW4ykRZZPCXlVuvBWEcZofkc= +github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.12 h1:8CLBnsq9YDhi2Gmt3sjSUeXxMzyMQAKefjqUy9zVPFk= +github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.12/go.mod h1:Ezo7IbAfB8NP7CqPIN8XEHKUg5xdRRQhcPPlCXImXYA= +github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.12 h1:wjO4I0GhMh2xIpiUgRpzuyOT4KxXLoUS/rjU7UUVvCE= +github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.12/go.mod h1:eS7m/mLnPQgVF4za1+xTyorKRBuK0/BA44Oy6DgrGXI= +github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.12 h1:HzKQi2C+1jzmwANsPuYH6x9Sfw62SQTjNAEq3OySKFI= +github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.12/go.mod h1:1GOuk1PixiESxLaCGFhag+oFi7aP+9W8byymRAvunBk= +github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.12 h1:YGSR7AFLw2gJ7IbgLE6DkKYmgKv1LaRSd/ZKF1yh2oE= +github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.12/go.mod h1:o7crKMpT2eOIi5/FY6HPqaXcvieeLSqdXXaXbruGX7w= +github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.12 h1:2aduW6fnFnT2Q45PlIgHbatsPOxV9WSZ5B2HzFfxaxA= +github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.12/go.mod h1:IlOhJdVKUJCAPj3QsDszUo8DVdvp1nBFp4TUJVdw99s= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +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/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= +github.com/gin-gonic/gin v1.7.3/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= +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-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +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-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= +github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= +github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= +github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +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/golang-jwt/jwt v3.2.1+incompatible h1:73Z+4BJcrTC+KczS6WvTPvRGOp1WmfEP4Q1lOd9Z/+c= +github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-jwt/jwt/v4 v4.4.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188/go.mod h1:vXjM/+wXQnTPR4KqTKDgJukSZ6amVRtWMPEjE6sQoK8= +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/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/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +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.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +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/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/flatbuffers v25.1.24+incompatible h1:4wPqL3K7GzBd1CwyhSd3usxLKOaJN/AC6puCca6Jm7o= +github.com/google/flatbuffers v25.1.24+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +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.6/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.8/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/go-replayers/grpcreplay v1.1.0/go.mod h1:qzAvJ8/wi57zq7gWqaE6AwLM6miiXUQwP1S+I9icmhk= +github.com/google/go-replayers/httpreplay v1.1.1/go.mod h1:gN9GeLIs7l6NUoVaSSnv2RiqK1NiwAmD0MrKeC9IIks= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+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/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +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-20200905233945-acf8798be1f7/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-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210506205249-923b5ab0fc1a/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= 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/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.2.0/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.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/wire v0.5.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU= +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.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ= github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/gorilla/sessions v1.2.1 h1:DHd3rPN5lE3Ts3D8rKkQ8x/0kqfeNmBAaiSi+o7FsgI= github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/hanwen/go-fuse v1.0.0/go.mod h1:unqXarDXqzAk0rt98O2tVndEPIpUgLD9+rwFisZH3Ok= +github.com/hanwen/go-fuse/v2 v2.1.0/go.mod h1:oRyA5eK+pvJyv5otpO/DgccS8y/RvYMaO00GgRLGryc= +github.com/hashicorp/go-uuid v0.0.0-20180228145832-27454136f036/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +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/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/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.11.0/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= +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/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.2.0/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-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/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.10.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.15.0/go.mod h1:D/zyOyXiaM1TmVWnOM18p0xdDtdakRBa0RsVGI3U3bw= +github.com/jackc/pgx/v5 v5.7.5 h1:JHGfMnQY+IEtGM63d+NGMjoRpysB2JBwDr5fsngwmJs= +github.com/jackc/pgx/v5 v5.7.5/go.mod h1:aruU7o91Tc2q2cFp5h4uP3f6ztExVpyVv88Xl/8Vl8M= +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.2.1 h1:gI8os0wpRXFd4FiAY2dWiqRK037tjj3t7rKFeO4X5iw= +github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= +github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo= github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= +github.com/jcmturner/gofork v0.0.0-20180107083740-2aebee971930/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= github.com/jcmturner/gofork v1.7.6 h1:QH0l3hzAU1tfT3rZCnW5zXl+orbkNMMRGJfdJjHVETg= github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo= github.com/jcmturner/goidentity/v6 v6.0.1 h1:VKnZd2oEIMorCTsFBnJWbExfNN7yZr3EhJAxwOkZg6o= @@ -48,12 +503,84 @@ github.com/jcmturner/gokrb5/v8 v8.4.4 h1:x1Sv4HaTpepFkXbt2IkL29DXRf8sOfZXo8eRKh6 github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs= github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY= github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= +github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +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/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= +github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= +github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.13.1/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= +github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY= +github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8= +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/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +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/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +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.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/linkedin/goavro v2.1.0+incompatible h1:DV2aUlj2xZiuxQyvag8Dy7zjY69ENjS66bWkSfdpddY= +github.com/linkedin/goavro v2.1.0+incompatible/go.mod h1:bBCwI2eGYpUI/4820s67MElg9tdeLbINjLjiM2xZFYM= +github.com/marcboeker/go-duckdb/arrowmapping v0.0.10 h1:G1W+GVnUefR8uy7jHdNO+CRMsmFG5mFPIHVAespfFCA= +github.com/marcboeker/go-duckdb/arrowmapping v0.0.10/go.mod h1:jccUb8TYD0p5TsEEeN4SXuslNJHo23QaKOqKD+U6uFU= +github.com/marcboeker/go-duckdb/mapping v0.0.11 h1:fusN1b1l7Myxafifp596I6dNLNhN5Uv/rw31qAqBwqw= +github.com/marcboeker/go-duckdb/mapping v0.0.11/go.mod h1:aYBjFLgfKO0aJIbDtXPiaL5/avRQISveX/j9tMf9JhU= +github.com/marcboeker/go-duckdb/v2 v2.3.3 h1:PQhWS1vLtotByrXmUg6YqmTS59WPJEqlCPhp464ZGUU= +github.com/marcboeker/go-duckdb/v2 v2.3.3/go.mod h1:RZgwGE22rly6aWbqO8lsfYjMvNuMd3YoTroWxL37H9E= +github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= +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.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= +github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= +github.com/minio/minio-go/v7 v7.0.34/go.mod h1:nCrRzjoSUQh8hgKKtu3Y708OLvRLtuASMg2/nvmbarw= +github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= 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/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= +github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/ncw/swift v1.0.52/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= 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= @@ -62,69 +589,651 @@ github.com/opencontainers/runc v1.1.13 h1:98S2srgG9vw0zWcDpFMn5TRrh8kLxa/5OFUstu 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/pborman/getopt v0.0.0-20180729010549-6fdd0a2c7117/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= +github.com/pierrec/lz4/v4 v4.1.8/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= +github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= +github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= +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/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/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +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/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +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/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.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= 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.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +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.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +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.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/trinodb/trino-go-client v0.323.0 h1:I7Y67um1NnrwKCThzGr8o0xYUldb+n4vPn5R/qUxW2E= github.com/trinodb/trino-go-client v0.323.0/go.mod h1:F+7TZRD0+0M8XqYsgXT8+EJT1pSlbxTECVD1BDzCc70= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= 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/xitongsys/parquet-go v1.5.1/go.mod h1:xUxwM8ELydxh4edHGegYq1pA8NnMKDx0K/GyB0o2bww= +github.com/xitongsys/parquet-go v1.6.2 h1:MhCaXii4eqceKPu9BwrjLqyK10oX9WF+xGhwvwbw7xM= +github.com/xitongsys/parquet-go v1.6.2/go.mod h1:IulAQyalCm0rPiZVNnCgm/PCL64X2tdSVGMQ/UeKqWA= +github.com/xitongsys/parquet-go-source v0.0.0-20190524061010-2b72cbee77d5/go.mod h1:xxCx7Wpym/3QCo6JhujJX51dzSXrwmb0oH6FQb39SEA= +github.com/xitongsys/parquet-go-source v0.0.0-20200817004010-026bad9b25d0/go.mod h1:HYhIKsdns7xz80OgkbgJYrtQY7FjHWHKH6cvN7+czGE= +github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b h1:zbb5qM/t3N+O33Vp5sFyG6yIcWZV1q7rfEjJM8UsRBQ= +github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b/go.mod h1:2ActxmJ4q17Cdruar9nKEkzKSOL1Ol03737Bkz10rTY= +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.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= +github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= +github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= +github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= +go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0= +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.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +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/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +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.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= +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.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= +gocloud.dev v0.26.0/go.mod h1:mkUgejbnbLotorqDyvedJO20XcZNTynmSeVSQS9btVg= +golang.org/x/crypto v0.0.0-20180723164146-c126467f60eb/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= 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-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/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-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-20211115234514-b4de73f9ece8/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220511200225-c6db032c6c88/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= -golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= -golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= +golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM= +golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY= +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-20250718183923-645b1fa84792 h1:R9PFI6EUdfVKgwKjZef7QIwGcBKu86OEFpJ9nUEP2l4= +golang.org/x/exp v0.0.0-20250718183923-645b1fa84792/go.mod h1:A+z0yzpGtvnG90cToK5n2tu8UJVP2XUATh+r+sfOOOc= +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/lint v0.0.0-20210508222113-6edffad5e616/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.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg= +golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ= +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-20191112182307-2180aed22343/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-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +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-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211020060615-d418f374d309/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220401154927-543a649e0bdd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= 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.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= -golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs= +golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8= +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.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +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-20210220032951-036812b2e83c/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.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= +golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +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-20191112214154-59a1497f0cea/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-20200828194041-157a740278f4/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-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/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-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/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-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220204135822-1c1b9b1eba6a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220330033206-e17cdc41300f/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-20220704084225-05e143d24a9e/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.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= -golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA= +golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +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/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +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.5/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.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4= +golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU= +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/time v0.0.0-20211116232009-f0f3c7e86c11/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220224211638-0e9765cccd65/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-20190422233926-fe54fb35175b/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-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-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-20200828161849-5deb26317202/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20200915173823-2db8f0ff891c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20200918232735-d647fc253266/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +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.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0= +golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw= +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= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.15.1 h1:FNy7N6OUZVUaWG9pTiD+jlhdQ3lMP+/LcTpJ6+a8sQ0= +gonum.org/v1/gonum v0.15.1/go.mod h1:eZTZuRFrzu5pcyjN5wJhcIhnUdNijYxX1T2IcrOGY0o= +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.31.0/go.mod h1:CL+9IBCa2WWU6gRuBWaKqGWLFFwbEUXkfeMkHLQWYWo= +google.golang.org/api v0.32.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +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.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.46.0/go.mod h1:ceL4oozhkAiTID8XMmJBsIxID/9wMXJVVFXPg4ylg3I= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.58.0/go.mod h1:cAbP2FsxoGVNwtgNAmmn3y5G1TWAiVYRmg4yku3lv+E= +google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.64.0/go.mod h1:931CdxA8Rm4t6zqTFGSsgwbAEZ2+GMYurbndwSimebM= +google.golang.org/api v0.66.0/go.mod h1:I1dmXYpX7HGwz/ejRxwQp2qj5bFAz93HiCU1C1oYd9M= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.68.0/go.mod h1:sOM8pTpwgflXRhz+oC8H2Dr+UcbMqkPPWNJo88Q7TH8= +google.golang.org/api v0.69.0/go.mod h1:boanBiw+h5c3s+tBPgEzLDRHfFLWV0qXxRHz3ws7C80= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= +google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +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/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-20200513103714-09dca8ec2884/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-20200831141814-d751682dd103/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-20200914193844-75d14daec038/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200921151605-7abf4a1a14d5/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-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210429181445-86c259c2b4ab/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210517163617-5e0236093d7a/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210921142501-181ce0d877f6/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211018162055-cf77aa76bad2/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211223182754-3ac035c7e7cb/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220111164026-67b88f271998/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220114231437-d2e6a121cae0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220201184016-50beb8ab5c44/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220204002441-d6cc3cc0770e/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220211171837-173942840c17/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220216160803-4663080d8bc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220401170504-314d38edb7de/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +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.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +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.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +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.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= 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-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= +gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= +gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q= +gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mNfM5bm88whjWx4= +gopkg.in/jcmturner/gokrb5.v7 v7.3.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= +gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8= +gopkg.in/linkedin/goavro.v1 v1.0.5 h1:BJa69CDh0awSsLUmZ9+BowBdokpduDZSM9Zk8oKHfN4= +gopkg.in/linkedin/goavro.v1 v1.0.5/go.mod h1:Aw5GdAbizjOEl0kAMHV9iHmA8reZzW/OKuJAl4Hb9F0= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/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= +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= +nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= +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/src/syncer-common/iceberg_catalog.go b/src/syncer-common/iceberg_catalog.go new file mode 100644 index 0000000..8d79212 --- /dev/null +++ b/src/syncer-common/iceberg_catalog.go @@ -0,0 +1,111 @@ +package common + +import ( + "context" + "database/sql" + "strings" +) + +const ( + TEMP_TABLE_SUFFIX_SYNCING = "-bemidb-syncing" + TEMP_TABLE_SUFFIX_DELETING = "-bemidb-deleting" + + CATALOG_NAME = "postgres" +) + +type IcebergCatalog struct { + Config *BaseConfig +} + +func NewIcebergCatalog(config *BaseConfig) *IcebergCatalog { + return &IcebergCatalog{Config: config} +} + +func (catalog *IcebergCatalog) TableNames() Set[string] { + pgClient := catalog.newPgClient() + defer pgClient.Close() + + ctx := context.Background() + rows, err := pgClient.Query(ctx, + "SELECT table_name FROM iceberg_tables WHERE table_namespace=$1 AND table_name NOT LIKE '%"+TEMP_TABLE_SUFFIX_SYNCING+"' AND table_name NOT LIKE '%"+TEMP_TABLE_SUFFIX_DELETING+"'", + catalog.Config.DestinationSchemaName, + ) + PanicIfError(catalog.Config, err) + defer rows.Close() + + tableNames := make(Set[string]) + for rows.Next() { + var table string + err := rows.Scan(&table) + PanicIfError(catalog.Config, err) + tableNames.Add(table) + } + return tableNames +} + +func (catalog *IcebergCatalog) S3TablePath(icebergTableName string) string { + pgClient := catalog.newPgClient() + defer pgClient.Close() + + ctx := context.Background() + row := pgClient.QueryRow(ctx, + "SELECT metadata_location FROM iceberg_tables WHERE table_namespace=$1 AND table_name=$2", + catalog.Config.DestinationSchemaName, + icebergTableName, + ) + + var nullPath sql.NullString + err := row.Scan(&nullPath) + if !nullPath.Valid || nullPath.String == "" { + return "" + } + PanicIfError(catalog.Config, err) + + return strings.Split(nullPath.String, "/metadata/")[0] +} + +func (catalog *IcebergCatalog) RenameTable(oldIcebergTableName string, newIcebergTableName string) { + pgClient := catalog.newPgClient() + defer pgClient.Close() + + ctx := context.Background() + _, err := pgClient.Exec(ctx, + "UPDATE iceberg_tables SET table_name=$1 WHERE table_namespace=$2 AND table_name=$3", + newIcebergTableName, + catalog.Config.DestinationSchemaName, + oldIcebergTableName, + ) + PanicIfError(nil, err) +} + +func (catalog *IcebergCatalog) DeleteTable(icebergTableName string) { + pgClient := catalog.newPgClient() + defer pgClient.Close() + + ctx := context.Background() + _, err := pgClient.Exec(ctx, + "DELETE FROM iceberg_tables WHERE table_namespace=$1 AND table_name=$2", + catalog.Config.DestinationSchemaName, + icebergTableName, + ) + PanicIfError(nil, err) +} + +func (catalog *IcebergCatalog) CreateTable(icebergTableName string, metadataLocation string) { + pgClient := catalog.newPgClient() + defer pgClient.Close() + + ctx := context.Background() + _, err := pgClient.Exec(ctx, + "INSERT INTO iceberg_tables (catalog_name, table_namespace, table_name, metadata_location) VALUES ($1, $2, $3, $4)", + CATALOG_NAME, + catalog.Config.DestinationSchemaName, + icebergTableName, + metadataLocation, + ) + PanicIfError(nil, err) +} + +func (catalog *IcebergCatalog) newPgClient() *Postgres { + return NewPostgres(catalog.Config, catalog.Config.CatalogDatabaseUrl) +} diff --git a/src/syncer-common/iceberg_schema_column.go b/src/syncer-common/iceberg_schema_column.go new file mode 100644 index 0000000..4d4830a --- /dev/null +++ b/src/syncer-common/iceberg_schema_column.go @@ -0,0 +1,281 @@ +package common + +import ( + "encoding/csv" + "math" + "math/big" + "strings" + "time" + + goDuckdb "github.com/marcboeker/go-duckdb/v2" +) + +type IcebergColumnType string + +const ( + IcebergColumnTypeBoolean IcebergColumnType = "boolean" + IcebergColumnTypeString IcebergColumnType = "string" + IcebergColumnTypeInteger IcebergColumnType = "int" + IcebergColumnTypeDecimal IcebergColumnType = "decimal" + IcebergColumnTypeLong IcebergColumnType = "long" + IcebergColumnTypeFloat IcebergColumnType = "float" + IcebergColumnTypeDouble IcebergColumnType = "double" + IcebergColumnTypeDate IcebergColumnType = "date" + IcebergColumnTypeTime IcebergColumnType = "time" + IcebergColumnTypeTimeTz IcebergColumnType = "timetz" + IcebergColumnTypeTimestamp IcebergColumnType = "timestamp" + IcebergColumnTypeTimestampTz IcebergColumnType = "timestamptz" + IcebergColumnTypeBinary IcebergColumnType = "binary" + + BEMIDB_NULL_STRING = "BEMIDB_NULL" + + PARQUET_NESTED_FIELD_ID_PREFIX = 1000 + PARQUET_NAN = 0 // DuckDB crashes on NaN, libc++abi: terminating due to uncaught exception of type duckdb::InvalidConfigurationException: {"exception_type":"Invalid Configuration","exception_message":"Column float4_column lower bound deserialization failed: Failed to deserialize blob '' of size 0, attempting to produce value of type 'FLOAT'"} +) + +type IcebergSchemaColumn struct { + Config *BaseConfig + ColumnName string + ColumnType IcebergColumnType + Position int + NumericPrecision int + NumericScale int + IsList bool + IsNullable bool +} + +type ParquetSchemaField struct { + FieldId string + Name string + Type string + ConvertedType string + RepetitionType string + Scale string + Precision string + Length string + NestedType string + NestedConvertedType string + NestedRepetitionType string + NestedFieldId string +} + +type IcebergSchemaField struct { + Id int `json:"id"` + Name string `json:"name"` + Type interface{} `json:"type"` + Required bool `json:"required"` +} + +func (col *IcebergSchemaColumn) NormalizedColumnName() string { + return strings.ReplaceAll(col.ColumnName, ",", "_") // Parquet doesn't allow commas in column names +} + +func (col *IcebergSchemaColumn) QuotedColumnName() string { + return `"` + col.NormalizedColumnName() + `"` +} + +func (col *IcebergSchemaColumn) NormalizedPrecision() int { + if col.NumericPrecision > TRINO_MAX_DECIMAL_PRECISION || col.NumericPrecision == 0 { + return TRINO_MAX_DECIMAL_PRECISION + } + return col.NumericPrecision +} + +func (col *IcebergSchemaColumn) NormalizedScale() int { + if col.NumericPrecision == 0 { + return TRINO_FALLBACK_DECIMAL_SCALE + } + return col.NumericScale +} + +func (col *IcebergSchemaColumn) IcebergSchemaFieldMap() IcebergSchemaField { + icebergSchemaField := IcebergSchemaField{ + Id: col.Position, + Name: col.NormalizedColumnName(), + } + + switch col.ColumnType { + case IcebergColumnTypeBoolean: + icebergSchemaField.Type = "boolean" + case IcebergColumnTypeString: + icebergSchemaField.Type = "string" + case IcebergColumnTypeInteger: + icebergSchemaField.Type = "int" + case IcebergColumnTypeDecimal: + icebergSchemaField.Type = "decimal(" + IntToString(col.NormalizedPrecision()) + ", " + IntToString(col.NormalizedScale()) + ")" + case IcebergColumnTypeLong: + icebergSchemaField.Type = "long" + case IcebergColumnTypeFloat: + icebergSchemaField.Type = "float" + case IcebergColumnTypeDouble: + icebergSchemaField.Type = "double" + case IcebergColumnTypeDate: + icebergSchemaField.Type = "date" + case IcebergColumnTypeTime, IcebergColumnTypeTimeTz: + icebergSchemaField.Type = "time" + case IcebergColumnTypeTimestamp: + icebergSchemaField.Type = "timestamp" + case IcebergColumnTypeTimestampTz: + icebergSchemaField.Type = "timestamptz" + case IcebergColumnTypeBinary: + icebergSchemaField.Type = "binary" + default: + panic("Unsupported column type: " + string(col.ColumnType)) + } + + if col.IsNullable { + icebergSchemaField.Required = false + } else { + icebergSchemaField.Required = true + } + + if col.IsList { + icebergSchemaField.Type = map[string]interface{}{ + "type": "list", + "element": icebergSchemaField.Type, + "element-id": PARQUET_NESTED_FIELD_ID_PREFIX + col.Position, + "element-required": false, + } + } + + return icebergSchemaField +} + +func (col *IcebergSchemaColumn) DuckdbType() string { + var duckdbType string + switch col.ColumnType { + case IcebergColumnTypeBoolean: + duckdbType = "BOOLEAN" + case IcebergColumnTypeString: + duckdbType = "VARCHAR" + case IcebergColumnTypeInteger: + duckdbType = "INTEGER" + case IcebergColumnTypeLong: + duckdbType = "BIGINT" + case IcebergColumnTypeDecimal: + duckdbType = "DECIMAL(" + IntToString(col.NormalizedPrecision()) + ", " + IntToString(col.NormalizedScale()) + ")" + case IcebergColumnTypeFloat: + duckdbType = "FLOAT" + case IcebergColumnTypeDouble: + duckdbType = "DOUBLE" + case IcebergColumnTypeDate: + duckdbType = "DATE" + case IcebergColumnTypeTime, IcebergColumnTypeTimeTz: + duckdbType = "TIME" + case IcebergColumnTypeTimestamp: + duckdbType = "TIMESTAMP" + case IcebergColumnTypeTimestampTz: + duckdbType = "TIMESTAMP WITH TIME ZONE" + case IcebergColumnTypeBinary: + duckdbType = "BLOB" + default: + panic("Unsupported column type for DuckDB: " + string(col.ColumnType)) + } + + if col.IsList { + return duckdbType + "[]" + } + return duckdbType +} + +func (col *IcebergSchemaColumn) DuckdbValueFromCsv(value string) interface{} { + if value == BEMIDB_NULL_STRING { + return nil + } + + if col.IsList { + var values []interface{} + + csvString := strings.TrimPrefix(value, "{") + csvString = strings.TrimSuffix(csvString, "}") + if csvString == "" { + return values + } + + csvString = strings.ReplaceAll(csvString, "\\\"", "\"\"") // Replace escaped double quotes with double quotes according to CSV format rules + csvReader := csv.NewReader(strings.NewReader(csvString)) + stringValues, err := csvReader.Read() + PanicIfError(col.Config, err) + + for _, stringValue := range stringValues { + primitiveValue := col.duckdbPrimitiveValueFromCsv(stringValue) + values = append(values, primitiveValue) + } + return values + } + + return col.duckdbPrimitiveValueFromCsv(value) +} + +func (col *IcebergSchemaColumn) duckdbPrimitiveValueFromCsv(value string) interface{} { + switch col.ColumnType { + case IcebergColumnTypeBoolean: + return value == "t" + case IcebergColumnTypeString: + return value + case IcebergColumnTypeBinary: + return []byte(value) + case IcebergColumnTypeInteger: + return int32(StringToInt(value)) + case IcebergColumnTypeLong: + return StringToInt64(value) + case IcebergColumnTypeFloat: + floatValue := StringToFloat64(value) + if math.IsNaN(floatValue) { + return PARQUET_NAN + } + return float32(floatValue) + case IcebergColumnTypeDouble: + floatValue := StringToFloat64(value) + if math.IsNaN(floatValue) { + return PARQUET_NAN + } + return floatValue + case IcebergColumnTypeDecimal: + scale := col.NormalizedScale() + parts := strings.Split(value, ".") + integerPart := parts[0] + + // Pad fractional part with zeros if necessary + var fractionalPart string + if len(parts) == 1 { + fractionalPart = strings.Repeat("0", scale) + } else { + fractionalPart = parts[1] + if len(fractionalPart) < scale { + fractionalPart += strings.Repeat("0", scale-len(fractionalPart)) + } + } + decimalValue := new(big.Int) + decimalValue.SetString(integerPart+fractionalPart, 10) + + return goDuckdb.Decimal{ + Width: uint8(col.NormalizedPrecision()), + Scale: uint8(scale), + Value: decimalValue, + } + case IcebergColumnTypeDate: + return StringDateToTime(value) + case IcebergColumnTypeTime: + parsedTime, err := time.Parse("15:04:05.999999", value) + PanicIfError(col.Config, err) + return parsedTime + case IcebergColumnTypeTimeTz: + parsedTime, err := time.Parse("15:04:05.999999-07", value) + PanicIfError(col.Config, err) + return parsedTime + case IcebergColumnTypeTimestamp: + parsedTimestamp, err := time.Parse("2006-01-02 15:04:05.999999", value) + PanicIfError(col.Config, err) + return parsedTimestamp + case IcebergColumnTypeTimestampTz: + parsedTimestamp, err := time.Parse("2006-01-02 15:04:05.999999-07:00", value) + if err != nil { + parsedTimestamp, err = time.Parse("2006-01-02 15:04:05.999999-07", value) + PanicIfError(col.Config, err) + } + return parsedTimestamp + } + + panic("Unsupported value: " + value + " for column type: " + string(col.ColumnType)) +} diff --git a/src/syncer-common/iceberg_table.go b/src/syncer-common/iceberg_table.go new file mode 100644 index 0000000..c839e12 --- /dev/null +++ b/src/syncer-common/iceberg_table.go @@ -0,0 +1,48 @@ +package common + +import ( + "github.com/google/uuid" +) + +type IcebergTable struct { + Config *BaseConfig + Name string + IcebergCatalog *IcebergCatalog + StorageS3 *StorageS3 + GeneratedS3TablePath string +} + +func NewIcebergTable(config *BaseConfig, storageS3 *StorageS3, name string) *IcebergTable { + return &IcebergTable{ + Config: config, + Name: name, + IcebergCatalog: NewIcebergCatalog(config), + StorageS3: storageS3, + } +} + +func (table *IcebergTable) Create() { + LogInfo(table.Config, "Creating Iceberg table:", table.Name) + table.IcebergCatalog.CreateTable(table.Name, table.GeneratedS3TablePath+"/metadata/"+ICEBERG_METADATA_INITIAL_FILE_NAME) +} + +func (table *IcebergTable) DeleteIfExists() { + s3TablePath := table.IcebergCatalog.S3TablePath(table.Name) + if s3TablePath == "" { + return + } + + LogInfo(table.Config, "Deleting Iceberg table:", table.Name) + table.StorageS3.DeleteTableFiles(s3TablePath) + table.IcebergCatalog.DeleteTable(table.Name) +} + +func (table *IcebergTable) Rename(newName string) { + LogInfo(table.Config, "Renaming Iceberg table from", table.Name, "to", newName) + table.IcebergCatalog.RenameTable(table.Name, newName) + table.Name = newName +} + +func (table *IcebergTable) GenerateS3TablePath() { + table.GeneratedS3TablePath = "s3://" + table.Config.Aws.S3Bucket + "/iceberg/" + table.Config.DestinationSchemaName + "/" + table.Name + "-" + uuid.New().String() +} diff --git a/src/syncer-common/iceberg_writer.go b/src/syncer-common/iceberg_writer.go new file mode 100644 index 0000000..4137d4f --- /dev/null +++ b/src/syncer-common/iceberg_writer.go @@ -0,0 +1,60 @@ +package common + +import ( + goDuckdb "github.com/marcboeker/go-duckdb/v2" +) + +type IcebergWriter struct { + Config *BaseConfig + IcebergSchemaColumns []*IcebergSchemaColumn + StorageS3 *StorageS3 +} + +func NewIcebergWriter(config *BaseConfig, storageS3 *StorageS3, icebergSchemaColumns []*IcebergSchemaColumn) *IcebergWriter { + return &IcebergWriter{ + Config: config, + IcebergSchemaColumns: icebergSchemaColumns, + StorageS3: storageS3, + } +} + +func (writer *IcebergWriter) Write(s3TablePath string, loadRows func(appender *goDuckdb.Appender) (rowCount int, reachedEnd bool)) { + s3DataPath := s3TablePath + "/data" + s3MetadataPath := s3TablePath + "/metadata" + + var lastSequenceNumber int + newManifestListItemsSortedDesc := []ManifestListItem{} + finalManifestListFilesSortedAsc := []ManifestListFile{} + + var firstNewParquetFile ParquetFile + var newParquetCount int + + for { + newParquetFile, reachedEnd := writer.StorageS3.CreateParquet(s3DataPath, writer.IcebergSchemaColumns, loadRows) + newParquetCount++ + + if firstNewParquetFile.Key == "" { + firstNewParquetFile = newParquetFile + } + + newManifestFile, err := writer.StorageS3.CreateManifest(s3MetadataPath, newParquetFile) + PanicIfError(writer.Config, err) + + lastSequenceNumber++ + newManifestListItem := ManifestListItem{SequenceNumber: lastSequenceNumber, ManifestFile: newManifestFile} + newManifestListItemsSortedDesc = append([]ManifestListItem{newManifestListItem}, newManifestListItemsSortedDesc...) + + newManifestListFile, err := writer.StorageS3.CreateManifestList(s3MetadataPath, firstNewParquetFile.Uuid, newManifestListItemsSortedDesc) + PanicIfError(writer.Config, err) + + finalManifestListFilesSortedAsc = append(finalManifestListFilesSortedAsc, newManifestListFile) + _, err = writer.StorageS3.CreateMetadata(s3MetadataPath, writer.IcebergSchemaColumns, finalManifestListFilesSortedAsc) + PanicIfError(writer.Config, err) + + LogInfo(writer.Config, "Written", newParquetFile.RecordCount, "records in Parquet file #"+IntToString(newParquetCount)) + + if reachedEnd { + return + } + } +} diff --git a/src/syncer-common/postgres_client.go b/src/syncer-common/postgres_client.go new file mode 100644 index 0000000..12abae3 --- /dev/null +++ b/src/syncer-common/postgres_client.go @@ -0,0 +1,83 @@ +package common + +import ( + "context" + "net/url" + "strings" + "time" + + "github.com/jackc/pgx/v5" + "github.com/jackc/pgx/v5/pgconn" +) + +const ( + CONNECTION_TIMEOUT = 30 * time.Second +) + +type Postgres struct { + Conn *pgx.Conn + Config *BaseConfig +} + +func NewPostgres(config *BaseConfig, databaseUrl string) *Postgres { + ctx, cancel := context.WithTimeout(context.Background(), CONNECTION_TIMEOUT) + defer cancel() + + conn, err := pgx.Connect(ctx, urlEncodePassword(databaseUrl)) + PanicIfError(config, err) + + return &Postgres{ + Config: config, + Conn: conn, + } +} + +func (client *Postgres) Close() { + err := client.Conn.Close(context.Background()) + PanicIfError(client.Config, err) +} + +func (client *Postgres) Query(ctx context.Context, query string, args ...any) (pgx.Rows, error) { + LogDebug(client.Config, "Postgres query:", query, args) + return client.Conn.Query(ctx, query, args...) +} + +func (client *Postgres) QueryRow(ctx context.Context, query string, args ...any) pgx.Row { + LogDebug(client.Config, "Postgres query:", query, args) + return client.Conn.QueryRow(ctx, query, args...) +} + +func (client *Postgres) Exec(ctx context.Context, query string, args ...any) (pgconn.CommandTag, error) { + LogDebug(client.Config, "Postgres exec:", query, args) + return client.Conn.Exec(ctx, query, args...) +} + +// Example: +// - From postgres://username:pas$:wor^d#@host:port/database +// - To postgres://username:pas%24%3Awor%5Ed%23@host:port/database +func urlEncodePassword(pgDatabaseUrl string) string { + // No credentials + if !strings.Contains(pgDatabaseUrl, "@") { + return pgDatabaseUrl + } + + password := strings.TrimPrefix(pgDatabaseUrl, "postgresql://") + password = strings.TrimPrefix(password, "postgres://") + passwordEndIndex := strings.LastIndex(password, "@") + password = password[:passwordEndIndex] + + // Credentials without password + if !strings.Contains(password, ":") { + return pgDatabaseUrl + } + + _, password, _ = strings.Cut(password, ":") + encodedPassword := url.QueryEscape(password) + + // Password is already encoded + if encodedPassword == password { + return pgDatabaseUrl + } + + return strings.Replace(pgDatabaseUrl, ":"+password+"@", ":"+encodedPassword+"@", 1) +} diff --git a/src/syncer-common/storage_s3.go b/src/syncer-common/storage_s3.go new file mode 100644 index 0000000..dd5a144 --- /dev/null +++ b/src/syncer-common/storage_s3.go @@ -0,0 +1,290 @@ +package common + +import ( + "context" + "fmt" + "os" + "strings" + + "github.com/aws/aws-sdk-go-v2/aws" + awsConfig "github.com/aws/aws-sdk-go-v2/config" + "github.com/aws/aws-sdk-go-v2/credentials" + "github.com/aws/aws-sdk-go-v2/feature/s3/manager" + "github.com/aws/aws-sdk-go-v2/service/s3" + "github.com/aws/aws-sdk-go-v2/service/s3/types" + "github.com/google/uuid" + goDuckdb "github.com/marcboeker/go-duckdb/v2" + "github.com/xitongsys/parquet-go-source/s3v2" +) + +type StorageS3 struct { + S3Client *s3.Client + Config *BaseConfig + StorageUtils *StorageUtils + Duckdb *Duckdb +} + +type ParquetFileStats struct { + ColumnSizes map[int]int64 + ValueCounts map[int]int64 + NullValueCounts map[int]int64 + LowerBounds map[int][]byte + UpperBounds map[int][]byte + SplitOffsets []int64 +} + +type ParquetFile struct { + Uuid string + Key string + Path string // With s3://bucket/ prefix + Size int64 + RecordCount int64 + Stats ParquetFileStats +} + +type ManifestFile struct { + RecordsDeleted bool + SnapshotId int64 + Key string + Path string // With s3://bucket/ prefix + Size int64 + RecordCount int64 + DataFileSize int64 +} + +type ManifestListItem struct { + SequenceNumber int + ManifestFile ManifestFile +} + +type ManifestListFile struct { + SequenceNumber int + SnapshotId int64 + TimestampMs int64 + Key string + Path string // With s3://bucket/ prefix + Operation string + AddedFilesSize int64 + AddedDataFiles int64 + AddedRecords int64 + RemovedFilesSize int64 + DeletedDataFiles int64 + DeletedRecords int64 +} + +type MetadataFile struct { + Version int64 + Key string +} + +func NewStorageS3(Config *BaseConfig) *StorageS3 { + var awsConfigOptions = []func(*awsConfig.LoadOptions) error{ + awsConfig.WithRegion(Config.Aws.Region), + } + + if Config.LogLevel == LOG_LEVEL_TRACE { + awsConfigOptions = append(awsConfigOptions, awsConfig.WithClientLogMode(aws.LogRequest)) + } + + if IsLocalHost(Config.Aws.S3Endpoint) { + awsConfigOptions = append(awsConfigOptions, awsConfig.WithBaseEndpoint("http://"+Config.Aws.S3Endpoint)) + } else { + awsConfigOptions = append(awsConfigOptions, awsConfig.WithBaseEndpoint("https://"+Config.Aws.S3Endpoint)) + } + + awsCredentials := credentials.NewStaticCredentialsProvider( + Config.Aws.AccessKeyId, + Config.Aws.SecretAccessKey, + "", + ) + awsConfigOptions = append(awsConfigOptions, awsConfig.WithCredentialsProvider(awsCredentials)) + + loadedAwsConfig, err := awsConfig.LoadDefaultConfig(context.Background(), awsConfigOptions...) + PanicIfError(Config, err) + + S3Client := s3.NewFromConfig(loadedAwsConfig, func(o *s3.Options) { + if Config.Aws.S3Endpoint != DEFAULT_AWS_S3_ENDPOINT { + o.UsePathStyle = true + } + }) + + return &StorageS3{ + S3Client: S3Client, + Config: Config, + StorageUtils: NewStorageUtils(Config), + Duckdb: NewDuckdb(Config), + } +} + +// Write --------------------------------------------------------------------------------------------------------------- + +func (storage *StorageS3) CreateParquet(s3DataPath string, icebergSchemaColumns []*IcebergSchemaColumn, loadRows func(appender *goDuckdb.Appender) (rowCount int, reachedEnd bool)) (parquetFile ParquetFile, reachedEnd bool) { + ctx := context.Background() + uuid := uuid.New().String() + fileName := fmt.Sprintf("00000-0-%s.parquet", uuid) + fileS3Path := s3DataPath + "/" + fileName + fileKey := storage.s3Key(fileS3Path) + + rowCount, reachedEnd := storage.StorageUtils.WriteParquetFile(storage.Duckdb, fileS3Path, icebergSchemaColumns, loadRows) + LogDebug(storage.Config, "Parquet file with", rowCount, "record(s) created at:", fileKey) + + headObjectResponse, err := storage.S3Client.HeadObject(ctx, &s3.HeadObjectInput{ + Bucket: aws.String(storage.Config.Aws.S3Bucket), + Key: aws.String(fileKey), + }) + PanicIfError(storage.Config, err) + fileSize := *headObjectResponse.ContentLength + + fileReader, err := s3v2.NewS3FileReaderWithClient(ctx, storage.S3Client, storage.Config.Aws.S3Bucket, fileKey) + PanicIfError(storage.Config, err) + parquetStats := storage.StorageUtils.ReadParquetStats(fileReader, icebergSchemaColumns) + + return ParquetFile{ + Uuid: uuid, + Key: fileKey, + Path: s3DataPath + "/" + fileName, + Size: fileSize, + RecordCount: int64(rowCount), + Stats: parquetStats, + }, reachedEnd +} + +func (storage *StorageS3) DeleteParquet(parquetFile ParquetFile) { + ctx := context.Background() + _, err := storage.S3Client.DeleteObject(ctx, &s3.DeleteObjectInput{ + Bucket: aws.String(storage.Config.Aws.S3Bucket), + Key: aws.String(parquetFile.Key), + }) + PanicIfError(storage.Config, err) +} + +func (storage *StorageS3) CreateManifest(s3MetadataPath string, parquetFile ParquetFile) (manifestFile ManifestFile, err error) { + fileName := fmt.Sprintf("%s-m0.avro", parquetFile.Uuid) + fileKey := storage.s3Key(s3MetadataPath) + "/" + fileName + + err = storage.uploadTemporaryFile("manifest", fileKey, func(tempFile *os.File) error { + manifestFile, err = storage.StorageUtils.WriteManifestFile(tempFile.Name(), parquetFile) + return err + }) + if err != nil { + return manifestFile, err + } + LogDebug(storage.Config, "Manifest file created at:", fileKey) + + manifestFile.Key = fileKey + manifestFile.Path = s3MetadataPath + "/" + fileName + return manifestFile, nil +} + +func (storage *StorageS3) CreateManifestList(s3MetadataPath string, parquetFileUuid string, manifestListItemsSortedDesc []ManifestListItem) (manifestListFile ManifestListFile, err error) { + fileName := fmt.Sprintf("snap-%d-0-%s.avro", manifestListItemsSortedDesc[0].ManifestFile.SnapshotId, parquetFileUuid) + fileKey := storage.s3Key(s3MetadataPath) + "/" + fileName + + err = storage.uploadTemporaryFile("manifest-list", fileKey, func(tempFile *os.File) error { + manifestListFile, err = storage.StorageUtils.WriteManifestListFile(tempFile.Name(), manifestListItemsSortedDesc) + return err + }) + if err != nil { + return manifestListFile, err + } + LogDebug(storage.Config, "Manifest list file created at:", fileKey) + + manifestListFile.Key = fileKey + manifestListFile.Path = s3MetadataPath + "/" + fileName + return manifestListFile, nil +} + +func (storage *StorageS3) CreateMetadata(s3MetadataPath string, icebergSchemaColumns []*IcebergSchemaColumn, manifestListFilesSortedAsc []ManifestListFile) (metadataFile MetadataFile, err error) { + fileKey := storage.s3Key(s3MetadataPath) + "/" + ICEBERG_METADATA_INITIAL_FILE_NAME + + err = storage.uploadTemporaryFile("metadata", fileKey, func(tempFile *os.File) error { + s3TablePath := strings.TrimSuffix(s3MetadataPath, "/metadata") + return storage.StorageUtils.WriteMetadataFile(s3TablePath, tempFile.Name(), icebergSchemaColumns, manifestListFilesSortedAsc) + }) + if err != nil { + return metadataFile, err + } + LogDebug(storage.Config, "Metadata file created at:", fileKey) + + return MetadataFile{Version: 1, Key: fileKey}, nil +} + +func (storage *StorageS3) DeleteTableFiles(s3TablePath string) (err error) { + tableKey := storage.s3Key(s3TablePath) + return storage.deleteNestedObjects(tableKey) +} + +// --------------------------------------------------------------------------------------------------------------------- + +func (storage *StorageS3) uploadTemporaryFile(tempFilePattern string, uploadFilePath string, writeTempFileFunc func(*os.File) error) error { + tempFile, err := os.CreateTemp("", tempFilePattern) + if err != nil { + return err + } + defer func() { + os.Remove(tempFile.Name()) + }() + + err = writeTempFileFunc(tempFile) + if err != nil { + return err + } + + uploader := manager.NewUploader(storage.S3Client) + _, err = uploader.Upload(context.Background(), &s3.PutObjectInput{ + Bucket: aws.String(storage.Config.Aws.S3Bucket), + Key: aws.String(uploadFilePath), + Body: tempFile, + }) + if err != nil { + return fmt.Errorf("failed to upload file: %v", err) + } + + err = tempFile.Close() + if err != nil { + return err + } + + return nil +} + +// s3://bucket/some/path -> some/path +func (storage *StorageS3) s3Key(s3Path string) string { + return strings.Split(s3Path, "s3://"+storage.Config.Aws.S3Bucket+"/")[1] +} + +func (storage *StorageS3) deleteNestedObjects(prefixKey string) (err error) { + ctx := context.Background() + + listResponse, err := storage.S3Client.ListObjectsV2(ctx, &s3.ListObjectsV2Input{ + Bucket: aws.String(storage.Config.Aws.S3Bucket), + Prefix: aws.String(prefixKey), + }) + if err != nil { + return fmt.Errorf("failed to list objects: %v", err) + } + + var objectsToDelete []types.ObjectIdentifier + for _, obj := range listResponse.Contents { + LogDebug(storage.Config, "Object to delete:", *obj.Key) + objectsToDelete = append(objectsToDelete, types.ObjectIdentifier{Key: obj.Key}) + } + + if len(objectsToDelete) > 0 { + _, err = storage.S3Client.DeleteObjects(ctx, &s3.DeleteObjectsInput{ + Bucket: aws.String(storage.Config.Aws.S3Bucket), + Delete: &types.Delete{ + Objects: objectsToDelete, + Quiet: aws.Bool(true), + }, + }) + if err != nil { + return fmt.Errorf("failed to delete objects: %v", err) + } + LogDebug(storage.Config, "Deleted", len(objectsToDelete), "object(s).") + } else { + LogDebug(storage.Config, "No objects to delete.") + } + + return nil +} diff --git a/src/syncer-common/storage_utils.go b/src/syncer-common/storage_utils.go new file mode 100644 index 0000000..cbbb83e --- /dev/null +++ b/src/syncer-common/storage_utils.go @@ -0,0 +1,867 @@ +package common + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "os" + "strings" + "time" + + "github.com/google/uuid" + "github.com/linkedin/goavro" + goDuckdb "github.com/marcboeker/go-duckdb/v2" + "github.com/xitongsys/parquet-go/reader" + "github.com/xitongsys/parquet-go/source" + "golang.org/x/exp/maps" +) + +const ( + ICEBERG_MANIFEST_STATUS_ADDED = 1 + ICEBERG_MANIFEST_STATUS_DELETED = 2 + + ICEBERG_MANIFEST_LIST_OPERATION_APPEND = "append" + ICEBERG_MANIFEST_LIST_OPERATION_OVERWRITE = "overwrite" + ICEBERG_MANIFEST_LIST_OPERATION_DELETE = "delete" + + ICEBERG_METADATA_INITIAL_FILE_NAME = "v1.metadata.json" +) + +type MetadataJson struct { + Schemas []struct { + Fields []struct { + ID int `json:"id"` + Name string `json:"name"` + Type interface{} `json:"type"` + Required bool `json:"required"` + } `json:"fields"` + } `json:"schemas"` +} + +type ManifestListsJson struct { + Snapshots []struct { + SequenceNumber int `json:"sequence-number"` + SnapshotId int64 `json:"snapshot-id"` + TimestampMs int64 `json:"timestamp-ms"` + Path string `json:"manifest-list"` + Summary struct { + Operation string `json:"operation"` + AddedFilesSize string `json:"added-files-size"` + AddedDataFiles string `json:"added-data-files"` + AddedRecords string `json:"added-records"` + RemovedFilesSize string `json:"removed-files-size"` + DeletedDataFiles string `json:"deleted-data-files"` + DeletedRecords string `json:"deleted-records"` + } `json:"summary"` + } `json:"snapshots"` +} + +type ManifestListSequenceStats struct { + AddedFilesSize int64 + AddedDataFiles int64 + AddedRecords int64 + RemovedFilesSize int64 + DeletedDataFiles int64 + DeletedRecords int64 +} + +type StorageUtils struct { + Config *BaseConfig +} + +func NewStorageUtils(config *BaseConfig) *StorageUtils { + return &StorageUtils{ + Config: config, + } +} + +// Write --------------------------------------------------------------------------------------------------------------- + +func (storage *StorageUtils) WriteParquetFile(duckdb *Duckdb, fileS3Path string, icebergSchemaColumns []*IcebergSchemaColumn, loadRows func(appender *goDuckdb.Appender) (rowCount int, reachedEnd bool)) (rowCount int, reachedEnd bool) { + ctx := context.Background() + tableName := "temp_" + strings.ReplaceAll(uuid.New().String(), "-", "") + columnSchemas := make([]string, len(icebergSchemaColumns)) + fieldIds := make([]string, len(icebergSchemaColumns)) + for i, col := range icebergSchemaColumns { + columnSchemas[i] = col.QuotedColumnName() + " " + col.DuckdbType() + if col.IsList { + fieldIds[i] = col.QuotedColumnName() + ":{__duckdb_field_id: " + IntToString(col.Position) + ", element: " + IntToString(PARQUET_NESTED_FIELD_ID_PREFIX+col.Position) + "}" + } else { + fieldIds[i] = col.QuotedColumnName() + ":" + IntToString(col.Position) + } + } + _, err := duckdb.ExecContext(ctx, "CREATE TABLE "+tableName+"("+strings.Join(columnSchemas, ",")+")", nil) + PanicIfError(storage.Config, err) + + appender, err := duckdb.Appender("", tableName) + PanicIfError(storage.Config, err) + + rowCount, reachedEnd = loadRows(appender) + err = appender.Close() + PanicIfError(storage.Config, err) + + copyQuery := "COPY " + tableName + " TO '$fileS3Path' (FORMAT PARQUET, COMPRESSION 'ZSTD', FIELD_IDS {$fieldIds})" + _, err = duckdb.ExecContext(ctx, copyQuery, map[string]string{ + "fileS3Path": fileS3Path, + "fieldIds": strings.Join(fieldIds, ","), + }) + PanicIfError(storage.Config, err) + + _, err = duckdb.ExecContext(ctx, "DROP TABLE "+tableName, nil) + PanicIfError(storage.Config, err) + + return rowCount, reachedEnd +} + +func (storage *StorageUtils) ReadParquetStats(fileReader source.ParquetFile, icebergSchemaColumns []*IcebergSchemaColumn) (parquetStats ParquetFileStats) { + defer fileReader.Close() + + pr, err := reader.NewParquetReader(fileReader, nil, 1) + PanicIfError(storage.Config, err) + defer pr.ReadStop() + + parquetStats = ParquetFileStats{ + ColumnSizes: make(map[int]int64), + ValueCounts: make(map[int]int64), + NullValueCounts: make(map[int]int64), + LowerBounds: make(map[int][]byte), + UpperBounds: make(map[int][]byte), + SplitOffsets: []int64{}, + } + + fieldIdByColumnName := make(map[string]int) + for _, column := range icebergSchemaColumns { + if column.IsList { + fieldIdByColumnName[strings.ToLower(column.NormalizedColumnName())] = PARQUET_NESTED_FIELD_ID_PREFIX + column.Position + } else { + fieldIdByColumnName[strings.ToLower(column.NormalizedColumnName())] = column.Position + } + } + + for _, rowGroup := range pr.Footer.RowGroups { + if rowGroup.FileOffset != nil { + parquetStats.SplitOffsets = append(parquetStats.SplitOffsets, *rowGroup.FileOffset) + } + + for _, columnChunk := range rowGroup.Columns { + columnMetaData := columnChunk.MetaData + columnName := columnMetaData.PathInSchema[0] + fieldId, ok := fieldIdByColumnName[strings.ToLower(columnName)] + if !ok { + continue + } + parquetStats.ColumnSizes[fieldId] += columnMetaData.TotalCompressedSize + parquetStats.ValueCounts[fieldId] += int64(columnMetaData.NumValues) + + if columnMetaData.Statistics != nil { + if columnMetaData.Statistics.NullCount != nil { + parquetStats.NullValueCounts[fieldId] += *columnMetaData.Statistics.NullCount + } + + minValue := columnMetaData.Statistics.Min + maxValue := columnMetaData.Statistics.Max + + if parquetStats.LowerBounds[fieldId] == nil || bytes.Compare(parquetStats.LowerBounds[fieldId], minValue) > 0 { + parquetStats.LowerBounds[fieldId] = minValue + } + if parquetStats.UpperBounds[fieldId] == nil || bytes.Compare(parquetStats.UpperBounds[fieldId], maxValue) < 0 { + parquetStats.UpperBounds[fieldId] = maxValue + } + } + } + } + + return parquetStats +} +func (storage *StorageUtils) WriteManifestFile(filePath string, parquetFile ParquetFile) (manifestFile ManifestFile, err error) { + snapshotId := time.Now().UnixNano() + codec, err := goavro.NewCodec(MANIFEST_SCHEMA) + if err != nil { + return ManifestFile{}, fmt.Errorf("failed to create Avro codec: %v", err) + } + + columnSizesArr := []interface{}{} + for fieldId, size := range parquetFile.Stats.ColumnSizes { + columnSizesArr = append(columnSizesArr, map[string]interface{}{ + "key": fieldId, + "value": size, + }) + } + + valueCountsArr := []interface{}{} + for fieldId, count := range parquetFile.Stats.ValueCounts { + valueCountsArr = append(valueCountsArr, map[string]interface{}{ + "key": fieldId, + "value": count, + }) + } + + nullValueCountsArr := []interface{}{} + for fieldId, count := range parquetFile.Stats.NullValueCounts { + nullValueCountsArr = append(nullValueCountsArr, map[string]interface{}{ + "key": fieldId, + "value": count, + }) + } + + lowerBoundsArr := []interface{}{} + for fieldId, value := range parquetFile.Stats.LowerBounds { + lowerBoundsArr = append(lowerBoundsArr, map[string]interface{}{ + "key": fieldId, + "value": value, + }) + } + + upperBoundsArr := []interface{}{} + for fieldId, value := range parquetFile.Stats.UpperBounds { + upperBoundsArr = append(upperBoundsArr, map[string]interface{}{ + "key": fieldId, + "value": value, + }) + } + + dataFile := map[string]interface{}{ + "content": 0, // 0: DATA, 1: POSITION DELETES, 2: EQUALITY DELETES + "file_path": parquetFile.Path, + "file_format": "PARQUET", + "partition": map[string]interface{}{}, + "record_count": parquetFile.RecordCount, + "file_size_in_bytes": parquetFile.Size, + "column_sizes": map[string]interface{}{ + "array": columnSizesArr, + }, + "value_counts": map[string]interface{}{ + "array": valueCountsArr, + }, + "null_value_counts": map[string]interface{}{ + "array": nullValueCountsArr, + }, + "nan_value_counts": map[string]interface{}{ + "array": []interface{}{}, + }, + "lower_bounds": map[string]interface{}{ + "array": lowerBoundsArr, + }, + "upper_bounds": map[string]interface{}{ + "array": upperBoundsArr, + }, + "key_metadata": nil, + "split_offsets": map[string]interface{}{ + "array": parquetFile.Stats.SplitOffsets, + }, + "equality_ids": nil, + "sort_order_id": map[string]interface{}{ + "int": 0, + }, + } + + manifestEntry := map[string]interface{}{ + "status": ICEBERG_MANIFEST_STATUS_ADDED, + "snapshot_id": map[string]interface{}{"long": snapshotId}, + "sequence_number": nil, + "file_sequence_number": nil, + "data_file": dataFile, + } + + avroFile, err := os.Create(filePath) + if err != nil { + return ManifestFile{}, fmt.Errorf("failed to create manifest file: %v", err) + } + defer avroFile.Close() + + ocfWriter, err := goavro.NewOCFWriter(goavro.OCFConfig{ + W: avroFile, + Codec: codec, + Schema: MANIFEST_SCHEMA, + }) + if err != nil { + return ManifestFile{}, fmt.Errorf("failed to create Avro OCF writer: %v", err) + } + + err = ocfWriter.Append([]interface{}{manifestEntry}) + if err != nil { + return ManifestFile{}, fmt.Errorf("failed to write to manifest file: %v", err) + } + + fileInfo, err := os.Stat(filePath) + if err != nil { + return ManifestFile{}, fmt.Errorf("failed to get manifest file info: %v", err) + } + fileSize := fileInfo.Size() + + return ManifestFile{ + SnapshotId: snapshotId, + Size: fileSize, + RecordCount: parquetFile.RecordCount, + DataFileSize: parquetFile.Size, + }, nil +} + +func (storage *StorageUtils) WriteManifestListFile(filePath string, manifestListItemsSortedDesc []ManifestListItem) (ManifestListFile, error) { + codec, err := goavro.NewCodec(MANIFEST_LIST_SCHEMA) + if err != nil { + return ManifestListFile{}, fmt.Errorf("failed to create Avro codec for manifest list: %v", err) + } + + var manifestListRecords []interface{} + + statsBySequenceNumber := make(map[string]ManifestListSequenceStats) + + for _, manifestListItem := range manifestListItemsSortedDesc { + sequenceNumber := manifestListItem.SequenceNumber + sequenceStats := statsBySequenceNumber[IntToString(sequenceNumber)] + manifestFile := manifestListItem.ManifestFile + + manifestListRecord := map[string]interface{}{ + "added_snapshot_id": manifestFile.SnapshotId, + "manifest_length": manifestFile.Size, + "manifest_path": manifestFile.Path, + "min_sequence_number": sequenceNumber, + "sequence_number": sequenceNumber, + "content": 0, + "deleted_files_count": 0, + "deleted_rows_count": 0, + "existing_files_count": 0, + "existing_rows_count": 0, + "key_metadata": nil, + "partition_spec_id": 0, + "partitions": map[string]interface{}{"array": []string{}}, + } + + if manifestFile.RecordsDeleted { + manifestListRecord["added_files_count"] = 0 + manifestListRecord["added_rows_count"] = 0 + manifestListRecord["deleted_files_count"] = 1 + manifestListRecord["deleted_rows_count"] = manifestFile.RecordCount + sequenceStats.RemovedFilesSize += manifestFile.DataFileSize + sequenceStats.DeletedDataFiles += 1 + sequenceStats.DeletedRecords += manifestFile.RecordCount + } else { + manifestListRecord["added_files_count"] = 1 + manifestListRecord["added_rows_count"] = manifestFile.RecordCount + manifestListRecord["deleted_files_count"] = 0 + manifestListRecord["deleted_rows_count"] = 0 + sequenceStats.AddedFilesSize += manifestFile.DataFileSize + sequenceStats.AddedDataFiles += 1 + sequenceStats.AddedRecords += manifestFile.RecordCount + } + + statsBySequenceNumber[IntToString(sequenceNumber)] = sequenceStats + manifestListRecords = append(manifestListRecords, manifestListRecord) + } + + avroFile, err := os.Create(filePath) + if err != nil { + return ManifestListFile{}, fmt.Errorf("failed to create manifest list file: %v", err) + } + defer avroFile.Close() + + ocfWriter, err := goavro.NewOCFWriter(goavro.OCFConfig{ + W: avroFile, + Codec: codec, + Schema: MANIFEST_LIST_SCHEMA, + }) + if err != nil { + return ManifestListFile{}, fmt.Errorf("failed to create OCF writer for manifest list: %v", err) + } + + err = ocfWriter.Append(manifestListRecords) + if err != nil { + return ManifestListFile{}, fmt.Errorf("failed to write manifest list record: %v", err) + } + + sequenceNumbers := maps.Keys(statsBySequenceNumber) + lastManifestListItem := manifestListItemsSortedDesc[0] + lastSequenceStats := statsBySequenceNumber[IntToString(lastManifestListItem.SequenceNumber)] + + operation := ICEBERG_MANIFEST_LIST_OPERATION_APPEND + if len(sequenceNumbers) == 1 && len(manifestListRecords) == 2 && lastSequenceStats.AddedDataFiles == 1 && lastSequenceStats.DeletedDataFiles == 1 { + operation = ICEBERG_MANIFEST_LIST_OPERATION_OVERWRITE + } else if lastSequenceStats.AddedDataFiles == 0 && lastSequenceStats.DeletedDataFiles > 0 { + operation = ICEBERG_MANIFEST_LIST_OPERATION_DELETE + } + + manifestListFile := ManifestListFile{ + SequenceNumber: lastManifestListItem.SequenceNumber, + SnapshotId: lastManifestListItem.ManifestFile.SnapshotId, + TimestampMs: time.Now().UnixNano() / int64(time.Millisecond), + Operation: operation, + AddedFilesSize: lastSequenceStats.AddedFilesSize, + AddedDataFiles: lastSequenceStats.AddedDataFiles, + AddedRecords: lastSequenceStats.AddedRecords, + RemovedFilesSize: lastSequenceStats.RemovedFilesSize, + DeletedDataFiles: lastSequenceStats.DeletedDataFiles, + DeletedRecords: lastSequenceStats.DeletedRecords, + } + return manifestListFile, nil +} + +func (storage *StorageUtils) WriteMetadataFile(s3TablePath string, filePath string, icebergSchemaColumns []*IcebergSchemaColumn, manifestListFilesSortedAsc []ManifestListFile) (err error) { + tableUuid := uuid.New().String() + + lastColumnId := 0 + for _, col := range icebergSchemaColumns { + if col.IsList { + columnId := PARQUET_NESTED_FIELD_ID_PREFIX + col.Position + if columnId > lastColumnId { + lastColumnId = columnId + } + } else if col.Position > lastColumnId { + lastColumnId = col.Position + } + } + + icebergSchemaFields := make([]interface{}, len(icebergSchemaColumns)) + for i, icebergSchemaColumn := range icebergSchemaColumns { + icebergSchemaFields[i] = icebergSchemaColumn.IcebergSchemaFieldMap() + } + + snapshots := make([]map[string]interface{}, len(manifestListFilesSortedAsc)) + snapshotLog := make([]map[string]interface{}, len(manifestListFilesSortedAsc)) + + var totalDataFiles, totalFilesSize, totalRecords int64 + + for i, manifestListFile := range manifestListFilesSortedAsc { + totalDataFiles += manifestListFile.AddedDataFiles - manifestListFile.DeletedDataFiles + totalFilesSize += manifestListFile.AddedFilesSize - manifestListFile.RemovedFilesSize + totalRecords += manifestListFile.AddedRecords - manifestListFile.DeletedRecords + + snapshot := map[string]interface{}{ + "schema-id": 0, + "snapshot-id": manifestListFile.SnapshotId, + "sequence-number": manifestListFile.SequenceNumber, + "timestamp-ms": manifestListFile.TimestampMs, + "manifest-list": manifestListFile.Path, + "summary": map[string]interface{}{ + "operation": manifestListFile.Operation, + "added-data-files": Int64ToString(manifestListFile.AddedDataFiles), + "added-files-size": Int64ToString(manifestListFile.AddedFilesSize), + "added-records": Int64ToString(manifestListFile.AddedRecords), + "deleted-data-files": Int64ToString(manifestListFile.DeletedDataFiles), + "deleted-records": Int64ToString(manifestListFile.DeletedRecords), + "removed-files-size": Int64ToString(manifestListFile.RemovedFilesSize), + "total-data-files": Int64ToString(totalDataFiles), + "total-files-size": Int64ToString(totalFilesSize), + "total-records": Int64ToString(totalRecords), + "total-delete-files": "0", + "total-equality-deletes": "0", + "total-position-deletes": "0", + }, + } + if i != 0 { + snapshot["parent-snapshot-id"] = manifestListFilesSortedAsc[i-1].SnapshotId + } + snapshots[i] = snapshot + + snapshotLog[i] = map[string]interface{}{ + "snapshot-id": manifestListFile.SnapshotId, + "timestamp-ms": manifestListFile.TimestampMs, + } + } + + lastManifestListFile := manifestListFilesSortedAsc[len(manifestListFilesSortedAsc)-1] + metadata := map[string]interface{}{ + "format-version": 2, + "table-uuid": tableUuid, + "statistics": []interface{}{}, + "location": s3TablePath, + "last-sequence-number": lastManifestListFile.SequenceNumber, + "last-updated-ms": lastManifestListFile.TimestampMs, + "last-column-id": lastColumnId, + "schemas": []interface{}{ + map[string]interface{}{ + "type": "struct", + "schema-id": 0, + "fields": icebergSchemaFields, + "identifier-field-ids": []interface{}{}, + }, + }, + "current-schema-id": 0, + "partition-specs": []interface{}{ + map[string]interface{}{ + "spec-id": 0, + "fields": []interface{}{}, + }, + }, + "default-spec-id": 0, + "default-sort-order-id": 0, + "last-partition-id": 999, // Assuming no partitions; set to a placeholder + "properties": map[string]string{}, + "current-snapshot-id": lastManifestListFile.SnapshotId, + "refs": map[string]interface{}{ + "main": map[string]interface{}{ + "snapshot-id": lastManifestListFile.SnapshotId, + "type": "branch", + }, + }, + "snapshots": snapshots, + "snapshot-log": snapshotLog, + "metadata-log": []interface{}{}, + "sort-orders": []interface{}{ + map[string]interface{}{ + "order-id": 0, + "fields": []interface{}{}, + }, + }, + } + + file, err := os.Create(filePath) + if err != nil { + return fmt.Errorf("failed to create metadata file: %v", err) + } + defer file.Close() + + encoder := json.NewEncoder(file) + encoder.SetIndent("", " ") + err = encoder.Encode(metadata) + if err != nil { + return fmt.Errorf("failed to write metadata to file: %v", err) + } + + return nil +} + +func (storage *StorageUtils) WriteVersionHintFile(filePath string, metadataFile MetadataFile) (err error) { + file, err := os.Create(filePath) + if err != nil { + return fmt.Errorf("failed to create version hint file: %v", err) + } + defer file.Close() + + _, err = file.WriteString(fmt.Sprintf("%d", metadataFile.Version)) + if err != nil { + return fmt.Errorf("failed to write to version hint file: %v", err) + } + + return nil +} + +const ( + MANIFEST_SCHEMA = `{ + "type" : "record", + "name" : "manifest_entry", + "fields" : [ { + "name" : "status", + "type" : "int", + "field-id" : 0 + }, { + "name" : "snapshot_id", + "type" : [ "null", "long" ], + "default" : null, + "field-id" : 1 + }, { + "name" : "sequence_number", + "type" : [ "null", "long" ], + "default" : null, + "field-id" : 3 + }, { + "name" : "file_sequence_number", + "type" : [ "null", "long" ], + "default" : null, + "field-id" : 4 + }, { + "name" : "data_file", + "type" : { + "type" : "record", + "name" : "r2", + "fields" : [ { + "name" : "content", + "type" : "int", + "doc" : "File format name: avro, orc, or parquet", + "field-id" : 134 + }, { + "name" : "file_path", + "type" : "string", + "doc" : "Location URI with FS scheme", + "field-id" : 100 + }, { + "name" : "file_format", + "type" : "string", + "doc" : "File format name: avro, orc, or parquet", + "field-id" : 101 + }, { + "name" : "partition", + "type" : { + "type" : "map", + "values" : [ "null", "string" ], + "key-id" : 10001, + "value-id" : 10002 + }, + "doc" : "Partition values tuple, schema based on the partition spec", + "field-id" : 102 + }, { + "name" : "record_count", + "type" : "long", + "doc" : "Number of records in the file", + "field-id" : 103 + }, { + "name" : "file_size_in_bytes", + "type" : "long", + "doc" : "Total file size in bytes", + "field-id" : 104 + }, { + "name" : "column_sizes", + "type" : [ "null", { + "type" : "array", + "items" : { + "type" : "record", + "name" : "k117_v118", + "fields" : [ { + "name" : "key", + "type" : "int", + "field-id" : 117 + }, { + "name" : "value", + "type" : "long", + "field-id" : 118 + } ] + }, + "logicalType" : "map" + } ], + "doc" : "Map of column id to total size on disk", + "default" : null, + "field-id" : 108 + }, { + "name" : "value_counts", + "type" : [ "null", { + "type" : "array", + "items" : { + "type" : "record", + "name" : "k119_v120", + "fields" : [ { + "name" : "key", + "type" : "int", + "field-id" : 119 + }, { + "name" : "value", + "type" : "long", + "field-id" : 120 + } ] + }, + "logicalType" : "map" + } ], + "doc" : "Map of column id to total count, including null and NaN", + "default" : null, + "field-id" : 109 + }, { + "name" : "null_value_counts", + "type" : [ "null", { + "type" : "array", + "items" : { + "type" : "record", + "name" : "k121_v122", + "fields" : [ { + "name" : "key", + "type" : "int", + "field-id" : 121 + }, { + "name" : "value", + "type" : "long", + "field-id" : 122 + } ] + }, + "logicalType" : "map" + } ], + "doc" : "Map of column id to null value count", + "default" : null, + "field-id" : 110 + }, { + "name" : "nan_value_counts", + "type" : [ "null", { + "type" : "array", + "items" : { + "type" : "record", + "name" : "k138_v139", + "fields" : [ { + "name" : "key", + "type" : "int", + "field-id" : 138 + }, { + "name" : "value", + "type" : "long", + "field-id" : 139 + } ] + }, + "logicalType" : "map" + } ], + "doc" : "Map of column id to number of NaN values in the column", + "default" : null, + "field-id" : 137 + }, { + "name" : "lower_bounds", + "type" : [ "null", { + "type" : "array", + "items" : { + "type" : "record", + "name" : "k126_v127", + "fields" : [ { + "name" : "key", + "type" : "int", + "field-id" : 126 + }, { + "name" : "value", + "type" : "bytes", + "field-id" : 127 + } ] + }, + "logicalType" : "map" + } ], + "doc" : "Map of column id to lower bound", + "default" : null, + "field-id" : 125 + }, { + "name" : "upper_bounds", + "type" : [ "null", { + "type" : "array", + "items" : { + "type" : "record", + "name" : "k129_v130", + "fields" : [ { + "name" : "key", + "type" : "int", + "field-id" : 129 + }, { + "name" : "value", + "type" : "bytes", + "field-id" : 130 + } ] + }, + "logicalType" : "map" + } ], + "doc" : "Map of column id to upper bound", + "default" : null, + "field-id" : 128 + }, { + "name" : "key_metadata", + "type" : [ "null", "bytes" ], + "doc" : "Encryption key metadata blob", + "default" : null, + "field-id" : 131 + }, { + "name" : "split_offsets", + "type" : [ "null", { + "type" : "array", + "items" : "long", + "element-id" : 133 + } ], + "doc" : "Splittable offsets", + "default" : null, + "field-id" : 132 + }, { + "name" : "equality_ids", + "type" : [ "null", { + "type" : "array", + "items" : "long", + "element-id" : 136 + } ], + "doc" : "Field ids used to determine row equality in equality delete files.", + "default" : null, + "field-id" : 135 + }, { + "name" : "sort_order_id", + "type" : [ "null", "int" ], + "doc" : "ID representing sort order for this file", + "default" : null, + "field-id" : 140 + } ] + }, + "field-id" : 2 + } ] + }` + MANIFEST_LIST_SCHEMA = `{ + "type" : "record", + "name" : "manifest_file", + "fields" : [ { + "name" : "manifest_path", + "type" : "string", + "doc" : "Location URI with FS scheme", + "field-id" : 500 + }, { + "name" : "manifest_length", + "type" : "long", + "field-id" : 501 + }, { + "name" : "partition_spec_id", + "type" : "int", + "field-id" : 502 + }, { + "name" : "content", + "type" : "int", + "field-id" : 517 + }, { + "name" : "sequence_number", + "type" : "long", + "field-id" : 515 + }, { + "name" : "min_sequence_number", + "type" : "long", + "field-id" : 516 + }, { + "name" : "added_snapshot_id", + "type" : "long", + "field-id" : 503 + }, { + "name" : "added_files_count", + "type" : "int", + "field-id" : 504 + }, { + "name" : "existing_files_count", + "type" : "int", + "field-id" : 505 + }, { + "name" : "deleted_files_count", + "type" : "int", + "field-id" : 506 + }, { + "name" : "added_rows_count", + "type" : "long", + "field-id" : 512 + }, { + "name" : "existing_rows_count", + "type" : "long", + "field-id" : 513 + }, { + "name" : "deleted_rows_count", + "type" : "long", + "field-id" : 514 + }, { + "name" : "partitions", + "type" : [ "null", { + "type" : "array", + "items" : { + "type" : "record", + "name" : "r508", + "fields" : [ { + "name" : "contains_null", + "type" : "boolean", + "field-id" : 509 + }, { + "name" : "contains_nan", + "type" : [ "null", "boolean" ], + "default" : null, + "field-id" : 518 + }, { + "name" : "lower_bound", + "type" : [ "null", "bytes" ], + "default" : null, + "field-id" : 510 + }, { + "name" : "upper_bound", + "type" : [ "null", "bytes" ], + "default" : null, + "field-id" : 511 + } ] + }, + "element-id" : 508 + } ], + "default" : null, + "field-id" : 507 + }, { + "name" : "key_metadata", + "type" : [ "null", "bytes" ], + "default" : null, + "field-id" : 519 + } ] + }` +) diff --git a/src/syncer-common/trino.go b/src/syncer-common/trino.go index b4863a6..cb782c4 100644 --- a/src/syncer-common/trino.go +++ b/src/syncer-common/trino.go @@ -8,8 +8,9 @@ import ( ) const ( - TRINO_MAX_DECIMAL_PRECISION = 38 - TRINO_MAX_QUERY_LENGTH = 1_000_000 + TRINO_MAX_DECIMAL_PRECISION = 38 + TRINO_FALLBACK_DECIMAL_SCALE = 6 + TRINO_MAX_QUERY_LENGTH = 1_000_000 ) type Trino struct { diff --git a/src/syncer-common/utils.go b/src/syncer-common/utils.go index 5392287..fa21cef 100644 --- a/src/syncer-common/utils.go +++ b/src/syncer-common/utils.go @@ -16,6 +16,10 @@ func IntToString(i int) string { return strconv.Itoa(i) } +func Int64ToString(i int64) string { + return strconv.FormatInt(i, 10) +} + func Float64ToString(i float64) string { return strconv.FormatFloat(i, 'f', -1, 64) } @@ -29,6 +33,46 @@ func StringToInt(s string) int { return int } +func StringToInt64(s string) int64 { + int64Value, err := strconv.ParseInt(s, 10, 64) + if err != nil { + panic(err) + } + + return int64Value +} + +func StringToFloat64(s string) float64 { + floatValue, err := strconv.ParseFloat(s, 64) + if err != nil { + panic(err) + } + + return floatValue +} + +func StringDateToTime(str string) time.Time { + // Golang's time.Parse() function does not support parsing dates with 5+ digit years + // So we need to handle this case manually by parsing the year separately + var nonStandardYear int + parts := strings.Split(str, "-") + if len(parts) == 3 && len(parts[0]) > 4 { + nonStandardYear = StringToInt(parts[0]) + str = str[len(parts[0])-4:] // Remove the prefix from str leaving only the standard 10 characters (YYYY-MM-DD) + } + + // Parse the date string as a standard date + parsedTime, err := time.Parse("2006-01-02", str) + + // If the year is non-standard, add the year difference to the parsed time after parsing + if err == nil && nonStandardYear != 0 { + parsedTime = parsedTime.AddDate(nonStandardYear-parsedTime.Year(), 0, 0) + return parsedTime + } + + return parsedTime +} + func HexToString(s string) (string, error) { decoded, err := hex.DecodeString(s) if err != nil { @@ -57,6 +101,10 @@ func StringMsToUtcTime(s string) time.Time { return t.UTC() } +func IsLocalHost(host string) bool { + return strings.HasPrefix(host, "127.0.0.1") || strings.HasPrefix(host, "localhost") +} + type AnonymousAnalyticsData struct { Command string `json:"command"` OsName string `json:"osName"` diff --git a/src/syncer-postgres/config.go b/src/syncer-postgres/config.go index 7d87b92..8f1c434 100644 --- a/src/syncer-postgres/config.go +++ b/src/syncer-postgres/config.go @@ -72,11 +72,15 @@ func registerFlags() { _config.BaseConfig = &common.BaseConfig{} flag.StringVar(&_config.BaseConfig.LogLevel, "log-level", os.Getenv(common.ENV_LOG_LEVEL), `Log level: "ERROR", "WARN", "INFO", "DEBUG", "TRACE". Default: "`+common.DEFAULT_LOG_LEVEL+`"`) + flag.StringVar(&_config.BaseConfig.CatalogDatabaseUrl, "catalog-database-url", os.Getenv(common.ENV_CATALOG_DATABASE_URL), "Catalog database URL") flag.StringVar(&_config.BaseConfig.DestinationSchemaName, "destination-schema-name", os.Getenv(common.ENV_DESTINATION_SCHEMA_NAME), "Destination schema name to store the synced data") flag.StringVar(&_config.BaseConfig.Trino.DatabaseUrl, "trino-database-url", os.Getenv(common.ENV_TRINO_DATABASE_URL), "Trino database URL to sync to") flag.StringVar(&_config.BaseConfig.Trino.CatalogName, "trino-catalog-name", os.Getenv(common.ENV_TRINO_CATALOG_NAME), "Trino catalog name") + flag.StringVar(&_config.BaseConfig.Aws.Region, "aws-region", os.Getenv(common.ENV_AWS_REGION), "AWS region") flag.StringVar(&_config.BaseConfig.Aws.S3Endpoint, "aws-s3-endpoint", os.Getenv(common.ENV_AWS_S3_ENDPOINT), "AWS S3 endpoint. Default: \""+common.DEFAULT_AWS_S3_ENDPOINT+`"`) flag.StringVar(&_config.BaseConfig.Aws.S3Bucket, "aws-s3-bucket", os.Getenv(common.ENV_AWS_S3_BUCKET), "AWS S3 bucket name") + flag.StringVar(&_config.BaseConfig.Aws.AccessKeyId, "aws-access-key-id", os.Getenv(common.ENV_AWS_ACCESS_KEY_ID), "AWS access key ID") + flag.StringVar(&_config.BaseConfig.Aws.SecretAccessKey, "aws-secret-access-key", os.Getenv(common.ENV_AWS_SECRET_ACCESS_KEY), "AWS secret access key") flag.BoolVar(&_config.BaseConfig.DisableAnonymousAnalytics, "disable-anonymous-analytics", os.Getenv(common.ENV_DISABLE_ANONYMOUS_ANALYTICS) == "true", "Disable anonymous analytics collection") flag.StringVar(&_config.DatabaseUrl, "database-url", os.Getenv(ENV_DATABASE_URL), "PostgreSQL database URL") @@ -105,6 +109,9 @@ func parseFlags() { } else if !slices.Contains(common.LOG_LEVELS, _config.BaseConfig.LogLevel) { panic("Invalid log level " + _config.BaseConfig.LogLevel + ". Must be one of " + strings.Join(common.LOG_LEVELS, ", ")) } + if _config.BaseConfig.CatalogDatabaseUrl == "" { + panic("Catalog database URL is required") + } if _config.BaseConfig.DestinationSchemaName == "" { panic("Destination schema name is required") } @@ -115,6 +122,22 @@ func parseFlags() { panic("Trino catalog name is required") } + if _config.BaseConfig.Aws.Region == "" { + panic("AWS region is required") + } + if _config.BaseConfig.Aws.S3Endpoint == "" { + _config.BaseConfig.Aws.S3Endpoint = common.DEFAULT_AWS_S3_ENDPOINT + } + if _config.BaseConfig.Aws.S3Bucket == "" { + panic("AWS S3 bucket name is required") + } + if _config.BaseConfig.Aws.AccessKeyId != "" && _config.BaseConfig.Aws.SecretAccessKey == "" { + panic("AWS secret access key is required") + } + if _config.BaseConfig.Aws.AccessKeyId == "" && _config.BaseConfig.Aws.SecretAccessKey != "" { + panic("AWS access key ID is required") + } + if _configParseValues.IncludeSchemas != "" { _config.IncludeSchemas = common.NewSet[string]().AddAll(strings.Split(_configParseValues.IncludeSchemas, ",")) } diff --git a/src/syncer-postgres/go.mod b/src/syncer-postgres/go.mod index 4f7cbce..644a10b 100644 --- a/src/syncer-postgres/go.mod +++ b/src/syncer-postgres/go.mod @@ -4,13 +4,47 @@ go 1.24.4 require ( github.com/BemiHQ/BemiDB/src/syncer-common v0.0.1 - github.com/jackc/pgx/v5 v5.7.4 + github.com/jackc/pgx/v5 v5.7.5 + github.com/marcboeker/go-duckdb/v2 v2.3.3 github.com/nats-io/nats.go v1.43.0 ) replace github.com/BemiHQ/BemiDB/src/syncer-common => ../syncer-common require ( + github.com/apache/arrow-go/v18 v18.1.0 // indirect + github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 // indirect + github.com/apache/thrift v0.21.0 // indirect + github.com/aws/aws-sdk-go-v2 v1.36.6 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.11 // indirect + github.com/aws/aws-sdk-go-v2/config v1.29.18 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.17.71 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.33 // indirect + github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.85 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.37 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.37 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.37 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.4 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.5 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.18 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.18 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.84.1 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.25.6 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.4 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.34.1 // indirect + github.com/aws/smithy-go v1.22.4 // indirect + github.com/duckdb/duckdb-go-bindings v0.1.17 // indirect + github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.12 // indirect + github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.12 // indirect + github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.12 // indirect + github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.12 // indirect + github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.12 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect + github.com/goccy/go-json v0.10.5 // indirect + github.com/golang/snappy v0.0.4 // indirect + github.com/google/flatbuffers v25.1.24+incompatible // indirect + github.com/google/uuid v1.6.0 // indirect github.com/hashicorp/go-uuid v1.0.3 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect @@ -21,11 +55,24 @@ require ( github.com/jcmturner/gokrb5/v8 v8.4.4 // indirect github.com/jcmturner/rpc/v2 v2.0.3 // indirect github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.9 // indirect + github.com/linkedin/goavro v2.1.0+incompatible // indirect + github.com/marcboeker/go-duckdb/arrowmapping v0.0.10 // indirect + github.com/marcboeker/go-duckdb/mapping v0.0.11 // indirect github.com/nats-io/nkeys v0.4.11 // indirect github.com/nats-io/nuid v1.0.1 // indirect + github.com/pierrec/lz4/v4 v4.1.22 // indirect github.com/trinodb/trino-go-client v0.323.0 // indirect - golang.org/x/crypto v0.37.0 // indirect - golang.org/x/net v0.24.0 // indirect - golang.org/x/sys v0.32.0 // indirect - golang.org/x/text v0.24.0 // indirect + github.com/xitongsys/parquet-go v1.6.2 // indirect + github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b // indirect + github.com/zeebo/xxh3 v1.0.2 // indirect + golang.org/x/crypto v0.40.0 // indirect + golang.org/x/exp v0.0.0-20250718183923-645b1fa84792 // indirect + golang.org/x/mod v0.26.0 // indirect + golang.org/x/net v0.42.0 // indirect + golang.org/x/sync v0.16.0 // indirect + golang.org/x/sys v0.34.0 // indirect + golang.org/x/text v0.27.0 // indirect + golang.org/x/tools v0.35.0 // indirect + golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect ) diff --git a/src/syncer-postgres/go.sum b/src/syncer-postgres/go.sum index c878f6d..d07b3dc 100644 --- a/src/syncer-postgres/go.sum +++ b/src/syncer-postgres/go.sum @@ -1,20 +1,261 @@ +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.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.66.0/go.mod h1:dgqGAjKCDxyhGTtC9dAREQGUJpkceNm1yt590Qno0Ko= +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.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.82.0/go.mod h1:vlKccHJGuFBFufnAnuB08dfEH9Y3H7dzDzRECFdC2TA= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= +cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +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 v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= +cloud.google.com/go/compute v1.2.0/go.mod h1:xlogom/6gr8RJGBe7nT2eGsQYAFUbbv8dbC29qE3Xmw= +cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= +cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= +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/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= +cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= +cloud.google.com/go/iam v0.1.1/go.mod h1:CKqrcnI/suGpybEHxZ7BMehL0oA4LpdyJdUlTl9jVMw= +cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= +cloud.google.com/go/kms v1.1.0/go.mod h1:WdbppnCDMDpOvoYBMn1+gNmOeEoZYqAv+HeuKARGCXI= +cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= +cloud.google.com/go/monitoring v1.1.0/go.mod h1:L81pzz7HKn14QCMaCs6NTQkdBnE87TElyanS95vIcl4= +cloud.google.com/go/monitoring v1.4.0/go.mod h1:y6xnxfwI3hTFWOdkOaD7nfJVlwuC3/mS/5kvtT131p4= +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/pubsub v1.19.0/go.mod h1:/O9kmSe9bb9KRnIAWkzmqhPjHo6LtzGOBYd/kr06XSs= +cloud.google.com/go/secretmanager v1.3.0/go.mod h1:+oLTkouyiYiabAQNugCeTS3PAArGiMJuBqvJnJsyH+U= +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.12.0/go.mod h1:fFLk2dp2oAhDz8QFKwqrjdJvxSp/W2g7nillojlL5Ho= +cloud.google.com/go/storage v1.21.0/go.mod h1:XmRlxkgPjlBONznT2dDUU/5XlpU2OjMnKuqnZI01LAA= +cloud.google.com/go/trace v1.0.0/go.mod h1:4iErSByzxkyHWzzlAj63/Gmjz0NH1ASqhJguHpGcr6A= +cloud.google.com/go/trace v1.2.0/go.mod h1:Wc8y/uYyOhPy12KEnXG9XGrvfMz5F5SrYecQlbW1rwM= +contrib.go.opencensus.io/exporter/aws v0.0.0-20200617204711-c478e41e60e9/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= +contrib.go.opencensus.io/exporter/stackdriver v0.13.10/go.mod h1:I5htMbyta491eUxufwwZPQdcKvvgzMB4O9ni41YnIM8= +contrib.go.opencensus.io/integrations/ocsql v0.1.7/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= 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= +github.com/Azure/azure-amqp-common-go/v3 v3.2.1/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= +github.com/Azure/azure-amqp-common-go/v3 v3.2.2/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= +github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k= +github.com/Azure/azure-sdk-for-go v51.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v59.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.0.0/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.0.0/go.mod h1:+6sju8gk8FRmSajX3Oz4G5Gm7P+mbqE9FVaXXFYTkCM= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U= +github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.0.0/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.0.0/go.mod h1:ceIuwmxDWptoW3eCqSXlnPsZFKh4X+R38dWPv7GS9Vs= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.0.0/go.mod h1:s1tW/At+xHqjNFvWU4G0c0Qv33KOhvbGNj0RCTQDV8s= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.2.0/go.mod h1:c+Lifp3EDEamAkPVzMooRNOK6CZjNSdEnf1A7jsI9u4= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.1.0/go.mod h1:7QJP7dr2wznCMeqIrhMgWGf7XpAQnVrJqDm9nvV3Cu4= +github.com/Azure/azure-service-bus-go v0.11.5/go.mod h1:MI6ge2CuQWBVq+ly456MY7XqNLJip5LO1iSFodbNLbU= +github.com/Azure/azure-storage-blob-go v0.14.0/go.mod h1:SMqIBi+SuiQH32bvyjngEewEeXoPfKMgWlBDaYf6fck= +github.com/Azure/go-amqp v0.16.0/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= +github.com/Azure/go-amqp v0.16.4/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= 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/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= +github.com/Azure/go-autorest/autorest v0.11.19/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= +github.com/Azure/go-autorest/autorest v0.11.22/go.mod h1:BAWYUWGPEtKPzjVkp0Q6an0MJcJDsoh5Z1BFAEFs4Xs= +github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= +github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/adal v0.9.14/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/adal v0.9.17/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= +github.com/Azure/go-autorest/autorest/azure/auth v0.5.9/go.mod h1:hg3/1yw0Bq87O3KvvnJoAh34/0zbP7SFizX/qN5JvjU= +github.com/Azure/go-autorest/autorest/azure/cli v0.4.2/go.mod h1:7qkJkT+j6b+hIpzMOwPChJhTqS8VbsqqgULzMNRugoM= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= +github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= +github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= +github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= +github.com/AzureAD/microsoft-authentication-library-for-go v0.4.0/go.mod h1:Vt9sXTKwMyGcOxSmLDMnGPgqsUg7m8pe215qMLrDXw4= +github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/GoogleCloudPlatform/cloudsql-proxy v1.29.0/go.mod h1:spvB9eLJH9dutlbPSRmHvSXXHOwGRyeXh1jVdquA2G8= +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/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/ahmetb/dlog v0.0.0-20170105205344-4fb5f8204f26 h1:3YVZUqkoev4mL+aCwVOSWV4M7pN+NURHL38Z2zq5JKA= github.com/ahmetb/dlog v0.0.0-20170105205344-4fb5f8204f26/go.mod h1:ymXt5bw5uSNu4jveerFxE0vNYxF8ncqbptntMaFMg3k= +github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA= +github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apache/arrow-go/v18 v18.1.0 h1:agLwJUiVuwXZdwPYVrlITfx7bndULJ/dggbnLFgDp/Y= +github.com/apache/arrow-go/v18 v18.1.0/go.mod h1:tigU/sIgKNXaesf5d7Y95jBBKS5KsxTqYBKXFsvKzo0= +github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 h1:byKBBF2CKWBjjA4J1ZL2JXttJULvWSl50LegTyRZ728= +github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516/go.mod h1:QNYViu/X0HXDHw7m3KXzWSVXIbfUvJqBFe6Gj8/pYA0= +github.com/apache/thrift v0.0.0-20181112125854-24918abba929/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.14.2/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.21.0 h1:tdPmh/ptjE1IJnhbhrcl2++TauVjy242rkV/UzJChnE= +github.com/apache/thrift v0.21.0/go.mod h1:W1H8aR/QRtYNvrPeFXBtobyRkd0/YVhTc6i07XIAgDw= +github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= +github.com/aws/aws-sdk-go v1.30.19/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= +github.com/aws/aws-sdk-go v1.37.0/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= +github.com/aws/aws-sdk-go v1.43.31 h1:yJZIr8nMV1hXjAvvOLUFqZRJcHV7udPQBfhJqawDzI0= +github.com/aws/aws-sdk-go v1.43.31/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= +github.com/aws/aws-sdk-go-v2 v1.16.2/go.mod h1:ytwTPBG6fXTZLxxeeCCWj2/EMYp/xDUgX+OET6TLNNU= +github.com/aws/aws-sdk-go-v2 v1.23.0/go.mod h1:i1XDttT4rnf6vxc9AuskLc6s7XBee8rlLilKlc03uAA= +github.com/aws/aws-sdk-go-v2 v1.36.6 h1:zJqGjVbRdTPojeCGWn5IR5pbJwSQSBh5RWFTQcEQGdU= +github.com/aws/aws-sdk-go-v2 v1.36.6/go.mod h1:EYrzvCCN9CMUTa5+6lf6MM4tq3Zjp8UhSGR/cBsjai0= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.1/go.mod h1:n8Bs1ElDD2wJ9kCRTczA83gYbBmjSwZp3umc6zF4EeM= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.1/go.mod h1:t8PYl/6LzdAqsU4/9tz28V/kU+asFePvpOMkdul0gEQ= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.11 h1:12SpdwU8Djs+YGklkinSSlcrPyj3H4VifVsKf78KbwA= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.11/go.mod h1:dd+Lkp6YmMryke+qxW/VnKyhMBDTYP41Q2Bb+6gNZgY= +github.com/aws/aws-sdk-go-v2/config v1.15.3/go.mod h1:9YL3v07Xc/ohTsxFXzan9ZpFpdTOFl4X65BAKYaz8jg= +github.com/aws/aws-sdk-go-v2/config v1.25.3/go.mod h1:tAByZy03nH5jcq0vZmkcVoo6tRzRHEwSFx3QW4NmDw8= +github.com/aws/aws-sdk-go-v2/config v1.29.18 h1:x4T1GRPnqKV8HMJOMtNktbpQMl3bIsfx8KbqmveUO2I= +github.com/aws/aws-sdk-go-v2/config v1.29.18/go.mod h1:bvz8oXugIsH8K7HLhBv06vDqnFv3NsGDt2Znpk7zmOU= +github.com/aws/aws-sdk-go-v2/credentials v1.11.2/go.mod h1:j8YsY9TXTm31k4eFhspiQicfXPLZ0gYXA50i4gxPE8g= +github.com/aws/aws-sdk-go-v2/credentials v1.16.2/go.mod h1:sDdvGhXrSVT5yzBDR7qXz+rhbpiMpUYfF3vJ01QSdrc= +github.com/aws/aws-sdk-go-v2/credentials v1.17.71 h1:r2w4mQWnrTMJjOyIsZtGp3R3XGY3nqHn8C26C2lQWgA= +github.com/aws/aws-sdk-go-v2/credentials v1.17.71/go.mod h1:E7VF3acIup4GB5ckzbKFrCK0vTvEQxOxgdq4U3vcMCY= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.3/go.mod h1:uk1vhHHERfSVCUnqSqz8O48LBYDSC+k6brng09jcMOk= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.4/go.mod h1:t4i+yGHMCcUNIX1x7YVYa6bH/Do7civ5I6cG/6PMfyA= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.33 h1:D9ixiWSG4lyUBL2DDNK924Px9V/NBVpML90MHqyTADY= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.33/go.mod h1:caS/m4DI+cij2paz3rtProRBI4s/+TCiWoaWZuQ9010= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.3/go.mod h1:0dHuD2HZZSiwfJSy1FO5bX1hQ1TxVV1QXXjpn3XUE44= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.14.0/go.mod h1:UcgIwJ9KHquYxs6Q5skC9qXjhYMK+JASDYcXQ4X7JZE= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.85 h1:AfpstoiaenxGSCUheWiicgZE5XXS5Fi4CcQ4PA/x+Qw= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.85/go.mod h1:HxiF0Fd6WHWjdjOffLkCauq7JqzWqMMq0iUVLS7cPQc= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.9/go.mod h1:AnVH5pvai0pAF4lXRq0bmhbes1u9R8wTE+g+183bZNM= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.3/go.mod h1:7sGSz1JCKHWWBHq98m6sMtWQikmYPpxjqOydDemiVoM= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.37 h1:osMWfm/sC/L4tvEdQ65Gri5ZZDCUpuYJZbTTDrsn4I0= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.37/go.mod h1:ZV2/1fbjOPr4G4v38G3Ww5TBT4+hmsK45s/rxu1fGy0= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.3/go.mod h1:ssOhaLpRlh88H3UmEcsBoVKq309quMvm3Ds8e9d4eJM= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.3/go.mod h1:ify42Rb7nKeDDPkFjKn7q1bPscVPu/+gmHH8d2c+anU= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.37 h1:v+X21AvTb2wZ+ycg1gx+orkB/9U6L7AOp93R7qYxsxM= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.37/go.mod h1:G0uM1kyssELxmJ2VZEfG0q2npObR3BAkF3c1VsfVnfs= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.10/go.mod h1:8DcYQcz0+ZJaSxANlHIsbbi6S+zMwjwdDqwW3r9AzaE= +github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.3/go.mod h1:5yzAuE9i2RkVAttBl8yxZgQr5OCq4D5yDnG7j9x2L0U= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.37 h1:XTZZ0I3SZUHAtBLBU6395ad+VOblE0DwQP6MuaNeics= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.37/go.mod h1:Pi6ksbniAWVwu2S8pEzcYPyhUkAcLaufxN7PfAUQjBk= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.1/go.mod h1:GeUru+8VzrTXV/83XyMJ80KpH8xO89VPoUileyNQ+tc= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1/go.mod h1:l9ymW25HOqymeU2m1gbUQ3rUIsTwKs8gYHXkqDQUhiI= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.4 h1:CXV68E2dNqhuynZJPB80bhPQwAKqBWVer887figW6Jc= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.4/go.mod h1:/xFi9KtvBXP97ppCz1TAEvU1Uf66qvid89rbem3wCzQ= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.3/go.mod h1:Seb8KNmD6kVTjwRjVEgOT5hPin6sq+v4C2ycJQDwuH8= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.3/go.mod h1:R+/S1O4TYpcktbVwddeOYg+uwUfLhADP2S/x4QwsCTM= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.5 h1:M5/B8JUaCI8+9QD+u3S/f4YHpvqE9RpSkV3rf0Iks2w= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.5/go.mod h1:Bktzci1bwdbpuLiu3AOksiNPMl/LLKmX1TWmqp2xbvs= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.3/go.mod h1:wlY6SVjuwvh3TVRpTqdy4I1JpBFLX4UGeKZdWntaocw= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.3/go.mod h1:Owv1I59vaghv1Ax8zz8ELY8DN7/Y0rGS+WWAmjgi950= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.18 h1:vvbXsA2TVO80/KT7ZqCbx934dt6PY+vQ8hZpUZ/cpYg= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.18/go.mod h1:m2JJHledjBGNMsLOF1g9gbAxprzq3KjC8e4lxtn+eWg= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.3/go.mod h1:Bm/v2IaN6rZ+Op7zX+bOUMdL4fsrYZiD0dsjLhNKwZc= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.3/go.mod h1:KZgs2ny8HsxRIRbDwgvJcHHBZPOzQr/+NtGwnP+w2ec= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.18 h1:OS2e0SKqsU2LiJPqL8u9x41tKc6MMEHrWjLVLn3oysg= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.18/go.mod h1:+Yrk+MDGzlNGxCXieljNeWpoZTCQUQVL+Jk9hGGJ8qM= +github.com/aws/aws-sdk-go-v2/service/kms v1.16.3/go.mod h1:QuiHPBqlOFCi4LqdSskYYAWpQlx3PKmohy+rE2F+o5g= +github.com/aws/aws-sdk-go-v2/service/s3 v1.26.3/go.mod h1:g1qvDuRsJY+XghsV6zg00Z4KJ7DtFFCx8fJD2a491Ak= +github.com/aws/aws-sdk-go-v2/service/s3 v1.43.0/go.mod h1:NXRKkiRF+erX2hnybnVU660cYT5/KChRD4iUgJ97cI8= +github.com/aws/aws-sdk-go-v2/service/s3 v1.84.1 h1:RkHXU9jP0DptGy7qKI8CBGsUJruWz0v5IgwBa2DwWcU= +github.com/aws/aws-sdk-go-v2/service/s3 v1.84.1/go.mod h1:3xAOf7tdKF+qbb+XpU+EPhNXAdun3Lu1RcDrj8KC24I= +github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.15.4/go.mod h1:PJc8s+lxyU8rrre0/4a0pn2wgwiDvOEzoOjcJUBr67o= +github.com/aws/aws-sdk-go-v2/service/sns v1.17.4/go.mod h1:kElt+uCcXxcqFyc+bQqZPFD9DME/eC6oHBXvFzQ9Bcw= +github.com/aws/aws-sdk-go-v2/service/sqs v1.18.3/go.mod h1:skmQo0UPvsjsuYYSYMVmrPc1HWCbHUJyrCEp+ZaLzqM= +github.com/aws/aws-sdk-go-v2/service/ssm v1.24.1/go.mod h1:NR/xoKjdbRJ+qx0pMR4mI+N/H1I1ynHwXnO6FowXJc0= +github.com/aws/aws-sdk-go-v2/service/sso v1.11.3/go.mod h1:7UQ/e69kU7LDPtY40OyoHYgRmgfGM4mgsLYtcObdveU= +github.com/aws/aws-sdk-go-v2/service/sso v1.17.2/go.mod h1:/pE21vno3q1h4bbhUOEi+6Zu/aT26UK2WKkDXd+TssQ= +github.com/aws/aws-sdk-go-v2/service/sso v1.25.6 h1:rGtWqkQbPk7Bkwuv3NzpE/scwwL9sC1Ul3tn9x83DUI= +github.com/aws/aws-sdk-go-v2/service/sso v1.25.6/go.mod h1:u4ku9OLv4TO4bCPdxf4fA1upaMaJmP9ZijGk3AAOC6Q= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.20.0/go.mod h1:dWqm5G767qwKPuayKfzm4rjzFmVjiBFbOJrpSPnAMDs= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.4 h1:OV/pxyXh+eMA0TExHEC4jyWdumLxNbzz1P0zJoezkJc= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.4/go.mod h1:8Mm5VGYwtm+r305FfPSuc+aFkrypeylGYhFim6XEPoc= +github.com/aws/aws-sdk-go-v2/service/sts v1.16.3/go.mod h1:bfBj0iVmsUyUg4weDB4NxktD9rDGeKSVWnjTnwbx9b8= +github.com/aws/aws-sdk-go-v2/service/sts v1.25.3/go.mod h1:4EqRHDCKP78hq3zOnmFXu5k0j4bXbRFfCh/zQ6KnEfQ= +github.com/aws/aws-sdk-go-v2/service/sts v1.34.1 h1:aUrLQwJfZtwv3/ZNG2xRtEen+NqI3iesuacjP51Mv1s= +github.com/aws/aws-sdk-go-v2/service/sts v1.34.1/go.mod h1:3wFBZKoWnX3r+Sm7in79i54fBmNfwhdNdQuscCw7QIk= +github.com/aws/smithy-go v1.11.2/go.mod h1:3xHYmszWVx2c0kIwQeEVf9uSm4fYZt67FBJnwub1bgM= +github.com/aws/smithy-go v1.17.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= +github.com/aws/smithy-go v1.22.4 h1:uqXzVZNuNexwc/xrh6Tb56u89WDlJY6HS+KC0S4QSjw= +github.com/aws/smithy-go v1.22.4/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/bobg/gcsobj v0.1.2/go.mod h1:vS49EQ1A1Ib8FgrL58C8xXYZyOCR2TgzAdopy6/ipa8= 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/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +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/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/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= +github.com/colinmarc/hdfs/v2 v2.1.1/go.mod h1:M3x+k8UKKmxtFu++uAZ0OtDU8jR3jnaZIAc6yK4Ue0c= 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/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= 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/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU= +github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= +github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= +github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= +github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= +github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= 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= @@ -23,31 +264,237 @@ github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj 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/duckdb/duckdb-go-bindings v0.1.17 h1:SjpRwrJ7v0vqnIvLeVFHlhuS72+Lp8xxQ5jIER2LZP4= +github.com/duckdb/duckdb-go-bindings v0.1.17/go.mod h1:pBnfviMzANT/9hi4bg+zW4ykRZZPCXlVuvBWEcZofkc= +github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.12 h1:8CLBnsq9YDhi2Gmt3sjSUeXxMzyMQAKefjqUy9zVPFk= +github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.12/go.mod h1:Ezo7IbAfB8NP7CqPIN8XEHKUg5xdRRQhcPPlCXImXYA= +github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.12 h1:wjO4I0GhMh2xIpiUgRpzuyOT4KxXLoUS/rjU7UUVvCE= +github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.12/go.mod h1:eS7m/mLnPQgVF4za1+xTyorKRBuK0/BA44Oy6DgrGXI= +github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.12 h1:HzKQi2C+1jzmwANsPuYH6x9Sfw62SQTjNAEq3OySKFI= +github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.12/go.mod h1:1GOuk1PixiESxLaCGFhag+oFi7aP+9W8byymRAvunBk= +github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.12 h1:YGSR7AFLw2gJ7IbgLE6DkKYmgKv1LaRSd/ZKF1yh2oE= +github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.12/go.mod h1:o7crKMpT2eOIi5/FY6HPqaXcvieeLSqdXXaXbruGX7w= +github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.12 h1:2aduW6fnFnT2Q45PlIgHbatsPOxV9WSZ5B2HzFfxaxA= +github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.12/go.mod h1:IlOhJdVKUJCAPj3QsDszUo8DVdvp1nBFp4TUJVdw99s= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +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/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= +github.com/gin-gonic/gin v1.7.3/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= +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-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +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-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= +github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= +github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= +github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +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/golang-jwt/jwt v3.2.1+incompatible h1:73Z+4BJcrTC+KczS6WvTPvRGOp1WmfEP4Q1lOd9Z/+c= +github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-jwt/jwt/v4 v4.4.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188/go.mod h1:vXjM/+wXQnTPR4KqTKDgJukSZ6amVRtWMPEjE6sQoK8= +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/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/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +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.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +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/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/flatbuffers v25.1.24+incompatible h1:4wPqL3K7GzBd1CwyhSd3usxLKOaJN/AC6puCca6Jm7o= +github.com/google/flatbuffers v25.1.24+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +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.6/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.8/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/go-replayers/grpcreplay v1.1.0/go.mod h1:qzAvJ8/wi57zq7gWqaE6AwLM6miiXUQwP1S+I9icmhk= +github.com/google/go-replayers/httpreplay v1.1.1/go.mod h1:gN9GeLIs7l6NUoVaSSnv2RiqK1NiwAmD0MrKeC9IIks= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+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/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +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-20200905233945-acf8798be1f7/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-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210506205249-923b5ab0fc1a/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= 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/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.2.0/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.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/wire v0.5.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU= +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.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ= github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/gorilla/sessions v1.2.1 h1:DHd3rPN5lE3Ts3D8rKkQ8x/0kqfeNmBAaiSi+o7FsgI= github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/hanwen/go-fuse v1.0.0/go.mod h1:unqXarDXqzAk0rt98O2tVndEPIpUgLD9+rwFisZH3Ok= +github.com/hanwen/go-fuse/v2 v2.1.0/go.mod h1:oRyA5eK+pvJyv5otpO/DgccS8y/RvYMaO00GgRLGryc= +github.com/hashicorp/go-uuid v0.0.0-20180228145832-27454136f036/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +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/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/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.11.0/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= +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/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.2.0/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-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= -github.com/jackc/pgx/v5 v5.7.4 h1:9wKznZrhWa2QiHL+NjTSPP6yjl3451BX3imWDnokYlg= -github.com/jackc/pgx/v5 v5.7.4/go.mod h1:ncY89UGWxg82EykZUwSpUKEfccBGGYq1xjrOpsbsfGQ= +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.10.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.15.0/go.mod h1:D/zyOyXiaM1TmVWnOM18p0xdDtdakRBa0RsVGI3U3bw= +github.com/jackc/pgx/v5 v5.7.5 h1:JHGfMnQY+IEtGM63d+NGMjoRpysB2JBwDr5fsngwmJs= +github.com/jackc/pgx/v5 v5.7.5/go.mod h1:aruU7o91Tc2q2cFp5h4uP3f6ztExVpyVv88Xl/8Vl8M= +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.2.1 h1:gI8os0wpRXFd4FiAY2dWiqRK037tjj3t7rKFeO4X5iw= +github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo= github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= +github.com/jcmturner/gofork v0.0.0-20180107083740-2aebee971930/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= github.com/jcmturner/gofork v1.7.6 h1:QH0l3hzAU1tfT3rZCnW5zXl+orbkNMMRGJfdJjHVETg= github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo= github.com/jcmturner/goidentity/v6 v6.0.1 h1:VKnZd2oEIMorCTsFBnJWbExfNN7yZr3EhJAxwOkZg6o= @@ -56,20 +503,90 @@ github.com/jcmturner/gokrb5/v8 v8.4.4 h1:x1Sv4HaTpepFkXbt2IkL29DXRf8sOfZXo8eRKh6 github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs= github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY= github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= +github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +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/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= +github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= +github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.13.1/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY= +github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8= +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/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +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/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +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.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/linkedin/goavro v2.1.0+incompatible h1:DV2aUlj2xZiuxQyvag8Dy7zjY69ENjS66bWkSfdpddY= +github.com/linkedin/goavro v2.1.0+incompatible/go.mod h1:bBCwI2eGYpUI/4820s67MElg9tdeLbINjLjiM2xZFYM= +github.com/marcboeker/go-duckdb/arrowmapping v0.0.10 h1:G1W+GVnUefR8uy7jHdNO+CRMsmFG5mFPIHVAespfFCA= +github.com/marcboeker/go-duckdb/arrowmapping v0.0.10/go.mod h1:jccUb8TYD0p5TsEEeN4SXuslNJHo23QaKOqKD+U6uFU= +github.com/marcboeker/go-duckdb/mapping v0.0.11 h1:fusN1b1l7Myxafifp596I6dNLNhN5Uv/rw31qAqBwqw= +github.com/marcboeker/go-duckdb/mapping v0.0.11/go.mod h1:aYBjFLgfKO0aJIbDtXPiaL5/avRQISveX/j9tMf9JhU= +github.com/marcboeker/go-duckdb/v2 v2.3.3 h1:PQhWS1vLtotByrXmUg6YqmTS59WPJEqlCPhp464ZGUU= +github.com/marcboeker/go-duckdb/v2 v2.3.3/go.mod h1:RZgwGE22rly6aWbqO8lsfYjMvNuMd3YoTroWxL37H9E= +github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= +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.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= +github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= +github.com/minio/minio-go/v7 v7.0.34/go.mod h1:nCrRzjoSUQh8hgKKtu3Y708OLvRLtuASMg2/nvmbarw= +github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= 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/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= +github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/nats-io/nats.go v1.43.0 h1:uRFZ2FEoRvP64+UUhaTokyS18XBCR/xM2vQZKO4i8ug= github.com/nats-io/nats.go v1.43.0/go.mod h1:iRWIPokVIFbVijxuMQq4y9ttaBTMe0SFdlZfMDd+33g= github.com/nats-io/nkeys v0.4.11 h1:q44qGV008kYd9W1b1nEBkNzvnWxtRSQ7A8BoqRrcfa0= github.com/nats-io/nkeys v0.4.11/go.mod h1:szDimtgmfOi9n25JpfIdGw12tZFYXqhGxjhVxsatHVE= github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/ncw/swift v1.0.52/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= 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= @@ -78,75 +595,651 @@ github.com/opencontainers/runc v1.1.13 h1:98S2srgG9vw0zWcDpFMn5TRrh8kLxa/5OFUstu 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/pborman/getopt v0.0.0-20180729010549-6fdd0a2c7117/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= +github.com/pierrec/lz4/v4 v4.1.8/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= +github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= +github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= +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/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/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +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/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +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/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.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= 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.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +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.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 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.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/trinodb/trino-go-client v0.323.0 h1:I7Y67um1NnrwKCThzGr8o0xYUldb+n4vPn5R/qUxW2E= github.com/trinodb/trino-go-client v0.323.0/go.mod h1:F+7TZRD0+0M8XqYsgXT8+EJT1pSlbxTECVD1BDzCc70= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= 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/xitongsys/parquet-go v1.5.1/go.mod h1:xUxwM8ELydxh4edHGegYq1pA8NnMKDx0K/GyB0o2bww= +github.com/xitongsys/parquet-go v1.6.2 h1:MhCaXii4eqceKPu9BwrjLqyK10oX9WF+xGhwvwbw7xM= +github.com/xitongsys/parquet-go v1.6.2/go.mod h1:IulAQyalCm0rPiZVNnCgm/PCL64X2tdSVGMQ/UeKqWA= +github.com/xitongsys/parquet-go-source v0.0.0-20190524061010-2b72cbee77d5/go.mod h1:xxCx7Wpym/3QCo6JhujJX51dzSXrwmb0oH6FQb39SEA= +github.com/xitongsys/parquet-go-source v0.0.0-20200817004010-026bad9b25d0/go.mod h1:HYhIKsdns7xz80OgkbgJYrtQY7FjHWHKH6cvN7+czGE= +github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b h1:zbb5qM/t3N+O33Vp5sFyG6yIcWZV1q7rfEjJM8UsRBQ= +github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b/go.mod h1:2ActxmJ4q17Cdruar9nKEkzKSOL1Ol03737Bkz10rTY= +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.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= +github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= +github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= +github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= +go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0= +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.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +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/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +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.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= +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.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= +gocloud.dev v0.26.0/go.mod h1:mkUgejbnbLotorqDyvedJO20XcZNTynmSeVSQS9btVg= +golang.org/x/crypto v0.0.0-20180723164146-c126467f60eb/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= 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-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/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-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-20211115234514-b4de73f9ece8/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220511200225-c6db032c6c88/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= -golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= -golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= +golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM= +golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY= +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-20250718183923-645b1fa84792 h1:R9PFI6EUdfVKgwKjZef7QIwGcBKu86OEFpJ9nUEP2l4= +golang.org/x/exp v0.0.0-20250718183923-645b1fa84792/go.mod h1:A+z0yzpGtvnG90cToK5n2tu8UJVP2XUATh+r+sfOOOc= +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/lint v0.0.0-20210508222113-6edffad5e616/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.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg= +golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ= +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-20191112182307-2180aed22343/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-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +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-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211020060615-d418f374d309/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220401154927-543a649e0bdd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= 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.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= -golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs= +golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8= +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.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +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-20210220032951-036812b2e83c/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.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610= -golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= +golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +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-20191112214154-59a1497f0cea/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-20200828194041-157a740278f4/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-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/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-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/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-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220204135822-1c1b9b1eba6a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220330033206-e17cdc41300f/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-20220704084225-05e143d24a9e/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.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= -golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA= +golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +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/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +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.5/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.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0= -golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4= +golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU= +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/time v0.0.0-20211116232009-f0f3c7e86c11/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220224211638-0e9765cccd65/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-20190422233926-fe54fb35175b/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-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-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-20200828161849-5deb26317202/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20200915173823-2db8f0ff891c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20200918232735-d647fc253266/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +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.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0= +golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw= +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= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.15.1 h1:FNy7N6OUZVUaWG9pTiD+jlhdQ3lMP+/LcTpJ6+a8sQ0= +gonum.org/v1/gonum v0.15.1/go.mod h1:eZTZuRFrzu5pcyjN5wJhcIhnUdNijYxX1T2IcrOGY0o= +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.31.0/go.mod h1:CL+9IBCa2WWU6gRuBWaKqGWLFFwbEUXkfeMkHLQWYWo= +google.golang.org/api v0.32.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +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.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.46.0/go.mod h1:ceL4oozhkAiTID8XMmJBsIxID/9wMXJVVFXPg4ylg3I= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.58.0/go.mod h1:cAbP2FsxoGVNwtgNAmmn3y5G1TWAiVYRmg4yku3lv+E= +google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.64.0/go.mod h1:931CdxA8Rm4t6zqTFGSsgwbAEZ2+GMYurbndwSimebM= +google.golang.org/api v0.66.0/go.mod h1:I1dmXYpX7HGwz/ejRxwQp2qj5bFAz93HiCU1C1oYd9M= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.68.0/go.mod h1:sOM8pTpwgflXRhz+oC8H2Dr+UcbMqkPPWNJo88Q7TH8= +google.golang.org/api v0.69.0/go.mod h1:boanBiw+h5c3s+tBPgEzLDRHfFLWV0qXxRHz3ws7C80= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= +google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +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/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-20200513103714-09dca8ec2884/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-20200831141814-d751682dd103/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-20200914193844-75d14daec038/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200921151605-7abf4a1a14d5/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-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210429181445-86c259c2b4ab/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210517163617-5e0236093d7a/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210921142501-181ce0d877f6/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211018162055-cf77aa76bad2/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211223182754-3ac035c7e7cb/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220111164026-67b88f271998/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220114231437-d2e6a121cae0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220201184016-50beb8ab5c44/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220204002441-d6cc3cc0770e/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220211171837-173942840c17/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220216160803-4663080d8bc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220401170504-314d38edb7de/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +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.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +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.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +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.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= 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-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= +gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= +gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q= +gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mNfM5bm88whjWx4= +gopkg.in/jcmturner/gokrb5.v7 v7.3.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= +gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8= +gopkg.in/linkedin/goavro.v1 v1.0.5 h1:BJa69CDh0awSsLUmZ9+BowBdokpduDZSM9Zk8oKHfN4= +gopkg.in/linkedin/goavro.v1 v1.0.5/go.mod h1:Aw5GdAbizjOEl0kAMHV9iHmA8reZzW/OKuJAl4Hb9F0= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/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= +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= +nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= +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/src/syncer-postgres/init_test.go b/src/syncer-postgres/init_test.go index 31df8e8..9d1e8a5 100644 --- a/src/syncer-postgres/init_test.go +++ b/src/syncer-postgres/init_test.go @@ -18,11 +18,10 @@ var PG_SCHEMA_COLUMNS_TEST_TABLE = []PgSchemaColumn{ Namespace: "pg_catalog", }, { - ColumnName: "bit_column", - DataType: "bit", - UdtName: "bit", - CharacterMaximumLength: "1", - Namespace: "pg_catalog", + ColumnName: "bit_column", + DataType: "bit", + UdtName: "bit", + Namespace: "pg_catalog", }, { ColumnName: "bool_column", @@ -31,18 +30,16 @@ var PG_SCHEMA_COLUMNS_TEST_TABLE = []PgSchemaColumn{ Namespace: "pg_catalog", }, { - ColumnName: "bpchar_column", - DataType: "character", - UdtName: "bpchar", - CharacterMaximumLength: "10", - Namespace: "pg_catalog", + ColumnName: "bpchar_column", + DataType: "character", + UdtName: "bpchar", + Namespace: "pg_catalog", }, { - ColumnName: "varchar_column", - DataType: "character varying", - UdtName: "varchar", - CharacterMaximumLength: "255", - Namespace: "pg_catalog", + ColumnName: "varchar_column", + DataType: "character varying", + UdtName: "varchar", + Namespace: "pg_catalog", }, { ColumnName: "text_column", @@ -55,7 +52,6 @@ var PG_SCHEMA_COLUMNS_TEST_TABLE = []PgSchemaColumn{ DataType: "smallint", UdtName: "int2", NumericPrecision: "16", - NumericScale: "0", Namespace: "pg_catalog", }, { @@ -63,7 +59,6 @@ var PG_SCHEMA_COLUMNS_TEST_TABLE = []PgSchemaColumn{ DataType: "integer", UdtName: "int4", NumericPrecision: "32", - NumericScale: "0", Namespace: "pg_catalog", }, { @@ -71,7 +66,6 @@ var PG_SCHEMA_COLUMNS_TEST_TABLE = []PgSchemaColumn{ DataType: "bigint", UdtName: "int8", NumericPrecision: "64", - NumericScale: "0", Namespace: "pg_catalog", }, { @@ -79,7 +73,6 @@ var PG_SCHEMA_COLUMNS_TEST_TABLE = []PgSchemaColumn{ DataType: "numeric", UdtName: "numeric", NumericPrecision: "20", // Will be capped to 38 - NumericScale: "0", Namespace: "pg_catalog", }, { @@ -281,30 +274,28 @@ var PG_SCHEMA_COLUMNS_TEST_TABLE = []PgSchemaColumn{ } var PG_SCHEMA_COLUMNS_PARTITIONED_TABLE = []PgSchemaColumn{ { - ColumnName: "timestamp_column", - DataType: "timestamp without time zone", - UdtName: "timestamp", - IsNullable: "NO", - OrdinalPosition: "1", - CharacterMaximumLength: "0", - NumericPrecision: "0", - NumericScale: "0", - DatetimePrecision: "6", - Namespace: "pg_catalog", + ColumnName: "timestamp_column", + DataType: "timestamp without time zone", + UdtName: "timestamp", + IsNullable: "NO", + OrdinalPosition: "1", + NumericPrecision: "0", + NumericScale: "0", + DatetimePrecision: "6", + Namespace: "pg_catalog", }, } var PG_SCHEMA_COLUMNS_EMPTY_TABLE = []PgSchemaColumn{ { - ColumnName: "id", - DataType: "integer", - UdtName: "int4", - IsNullable: "NO", - OrdinalPosition: "1", - CharacterMaximumLength: "0", - NumericPrecision: "32", - NumericScale: "0", - DatetimePrecision: "0", - Namespace: "pg_catalog", + ColumnName: "id", + DataType: "integer", + UdtName: "int4", + IsNullable: "NO", + OrdinalPosition: "1", + NumericPrecision: "32", + NumericScale: "0", + DatetimePrecision: "0", + Namespace: "pg_catalog", }, } @@ -353,45 +344,45 @@ var CSV_ROWS_TEST_TABLE = [][]string{ }, { "2", // id - PG_NULL_STRING, // bit_column + common.BEMIDB_NULL_STRING, // bit_column "f", // bool_column "", // bpchar_column - PG_NULL_STRING, // varchar_column + common.BEMIDB_NULL_STRING, // varchar_column "", // text_column "-32767", // int2_column - PG_NULL_STRING, // int4_column + common.BEMIDB_NULL_STRING, // int4_column "-9223372036854775807", // int8_column - PG_NULL_STRING, // hugeint_column - PG_NULL_STRING, // xid_column - PG_NULL_STRING, // xid8_column + common.BEMIDB_NULL_STRING, // hugeint_column + common.BEMIDB_NULL_STRING, // xid_column + common.BEMIDB_NULL_STRING, // xid8_column "NaN", // float4_column "-3.141592653589793", // float8_column "-12345.00", // numeric_column - PG_NULL_STRING, // numeric_column_without_precision + common.BEMIDB_NULL_STRING, // numeric_column_without_precision "20025-11-12", // date_column "12:00:00.123", // time_column - PG_NULL_STRING, // timeMsColumn + common.BEMIDB_NULL_STRING, // timeMsColumn "12:00:00.12300+05", // timetz_column "12:00:00.1+05", // timetz_ms_column "2024-01-01 12:00:00", // timestamp_column - PG_NULL_STRING, // timestamp_ms_column + common.BEMIDB_NULL_STRING, // timestamp_ms_column "2024-01-01 12:00:00.000123+05:30", // timestamptz_column "2024-01-01 12:00:00.12+05", // timestamptz_ms_column - PG_NULL_STRING, // uuid_column - PG_NULL_STRING, // bytea_column - PG_NULL_STRING, // interval_column - PG_NULL_STRING, // tsvector_column - PG_NULL_STRING, // xml_column - PG_NULL_STRING, // pg_snapshot_column - PG_NULL_STRING, // point_column - PG_NULL_STRING, // inet_column - PG_NULL_STRING, // json_column + common.BEMIDB_NULL_STRING, // uuid_column + common.BEMIDB_NULL_STRING, // bytea_column + common.BEMIDB_NULL_STRING, // interval_column + common.BEMIDB_NULL_STRING, // tsvector_column + common.BEMIDB_NULL_STRING, // xml_column + common.BEMIDB_NULL_STRING, // pg_snapshot_column + common.BEMIDB_NULL_STRING, // point_column + common.BEMIDB_NULL_STRING, // inet_column + common.BEMIDB_NULL_STRING, // json_column "{}", // jsonb_column - PG_NULL_STRING, // array_text_column + common.BEMIDB_NULL_STRING, // array_text_column "{}", // array_int_column - PG_NULL_STRING, // array_jsonb_column - PG_NULL_STRING, // array_ltree_column - PG_NULL_STRING, // user_defined_column + common.BEMIDB_NULL_STRING, // array_jsonb_column + common.BEMIDB_NULL_STRING, // array_ltree_column + common.BEMIDB_NULL_STRING, // user_defined_column }, } var CSV_ROWS_PARTITIONED_TABLE1 = [][]string{{"2024-01-01 01:02:03.123456"}} @@ -648,7 +639,6 @@ func init() { utils := NewSyncerUtils(config) trino.CreateSchemaIfNotExists() - utils.DropOldTables(trino, common.NewSet[string]()) // Prepare PgSchemaColumns for i := range PG_SCHEMA_COLUMNS_TEST_TABLE { @@ -656,6 +646,12 @@ func init() { if PG_SCHEMA_COLUMNS_TEST_TABLE[i].IsNullable == "" { PG_SCHEMA_COLUMNS_TEST_TABLE[i].IsNullable = "YES" } + if PG_SCHEMA_COLUMNS_TEST_TABLE[i].NumericPrecision == "" { + PG_SCHEMA_COLUMNS_TEST_TABLE[i].NumericPrecision = "0" + } + if PG_SCHEMA_COLUMNS_TEST_TABLE[i].NumericScale == "" { + PG_SCHEMA_COLUMNS_TEST_TABLE[i].NumericScale = "0" + } PG_SCHEMA_COLUMNS_TEST_TABLE[i].Config = config } for i := range PG_SCHEMA_COLUMNS_PARTITIONED_TABLE { @@ -667,12 +663,15 @@ func init() { switch config.SyncMode { case SyncModeFullRefresh: - createTestTableViaFullRefresh(config, trino, PgSchemaTable{Schema: "public", Table: "test_table"}, PG_SCHEMA_COLUMNS_TEST_TABLE, CSV_ROWS_TEST_TABLE) - createTestTableViaFullRefresh(config, trino, PgSchemaTable{Schema: "public", Table: "partitioned_table1"}, PG_SCHEMA_COLUMNS_PARTITIONED_TABLE, CSV_ROWS_PARTITIONED_TABLE1) - createTestTableViaFullRefresh(config, trino, PgSchemaTable{Schema: "public", Table: "partitioned_table2"}, PG_SCHEMA_COLUMNS_PARTITIONED_TABLE, CSV_ROWS_PARTITIONED_TABLE2) - createTestTableViaFullRefresh(config, trino, PgSchemaTable{Schema: "public", Table: "partitioned_table3"}, PG_SCHEMA_COLUMNS_PARTITIONED_TABLE, CSV_ROWS_PARTITIONED_TABLE3) - createTestTableViaFullRefresh(config, trino, PgSchemaTable{Schema: "test", Table: "empty_table"}, PG_SCHEMA_COLUMNS_EMPTY_TABLE, [][]string{}) + storageS3 := common.NewStorageS3(config.BaseConfig) + utils.DeleteOldTables(storageS3, common.NewSet[string]()) + createTestTableViaFullRefresh(config, PgSchemaTable{Schema: "public", Table: "test_table"}, PG_SCHEMA_COLUMNS_TEST_TABLE, CSV_ROWS_TEST_TABLE) + createTestTableViaFullRefresh(config, PgSchemaTable{Schema: "public", Table: "partitioned_table1"}, PG_SCHEMA_COLUMNS_PARTITIONED_TABLE, CSV_ROWS_PARTITIONED_TABLE1) + createTestTableViaFullRefresh(config, PgSchemaTable{Schema: "public", Table: "partitioned_table2"}, PG_SCHEMA_COLUMNS_PARTITIONED_TABLE, CSV_ROWS_PARTITIONED_TABLE2) + createTestTableViaFullRefresh(config, PgSchemaTable{Schema: "public", Table: "partitioned_table3"}, PG_SCHEMA_COLUMNS_PARTITIONED_TABLE, CSV_ROWS_PARTITIONED_TABLE3) + createTestTableViaFullRefresh(config, PgSchemaTable{Schema: "test", Table: "empty_table"}, PG_SCHEMA_COLUMNS_EMPTY_TABLE, [][]string{}) case SyncModeCDC: + utils.DropOldTables(trino, common.NewSet[string]()) createTestTableViaCdc(config, trino, PgSchemaTable{Schema: "public", Table: "test_table"}, PG_SCHEMA_COLUMNS_TEST_TABLE, JSON_ROWS_TEST_TABLE) createTestTableViaCdc(config, trino, PgSchemaTable{Schema: "public", Table: "partitioned_table1"}, PG_SCHEMA_COLUMNS_PARTITIONED_TABLE, JSON_ROWS_PARTITIONED_TABLE1) createTestTableViaCdc(config, trino, PgSchemaTable{Schema: "public", Table: "partitioned_table2"}, PG_SCHEMA_COLUMNS_PARTITIONED_TABLE, JSON_ROWS_PARTITIONED_TABLE2) @@ -699,7 +698,7 @@ func createTestTableViaCdc(config *Config, trino *common.Trino, pgSchemaTable Pg panic("CDC is not supported") } -func createTestTableViaFullRefresh(config *Config, trino *common.Trino, pgSchemaTable PgSchemaTable, pgSchemaColumns []PgSchemaColumn, rows [][]string) { +func createTestTableViaFullRefresh(config *Config, pgSchemaTable PgSchemaTable, pgSchemaColumns []PgSchemaColumn, rows [][]string) { cappedBuffer := common.NewCappedBuffer(config.BaseConfig, MAX_IN_MEMORY_BUFFER_SIZE) writer := csv.NewWriter(cappedBuffer) @@ -719,5 +718,5 @@ func createTestTableViaFullRefresh(config *Config, trino *common.Trino, pgSchema cappedBuffer.Close() syncer := NewSyncerFullRefresh(config) - syncer.writeToIceberg(trino, pgSchemaTable, pgSchemaColumns, cappedBuffer) + syncer.writeToIceberg(pgSchemaTable, pgSchemaColumns, cappedBuffer) } diff --git a/src/syncer-postgres/pg_schema_column.go b/src/syncer-postgres/pg_schema_column.go index e0690f0..5e64e48 100644 --- a/src/syncer-postgres/pg_schema_column.go +++ b/src/syncer-postgres/pg_schema_column.go @@ -11,22 +11,22 @@ import ( ) const ( + PG_TRUE = "YES" PG_DATA_TYPE_ARRAY = "ARRAY" ) type PgSchemaColumn struct { - ColumnName string - DataType string - UdtName string - IsNullable string - OrdinalPosition string - CharacterMaximumLength string - NumericPrecision string - NumericScale string - DatetimePrecision string - Namespace string - PartOfPrimaryKey bool - Config *Config + ColumnName string + DataType string + UdtName string + IsNullable string + OrdinalPosition string + NumericPrecision string + NumericScale string + DatetimePrecision string + Namespace string + PartOfPrimaryKey bool + Config *Config } func NewPgSchemaColumn(config *Config) *PgSchemaColumn { @@ -35,6 +35,62 @@ func NewPgSchemaColumn(config *Config) *PgSchemaColumn { } } +func (pgSchemaColumn *PgSchemaColumn) ToIcebergSchemaColumn() *common.IcebergSchemaColumn { + var icebergColumnType common.IcebergColumnType + + switch strings.TrimLeft(pgSchemaColumn.UdtName, "_") { + case "bool": + icebergColumnType = common.IcebergColumnTypeBoolean + case "bit", "int2", "int4": + icebergColumnType = common.IcebergColumnTypeInteger + case "xid": + icebergColumnType = common.IcebergColumnTypeLong + case "int8", "xid8": + icebergColumnType = common.IcebergColumnTypeDecimal + case "float4": + icebergColumnType = common.IcebergColumnTypeFloat + case "float8": + icebergColumnType = common.IcebergColumnTypeDouble + case "numeric": + icebergColumnType = common.IcebergColumnTypeDecimal + case "date": + icebergColumnType = common.IcebergColumnTypeDate + case "time": + icebergColumnType = common.IcebergColumnTypeTime + case "timetz": + icebergColumnType = common.IcebergColumnTypeTimeTz + case "timestamp": + icebergColumnType = common.IcebergColumnTypeTimestamp + case "timestamptz": + icebergColumnType = common.IcebergColumnTypeTimestampTz + case "varchar", "char", "text", "jsonb", "json", "bpchar", "uuid", + "point", "line", "lseg", "box", "path", "polygon", "circle", + "cidr", "inet", "macaddr", "macaddr8", + "interval", "ltree", "tsvector", "xml", "pg_snapshot": + icebergColumnType = common.IcebergColumnTypeString + case "bytea": + icebergColumnType = common.IcebergColumnTypeBinary + default: + // User-defined types -> VARCHAR + if pgSchemaColumn.Namespace != PG_SCHEMA_PG_CATALOG { + icebergColumnType = common.IcebergColumnTypeString + } else { + panic("Unsupported PostgreSQL type: " + pgSchemaColumn.UdtName) + } + } + + return &common.IcebergSchemaColumn{ + Config: pgSchemaColumn.Config.BaseConfig, + ColumnName: pgSchemaColumn.ColumnName, + ColumnType: icebergColumnType, + Position: common.StringToInt(pgSchemaColumn.OrdinalPosition), + NumericPrecision: common.StringToInt(pgSchemaColumn.NumericPrecision), + NumericScale: common.StringToInt(pgSchemaColumn.NumericScale), + IsList: pgSchemaColumn.DataType == PG_DATA_TYPE_ARRAY, + IsNullable: pgSchemaColumn.IsNullable == PG_TRUE, + } +} + func (pgSchemaColumn *PgSchemaColumn) TrinoType() string { primitiveType := pgSchemaColumn.primitiveTrinoType() @@ -64,7 +120,7 @@ func (pgSchemaColumn *PgSchemaColumn) JsonToTrinoValue(jsonValue interface{}) st func (pgSchemaColumn *PgSchemaColumn) CsvToTrinoValue(csvValue string) string { if pgSchemaColumn.DataType == PG_DATA_TYPE_ARRAY { - if csvValue == PG_NULL_STRING { + if csvValue == common.BEMIDB_NULL_STRING { return "NULL" } @@ -191,7 +247,7 @@ func (pgSchemaColumn *PgSchemaColumn) jsonToPrimitiveTrinoValue(jsonValue interf } func (pgSchemaColumn *PgSchemaColumn) csvToPrimitiveTrinoValue(csvValue string) string { - if csvValue == PG_NULL_STRING { + if csvValue == common.BEMIDB_NULL_STRING { return "NULL" } diff --git a/src/syncer-postgres/postgres.go b/src/syncer-postgres/postgres.go index 73cb6f0..a52514f 100644 --- a/src/syncer-postgres/postgres.go +++ b/src/syncer-postgres/postgres.go @@ -103,7 +103,6 @@ func (postgres *Postgres) PgSchemaColumns(pgSchemaTable PgSchemaTable) []PgSchem columns.udt_name, columns.is_nullable, columns.ordinal_position, - COALESCE(columns.character_maximum_length, 0), COALESCE(columns.numeric_precision, 0), COALESCE(columns.numeric_scale, 0), COALESCE(columns.datetime_precision, 0), @@ -141,7 +140,6 @@ func (postgres *Postgres) PgSchemaColumns(pgSchemaTable PgSchemaTable) []PgSchem &pgSchemaColumn.UdtName, &pgSchemaColumn.IsNullable, &pgSchemaColumn.OrdinalPosition, - &pgSchemaColumn.CharacterMaximumLength, &pgSchemaColumn.NumericPrecision, &pgSchemaColumn.NumericScale, &pgSchemaColumn.DatetimePrecision, diff --git a/src/syncer-postgres/syncer.go b/src/syncer-postgres/syncer.go index a363a72..b229710 100644 --- a/src/syncer-postgres/syncer.go +++ b/src/syncer-postgres/syncer.go @@ -40,7 +40,7 @@ func (syncer *Syncer) Sync() { panic("Incremental sync is not supported") case SyncModeFullRefresh: common.LogInfo(syncer.Config.BaseConfig, "Starting full-refresh sync...") - NewSyncerFullRefresh(syncer.Config).Sync(postgres, trino, pgSchemaTables) + NewSyncerFullRefresh(syncer.Config).Sync(postgres, pgSchemaTables) } common.SendAnonymousAnalytics(syncer.Config.BaseConfig, "syncer-postgres-finish", syncer.name()) diff --git a/src/syncer-postgres/syncer_full_refresh.go b/src/syncer-postgres/syncer_full_refresh.go index dbced0d..9aa55aa 100644 --- a/src/syncer-postgres/syncer_full_refresh.go +++ b/src/syncer-postgres/syncer_full_refresh.go @@ -2,10 +2,10 @@ package main import ( "context" - "strings" - "github.com/BemiHQ/BemiDB/src/syncer-common" "github.com/jackc/pgx/v5" + + "github.com/BemiHQ/BemiDB/src/syncer-common" ) const ( @@ -14,18 +14,20 @@ const ( ) type SyncerFullRefresh struct { - Config *Config - Utils *SyncerUtils + Config *Config + Utils *SyncerUtils + StorageS3 *common.StorageS3 } func NewSyncerFullRefresh(config *Config) *SyncerFullRefresh { return &SyncerFullRefresh{ - Config: config, - Utils: NewSyncerUtils(config), + Config: config, + Utils: NewSyncerUtils(config), + StorageS3: common.NewStorageS3(config.BaseConfig), } } -func (syncer *SyncerFullRefresh) Sync(postgres *Postgres, trino *common.Trino, pgSchemaTables []PgSchemaTable) { +func (syncer *SyncerFullRefresh) Sync(postgres *Postgres, pgSchemaTables []PgSchemaTable) { _, err := postgres.Conn.Exec(context.Background(), "BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE READ ONLY DEFERRABLE") common.PanicIfError(syncer.Config.BaseConfig, err) @@ -35,15 +37,15 @@ func (syncer *SyncerFullRefresh) Sync(postgres *Postgres, trino *common.Trino, p pgSchemaColumns := postgres.PgSchemaColumns(pgSchemaTable) common.LogInfo(syncer.Config.BaseConfig, "Syncing table:", pgSchemaTable.String()+"...") - syncer.syncTable(postgres, trino, pgSchemaTable, pgSchemaColumns) + syncer.syncTable(postgres, pgSchemaTable, pgSchemaColumns) icebergTableNames.Add(pgSchemaTable.IcebergTableName()) } - syncer.Utils.DropOldTables(trino, icebergTableNames) + syncer.Utils.DeleteOldTables(syncer.StorageS3, icebergTableNames) } -func (syncer *SyncerFullRefresh) syncTable(postgres *Postgres, trino *common.Trino, pgSchemaTable PgSchemaTable, pgSchemaColumns []PgSchemaColumn) { +func (syncer *SyncerFullRefresh) syncTable(postgres *Postgres, pgSchemaTable PgSchemaTable, pgSchemaColumns []PgSchemaColumn) { // Create a capped buffer read and written in parallel cappedBuffer := common.NewCappedBuffer(syncer.Config.BaseConfig, MAX_IN_MEMORY_BUFFER_SIZE) @@ -53,57 +55,45 @@ func (syncer *SyncerFullRefresh) syncTable(postgres *Postgres, trino *common.Tri }() // Read from cappedBuffer and write to Iceberg - syncer.writeToIceberg(trino, pgSchemaTable, pgSchemaColumns, cappedBuffer) + syncer.writeToIceberg(pgSchemaTable, pgSchemaColumns, cappedBuffer) } -func (syncer *SyncerFullRefresh) writeToIceberg(trino *common.Trino, pgSchemaTable PgSchemaTable, pgSchemaColumns []PgSchemaColumn, cappedBuffer *common.CappedBuffer) { - columnSchemas := []string{} - for _, pgSchemaColumn := range pgSchemaColumns { - columnSchemas = append(columnSchemas, `"`+pgSchemaColumn.ColumnName+"\" "+pgSchemaColumn.TrinoType()) +func (syncer *SyncerFullRefresh) writeToIceberg(pgSchemaTable PgSchemaTable, pgSchemaColumns []PgSchemaColumn, cappedBuffer *common.CappedBuffer) { + icebergSchemaColumns := make([]*common.IcebergSchemaColumn, len(pgSchemaColumns)) + for i, pgSchemaColumn := range pgSchemaColumns { + icebergSchemaColumns[i] = pgSchemaColumn.ToIcebergSchemaColumn() } - syncingQuotedTrinoTablePath := trino.Schema() + `."` + pgSchemaTable.IcebergTableName() + TEMP_TABLE_SUFFIX_SYNCING + `"` - deletingQuotedTrinoTablePath := trino.Schema() + `."` + pgSchemaTable.IcebergTableName() + TEMP_TABLE_SUFFIX_DELETING + `"` - newQuotedTrinoTablePath := trino.Schema() + `."` + pgSchemaTable.IcebergTableName() + `"` + // Delete -syncing table + syncingIcebergTable := common.NewIcebergTable(syncer.Config.BaseConfig, syncer.StorageS3, pgSchemaTable.IcebergTableName()+TEMP_TABLE_SUFFIX_SYNCING) + syncingIcebergTable.DeleteIfExists() - syncer.recreateTable(trino, syncingQuotedTrinoTablePath, "("+strings.Join(columnSchemas, ",")+")") + // Write and create -syncing table + icebergWriter := common.NewIcebergWriter(syncer.Config.BaseConfig, syncer.StorageS3, icebergSchemaColumns) + syncingIcebergTable.GenerateS3TablePath() + syncer.Utils.ReplaceFromCappedBuffer(icebergWriter, syncingIcebergTable, cappedBuffer) + syncingIcebergTable.Create() - syncer.Utils.InsertFromCappedBuffer(trino, syncingQuotedTrinoTablePath, pgSchemaTable, pgSchemaColumns, cappedBuffer) + // Delete -deleting table + deletingIcebergTable := common.NewIcebergTable(syncer.Config.BaseConfig, syncer.StorageS3, pgSchemaTable.IcebergTableName()+TEMP_TABLE_SUFFIX_DELETING) + deletingIcebergTable.DeleteIfExists() - syncer.swapTable(trino, syncingQuotedTrinoTablePath, deletingQuotedTrinoTablePath, newQuotedTrinoTablePath) + // Rename table to -deleting + icebergTable := common.NewIcebergTable(syncer.Config.BaseConfig, syncer.StorageS3, pgSchemaTable.IcebergTableName()) + icebergTable.Rename(deletingIcebergTable.Name) - common.LogInfo(syncer.Config.BaseConfig, "Compacting...") - trino.CompactTable(newQuotedTrinoTablePath) + // Rename -syncing to table + syncingIcebergTable.Rename(pgSchemaTable.IcebergTableName()) + + // Delete -deleting table + deletingIcebergTable.DeleteIfExists() } func (syncer *SyncerFullRefresh) copyFromPgTable(copyConn *pgx.Conn, pgSchemaTable PgSchemaTable, cappedBuffer *common.CappedBuffer) { - copySql := "COPY " + pgSchemaTable.String() + " TO STDOUT WITH CSV HEADER NULL '" + PG_NULL_STRING + "'" + copySql := "COPY " + pgSchemaTable.String() + " TO STDOUT WITH CSV HEADER NULL '" + common.BEMIDB_NULL_STRING + "'" result, err := copyConn.PgConn().CopyTo(context.Background(), cappedBuffer, copySql) common.PanicIfError(syncer.Config.BaseConfig, err) - common.LogInfo(syncer.Config.BaseConfig, "Copied", result.RowsAffected(), "row(s) into", pgSchemaTable.String()) + common.LogInfo(syncer.Config.BaseConfig, "Copied", result.RowsAffected(), "rows from", pgSchemaTable.String()) cappedBuffer.Close() } - -func (syncer *SyncerFullRefresh) recreateTable(trino *common.Trino, syncingQuotedTrinoTablePath string, columnSchemasStatement string) { - ctx := context.Background() - - _, err := trino.ExecContext(ctx, "DROP TABLE IF EXISTS "+syncingQuotedTrinoTablePath) - common.PanicIfError(syncer.Config.BaseConfig, err) - - _, err = trino.ExecContext(ctx, "CREATE TABLE "+syncingQuotedTrinoTablePath+columnSchemasStatement) - common.PanicIfError(syncer.Config.BaseConfig, err) -} - -func (syncer *SyncerFullRefresh) swapTable(trino *common.Trino, syncingQuotedTrinoTablePath string, deletingQuotedTrinoTablePath string, newQuotedTrinoTablePath string) { - ctx := context.Background() - - _, err := trino.ExecContext(ctx, "DROP TABLE IF EXISTS "+deletingQuotedTrinoTablePath) - common.PanicIfError(syncer.Config.BaseConfig, err) - - _, err = trino.ExecContext(ctx, "ALTER TABLE IF EXISTS "+newQuotedTrinoTablePath+" RENAME TO "+deletingQuotedTrinoTablePath) - common.PanicIfError(syncer.Config.BaseConfig, err) - - _, err = trino.ExecContext(ctx, "ALTER TABLE "+syncingQuotedTrinoTablePath+" RENAME TO "+newQuotedTrinoTablePath) - common.PanicIfError(syncer.Config.BaseConfig, err) -} diff --git a/src/syncer-postgres/syncer_utils.go b/src/syncer-postgres/syncer_utils.go index 2aa5370..48c59ac 100644 --- a/src/syncer-postgres/syncer_utils.go +++ b/src/syncer-postgres/syncer_utils.go @@ -2,17 +2,19 @@ package main import ( "context" + "database/sql/driver" "encoding/csv" "io" "strings" + goDuckdb "github.com/marcboeker/go-duckdb/v2" + "github.com/BemiHQ/BemiDB/src/syncer-common" ) var ( - MAX_IN_MEMORY_BUFFER_SIZE = 8 * 1024 * 1024 // 8 MB - - PG_NULL_STRING = "BEMIDB_NULL" + MAX_IN_MEMORY_BUFFER_SIZE = 32 * 1024 * 1024 // 32 MB + MAX_ICEBERG_WRITER_BATCH_SIZE = 1024 * 1024 * 1024 // 1 GB COMPACT_AFTER_INSERT_BATCH_COUNT = 40 // Compact the table after every N insert batches ) @@ -77,6 +79,21 @@ func (utils *SyncerUtils) DropOldTables(trino *common.Trino, keepIcebergTableNam } } +func (utils *SyncerUtils) DeleteOldTables(storageS3 *common.StorageS3, keepIcebergTableNames common.Set[string]) { + icebergCatalog := common.NewIcebergCatalog(utils.Config.BaseConfig) + icebergTableNames := icebergCatalog.TableNames() + + for _, icebergTableName := range icebergTableNames.Values() { + if keepIcebergTableNames.Contains(icebergTableName) { + continue + } + + common.LogInfo(utils.Config.BaseConfig, "Deleting old Iceberg table: "+icebergTableName) + icebergTable := common.NewIcebergTable(utils.Config.BaseConfig, storageS3, icebergTableName) + icebergTable.DeleteIfExists() + } +} + func (utils *SyncerUtils) InsertFromCappedBuffer(trino *common.Trino, quotedTrinoTablePath string, pgSchemaTable PgSchemaTable, pgSchemaColumns []PgSchemaColumn, cappedBuffer *common.CappedBuffer) { ctx := context.Background() csvReader := csv.NewReader(cappedBuffer) @@ -134,3 +151,43 @@ func (utils *SyncerUtils) InsertFromCappedBuffer(trino *common.Trino, quotedTrin common.LogInfo(utils.Config.BaseConfig, "Inserted", currentRowCount, "rows into table:", pgSchemaTable.String()) } } + +func (utils *SyncerUtils) ReplaceFromCappedBuffer(icebergWriter *common.IcebergWriter, icebergTable *common.IcebergTable, cappedBuffer *common.CappedBuffer) { + csvReader := csv.NewReader(cappedBuffer) + _, err := csvReader.Read() // Read the header row + common.PanicIfError(utils.Config.BaseConfig, err) + + icebergWriter.Write(icebergTable.GeneratedS3TablePath, func(appender *goDuckdb.Appender) (rowCount int, reachedEnd bool) { + var loadedSize int + + for { + row, err := csvReader.Read() + if err == io.EOF { + reachedEnd = true + break + } + if err != nil { + common.PanicIfError(utils.Config.BaseConfig, err) + } + + values := make([]driver.Value, len(icebergWriter.IcebergSchemaColumns)) + for i, icebergSchemaColumn := range icebergWriter.IcebergSchemaColumns { + values[i] = icebergSchemaColumn.DuckdbValueFromCsv(row[i]) + loadedSize += len(row[i]) + } + common.LogTrace(utils.Config.BaseConfig, "DuckDB appending values:", values) + + err = appender.AppendRow(values...) + common.PanicIfError(utils.Config.BaseConfig, err) + + rowCount++ + if loadedSize >= MAX_ICEBERG_WRITER_BATCH_SIZE { + common.LogDebug(utils.Config.BaseConfig, "Reached batch size limit") + break + } + } + + common.LogInfo(utils.Config.BaseConfig, "Loaded", rowCount, "rows") + return rowCount, reachedEnd + }) +} From 743283c48e8034d5e08ec5445f984cc904ec98d7 Mon Sep 17 00:00:00 2001 From: Andrew Kane Date: Thu, 31 Jul 2025 17:50:32 -0700 Subject: [PATCH 04/24] Upgrade pg_query_go to v6 --- src/server/go.mod | 2 +- src/server/go.sum | 4 ++-- src/server/parser_a_expr.go | 2 +- src/server/parser_column_ref.go | 2 +- src/server/parser_function.go | 2 +- src/server/parser_select.go | 2 +- src/server/parser_show.go | 2 +- src/server/parser_table.go | 2 +- src/server/parser_type_cast.go | 2 +- src/server/parser_utils.go | 2 +- src/server/query_remapper.go | 2 +- src/server/query_remapper_expression.go | 2 +- src/server/query_remapper_function.go | 2 +- src/server/query_remapper_select.go | 2 +- src/server/query_remapper_show.go | 2 +- src/server/query_remapper_table.go | 2 +- 16 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/server/go.mod b/src/server/go.mod index bf5c013..f51e928 100644 --- a/src/server/go.mod +++ b/src/server/go.mod @@ -10,7 +10,7 @@ require ( github.com/google/uuid v1.6.0 github.com/jackc/pgx/v5 v5.7.2 github.com/marcboeker/go-duckdb/v2 v2.3.2 - github.com/pganalyze/pg_query_go/v5 v5.1.0 + github.com/pganalyze/pg_query_go/v6 v6.1.0 ) require golang.org/x/crypto v0.35.0 diff --git a/src/server/go.sum b/src/server/go.sum index d9f6ab0..c960dfc 100644 --- a/src/server/go.sum +++ b/src/server/go.sum @@ -93,8 +93,8 @@ github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpsp github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI= github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= -github.com/pganalyze/pg_query_go/v5 v5.1.0 h1:MlxQqHZnvA3cbRQYyIrjxEjzo560P6MyTgtlaf3pmXg= -github.com/pganalyze/pg_query_go/v5 v5.1.0/go.mod h1:FsglvxidZsVN+Ltw3Ai6nTgPVcK2BPukH3jCDEqc1Ug= +github.com/pganalyze/pg_query_go/v6 v6.1.0 h1:jG5ZLhcVgL1FAw4C/0VNQaVmX1SUJx71wBGdtTtBvls= +github.com/pganalyze/pg_query_go/v6 v6.1.0/go.mod h1:nvTHIuoud6e1SfrUaFwHqT0i4b5Nr+1rPWVds3B5+50= github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/src/server/parser_a_expr.go b/src/server/parser_a_expr.go index fd01f0e..0ff48f6 100644 --- a/src/server/parser_a_expr.go +++ b/src/server/parser_a_expr.go @@ -3,7 +3,7 @@ package main import ( "strings" - pgQuery "github.com/pganalyze/pg_query_go/v5" + pgQuery "github.com/pganalyze/pg_query_go/v6" ) type ParserAExpr struct { diff --git a/src/server/parser_column_ref.go b/src/server/parser_column_ref.go index 2352832..5fc1dd0 100644 --- a/src/server/parser_column_ref.go +++ b/src/server/parser_column_ref.go @@ -1,7 +1,7 @@ package main import ( - pgQuery "github.com/pganalyze/pg_query_go/v5" + pgQuery "github.com/pganalyze/pg_query_go/v6" ) type ParserColumnRef struct { diff --git a/src/server/parser_function.go b/src/server/parser_function.go index ff07d54..aff6418 100644 --- a/src/server/parser_function.go +++ b/src/server/parser_function.go @@ -3,7 +3,7 @@ package main import ( "strings" - pgQuery "github.com/pganalyze/pg_query_go/v5" + pgQuery "github.com/pganalyze/pg_query_go/v6" ) type ParserFunction struct { diff --git a/src/server/parser_select.go b/src/server/parser_select.go index 079d922..23c09e6 100644 --- a/src/server/parser_select.go +++ b/src/server/parser_select.go @@ -1,7 +1,7 @@ package main import ( - pgQuery "github.com/pganalyze/pg_query_go/v5" + pgQuery "github.com/pganalyze/pg_query_go/v6" ) type ParserSelect struct { diff --git a/src/server/parser_show.go b/src/server/parser_show.go index 2bf0951..73d90e7 100644 --- a/src/server/parser_show.go +++ b/src/server/parser_show.go @@ -1,7 +1,7 @@ package main import ( - pgQuery "github.com/pganalyze/pg_query_go/v5" + pgQuery "github.com/pganalyze/pg_query_go/v6" ) type ParserShow struct { diff --git a/src/server/parser_table.go b/src/server/parser_table.go index 83a21ad..a18feae 100644 --- a/src/server/parser_table.go +++ b/src/server/parser_table.go @@ -1,7 +1,7 @@ package main import ( - pgQuery "github.com/pganalyze/pg_query_go/v5" + pgQuery "github.com/pganalyze/pg_query_go/v6" ) type QueryToIcebergTable struct { diff --git a/src/server/parser_type_cast.go b/src/server/parser_type_cast.go index 039dba8..fdbea92 100644 --- a/src/server/parser_type_cast.go +++ b/src/server/parser_type_cast.go @@ -3,7 +3,7 @@ package main import ( "strings" - pgQuery "github.com/pganalyze/pg_query_go/v5" + pgQuery "github.com/pganalyze/pg_query_go/v6" ) type ParserTypeCast struct { diff --git a/src/server/parser_utils.go b/src/server/parser_utils.go index d070db7..3e12cf9 100644 --- a/src/server/parser_utils.go +++ b/src/server/parser_utils.go @@ -1,7 +1,7 @@ package main import ( - pgQuery "github.com/pganalyze/pg_query_go/v5" + pgQuery "github.com/pganalyze/pg_query_go/v6" ) type ParserUtils struct { diff --git a/src/server/query_remapper.go b/src/server/query_remapper.go index 32a229a..32c6c4e 100644 --- a/src/server/query_remapper.go +++ b/src/server/query_remapper.go @@ -5,7 +5,7 @@ import ( "fmt" "strings" - pgQuery "github.com/pganalyze/pg_query_go/v5" + pgQuery "github.com/pganalyze/pg_query_go/v6" ) var SUPPORTED_SET_STATEMENTS = NewSet[string]().AddAll([]string{ diff --git a/src/server/query_remapper_expression.go b/src/server/query_remapper_expression.go index 85208b9..970dc40 100644 --- a/src/server/query_remapper_expression.go +++ b/src/server/query_remapper_expression.go @@ -3,7 +3,7 @@ package main import ( "strings" - pgQuery "github.com/pganalyze/pg_query_go/v5" + pgQuery "github.com/pganalyze/pg_query_go/v6" ) type QueryRemapperExpression struct { diff --git a/src/server/query_remapper_function.go b/src/server/query_remapper_function.go index 4d528dd..aa217b4 100644 --- a/src/server/query_remapper_function.go +++ b/src/server/query_remapper_function.go @@ -3,7 +3,7 @@ package main import ( "regexp" - pgQuery "github.com/pganalyze/pg_query_go/v5" + pgQuery "github.com/pganalyze/pg_query_go/v6" ) var PG_CATALOG_MACRO_FUNCTION_NAMES = Set[string]{} diff --git a/src/server/query_remapper_select.go b/src/server/query_remapper_select.go index 2a05d89..d58efae 100644 --- a/src/server/query_remapper_select.go +++ b/src/server/query_remapper_select.go @@ -1,7 +1,7 @@ package main import ( - pgQuery "github.com/pganalyze/pg_query_go/v5" + pgQuery "github.com/pganalyze/pg_query_go/v6" ) type QueryRemapperSelect struct { diff --git a/src/server/query_remapper_show.go b/src/server/query_remapper_show.go index cfb7ec4..18959dc 100644 --- a/src/server/query_remapper_show.go +++ b/src/server/query_remapper_show.go @@ -1,7 +1,7 @@ package main import ( - pgQuery "github.com/pganalyze/pg_query_go/v5" + pgQuery "github.com/pganalyze/pg_query_go/v6" ) type QueryRemapperShow struct { diff --git a/src/server/query_remapper_table.go b/src/server/query_remapper_table.go index b55bb8a..da0ba52 100644 --- a/src/server/query_remapper_table.go +++ b/src/server/query_remapper_table.go @@ -5,7 +5,7 @@ import ( "regexp" "strings" - pgQuery "github.com/pganalyze/pg_query_go/v5" + pgQuery "github.com/pganalyze/pg_query_go/v6" ) var PG_CATALOG_TABLE_NAMES = Set[string]{} From a41a6c448ccd2cfd58eee194666d876c07befbd3 Mon Sep 17 00:00:00 2001 From: exAspArk Date: Sat, 16 Aug 2025 12:43:50 -0400 Subject: [PATCH 05/24] Extract common module --- .../common_config.go} | 16 +- src/common/duckdb_client.go | 134 +++++++++++++++ src/{server => common}/error_utils.go | 25 +-- src/common/go.mod | 57 +++++++ src/common/go.sum | 131 +++++++++++++++ .../logger.go => common/logger_utils.go} | 10 +- src/{server => common}/postgres_client.go | 18 ++- src/common/s3_client.go | 124 ++++++++++++++ src/{syncer-common => common}/set.go | 0 src/common/utils.go | 14 ++ src/server/config.go | 104 +++++------- src/server/custom_types.go | 35 ---- src/server/duckdb.go | 153 ------------------ src/server/go.mod | 66 ++++---- src/server/go.sum | 153 +++++++++--------- src/server/iceberg_catalog.go | 18 ++- src/server/iceberg_reader.go | 8 +- src/server/logger.go | 51 ------ src/server/main.go | 60 ++++--- src/server/parser_function.go | 4 +- src/server/parser_utils.go | 4 +- src/server/pg_constants.go | 8 +- src/server/postgres_server.go | 30 ++-- src/server/query_handler.go | 44 ++--- src/server/query_handler_test.go | 20 +-- src/server/query_remapper.go | 20 +-- src/server/query_remapper_function.go | 12 +- src/server/query_remapper_table.go | 38 ++--- src/server/response_handler.go | 26 +-- src/server/storage_s3.go | 56 +------ src/server/utils.go | 10 -- src/syncer-amplitude/amplitude.go | 10 +- src/syncer-amplitude/config.go | 86 +++++----- src/syncer-amplitude/event.go | 2 +- src/syncer-amplitude/go.mod | 61 +++---- src/syncer-amplitude/go.sum | 118 +++++++------- src/syncer-amplitude/main.go | 6 + src/syncer-amplitude/syncer.go | 49 +++--- src/syncer-common/capped_buffer.go | 26 +-- src/syncer-common/capped_buffer_test.go | 10 +- src/syncer-common/duckdb.go | 100 ------------ src/syncer-common/error_utils.go | 49 ------ src/syncer-common/go.mod | 57 +++---- src/syncer-common/go.sum | 118 +++++++------- src/syncer-common/iceberg_catalog.go | 44 ++--- src/syncer-common/iceberg_schema_column.go | 23 +-- src/syncer-common/iceberg_table.go | 33 ++-- src/syncer-common/iceberg_writer.go | 19 +-- src/syncer-common/postgres_client.go | 83 ---------- src/syncer-common/storage_s3.go | 142 ++++------------ src/syncer-common/storage_utils.go | 41 ++--- src/syncer-common/trino.go | 54 ++++--- src/syncer-common/utils.go | 16 +- src/syncer-postgres/config.go | 83 +++++----- src/syncer-postgres/go.mod | 55 ++++--- src/syncer-postgres/go.sum | 114 ++++++------- src/syncer-postgres/init_test.go | 57 +++---- src/syncer-postgres/main.go | 6 + src/syncer-postgres/nats.go | 8 +- src/syncer-postgres/pg_schema_column.go | 97 +++++------ src/syncer-postgres/postgres.go | 82 +++------- src/syncer-postgres/syncer.go | 15 +- src/syncer-postgres/syncer_full_refresh.go | 41 +++-- src/syncer-postgres/syncer_utils.go | 57 +++---- 64 files changed, 1575 insertions(+), 1636 deletions(-) rename src/{syncer-common/base_config.go => common/common_config.go} (72%) create mode 100644 src/common/duckdb_client.go rename src/{server => common}/error_utils.go (70%) create mode 100644 src/common/go.mod create mode 100644 src/common/go.sum rename src/{syncer-common/logger.go => common/logger_utils.go} (74%) rename src/{server => common}/postgres_client.go (75%) create mode 100644 src/common/s3_client.go rename src/{syncer-common => common}/set.go (100%) create mode 100644 src/common/utils.go delete mode 100644 src/server/duckdb.go delete mode 100644 src/server/logger.go delete mode 100644 src/syncer-common/duckdb.go delete mode 100644 src/syncer-common/error_utils.go delete mode 100644 src/syncer-common/postgres_client.go diff --git a/src/syncer-common/base_config.go b/src/common/common_config.go similarity index 72% rename from src/syncer-common/base_config.go rename to src/common/common_config.go index 1024a79..da82a9e 100644 --- a/src/syncer-common/base_config.go +++ b/src/common/common_config.go @@ -8,11 +8,6 @@ const ( ENV_CATALOG_DATABASE_URL = "CATALOG_DATABASE_URL" - ENV_DESTINATION_SCHEMA_NAME = "DESTINATION_SCHEMA_NAME" - - ENV_TRINO_DATABASE_URL = "TRINO_DATABASE_URL" - ENV_TRINO_CATALOG_NAME = "TRINO_CATALOG_NAME" - ENV_AWS_REGION = "AWS_REGION" ENV_AWS_S3_ENDPOINT = "AWS_S3_ENDPOINT" ENV_AWS_S3_BUCKET = "AWS_S3_BUCKET" @@ -23,11 +18,6 @@ const ( DEFAULT_AWS_S3_ENDPOINT = "s3.amazonaws.com" ) -type TrinoConfig struct { - DatabaseUrl string - CatalogName string -} - type AwsConfig struct { Region string S3Endpoint string // optional @@ -36,11 +26,9 @@ type AwsConfig struct { SecretAccessKey string } -type BaseConfig struct { - LogLevel string - Trino TrinoConfig +type CommonConfig struct { Aws AwsConfig + LogLevel string CatalogDatabaseUrl string - DestinationSchemaName string DisableAnonymousAnalytics bool } diff --git a/src/common/duckdb_client.go b/src/common/duckdb_client.go new file mode 100644 index 0000000..c3f70f1 --- /dev/null +++ b/src/common/duckdb_client.go @@ -0,0 +1,134 @@ +package common + +import ( + "context" + "database/sql" + "strings" + + "github.com/marcboeker/go-duckdb/v2" +) + +type DuckdbClient struct { + Config *CommonConfig + Db *sql.DB + Connector *duckdb.Connector +} + +func NewDuckdbClient(config *CommonConfig, bootQueries ...[]string) *DuckdbClient { + ctx := context.Background() + connector, err := duckdb.NewConnector("", nil) + PanicIfError(config, err) + db := sql.OpenDB(connector) + PanicIfError(config, err) + + client := &DuckdbClient{ + Config: config, + Db: db, + Connector: connector, + } + + queries := []string{ + "SET timezone='UTC'", + "SET memory_limit='2GB'", + } + if bootQueries != nil { + queries = append(queries, bootQueries[0]...) + } + for _, query := range queries { + _, err := client.ExecContext(ctx, query) + PanicIfError(config, err) + } + + client.setExplicitAwsCredentials(ctx) + + if IsLocalHost(config.Aws.S3Endpoint) { + _, err = client.ExecContext(ctx, "SET s3_use_ssl=false") + PanicIfError(config, err) + } + + if config.Aws.S3Endpoint != DEFAULT_AWS_S3_ENDPOINT { + // Use endpoint/bucket/key (path, deprecated on AWS) instead of bucket.endpoint/key (vhost) + _, err = client.ExecContext(ctx, "SET s3_url_style='path'") + PanicIfError(config, err) + } + + if config.LogLevel == LOG_LEVEL_TRACE { + _, err = client.ExecContext(ctx, "PRAGMA enable_logging('HTTP')") + PanicIfError(config, err) + _, err = client.ExecContext(ctx, "SET logging_storage = 'stdout'") + PanicIfError(config, err) + } + + return client +} + +func (client *DuckdbClient) QueryContext(ctx context.Context, query string) (*sql.Rows, error) { + LogDebug(client.Config, "Querying DuckDBClient:", query) + return client.Db.QueryContext(ctx, query) +} + +func (client *DuckdbClient) PrepareContext(ctx context.Context, query string) (*sql.Stmt, error) { + LogDebug(client.Config, "Preparing DuckDBClient statement:", query) + return client.Db.PrepareContext(ctx, query) +} + +func (client *DuckdbClient) ExecContext(ctx context.Context, query string, args ...map[string]string) (sql.Result, error) { + LogDebug(client.Config, "Querying DuckDBClient:", query) + if len(args) == 0 { + return client.Db.ExecContext(ctx, query) + } + + return client.Db.ExecContext(ctx, replaceNamedStringArgs(query, args[0])) +} + +func (client *DuckdbClient) ExecTransactionContext(ctx context.Context, queries []string) error { + tx, err := client.Db.Begin() + LogDebug(client.Config, "Querying DuckDBClient: BEGIN") + if err != nil { + return err + } + + for _, query := range queries { + LogDebug(client.Config, "Querying DuckDBClient:", query) + _, err := tx.ExecContext(ctx, query) + if err != nil { + tx.Rollback() + return err + } + } + + LogDebug(client.Config, "Querying DuckDBClient: COMMIT") + return tx.Commit() +} + +func (client *DuckdbClient) Appender(schema string, table string) (*duckdb.Appender, error) { + conn, err := client.Connector.Connect(context.Background()) + if err != nil { + return nil, err + } + return duckdb.NewAppenderFromConn(conn, schema, table) +} + +func (client *DuckdbClient) Close() { + client.Db.Close() +} + +func (client *DuckdbClient) setExplicitAwsCredentials(ctx context.Context) { + config := client.Config + query := "CREATE OR REPLACE SECRET aws_s3_secret (TYPE S3, KEY_ID '$accessKeyId', SECRET '$secretAccessKey', REGION '$region', ENDPOINT '$endpoint', SCOPE '$s3Bucket')" + _, err := client.ExecContext(ctx, query, map[string]string{ + "accessKeyId": config.Aws.AccessKeyId, + "secretAccessKey": config.Aws.SecretAccessKey, + "region": config.Aws.Region, + "endpoint": config.Aws.S3Endpoint, + "s3Bucket": "s3://" + config.Aws.S3Bucket, + }) + PanicIfError(config, err) +} + +func replaceNamedStringArgs(query string, args map[string]string) string { + for key, value := range args { + query = strings.ReplaceAll(query, "$"+key, value) + } + return query +} diff --git a/src/server/error_utils.go b/src/common/error_utils.go similarity index 70% rename from src/server/error_utils.go rename to src/common/error_utils.go index 74fb89d..f292774 100644 --- a/src/server/error_utils.go +++ b/src/common/error_utils.go @@ -1,4 +1,4 @@ -package main +package common import ( "bytes" @@ -12,7 +12,7 @@ import ( "time" ) -func PanicIfError(config *Config, err error) { +func PanicIfError(config *CommonConfig, err error) { if err != nil { sendAnonymousErrorReport(config, err) printUnexpectedError(config, err) @@ -20,23 +20,28 @@ func PanicIfError(config *Config, err error) { } } -func Panic(config *Config, message string) { +func Panic(config *CommonConfig, message string) { err := errors.New(message) PanicIfError(config, err) } -func PrintErrorAndExit(config *Config, message string) { +func PrintErrorAndExit(config *CommonConfig, message string) { LogError(config, message+"\n") os.Exit(1) } -func HandleUnexpectedError(config *Config, err error) { - sendAnonymousErrorReport(config, err) - printUnexpectedError(config, err) - os.Exit(1) +func HandleUnexpectedPanic(config *CommonConfig) { + func() { + if r := recover(); r != nil { + err, _ := r.(error) + sendAnonymousErrorReport(config, err) + printUnexpectedError(config, err) + os.Exit(1) + } + }() } -func printUnexpectedError(config *Config, err error) { +func printUnexpectedError(config *CommonConfig, err error) { errorMessage := err.Error() stackTrace := string(debug.Stack()) @@ -53,7 +58,7 @@ type AnonymousErrorData struct { S3Bucket string `json:"s3Bucket"` } -func sendAnonymousErrorReport(config *Config, err error) { +func sendAnonymousErrorReport(config *CommonConfig, err error) { if config.DisableAnonymousAnalytics { return } diff --git a/src/common/go.mod b/src/common/go.mod new file mode 100644 index 0000000..2edde00 --- /dev/null +++ b/src/common/go.mod @@ -0,0 +1,57 @@ +module github.com/BemiHQ/BemiDB/src/common + +go 1.24.4 + +require ( + github.com/aws/aws-sdk-go-v2 v1.37.0 + github.com/aws/aws-sdk-go-v2/config v1.30.1 + github.com/aws/aws-sdk-go-v2/credentials v1.18.1 + github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1 + github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0 + github.com/jackc/pgx/v5 v5.7.5 + github.com/marcboeker/go-duckdb/v2 v2.3.2 +) + +require ( + github.com/apache/arrow-go/v18 v18.4.0 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.26.0 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.35.0 // indirect + github.com/aws/smithy-go v1.22.5 // indirect + github.com/duckdb/duckdb-go-bindings v0.1.16 // indirect + github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11 // indirect + github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11 // indirect + github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11 // indirect + github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11 // indirect + github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11 // indirect + github.com/go-viper/mapstructure/v2 v2.3.0 // indirect + github.com/goccy/go-json v0.10.5 // indirect + github.com/google/flatbuffers v25.2.10+incompatible // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.11 // indirect + github.com/marcboeker/go-duckdb/arrowmapping v0.0.9 // indirect + github.com/marcboeker/go-duckdb/mapping v0.0.10 // indirect + github.com/pierrec/lz4/v4 v4.1.22 // indirect + github.com/zeebo/xxh3 v1.0.2 // indirect + golang.org/x/crypto v0.37.0 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.25.0 // indirect + golang.org/x/sync v0.15.0 // indirect + golang.org/x/sys v0.33.0 // indirect + golang.org/x/text v0.26.0 // indirect + golang.org/x/tools v0.34.0 // indirect + golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect +) diff --git a/src/common/go.sum b/src/common/go.sum new file mode 100644 index 0000000..79c6056 --- /dev/null +++ b/src/common/go.sum @@ -0,0 +1,131 @@ +github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= +github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= +github.com/apache/arrow-go/v18 v18.4.0 h1:/RvkGqH517iY8bZKc4FD5/kkdwXJGjxf28JIXbJ/oB0= +github.com/apache/arrow-go/v18 v18.4.0/go.mod h1:Aawvwhj8x2jURIzD9Moy72cF0FyJXOpkYpdmGRHcw14= +github.com/apache/thrift v0.22.0 h1:r7mTJdj51TMDe6RtcmNdQxgn9XcyfGDOzegMDRg47uc= +github.com/apache/thrift v0.22.0/go.mod h1:1e7J/O1Ae6ZQMTYdy9xa3w9k+XHWPfRvdPyJeynQ+/g= +github.com/aws/aws-sdk-go-v2 v1.37.0 h1:YtCOESR/pN4j5oA7cVHSfOwIcuh/KwHC4DOSXFbv5F0= +github.com/aws/aws-sdk-go-v2 v1.37.0/go.mod h1:9Q0OoGQoboYIAJyslFyF1f5K1Ryddop8gqMhWx/n4Wg= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 h1:6GMWV6CNpA/6fbFHnoAjrv4+LGfyTqZz2LtCHnspgDg= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0/go.mod h1:/mXlTIVG9jbxkqDnr5UQNQxW1HRYxeGklkM9vAFeabg= +github.com/aws/aws-sdk-go-v2/config v1.30.1 h1:sHL8g/+9tcZATeV2tEkEfxZeaNokDtKsSjGMGHD49qA= +github.com/aws/aws-sdk-go-v2/config v1.30.1/go.mod h1:wkibEyFfxXRyTSzRU4bbF5IUsSXyE4xQ4ZjkGmi5tFo= +github.com/aws/aws-sdk-go-v2/credentials v1.18.1 h1:E55xvOqlX7CvB66Z7rSM9usCrFU1ryUIUHqiXsEzVoE= +github.com/aws/aws-sdk-go-v2/credentials v1.18.1/go.mod h1:iobSQfR5MkvILxssGOvi/P1jjOhrRzfTiCPCzku0vx4= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0 h1:9sBTeKQwAvmJUWKIACIoiFSnxxl+sS++YDfr17/ngq0= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0/go.mod h1:LW9/PxQD1SYFC7pnWcgqPhoyZprhjEdg5hBK6qYPLW8= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1 h1:aAjA/1JZ1xH/F9XvxJu9cXZyp7BqVXtHpztyZ6p799E= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1/go.mod h1:ia9HASsPba/7o84sp6iE4wZPdNTJ0oicBe5sWQQk+Ys= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0 h1:H2iZoqW/v2Jnrh1FnU725Bq6KJ0k2uP63yH+DcY+HUI= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0/go.mod h1:L0FqLbwMXHvNC/7crWV1iIxUlOKYZUE8KuTIA+TozAI= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0 h1:EDped/rNzAhFPhVY0sDGbtD16OKqksfA8OjF/kLEgw8= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0/go.mod h1:uUI335jvzpZRPpjYx6ODc/wg1qH+NnoSTK/FwVeK0C0= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0 h1:iLvW/zOkHGU3BDU5thWnj+UZ9pjhuVhv1loLj7yVtBw= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0/go.mod h1:Fn3gvhdF1x5Rs9nUoCy/fJT1ms8f8dO7RqM9lJHuazQ= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 h1:6+lZi2JeGKtCraAj1rpoZfKqnQ9SptseRZioejfUOLM= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0/go.mod h1:eb3gfbVIxIoGgJsi9pGne19dhCBpK6opTYpQqAmdy44= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0 h1:qGyLBQPphYzUf+IIlb5tHnvg1U2Vc5hXPcP7oRSQfy0= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0/go.mod h1:g+dzKSLXiR/8ATkPXmLhPOI6rDdjLP3tngeo3FvDcIw= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0 h1:eRhU3Sh8dGbaniI6B+I48XJMrTPRkK4DKo+vqIxziOU= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0/go.mod h1:paNLV18DZ6FnWE/bd06RIKPDIFpjuvCkGKWTG/GDBeM= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0 h1:6jusT+XCcvnD+Elxvm7bUf5sCMTpZEp3AKjYQ4tWJSo= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0/go.mod h1:LimGpdIF/sTBdgqwOEkrArXLCoTamK/9L9x8IKBFTIc= +github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0 h1:gAV4NEp4A+JOrIdoXkAeyy6IOo7+X2s/jRuaHKYiMaU= +github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0/go.mod h1:JIQwK8sZ5MuKGm5rrFwp9MHUcyYEsQNpVixuPDlnwaU= +github.com/aws/aws-sdk-go-v2/service/sso v1.26.0 h1:cuFWHH87GP1NBGXXfMicUbE7Oty5KpPxN6w4JpmuxYc= +github.com/aws/aws-sdk-go-v2/service/sso v1.26.0/go.mod h1:aJBemdlbCKyOXEXdXBqS7E+8S9XTDcOTaoOjtng54hA= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0 h1:t2va+wewPOYIqC6XyJ4MGjiGKkczMAPsgq5W4FtL9ME= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0/go.mod h1:ExCTcqYqN0hYYRsDlBVU8+68grqlWdgX9/nZJwQW4aY= +github.com/aws/aws-sdk-go-v2/service/sts v1.35.0 h1:FD9agdG4CeOGS3ORLByJk56YIXDS7mxFpmZyCtpqExc= +github.com/aws/aws-sdk-go-v2/service/sts v1.35.0/go.mod h1:NDzDPbBF1xtSTZUMuZx0w3hIfWzcL7X2AQ0Tr9becIQ= +github.com/aws/smithy-go v1.22.5 h1:P9ATCXPMb2mPjYBgueqJNCA5S9UfktsW0tTxi+a7eqw= +github.com/aws/smithy-go v1.22.5/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/duckdb/duckdb-go-bindings v0.1.16 h1:XPCk9hzP06PoWIxDPVU3gAy0m1XmLaZHTzLggNx/U9k= +github.com/duckdb/duckdb-go-bindings v0.1.16/go.mod h1:pBnfviMzANT/9hi4bg+zW4ykRZZPCXlVuvBWEcZofkc= +github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11 h1:GXQkG4HmEbwPtqCSabJTp9wZQQ7Gqr3KveLNesQWQOs= +github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11/go.mod h1:Ezo7IbAfB8NP7CqPIN8XEHKUg5xdRRQhcPPlCXImXYA= +github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11 h1:ATJMSBIDA/YAm/6CKeBDRtGK1OOwqfTZbWg9Y5fAc9E= +github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11/go.mod h1:eS7m/mLnPQgVF4za1+xTyorKRBuK0/BA44Oy6DgrGXI= +github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11 h1:AjvnGst1avyOECYiykthyHR4DTYTaqNDPr5W/0t5j0k= +github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11/go.mod h1:1GOuk1PixiESxLaCGFhag+oFi7aP+9W8byymRAvunBk= +github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11 h1:j3B1biawuhtxe2Chkiqcwf1Kxe8VJc8lLVmjBIcJrkI= +github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11/go.mod h1:o7crKMpT2eOIi5/FY6HPqaXcvieeLSqdXXaXbruGX7w= +github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11 h1:xR3vRE8y+48U6xDNkUlOfbl7/OTA7FVcDXJ+5vETuHU= +github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11/go.mod h1:IlOhJdVKUJCAPj3QsDszUo8DVdvp1nBFp4TUJVdw99s= +github.com/go-viper/mapstructure/v2 v2.3.0 h1:27XbWsHIqhbdR5TIC911OfYvgSaW93HM+dX7970Q7jk= +github.com/go-viper/mapstructure/v2 v2.3.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= +github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= +github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/flatbuffers v25.2.10+incompatible h1:F3vclr7C3HpB1k9mxCGRMXq6FdUalZ6H/pNX4FP1v0Q= +github.com/google/flatbuffers v25.2.10+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +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/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +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/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.7.5 h1:JHGfMnQY+IEtGM63d+NGMjoRpysB2JBwDr5fsngwmJs= +github.com/jackc/pgx/v5 v5.7.5/go.mod h1:aruU7o91Tc2q2cFp5h4uP3f6ztExVpyVv88Xl/8Vl8M= +github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= +github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= +github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.11 h1:0OwqZRYI2rFrjS4kvkDnqJkKHdHaRnCm68/DY4OxRzU= +github.com/klauspost/cpuid/v2 v2.2.11/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= +github.com/marcboeker/go-duckdb/arrowmapping v0.0.9 h1:xj+kFOqR2gH3Mcxx9LmAVHebSnCiPm303N+uxfkWVmY= +github.com/marcboeker/go-duckdb/arrowmapping v0.0.9/go.mod h1:o56AqVS90v5bpxhPnOK9La7AfNTOrMORiqTQrlRbdPQ= +github.com/marcboeker/go-duckdb/mapping v0.0.10 h1:b/y2W8/hNlD0Dwjq0mCqIlLXpjQMnWy0WqDV9b9lHQQ= +github.com/marcboeker/go-duckdb/mapping v0.0.10/go.mod h1:Ro6Tw6sGG50O8S0daZsA8TrQJz/DvGrzGvMD7Jihirw= +github.com/marcboeker/go-duckdb/v2 v2.3.2 h1:96zG2JPyIhCFjHdBjjSpOdhzJzehoGTdl7LskkuMUTs= +github.com/marcboeker/go-duckdb/v2 v2.3.2/go.mod h1:VeXz9ZM6klNvICHrXEUzaHSgNqBeTdyMxr4CICw/UaY= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= +github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= +github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= +github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= +github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= +golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= +golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w= +golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= +golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= +golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= +golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= +golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= +golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo= +golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/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= diff --git a/src/syncer-common/logger.go b/src/common/logger_utils.go similarity index 74% rename from src/syncer-common/logger.go rename to src/common/logger_utils.go index 7ceaf04..af3d9a4 100644 --- a/src/syncer-common/logger.go +++ b/src/common/logger_utils.go @@ -22,29 +22,29 @@ var LOG_LEVELS = []string{ LOG_LEVEL_ERROR, } -func LogError(config *BaseConfig, message ...interface{}) { +func LogError(config *CommonConfig, message ...interface{}) { log.Println(append([]interface{}{"[ERROR]"}, message...)...) } -func LogWarn(config *BaseConfig, message ...interface{}) { +func LogWarn(config *CommonConfig, message ...interface{}) { if config.LogLevel != LOG_LEVEL_ERROR { log.Println(append([]interface{}{"[WARN]"}, message...)...) } } -func LogInfo(config *BaseConfig, message ...interface{}) { +func LogInfo(config *CommonConfig, message ...interface{}) { if config.LogLevel != LOG_LEVEL_ERROR && config.LogLevel != LOG_LEVEL_WARN { log.Println(append([]interface{}{"[INFO]"}, message...)...) } } -func LogDebug(config *BaseConfig, message ...interface{}) { +func LogDebug(config *CommonConfig, message ...interface{}) { if config.LogLevel == LOG_LEVEL_DEBUG || config.LogLevel == LOG_LEVEL_TRACE { log.Println(append([]interface{}{"[DEBUG]"}, message...)...) } } -func LogTrace(config *BaseConfig, message ...interface{}) { +func LogTrace(config *CommonConfig, message ...interface{}) { if config.LogLevel == LOG_LEVEL_TRACE { log.Println(append([]interface{}{"[TRACE]"}, message...)...) } diff --git a/src/server/postgres_client.go b/src/common/postgres_client.go similarity index 75% rename from src/server/postgres_client.go rename to src/common/postgres_client.go index 10316d7..d1d2516 100644 --- a/src/server/postgres_client.go +++ b/src/common/postgres_client.go @@ -1,12 +1,14 @@ -package main +package common import ( "context" + "io" "net/url" "strings" "time" "github.com/jackc/pgx/v5" + "github.com/jackc/pgx/v5/pgconn" ) const ( @@ -15,10 +17,10 @@ const ( type PostgresClient struct { Conn *pgx.Conn - Config *Config + Config *CommonConfig } -func NewPostgresClient(config *Config, databaseUrl string) *PostgresClient { +func NewPostgresClient(config *CommonConfig, databaseUrl string) *PostgresClient { ctx, cancel := context.WithTimeout(context.Background(), CONNECTION_TIMEOUT) defer cancel() @@ -46,6 +48,16 @@ func (client *PostgresClient) QueryRow(ctx context.Context, query string, args . return client.Conn.QueryRow(ctx, query, args...) } +func (client *PostgresClient) Exec(ctx context.Context, query string, args ...any) (pgconn.CommandTag, error) { + LogDebug(client.Config, "Postgres exec:", query) + return client.Conn.Exec(ctx, query, args...) +} + +func (client *PostgresClient) Copy(writer io.Writer, query string) (pgconn.CommandTag, error) { + LogDebug(client.Config, "Postgres copy:", query) + return client.Conn.PgConn().CopyTo(context.Background(), writer, query) +} + // Example: // - From postgres://username:pas$:wor^d#@host:port/database // - To postgres://username:pas%24%3Awor%5Ed%23@host:port/database diff --git a/src/common/s3_client.go b/src/common/s3_client.go new file mode 100644 index 0000000..dcc79b0 --- /dev/null +++ b/src/common/s3_client.go @@ -0,0 +1,124 @@ +package common + +import ( + "context" + "os" + "strings" + + "github.com/aws/aws-sdk-go-v2/aws" + awsConfig "github.com/aws/aws-sdk-go-v2/config" + "github.com/aws/aws-sdk-go-v2/credentials" + "github.com/aws/aws-sdk-go-v2/feature/s3/manager" + "github.com/aws/aws-sdk-go-v2/service/s3" + "github.com/aws/aws-sdk-go-v2/service/s3/types" +) + +type S3Client struct { + Config *CommonConfig + S3 *s3.Client +} + +func NewS3Client(Config *CommonConfig) *S3Client { + var awsConfigOptions = []func(*awsConfig.LoadOptions) error{ + awsConfig.WithRegion(Config.Aws.Region), + } + + if Config.LogLevel == LOG_LEVEL_TRACE { + awsConfigOptions = append(awsConfigOptions, awsConfig.WithClientLogMode(aws.LogRequest)) + } + + if IsLocalHost(Config.Aws.S3Endpoint) { + awsConfigOptions = append(awsConfigOptions, awsConfig.WithBaseEndpoint("http://"+Config.Aws.S3Endpoint)) + } else { + awsConfigOptions = append(awsConfigOptions, awsConfig.WithBaseEndpoint("https://"+Config.Aws.S3Endpoint)) + } + + awsCredentials := credentials.NewStaticCredentialsProvider( + Config.Aws.AccessKeyId, + Config.Aws.SecretAccessKey, + "", + ) + awsConfigOptions = append(awsConfigOptions, awsConfig.WithCredentialsProvider(awsCredentials)) + + loadedAwsConfig, err := awsConfig.LoadDefaultConfig(context.Background(), awsConfigOptions...) + PanicIfError(Config, err) + + s3 := s3.NewFromConfig(loadedAwsConfig, func(o *s3.Options) { + if Config.Aws.S3Endpoint != DEFAULT_AWS_S3_ENDPOINT { + o.UsePathStyle = true + } + }) + + return &S3Client{ + Config: Config, + S3: s3, + } +} + +// s3://bucket/some/path -> some/path +func (s3Client *S3Client) ObjectKey(objectPath string) string { + return strings.TrimPrefix(objectPath, "s3://"+s3Client.Config.Aws.S3Bucket+"/") +} + +func (s3Client *S3Client) HeadObject(fileKey string) *s3.HeadObjectOutput { + output, err := s3Client.S3.HeadObject(context.Background(), &s3.HeadObjectInput{ + Bucket: aws.String(s3Client.Config.Aws.S3Bucket), + Key: aws.String(fileKey), + }) + PanicIfError(s3Client.Config, err) + + return output +} + +func (s3Client *S3Client) DeleteObject(fileKey string) { + _, err := s3Client.S3.DeleteObject(context.Background(), &s3.DeleteObjectInput{ + Bucket: aws.String(s3Client.Config.Aws.S3Bucket), + Key: aws.String(fileKey), + }) + PanicIfError(s3Client.Config, err) +} + +func (s3Client *S3Client) GetObject(fileKey string) *s3.GetObjectOutput { + getObjectOutput, err := s3Client.S3.GetObject(context.Background(), &s3.GetObjectInput{ + Bucket: aws.String(s3Client.Config.Aws.S3Bucket), + Key: aws.String(fileKey), + }) + PanicIfError(s3Client.Config, err) + return getObjectOutput +} + +func (s3Client *S3Client) UploadObject(fileKey string, file *os.File) { + uploader := manager.NewUploader(s3Client.S3) + _, err := uploader.Upload(context.Background(), &s3.PutObjectInput{ + Bucket: aws.String(s3Client.Config.Aws.S3Bucket), + Key: aws.String(fileKey), + Body: file, + }) + PanicIfError(s3Client.Config, err) +} + +func (s3Client *S3Client) ListObjects(prefix string) *s3.ListObjectsV2Output { + listObjectsOutput, err := s3Client.S3.ListObjectsV2(context.Background(), &s3.ListObjectsV2Input{ + Bucket: aws.String(s3Client.Config.Aws.S3Bucket), + Prefix: aws.String(prefix), + }) + PanicIfError(s3Client.Config, err) + + return listObjectsOutput +} + +func (s3Client *S3Client) DeleteObjects(fileKeys []*string) { + objectsToDelete := make([]types.ObjectIdentifier, len(fileKeys)) + for i, fileKey := range fileKeys { + objectsToDelete[i] = types.ObjectIdentifier{Key: fileKey} + } + + _, err := s3Client.S3.DeleteObjects(context.Background(), &s3.DeleteObjectsInput{ + Bucket: aws.String(s3Client.Config.Aws.S3Bucket), + Delete: &types.Delete{ + Objects: objectsToDelete, + Quiet: aws.Bool(true), + }, + }) + PanicIfError(s3Client.Config, err) +} diff --git a/src/syncer-common/set.go b/src/common/set.go similarity index 100% rename from src/syncer-common/set.go rename to src/common/set.go diff --git a/src/common/utils.go b/src/common/utils.go new file mode 100644 index 0000000..1f2c994 --- /dev/null +++ b/src/common/utils.go @@ -0,0 +1,14 @@ +package common + +import ( + "strconv" + "strings" +) + +func IntToString(i int) string { + return strconv.Itoa(i) +} + +func IsLocalHost(host string) bool { + return strings.HasPrefix(host, "127.0.0.1") || strings.HasPrefix(host, "localhost") +} diff --git a/src/server/config.go b/src/server/config.go index 37a4309..51759b1 100644 --- a/src/server/config.go +++ b/src/server/config.go @@ -5,6 +5,8 @@ import ( "os" "slices" "strings" + + "github.com/BemiHQ/BemiDB/src/common" ) const ( @@ -16,17 +18,6 @@ const ( ENV_PASSWORD = "BEMIDB_PASSWORD" ENV_HOST = "BEMIDB_HOST" - ENV_LOG_LEVEL = "BEMIDB_LOG_LEVEL" - ENV_DISABLE_ANONYMOUS_ANALYTICS = "BEMIDB_DISABLE_ANONYMOUS_ANALYTICS" - - ENV_CATALOG_DATABASE_URL = "CATALOG_DATABASE_URL" - - ENV_AWS_REGION = "AWS_REGION" - ENV_AWS_S3_ENDPOINT = "AWS_S3_ENDPOINT" - ENV_AWS_S3_BUCKET = "AWS_S3_BUCKET" - ENV_AWS_ACCESS_KEY_ID = "AWS_ACCESS_KEY_ID" - ENV_AWS_SECRET_ACCESS_KEY = "AWS_SECRET_ACCESS_KEY" - DEFAULT_LOG_LEVEL = "INFO" DEFAULT_HOST = "0.0.0.0" DEFAULT_PORT = "54321" @@ -34,24 +25,13 @@ const ( DEFAULT_AWS_S3_ENDPOINT = "s3.amazonaws.com" ) -type AwsConfig struct { - Region string - S3Endpoint string // optional - S3Bucket string - AccessKeyId string - SecretAccessKey string -} - type Config struct { - Host string - Port string - Database string - User string - EncryptedPassword string - LogLevel string - CatalogDatabaseUrl string - Aws AwsConfig - DisableAnonymousAnalytics bool + CommonConfig *common.CommonConfig + Host string + Port string + Database string + User string + EncryptedPassword string } type configParseValues struct { @@ -66,62 +46,64 @@ func init() { } func registerFlags() { + _config.CommonConfig = &common.CommonConfig{} + + flag.StringVar(&_config.CommonConfig.LogLevel, "log-level", os.Getenv(common.ENV_LOG_LEVEL), `Log level: "ERROR", "WARN", "INFO", "DEBUG", "TRACE". Default: "`+common.DEFAULT_LOG_LEVEL+`"`) + flag.StringVar(&_config.CommonConfig.CatalogDatabaseUrl, "catalog-database-url", os.Getenv(common.ENV_CATALOG_DATABASE_URL), "Catalog database URL") + flag.StringVar(&_config.CommonConfig.Aws.Region, "aws-region", os.Getenv(common.ENV_AWS_REGION), "AWS region") + flag.StringVar(&_config.CommonConfig.Aws.S3Endpoint, "aws-s3-endpoint", os.Getenv(common.ENV_AWS_S3_ENDPOINT), "AWS S3 endpoint. Default: \""+common.DEFAULT_AWS_S3_ENDPOINT+`"`) + flag.StringVar(&_config.CommonConfig.Aws.S3Bucket, "aws-s3-bucket", os.Getenv(common.ENV_AWS_S3_BUCKET), "AWS S3 bucket name") + flag.StringVar(&_config.CommonConfig.Aws.AccessKeyId, "aws-access-key-id", os.Getenv(common.ENV_AWS_ACCESS_KEY_ID), "AWS access key ID") + flag.StringVar(&_config.CommonConfig.Aws.SecretAccessKey, "aws-secret-access-key", os.Getenv(common.ENV_AWS_SECRET_ACCESS_KEY), "AWS secret access key") + flag.BoolVar(&_config.CommonConfig.DisableAnonymousAnalytics, "disable-anonymous-analytics", os.Getenv(common.ENV_DISABLE_ANONYMOUS_ANALYTICS) == "true", "Disable anonymous analytics collection") + flag.StringVar(&_config.Host, "host", os.Getenv(ENV_HOST), "Host for BemiDB to listen on") flag.StringVar(&_config.Port, "port", os.Getenv(ENV_PORT), "Port for BemiDB to listen on") flag.StringVar(&_config.Database, "database", os.Getenv(ENV_DATABASE), "Database name") flag.StringVar(&_config.User, "user", os.Getenv(ENV_USER), "Database user") flag.StringVar(&_configParseValues.password, "password", os.Getenv(ENV_PASSWORD), "Database password") - flag.StringVar(&_config.LogLevel, "log-level", os.Getenv(ENV_LOG_LEVEL), "Log level: \"ERROR\", \"WARN\", \"INFO\", \"DEBUG\", \"TRACE\". Default: \""+DEFAULT_LOG_LEVEL+`"`) - flag.StringVar(&_config.CatalogDatabaseUrl, "catalog-database-url", os.Getenv(ENV_CATALOG_DATABASE_URL), "Catalog database URL") - flag.StringVar(&_config.Aws.Region, "aws-region", os.Getenv(ENV_AWS_REGION), "AWS region") - flag.StringVar(&_config.Aws.S3Endpoint, "aws-s3-endpoint", os.Getenv(ENV_AWS_S3_ENDPOINT), "AWS S3 endpoint. Default: \""+DEFAULT_AWS_S3_ENDPOINT+`"`) - flag.StringVar(&_config.Aws.S3Bucket, "aws-s3-bucket", os.Getenv(ENV_AWS_S3_BUCKET), "AWS S3 bucket name") - flag.StringVar(&_config.Aws.AccessKeyId, "aws-access-key-id", os.Getenv(ENV_AWS_ACCESS_KEY_ID), "AWS access key ID") - flag.StringVar(&_config.Aws.SecretAccessKey, "aws-secret-access-key", os.Getenv(ENV_AWS_SECRET_ACCESS_KEY), "AWS secret access key") - flag.BoolVar(&_config.DisableAnonymousAnalytics, "disable-anonymous-analytics", os.Getenv(ENV_DISABLE_ANONYMOUS_ANALYTICS) == "true", "Disable anonymous analytics collection") } func parseFlags() { flag.Parse() - if _config.Host == "" { - _config.Host = DEFAULT_HOST + if _config.CommonConfig.LogLevel == "" { + _config.CommonConfig.LogLevel = common.DEFAULT_LOG_LEVEL + } else if !slices.Contains(common.LOG_LEVELS, _config.CommonConfig.LogLevel) { + panic("Invalid log level " + _config.CommonConfig.LogLevel + ". Must be one of " + strings.Join(common.LOG_LEVELS, ", ")) } - if _config.Port == "" { - _config.Port = DEFAULT_PORT - } - if _config.Database == "" { - _config.Database = DEFAULT_DATABASE - } - if _configParseValues.password != "" { - _config.EncryptedPassword = StringToScramSha256(_configParseValues.password) - } - - if _config.LogLevel == "" { - _config.LogLevel = DEFAULT_LOG_LEVEL - } else if !slices.Contains(LOG_LEVELS, _config.LogLevel) { - panic("Invalid log level " + _config.LogLevel + ". Must be one of " + strings.Join(LOG_LEVELS, ", ")) - } - if _config.CatalogDatabaseUrl == "" { + if _config.CommonConfig.CatalogDatabaseUrl == "" { panic("Catalog database URL is required") } - - if _config.Aws.Region == "" { + if _config.CommonConfig.Aws.Region == "" { panic("AWS region is required") } - if _config.Aws.S3Endpoint == "" { - _config.Aws.S3Endpoint = DEFAULT_AWS_S3_ENDPOINT + if _config.CommonConfig.Aws.S3Endpoint == "" { + _config.CommonConfig.Aws.S3Endpoint = common.DEFAULT_AWS_S3_ENDPOINT } - if _config.Aws.S3Bucket == "" { + if _config.CommonConfig.Aws.S3Bucket == "" { panic("AWS S3 bucket name is required") } - if _config.Aws.AccessKeyId != "" && _config.Aws.SecretAccessKey == "" { + if _config.CommonConfig.Aws.AccessKeyId != "" && _config.CommonConfig.Aws.SecretAccessKey == "" { panic("AWS secret access key is required") } - if _config.Aws.AccessKeyId == "" && _config.Aws.SecretAccessKey != "" { + if _config.CommonConfig.Aws.AccessKeyId == "" && _config.CommonConfig.Aws.SecretAccessKey != "" { panic("AWS access key ID is required") } + if _config.Host == "" { + _config.Host = DEFAULT_HOST + } + if _config.Port == "" { + _config.Port = DEFAULT_PORT + } + if _config.Database == "" { + _config.Database = DEFAULT_DATABASE + } + if _configParseValues.password != "" { + _config.EncryptedPassword = StringToScramSha256(_configParseValues.password) + } + _configParseValues = configParseValues{} } diff --git a/src/server/custom_types.go b/src/server/custom_types.go index e03c9e6..4889031 100644 --- a/src/server/custom_types.go +++ b/src/server/custom_types.go @@ -7,41 +7,6 @@ import ( //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -type Set[T comparable] map[T]struct{} - -func NewSet[T comparable]() Set[T] { - set := make(Set[T]) - return set -} - -func (set Set[T]) Add(item T) Set[T] { - set[item] = struct{}{} - return set -} - -func (set Set[T]) AddAll(items []T) Set[T] { - for _, item := range items { - set.Add(item) - } - return set -} - -func (set Set[T]) Contains(item T) bool { - _, ok := set[item] - return ok -} - -func (set Set[T]) Values() []T { - values := make([]T, 0, len(set)) - for val := range set { - values = append(values, val) - } - - return values -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - type IcebergTableField struct { Name string Type string diff --git a/src/server/duckdb.go b/src/server/duckdb.go deleted file mode 100644 index a9a3589..0000000 --- a/src/server/duckdb.go +++ /dev/null @@ -1,153 +0,0 @@ -package main - -import ( - "context" - "database/sql" - "slices" - "strings" - - _ "github.com/marcboeker/go-duckdb/v2" -) - -const ( - DUCKDB_SCHEMA_MAIN = "main" -) - -var DUCKDB_INIT_BOOT_QUERIES = []string{ - // Set up Iceberg - "INSTALL iceberg", - "LOAD iceberg", - - // Set up schemas - "SELECT oid FROM pg_catalog.pg_namespace", - "CREATE SCHEMA public", - - // Configure DuckDB - "SET scalar_subquery_error_on_multiple_rows=false", - "SET timezone='UTC'", - "SET memory_limit='2GB'", -} - -type Duckdb struct { - db *sql.DB - config *Config - stopImplicitAwsCredentialsRefreshChan chan struct{} -} - -func NewDuckdb(config *Config, withPgCompatibility bool) *Duckdb { - ctx := context.Background() - db, err := sql.Open("duckdb", "") - PanicIfError(config, err) - - duckdb := &Duckdb{ - db: db, - config: config, - stopImplicitAwsCredentialsRefreshChan: make(chan struct{}), - } - - bootQueries := []string{} - if withPgCompatibility { - bootQueries = slices.Concat( - // Set up DuckDB - DUCKDB_INIT_BOOT_QUERIES, - - // Create pg-compatible functions - CreatePgCatalogMacroQueries(config), - CreateInformationSchemaMacroQueries(config), - - // Create pg-compatible tables and views - CreatePgCatalogTableQueries(config), - CreateInformationSchemaTableQueries(config), - - // Use the public schema - []string{"USE public"}, - ) - } - - for _, query := range bootQueries { - _, err := duckdb.ExecContext(ctx, query, nil) - PanicIfError(config, err) - } - - duckdb.setExplicitAwsCredentials(ctx) - - if IsLocalHost(config.Aws.S3Endpoint) { - _, err = duckdb.ExecContext(ctx, "SET s3_use_ssl=false", nil) - PanicIfError(config, err) - } - - if config.Aws.S3Endpoint != DEFAULT_AWS_S3_ENDPOINT { - // Use endpoint/bucket/key (path, deprecated on AWS) instead of bucket.endpoint/key (vhost) - _, err = duckdb.ExecContext(ctx, "SET s3_url_style='path'", nil) - PanicIfError(config, err) - } - - if config.LogLevel == LOG_LEVEL_TRACE { - _, err = duckdb.ExecContext(ctx, "PRAGMA enable_logging('HTTP')", nil) - PanicIfError(config, err) - _, err = duckdb.ExecContext(ctx, "SET logging_storage = 'stdout'", nil) - PanicIfError(config, err) - } - - return duckdb -} - -func (duckdb *Duckdb) ExecContext(ctx context.Context, query string, args map[string]string) (sql.Result, error) { - LogDebug(duckdb.config, "Querying DuckDB:", query) - return duckdb.db.ExecContext(ctx, replaceNamedStringArgs(query, args)) -} - -func (duckdb *Duckdb) QueryContext(ctx context.Context, query string) (*sql.Rows, error) { - LogDebug(duckdb.config, "Querying DuckDB:", query) - return duckdb.db.QueryContext(ctx, query) -} - -func (duckdb *Duckdb) PrepareContext(ctx context.Context, query string) (*sql.Stmt, error) { - LogDebug(duckdb.config, "Preparing DuckDB statement:", query) - return duckdb.db.PrepareContext(ctx, query) -} - -func (duckdb *Duckdb) Close() { - close(duckdb.stopImplicitAwsCredentialsRefreshChan) - duckdb.db.Close() -} - -func (duckdb *Duckdb) ExecTransactionContext(ctx context.Context, queries []string) error { - tx, err := duckdb.db.Begin() - LogDebug(duckdb.config, "Querying DuckDB: BEGIN") - if err != nil { - return err - } - - for _, query := range queries { - LogDebug(duckdb.config, "Querying DuckDB:", query) - _, err := tx.ExecContext(ctx, query) - if err != nil { - tx.Rollback() - return err - } - } - - LogDebug(duckdb.config, "Querying DuckDB: COMMIT") - return tx.Commit() -} - -func (duckdb *Duckdb) setExplicitAwsCredentials(ctx context.Context) { - config := duckdb.config - query := "CREATE OR REPLACE SECRET aws_s3_secret (TYPE S3, KEY_ID '$accessKeyId', SECRET '$secretAccessKey', REGION '$region', ENDPOINT '$endpoint', SCOPE '$s3Bucket')" - _, err := duckdb.ExecContext(ctx, query, map[string]string{ - "accessKeyId": config.Aws.AccessKeyId, - "secretAccessKey": config.Aws.SecretAccessKey, - "region": config.Aws.Region, - "endpoint": config.Aws.S3Endpoint, - "s3Bucket": "s3://" + config.Aws.S3Bucket, - }) - PanicIfError(config, err) -} - -func replaceNamedStringArgs(query string, args map[string]string) string { - for key, value := range args { - query = strings.ReplaceAll(query, "$"+key, value) - } - return query -} diff --git a/src/server/go.mod b/src/server/go.mod index f51e928..06c0c20 100644 --- a/src/server/go.mod +++ b/src/server/go.mod @@ -3,57 +3,59 @@ module github.com/BemiHQ/BemiDB/src/server go 1.24.4 require ( - github.com/aws/aws-sdk-go-v2 v1.32.3 - github.com/aws/aws-sdk-go-v2/config v1.28.1 - github.com/aws/aws-sdk-go-v2/credentials v1.17.42 - github.com/aws/aws-sdk-go-v2/service/s3 v1.66.2 + github.com/BemiHQ/BemiDB/src/common v0.0.1 github.com/google/uuid v1.6.0 - github.com/jackc/pgx/v5 v5.7.2 + github.com/jackc/pgx/v5 v5.7.5 github.com/marcboeker/go-duckdb/v2 v2.3.2 github.com/pganalyze/pg_query_go/v6 v6.1.0 ) -require golang.org/x/crypto v0.35.0 +replace github.com/BemiHQ/BemiDB/src/common => ../common require ( - github.com/apache/arrow-go/v18 v18.1.0 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.6 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.18 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.22 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.22 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.22 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.3 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.3 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.3 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.24.3 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.3 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.32.3 // indirect - github.com/aws/smithy-go v1.22.0 // indirect + github.com/apache/arrow-go/v18 v18.4.0 // indirect + github.com/aws/aws-sdk-go-v2 v1.37.0 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 // indirect + github.com/aws/aws-sdk-go-v2/config v1.30.1 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.18.1 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0 // indirect + github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.26.0 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.35.0 // indirect + github.com/aws/smithy-go v1.22.5 // indirect github.com/duckdb/duckdb-go-bindings v0.1.16 // indirect github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11 // indirect github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11 // indirect github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11 // indirect github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11 // indirect github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11 // indirect - github.com/go-viper/mapstructure/v2 v2.2.1 // indirect + github.com/go-viper/mapstructure/v2 v2.3.0 // indirect github.com/goccy/go-json v0.10.5 // indirect - github.com/google/flatbuffers v25.1.24+incompatible // indirect + github.com/google/flatbuffers v25.2.10+incompatible // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect - github.com/klauspost/compress v1.17.11 // indirect - github.com/klauspost/cpuid/v2 v2.2.9 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.11 // indirect github.com/marcboeker/go-duckdb/arrowmapping v0.0.9 // indirect github.com/marcboeker/go-duckdb/mapping v0.0.10 // indirect github.com/pierrec/lz4/v4 v4.1.22 // indirect github.com/zeebo/xxh3 v1.0.2 // indirect - golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c // indirect - golang.org/x/mod v0.22.0 // indirect - golang.org/x/sync v0.11.0 // indirect - golang.org/x/sys v0.30.0 // indirect - golang.org/x/text v0.22.0 // indirect - golang.org/x/tools v0.29.0 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.25.0 // indirect + golang.org/x/sync v0.15.0 // indirect + golang.org/x/sys v0.33.0 // indirect + golang.org/x/text v0.26.0 // indirect + golang.org/x/tools v0.34.0 // indirect golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect - google.golang.org/protobuf v1.36.1 // indirect + google.golang.org/protobuf v1.36.6 // indirect ) diff --git a/src/server/go.sum b/src/server/go.sum index c960dfc..3fe7d82 100644 --- a/src/server/go.sum +++ b/src/server/go.sum @@ -1,48 +1,50 @@ -github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA= -github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA= -github.com/apache/arrow-go/v18 v18.1.0 h1:agLwJUiVuwXZdwPYVrlITfx7bndULJ/dggbnLFgDp/Y= -github.com/apache/arrow-go/v18 v18.1.0/go.mod h1:tigU/sIgKNXaesf5d7Y95jBBKS5KsxTqYBKXFsvKzo0= -github.com/apache/thrift v0.21.0 h1:tdPmh/ptjE1IJnhbhrcl2++TauVjy242rkV/UzJChnE= -github.com/apache/thrift v0.21.0/go.mod h1:W1H8aR/QRtYNvrPeFXBtobyRkd0/YVhTc6i07XIAgDw= -github.com/aws/aws-sdk-go-v2 v1.32.3 h1:T0dRlFBKcdaUPGNtkBSwHZxrtis8CQU17UpNBZYd0wk= -github.com/aws/aws-sdk-go-v2 v1.32.3/go.mod h1:2SK5n0a2karNTv5tbP1SjsX0uhttou00v/HpXKM1ZUo= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.6 h1:pT3hpW0cOHRJx8Y0DfJUEQuqPild8jRGmSFmBgvydr0= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.6/go.mod h1:j/I2++U0xX+cr44QjHay4Cvxj6FUbnxrgmqN3H1jTZA= -github.com/aws/aws-sdk-go-v2/config v1.28.1 h1:oxIvOUXy8x0U3fR//0eq+RdCKimWI900+SV+10xsCBw= -github.com/aws/aws-sdk-go-v2/config v1.28.1/go.mod h1:bRQcttQJiARbd5JZxw6wG0yIK3eLeSCPdg6uqmmlIiI= -github.com/aws/aws-sdk-go-v2/credentials v1.17.42 h1:sBP0RPjBU4neGpIYyx8mkU2QqLPl5u9cmdTWVzIpHkM= -github.com/aws/aws-sdk-go-v2/credentials v1.17.42/go.mod h1:FwZBfU530dJ26rv9saAbxa9Ej3eF/AK0OAY86k13n4M= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.18 h1:68jFVtt3NulEzojFesM/WVarlFpCaXLKaBxDpzkQ9OQ= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.18/go.mod h1:Fjnn5jQVIo6VyedMc0/EhPpfNlPl7dHV916O6B+49aE= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.22 h1:Jw50LwEkVjuVzE1NzkhNKkBf9cRN7MtE1F/b2cOKTUM= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.22/go.mod h1:Y/SmAyPcOTmpeVaWSzSKiILfXTVJwrGmYZhcRbhWuEY= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.22 h1:981MHwBaRZM7+9QSR6XamDzF/o7ouUGxFzr+nVSIhrs= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.22/go.mod h1:1RA1+aBEfn+CAB/Mh0MB6LsdCYCnjZm7tKXtnk499ZQ= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.22 h1:yV+hCAHZZYJQcwAaszoBNwLbPItHvApxT0kVIw6jRgs= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.22/go.mod h1:kbR1TL8llqB1eGnVbybcA4/wgScxdylOdyAd51yxPdw= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0 h1:TToQNkvGguu209puTojY/ozlqy2d/SFNcoLIqTFi42g= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0/go.mod h1:0jp+ltwkf+SwG2fm/PKo8t4y8pJSgOCO4D8Lz3k0aHQ= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.3 h1:kT6BcZsmMtNkP/iYMcRG+mIEA/IbeiUimXtGmqF39y0= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.3/go.mod h1:Z8uGua2k4PPaGOYn66pK02rhMrot3Xk3tpBuUFPomZU= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.3 h1:qcxX0JYlgWH3hpPUnd6U0ikcl6LLA9sLkXE2w1fpMvY= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.3/go.mod h1:cLSNEmI45soc+Ef8K/L+8sEA3A3pYFEYf5B5UI+6bH4= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.3 h1:ZC7Y/XgKUxwqcdhO5LE8P6oGP1eh6xlQReWNKfhvJno= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.3/go.mod h1:WqfO7M9l9yUAw0HcHaikwRd/H6gzYdz7vjejCA5e2oY= -github.com/aws/aws-sdk-go-v2/service/s3 v1.66.2 h1:p9TNFL8bFUMd+38YIpTAXpoxyz0MxC7FlbFEH4P4E1U= -github.com/aws/aws-sdk-go-v2/service/s3 v1.66.2/go.mod h1:fNjyo0Coen9QTwQLWeV6WO2Nytwiu+cCcWaTdKCAqqE= -github.com/aws/aws-sdk-go-v2/service/sso v1.24.3 h1:UTpsIf0loCIWEbrqdLb+0RxnTXfWh2vhw4nQmFi4nPc= -github.com/aws/aws-sdk-go-v2/service/sso v1.24.3/go.mod h1:FZ9j3PFHHAR+w0BSEjK955w5YD2UwB/l/H0yAK3MJvI= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.3 h1:2YCmIXv3tmiItw0LlYf6v7gEHebLY45kBEnPezbUKyU= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.3/go.mod h1:u19stRyNPxGhj6dRm+Cdgu6N75qnbW7+QN0q0dsAk58= -github.com/aws/aws-sdk-go-v2/service/sts v1.32.3 h1:wVnQ6tigGsRqSWDEEyH6lSAJ9OyFUsSnbaUWChuSGzs= -github.com/aws/aws-sdk-go-v2/service/sts v1.32.3/go.mod h1:VZa9yTFyj4o10YGsmDO4gbQJUvvhY72fhumT8W4LqsE= -github.com/aws/smithy-go v1.22.0 h1:uunKnWlcoL3zO7q+gG2Pk53joueEOsnNB28QdMsmiMM= -github.com/aws/smithy-go v1.22.0/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= +github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= +github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= +github.com/apache/arrow-go/v18 v18.4.0 h1:/RvkGqH517iY8bZKc4FD5/kkdwXJGjxf28JIXbJ/oB0= +github.com/apache/arrow-go/v18 v18.4.0/go.mod h1:Aawvwhj8x2jURIzD9Moy72cF0FyJXOpkYpdmGRHcw14= +github.com/apache/thrift v0.22.0 h1:r7mTJdj51TMDe6RtcmNdQxgn9XcyfGDOzegMDRg47uc= +github.com/apache/thrift v0.22.0/go.mod h1:1e7J/O1Ae6ZQMTYdy9xa3w9k+XHWPfRvdPyJeynQ+/g= +github.com/aws/aws-sdk-go-v2 v1.37.0 h1:YtCOESR/pN4j5oA7cVHSfOwIcuh/KwHC4DOSXFbv5F0= +github.com/aws/aws-sdk-go-v2 v1.37.0/go.mod h1:9Q0OoGQoboYIAJyslFyF1f5K1Ryddop8gqMhWx/n4Wg= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 h1:6GMWV6CNpA/6fbFHnoAjrv4+LGfyTqZz2LtCHnspgDg= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0/go.mod h1:/mXlTIVG9jbxkqDnr5UQNQxW1HRYxeGklkM9vAFeabg= +github.com/aws/aws-sdk-go-v2/config v1.30.1 h1:sHL8g/+9tcZATeV2tEkEfxZeaNokDtKsSjGMGHD49qA= +github.com/aws/aws-sdk-go-v2/config v1.30.1/go.mod h1:wkibEyFfxXRyTSzRU4bbF5IUsSXyE4xQ4ZjkGmi5tFo= +github.com/aws/aws-sdk-go-v2/credentials v1.18.1 h1:E55xvOqlX7CvB66Z7rSM9usCrFU1ryUIUHqiXsEzVoE= +github.com/aws/aws-sdk-go-v2/credentials v1.18.1/go.mod h1:iobSQfR5MkvILxssGOvi/P1jjOhrRzfTiCPCzku0vx4= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0 h1:9sBTeKQwAvmJUWKIACIoiFSnxxl+sS++YDfr17/ngq0= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0/go.mod h1:LW9/PxQD1SYFC7pnWcgqPhoyZprhjEdg5hBK6qYPLW8= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1 h1:aAjA/1JZ1xH/F9XvxJu9cXZyp7BqVXtHpztyZ6p799E= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1/go.mod h1:ia9HASsPba/7o84sp6iE4wZPdNTJ0oicBe5sWQQk+Ys= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0 h1:H2iZoqW/v2Jnrh1FnU725Bq6KJ0k2uP63yH+DcY+HUI= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0/go.mod h1:L0FqLbwMXHvNC/7crWV1iIxUlOKYZUE8KuTIA+TozAI= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0 h1:EDped/rNzAhFPhVY0sDGbtD16OKqksfA8OjF/kLEgw8= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0/go.mod h1:uUI335jvzpZRPpjYx6ODc/wg1qH+NnoSTK/FwVeK0C0= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0 h1:iLvW/zOkHGU3BDU5thWnj+UZ9pjhuVhv1loLj7yVtBw= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0/go.mod h1:Fn3gvhdF1x5Rs9nUoCy/fJT1ms8f8dO7RqM9lJHuazQ= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 h1:6+lZi2JeGKtCraAj1rpoZfKqnQ9SptseRZioejfUOLM= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0/go.mod h1:eb3gfbVIxIoGgJsi9pGne19dhCBpK6opTYpQqAmdy44= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0 h1:qGyLBQPphYzUf+IIlb5tHnvg1U2Vc5hXPcP7oRSQfy0= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0/go.mod h1:g+dzKSLXiR/8ATkPXmLhPOI6rDdjLP3tngeo3FvDcIw= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0 h1:eRhU3Sh8dGbaniI6B+I48XJMrTPRkK4DKo+vqIxziOU= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0/go.mod h1:paNLV18DZ6FnWE/bd06RIKPDIFpjuvCkGKWTG/GDBeM= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0 h1:6jusT+XCcvnD+Elxvm7bUf5sCMTpZEp3AKjYQ4tWJSo= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0/go.mod h1:LimGpdIF/sTBdgqwOEkrArXLCoTamK/9L9x8IKBFTIc= +github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0 h1:gAV4NEp4A+JOrIdoXkAeyy6IOo7+X2s/jRuaHKYiMaU= +github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0/go.mod h1:JIQwK8sZ5MuKGm5rrFwp9MHUcyYEsQNpVixuPDlnwaU= +github.com/aws/aws-sdk-go-v2/service/sso v1.26.0 h1:cuFWHH87GP1NBGXXfMicUbE7Oty5KpPxN6w4JpmuxYc= +github.com/aws/aws-sdk-go-v2/service/sso v1.26.0/go.mod h1:aJBemdlbCKyOXEXdXBqS7E+8S9XTDcOTaoOjtng54hA= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0 h1:t2va+wewPOYIqC6XyJ4MGjiGKkczMAPsgq5W4FtL9ME= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0/go.mod h1:ExCTcqYqN0hYYRsDlBVU8+68grqlWdgX9/nZJwQW4aY= +github.com/aws/aws-sdk-go-v2/service/sts v1.35.0 h1:FD9agdG4CeOGS3ORLByJk56YIXDS7mxFpmZyCtpqExc= +github.com/aws/aws-sdk-go-v2/service/sts v1.35.0/go.mod h1:NDzDPbBF1xtSTZUMuZx0w3hIfWzcL7X2AQ0Tr9becIQ= +github.com/aws/smithy-go v1.22.5 h1:P9ATCXPMb2mPjYBgueqJNCA5S9UfktsW0tTxi+a7eqw= +github.com/aws/smithy-go v1.22.5/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= 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/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/duckdb/duckdb-go-bindings v0.1.16 h1:XPCk9hzP06PoWIxDPVU3gAy0m1XmLaZHTzLggNx/U9k= github.com/duckdb/duckdb-go-bindings v0.1.16/go.mod h1:pBnfviMzANT/9hi4bg+zW4ykRZZPCXlVuvBWEcZofkc= github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11 h1:GXQkG4HmEbwPtqCSabJTp9wZQQ7Gqr3KveLNesQWQOs= @@ -55,15 +57,15 @@ github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11 h1:j3B1biawuhtxe2Chkiqc github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11/go.mod h1:o7crKMpT2eOIi5/FY6HPqaXcvieeLSqdXXaXbruGX7w= github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11 h1:xR3vRE8y+48U6xDNkUlOfbl7/OTA7FVcDXJ+5vETuHU= github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11/go.mod h1:IlOhJdVKUJCAPj3QsDszUo8DVdvp1nBFp4TUJVdw99s= -github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= -github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.3.0 h1:27XbWsHIqhbdR5TIC911OfYvgSaW93HM+dX7970Q7jk= +github.com/go-viper/mapstructure/v2 v2.3.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/flatbuffers v25.1.24+incompatible h1:4wPqL3K7GzBd1CwyhSd3usxLKOaJN/AC6puCca6Jm7o= -github.com/google/flatbuffers v25.1.24+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= +github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/flatbuffers v25.2.10+incompatible h1:F3vclr7C3HpB1k9mxCGRMXq6FdUalZ6H/pNX4FP1v0Q= +github.com/google/flatbuffers v25.2.10+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= @@ -73,16 +75,16 @@ github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsI github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= -github.com/jackc/pgx/v5 v5.7.2 h1:mLoDLV6sonKlvjIEsV56SkWNCnuNv531l94GaIzO+XI= -github.com/jackc/pgx/v5 v5.7.2/go.mod h1:ncY89UGWxg82EykZUwSpUKEfccBGGYq1xjrOpsbsfGQ= +github.com/jackc/pgx/v5 v5.7.5 h1:JHGfMnQY+IEtGM63d+NGMjoRpysB2JBwDr5fsngwmJs= +github.com/jackc/pgx/v5 v5.7.5/go.mod h1:aruU7o91Tc2q2cFp5h4uP3f6ztExVpyVv88Xl/8Vl8M= github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= -github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= -github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= -github.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY= -github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.11 h1:0OwqZRYI2rFrjS4kvkDnqJkKHdHaRnCm68/DY4OxRzU= +github.com/klauspost/cpuid/v2 v2.2.11/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= github.com/marcboeker/go-duckdb/arrowmapping v0.0.9 h1:xj+kFOqR2gH3Mcxx9LmAVHebSnCiPm303N+uxfkWVmY= github.com/marcboeker/go-duckdb/arrowmapping v0.0.9/go.mod h1:o56AqVS90v5bpxhPnOK9La7AfNTOrMORiqTQrlRbdPQ= github.com/marcboeker/go-duckdb/mapping v0.0.10 h1:b/y2W8/hNlD0Dwjq0mCqIlLXpjQMnWy0WqDV9b9lHQQ= @@ -97,8 +99,9 @@ github.com/pganalyze/pg_query_go/v6 v6.1.0 h1:jG5ZLhcVgL1FAw4C/0VNQaVmX1SUJx71wB github.com/pganalyze/pg_query_go/v6 v6.1.0/go.mod h1:nvTHIuoud6e1SfrUaFwHqT0i4b5Nr+1rPWVds3B5+50= github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -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/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -108,29 +111,29 @@ github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= -golang.org/x/crypto v0.35.0 h1:b15kiHdrGCHrP6LvwaQ3c03kgNhhiMgvlhxHQhmg2Xs= -golang.org/x/crypto v0.35.0/go.mod h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0YQ= -golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c h1:KL/ZBHXgKGVmuZBZ01Lt57yE5ws8ZPSkkihmEyq7FXc= -golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c/go.mod h1:tujkw807nyEEAamNbDrEGzRav+ilXA7PCRAd6xsmwiU= -golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= -golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= -golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= -golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= -golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= -golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= -golang.org/x/tools v0.29.0 h1:Xx0h3TtM9rzQpQuR4dKLrdglAmCEN5Oi+P74JdhdzXE= -golang.org/x/tools v0.29.0/go.mod h1:KMQVMRsVxU6nHCFXrBPhDB8XncLNLM0lIy/F14RP588= +golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= +golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w= +golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= +golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= +golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= +golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= +golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= +golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo= +golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -gonum.org/v1/gonum v0.15.1 h1:FNy7N6OUZVUaWG9pTiD+jlhdQ3lMP+/LcTpJ6+a8sQ0= -gonum.org/v1/gonum v0.15.1/go.mod h1:eZTZuRFrzu5pcyjN5wJhcIhnUdNijYxX1T2IcrOGY0o= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.36.1 h1:yBPeRvTftaleIgM3PZ/WBIZ7XM/eEYAaEyCwvyjq/gk= -google.golang.org/protobuf v1.36.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= +google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/src/server/iceberg_catalog.go b/src/server/iceberg_catalog.go index 5d5eedd..0e15b8b 100644 --- a/src/server/iceberg_catalog.go +++ b/src/server/iceberg_catalog.go @@ -3,6 +3,8 @@ package main import ( "context" "fmt" + + "github.com/BemiHQ/BemiDB/src/common" ) const ( @@ -28,7 +30,7 @@ func NewIcebergCatalog(config *Config) *IcebergCatalog { } func (catalog *IcebergCatalog) Schemas() ([]string, error) { - pgClient := catalog.newPgClient() + pgClient := catalog.newPostgresClient() defer pgClient.Close() ctx := context.Background() @@ -50,8 +52,8 @@ func (catalog *IcebergCatalog) Schemas() ([]string, error) { return schemas, nil } -func (catalog *IcebergCatalog) SchemaTables() (Set[IcebergSchemaTable], error) { - pgClient := catalog.newPgClient() +func (catalog *IcebergCatalog) SchemaTables() (common.Set[IcebergSchemaTable], error) { + pgClient := catalog.newPostgresClient() defer pgClient.Close() ctx := context.Background() @@ -61,7 +63,7 @@ func (catalog *IcebergCatalog) SchemaTables() (Set[IcebergSchemaTable], error) { } defer rows.Close() - schemaTables := make(Set[IcebergSchemaTable]) + schemaTables := make(common.Set[IcebergSchemaTable]) for rows.Next() { var schema, table string err := rows.Scan(&schema, &table) @@ -74,7 +76,7 @@ func (catalog *IcebergCatalog) SchemaTables() (Set[IcebergSchemaTable], error) { } func (catalog *IcebergCatalog) MetadataFilePath(t IcebergSchemaTable) string { - pgClient := catalog.newPgClient() + pgClient := catalog.newPostgresClient() defer pgClient.Close() ctx := context.Background() @@ -82,11 +84,11 @@ func (catalog *IcebergCatalog) MetadataFilePath(t IcebergSchemaTable) string { var path string err := row.Scan(&path) - PanicIfError(nil, err) + common.PanicIfError(catalog.Config.CommonConfig, err) return path } -func (catalog *IcebergCatalog) newPgClient() *PostgresClient { - return NewPostgresClient(catalog.Config, catalog.Config.CatalogDatabaseUrl) +func (catalog *IcebergCatalog) newPostgresClient() *common.PostgresClient { + return common.NewPostgresClient(catalog.Config.CommonConfig, catalog.Config.CommonConfig.CatalogDatabaseUrl) } diff --git a/src/server/iceberg_reader.go b/src/server/iceberg_reader.go index e70c9ae..5ef880b 100644 --- a/src/server/iceberg_reader.go +++ b/src/server/iceberg_reader.go @@ -1,5 +1,9 @@ package main +import ( + "github.com/BemiHQ/BemiDB/src/common" +) + type IcebergReader struct { Config *Config Storage *StorageS3 @@ -18,13 +22,13 @@ func (reader *IcebergReader) Schemas() (icebergSchemas []string, err error) { return reader.Catalog.Schemas() } -func (reader *IcebergReader) SchemaTables() (icebergSchemaTables Set[IcebergSchemaTable], err error) { +func (reader *IcebergReader) SchemaTables() (icebergSchemaTables common.Set[IcebergSchemaTable], err error) { return reader.Catalog.SchemaTables() } func (reader *IcebergReader) TableFields(icebergSchemaTable IcebergSchemaTable) (icebergTableFields []IcebergTableField, err error) { metadataPath := reader.MetadataFilePath(icebergSchemaTable) - LogDebug(reader.Config, "Reading Iceberg table "+icebergSchemaTable.String()+" fields from "+metadataPath+" ...") + common.LogDebug(reader.Config.CommonConfig, "Reading Iceberg table "+icebergSchemaTable.String()+" fields from "+metadataPath+" ...") return reader.Storage.IcebergTableFields(metadataPath) } diff --git a/src/server/logger.go b/src/server/logger.go deleted file mode 100644 index ed1a416..0000000 --- a/src/server/logger.go +++ /dev/null @@ -1,51 +0,0 @@ -package main - -import ( - "log" -) - -type LogLevel string - -const ( - LOG_LEVEL_TRACE = "TRACE" - LOG_LEVEL_DEBUG = "DEBUG" - LOG_LEVEL_WARN = "WARN" - LOG_LEVEL_INFO = "INFO" - LOG_LEVEL_ERROR = "ERROR" -) - -var LOG_LEVELS = []string{ - LOG_LEVEL_TRACE, - LOG_LEVEL_DEBUG, - LOG_LEVEL_WARN, - LOG_LEVEL_INFO, - LOG_LEVEL_ERROR, -} - -func LogError(config *Config, message ...interface{}) { - log.Println(append([]interface{}{"[ERROR]"}, message...)...) -} - -func LogWarn(config *Config, message ...interface{}) { - if config.LogLevel != LOG_LEVEL_ERROR { - log.Println(append([]interface{}{"[WARN]"}, message...)...) - } -} - -func LogInfo(config *Config, message ...interface{}) { - if config.LogLevel != LOG_LEVEL_ERROR && config.LogLevel != LOG_LEVEL_WARN { - log.Println(append([]interface{}{"[INFO]"}, message...)...) - } -} - -func LogDebug(config *Config, message ...interface{}) { - if config.LogLevel == LOG_LEVEL_DEBUG || config.LogLevel == LOG_LEVEL_TRACE { - log.Println(append([]interface{}{"[DEBUG]"}, message...)...) - } -} - -func LogTrace(config *Config, message ...interface{}) { - if config.LogLevel == LOG_LEVEL_TRACE { - log.Println(append([]interface{}{"[TRACE]"}, message...)...) - } -} diff --git a/src/server/main.go b/src/server/main.go index 8237cbf..13fafba 100644 --- a/src/server/main.go +++ b/src/server/main.go @@ -4,55 +4,79 @@ import ( "log" "net/http" _ "net/http/pprof" + "slices" + + "github.com/BemiHQ/BemiDB/src/common" ) const ( COMMAND_START = "start" COMMAND_VERSION = "version" + + DUCKDB_SCHEMA_MAIN = "main" ) func main() { config := LoadConfig() - defer handlePanic(config) + defer common.HandleUnexpectedPanic(config.CommonConfig) - if config.LogLevel == LOG_LEVEL_TRACE { + if config.CommonConfig.LogLevel == common.LOG_LEVEL_TRACE { go enableProfiling() } tcpListener := NewTcpListener(config) - LogInfo(config, "BemiDB: Listening on", tcpListener.Addr()) + common.LogInfo(config.CommonConfig, "BemiDB: Listening on", tcpListener.Addr()) - duckdb := NewDuckdb(config, true) - LogInfo(config, "DuckDB: Connected") - defer duckdb.Close() + duckdbClient := common.NewDuckdbClient(config.CommonConfig, duckdbBootQueris(config)) + common.LogInfo(config.CommonConfig, "DuckDB: Connected") + defer duckdbClient.Close() catalog := NewIcebergCatalog(config) icebergReader := NewIcebergReader(config, catalog) - queryHandler := NewQueryHandler(config, duckdb, icebergReader) + queryHandler := NewQueryHandler(config, duckdbClient, icebergReader) for { conn := AcceptConnection(config, tcpListener) - LogInfo(config, "BemiDB: Accepted connection from", conn.RemoteAddr()) + common.LogInfo(config.CommonConfig, "BemiDB: Accepted connection from", conn.RemoteAddr()) server := NewPostgresServer(config, &conn) go func() { server.Run(queryHandler) defer server.Close() - LogInfo(config, "BemiDB: Closed connection from", conn.RemoteAddr()) + common.LogInfo(config.CommonConfig, "BemiDB: Closed connection from", conn.RemoteAddr()) }() } } -func enableProfiling() { - func() { log.Println(http.ListenAndServe(":6060", nil)) }() +func duckdbBootQueris(config *Config) []string { + return slices.Concat( + []string{ + // Set up Iceberg + "INSTALL iceberg", + "LOAD iceberg", + + // Set up schemas + "SELECT oid FROM pg_catalog.pg_namespace", + "CREATE SCHEMA public", + + // Configure DuckDB + "SET scalar_subquery_error_on_multiple_rows=false", + }, + + // Create pg-compatible functions + CreatePgCatalogMacroQueries(config), + CreateInformationSchemaMacroQueries(config), + + // Create pg-compatible tables and views + CreatePgCatalogTableQueries(config), + CreateInformationSchemaTableQueries(config), + + // Use the public schema + []string{"USE public"}, + ) } -func handlePanic(config *Config) { - func() { - if r := recover(); r != nil { - err, _ := r.(error) - HandleUnexpectedError(config, err) - } - }() +func enableProfiling() { + func() { log.Println(http.ListenAndServe(":6060", nil)) }() } diff --git a/src/server/parser_function.go b/src/server/parser_function.go index aff6418..99dce95 100644 --- a/src/server/parser_function.go +++ b/src/server/parser_function.go @@ -4,6 +4,8 @@ import ( "strings" pgQuery "github.com/pganalyze/pg_query_go/v6" + + "github.com/BemiHQ/BemiDB/src/common" ) type ParserFunction struct { @@ -66,7 +68,7 @@ func (parser *ParserFunction) RemapSchemaToMain(functionCall *pgQuery.FuncCall) func (parser *ParserFunction) RemapFormatToPrintf(functionCall *pgQuery.FuncCall) *pgQuery.FuncCall { format := parser.FirstArgumentToString(functionCall) for i := range functionCall.Args[1:] { - format = strings.Replace(format, "%s", "%"+IntToString(i+1)+"$s", 1) + format = strings.Replace(format, "%s", "%"+common.IntToString(i+1)+"$s", 1) } functionCall.Funcname = []*pgQuery.Node{pgQuery.MakeStrNode("printf")} diff --git a/src/server/parser_utils.go b/src/server/parser_utils.go index 3e12cf9..8fddabc 100644 --- a/src/server/parser_utils.go +++ b/src/server/parser_utils.go @@ -2,6 +2,8 @@ package main import ( pgQuery "github.com/pganalyze/pg_query_go/v6" + + "github.com/BemiHQ/BemiDB/src/common" ) type ParserUtils struct { @@ -25,7 +27,7 @@ func (utils *ParserUtils) SchemaFunction(functionCall *pgQuery.FuncCall) *QueryS Function: functionCall.Funcname[1].GetString_().Sval, } default: - Panic(utils.config, "Invalid function call") + common.Panic(utils.config.CommonConfig, "Invalid function call") return nil } } diff --git a/src/server/pg_constants.go b/src/server/pg_constants.go index d4f5515..6316f9d 100644 --- a/src/server/pg_constants.go +++ b/src/server/pg_constants.go @@ -1,5 +1,9 @@ package main +import ( + "github.com/BemiHQ/BemiDB/src/common" +) + const ( PG_SCHEMA_INFORMATION_SCHEMA = "information_schema" PG_SCHEMA_PG_CATALOG = "pg_catalog" @@ -15,7 +19,7 @@ const ( PG_VAR_SEARCH_PATH = "search_path" ) -var PG_SYSTEM_TABLES = NewSet[string]().AddAll([]string{ +var PG_SYSTEM_TABLES = common.NewSet[string]().AddAll([]string{ "pg_aggregate", "pg_am", "pg_amop", @@ -88,7 +92,7 @@ var PG_SYSTEM_TABLES = NewSet[string]().AddAll([]string{ "pg_views", }) -var PG_SYSTEM_VIEWS = NewSet[string]().AddAll([]string{ +var PG_SYSTEM_VIEWS = common.NewSet[string]().AddAll([]string{ "pg_stat_activity", "pg_stat_replication", "pg_stat_wal_receiver", diff --git a/src/server/postgres_server.go b/src/server/postgres_server.go index d2e7a08..fba0e6e 100644 --- a/src/server/postgres_server.go +++ b/src/server/postgres_server.go @@ -5,6 +5,8 @@ import ( "net" "github.com/jackc/pgx/v5/pgproto3" + + "github.com/BemiHQ/BemiDB/src/common" ) const ( @@ -32,7 +34,7 @@ func NewPostgresServer(config *Config, conn *net.Conn) *PostgresServer { func NewTcpListener(config *Config) net.Listener { parsedIp := net.ParseIP(config.Host) if parsedIp == nil { - PrintErrorAndExit(config, "Invalid host: "+config.Host+".") + common.PrintErrorAndExit(config.CommonConfig, "Invalid host: "+config.Host+".") } var network, host string @@ -45,20 +47,20 @@ func NewTcpListener(config *Config) net.Listener { } tcpListener, err := net.Listen(network, host+":"+config.Port) - PanicIfError(config, err) + common.PanicIfError(config.CommonConfig, err) return tcpListener } func AcceptConnection(config *Config, listener net.Listener) net.Conn { conn, err := listener.Accept() - PanicIfError(config, err) + common.PanicIfError(config.CommonConfig, err) return conn } func (server *PostgresServer) Run(queryHandler *QueryHandler) { err := server.handleStartup() if err != nil { - LogError(server.config, "Error handling startup:", err) + common.LogError(server.config.CommonConfig, "Error handling startup:", err) return // Terminate connection } @@ -77,10 +79,10 @@ func (server *PostgresServer) Run(queryHandler *QueryHandler) { return // Terminate connection } case *pgproto3.Terminate: - LogDebug(server.config, "Client terminated connection") + common.LogDebug(server.config.CommonConfig, "Client terminated connection") return default: - LogError(server.config, "Received message other than Query from client:", message) + common.LogError(server.config.CommonConfig, "Received message other than Query from client:", message) return // Terminate connection } } @@ -91,7 +93,7 @@ func (server *PostgresServer) Close() error { } func (server *PostgresServer) handleSimpleQuery(queryHandler *QueryHandler, queryMessage *pgproto3.Query) { - LogDebug(server.config, "Received query:", queryMessage.String) + common.LogDebug(server.config.CommonConfig, "Received query:", queryMessage.String) messages, err := queryHandler.HandleSimpleQuery(queryMessage.String) if err != nil { server.writeError(err) @@ -102,7 +104,7 @@ func (server *PostgresServer) handleSimpleQuery(queryHandler *QueryHandler, quer } func (server *PostgresServer) handleExtendedQuery(queryHandler *QueryHandler, parseMessage *pgproto3.Parse) error { - LogDebug(server.config, "Parsing query", parseMessage.Query) + common.LogDebug(server.config.CommonConfig, "Parsing query", parseMessage.Query) messages, preparedStatement, err := queryHandler.HandleParseQuery(parseMessage) if err != nil { server.writeError(err) @@ -123,7 +125,7 @@ func (server *PostgresServer) handleExtendedQuery(queryHandler *QueryHandler, pa continue } - LogDebug(server.config, "Binding query", message.PreparedStatement) + common.LogDebug(server.config.CommonConfig, "Binding query", message.PreparedStatement) messages, preparedStatement, err = queryHandler.HandleBindQuery(message, preparedStatement) if err != nil { server.writeError(err) @@ -135,7 +137,7 @@ func (server *PostgresServer) handleExtendedQuery(queryHandler *QueryHandler, pa continue } - LogDebug(server.config, "Describing query", message.Name, "("+string(message.ObjectType)+")") + common.LogDebug(server.config.CommonConfig, "Describing query", message.Name, "("+string(message.ObjectType)+")") var messages []pgproto3.Message messages, preparedStatement, err = queryHandler.HandleDescribeQuery(message, preparedStatement) if err != nil { @@ -148,7 +150,7 @@ func (server *PostgresServer) handleExtendedQuery(queryHandler *QueryHandler, pa continue } - LogDebug(server.config, "Executing query", message.Portal) + common.LogDebug(server.config.CommonConfig, "Executing query", message.Portal) messages, err := queryHandler.HandleExecuteQuery(message, preparedStatement) if err != nil { server.writeError(err) @@ -156,7 +158,7 @@ func (server *PostgresServer) handleExtendedQuery(queryHandler *QueryHandler, pa } server.writeMessages(messages...) case *pgproto3.Sync: - LogDebug(server.config, "Syncing query") + common.LogDebug(server.config.CommonConfig, "Syncing query") server.writeMessages( &pgproto3.ReadyForQuery{TxStatus: PG_TX_STATUS_IDLE}, ) @@ -181,7 +183,7 @@ func (server *PostgresServer) writeMessages(messages ...pgproto3.Message) { } func (server *PostgresServer) writeError(err error) { - LogError(server.config, err.Error()) + common.LogError(server.config.CommonConfig, err.Error()) server.writeMessages( &pgproto3.ErrorResponse{ @@ -201,7 +203,7 @@ func (server *PostgresServer) handleStartup() error { switch startupMessage := startupMessage.(type) { case *pgproto3.StartupMessage: params := startupMessage.Parameters - LogDebug(server.config, "BemiDB: startup message", params) + common.LogDebug(server.config.CommonConfig, "BemiDB: startup message", params) if params["database"] != server.config.Database { server.writeError(errors.New("database " + params["database"] + " does not exist")) diff --git a/src/server/query_handler.go b/src/server/query_handler.go index 0d29d8f..8b33983 100644 --- a/src/server/query_handler.go +++ b/src/server/query_handler.go @@ -10,6 +10,8 @@ import ( "github.com/google/uuid" "github.com/jackc/pgx/v5/pgproto3" "github.com/jackc/pgx/v5/pgtype" + + "github.com/BemiHQ/BemiDB/src/common" ) const ( @@ -18,10 +20,10 @@ const ( ) type QueryHandler struct { - duckdb *Duckdb - icebergReader *IcebergReader - queryRemapper *QueryRemapper - config *Config + Config *Config + DuckdbClient *common.DuckdbClient + IcebergReader *IcebergReader + QueryRemapper *QueryRemapper ResponseHandler *ResponseHandler } @@ -45,12 +47,12 @@ type PreparedStatement struct { Rows *sql.Rows } -func NewQueryHandler(config *Config, duckdb *Duckdb, icebergReader *IcebergReader) *QueryHandler { +func NewQueryHandler(config *Config, duckdbClient *common.DuckdbClient, icebergReader *IcebergReader) *QueryHandler { queryHandler := &QueryHandler{ - duckdb: duckdb, - icebergReader: icebergReader, - queryRemapper: NewQueryRemapper(config, icebergReader, duckdb), - config: config, + Config: config, + DuckdbClient: duckdbClient, + IcebergReader: icebergReader, + QueryRemapper: NewQueryRemapper(config, icebergReader, duckdbClient), ResponseHandler: NewResponseHandler(config), } @@ -60,7 +62,7 @@ func NewQueryHandler(config *Config, duckdb *Duckdb, icebergReader *IcebergReade } func (queryHandler *QueryHandler) HandleSimpleQuery(originalQuery string) ([]pgproto3.Message, error) { - queryStatements, originalQueryStatements, err := queryHandler.queryRemapper.ParseAndRemapQuery(originalQuery) + queryStatements, originalQueryStatements, err := queryHandler.QueryRemapper.ParseAndRemapQuery(originalQuery) if err != nil { return nil, err } @@ -71,12 +73,12 @@ func (queryHandler *QueryHandler) HandleSimpleQuery(originalQuery string) ([]pgp var queriesMessages []pgproto3.Message for i, queryStatement := range queryStatements { - rows, err := queryHandler.duckdb.QueryContext(context.Background(), queryStatement) + rows, err := queryHandler.DuckdbClient.QueryContext(context.Background(), queryStatement) if err != nil { errorMessage := err.Error() if errorMessage == "Binder Error: UNNEST requires a single list as input" { - // https://github.com/duckdb/duckdb/issues/11693 - LogWarn(queryHandler.config, "Couldn't handle query via DuckDB:", queryStatement+"\n"+err.Error()) + // https://github.com/duckdbClient/duckdb/issues/11693 + common.LogWarn(queryHandler.Config.CommonConfig, "Couldn't handle query via DuckDB:", queryStatement+"\n"+err.Error()) queriesMsgs, err := queryHandler.HandleSimpleQuery(FALLBACK_SQL_QUERY) // self-recursion if err != nil { return nil, err @@ -110,7 +112,7 @@ func (queryHandler *QueryHandler) HandleSimpleQuery(originalQuery string) ([]pgp func (queryHandler *QueryHandler) HandleParseQuery(message *pgproto3.Parse) ([]pgproto3.Message, *PreparedStatement, error) { ctx := context.Background() originalQuery := string(message.Query) - queryStatements, _, err := queryHandler.queryRemapper.ParseAndRemapQuery(originalQuery) + queryStatements, _, err := queryHandler.QueryRemapper.ParseAndRemapQuery(originalQuery) if err != nil { return nil, nil, err } @@ -129,7 +131,7 @@ func (queryHandler *QueryHandler) HandleParseQuery(message *pgproto3.Parse) ([]p query := queryStatements[0] preparedStatement.Query = query - statement, err := queryHandler.duckdb.PrepareContext(ctx, query) + statement, err := queryHandler.DuckdbClient.PrepareContext(ctx, query) preparedStatement.Statement = statement if err != nil { return nil, nil, err @@ -171,7 +173,7 @@ func (queryHandler *QueryHandler) HandleBindQuery(message *pgproto3.Bind, prepar } } - LogDebug(queryHandler.config, "Bound variables:", variables) + common.LogDebug(queryHandler.Config.CommonConfig, "Bound variables:", variables) preparedStatement.Bound = true preparedStatement.Variables = variables preparedStatement.Portal = message.DestinationPortal @@ -235,16 +237,16 @@ func (queryHandler *QueryHandler) HandleExecuteQuery(message *pgproto3.Execute, func (queryHandler *QueryHandler) createSchemas() { ctx := context.Background() - schemas, err := queryHandler.icebergReader.Schemas() - PanicIfError(queryHandler.config, err) + schemas, err := queryHandler.IcebergReader.Schemas() + common.PanicIfError(queryHandler.Config.CommonConfig, err) for _, schema := range schemas { - _, err := queryHandler.duckdb.ExecContext( + _, err := queryHandler.DuckdbClient.ExecContext( ctx, "CREATE SCHEMA IF NOT EXISTS \"$schema\"", map[string]string{"schema": schema}, ) - PanicIfError(queryHandler.config, err) + common.PanicIfError(queryHandler.Config.CommonConfig, err) } } @@ -303,7 +305,7 @@ func (queryHandler *QueryHandler) generateRowDescription(cols []*sql.ColumnType) typeIod := queryHandler.ResponseHandler.ColumnDescriptionTypeOid(col) if col.Name() == "Success" && typeIod == pgtype.BoolOID && len(cols) == 1 { - // Skip the "Success" DuckDB column returned from SET ... commands + // Skip the "Success" DuckDBClient column returned from SET ... commands return nil } diff --git a/src/server/query_handler_test.go b/src/server/query_handler_test.go index c3a379b..75f60f7 100644 --- a/src/server/query_handler_test.go +++ b/src/server/query_handler_test.go @@ -12,11 +12,13 @@ import ( "github.com/google/uuid" "github.com/jackc/pgx/v5/pgproto3" "github.com/jackc/pgx/v5/pgtype" + + "github.com/BemiHQ/BemiDB/src/common" ) func TestHandleQuery(t *testing.T) { queryHandler := initQueryHandler() - defer queryHandler.duckdb.Close() + defer queryHandler.DuckdbClient.Close() t.Run("PG functions", func(t *testing.T) { testResponseByQuery(t, queryHandler, map[string]map[string][]string{ @@ -1256,7 +1258,7 @@ func TestHandleQuery(t *testing.T) { func TestHandleParseQuery(t *testing.T) { queryHandler := initQueryHandler() - defer queryHandler.duckdb.Close() + defer queryHandler.DuckdbClient.Close() t.Run("Handles PARSE extended query step", func(t *testing.T) { query := "SELECT usename, passwd FROM pg_shadow WHERE usename=$1" @@ -1299,7 +1301,7 @@ func TestHandleParseQuery(t *testing.T) { func TestHandleBindQuery(t *testing.T) { queryHandler := initQueryHandler() - defer queryHandler.duckdb.Close() + defer queryHandler.DuckdbClient.Close() t.Run("Handles BIND extended query step with text format parameter", func(t *testing.T) { parseMessage := &pgproto3.Parse{Query: "SELECT usename, passwd FROM pg_shadow WHERE usename=$1"} @@ -1407,7 +1409,7 @@ func TestHandleBindQuery(t *testing.T) { func TestHandleDescribeQuery(t *testing.T) { queryHandler := initQueryHandler() - defer queryHandler.duckdb.Close() + defer queryHandler.DuckdbClient.Close() t.Run("Handles DESCRIBE extended query step", func(t *testing.T) { query := "SELECT usename, passwd FROM pg_shadow WHERE usename=$1" @@ -1461,7 +1463,7 @@ func TestHandleDescribeQuery(t *testing.T) { func TestHandleExecuteQuery(t *testing.T) { queryHandler := initQueryHandler() - defer queryHandler.duckdb.Close() + defer queryHandler.DuckdbClient.Close() t.Run("Handles EXECUTE extended query step", func(t *testing.T) { query := "SELECT usename, split_part(passwd, ':', 1) FROM pg_shadow WHERE usename=$1" @@ -1503,7 +1505,7 @@ func TestHandleExecuteQuery(t *testing.T) { func TestHandleMultipleQueries(t *testing.T) { queryHandler := initQueryHandler() - defer queryHandler.duckdb.Close() + defer queryHandler.DuckdbClient.Close() t.Run("Handles multiple SET statements", func(t *testing.T) { query := `SET client_encoding TO 'UTF8'; @@ -1582,16 +1584,16 @@ SET standard_conforming_strings = on;` func initQueryHandler() *QueryHandler { config := loadTestConfig() - duckdb := NewDuckdb(config, true) + duckdbClient := common.NewDuckdbClient(config.CommonConfig, duckdbBootQueris(config)) catalog := NewIcebergCatalog(config) icebergReader := NewIcebergReader(config, catalog) - return NewQueryHandler(config, duckdb, icebergReader) + return NewQueryHandler(config, duckdbClient, icebergReader) } func loadTestConfig() *Config { setTestArgs([]string{}) - _config.DisableAnonymousAnalytics = true + _config.CommonConfig.DisableAnonymousAnalytics = true return LoadConfig() } diff --git a/src/server/query_remapper.go b/src/server/query_remapper.go index 32c6c4e..efb9880 100644 --- a/src/server/query_remapper.go +++ b/src/server/query_remapper.go @@ -6,13 +6,15 @@ import ( "strings" pgQuery "github.com/pganalyze/pg_query_go/v6" + + "github.com/BemiHQ/BemiDB/src/common" ) -var SUPPORTED_SET_STATEMENTS = NewSet[string]().AddAll([]string{ +var SUPPORTED_SET_STATEMENTS = common.NewSet[string]().AddAll([]string{ "timezone", // SET SESSION timezone TO 'UTC' }) -var KNOWN_SET_STATEMENTS = NewSet[string]().AddAll([]string{ +var KNOWN_SET_STATEMENTS = common.NewSet[string]().AddAll([]string{ "client_encoding", // SET client_encoding TO 'UTF8' "client_min_messages", // SET client_min_messages TO 'warning' "standard_conforming_strings", // SET standard_conforming_strings = on @@ -36,10 +38,10 @@ type QueryRemapper struct { config *Config } -func NewQueryRemapper(config *Config, icebergReader *IcebergReader, duckdb *Duckdb) *QueryRemapper { +func NewQueryRemapper(config *Config, icebergReader *IcebergReader, duckdbClient *common.DuckdbClient) *QueryRemapper { return &QueryRemapper{ parserTypeCast: NewParserTypeCast(config), - remapperTable: NewQueryRemapperTable(config, icebergReader, duckdb), + remapperTable: NewQueryRemapperTable(config, icebergReader, duckdbClient), remapperExpression: NewQueryRemapperExpression(config), remapperFunction: NewQueryRemapperFunction(config, icebergReader), remapperSelect: NewQueryRemapperSelect(config), @@ -56,7 +58,7 @@ func (remapper *QueryRemapper) ParseAndRemapQuery(query string) ([]string, []str } if strings.HasSuffix(query, INSPECT_SQL_COMMENT) { - LogDebug(remapper.config, queryTree.Stmts) + common.LogDebug(remapper.config.CommonConfig, queryTree.Stmts) } var originalQueryStatements []string @@ -94,7 +96,7 @@ func (remapper *QueryRemapper) remapStatements(statements []*pgQuery.RawStmt) ([ } for i, stmt := range statements { - LogTrace(remapper.config, "Remapping statement #"+IntToString(i+1)) + common.LogTrace(remapper.config.CommonConfig, "Remapping statement #"+common.IntToString(i+1)) node := stmt.Stmt @@ -128,7 +130,7 @@ func (remapper *QueryRemapper) remapStatements(statements []*pgQuery.RawStmt) ([ // Unsupported query default: - LogDebug(remapper.config, "Query tree:", stmt, node) + common.LogDebug(remapper.config.CommonConfig, "Query tree:", stmt, node) return nil, errors.New("unsupported query type") } } @@ -145,7 +147,7 @@ func (remapper *QueryRemapper) remapSetStatement(stmt *pgQuery.RawStmt) *pgQuery } if !KNOWN_SET_STATEMENTS.Contains(strings.ToLower(setStatement.Name)) { - LogWarn(remapper.config, "Unknown SET ", setStatement.Name, ":", setStatement) + common.LogWarn(remapper.config.CommonConfig, "Unknown SET ", setStatement.Name, ":", setStatement) } return NOOP_QUERY_TREE.Stmts[0] @@ -488,5 +490,5 @@ func (remapper *QueryRemapper) removeWhereClause(whereClause *pgQuery.Node) bool } func (remapper *QueryRemapper) traceTreeTraversal(label string, indentLevel int) { - LogTrace(remapper.config, strings.Repeat(">", indentLevel), label) + common.LogTrace(remapper.config.CommonConfig, strings.Repeat(">", indentLevel), label) } diff --git a/src/server/query_remapper_function.go b/src/server/query_remapper_function.go index aa217b4..1e54562 100644 --- a/src/server/query_remapper_function.go +++ b/src/server/query_remapper_function.go @@ -4,10 +4,12 @@ import ( "regexp" pgQuery "github.com/pganalyze/pg_query_go/v6" + + "github.com/BemiHQ/BemiDB/src/common" ) -var PG_CATALOG_MACRO_FUNCTION_NAMES = Set[string]{} -var PG_INFORMATION_SCHEMA_MACRO_FUNCTION_NAMES = Set[string]{} +var PG_CATALOG_MACRO_FUNCTION_NAMES = common.Set[string]{} +var PG_INFORMATION_SCHEMA_MACRO_FUNCTION_NAMES = common.Set[string]{} func CreatePgCatalogMacroQueries(config *Config) []string { result := []string{ @@ -89,7 +91,7 @@ func CreateInformationSchemaMacroQueries(config *Config) []string { return result } -var BUILTIN_DUCKDB_PG_FUNCTION_NAMES = NewSet[string]().AddAll([]string{ +var BUILTIN_DUCKDB_PG_FUNCTION_NAMES = common.NewSet[string]().AddAll([]string{ "array_to_string", "generate_series", }) @@ -170,8 +172,8 @@ func (remapper *QueryRemapperFunction) RemapNestedFunctionCalls(functionCall *pg } } -func extractMacroNames(macros []string) Set[string] { - names := make(Set[string]) +func extractMacroNames(macros []string) common.Set[string] { + names := make(common.Set[string]) re := regexp.MustCompile(`CREATE MACRO (\w+)\(`) for _, macro := range macros { diff --git a/src/server/query_remapper_table.go b/src/server/query_remapper_table.go index da0ba52..85dc6d3 100644 --- a/src/server/query_remapper_table.go +++ b/src/server/query_remapper_table.go @@ -6,10 +6,12 @@ import ( "strings" pgQuery "github.com/pganalyze/pg_query_go/v6" + + "github.com/BemiHQ/BemiDB/src/common" ) -var PG_CATALOG_TABLE_NAMES = Set[string]{} -var PG_INFORMATION_SCHEMA_TABLE_NAMES = Set[string]{} +var PG_CATALOG_TABLE_NAMES = common.Set[string]{} +var PG_INFORMATION_SCHEMA_TABLE_NAMES = common.Set[string]{} func CreatePgCatalogTableQueries(config *Config) []string { result := []string{ @@ -101,13 +103,13 @@ type QueryRemapperTable struct { parserTable *ParserTable parserFunction *ParserFunction remapperFunction *QueryRemapperFunction - icebergSchemaTables Set[IcebergSchemaTable] + icebergSchemaTables common.Set[IcebergSchemaTable] icebergReader *IcebergReader - duckdb *Duckdb // nilable + duckdb *common.DuckdbClient // nilable config *Config } -func NewQueryRemapperTable(config *Config, icebergReader *IcebergReader, duckdb *Duckdb) *QueryRemapperTable { +func NewQueryRemapperTable(config *Config, icebergReader *IcebergReader, duckdb *common.DuckdbClient) *QueryRemapperTable { remapper := &QueryRemapperTable{ parserTable: NewParserTable(config), parserFunction: NewParserFunction(config), @@ -200,11 +202,11 @@ func (remapper *QueryRemapperTable) RemapTableFunctionCall(rangeFunction *pgQuer func (remapper *QueryRemapperTable) reloadIceberSchemaTables() { newIcebergSchemaTables, err := remapper.icebergReader.SchemaTables() if err != nil && strings.Contains(err.Error(), "no Iceberg directory found") { - PrintErrorAndExit(remapper.config, err.Error()+".\n\n"+ + common.PrintErrorAndExit(remapper.config.CommonConfig, err.Error()+".\n\n"+ "Please make sure to run 'bemidb sync' first.\n"+ "See https://github.com/BemiHQ/BemiDB#quickstart for more information.") } - PanicIfError(remapper.config, err) + common.PanicIfError(remapper.config.CommonConfig, err) previousIcebergSchemaTables := remapper.icebergSchemaTables remapper.icebergSchemaTables = newIcebergSchemaTables @@ -218,29 +220,29 @@ func (remapper *QueryRemapperTable) reloadIceberSchemaTables() { for _, icebergSchemaTable := range newIcebergSchemaTables.Values() { if !previousIcebergSchemaTables.Contains(icebergSchemaTable) { icebergTableFields, err := remapper.icebergReader.TableFields(icebergSchemaTable) - PanicIfError(remapper.config, err) + common.PanicIfError(remapper.config.CommonConfig, err) var sqlColumns []string for _, icebergTableField := range icebergTableFields { sqlColumns = append(sqlColumns, icebergTableField.ToSql()) } - _, err = remapper.duckdb.ExecContext(ctx, "CREATE SCHEMA IF NOT EXISTS "+icebergSchemaTable.Schema, nil) - PanicIfError(remapper.config, err) - _, err = remapper.duckdb.ExecContext(ctx, "CREATE TABLE IF NOT EXISTS "+icebergSchemaTable.String()+" ("+strings.Join(sqlColumns, ", ")+")", nil) - PanicIfError(remapper.config, err) + _, err = remapper.duckdb.ExecContext(ctx, "CREATE SCHEMA IF NOT EXISTS "+icebergSchemaTable.Schema) + common.PanicIfError(remapper.config.CommonConfig, err) + _, err = remapper.duckdb.ExecContext(ctx, "CREATE TABLE IF NOT EXISTS "+icebergSchemaTable.String()+" ("+strings.Join(sqlColumns, ", ")+")") + common.PanicIfError(remapper.config.CommonConfig, err) } } // DROP TABLE IF EXISTS for _, icebergSchemaTable := range previousIcebergSchemaTables.Values() { if !newIcebergSchemaTables.Contains(icebergSchemaTable) { - _, err = remapper.duckdb.ExecContext(ctx, "DROP TABLE IF EXISTS "+icebergSchemaTable.String(), nil) - PanicIfError(remapper.config, err) + _, err = remapper.duckdb.ExecContext(ctx, "DROP TABLE IF EXISTS "+icebergSchemaTable.String()) + common.PanicIfError(remapper.config.CommonConfig, err) } } } -func (remapper *QueryRemapperTable) upsertPgStatUserTables(icebergSchemaTables Set[IcebergSchemaTable]) { +func (remapper *QueryRemapperTable) upsertPgStatUserTables(icebergSchemaTables common.Set[IcebergSchemaTable]) { if remapper.duckdb == nil { return } @@ -254,7 +256,7 @@ func (remapper *QueryRemapperTable) upsertPgStatUserTables(icebergSchemaTables S "DELETE FROM pg_stat_user_tables", "INSERT INTO pg_stat_user_tables VALUES " + strings.Join(values, ", "), }) - PanicIfError(remapper.config, err) + common.PanicIfError(remapper.config.CommonConfig, err) } // System pg_* tables @@ -265,8 +267,8 @@ func (remapper *QueryRemapperTable) isTableFromPgCatalog(qSchemaTable QuerySchem !remapper.icebergSchemaTables.Contains(qSchemaTable.ToIcebergSchemaTable())) } -func extractTableNames(tables []string) Set[string] { - names := make(Set[string]) +func extractTableNames(tables []string) common.Set[string] { + names := make(common.Set[string]) re := regexp.MustCompile(`CREATE (TABLE|VIEW) (\w+)`) for _, table := range tables { diff --git a/src/server/response_handler.go b/src/server/response_handler.go index 86ba0cc..941833d 100644 --- a/src/server/response_handler.go +++ b/src/server/response_handler.go @@ -9,7 +9,9 @@ import ( "strings" "github.com/jackc/pgx/v5/pgtype" - duckDb "github.com/marcboeker/go-duckdb/v2" + "github.com/marcboeker/go-duckdb/v2" + + "github.com/BemiHQ/BemiDB/src/common" ) type ResponseHandler struct { @@ -106,7 +108,7 @@ func (responseHandler *ResponseHandler) ColumnDescriptionTypeOid(col *sql.Column } } - Panic(responseHandler.Config, "Unsupported serialized column type: "+col.DatabaseTypeName()) + common.Panic(responseHandler.Config.CommonConfig, "Unsupported serialized column type: "+col.DatabaseTypeName()) return 0 } @@ -139,7 +141,7 @@ func (responseHandler *ResponseHandler) RowValuePointer(col *sql.ColumnType) int return new(NullArray) } - Panic(responseHandler.Config, "Unsupported data row type: "+col.ScanType().String()) + common.Panic(responseHandler.Config.CommonConfig, "Unsupported data row type: "+col.ScanType().String()) return nil } @@ -147,19 +149,19 @@ func (responseHandler *ResponseHandler) RowValueBytes(valuePtr interface{}, col switch value := valuePtr.(type) { case *sql.NullInt16: if value.Valid { - return []byte(IntToString(int(value.Int16))) + return []byte(common.IntToString(int(value.Int16))) } else { return nil } case *sql.NullInt32: if value.Valid { - return []byte(IntToString(int(value.Int32))) + return []byte(common.IntToString(int(value.Int32))) } else { return nil } case *sql.NullInt64: if value.Valid { - return []byte(IntToString(int(value.Int64))) + return []byte(common.IntToString(int(value.Int64))) } else { return nil } @@ -193,7 +195,7 @@ func (responseHandler *ResponseHandler) RowValueBytes(valuePtr interface{}, col case "TIMESTAMPTZ": return []byte(value.Time.Format("2006-01-02 15:04:05.999999-07:00")) default: - Panic(responseHandler.Config, "Unsupported scanned time type: "+col.DatabaseTypeName()) + common.Panic(responseHandler.Config.CommonConfig, "Unsupported scanned time type: "+col.DatabaseTypeName()) } } else { return nil @@ -226,7 +228,7 @@ func (responseHandler *ResponseHandler) RowValueBytes(valuePtr interface{}, col return []byte(*value) } - Panic(responseHandler.Config, "Unsupported scanned row type: "+col.ScanType().Name()) + common.Panic(responseHandler.Config.CommonConfig, "Unsupported scanned row type: "+col.ScanType().Name()) return nil } @@ -249,7 +251,7 @@ func (responseHandler *ResponseHandler) isSystemTableOidColumn(colName string) b type NullDecimal struct { Present bool - Value duckDb.Decimal + Value duckdb.Decimal } func (nullDecimal *NullDecimal) Scan(value interface{}) error { @@ -259,7 +261,7 @@ func (nullDecimal *NullDecimal) Scan(value interface{}) error { } nullDecimal.Present = true - nullDecimal.Value = value.(duckDb.Decimal) + nullDecimal.Value = value.(duckdb.Decimal) return nil } @@ -274,7 +276,7 @@ func (nullDecimal NullDecimal) String() string { type NullInterval struct { Present bool - Value duckDb.Interval + Value duckdb.Interval } func (nullInterval *NullInterval) Scan(value interface{}) error { @@ -284,7 +286,7 @@ func (nullInterval *NullInterval) Scan(value interface{}) error { } nullInterval.Present = true - nullInterval.Value = value.(duckDb.Interval) + nullInterval.Value = value.(duckdb.Interval) return nil } diff --git a/src/server/storage_s3.go b/src/server/storage_s3.go index 5d40bc6..1f17d69 100644 --- a/src/server/storage_s3.go +++ b/src/server/storage_s3.go @@ -1,16 +1,11 @@ package main import ( - "context" "encoding/json" "io" "reflect" - "strings" - "github.com/aws/aws-sdk-go-v2/aws" - awsConfig "github.com/aws/aws-sdk-go-v2/config" - "github.com/aws/aws-sdk-go-v2/credentials" - "github.com/aws/aws-sdk-go-v2/service/s3" + "github.com/BemiHQ/BemiDB/src/common" ) type MetadataJson struct { @@ -25,49 +20,21 @@ type MetadataJson struct { } type StorageS3 struct { - S3Client *s3.Client + S3Client *common.S3Client Config *Config } -func NewS3Storage(Config *Config) *StorageS3 { - var awsConfigOptions = []func(*awsConfig.LoadOptions) error{ - awsConfig.WithRegion(Config.Aws.Region), - } - - if Config.LogLevel == LOG_LEVEL_TRACE { - awsConfigOptions = append(awsConfigOptions, awsConfig.WithClientLogMode(aws.LogRequest)) - } - - if IsLocalHost(Config.Aws.S3Endpoint) { - awsConfigOptions = append(awsConfigOptions, awsConfig.WithBaseEndpoint("http://"+Config.Aws.S3Endpoint)) - } else { - awsConfigOptions = append(awsConfigOptions, awsConfig.WithBaseEndpoint("https://"+Config.Aws.S3Endpoint)) - } - - awsCredentials := credentials.NewStaticCredentialsProvider( - Config.Aws.AccessKeyId, - Config.Aws.SecretAccessKey, - "", - ) - awsConfigOptions = append(awsConfigOptions, awsConfig.WithCredentialsProvider(awsCredentials)) - - loadedAwsConfig, err := awsConfig.LoadDefaultConfig(context.Background(), awsConfigOptions...) - PanicIfError(Config, err) - - S3Client := s3.NewFromConfig(loadedAwsConfig, func(o *s3.Options) { - if Config.Aws.S3Endpoint != DEFAULT_AWS_S3_ENDPOINT { - o.UsePathStyle = true - } - }) +func NewS3Storage(config *Config) *StorageS3 { + s3Client := common.NewS3Client(config.CommonConfig) return &StorageS3{ - S3Client: S3Client, - Config: Config, + Config: config, + S3Client: s3Client, } } func (storage *StorageS3) IcebergTableFields(metadataPath string) ([]IcebergTableField, error) { - metadataKey := strings.TrimPrefix(metadataPath, "s3://"+storage.Config.Aws.S3Bucket+"/") + metadataKey := storage.S3Client.ObjectKey(metadataPath) metadataContent, err := storage.readFileContent(metadataKey) if err != nil { return nil, err @@ -77,14 +44,7 @@ func (storage *StorageS3) IcebergTableFields(metadataPath string) ([]IcebergTabl } func (storage *StorageS3) readFileContent(fileKey string) ([]byte, error) { - ctx := context.Background() - getObjectResponse, err := storage.S3Client.GetObject(ctx, &s3.GetObjectInput{ - Bucket: aws.String(storage.Config.Aws.S3Bucket), - Key: aws.String(fileKey), - }) - if err != nil { - return nil, err - } + getObjectResponse := storage.S3Client.GetObject(fileKey) fileContent, err := io.ReadAll(getObjectResponse.Body) if err != nil { diff --git a/src/server/utils.go b/src/server/utils.go index b77a4df..d86b224 100644 --- a/src/server/utils.go +++ b/src/server/utils.go @@ -6,17 +6,11 @@ import ( "crypto/sha256" "encoding/base64" "fmt" - "strconv" - "strings" "unicode" "golang.org/x/crypto/pbkdf2" ) -func IntToString(i int) string { - return strconv.Itoa(i) -} - func StringToScramSha256(password string) string { saltLength := 16 digestLength := 32 @@ -53,10 +47,6 @@ func StringContainsUpper(str string) bool { return false } -func IsLocalHost(host string) bool { - return strings.HasPrefix(host, "127.0.0.1") || strings.HasPrefix(host, "localhost") -} - func hmacSha256Hash(key []byte, message []byte) []byte { hash := hmac.New(sha256.New, key) hash.Write(message) diff --git a/src/syncer-amplitude/amplitude.go b/src/syncer-amplitude/amplitude.go index ba86710..ffcc018 100644 --- a/src/syncer-amplitude/amplitude.go +++ b/src/syncer-amplitude/amplitude.go @@ -10,7 +10,7 @@ import ( "net/http" "time" - "github.com/BemiHQ/BemiDB/src/syncer-common" + "github.com/BemiHQ/BemiDB/src/common" ) const ( @@ -44,7 +44,7 @@ func (c *Amplitude) Export(startTime, endTime time.Time) ([]Event, error) { req.URL.RawQuery = q.Encode() req.SetBasicAuth(c.Config.ApiKey, c.Config.SecretKey) - common.LogInfo(c.Config.BaseConfig, "Fetching data from Amplitude from", startString, "to", endString) + common.LogInfo(c.Config.CommonConfig, "Fetching data from Amplitude from", startString, "to", endString) resp, err := c.HttpClient.Do(req) if err != nil { return nil, err @@ -55,7 +55,7 @@ func (c *Amplitude) Export(startTime, endTime time.Time) ([]Event, error) { body, _ := io.ReadAll(resp.Body) return nil, fmt.Errorf("amplitude API returned status %d: %s", resp.StatusCode, string(body)) } - common.LogDebug(c.Config.BaseConfig, "Received response from Amplitude:", resp.Status) + common.LogDebug(c.Config.CommonConfig, "Received response from Amplitude:", resp.Status) body, err := io.ReadAll(resp.Body) if err != nil { @@ -69,7 +69,7 @@ func (c *Amplitude) Export(startTime, endTime time.Time) ([]Event, error) { var events []Event for _, zipFile := range zipReader.File { - common.LogInfo(c.Config.BaseConfig, "Processing file:", zipFile.Name) + common.LogInfo(c.Config.CommonConfig, "Processing file:", zipFile.Name) unzippedFile, err := zipFile.Open() if err != nil { return nil, err @@ -90,7 +90,7 @@ func (c *Amplitude) Export(startTime, endTime time.Time) ([]Event, error) { if err == io.EOF { break // We're done } - common.PanicIfError(c.Config.BaseConfig, err) + common.PanicIfError(c.Config.CommonConfig, err) } events = append(events, event) } diff --git a/src/syncer-amplitude/config.go b/src/syncer-amplitude/config.go index 19da01c..c946bcc 100644 --- a/src/syncer-amplitude/config.go +++ b/src/syncer-amplitude/config.go @@ -7,10 +7,16 @@ import ( "strings" "time" + "github.com/BemiHQ/BemiDB/src/common" "github.com/BemiHQ/BemiDB/src/syncer-common" ) const ( + ENV_TRINO_DATABASE_URL = "TRINO_DATABASE_URL" + ENV_TRINO_CATALOG_NAME = "TRINO_CATALOG_NAME" + + ENV_DESTINATION_SCHEMA_NAME = "DESTINATION_SCHEMA_NAME" + ENV_API_KEY = "SOURCE_AMPLITUDE_API_KEY" ENV_SECRET_KEY = "SOURCE_AMPLITUDE_SECRET_KEY" ENV_START_DATE = "SOURCE_AMPLITUDE_START_DATE" @@ -19,10 +25,13 @@ const ( ) type Config struct { - BaseConfig *common.BaseConfig - ApiKey string - SecretKey string - StartDate time.Time + CommonConfig *common.CommonConfig + TrinoConfig *syncerCommon.TrinoConfig + DestinationSchemaName string + + ApiKey string + SecretKey string + StartDate time.Time } type configParseValues struct { @@ -37,19 +46,21 @@ func init() { } func registerFlags() { - _config.BaseConfig = &common.BaseConfig{} - - flag.StringVar(&_config.BaseConfig.LogLevel, "log-level", os.Getenv(common.ENV_LOG_LEVEL), `Log level: "ERROR", "WARN", "INFO", "DEBUG", "TRACE". Default: "`+common.DEFAULT_LOG_LEVEL+`"`) - flag.StringVar(&_config.BaseConfig.CatalogDatabaseUrl, "catalog-database-url", os.Getenv(common.ENV_CATALOG_DATABASE_URL), "Catalog database URL") - flag.StringVar(&_config.BaseConfig.DestinationSchemaName, "destination-schema-name", os.Getenv(common.ENV_DESTINATION_SCHEMA_NAME), "Destination schema name to store the synced data") - flag.StringVar(&_config.BaseConfig.Trino.DatabaseUrl, "trino-database-url", os.Getenv(common.ENV_TRINO_DATABASE_URL), "Trino database URL to sync to") - flag.StringVar(&_config.BaseConfig.Trino.CatalogName, "trino-catalog-name", os.Getenv(common.ENV_TRINO_CATALOG_NAME), "Trino catalog name") - flag.StringVar(&_config.BaseConfig.Aws.Region, "aws-region", os.Getenv(common.ENV_AWS_REGION), "AWS region") - flag.StringVar(&_config.BaseConfig.Aws.S3Endpoint, "aws-s3-endpoint", os.Getenv(common.ENV_AWS_S3_ENDPOINT), "AWS S3 endpoint. Default: \""+common.DEFAULT_AWS_S3_ENDPOINT+`"`) - flag.StringVar(&_config.BaseConfig.Aws.S3Bucket, "aws-s3-bucket", os.Getenv(common.ENV_AWS_S3_BUCKET), "AWS S3 bucket name") - flag.StringVar(&_config.BaseConfig.Aws.AccessKeyId, "aws-access-key-id", os.Getenv(common.ENV_AWS_ACCESS_KEY_ID), "AWS access key ID") - flag.StringVar(&_config.BaseConfig.Aws.SecretAccessKey, "aws-secret-access-key", os.Getenv(common.ENV_AWS_SECRET_ACCESS_KEY), "AWS secret access key") - flag.BoolVar(&_config.BaseConfig.DisableAnonymousAnalytics, "disable-anonymous-analytics", os.Getenv(common.ENV_DISABLE_ANONYMOUS_ANALYTICS) == "true", "Disable anonymous analytics collection") + _config.CommonConfig = &common.CommonConfig{} + _config.TrinoConfig = &syncerCommon.TrinoConfig{} + + flag.StringVar(&_config.CommonConfig.LogLevel, "log-level", os.Getenv(common.ENV_LOG_LEVEL), `Log level: "ERROR", "WARN", "INFO", "DEBUG", "TRACE". Default: "`+common.DEFAULT_LOG_LEVEL+`"`) + flag.StringVar(&_config.CommonConfig.CatalogDatabaseUrl, "catalog-database-url", os.Getenv(common.ENV_CATALOG_DATABASE_URL), "Catalog database URL") + flag.StringVar(&_config.CommonConfig.Aws.Region, "aws-region", os.Getenv(common.ENV_AWS_REGION), "AWS region") + flag.StringVar(&_config.CommonConfig.Aws.S3Endpoint, "aws-s3-endpoint", os.Getenv(common.ENV_AWS_S3_ENDPOINT), "AWS S3 endpoint. Default: \""+common.DEFAULT_AWS_S3_ENDPOINT+`"`) + flag.StringVar(&_config.CommonConfig.Aws.S3Bucket, "aws-s3-bucket", os.Getenv(common.ENV_AWS_S3_BUCKET), "AWS S3 bucket name") + flag.StringVar(&_config.CommonConfig.Aws.AccessKeyId, "aws-access-key-id", os.Getenv(common.ENV_AWS_ACCESS_KEY_ID), "AWS access key ID") + flag.StringVar(&_config.CommonConfig.Aws.SecretAccessKey, "aws-secret-access-key", os.Getenv(common.ENV_AWS_SECRET_ACCESS_KEY), "AWS secret access key") + flag.BoolVar(&_config.CommonConfig.DisableAnonymousAnalytics, "disable-anonymous-analytics", os.Getenv(common.ENV_DISABLE_ANONYMOUS_ANALYTICS) == "true", "Disable anonymous analytics collection") + + flag.StringVar(&_config.TrinoConfig.DatabaseUrl, "trino-database-url", os.Getenv(ENV_TRINO_DATABASE_URL), "Trino database URL to sync to") + flag.StringVar(&_config.TrinoConfig.CatalogName, "trino-catalog-name", os.Getenv(ENV_TRINO_CATALOG_NAME), "Trino catalog name") + flag.StringVar(&_config.DestinationSchemaName, "destination-schema-name", os.Getenv(ENV_DESTINATION_SCHEMA_NAME), "Destination schema name to store the synced data") flag.StringVar(&_config.ApiKey, "api-key", os.Getenv(ENV_API_KEY), "Amplitude API Key") flag.StringVar(&_config.SecretKey, "secret-key", os.Getenv(ENV_SECRET_KEY), "Amplitude Secret Key") @@ -59,39 +70,40 @@ func registerFlags() { func parseFlags() { flag.Parse() - if _config.BaseConfig.LogLevel == "" { - _config.BaseConfig.LogLevel = common.DEFAULT_LOG_LEVEL - } else if !slices.Contains(common.LOG_LEVELS, _config.BaseConfig.LogLevel) { - panic("Invalid log level " + _config.BaseConfig.LogLevel + ". Must be one of " + strings.Join(common.LOG_LEVELS, ", ")) + if _config.CommonConfig.LogLevel == "" { + _config.CommonConfig.LogLevel = common.DEFAULT_LOG_LEVEL + } else if !slices.Contains(common.LOG_LEVELS, _config.CommonConfig.LogLevel) { + panic("Invalid log level " + _config.CommonConfig.LogLevel + ". Must be one of " + strings.Join(common.LOG_LEVELS, ", ")) } - if _config.BaseConfig.CatalogDatabaseUrl == "" { + if _config.CommonConfig.CatalogDatabaseUrl == "" { panic("Catalog database URL is required") } - if _config.BaseConfig.DestinationSchemaName == "" { - panic("Destination schema name is required") - } - if _config.BaseConfig.Trino.DatabaseUrl == "" { - panic("Trino database URL is required") - } - if _config.BaseConfig.Trino.CatalogName == "" { - panic("Trino catalog name is required") - } - if _config.BaseConfig.Aws.Region == "" { + if _config.CommonConfig.Aws.Region == "" { panic("AWS region is required") } - if _config.BaseConfig.Aws.S3Endpoint == "" { - _config.BaseConfig.Aws.S3Endpoint = common.DEFAULT_AWS_S3_ENDPOINT + if _config.CommonConfig.Aws.S3Endpoint == "" { + _config.CommonConfig.Aws.S3Endpoint = common.DEFAULT_AWS_S3_ENDPOINT } - if _config.BaseConfig.Aws.S3Bucket == "" { + if _config.CommonConfig.Aws.S3Bucket == "" { panic("AWS S3 bucket name is required") } - if _config.BaseConfig.Aws.AccessKeyId != "" && _config.BaseConfig.Aws.SecretAccessKey == "" { + if _config.CommonConfig.Aws.AccessKeyId != "" && _config.CommonConfig.Aws.SecretAccessKey == "" { panic("AWS secret access key is required") } - if _config.BaseConfig.Aws.AccessKeyId == "" && _config.BaseConfig.Aws.SecretAccessKey != "" { + if _config.CommonConfig.Aws.AccessKeyId == "" && _config.CommonConfig.Aws.SecretAccessKey != "" { panic("AWS access key ID is required") } + if _config.TrinoConfig.DatabaseUrl == "" { + panic("Trino database URL is required") + } + if _config.TrinoConfig.CatalogName == "" { + panic("Trino catalog name is required") + } + if _config.DestinationSchemaName == "" { + panic("Destination schema name is required") + } + if _config.ApiKey == "" { panic("Amplitude API key is required") } diff --git a/src/syncer-amplitude/event.go b/src/syncer-amplitude/event.go index a90cff1..e21f303 100644 --- a/src/syncer-amplitude/event.go +++ b/src/syncer-amplitude/event.go @@ -142,7 +142,7 @@ func (e *Event) ToTrinoRow() string { } } } - return "TIMESTAMP '" + common.TimeToUtcStringMs(parsedTime) + "'" + return "TIMESTAMP '" + syncerCommon.TimeToUtcStringMs(parsedTime) + "'" } return fmt.Sprintf("(%s, %s, %s, %d, %d, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %d, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %d, %s, %s, %s, %s, %s, %s, %s)", diff --git a/src/syncer-amplitude/go.mod b/src/syncer-amplitude/go.mod index 536e97d..3ede4ea 100644 --- a/src/syncer-amplitude/go.mod +++ b/src/syncer-amplitude/go.mod @@ -1,44 +1,49 @@ -module github.com/BemiHQ/bemidb-services/syncers/syncer-amplitude +module github.com/BemiHQ/BemiDB/src/syncer-amplitude go 1.24.4 -require github.com/BemiHQ/BemiDB/src/syncer-common v0.0.1 +require ( + github.com/BemiHQ/BemiDB/src/common v0.0.0-00010101000000-000000000000 + github.com/BemiHQ/BemiDB/src/syncer-common v0.0.1 +) + +replace github.com/BemiHQ/BemiDB/src/common => ../common replace github.com/BemiHQ/BemiDB/src/syncer-common => ../syncer-common require ( - github.com/apache/arrow-go/v18 v18.1.0 // indirect + github.com/apache/arrow-go/v18 v18.4.0 // indirect github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 // indirect - github.com/apache/thrift v0.21.0 // indirect - github.com/aws/aws-sdk-go-v2 v1.36.6 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.11 // indirect - github.com/aws/aws-sdk-go-v2/config v1.29.18 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.17.71 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.33 // indirect - github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.85 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.37 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.37 // indirect + github.com/apache/thrift v0.22.0 // indirect + github.com/aws/aws-sdk-go-v2 v1.37.0 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 // indirect + github.com/aws/aws-sdk-go-v2/config v1.30.1 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.18.1 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0 // indirect + github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.37 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.4 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.5 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.18 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.18 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.84.1 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.25.6 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.4 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.34.1 // indirect - github.com/aws/smithy-go v1.22.4 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.26.0 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.35.0 // indirect + github.com/aws/smithy-go v1.22.5 // indirect github.com/duckdb/duckdb-go-bindings v0.1.17 // indirect github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.12 // indirect github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.12 // indirect github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.12 // indirect github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.12 // indirect github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.12 // indirect - github.com/go-viper/mapstructure/v2 v2.2.1 // indirect + github.com/go-viper/mapstructure/v2 v2.3.0 // indirect github.com/goccy/go-json v0.10.5 // indirect - github.com/golang/snappy v0.0.4 // indirect - github.com/google/flatbuffers v25.1.24+incompatible // indirect + github.com/golang/snappy v1.0.0 // indirect + github.com/google/flatbuffers v25.2.10+incompatible // indirect github.com/google/uuid v1.6.0 // indirect github.com/hashicorp/go-uuid v1.0.3 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect @@ -50,12 +55,12 @@ require ( github.com/jcmturner/goidentity/v6 v6.0.1 // indirect github.com/jcmturner/gokrb5/v8 v8.4.4 // indirect github.com/jcmturner/rpc/v2 v2.0.3 // indirect - github.com/klauspost/compress v1.17.11 // indirect - github.com/klauspost/cpuid/v2 v2.2.9 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.11 // indirect github.com/linkedin/goavro v2.1.0+incompatible // indirect github.com/marcboeker/go-duckdb/arrowmapping v0.0.10 // indirect github.com/marcboeker/go-duckdb/mapping v0.0.11 // indirect - github.com/marcboeker/go-duckdb/v2 v2.3.3 // indirect + github.com/marcboeker/go-duckdb/v2 v2.3.4 // indirect github.com/pierrec/lz4/v4 v4.1.22 // indirect github.com/trinodb/trino-go-client v0.323.0 // indirect github.com/xitongsys/parquet-go v1.6.2 // indirect diff --git a/src/syncer-amplitude/go.sum b/src/syncer-amplitude/go.sum index b616521..dae57a9 100644 --- a/src/syncer-amplitude/go.sum +++ b/src/syncer-amplitude/go.sum @@ -124,17 +124,17 @@ github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8 github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/ahmetb/dlog v0.0.0-20170105205344-4fb5f8204f26 h1:3YVZUqkoev4mL+aCwVOSWV4M7pN+NURHL38Z2zq5JKA= github.com/ahmetb/dlog v0.0.0-20170105205344-4fb5f8204f26/go.mod h1:ymXt5bw5uSNu4jveerFxE0vNYxF8ncqbptntMaFMg3k= -github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA= -github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA= +github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= +github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/apache/arrow-go/v18 v18.1.0 h1:agLwJUiVuwXZdwPYVrlITfx7bndULJ/dggbnLFgDp/Y= -github.com/apache/arrow-go/v18 v18.1.0/go.mod h1:tigU/sIgKNXaesf5d7Y95jBBKS5KsxTqYBKXFsvKzo0= +github.com/apache/arrow-go/v18 v18.4.0 h1:/RvkGqH517iY8bZKc4FD5/kkdwXJGjxf28JIXbJ/oB0= +github.com/apache/arrow-go/v18 v18.4.0/go.mod h1:Aawvwhj8x2jURIzD9Moy72cF0FyJXOpkYpdmGRHcw14= github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 h1:byKBBF2CKWBjjA4J1ZL2JXttJULvWSl50LegTyRZ728= github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516/go.mod h1:QNYViu/X0HXDHw7m3KXzWSVXIbfUvJqBFe6Gj8/pYA0= github.com/apache/thrift v0.0.0-20181112125854-24918abba929/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.14.2/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.21.0 h1:tdPmh/ptjE1IJnhbhrcl2++TauVjy242rkV/UzJChnE= -github.com/apache/thrift v0.21.0/go.mod h1:W1H8aR/QRtYNvrPeFXBtobyRkd0/YVhTc6i07XIAgDw= +github.com/apache/thrift v0.22.0 h1:r7mTJdj51TMDe6RtcmNdQxgn9XcyfGDOzegMDRg47uc= +github.com/apache/thrift v0.22.0/go.mod h1:1e7J/O1Ae6ZQMTYdy9xa3w9k+XHWPfRvdPyJeynQ+/g= github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= github.com/aws/aws-sdk-go v1.30.19/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= github.com/aws/aws-sdk-go v1.37.0/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= @@ -142,83 +142,83 @@ github.com/aws/aws-sdk-go v1.43.31 h1:yJZIr8nMV1hXjAvvOLUFqZRJcHV7udPQBfhJqawDzI github.com/aws/aws-sdk-go v1.43.31/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go-v2 v1.16.2/go.mod h1:ytwTPBG6fXTZLxxeeCCWj2/EMYp/xDUgX+OET6TLNNU= github.com/aws/aws-sdk-go-v2 v1.23.0/go.mod h1:i1XDttT4rnf6vxc9AuskLc6s7XBee8rlLilKlc03uAA= -github.com/aws/aws-sdk-go-v2 v1.36.6 h1:zJqGjVbRdTPojeCGWn5IR5pbJwSQSBh5RWFTQcEQGdU= -github.com/aws/aws-sdk-go-v2 v1.36.6/go.mod h1:EYrzvCCN9CMUTa5+6lf6MM4tq3Zjp8UhSGR/cBsjai0= +github.com/aws/aws-sdk-go-v2 v1.37.0 h1:YtCOESR/pN4j5oA7cVHSfOwIcuh/KwHC4DOSXFbv5F0= +github.com/aws/aws-sdk-go-v2 v1.37.0/go.mod h1:9Q0OoGQoboYIAJyslFyF1f5K1Ryddop8gqMhWx/n4Wg= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.1/go.mod h1:n8Bs1ElDD2wJ9kCRTczA83gYbBmjSwZp3umc6zF4EeM= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.1/go.mod h1:t8PYl/6LzdAqsU4/9tz28V/kU+asFePvpOMkdul0gEQ= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.11 h1:12SpdwU8Djs+YGklkinSSlcrPyj3H4VifVsKf78KbwA= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.11/go.mod h1:dd+Lkp6YmMryke+qxW/VnKyhMBDTYP41Q2Bb+6gNZgY= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 h1:6GMWV6CNpA/6fbFHnoAjrv4+LGfyTqZz2LtCHnspgDg= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0/go.mod h1:/mXlTIVG9jbxkqDnr5UQNQxW1HRYxeGklkM9vAFeabg= github.com/aws/aws-sdk-go-v2/config v1.15.3/go.mod h1:9YL3v07Xc/ohTsxFXzan9ZpFpdTOFl4X65BAKYaz8jg= github.com/aws/aws-sdk-go-v2/config v1.25.3/go.mod h1:tAByZy03nH5jcq0vZmkcVoo6tRzRHEwSFx3QW4NmDw8= -github.com/aws/aws-sdk-go-v2/config v1.29.18 h1:x4T1GRPnqKV8HMJOMtNktbpQMl3bIsfx8KbqmveUO2I= -github.com/aws/aws-sdk-go-v2/config v1.29.18/go.mod h1:bvz8oXugIsH8K7HLhBv06vDqnFv3NsGDt2Znpk7zmOU= +github.com/aws/aws-sdk-go-v2/config v1.30.1 h1:sHL8g/+9tcZATeV2tEkEfxZeaNokDtKsSjGMGHD49qA= +github.com/aws/aws-sdk-go-v2/config v1.30.1/go.mod h1:wkibEyFfxXRyTSzRU4bbF5IUsSXyE4xQ4ZjkGmi5tFo= github.com/aws/aws-sdk-go-v2/credentials v1.11.2/go.mod h1:j8YsY9TXTm31k4eFhspiQicfXPLZ0gYXA50i4gxPE8g= github.com/aws/aws-sdk-go-v2/credentials v1.16.2/go.mod h1:sDdvGhXrSVT5yzBDR7qXz+rhbpiMpUYfF3vJ01QSdrc= -github.com/aws/aws-sdk-go-v2/credentials v1.17.71 h1:r2w4mQWnrTMJjOyIsZtGp3R3XGY3nqHn8C26C2lQWgA= -github.com/aws/aws-sdk-go-v2/credentials v1.17.71/go.mod h1:E7VF3acIup4GB5ckzbKFrCK0vTvEQxOxgdq4U3vcMCY= +github.com/aws/aws-sdk-go-v2/credentials v1.18.1 h1:E55xvOqlX7CvB66Z7rSM9usCrFU1ryUIUHqiXsEzVoE= +github.com/aws/aws-sdk-go-v2/credentials v1.18.1/go.mod h1:iobSQfR5MkvILxssGOvi/P1jjOhrRzfTiCPCzku0vx4= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.3/go.mod h1:uk1vhHHERfSVCUnqSqz8O48LBYDSC+k6brng09jcMOk= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.4/go.mod h1:t4i+yGHMCcUNIX1x7YVYa6bH/Do7civ5I6cG/6PMfyA= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.33 h1:D9ixiWSG4lyUBL2DDNK924Px9V/NBVpML90MHqyTADY= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.33/go.mod h1:caS/m4DI+cij2paz3rtProRBI4s/+TCiWoaWZuQ9010= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0 h1:9sBTeKQwAvmJUWKIACIoiFSnxxl+sS++YDfr17/ngq0= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0/go.mod h1:LW9/PxQD1SYFC7pnWcgqPhoyZprhjEdg5hBK6qYPLW8= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.3/go.mod h1:0dHuD2HZZSiwfJSy1FO5bX1hQ1TxVV1QXXjpn3XUE44= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.14.0/go.mod h1:UcgIwJ9KHquYxs6Q5skC9qXjhYMK+JASDYcXQ4X7JZE= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.85 h1:AfpstoiaenxGSCUheWiicgZE5XXS5Fi4CcQ4PA/x+Qw= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.85/go.mod h1:HxiF0Fd6WHWjdjOffLkCauq7JqzWqMMq0iUVLS7cPQc= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1 h1:aAjA/1JZ1xH/F9XvxJu9cXZyp7BqVXtHpztyZ6p799E= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1/go.mod h1:ia9HASsPba/7o84sp6iE4wZPdNTJ0oicBe5sWQQk+Ys= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.9/go.mod h1:AnVH5pvai0pAF4lXRq0bmhbes1u9R8wTE+g+183bZNM= github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.3/go.mod h1:7sGSz1JCKHWWBHq98m6sMtWQikmYPpxjqOydDemiVoM= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.37 h1:osMWfm/sC/L4tvEdQ65Gri5ZZDCUpuYJZbTTDrsn4I0= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.37/go.mod h1:ZV2/1fbjOPr4G4v38G3Ww5TBT4+hmsK45s/rxu1fGy0= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0 h1:H2iZoqW/v2Jnrh1FnU725Bq6KJ0k2uP63yH+DcY+HUI= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0/go.mod h1:L0FqLbwMXHvNC/7crWV1iIxUlOKYZUE8KuTIA+TozAI= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.3/go.mod h1:ssOhaLpRlh88H3UmEcsBoVKq309quMvm3Ds8e9d4eJM= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.3/go.mod h1:ify42Rb7nKeDDPkFjKn7q1bPscVPu/+gmHH8d2c+anU= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.37 h1:v+X21AvTb2wZ+ycg1gx+orkB/9U6L7AOp93R7qYxsxM= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.37/go.mod h1:G0uM1kyssELxmJ2VZEfG0q2npObR3BAkF3c1VsfVnfs= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0 h1:EDped/rNzAhFPhVY0sDGbtD16OKqksfA8OjF/kLEgw8= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0/go.mod h1:uUI335jvzpZRPpjYx6ODc/wg1qH+NnoSTK/FwVeK0C0= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.10/go.mod h1:8DcYQcz0+ZJaSxANlHIsbbi6S+zMwjwdDqwW3r9AzaE= github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.3/go.mod h1:5yzAuE9i2RkVAttBl8yxZgQr5OCq4D5yDnG7j9x2L0U= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.37 h1:XTZZ0I3SZUHAtBLBU6395ad+VOblE0DwQP6MuaNeics= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.37/go.mod h1:Pi6ksbniAWVwu2S8pEzcYPyhUkAcLaufxN7PfAUQjBk= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0 h1:iLvW/zOkHGU3BDU5thWnj+UZ9pjhuVhv1loLj7yVtBw= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0/go.mod h1:Fn3gvhdF1x5Rs9nUoCy/fJT1ms8f8dO7RqM9lJHuazQ= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.1/go.mod h1:GeUru+8VzrTXV/83XyMJ80KpH8xO89VPoUileyNQ+tc= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1/go.mod h1:l9ymW25HOqymeU2m1gbUQ3rUIsTwKs8gYHXkqDQUhiI= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.4 h1:CXV68E2dNqhuynZJPB80bhPQwAKqBWVer887figW6Jc= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.4/go.mod h1:/xFi9KtvBXP97ppCz1TAEvU1Uf66qvid89rbem3wCzQ= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 h1:6+lZi2JeGKtCraAj1rpoZfKqnQ9SptseRZioejfUOLM= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0/go.mod h1:eb3gfbVIxIoGgJsi9pGne19dhCBpK6opTYpQqAmdy44= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.3/go.mod h1:Seb8KNmD6kVTjwRjVEgOT5hPin6sq+v4C2ycJQDwuH8= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.3/go.mod h1:R+/S1O4TYpcktbVwddeOYg+uwUfLhADP2S/x4QwsCTM= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.5 h1:M5/B8JUaCI8+9QD+u3S/f4YHpvqE9RpSkV3rf0Iks2w= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.5/go.mod h1:Bktzci1bwdbpuLiu3AOksiNPMl/LLKmX1TWmqp2xbvs= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0 h1:qGyLBQPphYzUf+IIlb5tHnvg1U2Vc5hXPcP7oRSQfy0= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0/go.mod h1:g+dzKSLXiR/8ATkPXmLhPOI6rDdjLP3tngeo3FvDcIw= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.3/go.mod h1:wlY6SVjuwvh3TVRpTqdy4I1JpBFLX4UGeKZdWntaocw= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.3/go.mod h1:Owv1I59vaghv1Ax8zz8ELY8DN7/Y0rGS+WWAmjgi950= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.18 h1:vvbXsA2TVO80/KT7ZqCbx934dt6PY+vQ8hZpUZ/cpYg= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.18/go.mod h1:m2JJHledjBGNMsLOF1g9gbAxprzq3KjC8e4lxtn+eWg= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0 h1:eRhU3Sh8dGbaniI6B+I48XJMrTPRkK4DKo+vqIxziOU= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0/go.mod h1:paNLV18DZ6FnWE/bd06RIKPDIFpjuvCkGKWTG/GDBeM= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.3/go.mod h1:Bm/v2IaN6rZ+Op7zX+bOUMdL4fsrYZiD0dsjLhNKwZc= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.3/go.mod h1:KZgs2ny8HsxRIRbDwgvJcHHBZPOzQr/+NtGwnP+w2ec= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.18 h1:OS2e0SKqsU2LiJPqL8u9x41tKc6MMEHrWjLVLn3oysg= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.18/go.mod h1:+Yrk+MDGzlNGxCXieljNeWpoZTCQUQVL+Jk9hGGJ8qM= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0 h1:6jusT+XCcvnD+Elxvm7bUf5sCMTpZEp3AKjYQ4tWJSo= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0/go.mod h1:LimGpdIF/sTBdgqwOEkrArXLCoTamK/9L9x8IKBFTIc= github.com/aws/aws-sdk-go-v2/service/kms v1.16.3/go.mod h1:QuiHPBqlOFCi4LqdSskYYAWpQlx3PKmohy+rE2F+o5g= github.com/aws/aws-sdk-go-v2/service/s3 v1.26.3/go.mod h1:g1qvDuRsJY+XghsV6zg00Z4KJ7DtFFCx8fJD2a491Ak= github.com/aws/aws-sdk-go-v2/service/s3 v1.43.0/go.mod h1:NXRKkiRF+erX2hnybnVU660cYT5/KChRD4iUgJ97cI8= -github.com/aws/aws-sdk-go-v2/service/s3 v1.84.1 h1:RkHXU9jP0DptGy7qKI8CBGsUJruWz0v5IgwBa2DwWcU= -github.com/aws/aws-sdk-go-v2/service/s3 v1.84.1/go.mod h1:3xAOf7tdKF+qbb+XpU+EPhNXAdun3Lu1RcDrj8KC24I= +github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0 h1:gAV4NEp4A+JOrIdoXkAeyy6IOo7+X2s/jRuaHKYiMaU= +github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0/go.mod h1:JIQwK8sZ5MuKGm5rrFwp9MHUcyYEsQNpVixuPDlnwaU= github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.15.4/go.mod h1:PJc8s+lxyU8rrre0/4a0pn2wgwiDvOEzoOjcJUBr67o= github.com/aws/aws-sdk-go-v2/service/sns v1.17.4/go.mod h1:kElt+uCcXxcqFyc+bQqZPFD9DME/eC6oHBXvFzQ9Bcw= github.com/aws/aws-sdk-go-v2/service/sqs v1.18.3/go.mod h1:skmQo0UPvsjsuYYSYMVmrPc1HWCbHUJyrCEp+ZaLzqM= github.com/aws/aws-sdk-go-v2/service/ssm v1.24.1/go.mod h1:NR/xoKjdbRJ+qx0pMR4mI+N/H1I1ynHwXnO6FowXJc0= github.com/aws/aws-sdk-go-v2/service/sso v1.11.3/go.mod h1:7UQ/e69kU7LDPtY40OyoHYgRmgfGM4mgsLYtcObdveU= github.com/aws/aws-sdk-go-v2/service/sso v1.17.2/go.mod h1:/pE21vno3q1h4bbhUOEi+6Zu/aT26UK2WKkDXd+TssQ= -github.com/aws/aws-sdk-go-v2/service/sso v1.25.6 h1:rGtWqkQbPk7Bkwuv3NzpE/scwwL9sC1Ul3tn9x83DUI= -github.com/aws/aws-sdk-go-v2/service/sso v1.25.6/go.mod h1:u4ku9OLv4TO4bCPdxf4fA1upaMaJmP9ZijGk3AAOC6Q= +github.com/aws/aws-sdk-go-v2/service/sso v1.26.0 h1:cuFWHH87GP1NBGXXfMicUbE7Oty5KpPxN6w4JpmuxYc= +github.com/aws/aws-sdk-go-v2/service/sso v1.26.0/go.mod h1:aJBemdlbCKyOXEXdXBqS7E+8S9XTDcOTaoOjtng54hA= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.20.0/go.mod h1:dWqm5G767qwKPuayKfzm4rjzFmVjiBFbOJrpSPnAMDs= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.4 h1:OV/pxyXh+eMA0TExHEC4jyWdumLxNbzz1P0zJoezkJc= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.4/go.mod h1:8Mm5VGYwtm+r305FfPSuc+aFkrypeylGYhFim6XEPoc= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0 h1:t2va+wewPOYIqC6XyJ4MGjiGKkczMAPsgq5W4FtL9ME= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0/go.mod h1:ExCTcqYqN0hYYRsDlBVU8+68grqlWdgX9/nZJwQW4aY= github.com/aws/aws-sdk-go-v2/service/sts v1.16.3/go.mod h1:bfBj0iVmsUyUg4weDB4NxktD9rDGeKSVWnjTnwbx9b8= github.com/aws/aws-sdk-go-v2/service/sts v1.25.3/go.mod h1:4EqRHDCKP78hq3zOnmFXu5k0j4bXbRFfCh/zQ6KnEfQ= -github.com/aws/aws-sdk-go-v2/service/sts v1.34.1 h1:aUrLQwJfZtwv3/ZNG2xRtEen+NqI3iesuacjP51Mv1s= -github.com/aws/aws-sdk-go-v2/service/sts v1.34.1/go.mod h1:3wFBZKoWnX3r+Sm7in79i54fBmNfwhdNdQuscCw7QIk= +github.com/aws/aws-sdk-go-v2/service/sts v1.35.0 h1:FD9agdG4CeOGS3ORLByJk56YIXDS7mxFpmZyCtpqExc= +github.com/aws/aws-sdk-go-v2/service/sts v1.35.0/go.mod h1:NDzDPbBF1xtSTZUMuZx0w3hIfWzcL7X2AQ0Tr9becIQ= github.com/aws/smithy-go v1.11.2/go.mod h1:3xHYmszWVx2c0kIwQeEVf9uSm4fYZt67FBJnwub1bgM= github.com/aws/smithy-go v1.17.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= -github.com/aws/smithy-go v1.22.4 h1:uqXzVZNuNexwc/xrh6Tb56u89WDlJY6HS+KC0S4QSjw= -github.com/aws/smithy-go v1.22.4/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= +github.com/aws/smithy-go v1.22.5 h1:P9ATCXPMb2mPjYBgueqJNCA5S9UfktsW0tTxi+a7eqw= +github.com/aws/smithy-go v1.22.5/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/bobg/gcsobj v0.1.2/go.mod h1:vS49EQ1A1Ib8FgrL58C8xXYZyOCR2TgzAdopy6/ipa8= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= @@ -248,8 +248,9 @@ github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7 github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= 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/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU= github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= @@ -307,8 +308,8 @@ github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= -github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.3.0 h1:27XbWsHIqhbdR5TIC911OfYvgSaW93HM+dX7970Q7jk= +github.com/go-viper/mapstructure/v2 v2.3.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= @@ -364,13 +365,13 @@ github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= +github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= 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/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/flatbuffers v25.1.24+incompatible h1:4wPqL3K7GzBd1CwyhSd3usxLKOaJN/AC6puCca6Jm7o= -github.com/google/flatbuffers v25.1.24+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/flatbuffers v25.2.10+incompatible h1:F3vclr7C3HpB1k9mxCGRMXq6FdUalZ6H/pNX4FP1v0Q= +github.com/google/flatbuffers v25.2.10+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= 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= @@ -521,13 +522,13 @@ github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYs github.com/klauspost/compress v1.13.1/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= -github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= -github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= -github.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY= -github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8= +github.com/klauspost/cpuid/v2 v2.2.11 h1:0OwqZRYI2rFrjS4kvkDnqJkKHdHaRnCm68/DY4OxRzU= +github.com/klauspost/cpuid/v2 v2.2.11/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= 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/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= @@ -549,8 +550,8 @@ github.com/marcboeker/go-duckdb/arrowmapping v0.0.10 h1:G1W+GVnUefR8uy7jHdNO+CRM github.com/marcboeker/go-duckdb/arrowmapping v0.0.10/go.mod h1:jccUb8TYD0p5TsEEeN4SXuslNJHo23QaKOqKD+U6uFU= github.com/marcboeker/go-duckdb/mapping v0.0.11 h1:fusN1b1l7Myxafifp596I6dNLNhN5Uv/rw31qAqBwqw= github.com/marcboeker/go-duckdb/mapping v0.0.11/go.mod h1:aYBjFLgfKO0aJIbDtXPiaL5/avRQISveX/j9tMf9JhU= -github.com/marcboeker/go-duckdb/v2 v2.3.3 h1:PQhWS1vLtotByrXmUg6YqmTS59WPJEqlCPhp464ZGUU= -github.com/marcboeker/go-duckdb/v2 v2.3.3/go.mod h1:RZgwGE22rly6aWbqO8lsfYjMvNuMd3YoTroWxL37H9E= +github.com/marcboeker/go-duckdb/v2 v2.3.4 h1:o98wrefPbH0IdJRix4pF0+jZiXoFQ+FSR8InMsCUZD0= +github.com/marcboeker/go-duckdb/v2 v2.3.4/go.mod h1:8adNrftF4Ye29XMrpIl5NYNosTVsZu1mz3C82WdVvrk= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= @@ -599,8 +600,9 @@ github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzL 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/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= @@ -1021,8 +1023,8 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -gonum.org/v1/gonum v0.15.1 h1:FNy7N6OUZVUaWG9pTiD+jlhdQ3lMP+/LcTpJ6+a8sQ0= -gonum.org/v1/gonum v0.15.1/go.mod h1:eZTZuRFrzu5pcyjN5wJhcIhnUdNijYxX1T2IcrOGY0o= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= 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= diff --git a/src/syncer-amplitude/main.go b/src/syncer-amplitude/main.go index 4f94206..175e944 100644 --- a/src/syncer-amplitude/main.go +++ b/src/syncer-amplitude/main.go @@ -1,7 +1,13 @@ package main +import ( + "github.com/BemiHQ/BemiDB/src/common" +) + func main() { config := LoadConfig() + defer common.HandleUnexpectedPanic(config.CommonConfig) + syncer := NewSyncer(config) syncer.Sync() } diff --git a/src/syncer-amplitude/syncer.go b/src/syncer-amplitude/syncer.go index a543d21..64a1864 100644 --- a/src/syncer-amplitude/syncer.go +++ b/src/syncer-amplitude/syncer.go @@ -6,6 +6,7 @@ import ( "strings" "time" + "github.com/BemiHQ/BemiDB/src/common" "github.com/BemiHQ/BemiDB/src/syncer-common" ) @@ -27,9 +28,9 @@ func NewSyncer(config *Config) *Syncer { } func (syncer *Syncer) Sync() { - common.SendAnonymousAnalytics(syncer.Config.BaseConfig, "syncer-amplitude-start", syncer.name()) + syncerCommon.SendAnonymousAnalytics(syncer.Config.CommonConfig, "syncer-amplitude-start", syncer.name()) - trino := common.NewTrino(syncer.Config.BaseConfig) + trino := syncerCommon.NewTrino(syncer.Config.CommonConfig, syncer.Config.TrinoConfig, syncer.Config.DestinationSchemaName) defer trino.Close() trino.CreateSchemaIfNotExists() @@ -41,13 +42,13 @@ func (syncer *Syncer) Sync() { if lastSyncedTime.IsZero() { lastSyncedTime = syncer.Config.StartDate } else { - common.LogInfo(syncer.Config.BaseConfig, "Last synced time found:", lastSyncedTime) + common.LogInfo(syncer.Config.CommonConfig, "Last synced time found:", lastSyncedTime) syncer.deleteHourFromTable(trino, quotedTablePath, lastSyncedTime) } now := time.Now().UTC() endOfSyncWindow := now.Add(-AMPLITUDE_DATA_DELAY).Truncate(time.Hour) - common.LogInfo(syncer.Config.BaseConfig, "Starting incremental sync from", lastSyncedTime, "to", endOfSyncWindow) + common.LogInfo(syncer.Config.CommonConfig, "Starting incremental sync from", lastSyncedTime, "to", endOfSyncWindow) for t := lastSyncedTime; t.Before(endOfSyncWindow); t = t.Add(PAGINATION_TIME_INTERVAL) { startTime := t @@ -55,10 +56,10 @@ func (syncer *Syncer) Sync() { events, err := syncer.Amplitude.Export(startTime, endTime) if err != nil && strings.Contains(err.Error(), "Raw data files were not found.") { - common.LogInfo(syncer.Config.BaseConfig, "No data found for the time range", startTime, "to", endTime, "- will retry later.") + common.LogInfo(syncer.Config.CommonConfig, "No data found for the time range", startTime, "to", endTime, "- will retry later.") break } - common.PanicIfError(syncer.Config.BaseConfig, err) + common.PanicIfError(syncer.Config.CommonConfig, err) if len(events) > 0 { syncer.insertEvents(trino, quotedTablePath, events) @@ -66,18 +67,18 @@ func (syncer *Syncer) Sync() { // Compact every 24 hours if t.Hour() == 23 { - common.LogInfo(syncer.Config.BaseConfig, "Compacting...") + common.LogInfo(syncer.Config.CommonConfig, "Compacting...") trino.CompactTable(quotedTablePath) } } - common.LogInfo(syncer.Config.BaseConfig, "Compacting...") + common.LogInfo(syncer.Config.CommonConfig, "Compacting...") trino.CompactTable(quotedTablePath) - common.SendAnonymousAnalytics(syncer.Config.BaseConfig, "syncer-amplitude-finish", syncer.name()) + syncerCommon.SendAnonymousAnalytics(syncer.Config.CommonConfig, "syncer-amplitude-finish", syncer.name()) } -func (syncer *Syncer) findLastCursorValue(trino *common.Trino) time.Time { +func (syncer *Syncer) findLastCursorValue(trino *syncerCommon.Trino) time.Time { var nullString sql.NullString query := `SELECT CAST(max("server_upload_time") AS VARCHAR) FROM ` + trino.Schema() + `."` + EVENTS_TABLE_NAME + `"` err := trino.QueryRowContext( @@ -90,20 +91,20 @@ func (syncer *Syncer) findLastCursorValue(trino *common.Trino) time.Time { return time.Time{} } if strings.Contains(err.Error(), "does not exist") || strings.Contains(err.Error(), "Table not found") { - common.LogInfo(syncer.Config.BaseConfig, "Table", EVENTS_TABLE_NAME, "does not exist yet. Starting from scratch.") + common.LogInfo(syncer.Config.CommonConfig, "Table", EVENTS_TABLE_NAME, "does not exist yet. Starting from scratch.") return time.Time{} } - common.PanicIfError(syncer.Config.BaseConfig, err) + common.PanicIfError(syncer.Config.CommonConfig, err) } if !nullString.Valid || nullString.String == "" { return time.Time{} } - return common.StringMsToUtcTime(nullString.String).Truncate(time.Hour) + return syncerCommon.StringMsToUtcTime(nullString.String).Truncate(time.Hour) } -func (syncer *Syncer) insertEvents(trino *common.Trino, quotedTrinoTablePath string, events []Event) { +func (syncer *Syncer) insertEvents(trino *syncerCommon.Trino, quotedTrinoTablePath string, events []Event) { if len(events) == 0 { return } @@ -121,15 +122,15 @@ func (syncer *Syncer) insertEvents(trino *common.Trino, quotedTrinoTablePath str } currentRowCount++ - if len(currentSql)+len(rowValuesStatement)+1 < common.TRINO_MAX_QUERY_LENGTH { // +1 for the comma + if len(currentSql)+len(rowValuesStatement)+1 < syncerCommon.TRINO_MAX_QUERY_LENGTH { // +1 for the comma if currentSql != insertSqlPrefix { currentSql += "," } currentSql += rowValuesStatement } else { _, err := trino.ExecContext(ctx, currentSql) - common.PanicIfError(syncer.Config.BaseConfig, err) - common.LogInfo(syncer.Config.BaseConfig, "Inserted", currentRowCount, "rows into table:", quotedTrinoTablePath) + common.PanicIfError(syncer.Config.CommonConfig, err) + common.LogInfo(syncer.Config.CommonConfig, "Inserted", currentRowCount, "rows into table:", quotedTrinoTablePath) currentSql = insertSqlPrefix + rowValuesStatement currentRowCount = 1 } @@ -137,21 +138,21 @@ func (syncer *Syncer) insertEvents(trino *common.Trino, quotedTrinoTablePath str if currentSql != insertSqlPrefix { _, err := trino.ExecContext(ctx, currentSql) - common.PanicIfError(syncer.Config.BaseConfig, err) - common.LogInfo(syncer.Config.BaseConfig, "Inserted", currentRowCount, "rows into table:", quotedTrinoTablePath) + common.PanicIfError(syncer.Config.CommonConfig, err) + common.LogInfo(syncer.Config.CommonConfig, "Inserted", currentRowCount, "rows into table:", quotedTrinoTablePath) } } -func (syncer *Syncer) deleteHourFromTable(trino *common.Trino, quotedTablePath string, startTime time.Time) { +func (syncer *Syncer) deleteHourFromTable(trino *syncerCommon.Trino, quotedTablePath string, startTime time.Time) { result, err := trino.ExecContext( context.Background(), - `DELETE FROM `+quotedTablePath+` WHERE "server_upload_time" >= TIMESTAMP '`+common.TimeToUtcStringMs(startTime)+`'`, + `DELETE FROM `+quotedTablePath+` WHERE "server_upload_time" >= TIMESTAMP '`+syncerCommon.TimeToUtcStringMs(startTime)+`'`, ) - common.PanicIfError(syncer.Config.BaseConfig, err) + common.PanicIfError(syncer.Config.CommonConfig, err) rowCount, err := result.RowsAffected() - common.PanicIfError(syncer.Config.BaseConfig, err) - common.LogInfo(syncer.Config.BaseConfig, "Deleted", rowCount, "rows after", startTime) + common.PanicIfError(syncer.Config.CommonConfig, err) + common.LogInfo(syncer.Config.CommonConfig, "Deleted", rowCount, "rows after", startTime) } func (syncer *Syncer) name() string { diff --git a/src/syncer-common/capped_buffer.go b/src/syncer-common/capped_buffer.go index 3e310ee..e4603cd 100644 --- a/src/syncer-common/capped_buffer.go +++ b/src/syncer-common/capped_buffer.go @@ -1,14 +1,16 @@ -package common +package syncerCommon import ( "errors" "io" "sync" + + "github.com/BemiHQ/BemiDB/src/common" ) type CappedBuffer struct { - config *BaseConfig - maxSizeBytes int + Config *common.CommonConfig + MaxSizeBytes int buffer []byte mutex sync.Mutex @@ -18,11 +20,11 @@ type CappedBuffer struct { closed bool } -func NewCappedBuffer(config *BaseConfig, maxSizeBytes int) *CappedBuffer { +func NewCappedBuffer(config *common.CommonConfig, maxSizeBytes int) *CappedBuffer { sizedBuffer := &CappedBuffer{ - config: config, + Config: config, buffer: make([]byte, 0, maxSizeBytes), - maxSizeBytes: maxSizeBytes, + MaxSizeBytes: maxSizeBytes, } sizedBuffer.conditionalSync = sync.NewCond(&sizedBuffer.mutex) return sizedBuffer @@ -41,8 +43,8 @@ func (buf *CappedBuffer) Write(payload []byte) (writtenBytes int, err error) { return 0, errors.New("buffer is closed") } - for len(buf.buffer)+len(payload) > buf.maxSizeBytes && !buf.closed { - LogTrace(buf.config, ">> Waiting for more space in capped buffer...") + for len(buf.buffer)+len(payload) > buf.MaxSizeBytes && !buf.closed { + common.LogTrace(buf.Config, ">> Waiting for more space in capped buffer...") buf.conditionalSync.Wait() // Wait for the reader } @@ -53,7 +55,7 @@ func (buf *CappedBuffer) Write(payload []byte) (writtenBytes int, err error) { writtenBytes = len(payload) buf.buffer = append(buf.buffer, payload...) - LogTrace(buf.config, ">> Writing", writtenBytes, "bytes to capped buffer...") + common.LogTrace(buf.Config, ">> Writing", writtenBytes, "bytes to capped buffer...") buf.conditionalSync.Broadcast() // Notify the reader that new data is available @@ -70,7 +72,7 @@ func (buf *CappedBuffer) Read(payload []byte) (readBytes int, err error) { defer buf.mutex.Unlock() for len(buf.buffer) == 0 && !buf.closed { - LogTrace(buf.config, "<< Waiting for more data in capped buffer...") + common.LogTrace(buf.Config, "<< Waiting for more data in capped buffer...") buf.conditionalSync.Wait() // Wait for the writer } @@ -81,7 +83,7 @@ func (buf *CappedBuffer) Read(payload []byte) (readBytes int, err error) { maxReadBytes := len(payload) readBytes = copy(payload, buf.buffer) buf.buffer = buf.buffer[readBytes:] - LogTrace(buf.config, "<< Reading "+IntToString(readBytes)+"/"+IntToString(maxReadBytes)+" bytes from capped buffer...") + common.LogTrace(buf.Config, "<< Reading "+common.IntToString(readBytes)+"/"+common.IntToString(maxReadBytes)+" bytes from capped buffer...") buf.conditionalSync.Broadcast() // Notify the writer that space is now available @@ -92,7 +94,7 @@ func (buf *CappedBuffer) Close() error { buf.closeOnceSync.Do(func() { buf.mutex.Lock() - LogTrace(buf.config, "== Closing capped buffer...") + common.LogTrace(buf.Config, "== Closing capped buffer...") buf.closed = true buf.conditionalSync.Broadcast() // Wake up any waiting writers/readers diff --git a/src/syncer-common/capped_buffer_test.go b/src/syncer-common/capped_buffer_test.go index 94ba941..f43500c 100644 --- a/src/syncer-common/capped_buffer_test.go +++ b/src/syncer-common/capped_buffer_test.go @@ -1,4 +1,4 @@ -package common +package syncerCommon import ( "bytes" @@ -6,11 +6,13 @@ import ( "sync" "testing" "time" + + "github.com/BemiHQ/BemiDB/src/common" ) -func initTestConfig() *BaseConfig { - return &BaseConfig{ - LogLevel: LOG_LEVEL_INFO, // Use INFO to avoid excessive logging during tests +func initTestConfig() *common.CommonConfig { + return &common.CommonConfig{ + LogLevel: common.LOG_LEVEL_INFO, // Use INFO to avoid excessive logging during tests } } diff --git a/src/syncer-common/duckdb.go b/src/syncer-common/duckdb.go deleted file mode 100644 index b082009..0000000 --- a/src/syncer-common/duckdb.go +++ /dev/null @@ -1,100 +0,0 @@ -package common - -import ( - "context" - "database/sql" - "strings" - - goDuckdb "github.com/marcboeker/go-duckdb/v2" -) - -var DUCKDB_INIT_BOOT_QUERIES = []string{ - "INSTALL iceberg", - "LOAD iceberg", - "SET timezone='UTC'", - "SET memory_limit='2GB'", -} - -type Duckdb struct { - Db *sql.DB - Connector *goDuckdb.Connector - Config *BaseConfig -} - -func NewDuckdb(config *BaseConfig) *Duckdb { - ctx := context.Background() - connector, err := goDuckdb.NewConnector("", nil) - PanicIfError(config, err) - db := sql.OpenDB(connector) - PanicIfError(config, err) - - duckdb := &Duckdb{ - Db: db, - Connector: connector, - Config: config, - } - - for _, query := range DUCKDB_INIT_BOOT_QUERIES { - _, err := duckdb.ExecContext(ctx, query, nil) - PanicIfError(config, err) - } - - duckdb.setExplicitAwsCredentials(ctx) - - if IsLocalHost(config.Aws.S3Endpoint) { - _, err = duckdb.ExecContext(ctx, "SET s3_use_ssl=false", nil) - PanicIfError(config, err) - } - - if config.Aws.S3Endpoint != DEFAULT_AWS_S3_ENDPOINT { - // Use endpoint/bucket/key (path, deprecated on AWS) instead of bucket.endpoint/key (vhost) - _, err = duckdb.ExecContext(ctx, "SET s3_url_style='path'", nil) - PanicIfError(config, err) - } - - if config.LogLevel == LOG_LEVEL_TRACE { - _, err = duckdb.ExecContext(ctx, "PRAGMA enable_logging('HTTP')", nil) - PanicIfError(config, err) - _, err = duckdb.ExecContext(ctx, "SET logging_storage = 'stdout'", nil) - PanicIfError(config, err) - } - - return duckdb -} - -func (duckdb *Duckdb) ExecContext(ctx context.Context, query string, args map[string]string) (sql.Result, error) { - LogDebug(duckdb.Config, "Querying DuckDB:", query, args) - return duckdb.Db.ExecContext(ctx, replaceNamedStringArgs(query, args)) -} - -func (duckdb *Duckdb) Appender(schema string, table string) (*goDuckdb.Appender, error) { - conn, err := duckdb.Connector.Connect(context.Background()) - if err != nil { - return nil, err - } - return goDuckdb.NewAppenderFromConn(conn, schema, table) -} - -func (duckdb *Duckdb) Close() { - duckdb.Db.Close() -} - -func (duckdb *Duckdb) setExplicitAwsCredentials(ctx context.Context) { - Config := duckdb.Config - query := "CREATE OR REPLACE SECRET aws_s3_secret (TYPE S3, KEY_ID '$accessKeyId', SECRET '$secretAccessKey', REGION '$region', ENDPOINT '$endpoint', SCOPE '$s3Bucket')" - _, err := duckdb.ExecContext(ctx, query, map[string]string{ - "accessKeyId": Config.Aws.AccessKeyId, - "secretAccessKey": Config.Aws.SecretAccessKey, - "region": Config.Aws.Region, - "endpoint": Config.Aws.S3Endpoint, - "s3Bucket": "s3://" + Config.Aws.S3Bucket, - }) - PanicIfError(Config, err) -} - -func replaceNamedStringArgs(query string, args map[string]string) string { - for key, value := range args { - query = strings.ReplaceAll(query, "$"+key, value) - } - return query -} diff --git a/src/syncer-common/error_utils.go b/src/syncer-common/error_utils.go deleted file mode 100644 index 4fc7d6a..0000000 --- a/src/syncer-common/error_utils.go +++ /dev/null @@ -1,49 +0,0 @@ -package common - -import ( - "bytes" - "encoding/json" - "net/http" - "runtime" - "runtime/debug" - "time" -) - -func PanicIfError(config *BaseConfig, err error) { - if err != nil { - sendAnonymousErrorReport(config, err) - panic(err) - } -} - -type AnonymousErrorData struct { - Command string `json:"command"` - OsName string `json:"osName"` - Version string `json:"version"` - Error string `json:"error"` - StackTrace string `json:"stackTrace"` - S3Bucket string `json:"s3Bucket"` -} - -func sendAnonymousErrorReport(config *BaseConfig, err error) { - if config.DisableAnonymousAnalytics { - return - } - - data := AnonymousErrorData{ - Command: "syncer", - OsName: runtime.GOOS + "-" + runtime.GOARCH, - Version: VERSION, - Error: err.Error(), - StackTrace: string(debug.Stack()), - S3Bucket: config.Aws.S3Endpoint + "/" + config.Aws.S3Bucket, - } - - jsonData, err := json.Marshal(data) - if err != nil { - return - } - - client := http.Client{Timeout: 5 * time.Second} - _, _ = client.Post("https://api.bemidb.com/api/errors", "application/json", bytes.NewBuffer(jsonData)) -} diff --git a/src/syncer-common/go.mod b/src/syncer-common/go.mod index c175670..4e790e0 100644 --- a/src/syncer-common/go.mod +++ b/src/syncer-common/go.mod @@ -3,60 +3,63 @@ module github.com/BemiHQ/BemiDB/src/syncer-common go 1.24.4 require ( - github.com/aws/aws-sdk-go-v2 v1.36.6 - github.com/aws/aws-sdk-go-v2/config v1.29.18 - github.com/aws/aws-sdk-go-v2/credentials v1.17.71 - github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.85 - github.com/aws/aws-sdk-go-v2/service/s3 v1.84.1 + github.com/BemiHQ/BemiDB/src/common v0.0.0-00010101000000-000000000000 github.com/google/uuid v1.6.0 - github.com/jackc/pgx/v5 v5.7.5 github.com/linkedin/goavro v2.1.0+incompatible - github.com/marcboeker/go-duckdb/v2 v2.3.3 + github.com/marcboeker/go-duckdb/v2 v2.3.2 github.com/trinodb/trino-go-client v0.323.0 github.com/xitongsys/parquet-go v1.6.2 github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b golang.org/x/exp v0.0.0-20250718183923-645b1fa84792 ) +replace github.com/BemiHQ/BemiDB/src/common => ../common + require ( - github.com/apache/arrow-go/v18 v18.1.0 // indirect + github.com/apache/arrow-go/v18 v18.4.0 // indirect github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 // indirect - github.com/apache/thrift v0.21.0 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.11 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.33 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.37 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.37 // indirect + github.com/apache/thrift v0.22.0 // indirect + github.com/aws/aws-sdk-go-v2 v1.37.0 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 // indirect + github.com/aws/aws-sdk-go-v2/config v1.30.1 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.18.1 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0 // indirect + github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.37 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.4 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.5 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.18 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.18 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.25.6 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.4 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.34.1 // indirect - github.com/aws/smithy-go v1.22.4 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.26.0 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.35.0 // indirect + github.com/aws/smithy-go v1.22.5 // indirect github.com/duckdb/duckdb-go-bindings v0.1.17 // indirect github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.12 // indirect github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.12 // indirect github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.12 // indirect github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.12 // indirect github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.12 // indirect - github.com/go-viper/mapstructure/v2 v2.2.1 // indirect + github.com/go-viper/mapstructure/v2 v2.3.0 // indirect github.com/goccy/go-json v0.10.5 // indirect - github.com/golang/snappy v0.0.4 // indirect - github.com/google/flatbuffers v25.1.24+incompatible // indirect + github.com/golang/snappy v1.0.0 // indirect + github.com/google/flatbuffers v25.2.10+incompatible // indirect github.com/hashicorp/go-uuid v1.0.3 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect + github.com/jackc/pgx/v5 v5.7.5 // indirect github.com/jcmturner/aescts/v2 v2.0.0 // indirect github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect github.com/jcmturner/gofork v1.7.6 // indirect github.com/jcmturner/goidentity/v6 v6.0.1 // indirect github.com/jcmturner/gokrb5/v8 v8.4.4 // indirect github.com/jcmturner/rpc/v2 v2.0.3 // indirect - github.com/klauspost/compress v1.17.11 // indirect - github.com/klauspost/cpuid/v2 v2.2.9 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.11 // indirect github.com/marcboeker/go-duckdb/arrowmapping v0.0.10 // indirect github.com/marcboeker/go-duckdb/mapping v0.0.11 // indirect github.com/pierrec/lz4/v4 v4.1.22 // indirect diff --git a/src/syncer-common/go.sum b/src/syncer-common/go.sum index b616521..61efc30 100644 --- a/src/syncer-common/go.sum +++ b/src/syncer-common/go.sum @@ -124,17 +124,17 @@ github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8 github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/ahmetb/dlog v0.0.0-20170105205344-4fb5f8204f26 h1:3YVZUqkoev4mL+aCwVOSWV4M7pN+NURHL38Z2zq5JKA= github.com/ahmetb/dlog v0.0.0-20170105205344-4fb5f8204f26/go.mod h1:ymXt5bw5uSNu4jveerFxE0vNYxF8ncqbptntMaFMg3k= -github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA= -github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA= +github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= +github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/apache/arrow-go/v18 v18.1.0 h1:agLwJUiVuwXZdwPYVrlITfx7bndULJ/dggbnLFgDp/Y= -github.com/apache/arrow-go/v18 v18.1.0/go.mod h1:tigU/sIgKNXaesf5d7Y95jBBKS5KsxTqYBKXFsvKzo0= +github.com/apache/arrow-go/v18 v18.4.0 h1:/RvkGqH517iY8bZKc4FD5/kkdwXJGjxf28JIXbJ/oB0= +github.com/apache/arrow-go/v18 v18.4.0/go.mod h1:Aawvwhj8x2jURIzD9Moy72cF0FyJXOpkYpdmGRHcw14= github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 h1:byKBBF2CKWBjjA4J1ZL2JXttJULvWSl50LegTyRZ728= github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516/go.mod h1:QNYViu/X0HXDHw7m3KXzWSVXIbfUvJqBFe6Gj8/pYA0= github.com/apache/thrift v0.0.0-20181112125854-24918abba929/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.14.2/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.21.0 h1:tdPmh/ptjE1IJnhbhrcl2++TauVjy242rkV/UzJChnE= -github.com/apache/thrift v0.21.0/go.mod h1:W1H8aR/QRtYNvrPeFXBtobyRkd0/YVhTc6i07XIAgDw= +github.com/apache/thrift v0.22.0 h1:r7mTJdj51TMDe6RtcmNdQxgn9XcyfGDOzegMDRg47uc= +github.com/apache/thrift v0.22.0/go.mod h1:1e7J/O1Ae6ZQMTYdy9xa3w9k+XHWPfRvdPyJeynQ+/g= github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= github.com/aws/aws-sdk-go v1.30.19/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= github.com/aws/aws-sdk-go v1.37.0/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= @@ -142,83 +142,83 @@ github.com/aws/aws-sdk-go v1.43.31 h1:yJZIr8nMV1hXjAvvOLUFqZRJcHV7udPQBfhJqawDzI github.com/aws/aws-sdk-go v1.43.31/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go-v2 v1.16.2/go.mod h1:ytwTPBG6fXTZLxxeeCCWj2/EMYp/xDUgX+OET6TLNNU= github.com/aws/aws-sdk-go-v2 v1.23.0/go.mod h1:i1XDttT4rnf6vxc9AuskLc6s7XBee8rlLilKlc03uAA= -github.com/aws/aws-sdk-go-v2 v1.36.6 h1:zJqGjVbRdTPojeCGWn5IR5pbJwSQSBh5RWFTQcEQGdU= -github.com/aws/aws-sdk-go-v2 v1.36.6/go.mod h1:EYrzvCCN9CMUTa5+6lf6MM4tq3Zjp8UhSGR/cBsjai0= +github.com/aws/aws-sdk-go-v2 v1.37.0 h1:YtCOESR/pN4j5oA7cVHSfOwIcuh/KwHC4DOSXFbv5F0= +github.com/aws/aws-sdk-go-v2 v1.37.0/go.mod h1:9Q0OoGQoboYIAJyslFyF1f5K1Ryddop8gqMhWx/n4Wg= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.1/go.mod h1:n8Bs1ElDD2wJ9kCRTczA83gYbBmjSwZp3umc6zF4EeM= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.1/go.mod h1:t8PYl/6LzdAqsU4/9tz28V/kU+asFePvpOMkdul0gEQ= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.11 h1:12SpdwU8Djs+YGklkinSSlcrPyj3H4VifVsKf78KbwA= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.11/go.mod h1:dd+Lkp6YmMryke+qxW/VnKyhMBDTYP41Q2Bb+6gNZgY= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 h1:6GMWV6CNpA/6fbFHnoAjrv4+LGfyTqZz2LtCHnspgDg= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0/go.mod h1:/mXlTIVG9jbxkqDnr5UQNQxW1HRYxeGklkM9vAFeabg= github.com/aws/aws-sdk-go-v2/config v1.15.3/go.mod h1:9YL3v07Xc/ohTsxFXzan9ZpFpdTOFl4X65BAKYaz8jg= github.com/aws/aws-sdk-go-v2/config v1.25.3/go.mod h1:tAByZy03nH5jcq0vZmkcVoo6tRzRHEwSFx3QW4NmDw8= -github.com/aws/aws-sdk-go-v2/config v1.29.18 h1:x4T1GRPnqKV8HMJOMtNktbpQMl3bIsfx8KbqmveUO2I= -github.com/aws/aws-sdk-go-v2/config v1.29.18/go.mod h1:bvz8oXugIsH8K7HLhBv06vDqnFv3NsGDt2Znpk7zmOU= +github.com/aws/aws-sdk-go-v2/config v1.30.1 h1:sHL8g/+9tcZATeV2tEkEfxZeaNokDtKsSjGMGHD49qA= +github.com/aws/aws-sdk-go-v2/config v1.30.1/go.mod h1:wkibEyFfxXRyTSzRU4bbF5IUsSXyE4xQ4ZjkGmi5tFo= github.com/aws/aws-sdk-go-v2/credentials v1.11.2/go.mod h1:j8YsY9TXTm31k4eFhspiQicfXPLZ0gYXA50i4gxPE8g= github.com/aws/aws-sdk-go-v2/credentials v1.16.2/go.mod h1:sDdvGhXrSVT5yzBDR7qXz+rhbpiMpUYfF3vJ01QSdrc= -github.com/aws/aws-sdk-go-v2/credentials v1.17.71 h1:r2w4mQWnrTMJjOyIsZtGp3R3XGY3nqHn8C26C2lQWgA= -github.com/aws/aws-sdk-go-v2/credentials v1.17.71/go.mod h1:E7VF3acIup4GB5ckzbKFrCK0vTvEQxOxgdq4U3vcMCY= +github.com/aws/aws-sdk-go-v2/credentials v1.18.1 h1:E55xvOqlX7CvB66Z7rSM9usCrFU1ryUIUHqiXsEzVoE= +github.com/aws/aws-sdk-go-v2/credentials v1.18.1/go.mod h1:iobSQfR5MkvILxssGOvi/P1jjOhrRzfTiCPCzku0vx4= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.3/go.mod h1:uk1vhHHERfSVCUnqSqz8O48LBYDSC+k6brng09jcMOk= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.4/go.mod h1:t4i+yGHMCcUNIX1x7YVYa6bH/Do7civ5I6cG/6PMfyA= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.33 h1:D9ixiWSG4lyUBL2DDNK924Px9V/NBVpML90MHqyTADY= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.33/go.mod h1:caS/m4DI+cij2paz3rtProRBI4s/+TCiWoaWZuQ9010= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0 h1:9sBTeKQwAvmJUWKIACIoiFSnxxl+sS++YDfr17/ngq0= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0/go.mod h1:LW9/PxQD1SYFC7pnWcgqPhoyZprhjEdg5hBK6qYPLW8= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.3/go.mod h1:0dHuD2HZZSiwfJSy1FO5bX1hQ1TxVV1QXXjpn3XUE44= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.14.0/go.mod h1:UcgIwJ9KHquYxs6Q5skC9qXjhYMK+JASDYcXQ4X7JZE= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.85 h1:AfpstoiaenxGSCUheWiicgZE5XXS5Fi4CcQ4PA/x+Qw= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.85/go.mod h1:HxiF0Fd6WHWjdjOffLkCauq7JqzWqMMq0iUVLS7cPQc= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1 h1:aAjA/1JZ1xH/F9XvxJu9cXZyp7BqVXtHpztyZ6p799E= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1/go.mod h1:ia9HASsPba/7o84sp6iE4wZPdNTJ0oicBe5sWQQk+Ys= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.9/go.mod h1:AnVH5pvai0pAF4lXRq0bmhbes1u9R8wTE+g+183bZNM= github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.3/go.mod h1:7sGSz1JCKHWWBHq98m6sMtWQikmYPpxjqOydDemiVoM= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.37 h1:osMWfm/sC/L4tvEdQ65Gri5ZZDCUpuYJZbTTDrsn4I0= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.37/go.mod h1:ZV2/1fbjOPr4G4v38G3Ww5TBT4+hmsK45s/rxu1fGy0= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0 h1:H2iZoqW/v2Jnrh1FnU725Bq6KJ0k2uP63yH+DcY+HUI= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0/go.mod h1:L0FqLbwMXHvNC/7crWV1iIxUlOKYZUE8KuTIA+TozAI= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.3/go.mod h1:ssOhaLpRlh88H3UmEcsBoVKq309quMvm3Ds8e9d4eJM= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.3/go.mod h1:ify42Rb7nKeDDPkFjKn7q1bPscVPu/+gmHH8d2c+anU= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.37 h1:v+X21AvTb2wZ+ycg1gx+orkB/9U6L7AOp93R7qYxsxM= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.37/go.mod h1:G0uM1kyssELxmJ2VZEfG0q2npObR3BAkF3c1VsfVnfs= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0 h1:EDped/rNzAhFPhVY0sDGbtD16OKqksfA8OjF/kLEgw8= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0/go.mod h1:uUI335jvzpZRPpjYx6ODc/wg1qH+NnoSTK/FwVeK0C0= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.10/go.mod h1:8DcYQcz0+ZJaSxANlHIsbbi6S+zMwjwdDqwW3r9AzaE= github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.3/go.mod h1:5yzAuE9i2RkVAttBl8yxZgQr5OCq4D5yDnG7j9x2L0U= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.37 h1:XTZZ0I3SZUHAtBLBU6395ad+VOblE0DwQP6MuaNeics= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.37/go.mod h1:Pi6ksbniAWVwu2S8pEzcYPyhUkAcLaufxN7PfAUQjBk= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0 h1:iLvW/zOkHGU3BDU5thWnj+UZ9pjhuVhv1loLj7yVtBw= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0/go.mod h1:Fn3gvhdF1x5Rs9nUoCy/fJT1ms8f8dO7RqM9lJHuazQ= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.1/go.mod h1:GeUru+8VzrTXV/83XyMJ80KpH8xO89VPoUileyNQ+tc= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1/go.mod h1:l9ymW25HOqymeU2m1gbUQ3rUIsTwKs8gYHXkqDQUhiI= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.4 h1:CXV68E2dNqhuynZJPB80bhPQwAKqBWVer887figW6Jc= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.4/go.mod h1:/xFi9KtvBXP97ppCz1TAEvU1Uf66qvid89rbem3wCzQ= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 h1:6+lZi2JeGKtCraAj1rpoZfKqnQ9SptseRZioejfUOLM= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0/go.mod h1:eb3gfbVIxIoGgJsi9pGne19dhCBpK6opTYpQqAmdy44= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.3/go.mod h1:Seb8KNmD6kVTjwRjVEgOT5hPin6sq+v4C2ycJQDwuH8= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.3/go.mod h1:R+/S1O4TYpcktbVwddeOYg+uwUfLhADP2S/x4QwsCTM= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.5 h1:M5/B8JUaCI8+9QD+u3S/f4YHpvqE9RpSkV3rf0Iks2w= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.5/go.mod h1:Bktzci1bwdbpuLiu3AOksiNPMl/LLKmX1TWmqp2xbvs= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0 h1:qGyLBQPphYzUf+IIlb5tHnvg1U2Vc5hXPcP7oRSQfy0= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0/go.mod h1:g+dzKSLXiR/8ATkPXmLhPOI6rDdjLP3tngeo3FvDcIw= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.3/go.mod h1:wlY6SVjuwvh3TVRpTqdy4I1JpBFLX4UGeKZdWntaocw= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.3/go.mod h1:Owv1I59vaghv1Ax8zz8ELY8DN7/Y0rGS+WWAmjgi950= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.18 h1:vvbXsA2TVO80/KT7ZqCbx934dt6PY+vQ8hZpUZ/cpYg= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.18/go.mod h1:m2JJHledjBGNMsLOF1g9gbAxprzq3KjC8e4lxtn+eWg= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0 h1:eRhU3Sh8dGbaniI6B+I48XJMrTPRkK4DKo+vqIxziOU= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0/go.mod h1:paNLV18DZ6FnWE/bd06RIKPDIFpjuvCkGKWTG/GDBeM= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.3/go.mod h1:Bm/v2IaN6rZ+Op7zX+bOUMdL4fsrYZiD0dsjLhNKwZc= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.3/go.mod h1:KZgs2ny8HsxRIRbDwgvJcHHBZPOzQr/+NtGwnP+w2ec= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.18 h1:OS2e0SKqsU2LiJPqL8u9x41tKc6MMEHrWjLVLn3oysg= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.18/go.mod h1:+Yrk+MDGzlNGxCXieljNeWpoZTCQUQVL+Jk9hGGJ8qM= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0 h1:6jusT+XCcvnD+Elxvm7bUf5sCMTpZEp3AKjYQ4tWJSo= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0/go.mod h1:LimGpdIF/sTBdgqwOEkrArXLCoTamK/9L9x8IKBFTIc= github.com/aws/aws-sdk-go-v2/service/kms v1.16.3/go.mod h1:QuiHPBqlOFCi4LqdSskYYAWpQlx3PKmohy+rE2F+o5g= github.com/aws/aws-sdk-go-v2/service/s3 v1.26.3/go.mod h1:g1qvDuRsJY+XghsV6zg00Z4KJ7DtFFCx8fJD2a491Ak= github.com/aws/aws-sdk-go-v2/service/s3 v1.43.0/go.mod h1:NXRKkiRF+erX2hnybnVU660cYT5/KChRD4iUgJ97cI8= -github.com/aws/aws-sdk-go-v2/service/s3 v1.84.1 h1:RkHXU9jP0DptGy7qKI8CBGsUJruWz0v5IgwBa2DwWcU= -github.com/aws/aws-sdk-go-v2/service/s3 v1.84.1/go.mod h1:3xAOf7tdKF+qbb+XpU+EPhNXAdun3Lu1RcDrj8KC24I= +github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0 h1:gAV4NEp4A+JOrIdoXkAeyy6IOo7+X2s/jRuaHKYiMaU= +github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0/go.mod h1:JIQwK8sZ5MuKGm5rrFwp9MHUcyYEsQNpVixuPDlnwaU= github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.15.4/go.mod h1:PJc8s+lxyU8rrre0/4a0pn2wgwiDvOEzoOjcJUBr67o= github.com/aws/aws-sdk-go-v2/service/sns v1.17.4/go.mod h1:kElt+uCcXxcqFyc+bQqZPFD9DME/eC6oHBXvFzQ9Bcw= github.com/aws/aws-sdk-go-v2/service/sqs v1.18.3/go.mod h1:skmQo0UPvsjsuYYSYMVmrPc1HWCbHUJyrCEp+ZaLzqM= github.com/aws/aws-sdk-go-v2/service/ssm v1.24.1/go.mod h1:NR/xoKjdbRJ+qx0pMR4mI+N/H1I1ynHwXnO6FowXJc0= github.com/aws/aws-sdk-go-v2/service/sso v1.11.3/go.mod h1:7UQ/e69kU7LDPtY40OyoHYgRmgfGM4mgsLYtcObdveU= github.com/aws/aws-sdk-go-v2/service/sso v1.17.2/go.mod h1:/pE21vno3q1h4bbhUOEi+6Zu/aT26UK2WKkDXd+TssQ= -github.com/aws/aws-sdk-go-v2/service/sso v1.25.6 h1:rGtWqkQbPk7Bkwuv3NzpE/scwwL9sC1Ul3tn9x83DUI= -github.com/aws/aws-sdk-go-v2/service/sso v1.25.6/go.mod h1:u4ku9OLv4TO4bCPdxf4fA1upaMaJmP9ZijGk3AAOC6Q= +github.com/aws/aws-sdk-go-v2/service/sso v1.26.0 h1:cuFWHH87GP1NBGXXfMicUbE7Oty5KpPxN6w4JpmuxYc= +github.com/aws/aws-sdk-go-v2/service/sso v1.26.0/go.mod h1:aJBemdlbCKyOXEXdXBqS7E+8S9XTDcOTaoOjtng54hA= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.20.0/go.mod h1:dWqm5G767qwKPuayKfzm4rjzFmVjiBFbOJrpSPnAMDs= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.4 h1:OV/pxyXh+eMA0TExHEC4jyWdumLxNbzz1P0zJoezkJc= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.4/go.mod h1:8Mm5VGYwtm+r305FfPSuc+aFkrypeylGYhFim6XEPoc= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0 h1:t2va+wewPOYIqC6XyJ4MGjiGKkczMAPsgq5W4FtL9ME= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0/go.mod h1:ExCTcqYqN0hYYRsDlBVU8+68grqlWdgX9/nZJwQW4aY= github.com/aws/aws-sdk-go-v2/service/sts v1.16.3/go.mod h1:bfBj0iVmsUyUg4weDB4NxktD9rDGeKSVWnjTnwbx9b8= github.com/aws/aws-sdk-go-v2/service/sts v1.25.3/go.mod h1:4EqRHDCKP78hq3zOnmFXu5k0j4bXbRFfCh/zQ6KnEfQ= -github.com/aws/aws-sdk-go-v2/service/sts v1.34.1 h1:aUrLQwJfZtwv3/ZNG2xRtEen+NqI3iesuacjP51Mv1s= -github.com/aws/aws-sdk-go-v2/service/sts v1.34.1/go.mod h1:3wFBZKoWnX3r+Sm7in79i54fBmNfwhdNdQuscCw7QIk= +github.com/aws/aws-sdk-go-v2/service/sts v1.35.0 h1:FD9agdG4CeOGS3ORLByJk56YIXDS7mxFpmZyCtpqExc= +github.com/aws/aws-sdk-go-v2/service/sts v1.35.0/go.mod h1:NDzDPbBF1xtSTZUMuZx0w3hIfWzcL7X2AQ0Tr9becIQ= github.com/aws/smithy-go v1.11.2/go.mod h1:3xHYmszWVx2c0kIwQeEVf9uSm4fYZt67FBJnwub1bgM= github.com/aws/smithy-go v1.17.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= -github.com/aws/smithy-go v1.22.4 h1:uqXzVZNuNexwc/xrh6Tb56u89WDlJY6HS+KC0S4QSjw= -github.com/aws/smithy-go v1.22.4/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= +github.com/aws/smithy-go v1.22.5 h1:P9ATCXPMb2mPjYBgueqJNCA5S9UfktsW0tTxi+a7eqw= +github.com/aws/smithy-go v1.22.5/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/bobg/gcsobj v0.1.2/go.mod h1:vS49EQ1A1Ib8FgrL58C8xXYZyOCR2TgzAdopy6/ipa8= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= @@ -248,8 +248,9 @@ github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7 github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= 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/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU= github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= @@ -307,8 +308,8 @@ github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= -github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.3.0 h1:27XbWsHIqhbdR5TIC911OfYvgSaW93HM+dX7970Q7jk= +github.com/go-viper/mapstructure/v2 v2.3.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= @@ -364,13 +365,13 @@ github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= +github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= 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/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/flatbuffers v25.1.24+incompatible h1:4wPqL3K7GzBd1CwyhSd3usxLKOaJN/AC6puCca6Jm7o= -github.com/google/flatbuffers v25.1.24+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/flatbuffers v25.2.10+incompatible h1:F3vclr7C3HpB1k9mxCGRMXq6FdUalZ6H/pNX4FP1v0Q= +github.com/google/flatbuffers v25.2.10+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= 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= @@ -521,13 +522,13 @@ github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYs github.com/klauspost/compress v1.13.1/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= -github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= -github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= -github.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY= -github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8= +github.com/klauspost/cpuid/v2 v2.2.11 h1:0OwqZRYI2rFrjS4kvkDnqJkKHdHaRnCm68/DY4OxRzU= +github.com/klauspost/cpuid/v2 v2.2.11/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= 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/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= @@ -549,8 +550,8 @@ github.com/marcboeker/go-duckdb/arrowmapping v0.0.10 h1:G1W+GVnUefR8uy7jHdNO+CRM github.com/marcboeker/go-duckdb/arrowmapping v0.0.10/go.mod h1:jccUb8TYD0p5TsEEeN4SXuslNJHo23QaKOqKD+U6uFU= github.com/marcboeker/go-duckdb/mapping v0.0.11 h1:fusN1b1l7Myxafifp596I6dNLNhN5Uv/rw31qAqBwqw= github.com/marcboeker/go-duckdb/mapping v0.0.11/go.mod h1:aYBjFLgfKO0aJIbDtXPiaL5/avRQISveX/j9tMf9JhU= -github.com/marcboeker/go-duckdb/v2 v2.3.3 h1:PQhWS1vLtotByrXmUg6YqmTS59WPJEqlCPhp464ZGUU= -github.com/marcboeker/go-duckdb/v2 v2.3.3/go.mod h1:RZgwGE22rly6aWbqO8lsfYjMvNuMd3YoTroWxL37H9E= +github.com/marcboeker/go-duckdb/v2 v2.3.2 h1:96zG2JPyIhCFjHdBjjSpOdhzJzehoGTdl7LskkuMUTs= +github.com/marcboeker/go-duckdb/v2 v2.3.2/go.mod h1:VeXz9ZM6klNvICHrXEUzaHSgNqBeTdyMxr4CICw/UaY= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= @@ -599,8 +600,9 @@ github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzL 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/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= @@ -1021,8 +1023,8 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -gonum.org/v1/gonum v0.15.1 h1:FNy7N6OUZVUaWG9pTiD+jlhdQ3lMP+/LcTpJ6+a8sQ0= -gonum.org/v1/gonum v0.15.1/go.mod h1:eZTZuRFrzu5pcyjN5wJhcIhnUdNijYxX1T2IcrOGY0o= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= 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= diff --git a/src/syncer-common/iceberg_catalog.go b/src/syncer-common/iceberg_catalog.go index 8d79212..883ba53 100644 --- a/src/syncer-common/iceberg_catalog.go +++ b/src/syncer-common/iceberg_catalog.go @@ -1,9 +1,11 @@ -package common +package syncerCommon import ( "context" "database/sql" "strings" + + "github.com/BemiHQ/BemiDB/src/common" ) const ( @@ -14,30 +16,34 @@ const ( ) type IcebergCatalog struct { - Config *BaseConfig + Config *common.CommonConfig + SchemaName string } -func NewIcebergCatalog(config *BaseConfig) *IcebergCatalog { - return &IcebergCatalog{Config: config} +func NewIcebergCatalog(config *common.CommonConfig, schemaName string) *IcebergCatalog { + return &IcebergCatalog{ + Config: config, + SchemaName: schemaName, + } } -func (catalog *IcebergCatalog) TableNames() Set[string] { +func (catalog *IcebergCatalog) TableNames() common.Set[string] { pgClient := catalog.newPgClient() defer pgClient.Close() ctx := context.Background() rows, err := pgClient.Query(ctx, "SELECT table_name FROM iceberg_tables WHERE table_namespace=$1 AND table_name NOT LIKE '%"+TEMP_TABLE_SUFFIX_SYNCING+"' AND table_name NOT LIKE '%"+TEMP_TABLE_SUFFIX_DELETING+"'", - catalog.Config.DestinationSchemaName, + catalog.SchemaName, ) - PanicIfError(catalog.Config, err) + common.PanicIfError(catalog.Config, err) defer rows.Close() - tableNames := make(Set[string]) + tableNames := make(common.Set[string]) for rows.Next() { var table string err := rows.Scan(&table) - PanicIfError(catalog.Config, err) + common.PanicIfError(catalog.Config, err) tableNames.Add(table) } return tableNames @@ -50,7 +56,7 @@ func (catalog *IcebergCatalog) S3TablePath(icebergTableName string) string { ctx := context.Background() row := pgClient.QueryRow(ctx, "SELECT metadata_location FROM iceberg_tables WHERE table_namespace=$1 AND table_name=$2", - catalog.Config.DestinationSchemaName, + catalog.SchemaName, icebergTableName, ) @@ -59,7 +65,7 @@ func (catalog *IcebergCatalog) S3TablePath(icebergTableName string) string { if !nullPath.Valid || nullPath.String == "" { return "" } - PanicIfError(catalog.Config, err) + common.PanicIfError(catalog.Config, err) return strings.Split(nullPath.String, "/metadata/")[0] } @@ -72,10 +78,10 @@ func (catalog *IcebergCatalog) RenameTable(oldIcebergTableName string, newIceber _, err := pgClient.Exec(ctx, "UPDATE iceberg_tables SET table_name=$1 WHERE table_namespace=$2 AND table_name=$3", newIcebergTableName, - catalog.Config.DestinationSchemaName, + catalog.SchemaName, oldIcebergTableName, ) - PanicIfError(nil, err) + common.PanicIfError(catalog.Config, err) } func (catalog *IcebergCatalog) DeleteTable(icebergTableName string) { @@ -85,10 +91,10 @@ func (catalog *IcebergCatalog) DeleteTable(icebergTableName string) { ctx := context.Background() _, err := pgClient.Exec(ctx, "DELETE FROM iceberg_tables WHERE table_namespace=$1 AND table_name=$2", - catalog.Config.DestinationSchemaName, + catalog.SchemaName, icebergTableName, ) - PanicIfError(nil, err) + common.PanicIfError(catalog.Config, err) } func (catalog *IcebergCatalog) CreateTable(icebergTableName string, metadataLocation string) { @@ -99,13 +105,13 @@ func (catalog *IcebergCatalog) CreateTable(icebergTableName string, metadataLoca _, err := pgClient.Exec(ctx, "INSERT INTO iceberg_tables (catalog_name, table_namespace, table_name, metadata_location) VALUES ($1, $2, $3, $4)", CATALOG_NAME, - catalog.Config.DestinationSchemaName, + catalog.SchemaName, icebergTableName, metadataLocation, ) - PanicIfError(nil, err) + common.PanicIfError(catalog.Config, err) } -func (catalog *IcebergCatalog) newPgClient() *Postgres { - return NewPostgres(catalog.Config, catalog.Config.CatalogDatabaseUrl) +func (catalog *IcebergCatalog) newPgClient() *common.PostgresClient { + return common.NewPostgresClient(catalog.Config, catalog.Config.CatalogDatabaseUrl) } diff --git a/src/syncer-common/iceberg_schema_column.go b/src/syncer-common/iceberg_schema_column.go index 4d4830a..ebe98cc 100644 --- a/src/syncer-common/iceberg_schema_column.go +++ b/src/syncer-common/iceberg_schema_column.go @@ -1,4 +1,4 @@ -package common +package syncerCommon import ( "encoding/csv" @@ -7,7 +7,8 @@ import ( "strings" "time" - goDuckdb "github.com/marcboeker/go-duckdb/v2" + "github.com/BemiHQ/BemiDB/src/common" + "github.com/marcboeker/go-duckdb/v2" ) type IcebergColumnType string @@ -34,7 +35,7 @@ const ( ) type IcebergSchemaColumn struct { - Config *BaseConfig + Config *common.CommonConfig ColumnName string ColumnType IcebergColumnType Position int @@ -102,7 +103,7 @@ func (col *IcebergSchemaColumn) IcebergSchemaFieldMap() IcebergSchemaField { case IcebergColumnTypeInteger: icebergSchemaField.Type = "int" case IcebergColumnTypeDecimal: - icebergSchemaField.Type = "decimal(" + IntToString(col.NormalizedPrecision()) + ", " + IntToString(col.NormalizedScale()) + ")" + icebergSchemaField.Type = "decimal(" + common.IntToString(col.NormalizedPrecision()) + ", " + common.IntToString(col.NormalizedScale()) + ")" case IcebergColumnTypeLong: icebergSchemaField.Type = "long" case IcebergColumnTypeFloat: @@ -153,7 +154,7 @@ func (col *IcebergSchemaColumn) DuckdbType() string { case IcebergColumnTypeLong: duckdbType = "BIGINT" case IcebergColumnTypeDecimal: - duckdbType = "DECIMAL(" + IntToString(col.NormalizedPrecision()) + ", " + IntToString(col.NormalizedScale()) + ")" + duckdbType = "DECIMAL(" + common.IntToString(col.NormalizedPrecision()) + ", " + common.IntToString(col.NormalizedScale()) + ")" case IcebergColumnTypeFloat: duckdbType = "FLOAT" case IcebergColumnTypeDouble: @@ -195,7 +196,7 @@ func (col *IcebergSchemaColumn) DuckdbValueFromCsv(value string) interface{} { csvString = strings.ReplaceAll(csvString, "\\\"", "\"\"") // Replace escaped double quotes with double quotes according to CSV format rules csvReader := csv.NewReader(strings.NewReader(csvString)) stringValues, err := csvReader.Read() - PanicIfError(col.Config, err) + common.PanicIfError(col.Config, err) for _, stringValue := range stringValues { primitiveValue := col.duckdbPrimitiveValueFromCsv(stringValue) @@ -249,7 +250,7 @@ func (col *IcebergSchemaColumn) duckdbPrimitiveValueFromCsv(value string) interf decimalValue := new(big.Int) decimalValue.SetString(integerPart+fractionalPart, 10) - return goDuckdb.Decimal{ + return duckdb.Decimal{ Width: uint8(col.NormalizedPrecision()), Scale: uint8(scale), Value: decimalValue, @@ -258,21 +259,21 @@ func (col *IcebergSchemaColumn) duckdbPrimitiveValueFromCsv(value string) interf return StringDateToTime(value) case IcebergColumnTypeTime: parsedTime, err := time.Parse("15:04:05.999999", value) - PanicIfError(col.Config, err) + common.PanicIfError(col.Config, err) return parsedTime case IcebergColumnTypeTimeTz: parsedTime, err := time.Parse("15:04:05.999999-07", value) - PanicIfError(col.Config, err) + common.PanicIfError(col.Config, err) return parsedTime case IcebergColumnTypeTimestamp: parsedTimestamp, err := time.Parse("2006-01-02 15:04:05.999999", value) - PanicIfError(col.Config, err) + common.PanicIfError(col.Config, err) return parsedTimestamp case IcebergColumnTypeTimestampTz: parsedTimestamp, err := time.Parse("2006-01-02 15:04:05.999999-07:00", value) if err != nil { parsedTimestamp, err = time.Parse("2006-01-02 15:04:05.999999-07", value) - PanicIfError(col.Config, err) + common.PanicIfError(col.Config, err) } return parsedTimestamp } diff --git a/src/syncer-common/iceberg_table.go b/src/syncer-common/iceberg_table.go index c839e12..774b381 100644 --- a/src/syncer-common/iceberg_table.go +++ b/src/syncer-common/iceberg_table.go @@ -1,48 +1,51 @@ -package common +package syncerCommon import ( + "github.com/BemiHQ/BemiDB/src/common" "github.com/google/uuid" ) type IcebergTable struct { - Config *BaseConfig - Name string + Config *common.CommonConfig + SchemaName string + TableName string IcebergCatalog *IcebergCatalog StorageS3 *StorageS3 GeneratedS3TablePath string } -func NewIcebergTable(config *BaseConfig, storageS3 *StorageS3, name string) *IcebergTable { +func NewIcebergTable(config *common.CommonConfig, storageS3 *StorageS3, schemaName string, tableName string) *IcebergTable { return &IcebergTable{ Config: config, - Name: name, - IcebergCatalog: NewIcebergCatalog(config), + SchemaName: schemaName, + TableName: tableName, + IcebergCatalog: NewIcebergCatalog(config, schemaName), StorageS3: storageS3, } } func (table *IcebergTable) Create() { - LogInfo(table.Config, "Creating Iceberg table:", table.Name) - table.IcebergCatalog.CreateTable(table.Name, table.GeneratedS3TablePath+"/metadata/"+ICEBERG_METADATA_INITIAL_FILE_NAME) + common.LogInfo(table.Config, "Creating Iceberg table:", table.TableName) + table.IcebergCatalog.CreateTable(table.TableName, table.GeneratedS3TablePath+"/metadata/"+ICEBERG_METADATA_INITIAL_FILE_NAME) } func (table *IcebergTable) DeleteIfExists() { - s3TablePath := table.IcebergCatalog.S3TablePath(table.Name) + s3TablePath := table.IcebergCatalog.S3TablePath(table.TableName) if s3TablePath == "" { return } - LogInfo(table.Config, "Deleting Iceberg table:", table.Name) + common.LogInfo(table.Config, "Deleting Iceberg table:", table.TableName) table.StorageS3.DeleteTableFiles(s3TablePath) - table.IcebergCatalog.DeleteTable(table.Name) + table.IcebergCatalog.DeleteTable(table.TableName) } func (table *IcebergTable) Rename(newName string) { - LogInfo(table.Config, "Renaming Iceberg table from", table.Name, "to", newName) - table.IcebergCatalog.RenameTable(table.Name, newName) - table.Name = newName + common.LogInfo(table.Config, "Renaming Iceberg table from", table.TableName, "to", newName) + table.IcebergCatalog.RenameTable(table.TableName, newName) + table.TableName = newName } func (table *IcebergTable) GenerateS3TablePath() { - table.GeneratedS3TablePath = "s3://" + table.Config.Aws.S3Bucket + "/iceberg/" + table.Config.DestinationSchemaName + "/" + table.Name + "-" + uuid.New().String() + table.GeneratedS3TablePath = "s3://" + table.Config.Aws.S3Bucket + "/iceberg/" + table.SchemaName + "/" + table.TableName + "-" + uuid.New().String() } diff --git a/src/syncer-common/iceberg_writer.go b/src/syncer-common/iceberg_writer.go index 4137d4f..da00414 100644 --- a/src/syncer-common/iceberg_writer.go +++ b/src/syncer-common/iceberg_writer.go @@ -1,16 +1,17 @@ -package common +package syncerCommon import ( - goDuckdb "github.com/marcboeker/go-duckdb/v2" + "github.com/BemiHQ/BemiDB/src/common" + "github.com/marcboeker/go-duckdb/v2" ) type IcebergWriter struct { - Config *BaseConfig + Config *common.CommonConfig IcebergSchemaColumns []*IcebergSchemaColumn StorageS3 *StorageS3 } -func NewIcebergWriter(config *BaseConfig, storageS3 *StorageS3, icebergSchemaColumns []*IcebergSchemaColumn) *IcebergWriter { +func NewIcebergWriter(config *common.CommonConfig, storageS3 *StorageS3, icebergSchemaColumns []*IcebergSchemaColumn) *IcebergWriter { return &IcebergWriter{ Config: config, IcebergSchemaColumns: icebergSchemaColumns, @@ -18,7 +19,7 @@ func NewIcebergWriter(config *BaseConfig, storageS3 *StorageS3, icebergSchemaCol } } -func (writer *IcebergWriter) Write(s3TablePath string, loadRows func(appender *goDuckdb.Appender) (rowCount int, reachedEnd bool)) { +func (writer *IcebergWriter) Write(s3TablePath string, loadRows func(appender *duckdb.Appender) (rowCount int, reachedEnd bool)) { s3DataPath := s3TablePath + "/data" s3MetadataPath := s3TablePath + "/metadata" @@ -38,20 +39,20 @@ func (writer *IcebergWriter) Write(s3TablePath string, loadRows func(appender *g } newManifestFile, err := writer.StorageS3.CreateManifest(s3MetadataPath, newParquetFile) - PanicIfError(writer.Config, err) + common.PanicIfError(writer.Config, err) lastSequenceNumber++ newManifestListItem := ManifestListItem{SequenceNumber: lastSequenceNumber, ManifestFile: newManifestFile} newManifestListItemsSortedDesc = append([]ManifestListItem{newManifestListItem}, newManifestListItemsSortedDesc...) newManifestListFile, err := writer.StorageS3.CreateManifestList(s3MetadataPath, firstNewParquetFile.Uuid, newManifestListItemsSortedDesc) - PanicIfError(writer.Config, err) + common.PanicIfError(writer.Config, err) finalManifestListFilesSortedAsc = append(finalManifestListFilesSortedAsc, newManifestListFile) _, err = writer.StorageS3.CreateMetadata(s3MetadataPath, writer.IcebergSchemaColumns, finalManifestListFilesSortedAsc) - PanicIfError(writer.Config, err) + common.PanicIfError(writer.Config, err) - LogInfo(writer.Config, "Written", newParquetFile.RecordCount, "records in Parquet file #"+IntToString(newParquetCount)) + common.LogInfo(writer.Config, "Written", newParquetFile.RecordCount, "records in Parquet file #"+common.IntToString(newParquetCount)) if reachedEnd { return diff --git a/src/syncer-common/postgres_client.go b/src/syncer-common/postgres_client.go deleted file mode 100644 index 12abae3..0000000 --- a/src/syncer-common/postgres_client.go +++ /dev/null @@ -1,83 +0,0 @@ -package common - -import ( - "context" - "net/url" - "strings" - "time" - - "github.com/jackc/pgx/v5" - "github.com/jackc/pgx/v5/pgconn" -) - -const ( - CONNECTION_TIMEOUT = 30 * time.Second -) - -type Postgres struct { - Conn *pgx.Conn - Config *BaseConfig -} - -func NewPostgres(config *BaseConfig, databaseUrl string) *Postgres { - ctx, cancel := context.WithTimeout(context.Background(), CONNECTION_TIMEOUT) - defer cancel() - - conn, err := pgx.Connect(ctx, urlEncodePassword(databaseUrl)) - PanicIfError(config, err) - - return &Postgres{ - Config: config, - Conn: conn, - } -} - -func (client *Postgres) Close() { - err := client.Conn.Close(context.Background()) - PanicIfError(client.Config, err) -} - -func (client *Postgres) Query(ctx context.Context, query string, args ...any) (pgx.Rows, error) { - LogDebug(client.Config, "Postgres query:", query, args) - return client.Conn.Query(ctx, query, args...) -} - -func (client *Postgres) QueryRow(ctx context.Context, query string, args ...any) pgx.Row { - LogDebug(client.Config, "Postgres query:", query, args) - return client.Conn.QueryRow(ctx, query, args...) -} - -func (client *Postgres) Exec(ctx context.Context, query string, args ...any) (pgconn.CommandTag, error) { - LogDebug(client.Config, "Postgres exec:", query, args) - return client.Conn.Exec(ctx, query, args...) -} - -// Example: -// - From postgres://username:pas$:wor^d#@host:port/database -// - To postgres://username:pas%24%3Awor%5Ed%23@host:port/database -func urlEncodePassword(pgDatabaseUrl string) string { - // No credentials - if !strings.Contains(pgDatabaseUrl, "@") { - return pgDatabaseUrl - } - - password := strings.TrimPrefix(pgDatabaseUrl, "postgresql://") - password = strings.TrimPrefix(password, "postgres://") - passwordEndIndex := strings.LastIndex(password, "@") - password = password[:passwordEndIndex] - - // Credentials without password - if !strings.Contains(password, ":") { - return pgDatabaseUrl - } - - _, password, _ = strings.Cut(password, ":") - encodedPassword := url.QueryEscape(password) - - // Password is already encoded - if encodedPassword == password { - return pgDatabaseUrl - } - - return strings.Replace(pgDatabaseUrl, ":"+password+"@", ":"+encodedPassword+"@", 1) -} diff --git a/src/syncer-common/storage_s3.go b/src/syncer-common/storage_s3.go index dd5a144..1c257c3 100644 --- a/src/syncer-common/storage_s3.go +++ b/src/syncer-common/storage_s3.go @@ -1,4 +1,4 @@ -package common +package syncerCommon import ( "context" @@ -6,22 +6,17 @@ import ( "os" "strings" - "github.com/aws/aws-sdk-go-v2/aws" - awsConfig "github.com/aws/aws-sdk-go-v2/config" - "github.com/aws/aws-sdk-go-v2/credentials" - "github.com/aws/aws-sdk-go-v2/feature/s3/manager" - "github.com/aws/aws-sdk-go-v2/service/s3" - "github.com/aws/aws-sdk-go-v2/service/s3/types" + "github.com/BemiHQ/BemiDB/src/common" "github.com/google/uuid" - goDuckdb "github.com/marcboeker/go-duckdb/v2" + "github.com/marcboeker/go-duckdb/v2" "github.com/xitongsys/parquet-go-source/s3v2" ) type StorageS3 struct { - S3Client *s3.Client - Config *BaseConfig + S3Client *common.S3Client + Config *common.CommonConfig StorageUtils *StorageUtils - Duckdb *Duckdb + DuckdbClient *common.DuckdbClient } type ParquetFileStats struct { @@ -77,66 +72,32 @@ type MetadataFile struct { Key string } -func NewStorageS3(Config *BaseConfig) *StorageS3 { - var awsConfigOptions = []func(*awsConfig.LoadOptions) error{ - awsConfig.WithRegion(Config.Aws.Region), - } - - if Config.LogLevel == LOG_LEVEL_TRACE { - awsConfigOptions = append(awsConfigOptions, awsConfig.WithClientLogMode(aws.LogRequest)) - } - - if IsLocalHost(Config.Aws.S3Endpoint) { - awsConfigOptions = append(awsConfigOptions, awsConfig.WithBaseEndpoint("http://"+Config.Aws.S3Endpoint)) - } else { - awsConfigOptions = append(awsConfigOptions, awsConfig.WithBaseEndpoint("https://"+Config.Aws.S3Endpoint)) - } - - awsCredentials := credentials.NewStaticCredentialsProvider( - Config.Aws.AccessKeyId, - Config.Aws.SecretAccessKey, - "", - ) - awsConfigOptions = append(awsConfigOptions, awsConfig.WithCredentialsProvider(awsCredentials)) - - loadedAwsConfig, err := awsConfig.LoadDefaultConfig(context.Background(), awsConfigOptions...) - PanicIfError(Config, err) - - S3Client := s3.NewFromConfig(loadedAwsConfig, func(o *s3.Options) { - if Config.Aws.S3Endpoint != DEFAULT_AWS_S3_ENDPOINT { - o.UsePathStyle = true - } - }) - +func NewStorageS3(Config *common.CommonConfig) *StorageS3 { return &StorageS3{ - S3Client: S3Client, + S3Client: common.NewS3Client(Config), Config: Config, StorageUtils: NewStorageUtils(Config), - Duckdb: NewDuckdb(Config), + DuckdbClient: common.NewDuckdbClient(Config), } } // Write --------------------------------------------------------------------------------------------------------------- -func (storage *StorageS3) CreateParquet(s3DataPath string, icebergSchemaColumns []*IcebergSchemaColumn, loadRows func(appender *goDuckdb.Appender) (rowCount int, reachedEnd bool)) (parquetFile ParquetFile, reachedEnd bool) { +func (storage *StorageS3) CreateParquet(s3DataPath string, icebergSchemaColumns []*IcebergSchemaColumn, loadRows func(appender *duckdb.Appender) (rowCount int, reachedEnd bool)) (parquetFile ParquetFile, reachedEnd bool) { ctx := context.Background() uuid := uuid.New().String() fileName := fmt.Sprintf("00000-0-%s.parquet", uuid) fileS3Path := s3DataPath + "/" + fileName - fileKey := storage.s3Key(fileS3Path) + fileKey := storage.S3Client.ObjectKey(fileS3Path) - rowCount, reachedEnd := storage.StorageUtils.WriteParquetFile(storage.Duckdb, fileS3Path, icebergSchemaColumns, loadRows) - LogDebug(storage.Config, "Parquet file with", rowCount, "record(s) created at:", fileKey) + rowCount, reachedEnd := storage.StorageUtils.WriteParquetFile(storage.DuckdbClient, fileS3Path, icebergSchemaColumns, loadRows) + common.LogDebug(storage.Config, "Parquet file with", rowCount, "record(s) created at:", fileKey) - headObjectResponse, err := storage.S3Client.HeadObject(ctx, &s3.HeadObjectInput{ - Bucket: aws.String(storage.Config.Aws.S3Bucket), - Key: aws.String(fileKey), - }) - PanicIfError(storage.Config, err) - fileSize := *headObjectResponse.ContentLength + headObjectOutput := storage.S3Client.HeadObject(fileKey) + fileSize := *headObjectOutput.ContentLength - fileReader, err := s3v2.NewS3FileReaderWithClient(ctx, storage.S3Client, storage.Config.Aws.S3Bucket, fileKey) - PanicIfError(storage.Config, err) + fileReader, err := s3v2.NewS3FileReaderWithClient(ctx, storage.S3Client.S3, storage.Config.Aws.S3Bucket, fileKey) + common.PanicIfError(storage.Config, err) parquetStats := storage.StorageUtils.ReadParquetStats(fileReader, icebergSchemaColumns) return ParquetFile{ @@ -150,17 +111,12 @@ func (storage *StorageS3) CreateParquet(s3DataPath string, icebergSchemaColumns } func (storage *StorageS3) DeleteParquet(parquetFile ParquetFile) { - ctx := context.Background() - _, err := storage.S3Client.DeleteObject(ctx, &s3.DeleteObjectInput{ - Bucket: aws.String(storage.Config.Aws.S3Bucket), - Key: aws.String(parquetFile.Key), - }) - PanicIfError(storage.Config, err) + storage.S3Client.DeleteObject(parquetFile.Key) } func (storage *StorageS3) CreateManifest(s3MetadataPath string, parquetFile ParquetFile) (manifestFile ManifestFile, err error) { fileName := fmt.Sprintf("%s-m0.avro", parquetFile.Uuid) - fileKey := storage.s3Key(s3MetadataPath) + "/" + fileName + fileKey := storage.S3Client.ObjectKey(s3MetadataPath) + "/" + fileName err = storage.uploadTemporaryFile("manifest", fileKey, func(tempFile *os.File) error { manifestFile, err = storage.StorageUtils.WriteManifestFile(tempFile.Name(), parquetFile) @@ -169,7 +125,7 @@ func (storage *StorageS3) CreateManifest(s3MetadataPath string, parquetFile Parq if err != nil { return manifestFile, err } - LogDebug(storage.Config, "Manifest file created at:", fileKey) + common.LogDebug(storage.Config, "Manifest file created at:", fileKey) manifestFile.Key = fileKey manifestFile.Path = s3MetadataPath + "/" + fileName @@ -178,7 +134,7 @@ func (storage *StorageS3) CreateManifest(s3MetadataPath string, parquetFile Parq func (storage *StorageS3) CreateManifestList(s3MetadataPath string, parquetFileUuid string, manifestListItemsSortedDesc []ManifestListItem) (manifestListFile ManifestListFile, err error) { fileName := fmt.Sprintf("snap-%d-0-%s.avro", manifestListItemsSortedDesc[0].ManifestFile.SnapshotId, parquetFileUuid) - fileKey := storage.s3Key(s3MetadataPath) + "/" + fileName + fileKey := storage.S3Client.ObjectKey(s3MetadataPath) + "/" + fileName err = storage.uploadTemporaryFile("manifest-list", fileKey, func(tempFile *os.File) error { manifestListFile, err = storage.StorageUtils.WriteManifestListFile(tempFile.Name(), manifestListItemsSortedDesc) @@ -187,7 +143,7 @@ func (storage *StorageS3) CreateManifestList(s3MetadataPath string, parquetFileU if err != nil { return manifestListFile, err } - LogDebug(storage.Config, "Manifest list file created at:", fileKey) + common.LogDebug(storage.Config, "Manifest list file created at:", fileKey) manifestListFile.Key = fileKey manifestListFile.Path = s3MetadataPath + "/" + fileName @@ -195,7 +151,7 @@ func (storage *StorageS3) CreateManifestList(s3MetadataPath string, parquetFileU } func (storage *StorageS3) CreateMetadata(s3MetadataPath string, icebergSchemaColumns []*IcebergSchemaColumn, manifestListFilesSortedAsc []ManifestListFile) (metadataFile MetadataFile, err error) { - fileKey := storage.s3Key(s3MetadataPath) + "/" + ICEBERG_METADATA_INITIAL_FILE_NAME + fileKey := storage.S3Client.ObjectKey(s3MetadataPath) + "/" + ICEBERG_METADATA_INITIAL_FILE_NAME err = storage.uploadTemporaryFile("metadata", fileKey, func(tempFile *os.File) error { s3TablePath := strings.TrimSuffix(s3MetadataPath, "/metadata") @@ -204,13 +160,13 @@ func (storage *StorageS3) CreateMetadata(s3MetadataPath string, icebergSchemaCol if err != nil { return metadataFile, err } - LogDebug(storage.Config, "Metadata file created at:", fileKey) + common.LogDebug(storage.Config, "Metadata file created at:", fileKey) return MetadataFile{Version: 1, Key: fileKey}, nil } func (storage *StorageS3) DeleteTableFiles(s3TablePath string) (err error) { - tableKey := storage.s3Key(s3TablePath) + tableKey := storage.S3Client.ObjectKey(s3TablePath) return storage.deleteNestedObjects(tableKey) } @@ -230,15 +186,7 @@ func (storage *StorageS3) uploadTemporaryFile(tempFilePattern string, uploadFile return err } - uploader := manager.NewUploader(storage.S3Client) - _, err = uploader.Upload(context.Background(), &s3.PutObjectInput{ - Bucket: aws.String(storage.Config.Aws.S3Bucket), - Key: aws.String(uploadFilePath), - Body: tempFile, - }) - if err != nil { - return fmt.Errorf("failed to upload file: %v", err) - } + storage.S3Client.UploadObject(uploadFilePath, tempFile) err = tempFile.Close() if err != nil { @@ -248,42 +196,20 @@ func (storage *StorageS3) uploadTemporaryFile(tempFilePattern string, uploadFile return nil } -// s3://bucket/some/path -> some/path -func (storage *StorageS3) s3Key(s3Path string) string { - return strings.Split(s3Path, "s3://"+storage.Config.Aws.S3Bucket+"/")[1] -} - func (storage *StorageS3) deleteNestedObjects(prefixKey string) (err error) { - ctx := context.Background() - - listResponse, err := storage.S3Client.ListObjectsV2(ctx, &s3.ListObjectsV2Input{ - Bucket: aws.String(storage.Config.Aws.S3Bucket), - Prefix: aws.String(prefixKey), - }) - if err != nil { - return fmt.Errorf("failed to list objects: %v", err) - } + listResponse := storage.S3Client.ListObjects(prefixKey) - var objectsToDelete []types.ObjectIdentifier + var fileKeys []*string for _, obj := range listResponse.Contents { - LogDebug(storage.Config, "Object to delete:", *obj.Key) - objectsToDelete = append(objectsToDelete, types.ObjectIdentifier{Key: obj.Key}) + common.LogDebug(storage.Config, "Object to delete:", *obj.Key) + fileKeys = append(fileKeys, obj.Key) } - if len(objectsToDelete) > 0 { - _, err = storage.S3Client.DeleteObjects(ctx, &s3.DeleteObjectsInput{ - Bucket: aws.String(storage.Config.Aws.S3Bucket), - Delete: &types.Delete{ - Objects: objectsToDelete, - Quiet: aws.Bool(true), - }, - }) - if err != nil { - return fmt.Errorf("failed to delete objects: %v", err) - } - LogDebug(storage.Config, "Deleted", len(objectsToDelete), "object(s).") + if len(fileKeys) > 0 { + storage.S3Client.DeleteObjects(fileKeys) + common.LogDebug(storage.Config, "Deleted", len(fileKeys), "object(s).") } else { - LogDebug(storage.Config, "No objects to delete.") + common.LogDebug(storage.Config, "No objects to delete.") } return nil diff --git a/src/syncer-common/storage_utils.go b/src/syncer-common/storage_utils.go index cbbb83e..312a639 100644 --- a/src/syncer-common/storage_utils.go +++ b/src/syncer-common/storage_utils.go @@ -1,4 +1,4 @@ -package common +package syncerCommon import ( "bytes" @@ -9,9 +9,10 @@ import ( "strings" "time" + "github.com/BemiHQ/BemiDB/src/common" "github.com/google/uuid" "github.com/linkedin/goavro" - goDuckdb "github.com/marcboeker/go-duckdb/v2" + "github.com/marcboeker/go-duckdb/v2" "github.com/xitongsys/parquet-go/reader" "github.com/xitongsys/parquet-go/source" "golang.org/x/exp/maps" @@ -67,10 +68,10 @@ type ManifestListSequenceStats struct { } type StorageUtils struct { - Config *BaseConfig + Config *common.CommonConfig } -func NewStorageUtils(config *BaseConfig) *StorageUtils { +func NewStorageUtils(config *common.CommonConfig) *StorageUtils { return &StorageUtils{ Config: config, } @@ -78,7 +79,7 @@ func NewStorageUtils(config *BaseConfig) *StorageUtils { // Write --------------------------------------------------------------------------------------------------------------- -func (storage *StorageUtils) WriteParquetFile(duckdb *Duckdb, fileS3Path string, icebergSchemaColumns []*IcebergSchemaColumn, loadRows func(appender *goDuckdb.Appender) (rowCount int, reachedEnd bool)) (rowCount int, reachedEnd bool) { +func (storage *StorageUtils) WriteParquetFile(duckdbClient *common.DuckdbClient, fileS3Path string, icebergSchemaColumns []*IcebergSchemaColumn, loadRows func(appender *duckdb.Appender) (rowCount int, reachedEnd bool)) (rowCount int, reachedEnd bool) { ctx := context.Background() tableName := "temp_" + strings.ReplaceAll(uuid.New().String(), "-", "") columnSchemas := make([]string, len(icebergSchemaColumns)) @@ -86,30 +87,30 @@ func (storage *StorageUtils) WriteParquetFile(duckdb *Duckdb, fileS3Path string, for i, col := range icebergSchemaColumns { columnSchemas[i] = col.QuotedColumnName() + " " + col.DuckdbType() if col.IsList { - fieldIds[i] = col.QuotedColumnName() + ":{__duckdb_field_id: " + IntToString(col.Position) + ", element: " + IntToString(PARQUET_NESTED_FIELD_ID_PREFIX+col.Position) + "}" + fieldIds[i] = col.QuotedColumnName() + ":{__duckdb_field_id: " + common.IntToString(col.Position) + ", element: " + common.IntToString(PARQUET_NESTED_FIELD_ID_PREFIX+col.Position) + "}" } else { - fieldIds[i] = col.QuotedColumnName() + ":" + IntToString(col.Position) + fieldIds[i] = col.QuotedColumnName() + ":" + common.IntToString(col.Position) } } - _, err := duckdb.ExecContext(ctx, "CREATE TABLE "+tableName+"("+strings.Join(columnSchemas, ",")+")", nil) - PanicIfError(storage.Config, err) + _, err := duckdbClient.ExecContext(ctx, "CREATE TABLE "+tableName+"("+strings.Join(columnSchemas, ",")+")") + common.PanicIfError(storage.Config, err) - appender, err := duckdb.Appender("", tableName) - PanicIfError(storage.Config, err) + appender, err := duckdbClient.Appender("", tableName) + common.PanicIfError(storage.Config, err) rowCount, reachedEnd = loadRows(appender) err = appender.Close() - PanicIfError(storage.Config, err) + common.PanicIfError(storage.Config, err) copyQuery := "COPY " + tableName + " TO '$fileS3Path' (FORMAT PARQUET, COMPRESSION 'ZSTD', FIELD_IDS {$fieldIds})" - _, err = duckdb.ExecContext(ctx, copyQuery, map[string]string{ + _, err = duckdbClient.ExecContext(ctx, copyQuery, map[string]string{ "fileS3Path": fileS3Path, "fieldIds": strings.Join(fieldIds, ","), }) - PanicIfError(storage.Config, err) + common.PanicIfError(storage.Config, err) - _, err = duckdb.ExecContext(ctx, "DROP TABLE "+tableName, nil) - PanicIfError(storage.Config, err) + _, err = duckdbClient.ExecContext(ctx, "DROP TABLE "+tableName) + common.PanicIfError(storage.Config, err) return rowCount, reachedEnd } @@ -118,7 +119,7 @@ func (storage *StorageUtils) ReadParquetStats(fileReader source.ParquetFile, ice defer fileReader.Close() pr, err := reader.NewParquetReader(fileReader, nil, 1) - PanicIfError(storage.Config, err) + common.PanicIfError(storage.Config, err) defer pr.ReadStop() parquetStats = ParquetFileStats{ @@ -310,7 +311,7 @@ func (storage *StorageUtils) WriteManifestListFile(filePath string, manifestList for _, manifestListItem := range manifestListItemsSortedDesc { sequenceNumber := manifestListItem.SequenceNumber - sequenceStats := statsBySequenceNumber[IntToString(sequenceNumber)] + sequenceStats := statsBySequenceNumber[common.IntToString(sequenceNumber)] manifestFile := manifestListItem.ManifestFile manifestListRecord := map[string]interface{}{ @@ -347,7 +348,7 @@ func (storage *StorageUtils) WriteManifestListFile(filePath string, manifestList sequenceStats.AddedRecords += manifestFile.RecordCount } - statsBySequenceNumber[IntToString(sequenceNumber)] = sequenceStats + statsBySequenceNumber[common.IntToString(sequenceNumber)] = sequenceStats manifestListRecords = append(manifestListRecords, manifestListRecord) } @@ -373,7 +374,7 @@ func (storage *StorageUtils) WriteManifestListFile(filePath string, manifestList sequenceNumbers := maps.Keys(statsBySequenceNumber) lastManifestListItem := manifestListItemsSortedDesc[0] - lastSequenceStats := statsBySequenceNumber[IntToString(lastManifestListItem.SequenceNumber)] + lastSequenceStats := statsBySequenceNumber[common.IntToString(lastManifestListItem.SequenceNumber)] operation := ICEBERG_MANIFEST_LIST_OPERATION_APPEND if len(sequenceNumbers) == 1 && len(manifestListRecords) == 2 && lastSequenceStats.AddedDataFiles == 1 && lastSequenceStats.DeletedDataFiles == 1 { diff --git a/src/syncer-common/trino.go b/src/syncer-common/trino.go index cb782c4..09ca6d3 100644 --- a/src/syncer-common/trino.go +++ b/src/syncer-common/trino.go @@ -1,9 +1,10 @@ -package common +package syncerCommon import ( "context" "database/sql" + "github.com/BemiHQ/BemiDB/src/common" _ "github.com/trinodb/trino-go-client/trino" ) @@ -13,36 +14,45 @@ const ( TRINO_MAX_QUERY_LENGTH = 1_000_000 ) +type TrinoConfig struct { + DatabaseUrl string + CatalogName string +} + type Trino struct { - Config *BaseConfig - Db *sql.DB + Config *common.CommonConfig + TrinoConfig *TrinoConfig + Db *sql.DB + SchemaName string } -func NewTrino(config *BaseConfig) *Trino { - db, err := sql.Open("trino", config.Trino.DatabaseUrl) - PanicIfError(config, err) +func NewTrino(config *common.CommonConfig, trinoConfig *TrinoConfig, schemaName string) *Trino { + db, err := sql.Open("trino", trinoConfig.DatabaseUrl) + common.PanicIfError(config, err) return &Trino{ - Config: config, - Db: db, + Config: config, + TrinoConfig: trinoConfig, + Db: db, + SchemaName: schemaName, } } func (trino *Trino) Schema() string { - return trino.Config.Trino.CatalogName + "." + trino.Config.DestinationSchemaName + return trino.TrinoConfig.CatalogName + "." + trino.SchemaName } func (trino *Trino) Close() { if err := trino.Db.Close(); err != nil { - PanicIfError(trino.Config, err) + common.PanicIfError(trino.Config, err) } } func (trino *Trino) ExecContext(ctx context.Context, query string, args ...interface{}) (sql.Result, error) { - LogDebug(trino.Config, "Trino query:", query) + common.LogDebug(trino.Config, "Trino query:", query) result, err := trino.Db.ExecContext(ctx, query, args...) if err != nil { - LogError(trino.Config, "Trino query failed:", query) + common.LogError(trino.Config, "Trino query failed:", query) return nil, err } @@ -50,12 +60,12 @@ func (trino *Trino) ExecContext(ctx context.Context, query string, args ...inter } func (trino *Trino) QueryContext(ctx context.Context, query string, args ...interface{}) (*sql.Rows, error) { - LogDebug(trino.Config, "Trino query:", query) + common.LogDebug(trino.Config, "Trino query:", query) return trino.Db.QueryContext(ctx, query, args...) } func (trino *Trino) QueryRowContext(ctx context.Context, query string, args ...interface{}) *sql.Row { - LogDebug(trino.Config, "Trino query:", query) + common.LogDebug(trino.Config, "Trino query:", query) return trino.Db.QueryRowContext(ctx, query, args...) } @@ -63,27 +73,27 @@ func (trino *Trino) CompactTable(quotedTrinoTablePath string) { ctx := context.Background() _, err := trino.ExecContext(ctx, "ALTER TABLE "+quotedTrinoTablePath+" EXECUTE optimize") - PanicIfError(trino.Config, err) + common.PanicIfError(trino.Config, err) _, err = trino.ExecContext(ctx, "ALTER TABLE "+quotedTrinoTablePath+" EXECUTE remove_orphan_files(retention_threshold => '0m')") - PanicIfError(trino.Config, err) + common.PanicIfError(trino.Config, err) _, err = trino.ExecContext(ctx, "ALTER TABLE "+quotedTrinoTablePath+" EXECUTE optimize_manifests") - PanicIfError(trino.Config, err) + common.PanicIfError(trino.Config, err) _, err = trino.ExecContext(ctx, "ALTER TABLE "+quotedTrinoTablePath+" EXECUTE expire_snapshots(retention_threshold => '0m')") - PanicIfError(trino.Config, err) + common.PanicIfError(trino.Config, err) } func (trino *Trino) CreateSchemaIfNotExists() { _, err := trino.ExecContext(context.Background(), "CREATE SCHEMA IF NOT EXISTS "+trino.Schema()) - PanicIfError(trino.Config, err) + common.PanicIfError(trino.Config, err) } -func (trino *Trino) CreateTableIfNotExists(tableName string, tableSchema string) { +func (trino *Trino) CreateTableIfNotExists(tableName string, tableStructure string) { ctx := context.Background() - createTableSql := "CREATE TABLE IF NOT EXISTS " + trino.Schema() + `."` + tableName + `"` + tableSchema + createTableSql := "CREATE TABLE IF NOT EXISTS " + trino.Schema() + `."` + tableName + `"` + tableStructure _, err := trino.ExecContext(ctx, createTableSql) - PanicIfError(trino.Config, err) + common.PanicIfError(trino.Config, err) } diff --git a/src/syncer-common/utils.go b/src/syncer-common/utils.go index fa21cef..e04b717 100644 --- a/src/syncer-common/utils.go +++ b/src/syncer-common/utils.go @@ -1,4 +1,4 @@ -package common +package syncerCommon import ( "bytes" @@ -10,11 +10,9 @@ import ( "strconv" "strings" "time" -) -func IntToString(i int) string { - return strconv.Itoa(i) -} + "github.com/BemiHQ/BemiDB/src/common" +) func Int64ToString(i int64) string { return strconv.FormatInt(i, 10) @@ -101,10 +99,6 @@ func StringMsToUtcTime(s string) time.Time { return t.UTC() } -func IsLocalHost(host string) bool { - return strings.HasPrefix(host, "127.0.0.1") || strings.HasPrefix(host, "localhost") -} - type AnonymousAnalyticsData struct { Command string `json:"command"` OsName string `json:"osName"` @@ -113,7 +107,7 @@ type AnonymousAnalyticsData struct { Name string `json:"name"` } -func SendAnonymousAnalytics(config *BaseConfig, command string, name string) { +func SendAnonymousAnalytics(config *common.CommonConfig, command string, name string) { if config.DisableAnonymousAnalytics { return } @@ -121,7 +115,7 @@ func SendAnonymousAnalytics(config *BaseConfig, command string, name string) { data := AnonymousAnalyticsData{ Command: command, OsName: runtime.GOOS + "-" + runtime.GOARCH, - Version: VERSION, + Version: common.VERSION, S3Bucket: config.Aws.S3Endpoint + "/" + config.Aws.S3Bucket, Name: name, } diff --git a/src/syncer-postgres/config.go b/src/syncer-postgres/config.go index 8f1c434..c438084 100644 --- a/src/syncer-postgres/config.go +++ b/src/syncer-postgres/config.go @@ -6,6 +6,7 @@ import ( "slices" "strings" + "github.com/BemiHQ/BemiDB/src/common" "github.com/BemiHQ/BemiDB/src/syncer-common" ) @@ -22,6 +23,11 @@ const ( ENV_NATS_CONSUMER_NAME = "NATS_JETSTREAM_CONSUMER_NAME" ENV_NATS_FETCH_TIMEOUT_SECONDS = "NATS_FETCH_TIMEOUT_SECONDS" + ENV_TRINO_DATABASE_URL = "TRINO_DATABASE_URL" + ENV_TRINO_CATALOG_NAME = "TRINO_CATALOG_NAME" + + ENV_DESTINATION_SCHEMA_NAME = "DESTINATION_SCHEMA_NAME" + ENV_DATABASE_URL = "SOURCE_POSTGRES_DATABASE_URL" ENV_SYNC_MODE = "SOURCE_POSTGRES_SYNC_MODE" ENV_INCLUDE_SCHEMAS = "SOURCE_POSTGRES_INCLUDE_SCHEMAS" @@ -42,7 +48,10 @@ type NatsConfig struct { } type Config struct { - BaseConfig *common.BaseConfig + CommonConfig *common.CommonConfig + TrinoConfig *syncerCommon.TrinoConfig + DestinationSchemaName string + SyncMode SyncMode DatabaseUrl string IncludeSchemas common.Set[string] @@ -69,19 +78,21 @@ func init() { } func registerFlags() { - _config.BaseConfig = &common.BaseConfig{} - - flag.StringVar(&_config.BaseConfig.LogLevel, "log-level", os.Getenv(common.ENV_LOG_LEVEL), `Log level: "ERROR", "WARN", "INFO", "DEBUG", "TRACE". Default: "`+common.DEFAULT_LOG_LEVEL+`"`) - flag.StringVar(&_config.BaseConfig.CatalogDatabaseUrl, "catalog-database-url", os.Getenv(common.ENV_CATALOG_DATABASE_URL), "Catalog database URL") - flag.StringVar(&_config.BaseConfig.DestinationSchemaName, "destination-schema-name", os.Getenv(common.ENV_DESTINATION_SCHEMA_NAME), "Destination schema name to store the synced data") - flag.StringVar(&_config.BaseConfig.Trino.DatabaseUrl, "trino-database-url", os.Getenv(common.ENV_TRINO_DATABASE_URL), "Trino database URL to sync to") - flag.StringVar(&_config.BaseConfig.Trino.CatalogName, "trino-catalog-name", os.Getenv(common.ENV_TRINO_CATALOG_NAME), "Trino catalog name") - flag.StringVar(&_config.BaseConfig.Aws.Region, "aws-region", os.Getenv(common.ENV_AWS_REGION), "AWS region") - flag.StringVar(&_config.BaseConfig.Aws.S3Endpoint, "aws-s3-endpoint", os.Getenv(common.ENV_AWS_S3_ENDPOINT), "AWS S3 endpoint. Default: \""+common.DEFAULT_AWS_S3_ENDPOINT+`"`) - flag.StringVar(&_config.BaseConfig.Aws.S3Bucket, "aws-s3-bucket", os.Getenv(common.ENV_AWS_S3_BUCKET), "AWS S3 bucket name") - flag.StringVar(&_config.BaseConfig.Aws.AccessKeyId, "aws-access-key-id", os.Getenv(common.ENV_AWS_ACCESS_KEY_ID), "AWS access key ID") - flag.StringVar(&_config.BaseConfig.Aws.SecretAccessKey, "aws-secret-access-key", os.Getenv(common.ENV_AWS_SECRET_ACCESS_KEY), "AWS secret access key") - flag.BoolVar(&_config.BaseConfig.DisableAnonymousAnalytics, "disable-anonymous-analytics", os.Getenv(common.ENV_DISABLE_ANONYMOUS_ANALYTICS) == "true", "Disable anonymous analytics collection") + _config.CommonConfig = &common.CommonConfig{} + _config.TrinoConfig = &syncerCommon.TrinoConfig{} + + flag.StringVar(&_config.CommonConfig.LogLevel, "log-level", os.Getenv(common.ENV_LOG_LEVEL), `Log level: "ERROR", "WARN", "INFO", "DEBUG", "TRACE". Default: "`+common.DEFAULT_LOG_LEVEL+`"`) + flag.StringVar(&_config.CommonConfig.CatalogDatabaseUrl, "catalog-database-url", os.Getenv(common.ENV_CATALOG_DATABASE_URL), "Catalog database URL") + flag.StringVar(&_config.CommonConfig.Aws.Region, "aws-region", os.Getenv(common.ENV_AWS_REGION), "AWS region") + flag.StringVar(&_config.CommonConfig.Aws.S3Endpoint, "aws-s3-endpoint", os.Getenv(common.ENV_AWS_S3_ENDPOINT), "AWS S3 endpoint. Default: \""+common.DEFAULT_AWS_S3_ENDPOINT+`"`) + flag.StringVar(&_config.CommonConfig.Aws.S3Bucket, "aws-s3-bucket", os.Getenv(common.ENV_AWS_S3_BUCKET), "AWS S3 bucket name") + flag.StringVar(&_config.CommonConfig.Aws.AccessKeyId, "aws-access-key-id", os.Getenv(common.ENV_AWS_ACCESS_KEY_ID), "AWS access key ID") + flag.StringVar(&_config.CommonConfig.Aws.SecretAccessKey, "aws-secret-access-key", os.Getenv(common.ENV_AWS_SECRET_ACCESS_KEY), "AWS secret access key") + flag.BoolVar(&_config.CommonConfig.DisableAnonymousAnalytics, "disable-anonymous-analytics", os.Getenv(common.ENV_DISABLE_ANONYMOUS_ANALYTICS) == "true", "Disable anonymous analytics collection") + + flag.StringVar(&_config.TrinoConfig.DatabaseUrl, "trino-database-url", os.Getenv(ENV_TRINO_DATABASE_URL), "Trino database URL to sync to") + flag.StringVar(&_config.TrinoConfig.CatalogName, "trino-catalog-name", os.Getenv(ENV_TRINO_CATALOG_NAME), "Trino catalog name") + flag.StringVar(&_config.DestinationSchemaName, "destination-schema-name", os.Getenv(ENV_DESTINATION_SCHEMA_NAME), "Destination schema name to store the synced data") flag.StringVar(&_config.DatabaseUrl, "database-url", os.Getenv(ENV_DATABASE_URL), "PostgreSQL database URL") flag.StringVar((*string)(&_config.SyncMode), "sync-mode", os.Getenv(ENV_SYNC_MODE), `Sync mode: "FULL_REFRESH", "CDC", or "INCREMENTAL"`) @@ -97,47 +108,47 @@ func registerFlags() { flag.IntVar(&_config.Nats.FetchTimeoutSeconds, "nats-fetch-timeout-seconds", DEFAULT_NATS_FETCH_TIMEOUT_SECONDS, "NATS fetch timeout in seconds") fetchTimeoutSeconds := os.Getenv(ENV_NATS_FETCH_TIMEOUT_SECONDS) if fetchTimeoutSeconds != "" { - _config.Nats.FetchTimeoutSeconds = common.StringToInt(fetchTimeoutSeconds) + _config.Nats.FetchTimeoutSeconds = syncerCommon.StringToInt(fetchTimeoutSeconds) } } func parseFlags() { flag.Parse() - if _config.BaseConfig.LogLevel == "" { - _config.BaseConfig.LogLevel = common.DEFAULT_LOG_LEVEL - } else if !slices.Contains(common.LOG_LEVELS, _config.BaseConfig.LogLevel) { - panic("Invalid log level " + _config.BaseConfig.LogLevel + ". Must be one of " + strings.Join(common.LOG_LEVELS, ", ")) + if _config.CommonConfig.LogLevel == "" { + _config.CommonConfig.LogLevel = common.DEFAULT_LOG_LEVEL + } else if !slices.Contains(common.LOG_LEVELS, _config.CommonConfig.LogLevel) { + panic("Invalid log level " + _config.CommonConfig.LogLevel + ". Must be one of " + strings.Join(common.LOG_LEVELS, ", ")) } - if _config.BaseConfig.CatalogDatabaseUrl == "" { + if _config.CommonConfig.CatalogDatabaseUrl == "" { panic("Catalog database URL is required") } - if _config.BaseConfig.DestinationSchemaName == "" { - panic("Destination schema name is required") - } - if _config.BaseConfig.Trino.DatabaseUrl == "" { - panic("Trino database URL is required") - } - if _config.BaseConfig.Trino.CatalogName == "" { - panic("Trino catalog name is required") - } - - if _config.BaseConfig.Aws.Region == "" { + if _config.CommonConfig.Aws.Region == "" { panic("AWS region is required") } - if _config.BaseConfig.Aws.S3Endpoint == "" { - _config.BaseConfig.Aws.S3Endpoint = common.DEFAULT_AWS_S3_ENDPOINT + if _config.CommonConfig.Aws.S3Endpoint == "" { + _config.CommonConfig.Aws.S3Endpoint = common.DEFAULT_AWS_S3_ENDPOINT } - if _config.BaseConfig.Aws.S3Bucket == "" { + if _config.CommonConfig.Aws.S3Bucket == "" { panic("AWS S3 bucket name is required") } - if _config.BaseConfig.Aws.AccessKeyId != "" && _config.BaseConfig.Aws.SecretAccessKey == "" { + if _config.CommonConfig.Aws.AccessKeyId != "" && _config.CommonConfig.Aws.SecretAccessKey == "" { panic("AWS secret access key is required") } - if _config.BaseConfig.Aws.AccessKeyId == "" && _config.BaseConfig.Aws.SecretAccessKey != "" { + if _config.CommonConfig.Aws.AccessKeyId == "" && _config.CommonConfig.Aws.SecretAccessKey != "" { panic("AWS access key ID is required") } + if _config.TrinoConfig.DatabaseUrl == "" { + panic("Trino database URL is required") + } + if _config.TrinoConfig.CatalogName == "" { + panic("Trino catalog name is required") + } + if _config.DestinationSchemaName == "" { + panic("Destination schema name is required") + } + if _configParseValues.IncludeSchemas != "" { _config.IncludeSchemas = common.NewSet[string]().AddAll(strings.Split(_configParseValues.IncludeSchemas, ",")) } diff --git a/src/syncer-postgres/go.mod b/src/syncer-postgres/go.mod index 644a10b..e938c7b 100644 --- a/src/syncer-postgres/go.mod +++ b/src/syncer-postgres/go.mod @@ -3,51 +3,54 @@ module github.com/BemiHQ/BemiDB/src/syncer-postgres go 1.24.4 require ( + github.com/BemiHQ/BemiDB/src/common v0.0.0-00010101000000-000000000000 github.com/BemiHQ/BemiDB/src/syncer-common v0.0.1 - github.com/jackc/pgx/v5 v5.7.5 - github.com/marcboeker/go-duckdb/v2 v2.3.3 + github.com/marcboeker/go-duckdb/v2 v2.3.2 github.com/nats-io/nats.go v1.43.0 ) +replace github.com/BemiHQ/BemiDB/src/common => ../common + replace github.com/BemiHQ/BemiDB/src/syncer-common => ../syncer-common require ( - github.com/apache/arrow-go/v18 v18.1.0 // indirect + github.com/apache/arrow-go/v18 v18.4.0 // indirect github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 // indirect - github.com/apache/thrift v0.21.0 // indirect - github.com/aws/aws-sdk-go-v2 v1.36.6 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.11 // indirect - github.com/aws/aws-sdk-go-v2/config v1.29.18 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.17.71 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.33 // indirect - github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.85 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.37 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.37 // indirect + github.com/apache/thrift v0.22.0 // indirect + github.com/aws/aws-sdk-go-v2 v1.37.0 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 // indirect + github.com/aws/aws-sdk-go-v2/config v1.30.1 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.18.1 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0 // indirect + github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.37 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.4 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.5 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.18 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.18 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.84.1 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.25.6 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.4 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.34.1 // indirect - github.com/aws/smithy-go v1.22.4 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.26.0 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.35.0 // indirect + github.com/aws/smithy-go v1.22.5 // indirect github.com/duckdb/duckdb-go-bindings v0.1.17 // indirect github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.12 // indirect github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.12 // indirect github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.12 // indirect github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.12 // indirect github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.12 // indirect - github.com/go-viper/mapstructure/v2 v2.2.1 // indirect + github.com/go-viper/mapstructure/v2 v2.3.0 // indirect github.com/goccy/go-json v0.10.5 // indirect - github.com/golang/snappy v0.0.4 // indirect - github.com/google/flatbuffers v25.1.24+incompatible // indirect + github.com/golang/snappy v1.0.0 // indirect + github.com/google/flatbuffers v25.2.10+incompatible // indirect github.com/google/uuid v1.6.0 // indirect github.com/hashicorp/go-uuid v1.0.3 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect + github.com/jackc/pgx/v5 v5.7.5 // indirect github.com/jcmturner/aescts/v2 v2.0.0 // indirect github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect github.com/jcmturner/gofork v1.7.6 // indirect @@ -55,7 +58,7 @@ require ( github.com/jcmturner/gokrb5/v8 v8.4.4 // indirect github.com/jcmturner/rpc/v2 v2.0.3 // indirect github.com/klauspost/compress v1.18.0 // indirect - github.com/klauspost/cpuid/v2 v2.2.9 // indirect + github.com/klauspost/cpuid/v2 v2.2.11 // indirect github.com/linkedin/goavro v2.1.0+incompatible // indirect github.com/marcboeker/go-duckdb/arrowmapping v0.0.10 // indirect github.com/marcboeker/go-duckdb/mapping v0.0.11 // indirect diff --git a/src/syncer-postgres/go.sum b/src/syncer-postgres/go.sum index d07b3dc..fddabca 100644 --- a/src/syncer-postgres/go.sum +++ b/src/syncer-postgres/go.sum @@ -124,17 +124,17 @@ github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8 github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/ahmetb/dlog v0.0.0-20170105205344-4fb5f8204f26 h1:3YVZUqkoev4mL+aCwVOSWV4M7pN+NURHL38Z2zq5JKA= github.com/ahmetb/dlog v0.0.0-20170105205344-4fb5f8204f26/go.mod h1:ymXt5bw5uSNu4jveerFxE0vNYxF8ncqbptntMaFMg3k= -github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA= -github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA= +github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= +github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/apache/arrow-go/v18 v18.1.0 h1:agLwJUiVuwXZdwPYVrlITfx7bndULJ/dggbnLFgDp/Y= -github.com/apache/arrow-go/v18 v18.1.0/go.mod h1:tigU/sIgKNXaesf5d7Y95jBBKS5KsxTqYBKXFsvKzo0= +github.com/apache/arrow-go/v18 v18.4.0 h1:/RvkGqH517iY8bZKc4FD5/kkdwXJGjxf28JIXbJ/oB0= +github.com/apache/arrow-go/v18 v18.4.0/go.mod h1:Aawvwhj8x2jURIzD9Moy72cF0FyJXOpkYpdmGRHcw14= github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 h1:byKBBF2CKWBjjA4J1ZL2JXttJULvWSl50LegTyRZ728= github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516/go.mod h1:QNYViu/X0HXDHw7m3KXzWSVXIbfUvJqBFe6Gj8/pYA0= github.com/apache/thrift v0.0.0-20181112125854-24918abba929/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.14.2/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.21.0 h1:tdPmh/ptjE1IJnhbhrcl2++TauVjy242rkV/UzJChnE= -github.com/apache/thrift v0.21.0/go.mod h1:W1H8aR/QRtYNvrPeFXBtobyRkd0/YVhTc6i07XIAgDw= +github.com/apache/thrift v0.22.0 h1:r7mTJdj51TMDe6RtcmNdQxgn9XcyfGDOzegMDRg47uc= +github.com/apache/thrift v0.22.0/go.mod h1:1e7J/O1Ae6ZQMTYdy9xa3w9k+XHWPfRvdPyJeynQ+/g= github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= github.com/aws/aws-sdk-go v1.30.19/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= github.com/aws/aws-sdk-go v1.37.0/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= @@ -142,83 +142,83 @@ github.com/aws/aws-sdk-go v1.43.31 h1:yJZIr8nMV1hXjAvvOLUFqZRJcHV7udPQBfhJqawDzI github.com/aws/aws-sdk-go v1.43.31/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go-v2 v1.16.2/go.mod h1:ytwTPBG6fXTZLxxeeCCWj2/EMYp/xDUgX+OET6TLNNU= github.com/aws/aws-sdk-go-v2 v1.23.0/go.mod h1:i1XDttT4rnf6vxc9AuskLc6s7XBee8rlLilKlc03uAA= -github.com/aws/aws-sdk-go-v2 v1.36.6 h1:zJqGjVbRdTPojeCGWn5IR5pbJwSQSBh5RWFTQcEQGdU= -github.com/aws/aws-sdk-go-v2 v1.36.6/go.mod h1:EYrzvCCN9CMUTa5+6lf6MM4tq3Zjp8UhSGR/cBsjai0= +github.com/aws/aws-sdk-go-v2 v1.37.0 h1:YtCOESR/pN4j5oA7cVHSfOwIcuh/KwHC4DOSXFbv5F0= +github.com/aws/aws-sdk-go-v2 v1.37.0/go.mod h1:9Q0OoGQoboYIAJyslFyF1f5K1Ryddop8gqMhWx/n4Wg= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.1/go.mod h1:n8Bs1ElDD2wJ9kCRTczA83gYbBmjSwZp3umc6zF4EeM= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.1/go.mod h1:t8PYl/6LzdAqsU4/9tz28V/kU+asFePvpOMkdul0gEQ= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.11 h1:12SpdwU8Djs+YGklkinSSlcrPyj3H4VifVsKf78KbwA= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.11/go.mod h1:dd+Lkp6YmMryke+qxW/VnKyhMBDTYP41Q2Bb+6gNZgY= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 h1:6GMWV6CNpA/6fbFHnoAjrv4+LGfyTqZz2LtCHnspgDg= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0/go.mod h1:/mXlTIVG9jbxkqDnr5UQNQxW1HRYxeGklkM9vAFeabg= github.com/aws/aws-sdk-go-v2/config v1.15.3/go.mod h1:9YL3v07Xc/ohTsxFXzan9ZpFpdTOFl4X65BAKYaz8jg= github.com/aws/aws-sdk-go-v2/config v1.25.3/go.mod h1:tAByZy03nH5jcq0vZmkcVoo6tRzRHEwSFx3QW4NmDw8= -github.com/aws/aws-sdk-go-v2/config v1.29.18 h1:x4T1GRPnqKV8HMJOMtNktbpQMl3bIsfx8KbqmveUO2I= -github.com/aws/aws-sdk-go-v2/config v1.29.18/go.mod h1:bvz8oXugIsH8K7HLhBv06vDqnFv3NsGDt2Znpk7zmOU= +github.com/aws/aws-sdk-go-v2/config v1.30.1 h1:sHL8g/+9tcZATeV2tEkEfxZeaNokDtKsSjGMGHD49qA= +github.com/aws/aws-sdk-go-v2/config v1.30.1/go.mod h1:wkibEyFfxXRyTSzRU4bbF5IUsSXyE4xQ4ZjkGmi5tFo= github.com/aws/aws-sdk-go-v2/credentials v1.11.2/go.mod h1:j8YsY9TXTm31k4eFhspiQicfXPLZ0gYXA50i4gxPE8g= github.com/aws/aws-sdk-go-v2/credentials v1.16.2/go.mod h1:sDdvGhXrSVT5yzBDR7qXz+rhbpiMpUYfF3vJ01QSdrc= -github.com/aws/aws-sdk-go-v2/credentials v1.17.71 h1:r2w4mQWnrTMJjOyIsZtGp3R3XGY3nqHn8C26C2lQWgA= -github.com/aws/aws-sdk-go-v2/credentials v1.17.71/go.mod h1:E7VF3acIup4GB5ckzbKFrCK0vTvEQxOxgdq4U3vcMCY= +github.com/aws/aws-sdk-go-v2/credentials v1.18.1 h1:E55xvOqlX7CvB66Z7rSM9usCrFU1ryUIUHqiXsEzVoE= +github.com/aws/aws-sdk-go-v2/credentials v1.18.1/go.mod h1:iobSQfR5MkvILxssGOvi/P1jjOhrRzfTiCPCzku0vx4= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.3/go.mod h1:uk1vhHHERfSVCUnqSqz8O48LBYDSC+k6brng09jcMOk= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.4/go.mod h1:t4i+yGHMCcUNIX1x7YVYa6bH/Do7civ5I6cG/6PMfyA= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.33 h1:D9ixiWSG4lyUBL2DDNK924Px9V/NBVpML90MHqyTADY= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.33/go.mod h1:caS/m4DI+cij2paz3rtProRBI4s/+TCiWoaWZuQ9010= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0 h1:9sBTeKQwAvmJUWKIACIoiFSnxxl+sS++YDfr17/ngq0= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0/go.mod h1:LW9/PxQD1SYFC7pnWcgqPhoyZprhjEdg5hBK6qYPLW8= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.3/go.mod h1:0dHuD2HZZSiwfJSy1FO5bX1hQ1TxVV1QXXjpn3XUE44= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.14.0/go.mod h1:UcgIwJ9KHquYxs6Q5skC9qXjhYMK+JASDYcXQ4X7JZE= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.85 h1:AfpstoiaenxGSCUheWiicgZE5XXS5Fi4CcQ4PA/x+Qw= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.85/go.mod h1:HxiF0Fd6WHWjdjOffLkCauq7JqzWqMMq0iUVLS7cPQc= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1 h1:aAjA/1JZ1xH/F9XvxJu9cXZyp7BqVXtHpztyZ6p799E= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1/go.mod h1:ia9HASsPba/7o84sp6iE4wZPdNTJ0oicBe5sWQQk+Ys= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.9/go.mod h1:AnVH5pvai0pAF4lXRq0bmhbes1u9R8wTE+g+183bZNM= github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.3/go.mod h1:7sGSz1JCKHWWBHq98m6sMtWQikmYPpxjqOydDemiVoM= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.37 h1:osMWfm/sC/L4tvEdQ65Gri5ZZDCUpuYJZbTTDrsn4I0= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.37/go.mod h1:ZV2/1fbjOPr4G4v38G3Ww5TBT4+hmsK45s/rxu1fGy0= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0 h1:H2iZoqW/v2Jnrh1FnU725Bq6KJ0k2uP63yH+DcY+HUI= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0/go.mod h1:L0FqLbwMXHvNC/7crWV1iIxUlOKYZUE8KuTIA+TozAI= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.3/go.mod h1:ssOhaLpRlh88H3UmEcsBoVKq309quMvm3Ds8e9d4eJM= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.3/go.mod h1:ify42Rb7nKeDDPkFjKn7q1bPscVPu/+gmHH8d2c+anU= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.37 h1:v+X21AvTb2wZ+ycg1gx+orkB/9U6L7AOp93R7qYxsxM= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.37/go.mod h1:G0uM1kyssELxmJ2VZEfG0q2npObR3BAkF3c1VsfVnfs= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0 h1:EDped/rNzAhFPhVY0sDGbtD16OKqksfA8OjF/kLEgw8= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0/go.mod h1:uUI335jvzpZRPpjYx6ODc/wg1qH+NnoSTK/FwVeK0C0= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.10/go.mod h1:8DcYQcz0+ZJaSxANlHIsbbi6S+zMwjwdDqwW3r9AzaE= github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.3/go.mod h1:5yzAuE9i2RkVAttBl8yxZgQr5OCq4D5yDnG7j9x2L0U= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.37 h1:XTZZ0I3SZUHAtBLBU6395ad+VOblE0DwQP6MuaNeics= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.37/go.mod h1:Pi6ksbniAWVwu2S8pEzcYPyhUkAcLaufxN7PfAUQjBk= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0 h1:iLvW/zOkHGU3BDU5thWnj+UZ9pjhuVhv1loLj7yVtBw= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0/go.mod h1:Fn3gvhdF1x5Rs9nUoCy/fJT1ms8f8dO7RqM9lJHuazQ= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.1/go.mod h1:GeUru+8VzrTXV/83XyMJ80KpH8xO89VPoUileyNQ+tc= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1/go.mod h1:l9ymW25HOqymeU2m1gbUQ3rUIsTwKs8gYHXkqDQUhiI= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.4 h1:CXV68E2dNqhuynZJPB80bhPQwAKqBWVer887figW6Jc= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.4/go.mod h1:/xFi9KtvBXP97ppCz1TAEvU1Uf66qvid89rbem3wCzQ= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 h1:6+lZi2JeGKtCraAj1rpoZfKqnQ9SptseRZioejfUOLM= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0/go.mod h1:eb3gfbVIxIoGgJsi9pGne19dhCBpK6opTYpQqAmdy44= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.3/go.mod h1:Seb8KNmD6kVTjwRjVEgOT5hPin6sq+v4C2ycJQDwuH8= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.3/go.mod h1:R+/S1O4TYpcktbVwddeOYg+uwUfLhADP2S/x4QwsCTM= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.5 h1:M5/B8JUaCI8+9QD+u3S/f4YHpvqE9RpSkV3rf0Iks2w= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.5/go.mod h1:Bktzci1bwdbpuLiu3AOksiNPMl/LLKmX1TWmqp2xbvs= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0 h1:qGyLBQPphYzUf+IIlb5tHnvg1U2Vc5hXPcP7oRSQfy0= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0/go.mod h1:g+dzKSLXiR/8ATkPXmLhPOI6rDdjLP3tngeo3FvDcIw= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.3/go.mod h1:wlY6SVjuwvh3TVRpTqdy4I1JpBFLX4UGeKZdWntaocw= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.3/go.mod h1:Owv1I59vaghv1Ax8zz8ELY8DN7/Y0rGS+WWAmjgi950= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.18 h1:vvbXsA2TVO80/KT7ZqCbx934dt6PY+vQ8hZpUZ/cpYg= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.18/go.mod h1:m2JJHledjBGNMsLOF1g9gbAxprzq3KjC8e4lxtn+eWg= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0 h1:eRhU3Sh8dGbaniI6B+I48XJMrTPRkK4DKo+vqIxziOU= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0/go.mod h1:paNLV18DZ6FnWE/bd06RIKPDIFpjuvCkGKWTG/GDBeM= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.3/go.mod h1:Bm/v2IaN6rZ+Op7zX+bOUMdL4fsrYZiD0dsjLhNKwZc= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.3/go.mod h1:KZgs2ny8HsxRIRbDwgvJcHHBZPOzQr/+NtGwnP+w2ec= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.18 h1:OS2e0SKqsU2LiJPqL8u9x41tKc6MMEHrWjLVLn3oysg= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.18/go.mod h1:+Yrk+MDGzlNGxCXieljNeWpoZTCQUQVL+Jk9hGGJ8qM= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0 h1:6jusT+XCcvnD+Elxvm7bUf5sCMTpZEp3AKjYQ4tWJSo= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0/go.mod h1:LimGpdIF/sTBdgqwOEkrArXLCoTamK/9L9x8IKBFTIc= github.com/aws/aws-sdk-go-v2/service/kms v1.16.3/go.mod h1:QuiHPBqlOFCi4LqdSskYYAWpQlx3PKmohy+rE2F+o5g= github.com/aws/aws-sdk-go-v2/service/s3 v1.26.3/go.mod h1:g1qvDuRsJY+XghsV6zg00Z4KJ7DtFFCx8fJD2a491Ak= github.com/aws/aws-sdk-go-v2/service/s3 v1.43.0/go.mod h1:NXRKkiRF+erX2hnybnVU660cYT5/KChRD4iUgJ97cI8= -github.com/aws/aws-sdk-go-v2/service/s3 v1.84.1 h1:RkHXU9jP0DptGy7qKI8CBGsUJruWz0v5IgwBa2DwWcU= -github.com/aws/aws-sdk-go-v2/service/s3 v1.84.1/go.mod h1:3xAOf7tdKF+qbb+XpU+EPhNXAdun3Lu1RcDrj8KC24I= +github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0 h1:gAV4NEp4A+JOrIdoXkAeyy6IOo7+X2s/jRuaHKYiMaU= +github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0/go.mod h1:JIQwK8sZ5MuKGm5rrFwp9MHUcyYEsQNpVixuPDlnwaU= github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.15.4/go.mod h1:PJc8s+lxyU8rrre0/4a0pn2wgwiDvOEzoOjcJUBr67o= github.com/aws/aws-sdk-go-v2/service/sns v1.17.4/go.mod h1:kElt+uCcXxcqFyc+bQqZPFD9DME/eC6oHBXvFzQ9Bcw= github.com/aws/aws-sdk-go-v2/service/sqs v1.18.3/go.mod h1:skmQo0UPvsjsuYYSYMVmrPc1HWCbHUJyrCEp+ZaLzqM= github.com/aws/aws-sdk-go-v2/service/ssm v1.24.1/go.mod h1:NR/xoKjdbRJ+qx0pMR4mI+N/H1I1ynHwXnO6FowXJc0= github.com/aws/aws-sdk-go-v2/service/sso v1.11.3/go.mod h1:7UQ/e69kU7LDPtY40OyoHYgRmgfGM4mgsLYtcObdveU= github.com/aws/aws-sdk-go-v2/service/sso v1.17.2/go.mod h1:/pE21vno3q1h4bbhUOEi+6Zu/aT26UK2WKkDXd+TssQ= -github.com/aws/aws-sdk-go-v2/service/sso v1.25.6 h1:rGtWqkQbPk7Bkwuv3NzpE/scwwL9sC1Ul3tn9x83DUI= -github.com/aws/aws-sdk-go-v2/service/sso v1.25.6/go.mod h1:u4ku9OLv4TO4bCPdxf4fA1upaMaJmP9ZijGk3AAOC6Q= +github.com/aws/aws-sdk-go-v2/service/sso v1.26.0 h1:cuFWHH87GP1NBGXXfMicUbE7Oty5KpPxN6w4JpmuxYc= +github.com/aws/aws-sdk-go-v2/service/sso v1.26.0/go.mod h1:aJBemdlbCKyOXEXdXBqS7E+8S9XTDcOTaoOjtng54hA= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.20.0/go.mod h1:dWqm5G767qwKPuayKfzm4rjzFmVjiBFbOJrpSPnAMDs= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.4 h1:OV/pxyXh+eMA0TExHEC4jyWdumLxNbzz1P0zJoezkJc= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.4/go.mod h1:8Mm5VGYwtm+r305FfPSuc+aFkrypeylGYhFim6XEPoc= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0 h1:t2va+wewPOYIqC6XyJ4MGjiGKkczMAPsgq5W4FtL9ME= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0/go.mod h1:ExCTcqYqN0hYYRsDlBVU8+68grqlWdgX9/nZJwQW4aY= github.com/aws/aws-sdk-go-v2/service/sts v1.16.3/go.mod h1:bfBj0iVmsUyUg4weDB4NxktD9rDGeKSVWnjTnwbx9b8= github.com/aws/aws-sdk-go-v2/service/sts v1.25.3/go.mod h1:4EqRHDCKP78hq3zOnmFXu5k0j4bXbRFfCh/zQ6KnEfQ= -github.com/aws/aws-sdk-go-v2/service/sts v1.34.1 h1:aUrLQwJfZtwv3/ZNG2xRtEen+NqI3iesuacjP51Mv1s= -github.com/aws/aws-sdk-go-v2/service/sts v1.34.1/go.mod h1:3wFBZKoWnX3r+Sm7in79i54fBmNfwhdNdQuscCw7QIk= +github.com/aws/aws-sdk-go-v2/service/sts v1.35.0 h1:FD9agdG4CeOGS3ORLByJk56YIXDS7mxFpmZyCtpqExc= +github.com/aws/aws-sdk-go-v2/service/sts v1.35.0/go.mod h1:NDzDPbBF1xtSTZUMuZx0w3hIfWzcL7X2AQ0Tr9becIQ= github.com/aws/smithy-go v1.11.2/go.mod h1:3xHYmszWVx2c0kIwQeEVf9uSm4fYZt67FBJnwub1bgM= github.com/aws/smithy-go v1.17.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= -github.com/aws/smithy-go v1.22.4 h1:uqXzVZNuNexwc/xrh6Tb56u89WDlJY6HS+KC0S4QSjw= -github.com/aws/smithy-go v1.22.4/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= +github.com/aws/smithy-go v1.22.5 h1:P9ATCXPMb2mPjYBgueqJNCA5S9UfktsW0tTxi+a7eqw= +github.com/aws/smithy-go v1.22.5/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/bobg/gcsobj v0.1.2/go.mod h1:vS49EQ1A1Ib8FgrL58C8xXYZyOCR2TgzAdopy6/ipa8= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= @@ -248,8 +248,9 @@ github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7 github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= 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/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU= github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= @@ -307,8 +308,8 @@ github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= -github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.3.0 h1:27XbWsHIqhbdR5TIC911OfYvgSaW93HM+dX7970Q7jk= +github.com/go-viper/mapstructure/v2 v2.3.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= @@ -364,13 +365,13 @@ github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= +github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= 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/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/flatbuffers v25.1.24+incompatible h1:4wPqL3K7GzBd1CwyhSd3usxLKOaJN/AC6puCca6Jm7o= -github.com/google/flatbuffers v25.1.24+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/flatbuffers v25.2.10+incompatible h1:F3vclr7C3HpB1k9mxCGRMXq6FdUalZ6H/pNX4FP1v0Q= +github.com/google/flatbuffers v25.2.10+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= 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= @@ -526,8 +527,8 @@ github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYW github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= -github.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY= -github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8= +github.com/klauspost/cpuid/v2 v2.2.11 h1:0OwqZRYI2rFrjS4kvkDnqJkKHdHaRnCm68/DY4OxRzU= +github.com/klauspost/cpuid/v2 v2.2.11/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= 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/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= @@ -549,8 +550,8 @@ github.com/marcboeker/go-duckdb/arrowmapping v0.0.10 h1:G1W+GVnUefR8uy7jHdNO+CRM github.com/marcboeker/go-duckdb/arrowmapping v0.0.10/go.mod h1:jccUb8TYD0p5TsEEeN4SXuslNJHo23QaKOqKD+U6uFU= github.com/marcboeker/go-duckdb/mapping v0.0.11 h1:fusN1b1l7Myxafifp596I6dNLNhN5Uv/rw31qAqBwqw= github.com/marcboeker/go-duckdb/mapping v0.0.11/go.mod h1:aYBjFLgfKO0aJIbDtXPiaL5/avRQISveX/j9tMf9JhU= -github.com/marcboeker/go-duckdb/v2 v2.3.3 h1:PQhWS1vLtotByrXmUg6YqmTS59WPJEqlCPhp464ZGUU= -github.com/marcboeker/go-duckdb/v2 v2.3.3/go.mod h1:RZgwGE22rly6aWbqO8lsfYjMvNuMd3YoTroWxL37H9E= +github.com/marcboeker/go-duckdb/v2 v2.3.2 h1:96zG2JPyIhCFjHdBjjSpOdhzJzehoGTdl7LskkuMUTs= +github.com/marcboeker/go-duckdb/v2 v2.3.2/go.mod h1:VeXz9ZM6klNvICHrXEUzaHSgNqBeTdyMxr4CICw/UaY= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= @@ -605,8 +606,9 @@ github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzL 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/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= @@ -1027,8 +1029,8 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -gonum.org/v1/gonum v0.15.1 h1:FNy7N6OUZVUaWG9pTiD+jlhdQ3lMP+/LcTpJ6+a8sQ0= -gonum.org/v1/gonum v0.15.1/go.mod h1:eZTZuRFrzu5pcyjN5wJhcIhnUdNijYxX1T2IcrOGY0o= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= 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= diff --git a/src/syncer-postgres/init_test.go b/src/syncer-postgres/init_test.go index 9d1e8a5..5eadd9c 100644 --- a/src/syncer-postgres/init_test.go +++ b/src/syncer-postgres/init_test.go @@ -5,6 +5,7 @@ import ( "flag" "os" + "github.com/BemiHQ/BemiDB/src/common" "github.com/BemiHQ/BemiDB/src/syncer-common" ) @@ -344,45 +345,45 @@ var CSV_ROWS_TEST_TABLE = [][]string{ }, { "2", // id - common.BEMIDB_NULL_STRING, // bit_column + syncerCommon.BEMIDB_NULL_STRING, // bit_column "f", // bool_column "", // bpchar_column - common.BEMIDB_NULL_STRING, // varchar_column + syncerCommon.BEMIDB_NULL_STRING, // varchar_column "", // text_column "-32767", // int2_column - common.BEMIDB_NULL_STRING, // int4_column + syncerCommon.BEMIDB_NULL_STRING, // int4_column "-9223372036854775807", // int8_column - common.BEMIDB_NULL_STRING, // hugeint_column - common.BEMIDB_NULL_STRING, // xid_column - common.BEMIDB_NULL_STRING, // xid8_column + syncerCommon.BEMIDB_NULL_STRING, // hugeint_column + syncerCommon.BEMIDB_NULL_STRING, // xid_column + syncerCommon.BEMIDB_NULL_STRING, // xid8_column "NaN", // float4_column "-3.141592653589793", // float8_column "-12345.00", // numeric_column - common.BEMIDB_NULL_STRING, // numeric_column_without_precision + syncerCommon.BEMIDB_NULL_STRING, // numeric_column_without_precision "20025-11-12", // date_column "12:00:00.123", // time_column - common.BEMIDB_NULL_STRING, // timeMsColumn + syncerCommon.BEMIDB_NULL_STRING, // timeMsColumn "12:00:00.12300+05", // timetz_column "12:00:00.1+05", // timetz_ms_column "2024-01-01 12:00:00", // timestamp_column - common.BEMIDB_NULL_STRING, // timestamp_ms_column + syncerCommon.BEMIDB_NULL_STRING, // timestamp_ms_column "2024-01-01 12:00:00.000123+05:30", // timestamptz_column "2024-01-01 12:00:00.12+05", // timestamptz_ms_column - common.BEMIDB_NULL_STRING, // uuid_column - common.BEMIDB_NULL_STRING, // bytea_column - common.BEMIDB_NULL_STRING, // interval_column - common.BEMIDB_NULL_STRING, // tsvector_column - common.BEMIDB_NULL_STRING, // xml_column - common.BEMIDB_NULL_STRING, // pg_snapshot_column - common.BEMIDB_NULL_STRING, // point_column - common.BEMIDB_NULL_STRING, // inet_column - common.BEMIDB_NULL_STRING, // json_column + syncerCommon.BEMIDB_NULL_STRING, // uuid_column + syncerCommon.BEMIDB_NULL_STRING, // bytea_column + syncerCommon.BEMIDB_NULL_STRING, // interval_column + syncerCommon.BEMIDB_NULL_STRING, // tsvector_column + syncerCommon.BEMIDB_NULL_STRING, // xml_column + syncerCommon.BEMIDB_NULL_STRING, // pg_snapshot_column + syncerCommon.BEMIDB_NULL_STRING, // point_column + syncerCommon.BEMIDB_NULL_STRING, // inet_column + syncerCommon.BEMIDB_NULL_STRING, // json_column "{}", // jsonb_column - common.BEMIDB_NULL_STRING, // array_text_column + syncerCommon.BEMIDB_NULL_STRING, // array_text_column "{}", // array_int_column - common.BEMIDB_NULL_STRING, // array_jsonb_column - common.BEMIDB_NULL_STRING, // array_ltree_column - common.BEMIDB_NULL_STRING, // user_defined_column + syncerCommon.BEMIDB_NULL_STRING, // array_jsonb_column + syncerCommon.BEMIDB_NULL_STRING, // array_ltree_column + syncerCommon.BEMIDB_NULL_STRING, // user_defined_column }, } var CSV_ROWS_PARTITIONED_TABLE1 = [][]string{{"2024-01-01 01:02:03.123456"}} @@ -634,7 +635,7 @@ var JSON_ROWS_PARTITIONED_TABLE3 = []string{ func init() { config := loadTestConfig() - trino := common.NewTrino(config.BaseConfig) + trino := syncerCommon.NewTrino(config.CommonConfig, config.TrinoConfig, config.DestinationSchemaName) defer trino.Close() utils := NewSyncerUtils(config) @@ -663,7 +664,7 @@ func init() { switch config.SyncMode { case SyncModeFullRefresh: - storageS3 := common.NewStorageS3(config.BaseConfig) + storageS3 := syncerCommon.NewStorageS3(config.CommonConfig) utils.DeleteOldTables(storageS3, common.NewSet[string]()) createTestTableViaFullRefresh(config, PgSchemaTable{Schema: "public", Table: "test_table"}, PG_SCHEMA_COLUMNS_TEST_TABLE, CSV_ROWS_TEST_TABLE) createTestTableViaFullRefresh(config, PgSchemaTable{Schema: "public", Table: "partitioned_table1"}, PG_SCHEMA_COLUMNS_PARTITIONED_TABLE, CSV_ROWS_PARTITIONED_TABLE1) @@ -694,12 +695,12 @@ func setTestArgs(args []string) { registerFlags() } -func createTestTableViaCdc(config *Config, trino *common.Trino, pgSchemaTable PgSchemaTable, pgSchemaColumns []PgSchemaColumn, messagesStrings []string) { +func createTestTableViaCdc(config *Config, trino *syncerCommon.Trino, pgSchemaTable PgSchemaTable, pgSchemaColumns []PgSchemaColumn, messagesStrings []string) { panic("CDC is not supported") } func createTestTableViaFullRefresh(config *Config, pgSchemaTable PgSchemaTable, pgSchemaColumns []PgSchemaColumn, rows [][]string) { - cappedBuffer := common.NewCappedBuffer(config.BaseConfig, MAX_IN_MEMORY_BUFFER_SIZE) + cappedBuffer := syncerCommon.NewCappedBuffer(config.CommonConfig, MAX_IN_MEMORY_BUFFER_SIZE) writer := csv.NewWriter(cappedBuffer) headerRow := []string{} @@ -707,11 +708,11 @@ func createTestTableViaFullRefresh(config *Config, pgSchemaTable PgSchemaTable, headerRow = append(headerRow, pgSchemaColumn.ColumnName) } err := writer.Write(headerRow) - common.PanicIfError(config.BaseConfig, err) + common.PanicIfError(config.CommonConfig, err) for _, row := range rows { err := writer.Write(row) - common.PanicIfError(config.BaseConfig, err) + common.PanicIfError(config.CommonConfig, err) } writer.Flush() diff --git a/src/syncer-postgres/main.go b/src/syncer-postgres/main.go index 4f94206..175e944 100644 --- a/src/syncer-postgres/main.go +++ b/src/syncer-postgres/main.go @@ -1,7 +1,13 @@ package main +import ( + "github.com/BemiHQ/BemiDB/src/common" +) + func main() { config := LoadConfig() + defer common.HandleUnexpectedPanic(config.CommonConfig) + syncer := NewSyncer(config) syncer.Sync() } diff --git a/src/syncer-postgres/nats.go b/src/syncer-postgres/nats.go index ca2b907..4e0e9f2 100644 --- a/src/syncer-postgres/nats.go +++ b/src/syncer-postgres/nats.go @@ -6,7 +6,7 @@ import ( nts "github.com/nats-io/nats.go" js "github.com/nats-io/nats.go/jetstream" - "github.com/BemiHQ/BemiDB/src/syncer-common" + "github.com/BemiHQ/BemiDB/src/common" ) const () @@ -24,14 +24,14 @@ func NewNats(config *Config) *Nats { func (nats *Nats) Stream(ctx context.Context) js.Stream { jetstream := nats.newJetstream() stream, err := jetstream.Stream(ctx, nats.Config.Nats.Stream) - common.PanicIfError(nats.Config.BaseConfig, err) + common.PanicIfError(nats.Config.CommonConfig, err) return stream } func (nats *Nats) newJetstream() js.JetStream { nc, err := nts.Connect(nats.Config.Nats.Url) - common.PanicIfError(nats.Config.BaseConfig, err) + common.PanicIfError(nats.Config.CommonConfig, err) jetstream, err := js.New(nc) - common.PanicIfError(nats.Config.BaseConfig, err) + common.PanicIfError(nats.Config.CommonConfig, err) return jetstream } diff --git a/src/syncer-postgres/pg_schema_column.go b/src/syncer-postgres/pg_schema_column.go index 5e64e48..76cc781 100644 --- a/src/syncer-postgres/pg_schema_column.go +++ b/src/syncer-postgres/pg_schema_column.go @@ -7,6 +7,7 @@ import ( "strings" "time" + "github.com/BemiHQ/BemiDB/src/common" "github.com/BemiHQ/BemiDB/src/syncer-common" ) @@ -35,57 +36,57 @@ func NewPgSchemaColumn(config *Config) *PgSchemaColumn { } } -func (pgSchemaColumn *PgSchemaColumn) ToIcebergSchemaColumn() *common.IcebergSchemaColumn { - var icebergColumnType common.IcebergColumnType +func (pgSchemaColumn *PgSchemaColumn) ToIcebergSchemaColumn() *syncerCommon.IcebergSchemaColumn { + var icebergColumnType syncerCommon.IcebergColumnType switch strings.TrimLeft(pgSchemaColumn.UdtName, "_") { case "bool": - icebergColumnType = common.IcebergColumnTypeBoolean + icebergColumnType = syncerCommon.IcebergColumnTypeBoolean case "bit", "int2", "int4": - icebergColumnType = common.IcebergColumnTypeInteger + icebergColumnType = syncerCommon.IcebergColumnTypeInteger case "xid": - icebergColumnType = common.IcebergColumnTypeLong + icebergColumnType = syncerCommon.IcebergColumnTypeLong case "int8", "xid8": - icebergColumnType = common.IcebergColumnTypeDecimal + icebergColumnType = syncerCommon.IcebergColumnTypeDecimal case "float4": - icebergColumnType = common.IcebergColumnTypeFloat + icebergColumnType = syncerCommon.IcebergColumnTypeFloat case "float8": - icebergColumnType = common.IcebergColumnTypeDouble + icebergColumnType = syncerCommon.IcebergColumnTypeDouble case "numeric": - icebergColumnType = common.IcebergColumnTypeDecimal + icebergColumnType = syncerCommon.IcebergColumnTypeDecimal case "date": - icebergColumnType = common.IcebergColumnTypeDate + icebergColumnType = syncerCommon.IcebergColumnTypeDate case "time": - icebergColumnType = common.IcebergColumnTypeTime + icebergColumnType = syncerCommon.IcebergColumnTypeTime case "timetz": - icebergColumnType = common.IcebergColumnTypeTimeTz + icebergColumnType = syncerCommon.IcebergColumnTypeTimeTz case "timestamp": - icebergColumnType = common.IcebergColumnTypeTimestamp + icebergColumnType = syncerCommon.IcebergColumnTypeTimestamp case "timestamptz": - icebergColumnType = common.IcebergColumnTypeTimestampTz + icebergColumnType = syncerCommon.IcebergColumnTypeTimestampTz case "varchar", "char", "text", "jsonb", "json", "bpchar", "uuid", "point", "line", "lseg", "box", "path", "polygon", "circle", "cidr", "inet", "macaddr", "macaddr8", "interval", "ltree", "tsvector", "xml", "pg_snapshot": - icebergColumnType = common.IcebergColumnTypeString + icebergColumnType = syncerCommon.IcebergColumnTypeString case "bytea": - icebergColumnType = common.IcebergColumnTypeBinary + icebergColumnType = syncerCommon.IcebergColumnTypeBinary default: // User-defined types -> VARCHAR if pgSchemaColumn.Namespace != PG_SCHEMA_PG_CATALOG { - icebergColumnType = common.IcebergColumnTypeString + icebergColumnType = syncerCommon.IcebergColumnTypeString } else { panic("Unsupported PostgreSQL type: " + pgSchemaColumn.UdtName) } } - return &common.IcebergSchemaColumn{ - Config: pgSchemaColumn.Config.BaseConfig, + return &syncerCommon.IcebergSchemaColumn{ + Config: pgSchemaColumn.Config.CommonConfig, ColumnName: pgSchemaColumn.ColumnName, ColumnType: icebergColumnType, - Position: common.StringToInt(pgSchemaColumn.OrdinalPosition), - NumericPrecision: common.StringToInt(pgSchemaColumn.NumericPrecision), - NumericScale: common.StringToInt(pgSchemaColumn.NumericScale), + Position: syncerCommon.StringToInt(pgSchemaColumn.OrdinalPosition), + NumericPrecision: syncerCommon.StringToInt(pgSchemaColumn.NumericPrecision), + NumericScale: syncerCommon.StringToInt(pgSchemaColumn.NumericScale), IsList: pgSchemaColumn.DataType == PG_DATA_TYPE_ARRAY, IsNullable: pgSchemaColumn.IsNullable == PG_TRUE, } @@ -120,7 +121,7 @@ func (pgSchemaColumn *PgSchemaColumn) JsonToTrinoValue(jsonValue interface{}) st func (pgSchemaColumn *PgSchemaColumn) CsvToTrinoValue(csvValue string) string { if pgSchemaColumn.DataType == PG_DATA_TYPE_ARRAY { - if csvValue == common.BEMIDB_NULL_STRING { + if csvValue == syncerCommon.BEMIDB_NULL_STRING { return "NULL" } @@ -134,7 +135,7 @@ func (pgSchemaColumn *PgSchemaColumn) CsvToTrinoValue(csvValue string) string { csvString = strings.ReplaceAll(csvString, "\\\"", "\"\"") csvReader := csv.NewReader(strings.NewReader(csvString)) stringValues, err := csvReader.Read() - common.PanicIfError(pgSchemaColumn.Config.BaseConfig, err) + common.PanicIfError(pgSchemaColumn.Config.CommonConfig, err) var values []string for _, stringValue := range stringValues { @@ -165,26 +166,26 @@ func (pgSchemaColumn *PgSchemaColumn) jsonToPrimitiveTrinoValue(jsonValue interf } return "0" case "int2", "int4", "xid": - return common.Float64ToString(jsonValue.(float64)) + return syncerCommon.Float64ToString(jsonValue.(float64)) case "float4": if kind == reflect.String { return "nan()" } - return common.Float64ToString(jsonValue.(float64)) + return syncerCommon.Float64ToString(jsonValue.(float64)) case "float8": if kind == reflect.String { return "nan()" } - return "CAST('" + common.Float64ToString(jsonValue.(float64)) + "' AS DOUBLE)" + return "CAST('" + syncerCommon.Float64ToString(jsonValue.(float64)) + "' AS DOUBLE)" case "int8", "xid8", "numeric": - return "DECIMAL '" + common.Float64ToString(jsonValue.(float64)) + "'" + return "DECIMAL '" + syncerCommon.Float64ToString(jsonValue.(float64)) + "'" case "date": - return "DATE '1970-01-01' + INTERVAL '" + common.Float64ToString(jsonValue.(float64)) + "' DAY" + return "DATE '1970-01-01' + INTERVAL '" + syncerCommon.Float64ToString(jsonValue.(float64)) + "' DAY" case "timestamp": if pgSchemaColumn.DatetimePrecision == "6" { - return "from_unixtime_nanos(" + common.Float64ToString(jsonValue.(float64)) + " * 1000)" + return "from_unixtime_nanos(" + syncerCommon.Float64ToString(jsonValue.(float64)) + " * 1000)" } - return "from_unixtime_nanos(" + common.Float64ToString(jsonValue.(float64)) + " * 1000000)" + return "from_unixtime_nanos(" + syncerCommon.Float64ToString(jsonValue.(float64)) + " * 1000000)" case "timestamptz": return "from_iso8601_timestamp_nanos('" + jsonValue.(string) + "')" case "time": @@ -209,7 +210,7 @@ func (pgSchemaColumn *PgSchemaColumn) jsonToPrimitiveTrinoValue(jsonValue interf case "timetz": return "TIME '" + strings.TrimRight(jsonValue.(string), "Z") + "' AT TIME ZONE 'UTC'" case "interval": - return "'" + common.Float64ToString(jsonValue.(float64)) + "us'" + return "'" + syncerCommon.Float64ToString(jsonValue.(float64)) + "us'" case "varchar", "char", "text", "jsonb", "json", "uuid", "line", "lseg", "box", "path", "polygon", "circle", "cidr", "inet", "macaddr", "macaddr8", @@ -225,12 +226,12 @@ func (pgSchemaColumn *PgSchemaColumn) jsonToPrimitiveTrinoValue(jsonValue interf if point["wkb"] == nil { return "NULL" } - return "'" + common.Base64ToHex(point["wkb"].(string)) + "'" + return "'" + syncerCommon.Base64ToHex(point["wkb"].(string)) + "'" default: // User-defined types -> VARCHAR value if pgSchemaColumn.Namespace != PG_SCHEMA_PG_CATALOG { if kind == reflect.String { - stringValue, err := common.HexToString(jsonValue.(string)) + stringValue, err := syncerCommon.HexToString(jsonValue.(string)) if err == nil { return "'" + stringValue + "'" } else { @@ -247,7 +248,7 @@ func (pgSchemaColumn *PgSchemaColumn) jsonToPrimitiveTrinoValue(jsonValue interf } func (pgSchemaColumn *PgSchemaColumn) csvToPrimitiveTrinoValue(csvValue string) string { - if csvValue == common.BEMIDB_NULL_STRING { + if csvValue == syncerCommon.BEMIDB_NULL_STRING { return "NULL" } @@ -285,7 +286,7 @@ func (pgSchemaColumn *PgSchemaColumn) csvToPrimitiveTrinoValue(csvValue string) } else if pgSchemaColumn.DatetimePrecision == "3" { parsedTime, err = time.Parse("15:04:05.999-07", csvValue) } - common.PanicIfError(pgSchemaColumn.Config.BaseConfig, err) + common.PanicIfError(pgSchemaColumn.Config.CommonConfig, err) parsedTime = parsedTime.In(time.UTC) return "TIME '" + parsedTime.Format("15:04:05.999999-07:00") + "' AT TIME ZONE 'UTC'" @@ -295,20 +296,20 @@ func (pgSchemaColumn *PgSchemaColumn) csvToPrimitiveTrinoValue(csvValue string) parts := strings.Split(csvValue, " ") for i, part := range parts { if strings.HasPrefix(part, "mon") { - months := common.StringToInt(parts[i-1]) + months := syncerCommon.StringToInt(parts[i-1]) microseconds += months * 30_437_500 * 24 * 60 * 60 // Approximation: 30.4375 days per month } else if strings.HasPrefix(part, "day") { - days := common.StringToInt(parts[i-1]) + days := syncerCommon.StringToInt(parts[i-1]) microseconds += days * 24 * 60 * 60 * 1_000_000 } else if strings.Contains(part, ":") { timeParts := strings.Split(part, ":") - hours := common.StringToInt(timeParts[0]) - minutes := common.StringToInt(timeParts[1]) + hours := syncerCommon.StringToInt(timeParts[0]) + minutes := syncerCommon.StringToInt(timeParts[1]) secondsParts := strings.Split(timeParts[2], ".") - seconds := common.StringToInt(secondsParts[0]) + seconds := syncerCommon.StringToInt(secondsParts[0]) microseconds += (hours * 60 * 60 * 1_000_000) + (minutes * 60 * 1_000_000) + (seconds * 1_000_000) if len(secondsParts) > 1 && len(secondsParts[1]) == 6 { - microseconds += common.StringToInt(secondsParts[1]) + microseconds += syncerCommon.StringToInt(secondsParts[1]) } } } @@ -351,13 +352,13 @@ func (pgSchemaColumn *PgSchemaColumn) primitiveTrinoType() string { case "float8": return "DOUBLE" case "numeric": - scale := common.StringToInt(pgSchemaColumn.NumericScale) - precision := common.StringToInt(pgSchemaColumn.NumericPrecision) - if precision > common.TRINO_MAX_DECIMAL_PRECISION { - precision = common.TRINO_MAX_DECIMAL_PRECISION + scale := syncerCommon.StringToInt(pgSchemaColumn.NumericScale) + precision := syncerCommon.StringToInt(pgSchemaColumn.NumericPrecision) + if precision > syncerCommon.TRINO_MAX_DECIMAL_PRECISION { + precision = syncerCommon.TRINO_MAX_DECIMAL_PRECISION } else if precision == 0 { - precision = common.TRINO_MAX_DECIMAL_PRECISION - scale = common.TRINO_MAX_DECIMAL_PRECISION / 2 + precision = syncerCommon.TRINO_MAX_DECIMAL_PRECISION + scale = syncerCommon.TRINO_MAX_DECIMAL_PRECISION / 2 } return "DECIMAL(" + common.IntToString(precision) + ", " + common.IntToString(scale) + ")" case "date": diff --git a/src/syncer-postgres/postgres.go b/src/syncer-postgres/postgres.go index a52514f..eb7d02d 100644 --- a/src/syncer-postgres/postgres.go +++ b/src/syncer-postgres/postgres.go @@ -2,12 +2,9 @@ package main import ( "context" - "net/url" - "strings" "time" - "github.com/BemiHQ/BemiDB/src/syncer-common" - "github.com/jackc/pgx/v5" + "github.com/BemiHQ/BemiDB/src/common" ) const ( @@ -19,45 +16,40 @@ const ( ) type Postgres struct { - Conn *pgx.Conn - Config *Config + PostgresClient *common.PostgresClient + Config *Config } func NewPostgres(config *Config) *Postgres { - ctx, cancel := context.WithTimeout(context.Background(), PG_CONNECTION_TIMEOUT) - defer cancel() + postgresClient := common.NewPostgresClient(config.CommonConfig, config.DatabaseUrl) - conn, err := pgx.Connect(ctx, urlEncodePassword(config.DatabaseUrl)) - common.PanicIfError(config.BaseConfig, err) - - _, err = conn.Exec(ctx, "SET SESSION statement_timeout = '"+PG_SESSION_TIMEOUT+"'") - common.PanicIfError(config.BaseConfig, err) + _, err := postgresClient.Exec(context.Background(), "SET SESSION statement_timeout = '"+PG_SESSION_TIMEOUT+"'") + common.PanicIfError(config.CommonConfig, err) return &Postgres{ - Config: config, - Conn: conn, + Config: config, + PostgresClient: postgresClient, } } func (postgres *Postgres) Close() { - err := postgres.Conn.Close(context.Background()) - common.PanicIfError(postgres.Config.BaseConfig, err) + postgres.PostgresClient.Close() } func (postgres *Postgres) Schemas() []string { var schemas []string - schemasRows, err := postgres.query( + schemasRows, err := postgres.PostgresClient.Query( context.Background(), "SELECT schema_name FROM information_schema.schemata WHERE schema_name NOT IN ('pg_catalog', 'pg_toast', 'information_schema')", ) - common.PanicIfError(postgres.Config.BaseConfig, err) + common.PanicIfError(postgres.Config.CommonConfig, err) defer schemasRows.Close() for schemasRows.Next() { var schema string err = schemasRows.Scan(&schema) - common.PanicIfError(postgres.Config.BaseConfig, err) + common.PanicIfError(postgres.Config.CommonConfig, err) schemas = append(schemas, schema) } @@ -67,7 +59,7 @@ func (postgres *Postgres) Schemas() []string { func (postgres *Postgres) SchemaTables(schema string) []PgSchemaTable { var pgSchemaTables []PgSchemaTable - tablesRows, err := postgres.query( + tablesRows, err := postgres.PostgresClient.Query( context.Background(), ` SELECT pg_class.relname AS table, COALESCE(parent.relname, '') AS parent_partitioned_table @@ -79,13 +71,13 @@ func (postgres *Postgres) SchemaTables(schema string) []PgSchemaTable { `, schema, ) - common.PanicIfError(postgres.Config.BaseConfig, err) + common.PanicIfError(postgres.Config.CommonConfig, err) defer tablesRows.Close() for tablesRows.Next() { pgSchemaTable := PgSchemaTable{Schema: schema} err = tablesRows.Scan(&pgSchemaTable.Table, &pgSchemaTable.ParentPartitionedTable) - common.PanicIfError(postgres.Config.BaseConfig, err) + common.PanicIfError(postgres.Config.CommonConfig, err) pgSchemaTables = append(pgSchemaTables, pgSchemaTable) } @@ -95,7 +87,7 @@ func (postgres *Postgres) SchemaTables(schema string) []PgSchemaTable { func (postgres *Postgres) PgSchemaColumns(pgSchemaTable PgSchemaTable) []PgSchemaColumn { var pgSchemaColumns []PgSchemaColumn - rows, err := postgres.query( + rows, err := postgres.PostgresClient.Query( context.Background(), `SELECT columns.column_name, @@ -129,7 +121,7 @@ func (postgres *Postgres) PgSchemaColumns(pgSchemaTable PgSchemaTable) []PgSchem pgSchemaTable.Schema, pgSchemaTable.Table, ) - common.PanicIfError(postgres.Config.BaseConfig, err) + common.PanicIfError(postgres.Config.CommonConfig, err) defer rows.Close() for rows.Next() { @@ -146,47 +138,9 @@ func (postgres *Postgres) PgSchemaColumns(pgSchemaTable PgSchemaTable) []PgSchem &pgSchemaColumn.Namespace, &pgSchemaColumn.PartOfPrimaryKey, ) - common.PanicIfError(postgres.Config.BaseConfig, err) + common.PanicIfError(postgres.Config.CommonConfig, err) pgSchemaColumns = append(pgSchemaColumns, *pgSchemaColumn) } return pgSchemaColumns } - -// Example: -// - From postgres://username:pas$:wor^d@host:port/database -// - To postgres://username:pas%24%3Awor%5Ed@host:port/database -func urlEncodePassword(pgDatabaseUrl string) string { - // No credentials - if !strings.Contains(pgDatabaseUrl, "@") { - return pgDatabaseUrl - } - - password := strings.TrimPrefix(pgDatabaseUrl, "postgresql://") - password = strings.TrimPrefix(password, "postgres://") - passwordEndIndex := strings.LastIndex(password, "@") - password = password[:passwordEndIndex] - - // Credentials without password - if !strings.Contains(password, ":") { - return pgDatabaseUrl - } - - _, password, _ = strings.Cut(password, ":") - decodedPassword, err := url.QueryUnescape(password) - if err != nil { - return pgDatabaseUrl - } - - // Password is already encoded - if decodedPassword != password { - return pgDatabaseUrl - } - - return strings.Replace(pgDatabaseUrl, ":"+password+"@", ":"+url.QueryEscape(password)+"@", 1) -} - -func (postgres *Postgres) query(ctx context.Context, query string, args ...any) (pgx.Rows, error) { - common.LogDebug(postgres.Config.BaseConfig, "Postgres query:", query) - return postgres.Conn.Query(ctx, query, args...) -} diff --git a/src/syncer-postgres/syncer.go b/src/syncer-postgres/syncer.go index b229710..84cc786 100644 --- a/src/syncer-postgres/syncer.go +++ b/src/syncer-postgres/syncer.go @@ -3,6 +3,7 @@ package main import ( "net/url" + "github.com/BemiHQ/BemiDB/src/common" "github.com/BemiHQ/BemiDB/src/syncer-common" ) @@ -19,12 +20,12 @@ func NewSyncer(config *Config) *Syncer { } func (syncer *Syncer) Sync() { - common.SendAnonymousAnalytics(syncer.Config.BaseConfig, "syncer-postgres-start", syncer.name()) + syncerCommon.SendAnonymousAnalytics(syncer.Config.CommonConfig, "syncer-postgres-start", syncer.name()) postgres := NewPostgres(syncer.Config) defer postgres.Close() - trino := common.NewTrino(syncer.Config.BaseConfig) + trino := syncerCommon.NewTrino(syncer.Config.CommonConfig, syncer.Config.TrinoConfig, syncer.Config.DestinationSchemaName) defer trino.Close() trino.CreateSchemaIfNotExists() @@ -33,20 +34,20 @@ func (syncer *Syncer) Sync() { switch syncer.Config.SyncMode { case SyncModeCDC: - common.LogInfo(syncer.Config.BaseConfig, "Starting CDC sync...") + common.LogInfo(syncer.Config.CommonConfig, "Starting CDC sync...") panic("CDC is not supported") case SyncModeIncremental: - common.LogInfo(syncer.Config.BaseConfig, "Starting incremental sync...") + common.LogInfo(syncer.Config.CommonConfig, "Starting incremental sync...") panic("Incremental sync is not supported") case SyncModeFullRefresh: - common.LogInfo(syncer.Config.BaseConfig, "Starting full-refresh sync...") + common.LogInfo(syncer.Config.CommonConfig, "Starting full-refresh sync...") NewSyncerFullRefresh(syncer.Config).Sync(postgres, pgSchemaTables) } - common.SendAnonymousAnalytics(syncer.Config.BaseConfig, "syncer-postgres-finish", syncer.name()) + syncerCommon.SendAnonymousAnalytics(syncer.Config.CommonConfig, "syncer-postgres-finish", syncer.name()) } -func (syncer *Syncer) pgSchemaTables(postgres *Postgres, trino *common.Trino) []PgSchemaTable { +func (syncer *Syncer) pgSchemaTables(postgres *Postgres, trino *syncerCommon.Trino) []PgSchemaTable { pgSchemaTables := make([]PgSchemaTable, 0) for _, schema := range postgres.Schemas() { for _, pgSchemaTable := range postgres.SchemaTables(schema) { diff --git a/src/syncer-postgres/syncer_full_refresh.go b/src/syncer-postgres/syncer_full_refresh.go index 9aa55aa..55a8ae6 100644 --- a/src/syncer-postgres/syncer_full_refresh.go +++ b/src/syncer-postgres/syncer_full_refresh.go @@ -3,8 +3,7 @@ package main import ( "context" - "github.com/jackc/pgx/v5" - + "github.com/BemiHQ/BemiDB/src/common" "github.com/BemiHQ/BemiDB/src/syncer-common" ) @@ -16,27 +15,27 @@ const ( type SyncerFullRefresh struct { Config *Config Utils *SyncerUtils - StorageS3 *common.StorageS3 + StorageS3 *syncerCommon.StorageS3 } func NewSyncerFullRefresh(config *Config) *SyncerFullRefresh { return &SyncerFullRefresh{ Config: config, Utils: NewSyncerUtils(config), - StorageS3: common.NewStorageS3(config.BaseConfig), + StorageS3: syncerCommon.NewStorageS3(config.CommonConfig), } } func (syncer *SyncerFullRefresh) Sync(postgres *Postgres, pgSchemaTables []PgSchemaTable) { - _, err := postgres.Conn.Exec(context.Background(), "BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE READ ONLY DEFERRABLE") - common.PanicIfError(syncer.Config.BaseConfig, err) + _, err := postgres.PostgresClient.Exec(context.Background(), "BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE READ ONLY DEFERRABLE") + common.PanicIfError(syncer.Config.CommonConfig, err) icebergTableNames := common.NewSet[string]() for _, pgSchemaTable := range pgSchemaTables { pgSchemaColumns := postgres.PgSchemaColumns(pgSchemaTable) - common.LogInfo(syncer.Config.BaseConfig, "Syncing table:", pgSchemaTable.String()+"...") + common.LogInfo(syncer.Config.CommonConfig, "Syncing table:", pgSchemaTable.String()+"...") syncer.syncTable(postgres, pgSchemaTable, pgSchemaColumns) icebergTableNames.Add(pgSchemaTable.IcebergTableName()) @@ -47,40 +46,40 @@ func (syncer *SyncerFullRefresh) Sync(postgres *Postgres, pgSchemaTables []PgSch func (syncer *SyncerFullRefresh) syncTable(postgres *Postgres, pgSchemaTable PgSchemaTable, pgSchemaColumns []PgSchemaColumn) { // Create a capped buffer read and written in parallel - cappedBuffer := common.NewCappedBuffer(syncer.Config.BaseConfig, MAX_IN_MEMORY_BUFFER_SIZE) + cappedBuffer := syncerCommon.NewCappedBuffer(syncer.Config.CommonConfig, MAX_IN_MEMORY_BUFFER_SIZE) // Copy from PG to cappedBuffer in a separate goroutine in parallel go func() { - syncer.copyFromPgTable(postgres.Conn, pgSchemaTable, cappedBuffer) + syncer.copyFromPgTable(postgres, pgSchemaTable, cappedBuffer) }() // Read from cappedBuffer and write to Iceberg syncer.writeToIceberg(pgSchemaTable, pgSchemaColumns, cappedBuffer) } -func (syncer *SyncerFullRefresh) writeToIceberg(pgSchemaTable PgSchemaTable, pgSchemaColumns []PgSchemaColumn, cappedBuffer *common.CappedBuffer) { - icebergSchemaColumns := make([]*common.IcebergSchemaColumn, len(pgSchemaColumns)) +func (syncer *SyncerFullRefresh) writeToIceberg(pgSchemaTable PgSchemaTable, pgSchemaColumns []PgSchemaColumn, cappedBuffer *syncerCommon.CappedBuffer) { + icebergSchemaColumns := make([]*syncerCommon.IcebergSchemaColumn, len(pgSchemaColumns)) for i, pgSchemaColumn := range pgSchemaColumns { icebergSchemaColumns[i] = pgSchemaColumn.ToIcebergSchemaColumn() } // Delete -syncing table - syncingIcebergTable := common.NewIcebergTable(syncer.Config.BaseConfig, syncer.StorageS3, pgSchemaTable.IcebergTableName()+TEMP_TABLE_SUFFIX_SYNCING) + syncingIcebergTable := syncerCommon.NewIcebergTable(syncer.Config.CommonConfig, syncer.StorageS3, syncer.Config.DestinationSchemaName, pgSchemaTable.IcebergTableName()+TEMP_TABLE_SUFFIX_SYNCING) syncingIcebergTable.DeleteIfExists() // Write and create -syncing table - icebergWriter := common.NewIcebergWriter(syncer.Config.BaseConfig, syncer.StorageS3, icebergSchemaColumns) + icebergWriter := syncerCommon.NewIcebergWriter(syncer.Config.CommonConfig, syncer.StorageS3, icebergSchemaColumns) syncingIcebergTable.GenerateS3TablePath() syncer.Utils.ReplaceFromCappedBuffer(icebergWriter, syncingIcebergTable, cappedBuffer) syncingIcebergTable.Create() // Delete -deleting table - deletingIcebergTable := common.NewIcebergTable(syncer.Config.BaseConfig, syncer.StorageS3, pgSchemaTable.IcebergTableName()+TEMP_TABLE_SUFFIX_DELETING) + deletingIcebergTable := syncerCommon.NewIcebergTable(syncer.Config.CommonConfig, syncer.StorageS3, syncer.Config.DestinationSchemaName, pgSchemaTable.IcebergTableName()+TEMP_TABLE_SUFFIX_DELETING) deletingIcebergTable.DeleteIfExists() // Rename table to -deleting - icebergTable := common.NewIcebergTable(syncer.Config.BaseConfig, syncer.StorageS3, pgSchemaTable.IcebergTableName()) - icebergTable.Rename(deletingIcebergTable.Name) + icebergTable := syncerCommon.NewIcebergTable(syncer.Config.CommonConfig, syncer.StorageS3, syncer.Config.DestinationSchemaName, pgSchemaTable.IcebergTableName()) + icebergTable.Rename(deletingIcebergTable.TableName) // Rename -syncing to table syncingIcebergTable.Rename(pgSchemaTable.IcebergTableName()) @@ -89,11 +88,11 @@ func (syncer *SyncerFullRefresh) writeToIceberg(pgSchemaTable PgSchemaTable, pgS deletingIcebergTable.DeleteIfExists() } -func (syncer *SyncerFullRefresh) copyFromPgTable(copyConn *pgx.Conn, pgSchemaTable PgSchemaTable, cappedBuffer *common.CappedBuffer) { - copySql := "COPY " + pgSchemaTable.String() + " TO STDOUT WITH CSV HEADER NULL '" + common.BEMIDB_NULL_STRING + "'" - result, err := copyConn.PgConn().CopyTo(context.Background(), cappedBuffer, copySql) - common.PanicIfError(syncer.Config.BaseConfig, err) +func (syncer *SyncerFullRefresh) copyFromPgTable(postgres *Postgres, pgSchemaTable PgSchemaTable, cappedBuffer *syncerCommon.CappedBuffer) { + copySql := "COPY " + pgSchemaTable.String() + " TO STDOUT WITH CSV HEADER NULL '" + syncerCommon.BEMIDB_NULL_STRING + "'" + result, err := postgres.PostgresClient.Copy(cappedBuffer, copySql) + common.PanicIfError(syncer.Config.CommonConfig, err) - common.LogInfo(syncer.Config.BaseConfig, "Copied", result.RowsAffected(), "rows from", pgSchemaTable.String()) + common.LogInfo(syncer.Config.CommonConfig, "Copied", result.RowsAffected(), "rows from", pgSchemaTable.String()) cappedBuffer.Close() } diff --git a/src/syncer-postgres/syncer_utils.go b/src/syncer-postgres/syncer_utils.go index 48c59ac..0fd0de2 100644 --- a/src/syncer-postgres/syncer_utils.go +++ b/src/syncer-postgres/syncer_utils.go @@ -7,8 +7,9 @@ import ( "io" "strings" - goDuckdb "github.com/marcboeker/go-duckdb/v2" + "github.com/marcboeker/go-duckdb/v2" + "github.com/BemiHQ/BemiDB/src/common" "github.com/BemiHQ/BemiDB/src/syncer-common" ) @@ -45,7 +46,7 @@ func (utils *SyncerUtils) ShouldSyncTable(pgSchemaTable PgSchemaTable) bool { return true } -func (utils *SyncerUtils) CreateTableIfNotExists(trino *common.Trino, pgSchemaTable PgSchemaTable, pgSchemaColumns []PgSchemaColumn) { +func (utils *SyncerUtils) CreateTableIfNotExists(trino *syncerCommon.Trino, pgSchemaTable PgSchemaTable, pgSchemaColumns []PgSchemaColumn) { columnSchemas := []string{} for _, pgSchemaColumn := range pgSchemaColumns { columnSchemas = append(columnSchemas, `"`+pgSchemaColumn.ColumnName+"\" "+pgSchemaColumn.TrinoType()) @@ -54,17 +55,17 @@ func (utils *SyncerUtils) CreateTableIfNotExists(trino *common.Trino, pgSchemaTa trino.CreateTableIfNotExists(pgSchemaTable.IcebergTableName(), "("+strings.Join(columnSchemas, ",")+")") } -func (utils *SyncerUtils) DropOldTables(trino *common.Trino, keepIcebergTableNames common.Set[string]) { +func (utils *SyncerUtils) DropOldTables(trino *syncerCommon.Trino, keepIcebergTableNames common.Set[string]) { ctx := context.Background() trinoTableNames := make([]string, 0) rows, err := trino.QueryContext(ctx, "SHOW TABLES FROM "+trino.Schema()) - common.PanicIfError(utils.Config.BaseConfig, err) + common.PanicIfError(utils.Config.CommonConfig, err) for rows.Next() { var tableName string err := rows.Scan(&tableName) - common.PanicIfError(utils.Config.BaseConfig, err) + common.PanicIfError(utils.Config.CommonConfig, err) trinoTableNames = append(trinoTableNames, tableName) } @@ -73,14 +74,14 @@ func (utils *SyncerUtils) DropOldTables(trino *common.Trino, keepIcebergTableNam continue } - common.LogInfo(utils.Config.BaseConfig, "Dropping old table: "+trinoTableName) + common.LogInfo(utils.Config.CommonConfig, "Dropping old table: "+trinoTableName) _, err = trino.ExecContext(ctx, "DROP TABLE IF EXISTS "+trino.Schema()+`."`+trinoTableName+`"`) - common.PanicIfError(utils.Config.BaseConfig, err) + common.PanicIfError(utils.Config.CommonConfig, err) } } -func (utils *SyncerUtils) DeleteOldTables(storageS3 *common.StorageS3, keepIcebergTableNames common.Set[string]) { - icebergCatalog := common.NewIcebergCatalog(utils.Config.BaseConfig) +func (utils *SyncerUtils) DeleteOldTables(storageS3 *syncerCommon.StorageS3, keepIcebergTableNames common.Set[string]) { + icebergCatalog := syncerCommon.NewIcebergCatalog(utils.Config.CommonConfig, utils.Config.DestinationSchemaName) icebergTableNames := icebergCatalog.TableNames() for _, icebergTableName := range icebergTableNames.Values() { @@ -88,17 +89,17 @@ func (utils *SyncerUtils) DeleteOldTables(storageS3 *common.StorageS3, keepIcebe continue } - common.LogInfo(utils.Config.BaseConfig, "Deleting old Iceberg table: "+icebergTableName) - icebergTable := common.NewIcebergTable(utils.Config.BaseConfig, storageS3, icebergTableName) + common.LogInfo(utils.Config.CommonConfig, "Deleting old Iceberg table: "+icebergTableName) + icebergTable := syncerCommon.NewIcebergTable(utils.Config.CommonConfig, storageS3, utils.Config.DestinationSchemaName, icebergTableName) icebergTable.DeleteIfExists() } } -func (utils *SyncerUtils) InsertFromCappedBuffer(trino *common.Trino, quotedTrinoTablePath string, pgSchemaTable PgSchemaTable, pgSchemaColumns []PgSchemaColumn, cappedBuffer *common.CappedBuffer) { +func (utils *SyncerUtils) InsertFromCappedBuffer(trino *syncerCommon.Trino, quotedTrinoTablePath string, pgSchemaTable PgSchemaTable, pgSchemaColumns []PgSchemaColumn, cappedBuffer *syncerCommon.CappedBuffer) { ctx := context.Background() csvReader := csv.NewReader(cappedBuffer) _, err := csvReader.Read() // Read the header row - common.PanicIfError(utils.Config.BaseConfig, err) + common.PanicIfError(utils.Config.CommonConfig, err) quotedColumnNames := []string{} for _, pgSchemaColumn := range pgSchemaColumns { @@ -116,7 +117,7 @@ func (utils *SyncerUtils) InsertFromCappedBuffer(trino *common.Trino, quotedTrin break } if err != nil { - common.PanicIfError(utils.Config.BaseConfig, err) + common.PanicIfError(utils.Config.CommonConfig, err) } rowValues := []string{} @@ -126,20 +127,20 @@ func (utils *SyncerUtils) InsertFromCappedBuffer(trino *common.Trino, quotedTrin rowValuesStatement := "(" + strings.Join(rowValues, ",") + ")" currentRowCount++ - if len(currentSql)+len(rowValuesStatement)+1 < common.TRINO_MAX_QUERY_LENGTH { // +1 for the comma + if len(currentSql)+len(rowValuesStatement)+1 < syncerCommon.TRINO_MAX_QUERY_LENGTH { // +1 for the comma if currentSql != insertSqlPrefix { currentSql += "," } currentSql += rowValuesStatement } else { _, err := trino.ExecContext(ctx, currentSql) - common.PanicIfError(utils.Config.BaseConfig, err) - common.LogInfo(utils.Config.BaseConfig, "Inserted", currentRowCount, "rows into table:", pgSchemaTable.String()) + common.PanicIfError(utils.Config.CommonConfig, err) + common.LogInfo(utils.Config.CommonConfig, "Inserted", currentRowCount, "rows into table:", pgSchemaTable.String()) currentSql = insertSqlPrefix + rowValuesStatement currentRowCount = 1 batchCount++ if batchCount%COMPACT_AFTER_INSERT_BATCH_COUNT == 0 { - common.LogInfo(utils.Config.BaseConfig, "Compacting table:", pgSchemaTable.String(), "after", batchCount, "insert batches") + common.LogInfo(utils.Config.CommonConfig, "Compacting table:", pgSchemaTable.String(), "after", batchCount, "insert batches") trino.CompactTable(quotedTrinoTablePath) } } @@ -147,17 +148,17 @@ func (utils *SyncerUtils) InsertFromCappedBuffer(trino *common.Trino, quotedTrin if currentSql != insertSqlPrefix { _, err := trino.ExecContext(ctx, currentSql) - common.PanicIfError(utils.Config.BaseConfig, err) - common.LogInfo(utils.Config.BaseConfig, "Inserted", currentRowCount, "rows into table:", pgSchemaTable.String()) + common.PanicIfError(utils.Config.CommonConfig, err) + common.LogInfo(utils.Config.CommonConfig, "Inserted", currentRowCount, "rows into table:", pgSchemaTable.String()) } } -func (utils *SyncerUtils) ReplaceFromCappedBuffer(icebergWriter *common.IcebergWriter, icebergTable *common.IcebergTable, cappedBuffer *common.CappedBuffer) { +func (utils *SyncerUtils) ReplaceFromCappedBuffer(icebergWriter *syncerCommon.IcebergWriter, icebergTable *syncerCommon.IcebergTable, cappedBuffer *syncerCommon.CappedBuffer) { csvReader := csv.NewReader(cappedBuffer) _, err := csvReader.Read() // Read the header row - common.PanicIfError(utils.Config.BaseConfig, err) + common.PanicIfError(utils.Config.CommonConfig, err) - icebergWriter.Write(icebergTable.GeneratedS3TablePath, func(appender *goDuckdb.Appender) (rowCount int, reachedEnd bool) { + icebergWriter.Write(icebergTable.GeneratedS3TablePath, func(appender *duckdb.Appender) (rowCount int, reachedEnd bool) { var loadedSize int for { @@ -167,7 +168,7 @@ func (utils *SyncerUtils) ReplaceFromCappedBuffer(icebergWriter *common.IcebergW break } if err != nil { - common.PanicIfError(utils.Config.BaseConfig, err) + common.PanicIfError(utils.Config.CommonConfig, err) } values := make([]driver.Value, len(icebergWriter.IcebergSchemaColumns)) @@ -175,19 +176,19 @@ func (utils *SyncerUtils) ReplaceFromCappedBuffer(icebergWriter *common.IcebergW values[i] = icebergSchemaColumn.DuckdbValueFromCsv(row[i]) loadedSize += len(row[i]) } - common.LogTrace(utils.Config.BaseConfig, "DuckDB appending values:", values) + common.LogTrace(utils.Config.CommonConfig, "DuckDB appending values:", values) err = appender.AppendRow(values...) - common.PanicIfError(utils.Config.BaseConfig, err) + common.PanicIfError(utils.Config.CommonConfig, err) rowCount++ if loadedSize >= MAX_ICEBERG_WRITER_BATCH_SIZE { - common.LogDebug(utils.Config.BaseConfig, "Reached batch size limit") + common.LogDebug(utils.Config.CommonConfig, "Reached batch size limit") break } } - common.LogInfo(utils.Config.BaseConfig, "Loaded", rowCount, "rows") + common.LogInfo(utils.Config.CommonConfig, "Loaded", rowCount, "rows") return rowCount, reachedEnd }) } From ab111b273f52b597f6352c214db1e62049667350 Mon Sep 17 00:00:00 2001 From: exAspArk Date: Sat, 16 Aug 2025 12:47:13 -0400 Subject: [PATCH 06/24] Release v1.0.0 --- Dockerfile | 43 +- Dockerfile.test | 43 +- Makefile | 6 +- README.md | 4 +- docker/bin-test/test.sh | 14 +- docker/bin/run.sh | 25 +- docker/bin/trino_configure_and_start.sh | 38 -- docker/bin/trino_ensure_started.sh | 10 - docker/trino/bin/health-check.sh | 32 - docker/trino/bin/run.sh | 10 - docker/trino/etc/catalog/iceberg.properties | 18 - docker/trino/etc/config.properties | 6 - docker/trino/etc/jvm.config | 16 - docker/trino/etc/log.properties | 2 - docker/trino/etc/node.properties | 2 - scripts/build-docker.sh | 2 +- .../configure.sql => scripts/catalog.sql | 8 - scripts/publish-docker.sh | 2 +- src/common/common_config.go | 2 +- src/common/duckdb_client.go | 9 +- src/common/s3_client.go | 6 +- src/server/config.go | 2 - src/server/go.mod | 1 + src/server/iceberg_catalog.go | 4 +- src/server/iceberg_reader.go | 6 +- src/server/main.go | 2 + src/server/parser_a_expr.go | 37 +- src/server/parser_function.go | 38 +- src/server/pg_constants.go | 5 +- src/server/query_handler_test.go | 26 +- src/server/query_remapper.go | 4 + src/server/query_remapper_expression.go | 6 + src/server/query_remapper_function.go | 13 +- src/server/query_remapper_table.go | 2 +- src/syncer-amplitude/amplitude.go | 38 +- src/syncer-amplitude/config.go | 23 +- src/syncer-amplitude/event.go | 404 ++++--------- src/syncer-amplitude/go.mod | 27 +- src/syncer-amplitude/go.sum | 117 +--- src/syncer-amplitude/syncer.go | 156 ++--- src/syncer-common/go.mod | 25 +- src/syncer-common/go.sum | 113 +--- src/syncer-common/iceberg_catalog.go | 45 +- src/syncer-common/iceberg_schema_column.go | 267 +++++++-- src/syncer-common/iceberg_table.go | 74 ++- src/syncer-common/iceberg_writer.go | 567 +++++++++++++++++- src/syncer-common/json_queue.go | 80 +++ src/syncer-common/json_queue_test.go | 38 ++ src/syncer-common/storage_s3.go | 178 +++--- src/syncer-common/storage_utils.go | 108 ++-- src/syncer-common/trino.go | 99 --- src/syncer-common/utils.go | 5 + src/syncer-postgres/config.go | 71 ++- src/syncer-postgres/go.mod | 27 +- src/syncer-postgres/go.sum | 113 +--- src/syncer-postgres/init_test.go | 160 +++-- src/syncer-postgres/pg_schema_column.go | 382 ++---------- src/syncer-postgres/pg_schema_table.go | 7 +- src/syncer-postgres/postgres.go | 82 ++- src/syncer-postgres/syncer.go | 26 +- src/syncer-postgres/syncer_full_refresh.go | 46 +- src/syncer-postgres/syncer_utils.go | 157 +---- 62 files changed, 1879 insertions(+), 2000 deletions(-) delete mode 100755 docker/bin/trino_configure_and_start.sh delete mode 100755 docker/bin/trino_ensure_started.sh delete mode 100755 docker/trino/bin/health-check.sh delete mode 100755 docker/trino/bin/run.sh delete mode 100644 docker/trino/etc/catalog/iceberg.properties delete mode 100644 docker/trino/etc/config.properties delete mode 100644 docker/trino/etc/jvm.config delete mode 100644 docker/trino/etc/log.properties delete mode 100644 docker/trino/etc/node.properties rename docker/trino/configure.sql => scripts/catalog.sql (54%) create mode 100644 src/syncer-common/json_queue.go create mode 100644 src/syncer-common/json_queue_test.go delete mode 100644 src/syncer-common/trino.go diff --git a/Dockerfile b/Dockerfile index 6821965..3e857c7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,45 +13,7 @@ RUN adduser --disabled-login app WORKDIR /app -# Install Java and Trino - -ENV JAVA_HOME /opt/jdk-24 -ENV PATH $JAVA_HOME/bin:$PATH - -RUN \ - ARCH=$(dpkg --print-architecture) && case "$ARCH" in \ - "amd64") \ - JDK_URL="https://download.oracle.com/java/24/archive/jdk-24.0.1_linux-x64_bin.tar.gz"; \ - ;; \ - "arm64") \ - JDK_URL="https://download.oracle.com/java/24/archive/jdk-24.0.1_linux-aarch64_bin.tar.gz"; \ - ;; \ - *) \ - echo "Unsupported architecture: $ARCH"; \ - exit 1; \ - ;; \ - esac \ - && curl -L "$JDK_URL" -o jdk.tar.gz \ - && tar -xzf jdk.tar.gz \ - && rm jdk.tar.gz \ - && mkdir -p /opt \ - && mv jdk-24.0.1 /opt/jdk-24 \ - \ - && curl -L https://repo1.maven.org/maven2/io/trino/trino-server/476/trino-server-476.tar.gz -o trino-server-476.tar.gz \ - && tar -xzf trino-server-476.tar.gz \ - && rm trino-server-476.tar.gz \ - && mv trino-server-476 /app/trino \ - && mkdir -p /data/trino \ - && chown -R "app:app" /app/trino /data/trino - -# Set up Trino - -HEALTHCHECK --interval=10s --timeout=5s --start-period=10s \ - CMD /app/trino/bin/health-check.sh - -COPY --chown=app:app docker/trino/etc /etc/trino -COPY --chown=app:app docker/trino/bin /app/trino/bin -COPY --chown=app:app docker/trino/configure.sql /app/trino/ +COPY --chown=app:app scripts/catalog.sql /app/scripts/ # Set up syncers and server ######################################################################## @@ -73,8 +35,8 @@ RUN \ # Compile syncers and server +COPY --chown=app:app src/common/go.mod src/common/go.sum /app/src/common/ COPY --chown=app:app src/syncer-common/go.mod src/syncer-common/go.sum /app/src/syncer-common/ -RUN cd /app/src/syncer-common && go mod download COPY --chown=app:app src/syncer-postgres/go.mod src/syncer-postgres/go.sum /app/src/syncer-postgres/ RUN cd /app/src/syncer-postgres && go mod download @@ -85,6 +47,7 @@ RUN cd /app/src/syncer-amplitude && go mod download COPY --chown=app:app src/server/go.mod src/server/go.sum /app/src/server/ RUN cd /app/src/server && go mod download +COPY --chown=app:app src/common /app/src/common COPY --chown=app:app src/syncer-common /app/src/syncer-common COPY --chown=app:app src/syncer-postgres /app/src/syncer-postgres COPY --chown=app:app src/syncer-amplitude /app/src/syncer-amplitude diff --git a/Dockerfile.test b/Dockerfile.test index f74c712..f59c823 100644 --- a/Dockerfile.test +++ b/Dockerfile.test @@ -13,45 +13,7 @@ RUN adduser --disabled-login app WORKDIR /app -# Install Java and Trino - -ENV JAVA_HOME /opt/jdk-24 -ENV PATH $JAVA_HOME/bin:$PATH - -RUN \ - ARCH=$(dpkg --print-architecture) && case "$ARCH" in \ - "amd64") \ - JDK_URL="https://download.oracle.com/java/24/archive/jdk-24.0.1_linux-x64_bin.tar.gz"; \ - ;; \ - "arm64") \ - JDK_URL="https://download.oracle.com/java/24/archive/jdk-24.0.1_linux-aarch64_bin.tar.gz"; \ - ;; \ - *) \ - echo "Unsupported architecture: $ARCH"; \ - exit 1; \ - ;; \ - esac \ - && curl -L "$JDK_URL" -o jdk.tar.gz \ - && tar -xzf jdk.tar.gz \ - && rm jdk.tar.gz \ - && mkdir -p /opt \ - && mv jdk-24.0.1 /opt/jdk-24 \ - \ - && curl -L https://repo1.maven.org/maven2/io/trino/trino-server/476/trino-server-476.tar.gz -o trino-server-476.tar.gz \ - && tar -xzf trino-server-476.tar.gz \ - && rm trino-server-476.tar.gz \ - && mv trino-server-476 /app/trino \ - && mkdir -p /data/trino \ - && chown -R "app:app" /app/trino /data/trino - -# Set up Trino - -HEALTHCHECK --interval=10s --timeout=5s --start-period=10s \ - CMD /app/trino/bin/health-check.sh - -COPY --chown=app:app docker/trino/etc /etc/trino -COPY --chown=app:app docker/trino/bin /app/trino/bin -COPY --chown=app:app docker/trino/configure.sql /app/trino/ +COPY --chown=app:app scripts/catalog.sql /app/scripts/ # Set up syncers and server ######################################################################## @@ -93,8 +55,8 @@ RUN \ # Prepare syncers and server +COPY --chown=app:app src/common/go.mod src/common/go.sum /app/src/common/ COPY --chown=app:app src/syncer-common/go.mod src/syncer-common/go.sum /app/src/syncer-common/ -RUN cd /app/src/syncer-common && go mod download COPY --chown=app:app src/syncer-postgres/go.mod src/syncer-postgres/go.sum /app/src/syncer-postgres/ RUN cd /app/src/syncer-postgres && go mod download @@ -102,6 +64,7 @@ RUN cd /app/src/syncer-postgres && go mod download COPY --chown=app:app src/server/go.mod src/server/go.sum /app/src/server/ RUN cd /app/src/server && go mod download +COPY --chown=app:app src/common /app/src/common COPY --chown=app:app src/syncer-common /app/src/syncer-common COPY --chown=app:app src/syncer-postgres /app/src/syncer-postgres COPY --chown=app:app src/server /app/src/server diff --git a/Makefile b/Makefile index 7d1a4bb..3dd8993 100644 --- a/Makefile +++ b/Makefile @@ -2,13 +2,15 @@ sh: devbox --env-file .env shell install: - devbox run "cd src/syncer-common && go mod tidy && \ + devbox run "cd src/common && go mod tidy && \ + cd ../syncer-common && go mod tidy && \ cd ../syncer-postgres && go mod tidy && \ cd ../syncer-amplitude && go mod tidy && \ cd ../server && go mod tidy" lint: - devbox run "cd src/syncer-common && go fmt && staticcheck . && \ + devbox run "cd src/common && go fmt && staticcheck . && \ + cd ../syncer-common && go fmt && staticcheck . && \ cd ../syncer-postgres && go fmt && deadcode . && staticcheck . && \ cd ../syncer-amplitude && go fmt && deadcode . && staticcheck . && \ cd ../server && go fmt && deadcode . && staticcheck ." diff --git a/README.md b/README.md index 494ba41..9820012 100644 --- a/README.md +++ b/README.md @@ -322,11 +322,11 @@ SELECT * FROM [TABLE] WHERE [JSON_COLUMN]->>'[JSON_KEY]' = '[JSON_VALUE]'; - [ ] SQLite ([#24](https://github.com/BemiHQ/BemiDB/issues/24)) - [x] Iceberg tables compaction - [x] Packaging in a Docker image -- [ ] Table compaction without Trino as a dependency (WIP) -- [ ] Real-time CDC data syncing (private beta) +- [x] Table compaction without Trino as a dependency - [ ] Partitioned tables ([#15](https://github.com/BemiHQ/BemiDB/issues/15)) - [ ] Transformations with dbt ([#25](https://github.com/BemiHQ/BemiDB/issues/25)) +Are you looking for real-time data syncing? Check out [BemiDB Cloud](https://bemidb.com), our managed data platform. ## License diff --git a/docker/bin-test/test.sh b/docker/bin-test/test.sh index 20bd8cb..935e6e7 100755 --- a/docker/bin-test/test.sh +++ b/docker/bin-test/test.sh @@ -14,20 +14,16 @@ export AWS_S3_BUCKET=bemidb-bucket postgres_pid=$! /app/bin/postgres_configure.sh -/app/bin/trino_configure_and_start.sh & -trino_pid=$! +psql $CATALOG_DATABASE_URL -f /app/scripts/catalog.sql + /app/bin/minio_start.sh & minio_pid=$! -trap 'kill -s TERM $postgres_pid $trino_pid $minio_pid 2>/dev/null' EXIT # kill children on exit - -/app/bin/trino_ensure_started.sh +trap 'kill -s TERM $postgres_pid $minio_pid 2>/dev/null' EXIT # kill children on exit /app/bin/minio_configure.sh # Seed data cd /app/src/syncer-postgres -TRINO_DATABASE_URL=http://user@localhost:8080 \ - TRINO_CATALOG_NAME=iceberg \ - SOURCE_POSTGRES_SYNC_MODE=FULL_REFRESH \ +SOURCE_POSTGRES_SYNC_MODE=FULL_REFRESH \ DESTINATION_SCHEMA_NAME=postgres \ go test -v ./... @@ -40,4 +36,4 @@ BEMIDB_USER=user \ BEMIDB_LOG_LEVEL=ERROR \ go test -v -count=1 ./... -kill -s TERM $postgres_pid $trino_pid $minio_pid 2>/dev/null +kill -s TERM $postgres_pid $minio_pid 2>/dev/null diff --git a/docker/bin/run.sh b/docker/bin/run.sh index 10b8713..bc52840 100755 --- a/docker/bin/run.sh +++ b/docker/bin/run.sh @@ -10,39 +10,22 @@ case "${1:-}" in : "${SOURCE_POSTGRES_DATABASE_URL:?Environment variable SOURCE_POSTGRES_DATABASE_URL must be set}" : "${DESTINATION_SCHEMA_NAME:?Environment variable DESTINATION_SCHEMA_NAME must be set}" - /app/bin/trino_configure_and_start.sh & - trino_pid=$! - trap 'kill -s TERM $trino_pid 2>/dev/null' EXIT # kill children on exit - - /app/bin/trino_ensure_started.sh + psql $CATALOG_DATABASE_URL -f /app/scripts/catalog.sql echo "Starting Syncer for PostgreSQL..." - TRINO_DATABASE_URL=http://user@localhost:8080 \ - TRINO_CATALOG_NAME=iceberg \ - SOURCE_POSTGRES_SYNC_MODE=FULL_REFRESH \ - ./bin/syncer-postgres 2>&1 | sed 's/^/[Syncer] /' + SOURCE_POSTGRES_SYNC_MODE=FULL_REFRESH ./bin/syncer-postgres 2>&1 | sed 's/^/[Syncer] /' echo "Syncer for PostgreSQL finished." - - kill -s TERM $trino_pid 2>/dev/null ;; syncer-amplitude) : "${SOURCE_AMPLITUDE_API_KEY:?Environment variable SOURCE_AMPLITUDE_API_KEY must be set}" : "${SOURCE_AMPLITUDE_SECRET_KEY:?Environment variable SOURCE_AMPLITUDE_SECRET_KEY must be set}" : "${DESTINATION_SCHEMA_NAME:?Environment variable DESTINATION_SCHEMA_NAME must be set}" - /app/bin/trino_configure_and_start.sh & - trino_pid=$! - trap 'kill -s TERM $trino_pid 2>/dev/null' EXIT # kill children on exit - - /app/bin/trino_ensure_started.sh + psql $CATALOG_DATABASE_URL -f /app/scripts/catalog.sql echo "Starting Syncer for Amplitude..." - TRINO_DATABASE_URL=http://user@localhost:8080 \ - TRINO_CATALOG_NAME=iceberg \ - ./bin/syncer-amplitude 2>&1 | sed 's/^/[Syncer] /' + ./bin/syncer-amplitude 2>&1 | sed 's/^/[Syncer] /' echo "Syncer for Amplitude finished." - - kill -s TERM $trino_pid 2>/dev/null ;; server) : "${AWS_REGION:?Environment variable AWS_REGION must be set}" diff --git a/docker/bin/trino_configure_and_start.sh b/docker/bin/trino_configure_and_start.sh deleted file mode 100755 index 4fd2fe4..0000000 --- a/docker/bin/trino_configure_and_start.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/bash - -set -euo pipefail - -: "${AWS_REGION:?Environment variable AWS_REGION must be set}" -: "${AWS_S3_BUCKET:?Environment variable AWS_S3_BUCKET must be set}" -: "${AWS_ACCESS_KEY_ID:?Environment variable AWS_ACCESS_KEY_ID must be set}" -: "${AWS_SECRET_ACCESS_KEY:?Environment variable AWS_SECRET_ACCESS_KEY must be set}" -: "${CATALOG_DATABASE_URL:?Environment variable CATALOG_DATABASE_URL must be set}" - -echo "[Trino] Configuring catalog..." - -psql $CATALOG_DATABASE_URL -f /app/trino/configure.sql - -if [[ -z "${AWS_S3_ENDPOINT:-}" || "${AWS_S3_ENDPOINT:-}" == "s3.amazonaws.com" ]]; then - AWS_S3_ENDPOINT="https://s3-${AWS_REGION}.amazonaws.com" -else - if [[ "${AWS_S3_ENDPOINT}" == localhost* ]]; then - AWS_S3_ENDPOINT="http://${AWS_S3_ENDPOINT}" - else - AWS_S3_ENDPOINT="https://${AWS_S3_ENDPOINT}" - fi -fi - -sed -i \ - -e "s#{{AWS_S3_BUCKET}}#${AWS_S3_BUCKET}#g" \ - -e "s#{{AWS_REGION}}#${AWS_REGION}#g" \ - -e "s#{{AWS_ACCESS_KEY_ID}}#${AWS_ACCESS_KEY_ID}#g" \ - -e "s#{{AWS_SECRET_ACCESS_KEY}}#${AWS_SECRET_ACCESS_KEY}#g" \ - -e "s#{{AWS_S3_ENDPOINT}}#${AWS_S3_ENDPOINT}#g" \ - -e "s#{{CATALOG_DATABASE_URL}}#postgresql://$(echo $CATALOG_DATABASE_URL | cut -d'@' -f2)#g" \ - -e "s#{{TRINO_CATALOG_DATABASE_USER}}#$(echo $CATALOG_DATABASE_URL | cut -d'/' -f3 | cut -d':' -f1)#g" \ - -e "s#{{TRINO_CATALOG_DATABASE_PASSWORD}}#$(echo $CATALOG_DATABASE_URL | cut -d'/' -f3 | cut -d':' -f2 | cut -d'@' -f1)#g" \ - /etc/trino/catalog/iceberg.properties - -echo "[Trino] Starting server..." -CATALOG_MANAGEMENT=static \ - ./trino/bin/run.sh >/dev/null 2> >(sed 's/^/[Trino] /') diff --git a/docker/bin/trino_ensure_started.sh b/docker/bin/trino_ensure_started.sh deleted file mode 100755 index 01dfd99..0000000 --- a/docker/bin/trino_ensure_started.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -set -euo pipefail - -export TRINO_DATABASE_URL="http://user@localhost:8080" -while ! curl -sf "${TRINO_DATABASE_URL}/v1/info" > /dev/null; do - echo "[Trino] Waiting for server to be ready..." - sleep 15 -done -echo "[Trino] Server is ready." diff --git a/docker/trino/bin/health-check.sh b/docker/trino/bin/health-check.sh deleted file mode 100755 index 0f4d50b..0000000 --- a/docker/trino/bin/health-check.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/bash - -set -euo pipefail - -function get_property() { - grep "^$1=" "$2" | cut -d'=' -f2 -} - -scheme=http -port=8080 - -config=/etc/trino/config.properties -# prefer to use http even if https is enabled -if [ "$(get_property 'http-server.http.enabled' "$config")" == "false" ]; then - scheme=https - port=$(get_property http-server.https.port "$config") -else - port=$(get_property http-server.http.port "$config") -fi - -endpoint="$scheme://localhost:$port/v1/info" - -# add --insecure to disable certificate verification in curl, in case a self-signed certificate is being used -if ! info=$(curl --fail --silent --show-error --insecure "$endpoint"); then - echo >&2 "Server is not responding to requests" - exit 1 -fi - -if ! grep -q '"starting":\s*false' <<<"$info" >/dev/null; then - echo >&2 "Server is starting" - exit 1 -fi diff --git a/docker/trino/bin/run.sh b/docker/trino/bin/run.sh deleted file mode 100755 index a72b602..0000000 --- a/docker/trino/bin/run.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -set -xeuo pipefail - -launcher_opts=(--etc-dir /etc/trino) -if ! grep -s -q 'node.id' /etc/trino/node.properties; then - launcher_opts+=("-Dnode.id=${HOSTNAME}") -fi - -exec /app/trino/bin/launcher run "${launcher_opts[@]}" "$@" diff --git a/docker/trino/etc/catalog/iceberg.properties b/docker/trino/etc/catalog/iceberg.properties deleted file mode 100644 index 781507c..0000000 --- a/docker/trino/etc/catalog/iceberg.properties +++ /dev/null @@ -1,18 +0,0 @@ -connector.name=iceberg -iceberg.expire-snapshots.min-retention=0m -iceberg.remove-orphan-files.min-retention=0m - -iceberg.catalog.type=jdbc -iceberg.jdbc-catalog.catalog-name=postgres -iceberg.jdbc-catalog.driver-class=org.postgresql.Driver -iceberg.jdbc-catalog.connection-url=jdbc:{{CATALOG_DATABASE_URL}} -iceberg.jdbc-catalog.connection-user={{TRINO_CATALOG_DATABASE_USER}} -iceberg.jdbc-catalog.connection-password={{TRINO_CATALOG_DATABASE_PASSWORD}} -iceberg.jdbc-catalog.default-warehouse-dir=s3://{{AWS_S3_BUCKET}}/iceberg - -fs.native-s3.enabled=true -s3.path-style-access=true -s3.region={{AWS_REGION}} -s3.endpoint={{AWS_S3_ENDPOINT}} -s3.aws-access-key={{AWS_ACCESS_KEY_ID}} -s3.aws-secret-key={{AWS_SECRET_ACCESS_KEY}} diff --git a/docker/trino/etc/config.properties b/docker/trino/etc/config.properties deleted file mode 100644 index be82f44..0000000 --- a/docker/trino/etc/config.properties +++ /dev/null @@ -1,6 +0,0 @@ -#single node install config -coordinator=true -node-scheduler.include-coordinator=true -http-server.http.port=8080 -discovery.uri=http://localhost:8080 -catalog.management=${ENV:CATALOG_MANAGEMENT} \ No newline at end of file diff --git a/docker/trino/etc/jvm.config b/docker/trino/etc/jvm.config deleted file mode 100644 index b1b5206..0000000 --- a/docker/trino/etc/jvm.config +++ /dev/null @@ -1,16 +0,0 @@ --server --XX:InitialRAMPercentage=80 --XX:MaxRAMPercentage=80 --XX:G1HeapRegionSize=32M --XX:+ExplicitGCInvokesConcurrent --XX:+HeapDumpOnOutOfMemoryError --XX:+ExitOnOutOfMemoryError --XX:-OmitStackTraceInFastThrow --XX:ReservedCodeCacheSize=256M --XX:PerMethodRecompilationCutoff=10000 --XX:PerBytecodeRecompilationCutoff=10000 --Djdk.attach.allowAttachSelf=true --Djdk.nio.maxCachedBufferSize=2000000 --Dfile.encoding=UTF-8 -# Allow loading dynamic agent used by JOL --XX:+EnableDynamicAgentLoading diff --git a/docker/trino/etc/log.properties b/docker/trino/etc/log.properties deleted file mode 100644 index abee45e..0000000 --- a/docker/trino/etc/log.properties +++ /dev/null @@ -1,2 +0,0 @@ -# Enable verbose logging from Trino -#io.trino=DEBUG diff --git a/docker/trino/etc/node.properties b/docker/trino/etc/node.properties deleted file mode 100644 index 25889e2..0000000 --- a/docker/trino/etc/node.properties +++ /dev/null @@ -1,2 +0,0 @@ -node.environment=production -node.data-dir=/data/trino diff --git a/scripts/build-docker.sh b/scripts/build-docker.sh index 34217b7..8ce72cf 100755 --- a/scripts/build-docker.sh +++ b/scripts/build-docker.sh @@ -1,6 +1,6 @@ #!/bin/bash -VERSION=$(grep -E 'VERSION = "[^"]+"' src/server/config.go | sed -E 's/.*VERSION = "([^"]+)".*/\1/') +VERSION=$(grep -E 'VERSION = "[^"]+"' src/common/common_config.go | sed -E 's/.*VERSION = "([^"]+)".*/\1/') if [ -z "$VERSION" ]; then echo "Error: Could not extract version" exit 1 diff --git a/docker/trino/configure.sql b/scripts/catalog.sql similarity index 54% rename from docker/trino/configure.sql rename to scripts/catalog.sql index e2a098d..ca8c6c9 100644 --- a/docker/trino/configure.sql +++ b/scripts/catalog.sql @@ -6,11 +6,3 @@ CREATE TABLE IF NOT EXISTS iceberg_tables ( previous_metadata_location VARCHAR(1000), PRIMARY KEY (catalog_name, table_namespace, table_name) ); - -CREATE TABLE IF NOT EXISTS iceberg_namespace_properties ( - catalog_name VARCHAR(255) NOT NULL, - namespace VARCHAR(255) NOT NULL, - property_key VARCHAR(255), - property_value VARCHAR(1000), - PRIMARY KEY (catalog_name, namespace, property_key) -); diff --git a/scripts/publish-docker.sh b/scripts/publish-docker.sh index 684d431..ecad21f 100755 --- a/scripts/publish-docker.sh +++ b/scripts/publish-docker.sh @@ -1,6 +1,6 @@ #!/bin/bash -VERSION=$(grep -E 'VERSION = "[^"]+"' src/server/config.go | sed -E 's/.*VERSION = "([^"]+)".*/\1/') +VERSION=$(grep -E 'VERSION = "[^"]+"' src/common/common_config.go | sed -E 's/.*VERSION = "([^"]+)".*/\1/') if [ -z "$VERSION" ]; then echo "Error: Could not extract version" exit 1 diff --git a/src/common/common_config.go b/src/common/common_config.go index da82a9e..6993b9c 100644 --- a/src/common/common_config.go +++ b/src/common/common_config.go @@ -1,7 +1,7 @@ package common const ( - VERSION = "1.0.0-beta.2" + VERSION = "1.0.0" ENV_LOG_LEVEL = "BEMIDB_LOG_LEVEL" ENV_DISABLE_ANONYMOUS_ANALYTICS = "BEMIDB_DISABLE_ANONYMOUS_ANALYTICS" diff --git a/src/common/duckdb_client.go b/src/common/duckdb_client.go index c3f70f1..78b1dbf 100644 --- a/src/common/duckdb_client.go +++ b/src/common/duckdb_client.go @@ -29,7 +29,6 @@ func NewDuckdbClient(config *CommonConfig, bootQueries ...[]string) *DuckdbClien queries := []string{ "SET timezone='UTC'", - "SET memory_limit='2GB'", } if bootQueries != nil { queries = append(queries, bootQueries[0]...) @@ -67,6 +66,14 @@ func (client *DuckdbClient) QueryContext(ctx context.Context, query string) (*sq return client.Db.QueryContext(ctx, query) } +func (client *DuckdbClient) QueryRowContext(ctx context.Context, query string, args ...map[string]string) *sql.Row { + LogDebug(client.Config, "Querying DuckDBClient:", query) + if len(args) == 0 { + return client.Db.QueryRowContext(ctx, query) + } + return client.Db.QueryRowContext(ctx, replaceNamedStringArgs(query, args[0])) +} + func (client *DuckdbClient) PrepareContext(ctx context.Context, query string) (*sql.Stmt, error) { LogDebug(client.Config, "Preparing DuckDBClient statement:", query) return client.Db.PrepareContext(ctx, query) diff --git a/src/common/s3_client.go b/src/common/s3_client.go index dcc79b0..524f003 100644 --- a/src/common/s3_client.go +++ b/src/common/s3_client.go @@ -55,9 +55,13 @@ func NewS3Client(Config *CommonConfig) *S3Client { } } +func (s3Client *S3Client) BucketS3Prefix() string { + return "s3://" + s3Client.Config.Aws.S3Bucket + "/" +} + // s3://bucket/some/path -> some/path func (s3Client *S3Client) ObjectKey(objectPath string) string { - return strings.TrimPrefix(objectPath, "s3://"+s3Client.Config.Aws.S3Bucket+"/") + return strings.TrimPrefix(objectPath, s3Client.BucketS3Prefix()) } func (s3Client *S3Client) HeadObject(fileKey string) *s3.HeadObjectOutput { diff --git a/src/server/config.go b/src/server/config.go index 51759b1..86d5f25 100644 --- a/src/server/config.go +++ b/src/server/config.go @@ -10,8 +10,6 @@ import ( ) const ( - VERSION = "1.0.0-beta.2" - ENV_PORT = "BEMIDB_PORT" ENV_DATABASE = "BEMIDB_DATABASE" ENV_USER = "BEMIDB_USER" diff --git a/src/server/go.mod b/src/server/go.mod index 06c0c20..67159e3 100644 --- a/src/server/go.mod +++ b/src/server/go.mod @@ -8,6 +8,7 @@ require ( github.com/jackc/pgx/v5 v5.7.5 github.com/marcboeker/go-duckdb/v2 v2.3.2 github.com/pganalyze/pg_query_go/v6 v6.1.0 + golang.org/x/crypto v0.37.0 ) replace github.com/BemiHQ/BemiDB/src/common => ../common diff --git a/src/server/iceberg_catalog.go b/src/server/iceberg_catalog.go index 0e15b8b..310a8bf 100644 --- a/src/server/iceberg_catalog.go +++ b/src/server/iceberg_catalog.go @@ -34,7 +34,7 @@ func (catalog *IcebergCatalog) Schemas() ([]string, error) { defer pgClient.Close() ctx := context.Background() - rows, err := pgClient.Query(ctx, "SELECT namespace FROM iceberg_namespace_properties") + rows, err := pgClient.Query(ctx, "SELECT table_namespace FROM iceberg_tables WHERE table_name NOT LIKE '%"+TEMP_TABLE_SUFFIX_SYNCING+"' AND table_name NOT LIKE '%"+TEMP_TABLE_SUFFIX_DELETING+"' GROUP BY table_namespace") if err != nil { return nil, err } @@ -75,7 +75,7 @@ func (catalog *IcebergCatalog) SchemaTables() (common.Set[IcebergSchemaTable], e return schemaTables, nil } -func (catalog *IcebergCatalog) MetadataFilePath(t IcebergSchemaTable) string { +func (catalog *IcebergCatalog) MetadataFileS3Path(t IcebergSchemaTable) string { pgClient := catalog.newPostgresClient() defer pgClient.Close() diff --git a/src/server/iceberg_reader.go b/src/server/iceberg_reader.go index 5ef880b..e838137 100644 --- a/src/server/iceberg_reader.go +++ b/src/server/iceberg_reader.go @@ -27,11 +27,11 @@ func (reader *IcebergReader) SchemaTables() (icebergSchemaTables common.Set[Iceb } func (reader *IcebergReader) TableFields(icebergSchemaTable IcebergSchemaTable) (icebergTableFields []IcebergTableField, err error) { - metadataPath := reader.MetadataFilePath(icebergSchemaTable) + metadataPath := reader.MetadataFileS3Path(icebergSchemaTable) common.LogDebug(reader.Config.CommonConfig, "Reading Iceberg table "+icebergSchemaTable.String()+" fields from "+metadataPath+" ...") return reader.Storage.IcebergTableFields(metadataPath) } -func (reader *IcebergReader) MetadataFilePath(icebergSchemaTable IcebergSchemaTable) string { - return reader.Catalog.MetadataFilePath(icebergSchemaTable) +func (reader *IcebergReader) MetadataFileS3Path(icebergSchemaTable IcebergSchemaTable) string { + return reader.Catalog.MetadataFileS3Path(icebergSchemaTable) } diff --git a/src/server/main.go b/src/server/main.go index 13fafba..5d181ce 100644 --- a/src/server/main.go +++ b/src/server/main.go @@ -61,6 +61,8 @@ func duckdbBootQueris(config *Config) []string { "CREATE SCHEMA public", // Configure DuckDB + "SET memory_limit='3GB'", + "SET threads=2", "SET scalar_subquery_error_on_multiple_rows=false", }, diff --git a/src/server/parser_a_expr.go b/src/server/parser_a_expr.go index 0ff48f6..1fdf5c9 100644 --- a/src/server/parser_a_expr.go +++ b/src/server/parser_a_expr.go @@ -22,6 +22,42 @@ func (parser *ParserAExpr) AExpr(node *pgQuery.Node) *pgQuery.A_Expr { return node.GetAExpr() } +// [column]->>'value' -> json_extract_string([column], 'value') +// +// DuckDB bug with wrong precedence of ->> operator: it has lower precedence than AND, so make it a function call explicitly: +// SELECT * FROM postgres.test_table WHERE id = 1 (( AND json_column ))->>'key' IN ('value'); +// ^ Could not convert string '...' to BOOL when casting from source column json_column +func (parser *ParserAExpr) RemappedJsonExtractString(node *pgQuery.Node) *pgQuery.Node { + aExpr := parser.AExpr(node) + if aExpr == nil || aExpr.Kind != pgQuery.A_Expr_Kind_AEXPR_OP || len(aExpr.Name) != 1 || aExpr.Name[0].GetString_().Sval != "->>" { + return node + } + + return pgQuery.MakeFuncCallNode( + []*pgQuery.Node{pgQuery.MakeStrNode("json_extract_string")}, + []*pgQuery.Node{aExpr.Lexpr, aExpr.Rexpr}, + 0, + ) +} + +// [column]->'value' -> json_extract([column], 'value') +// +// DuckDB bug with wrong precedence of -> operator: it has lower precedence than IS NOT NULL, so make it a function call explicitly: +// SELECT string_agg(jsonb_column->'key') FILTER (WHERE jsonb_column-> (( 'key' IS NOT NULL )) ) FROM postgres.test_table; +// ^ Binder Error: No function matches the given name and argument types 'json_extract(VARCHAR, BOOLEAN)' +func (parser *ParserAExpr) RemappedJsonExtract(node *pgQuery.Node) *pgQuery.Node { + aExpr := parser.AExpr(node) + if aExpr == nil || aExpr.Kind != pgQuery.A_Expr_Kind_AEXPR_OP || len(aExpr.Name) != 1 || aExpr.Name[0].GetString_().Sval != "->" { + return node + } + + return pgQuery.MakeFuncCallNode( + []*pgQuery.Node{pgQuery.MakeStrNode("json_extract")}, + []*pgQuery.Node{aExpr.Lexpr, aExpr.Rexpr}, + 0, + ) +} + // = ANY({schema_information}) -> IN (schema_information) func (parser *ParserAExpr) ConvertedRightAnyToIn(node *pgQuery.Node) *pgQuery.Node { aExpr := parser.AExpr(node) @@ -50,7 +86,6 @@ func (parser *ParserAExpr) ConvertedRightAnyToIn(node *pgQuery.Node) *pgQuery.No Sval: value, }, }, - Location: 0, }, }, } diff --git a/src/server/parser_function.go b/src/server/parser_function.go index 99dce95..d9ea9d3 100644 --- a/src/server/parser_function.go +++ b/src/server/parser_function.go @@ -53,19 +53,50 @@ func (parser *ParserFunction) SchemaFunction(functionCall *pgQuery.FuncCall) *Qu } // pg_catalog.func() -> main.func() -func (parser *ParserFunction) RemapSchemaToMain(functionCall *pgQuery.FuncCall) *pgQuery.FuncCall { +func (parser *ParserFunction) RemapSchemaToMain(functionCall *pgQuery.FuncCall) { switch len(functionCall.Funcname) { case 1: functionCall.Funcname = append([]*pgQuery.Node{pgQuery.MakeStrNode(DUCKDB_SCHEMA_MAIN)}, functionCall.Funcname...) case 2: functionCall.Funcname[0] = pgQuery.MakeStrNode(DUCKDB_SCHEMA_MAIN) } +} - return functionCall +// jsonb_agg(...) -> to_json(array_agg(...)) +// +// DuckDB does not support jsonb_agg. We can't remap and fully support all features with just a macro: +// Function "jsonb_agg" is a Macro Function. "DISTINCT", "FILTER", and "ORDER BY" are only applicable to aggregate functions. +func (parser *ParserFunction) RemapJsonbAgg(functionCall *pgQuery.FuncCall) { + originalArgs := functionCall.Args + originalAggOrder := functionCall.AggOrder + originalAggFilter := functionCall.AggFilter + originalAggWithinGroup := functionCall.AggWithinGroup + originalAggStar := functionCall.AggStar + originalAggDistinct := functionCall.AggDistinct + + nestedFunctionCallNode := pgQuery.MakeFuncCallNode( + []*pgQuery.Node{pgQuery.MakeStrNode("array_agg")}, + originalArgs, + 0, + ) + nestedFunctionCall := nestedFunctionCallNode.GetFuncCall() + nestedFunctionCall.AggOrder = originalAggOrder + nestedFunctionCall.AggFilter = originalAggFilter + nestedFunctionCall.AggWithinGroup = originalAggWithinGroup + nestedFunctionCall.AggStar = originalAggStar + nestedFunctionCall.AggDistinct = originalAggDistinct + + functionCall.Funcname = []*pgQuery.Node{pgQuery.MakeStrNode("to_json")} + functionCall.Args = []*pgQuery.Node{nestedFunctionCallNode} + functionCall.AggOrder = nil + functionCall.AggFilter = nil + functionCall.AggWithinGroup = false + functionCall.AggStar = false + functionCall.AggDistinct = false } // format('%s %1$s', str) -> printf('%1$s %1$s', str) -func (parser *ParserFunction) RemapFormatToPrintf(functionCall *pgQuery.FuncCall) *pgQuery.FuncCall { +func (parser *ParserFunction) RemapFormatToPrintf(functionCall *pgQuery.FuncCall) { format := parser.FirstArgumentToString(functionCall) for i := range functionCall.Args[1:] { format = strings.Replace(format, "%s", "%"+common.IntToString(i+1)+"$s", 1) @@ -73,7 +104,6 @@ func (parser *ParserFunction) RemapFormatToPrintf(functionCall *pgQuery.FuncCall functionCall.Funcname = []*pgQuery.Node{pgQuery.MakeStrNode("printf")} functionCall.Args[0] = pgQuery.MakeAConstStrNode(format, 0) - return functionCall } // encode(sha256(...), 'hex') -> sha256(...) diff --git a/src/server/pg_constants.go b/src/server/pg_constants.go index 6316f9d..0968995 100644 --- a/src/server/pg_constants.go +++ b/src/server/pg_constants.go @@ -9,8 +9,9 @@ const ( PG_SCHEMA_PG_CATALOG = "pg_catalog" PG_SCHEMA_PUBLIC = "public" - PG_FUNCTION_FORMAT = "format" - PG_FUNCTION_ENCODE = "encode" + PG_FUNCTION_FORMAT = "format" + PG_FUNCTION_ENCODE = "encode" + PG_FUNCTION_JSONB_AGG = "jsonb_agg" PG_TABLE_PG_CLASS = "pg_class" PG_TABLE_PG_STAT_USER_TABLES = "pg_stat_user_tables" diff --git a/src/server/query_handler_test.go b/src/server/query_handler_test.go index 75f60f7..bba292c 100644 --- a/src/server/query_handler_test.go +++ b/src/server/query_handler_test.go @@ -158,6 +158,21 @@ func TestHandleQuery(t *testing.T) { "types": {uint32ToString(pgtype.TextOID)}, "values": {"2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae"}, }, + "SELECT JSONB_AGG(jsonb_column->'key') FILTER (WHERE jsonb_column->'key' IS NOT NULL) as nested_objects FROM postgres.test_table": { + "description": {"nested_objects"}, + "types": {uint32ToString(pgtype.JSONOID)}, + "values": {"[\"value\"]"}, + }, + "SELECT string_agg(jsonb_column->'key') FILTER (WHERE jsonb_column->'key' IS NOT NULL) FROM postgres.test_table;": { + "description": {"string_agg"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"\"value\""}, + }, + "SELECT jsonb_object_agg('key', 'value')": { + "description": {"jsonb_object_agg"}, + "types": {uint32ToString(pgtype.JSONOID)}, + "values": {"{\"key\":\"value\"}"}, + }, "SELECT json_build_object('min', 1, 'max', 2) AS json_build_object": { "description": {"json_build_object"}, "types": {uint32ToString(pgtype.JSONOID)}, @@ -673,12 +688,12 @@ func TestHandleQuery(t *testing.T) { }, "SELECT interval_column FROM postgres.test_table WHERE interval_column IS NOT NULL": { "description": {"interval_column"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"1 mon 2 days 01:00:01.000001"}, + "types": {uint32ToString(pgtype.NumericOID)}, + "values": {"2.806201000001e+12"}, }, "SELECT interval_column FROM postgres.test_table WHERE interval_column IS NULL": { "description": {"interval_column"}, - "types": {uint32ToString(pgtype.TextOID)}, + "types": {uint32ToString(pgtype.NumericOID)}, "values": {""}, }, "SELECT json_column FROM postgres.test_table WHERE json_column IS NOT NULL": { @@ -701,6 +716,11 @@ func TestHandleQuery(t *testing.T) { "types": {uint32ToString(pgtype.JSONOID)}, "values": {"\"value\""}, }, + "SELECT json_column->>'key' AS key FROM postgres.test_table WHERE id = 1 AND json_column::json->>'key' IN ('value')": { + "description": {"key"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"value"}, + }, "SELECT jsonb_column FROM postgres.test_table WHERE bool_column = FALSE": { "description": {"jsonb_column"}, "types": {uint32ToString(pgtype.TextOID)}, diff --git a/src/server/query_remapper.go b/src/server/query_remapper.go index efb9880..376427f 100644 --- a/src/server/query_remapper.go +++ b/src/server/query_remapper.go @@ -360,6 +360,10 @@ func (remapper *QueryRemapper) remappedExpressions(node *pgQuery.Node, indentLev functionCall.Args[i] = remapper.remappedExpressions(arg, indentLevel+1) // self-recursion } } + + if functionCall.AggFilter != nil && functionCall.AggFilter.GetNullTest() != nil { + functionCall.AggFilter.GetNullTest().Arg = remapper.remappedExpressions(functionCall.AggFilter.GetNullTest().Arg, indentLevel+1) // self-recursion + } } // (FUNCTION()).n diff --git a/src/server/query_remapper_expression.go b/src/server/query_remapper_expression.go index 970dc40..42f1ea1 100644 --- a/src/server/query_remapper_expression.go +++ b/src/server/query_remapper_expression.go @@ -89,6 +89,12 @@ func (remapper *QueryRemapperExpression) remappedArithmeticExpression(node *pgQu // pg_catalog.[operator] -> [operator] remapper.parserAExpr.RemovePgCatalog(node) + // [column]->>'value' -> json_extract_string([column], 'value') + node = remapper.parserAExpr.RemappedJsonExtractString(node) + + // [column]->'value' -> json_extract([column], 'value') + node = remapper.parserAExpr.RemappedJsonExtract(node) + return node } diff --git a/src/server/query_remapper_function.go b/src/server/query_remapper_function.go index 1e54562..f5b977d 100644 --- a/src/server/query_remapper_function.go +++ b/src/server/query_remapper_function.go @@ -40,6 +40,7 @@ func CreatePgCatalogMacroQueries(config *Config) []string { WHEN true THEN json_extract_path_text(from_json, path_elems)[1]::varchar ELSE json_extract_path_text(from_json, path_elems)::varchar END`, + `CREATE MACRO jsonb_object_agg(key, value) AS to_json(map(array_agg(key), array_agg(value)))`, `CREATE MACRO json_build_object(k1, v1) AS json_object(k1, v1), (k1, v1, k2, v2) AS json_object(k1, v1, k2, v2), (k1, v1, k2, v2, k3, v3) AS json_object(k1, v1, k2, v2, k3, v3), @@ -110,13 +111,9 @@ func NewQueryRemapperFunction(config *Config, icebergReader *IcebergReader) *Que } } -func (remapper *QueryRemapperFunction) SchemaFunction(functionCall *pgQuery.FuncCall) *QuerySchemaFunction { - return remapper.parserFunction.SchemaFunction(functionCall) -} - // FUNCTION(...) -> ANOTHER_FUNCTION(...) func (remapper *QueryRemapperFunction) RemapFunctionCall(functionCall *pgQuery.FuncCall) *QuerySchemaFunction { - schemaFunction := remapper.SchemaFunction(functionCall) + schemaFunction := remapper.parserFunction.SchemaFunction(functionCall) // Pre-defined macro functions switch schemaFunction.Schema { @@ -149,6 +146,12 @@ func (remapper *QueryRemapperFunction) RemapFunctionCall(functionCall *pgQuery.F return schemaFunction } + // jsonb_agg(...) -> to_json(array_agg(...)) + if schemaFunction.Function == PG_FUNCTION_JSONB_AGG { + remapper.parserFunction.RemapJsonbAgg(functionCall) + return schemaFunction + } + return nil } diff --git a/src/server/query_remapper_table.go b/src/server/query_remapper_table.go index 85dc6d3..beb0506 100644 --- a/src/server/query_remapper_table.go +++ b/src/server/query_remapper_table.go @@ -178,7 +178,7 @@ func (remapper *QueryRemapperTable) RemapTable(node *pgQuery.Node) *pgQuery.Node return node // Let it return "Catalog Error: Table with name _ does not exist!" } } - icebergPath := remapper.icebergReader.MetadataFilePath(schemaTable) // iceberg/schema/table/metadata/v1.metadata.json + icebergPath := remapper.icebergReader.MetadataFileS3Path(schemaTable) // iceberg/schema/table/metadata/v1.metadata.json return parser.MakeIcebergTableNode(QueryToIcebergTable{ QuerySchemaTable: qSchemaTable, diff --git a/src/syncer-amplitude/amplitude.go b/src/syncer-amplitude/amplitude.go index ffcc018..060d5f1 100644 --- a/src/syncer-amplitude/amplitude.go +++ b/src/syncer-amplitude/amplitude.go @@ -11,6 +11,7 @@ import ( "time" "github.com/BemiHQ/BemiDB/src/common" + "github.com/BemiHQ/BemiDB/src/syncer-common" ) const ( @@ -30,55 +31,54 @@ func NewAmplitude(config *Config) *Amplitude { } } -func (c *Amplitude) Export(startTime, endTime time.Time) ([]Event, error) { +func (amplitude *Amplitude) Export(jsonQueueWriter *syncerCommon.JsonQueueWriter, startTime, endTime time.Time) error { startString := startTime.UTC().Format(AMPLITUDE_TIME_FORMAT) endString := endTime.UTC().Format(AMPLITUDE_TIME_FORMAT) req, err := http.NewRequest("GET", AMPLITUDE_API_URL, nil) if err != nil { - return nil, err + return err } q := req.URL.Query() q.Add("start", startString) q.Add("end", endString) req.URL.RawQuery = q.Encode() - req.SetBasicAuth(c.Config.ApiKey, c.Config.SecretKey) + req.SetBasicAuth(amplitude.Config.ApiKey, amplitude.Config.SecretKey) - common.LogInfo(c.Config.CommonConfig, "Fetching data from Amplitude from", startString, "to", endString) - resp, err := c.HttpClient.Do(req) + common.LogInfo(amplitude.Config.CommonConfig, "Fetching data from Amplitude from", startString, "to", endString) + resp, err := amplitude.HttpClient.Do(req) if err != nil { - return nil, err + return err } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { body, _ := io.ReadAll(resp.Body) - return nil, fmt.Errorf("amplitude API returned status %d: %s", resp.StatusCode, string(body)) + return fmt.Errorf("amplitude API returned status %d: %s", resp.StatusCode, string(body)) } - common.LogDebug(c.Config.CommonConfig, "Received response from Amplitude:", resp.Status) + common.LogDebug(amplitude.Config.CommonConfig, "Received response from Amplitude:", resp.Status) body, err := io.ReadAll(resp.Body) if err != nil { - return nil, err + return err } zipReader, err := zip.NewReader(bytes.NewReader(body), int64(len(body))) if err != nil { - return nil, err + return err } - var events []Event for _, zipFile := range zipReader.File { - common.LogInfo(c.Config.CommonConfig, "Processing file:", zipFile.Name) + common.LogInfo(amplitude.Config.CommonConfig, "Processing file:", zipFile.Name) unzippedFile, err := zipFile.Open() if err != nil { - return nil, err + return err } defer unzippedFile.Close() gzipReader, err := gzip.NewReader(unzippedFile) if err != nil { - return nil, err + return err } defer gzipReader.Close() @@ -90,11 +90,15 @@ func (c *Amplitude) Export(startTime, endTime time.Time) ([]Event, error) { if err == io.EOF { break // We're done } - common.PanicIfError(c.Config.CommonConfig, err) + return err + } + + err = jsonQueueWriter.Write(event.ToMap()) + if err != nil { + return err } - events = append(events, event) } } - return events, nil + return nil } diff --git a/src/syncer-amplitude/config.go b/src/syncer-amplitude/config.go index c946bcc..fefe684 100644 --- a/src/syncer-amplitude/config.go +++ b/src/syncer-amplitude/config.go @@ -8,13 +8,9 @@ import ( "time" "github.com/BemiHQ/BemiDB/src/common" - "github.com/BemiHQ/BemiDB/src/syncer-common" ) const ( - ENV_TRINO_DATABASE_URL = "TRINO_DATABASE_URL" - ENV_TRINO_CATALOG_NAME = "TRINO_CATALOG_NAME" - ENV_DESTINATION_SCHEMA_NAME = "DESTINATION_SCHEMA_NAME" ENV_API_KEY = "SOURCE_AMPLITUDE_API_KEY" @@ -26,12 +22,10 @@ const ( type Config struct { CommonConfig *common.CommonConfig - TrinoConfig *syncerCommon.TrinoConfig DestinationSchemaName string - - ApiKey string - SecretKey string - StartDate time.Time + ApiKey string + SecretKey string + StartDate time.Time } type configParseValues struct { @@ -47,7 +41,6 @@ func init() { func registerFlags() { _config.CommonConfig = &common.CommonConfig{} - _config.TrinoConfig = &syncerCommon.TrinoConfig{} flag.StringVar(&_config.CommonConfig.LogLevel, "log-level", os.Getenv(common.ENV_LOG_LEVEL), `Log level: "ERROR", "WARN", "INFO", "DEBUG", "TRACE". Default: "`+common.DEFAULT_LOG_LEVEL+`"`) flag.StringVar(&_config.CommonConfig.CatalogDatabaseUrl, "catalog-database-url", os.Getenv(common.ENV_CATALOG_DATABASE_URL), "Catalog database URL") @@ -58,10 +51,7 @@ func registerFlags() { flag.StringVar(&_config.CommonConfig.Aws.SecretAccessKey, "aws-secret-access-key", os.Getenv(common.ENV_AWS_SECRET_ACCESS_KEY), "AWS secret access key") flag.BoolVar(&_config.CommonConfig.DisableAnonymousAnalytics, "disable-anonymous-analytics", os.Getenv(common.ENV_DISABLE_ANONYMOUS_ANALYTICS) == "true", "Disable anonymous analytics collection") - flag.StringVar(&_config.TrinoConfig.DatabaseUrl, "trino-database-url", os.Getenv(ENV_TRINO_DATABASE_URL), "Trino database URL to sync to") - flag.StringVar(&_config.TrinoConfig.CatalogName, "trino-catalog-name", os.Getenv(ENV_TRINO_CATALOG_NAME), "Trino catalog name") flag.StringVar(&_config.DestinationSchemaName, "destination-schema-name", os.Getenv(ENV_DESTINATION_SCHEMA_NAME), "Destination schema name to store the synced data") - flag.StringVar(&_config.ApiKey, "api-key", os.Getenv(ENV_API_KEY), "Amplitude API Key") flag.StringVar(&_config.SecretKey, "secret-key", os.Getenv(ENV_SECRET_KEY), "Amplitude Secret Key") flag.StringVar(&_configParseValues.StartDate, "start-date", os.Getenv(ENV_START_DATE), "Amplitude start date in YYYY-MM-DD format") @@ -94,16 +84,9 @@ func parseFlags() { panic("AWS access key ID is required") } - if _config.TrinoConfig.DatabaseUrl == "" { - panic("Trino database URL is required") - } - if _config.TrinoConfig.CatalogName == "" { - panic("Trino catalog name is required") - } if _config.DestinationSchemaName == "" { panic("Destination schema name is required") } - if _config.ApiKey == "" { panic("Amplitude API key is required") } diff --git a/src/syncer-amplitude/event.go b/src/syncer-amplitude/event.go index e21f303..6aae7f6 100644 --- a/src/syncer-amplitude/event.go +++ b/src/syncer-amplitude/event.go @@ -1,12 +1,7 @@ package main import ( - "encoding/json" - "fmt" - "strconv" - "strings" - "time" - + "github.com/BemiHQ/BemiDB/src/common" "github.com/BemiHQ/BemiDB/src/syncer-common" ) @@ -14,10 +9,11 @@ const ( EVENTS_TABLE_NAME = "events" ) +// https://amplitude.com/docs/apis/analytics/export type Event struct { Adid string `json:"adid"` - AmplitudeAttributionIDs interface{} `json:"amplitude_attribution_ids"` - AmplitudeEventType interface{} `json:"amplitude_event_type"` + AmplitudeAttributionIDs string `json:"amplitude_attribution_ids"` + AmplitudeEventType string `json:"amplitude_event_type"` AmplitudeID int64 `json:"amplitude_id"` App int `json:"app"` City string `json:"city"` @@ -34,7 +30,7 @@ type Event struct { DeviceModel string `json:"device_model"` DeviceType string `json:"device_type"` DMA string `json:"dma"` - EventID int64 `json:"event_id"` + EventID int `json:"event_id"` EventProperties map[string]interface{} `json:"event_properties"` EventTime string `json:"event_time"` EventType string `json:"event_type"` @@ -43,27 +39,27 @@ type Event struct { Groups map[string]interface{} `json:"groups"` IDFA string `json:"idfa"` InsertID string `json:"$insert_id"` - InsertKey interface{} `json:"$insert_key"` + InsertKey string `json:"$insert_key"` IPAddress string `json:"ip_address"` - IsAttributionEvent interface{} `json:"is_attribution_event"` + IsAttributionEvent bool `json:"is_attribution_event"` Language string `json:"language"` Library string `json:"library"` - LocationLat interface{} `json:"location_lat"` - LocationLng interface{} `json:"location_lng"` + LocationLat float64 `json:"location_lat"` + LocationLng float64 `json:"location_lng"` OSName string `json:"os_name"` OSVersion string `json:"os_version"` - PartnerID interface{} `json:"partner_id"` - Paying interface{} `json:"paying"` - Plan map[string]interface{} `json:"plan"` + PartnerID string `json:"partner_id"` + Paying string `json:"paying"` + Plan interface{} `json:"plan"` Platform string `json:"platform"` ProcessedTime string `json:"processed_time"` Region string `json:"region"` - SampleRate interface{} `json:"sample_rate"` - Schema interface{} `json:"$schema"` + SampleRate float64 `json:"sample_rate"` + Schema string `json:"$schema"` ServerReceivedTime string `json:"server_received_time"` ServerUploadTime string `json:"server_upload_time"` SessionID int64 `json:"session_id"` - SourceID interface{} `json:"source_id"` + SourceID string `json:"source_id"` StartVersion string `json:"start_version"` UserCreationTime string `json:"user_creation_time"` UserID string `json:"user_id"` @@ -72,259 +68,123 @@ type Event struct { VersionName string `json:"version_name"` } -func (e *Event) ToTrinoRow() string { - toVarchar := func(s string) string { - if s == "" { - return "NULL" - } - return "'" + strings.ReplaceAll(s, "'", "''") + "'" - } - - toJsonVarchar := func(data map[string]interface{}) string { - if len(data) == 0 { - return "NULL" - } - bytes, err := json.Marshal(data) - if err != nil { - return "NULL" - } - return toVarchar(string(bytes)) - } - - toInterfaceVarchar := func(i interface{}) string { - if i == nil { - return "NULL" - } - s, ok := i.(string) - if !ok { - bytes, err := json.Marshal(i) - if err != nil { - return "NULL" - } - return toVarchar(string(bytes)) - } - return toVarchar(s) - } - - toFloat64String := func(f interface{}) string { - if f == nil { - return "NULL" - } - val, ok := f.(float64) - if !ok { - return "NULL" - } - return strconv.FormatFloat(val, 'f', -1, 64) - } - - toBoolString := func(b interface{}) string { - if b == nil { - return "NULL" - } - val, ok := b.(bool) - if !ok { - return "NULL" - } - return strconv.FormatBool(val) - } - - parseTime := func(t string) string { - if t == "" { - return "NULL" - } - parsedTime, err := time.Parse("2006-01-02 15:04:05.999999", t) - if err != nil { - parsedTime, err = time.Parse("2006-01-02 15:04:05", t) - if err != nil { - parsedTime, err = time.Parse(time.RFC3339, t) - if err != nil { - return "NULL" - } - } - } - return "TIMESTAMP '" + syncerCommon.TimeToUtcStringMs(parsedTime) + "'" - } - - return fmt.Sprintf("(%s, %s, %s, %d, %d, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %d, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %d, %s, %s, %s, %s, %s, %s, %s)", - toVarchar(e.Adid), - toInterfaceVarchar(e.AmplitudeAttributionIDs), - toInterfaceVarchar(e.AmplitudeEventType), - e.AmplitudeID, - e.App, - toVarchar(e.City), - parseTime(e.ClientEventTime), - parseTime(e.ClientUploadTime), - toVarchar(e.Country), - toJsonVarchar(e.Data), - toVarchar(e.DataType), - toVarchar(e.DeviceBrand), - toVarchar(e.DeviceCarrier), - toVarchar(e.DeviceFamily), - toVarchar(e.DeviceID), - toVarchar(e.DeviceManufacturer), - toVarchar(e.DeviceModel), - toVarchar(e.DeviceType), - toVarchar(e.DMA), - e.EventID, - toJsonVarchar(e.EventProperties), - parseTime(e.EventTime), - toVarchar(e.EventType), - toJsonVarchar(e.GlobalUserProperties), - toJsonVarchar(e.GroupProperties), - toJsonVarchar(e.Groups), - toVarchar(e.IDFA), - toVarchar(e.InsertID), - toInterfaceVarchar(e.InsertKey), - toVarchar(e.IPAddress), - toBoolString(e.IsAttributionEvent), - toVarchar(e.Language), - toVarchar(e.Library), - toFloat64String(e.LocationLat), - toFloat64String(e.LocationLng), - toVarchar(e.OSName), - toVarchar(e.OSVersion), - toInterfaceVarchar(e.PartnerID), - toBoolString(e.Paying), - toJsonVarchar(e.Plan), - toVarchar(e.Platform), - parseTime(e.ProcessedTime), - toVarchar(e.Region), - toFloat64String(e.SampleRate), - toInterfaceVarchar(e.Schema), - parseTime(e.ServerReceivedTime), - parseTime(e.ServerUploadTime), - e.SessionID, - toInterfaceVarchar(e.SourceID), - toVarchar(e.StartVersion), - parseTime(e.UserCreationTime), - toVarchar(e.UserID), - toJsonVarchar(e.UserProperties), - toVarchar(e.UUID), - toVarchar(e.VersionName), - ) -} - -func (e *Event) String() string { - return fmt.Sprintf("Event{Adid: %s, AmplitudeAttributionIDs: %v, AmplitudeEventType: %v, AmplitudeID: %d, App: %d, City: %s, ClientEventTime: %s, ClientUploadTime: %s, Country: %s, Data: %v, DataType: %s, DeviceBrand: %s, DeviceCarrier: %s, DeviceFamily: %s, DeviceID: %s, DeviceManufacturer: %s, DeviceModel: %s, DeviceType: %s, DMA: %s, EventID: %d, EventProperties: %v, EventTime: %s, EventType: %s, GlobalUserProperties: %v, GroupProperties: %v, Groups: %v, IDFA: %s, InsertID: %s, InsertKey: %v, IPAddress: %s, IsAttributionEvent: %v, Language: %s, Library: %s, LocationLat: %v, LocationLng: %v, OSName: %s, OSVersion: %s, PartnerID: %v, Paying: %v, Plan: %v, Platform: %s, ProcessedTime: %s, Region: %s, SampleRate: %v, Schema: %v, ServerReceivedTime: %s, ServerUploadTime: %s, SessionID: %d, SourceID: %v, StartVersion: %s, UserCreationTime: %s, UserID: %s, UserProperties: %v, UUID: %s, VersionName: %s}", - e.Adid, e.AmplitudeAttributionIDs, e.AmplitudeEventType, e.AmplitudeID, e.App, e.City, e.ClientEventTime, e.ClientUploadTime, e.Country, e.Data, e.DataType, e.DeviceBrand, e.DeviceCarrier, e.DeviceFamily, e.DeviceID, e.DeviceManufacturer, e.DeviceModel, e.DeviceType, e.DMA, e.EventID, e.EventProperties, e.EventTime, e.EventType, e.GlobalUserProperties, e.GroupProperties, e.Groups, e.IDFA, e.InsertID, e.InsertKey, e.IPAddress, e.IsAttributionEvent, e.Language, e.Library, e.LocationLat, e.LocationLng, e.OSName, e.OSVersion, e.PartnerID, e.Paying, e.Plan, e.Platform, e.ProcessedTime, e.Region, e.SampleRate, e.Schema, e.ServerReceivedTime, e.ServerUploadTime, e.SessionID, e.SourceID, e.StartVersion, e.UserCreationTime, e.UserID, e.UserProperties, e.UUID, e.VersionName) -} - -func EventsTableSchema() string { - return `( - "adid" VARCHAR, - "amplitude_attribution_ids" VARCHAR, - "amplitude_event_type" VARCHAR, - "amplitude_id" BIGINT, - "app" INTEGER, - "city" VARCHAR, - "client_event_time" TIMESTAMP(6), - "client_upload_time" TIMESTAMP(6), - "country" VARCHAR, - "data" VARCHAR, - "data_type" VARCHAR, - "device_brand" VARCHAR, - "device_carrier" VARCHAR, - "device_family" VARCHAR, - "device_id" VARCHAR, - "device_manufacturer" VARCHAR, - "device_model" VARCHAR, - "device_type" VARCHAR, - "dma" VARCHAR, - "event_id" BIGINT, - "event_properties" VARCHAR, - "event_time" TIMESTAMP(6), - "event_type" VARCHAR, - "global_user_properties" VARCHAR, - "group_properties" VARCHAR, - "groups" VARCHAR, - "idfa" VARCHAR, - "insert_id" VARCHAR, - "insert_key" VARCHAR, - "ip_address" VARCHAR, - "is_attribution_event" BOOLEAN, - "language" VARCHAR, - "library" VARCHAR, - "location_lat" DOUBLE, - "location_lng" DOUBLE, - "os_name" VARCHAR, - "os_version" VARCHAR, - "partner_id" VARCHAR, - "paying" BOOLEAN, - "plan" VARCHAR, - "platform" VARCHAR, - "processed_time" TIMESTAMP(6), - "region" VARCHAR, - "sample_rate" DOUBLE, - "schema" VARCHAR, - "server_received_time" TIMESTAMP(6), - "server_upload_time" TIMESTAMP(6), - "session_id" BIGINT, - "source_id" VARCHAR, - "start_version" VARCHAR, - "user_creation_time" TIMESTAMP(6), - "user_id" VARCHAR, - "user_properties" VARCHAR, - "uuid" VARCHAR, - "version_name" VARCHAR - )` +// Normalize $insert_id -> insert_id, $insert_key -> insert_key, $schema -> schema +func (event *Event) ToMap() map[string]interface{} { + result := make(map[string]interface{}) + result["adid"] = event.Adid + result["amplitude_attribution_ids"] = event.AmplitudeAttributionIDs + result["amplitude_event_type"] = event.AmplitudeEventType + result["amplitude_id"] = event.AmplitudeID + result["app"] = event.App + result["city"] = event.City + result["client_event_time"] = event.ClientEventTime + result["client_upload_time"] = event.ClientUploadTime + result["country"] = event.Country + result["data"] = event.Data + result["data_type"] = event.DataType + result["device_brand"] = event.DeviceBrand + result["device_carrier"] = event.DeviceCarrier + result["device_family"] = event.DeviceFamily + result["device_id"] = event.DeviceID + result["device_manufacturer"] = event.DeviceManufacturer + result["device_model"] = event.DeviceModel + result["device_type"] = event.DeviceType + result["dma"] = event.DMA + result["event_id"] = event.EventID + result["event_properties"] = event.EventProperties + result["event_time"] = event.EventTime + result["event_type"] = event.EventType + result["global_user_properties"] = event.GlobalUserProperties + result["group_properties"] = event.GroupProperties + result["groups"] = event.Groups + result["idfa"] = event.IDFA + result["insert_id"] = event.InsertID + result["insert_key"] = event.InsertKey + result["ip_address"] = event.IPAddress + result["is_attribution_event"] = event.IsAttributionEvent + result["language"] = event.Language + result["library"] = event.Library + result["location_lat"] = event.LocationLat + result["location_lng"] = event.LocationLng + result["os_name"] = event.OSName + result["os_version"] = event.OSVersion + result["partner_id"] = event.PartnerID + result["paying"] = event.Paying + result["plan"] = event.Plan + result["platform"] = event.Platform + result["processed_time"] = event.ProcessedTime + result["region"] = event.Region + result["sample_rate"] = event.SampleRate + result["schema"] = event.Schema + result["server_received_time"] = event.ServerReceivedTime + result["server_upload_time"] = event.ServerUploadTime + result["session_id"] = event.SessionID + result["source_id"] = event.SourceID + result["start_version"] = event.StartVersion + result["user_creation_time"] = event.UserCreationTime + result["user_id"] = event.UserID + result["user_properties"] = event.UserProperties + result["uuid"] = event.UUID + result["version_name"] = event.VersionName + return result } -func QuotedEventsTableColumnNames() string { - return strings.Join([]string{ - "adid", - "amplitude_attribution_ids", - "amplitude_event_type", - "amplitude_id", - "app", - "city", - "client_event_time", - "client_upload_time", - "country", - "data", - "data_type", - "device_brand", - "device_carrier", - "device_family", - "device_id", - "device_manufacturer", - "device_model", - "device_type", - "dma", - "event_id", - "event_properties", - "event_time", - "event_type", - "global_user_properties", - "group_properties", - "groups", - "idfa", - "insert_id", - "insert_key", - "ip_address", - "is_attribution_event", - "language", - "library", - "location_lat", - "location_lng", - "os_name", - "os_version", - "partner_id", - "paying", - "plan", - "platform", - "processed_time", - "region", - "sample_rate", - "schema", - "server_received_time", - "server_upload_time", - "session_id", - "source_id", - "start_version", - "user_creation_time", - "user_id", - "user_properties", - "uuid", - "version_name", - }, ",") +func EventIcebergSchemaColumns(config *common.CommonConfig) []*syncerCommon.IcebergSchemaColumn { + return []*syncerCommon.IcebergSchemaColumn{ + {Config: config, ColumnName: "adid", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 1}, + {Config: config, ColumnName: "amplitude_attribution_ids", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 2}, + {Config: config, ColumnName: "amplitude_event_type", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 3}, + {Config: config, ColumnName: "amplitude_id", ColumnType: syncerCommon.IcebergColumnTypeLong, Position: 4}, + {Config: config, ColumnName: "app", ColumnType: syncerCommon.IcebergColumnTypeInteger, Position: 5}, + {Config: config, ColumnName: "city", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 6}, + {Config: config, ColumnName: "client_event_time", ColumnType: syncerCommon.IcebergColumnTypeTimestamp, Position: 7}, + {Config: config, ColumnName: "client_upload_time", ColumnType: syncerCommon.IcebergColumnTypeTimestamp, Position: 8}, + {Config: config, ColumnName: "country", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 9}, + {Config: config, ColumnName: "data", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 10}, + {Config: config, ColumnName: "data_type", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 11}, + {Config: config, ColumnName: "device_brand", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 12}, + {Config: config, ColumnName: "device_carrier", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 13}, + {Config: config, ColumnName: "device_family", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 14}, + {Config: config, ColumnName: "device_id", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 15}, + {Config: config, ColumnName: "device_manufacturer", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 16}, + {Config: config, ColumnName: "device_model", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 17}, + {Config: config, ColumnName: "device_type", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 18}, + {Config: config, ColumnName: "dma", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 19}, + {Config: config, ColumnName: "event_id", ColumnType: syncerCommon.IcebergColumnTypeInteger, Position: 20}, + {Config: config, ColumnName: "event_properties", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 21}, + {Config: config, ColumnName: "event_time", ColumnType: syncerCommon.IcebergColumnTypeTimestamp, Position: 22}, + {Config: config, ColumnName: "event_type", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 23}, + {Config: config, ColumnName: "global_user_properties", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 24}, + {Config: config, ColumnName: "group_properties", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 25}, + {Config: config, ColumnName: "groups", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 26}, + {Config: config, ColumnName: "idfa", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 27}, + {Config: config, ColumnName: "insert_id", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 28}, + {Config: config, ColumnName: "insert_key", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 29}, + {Config: config, ColumnName: "ip_address", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 30}, + {Config: config, ColumnName: "is_attribution_event", ColumnType: syncerCommon.IcebergColumnTypeBoolean, Position: 31}, + {Config: config, ColumnName: "language", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 32}, + {Config: config, ColumnName: "library", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 33}, + {Config: config, ColumnName: "location_lat", ColumnType: syncerCommon.IcebergColumnTypeFloat, Position: 34}, + {Config: config, ColumnName: "location_lng", ColumnType: syncerCommon.IcebergColumnTypeFloat, Position: 35}, + {Config: config, ColumnName: "os_name", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 36}, + {Config: config, ColumnName: "os_version", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 37}, + {Config: config, ColumnName: "partner_id", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 38}, + {Config: config, ColumnName: "paying", ColumnType: syncerCommon.IcebergColumnTypeBoolean, Position: 39}, + {Config: config, ColumnName: "plan", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 40}, + {Config: config, ColumnName: "platform", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 41}, + {Config: config, ColumnName: "processed_time", ColumnType: syncerCommon.IcebergColumnTypeTimestamp, Position: 42}, + {Config: config, ColumnName: "region", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 43}, + {Config: config, ColumnName: "sample_rate", ColumnType: syncerCommon.IcebergColumnTypeFloat, Position: 44}, + {Config: config, ColumnName: "schema", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 45}, + {Config: config, ColumnName: "server_received_time", ColumnType: syncerCommon.IcebergColumnTypeTimestamp, Position: 46}, + {Config: config, ColumnName: "server_upload_time", ColumnType: syncerCommon.IcebergColumnTypeTimestamp, Position: 47}, + {Config: config, ColumnName: "session_id", ColumnType: syncerCommon.IcebergColumnTypeLong, Position: 48}, + {Config: config, ColumnName: "source_id", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 49}, + {Config: config, ColumnName: "start_version", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 50}, + {Config: config, ColumnName: "user_creation_time", ColumnType: syncerCommon.IcebergColumnTypeTimestamp, Position: 51}, + {Config: config, ColumnName: "user_id", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 52}, + {Config: config, ColumnName: "user_properties", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 53}, + {Config: config, ColumnName: "uuid", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 54}, + {Config: config, ColumnName: "version_name", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 55}, + } } diff --git a/src/syncer-amplitude/go.mod b/src/syncer-amplitude/go.mod index 3ede4ea..f9897f6 100644 --- a/src/syncer-amplitude/go.mod +++ b/src/syncer-amplitude/go.mod @@ -34,42 +34,33 @@ require ( github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.35.0 // indirect github.com/aws/smithy-go v1.22.5 // indirect - github.com/duckdb/duckdb-go-bindings v0.1.17 // indirect - github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.12 // indirect - github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.12 // indirect - github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.12 // indirect - github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.12 // indirect - github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.12 // indirect + github.com/duckdb/duckdb-go-bindings v0.1.16 // indirect + github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11 // indirect + github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11 // indirect + github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11 // indirect + github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11 // indirect + github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11 // indirect github.com/go-viper/mapstructure/v2 v2.3.0 // indirect github.com/goccy/go-json v0.10.5 // indirect github.com/golang/snappy v1.0.0 // indirect github.com/google/flatbuffers v25.2.10+incompatible // indirect github.com/google/uuid v1.6.0 // indirect - github.com/hashicorp/go-uuid v1.0.3 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect github.com/jackc/pgx/v5 v5.7.5 // indirect - github.com/jcmturner/aescts/v2 v2.0.0 // indirect - github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect - github.com/jcmturner/gofork v1.7.6 // indirect - github.com/jcmturner/goidentity/v6 v6.0.1 // indirect - github.com/jcmturner/gokrb5/v8 v8.4.4 // indirect - github.com/jcmturner/rpc/v2 v2.0.3 // indirect github.com/klauspost/compress v1.18.0 // indirect github.com/klauspost/cpuid/v2 v2.2.11 // indirect github.com/linkedin/goavro v2.1.0+incompatible // indirect - github.com/marcboeker/go-duckdb/arrowmapping v0.0.10 // indirect - github.com/marcboeker/go-duckdb/mapping v0.0.11 // indirect - github.com/marcboeker/go-duckdb/v2 v2.3.4 // indirect + github.com/marcboeker/go-duckdb/arrowmapping v0.0.9 // indirect + github.com/marcboeker/go-duckdb/mapping v0.0.10 // indirect + github.com/marcboeker/go-duckdb/v2 v2.3.2 // indirect github.com/pierrec/lz4/v4 v4.1.22 // indirect - github.com/trinodb/trino-go-client v0.323.0 // indirect github.com/xitongsys/parquet-go v1.6.2 // indirect github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b // indirect github.com/zeebo/xxh3 v1.0.2 // indirect golang.org/x/crypto v0.40.0 // indirect golang.org/x/exp v0.0.0-20250718183923-645b1fa84792 // indirect golang.org/x/mod v0.26.0 // indirect - golang.org/x/net v0.42.0 // indirect golang.org/x/sync v0.16.0 // indirect golang.org/x/sys v0.34.0 // indirect golang.org/x/text v0.27.0 // indirect diff --git a/src/syncer-amplitude/go.sum b/src/syncer-amplitude/go.sum index dae57a9..79719d8 100644 --- a/src/syncer-amplitude/go.sum +++ b/src/syncer-amplitude/go.sum @@ -68,8 +68,6 @@ cloud.google.com/go/trace v1.2.0/go.mod h1:Wc8y/uYyOhPy12KEnXG9XGrvfMz5F5SrYecQl contrib.go.opencensus.io/exporter/aws v0.0.0-20200617204711-c478e41e60e9/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= contrib.go.opencensus.io/exporter/stackdriver v0.13.10/go.mod h1:I5htMbyta491eUxufwwZPQdcKvvgzMB4O9ni41YnIM8= contrib.go.opencensus.io/integrations/ocsql v0.1.7/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= -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= github.com/Azure/azure-amqp-common-go/v3 v3.2.1/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= github.com/Azure/azure-amqp-common-go/v3 v3.2.2/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= @@ -93,8 +91,6 @@ github.com/Azure/azure-service-bus-go v0.11.5/go.mod h1:MI6ge2CuQWBVq+ly456MY7Xq github.com/Azure/azure-storage-blob-go v0.14.0/go.mod h1:SMqIBi+SuiQH32bvyjngEewEeXoPfKMgWlBDaYf6fck= github.com/Azure/go-amqp v0.16.0/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= github.com/Azure/go-amqp v0.16.4/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= -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/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= github.com/Azure/go-autorest/autorest v0.11.19/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= @@ -117,13 +113,7 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/GoogleCloudPlatform/cloudsql-proxy v1.29.0/go.mod h1:spvB9eLJH9dutlbPSRmHvSXXHOwGRyeXh1jVdquA2G8= 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/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/ahmetb/dlog v0.0.0-20170105205344-4fb5f8204f26 h1:3YVZUqkoev4mL+aCwVOSWV4M7pN+NURHL38Z2zq5JKA= -github.com/ahmetb/dlog v0.0.0-20170105205344-4fb5f8204f26/go.mod h1:ymXt5bw5uSNu4jveerFxE0vNYxF8ncqbptntMaFMg3k= github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= @@ -221,8 +211,6 @@ github.com/aws/smithy-go v1.22.5 h1:P9ATCXPMb2mPjYBgueqJNCA5S9UfktsW0tTxi+a7eqw= github.com/aws/smithy-go v1.22.5/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/bobg/gcsobj v0.1.2/go.mod h1:vS49EQ1A1Ib8FgrL58C8xXYZyOCR2TgzAdopy6/ipa8= -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/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= @@ -241,8 +229,6 @@ github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/colinmarc/hdfs/v2 v2.1.1/go.mod h1:M3x+k8UKKmxtFu++uAZ0OtDU8jR3jnaZIAc6yK4Ue0c= -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/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= @@ -257,26 +243,18 @@ github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQ github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -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/duckdb/duckdb-go-bindings v0.1.17 h1:SjpRwrJ7v0vqnIvLeVFHlhuS72+Lp8xxQ5jIER2LZP4= -github.com/duckdb/duckdb-go-bindings v0.1.17/go.mod h1:pBnfviMzANT/9hi4bg+zW4ykRZZPCXlVuvBWEcZofkc= -github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.12 h1:8CLBnsq9YDhi2Gmt3sjSUeXxMzyMQAKefjqUy9zVPFk= -github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.12/go.mod h1:Ezo7IbAfB8NP7CqPIN8XEHKUg5xdRRQhcPPlCXImXYA= -github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.12 h1:wjO4I0GhMh2xIpiUgRpzuyOT4KxXLoUS/rjU7UUVvCE= -github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.12/go.mod h1:eS7m/mLnPQgVF4za1+xTyorKRBuK0/BA44Oy6DgrGXI= -github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.12 h1:HzKQi2C+1jzmwANsPuYH6x9Sfw62SQTjNAEq3OySKFI= -github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.12/go.mod h1:1GOuk1PixiESxLaCGFhag+oFi7aP+9W8byymRAvunBk= -github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.12 h1:YGSR7AFLw2gJ7IbgLE6DkKYmgKv1LaRSd/ZKF1yh2oE= -github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.12/go.mod h1:o7crKMpT2eOIi5/FY6HPqaXcvieeLSqdXXaXbruGX7w= -github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.12 h1:2aduW6fnFnT2Q45PlIgHbatsPOxV9WSZ5B2HzFfxaxA= -github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.12/go.mod h1:IlOhJdVKUJCAPj3QsDszUo8DVdvp1nBFp4TUJVdw99s= +github.com/duckdb/duckdb-go-bindings v0.1.16 h1:XPCk9hzP06PoWIxDPVU3gAy0m1XmLaZHTzLggNx/U9k= +github.com/duckdb/duckdb-go-bindings v0.1.16/go.mod h1:pBnfviMzANT/9hi4bg+zW4ykRZZPCXlVuvBWEcZofkc= +github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11 h1:GXQkG4HmEbwPtqCSabJTp9wZQQ7Gqr3KveLNesQWQOs= +github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11/go.mod h1:Ezo7IbAfB8NP7CqPIN8XEHKUg5xdRRQhcPPlCXImXYA= +github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11 h1:ATJMSBIDA/YAm/6CKeBDRtGK1OOwqfTZbWg9Y5fAc9E= +github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11/go.mod h1:eS7m/mLnPQgVF4za1+xTyorKRBuK0/BA44Oy6DgrGXI= +github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11 h1:AjvnGst1avyOECYiykthyHR4DTYTaqNDPr5W/0t5j0k= +github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11/go.mod h1:1GOuk1PixiESxLaCGFhag+oFi7aP+9W8byymRAvunBk= +github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11 h1:j3B1biawuhtxe2Chkiqcwf1Kxe8VJc8lLVmjBIcJrkI= +github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11/go.mod h1:o7crKMpT2eOIi5/FY6HPqaXcvieeLSqdXXaXbruGX7w= +github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11 h1:xR3vRE8y+48U6xDNkUlOfbl7/OTA7FVcDXJ+5vETuHU= +github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11/go.mod h1:IlOhJdVKUJCAPj3QsDszUo8DVdvp1nBFp4TUJVdw99s= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= 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= @@ -317,17 +295,12 @@ github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= 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/golang-jwt/jwt v3.2.1+incompatible h1:73Z+4BJcrTC+KczS6WvTPvRGOp1WmfEP4Q1lOd9Z/+c= github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.4.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= -github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188/go.mod h1:vXjM/+wXQnTPR4KqTKDgJukSZ6amVRtWMPEjE6sQoK8= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -414,8 +387,6 @@ github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -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/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -429,18 +400,11 @@ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5m github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ= -github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= -github.com/gorilla/sessions v1.2.1 h1:DHd3rPN5lE3Ts3D8rKkQ8x/0kqfeNmBAaiSi+o7FsgI= -github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/hanwen/go-fuse v1.0.0/go.mod h1:unqXarDXqzAk0rt98O2tVndEPIpUgLD9+rwFisZH3Ok= github.com/hanwen/go-fuse/v2 v2.1.0/go.mod h1:oRyA5eK+pvJyv5otpO/DgccS8y/RvYMaO00GgRLGryc= github.com/hashicorp/go-uuid v0.0.0-20180228145832-27454136f036/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= -github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= 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= @@ -491,19 +455,7 @@ github.com/jackc/puddle v1.2.1 h1:gI8os0wpRXFd4FiAY2dWiqRK037tjj3t7rKFeO4X5iw= github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= -github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= -github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= -github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo= -github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= github.com/jcmturner/gofork v0.0.0-20180107083740-2aebee971930/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= -github.com/jcmturner/gofork v1.7.6 h1:QH0l3hzAU1tfT3rZCnW5zXl+orbkNMMRGJfdJjHVETg= -github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo= -github.com/jcmturner/goidentity/v6 v6.0.1 h1:VKnZd2oEIMorCTsFBnJWbExfNN7yZr3EhJAxwOkZg6o= -github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= -github.com/jcmturner/gokrb5/v8 v8.4.4 h1:x1Sv4HaTpepFkXbt2IkL29DXRf8sOfZXo8eRKh687T8= -github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs= -github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY= -github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= @@ -546,12 +498,12 @@ github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/linkedin/goavro v2.1.0+incompatible h1:DV2aUlj2xZiuxQyvag8Dy7zjY69ENjS66bWkSfdpddY= github.com/linkedin/goavro v2.1.0+incompatible/go.mod h1:bBCwI2eGYpUI/4820s67MElg9tdeLbINjLjiM2xZFYM= -github.com/marcboeker/go-duckdb/arrowmapping v0.0.10 h1:G1W+GVnUefR8uy7jHdNO+CRMsmFG5mFPIHVAespfFCA= -github.com/marcboeker/go-duckdb/arrowmapping v0.0.10/go.mod h1:jccUb8TYD0p5TsEEeN4SXuslNJHo23QaKOqKD+U6uFU= -github.com/marcboeker/go-duckdb/mapping v0.0.11 h1:fusN1b1l7Myxafifp596I6dNLNhN5Uv/rw31qAqBwqw= -github.com/marcboeker/go-duckdb/mapping v0.0.11/go.mod h1:aYBjFLgfKO0aJIbDtXPiaL5/avRQISveX/j9tMf9JhU= -github.com/marcboeker/go-duckdb/v2 v2.3.4 h1:o98wrefPbH0IdJRix4pF0+jZiXoFQ+FSR8InMsCUZD0= -github.com/marcboeker/go-duckdb/v2 v2.3.4/go.mod h1:8adNrftF4Ye29XMrpIl5NYNosTVsZu1mz3C82WdVvrk= +github.com/marcboeker/go-duckdb/arrowmapping v0.0.9 h1:xj+kFOqR2gH3Mcxx9LmAVHebSnCiPm303N+uxfkWVmY= +github.com/marcboeker/go-duckdb/arrowmapping v0.0.9/go.mod h1:o56AqVS90v5bpxhPnOK9La7AfNTOrMORiqTQrlRbdPQ= +github.com/marcboeker/go-duckdb/mapping v0.0.10 h1:b/y2W8/hNlD0Dwjq0mCqIlLXpjQMnWy0WqDV9b9lHQQ= +github.com/marcboeker/go-duckdb/mapping v0.0.10/go.mod h1:Ro6Tw6sGG50O8S0daZsA8TrQJz/DvGrzGvMD7Jihirw= +github.com/marcboeker/go-duckdb/v2 v2.3.2 h1:96zG2JPyIhCFjHdBjjSpOdhzJzehoGTdl7LskkuMUTs= +github.com/marcboeker/go-duckdb/v2 v2.3.2/go.mod h1:VeXz9ZM6klNvICHrXEUzaHSgNqBeTdyMxr4CICw/UaY= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= @@ -568,12 +520,6 @@ github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -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/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= @@ -582,14 +528,6 @@ github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3P github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/ncw/swift v1.0.52/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -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/pborman/getopt v0.0.0-20180729010549-6fdd0a2c7117/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= github.com/pierrec/lz4/v4 v4.1.8/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= @@ -598,7 +536,6 @@ github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= 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/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= @@ -616,15 +553,11 @@ github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFR 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.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= -github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= 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.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -633,20 +566,10 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 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.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/trinodb/trino-go-client v0.323.0 h1:I7Y67um1NnrwKCThzGr8o0xYUldb+n4vPn5R/qUxW2E= -github.com/trinodb/trino-go-client v0.323.0/go.mod h1:F+7TZRD0+0M8XqYsgXT8+EJT1pSlbxTECVD1BDzCc70= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -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/xitongsys/parquet-go v1.5.1/go.mod h1:xUxwM8ELydxh4edHGegYq1pA8NnMKDx0K/GyB0o2bww= github.com/xitongsys/parquet-go v1.6.2 h1:MhCaXii4eqceKPu9BwrjLqyK10oX9WF+xGhwvwbw7xM= github.com/xitongsys/parquet-go v1.6.2/go.mod h1:IulAQyalCm0rPiZVNnCgm/PCL64X2tdSVGMQ/UeKqWA= @@ -710,7 +633,6 @@ golang.org/x/crypto v0.0.0-20211115234514-b4de73f9ece8/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220511200225-c6db032c6c88/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM= @@ -809,8 +731,6 @@ golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs= -golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8= 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= @@ -1222,7 +1142,6 @@ gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/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= diff --git a/src/syncer-amplitude/syncer.go b/src/syncer-amplitude/syncer.go index 64a1864..3c2c6c7 100644 --- a/src/syncer-amplitude/syncer.go +++ b/src/syncer-amplitude/syncer.go @@ -1,8 +1,6 @@ package main import ( - "context" - "database/sql" "strings" "time" @@ -13,146 +11,72 @@ import ( const ( PAGINATION_TIME_INTERVAL = time.Hour AMPLITUDE_DATA_DELAY = time.Hour // Amplitude data is available for export after an up to 2-hour delay (1 full hour + truncated). https://amplitude.com/docs/apis/analytics/export + + CURSOR_COLUMN_NAME = "server_upload_time" + + MAX_IN_MEMORY_BUFFER_SIZE = 32 * 1024 * 1024 // 32 MB + COMPRESSION_FACTOR = 2 // 1 GB uncompressed data x 2 = ~90MB compressed data ) type Syncer struct { - Config *Config - Amplitude *Amplitude + Config *Config + Amplitude *Amplitude + StorageS3 *syncerCommon.StorageS3 + DuckdbClient *common.DuckdbClient } func NewSyncer(config *Config) *Syncer { + storageS3 := syncerCommon.NewStorageS3(config.CommonConfig) + duckdbClient := common.NewDuckdbClient(config.CommonConfig, syncerCommon.DUCKDB_BOOT_QUERIES) + return &Syncer{ - Config: config, - Amplitude: NewAmplitude(config), + Config: config, + Amplitude: NewAmplitude(config), + StorageS3: storageS3, + DuckdbClient: duckdbClient, } } func (syncer *Syncer) Sync() { syncerCommon.SendAnonymousAnalytics(syncer.Config.CommonConfig, "syncer-amplitude-start", syncer.name()) - trino := syncerCommon.NewTrino(syncer.Config.CommonConfig, syncer.Config.TrinoConfig, syncer.Config.DestinationSchemaName) - defer trino.Close() + cappedBuffer := syncerCommon.NewCappedBuffer(syncer.Config.CommonConfig, MAX_IN_MEMORY_BUFFER_SIZE) + jsonQueueWriter := syncerCommon.NewJsonQueueWriter(cappedBuffer) - trino.CreateSchemaIfNotExists() - trino.CreateTableIfNotExists(EVENTS_TABLE_NAME, EventsTableSchema()) + icebergTable := syncerCommon.NewIcebergTable(syncer.Config.CommonConfig, syncer.StorageS3, syncer.DuckdbClient, syncer.Config.DestinationSchemaName, EVENTS_TABLE_NAME) + cursorValue := icebergTable.LastCursorValue(CURSOR_COLUMN_NAME) - quotedTablePath := trino.Schema() + `."` + EVENTS_TABLE_NAME + `"` - - lastSyncedTime := syncer.findLastCursorValue(trino) - if lastSyncedTime.IsZero() { - lastSyncedTime = syncer.Config.StartDate - } else { - common.LogInfo(syncer.Config.CommonConfig, "Last synced time found:", lastSyncedTime) - syncer.deleteHourFromTable(trino, quotedTablePath, lastSyncedTime) + lastSyncedTime := syncer.Config.StartDate + if cursorValue.StringValue != "" { + lastSyncedTime = syncerCommon.StringMsToUtcTime(cursorValue.StringValue).Truncate(time.Hour).Add(time.Hour) // add 1 hour to ensure we don't overlap } - now := time.Now().UTC() endOfSyncWindow := now.Add(-AMPLITUDE_DATA_DELAY).Truncate(time.Hour) common.LogInfo(syncer.Config.CommonConfig, "Starting incremental sync from", lastSyncedTime, "to", endOfSyncWindow) - for t := lastSyncedTime; t.Before(endOfSyncWindow); t = t.Add(PAGINATION_TIME_INTERVAL) { - startTime := t - endTime := t.Add(PAGINATION_TIME_INTERVAL - time.Hour) // -1 hour to ensure we don't overlap (Amplitude uses an inclusive end time) - - events, err := syncer.Amplitude.Export(startTime, endTime) - if err != nil && strings.Contains(err.Error(), "Raw data files were not found.") { - common.LogInfo(syncer.Config.CommonConfig, "No data found for the time range", startTime, "to", endTime, "- will retry later.") - break - } - common.PanicIfError(syncer.Config.CommonConfig, err) - - if len(events) > 0 { - syncer.insertEvents(trino, quotedTablePath, events) - } - - // Compact every 24 hours - if t.Hour() == 23 { - common.LogInfo(syncer.Config.CommonConfig, "Compacting...") - trino.CompactTable(quotedTablePath) - } - } - - common.LogInfo(syncer.Config.CommonConfig, "Compacting...") - trino.CompactTable(quotedTablePath) - - syncerCommon.SendAnonymousAnalytics(syncer.Config.CommonConfig, "syncer-amplitude-finish", syncer.name()) -} - -func (syncer *Syncer) findLastCursorValue(trino *syncerCommon.Trino) time.Time { - var nullString sql.NullString - query := `SELECT CAST(max("server_upload_time") AS VARCHAR) FROM ` + trino.Schema() + `."` + EVENTS_TABLE_NAME + `"` - err := trino.QueryRowContext( - context.Background(), - query, - ).Scan(&nullString) - - if err != nil { - if err == sql.ErrNoRows { - return time.Time{} - } - if strings.Contains(err.Error(), "does not exist") || strings.Contains(err.Error(), "Table not found") { - common.LogInfo(syncer.Config.CommonConfig, "Table", EVENTS_TABLE_NAME, "does not exist yet. Starting from scratch.") - return time.Time{} - } - common.PanicIfError(syncer.Config.CommonConfig, err) - } - - if !nullString.Valid || nullString.String == "" { - return time.Time{} - } - - return syncerCommon.StringMsToUtcTime(nullString.String).Truncate(time.Hour) -} - -func (syncer *Syncer) insertEvents(trino *syncerCommon.Trino, quotedTrinoTablePath string, events []Event) { - if len(events) == 0 { - return - } - ctx := context.Background() - quotedColumnNames := QuotedEventsTableColumnNames() + // Copy from Amplitude to cappedBuffer in a separate goroutine in parallel + go func() { + for t := lastSyncedTime; t.Before(endOfSyncWindow); t = t.Add(PAGINATION_TIME_INTERVAL) { + startTime := t + endTime := t.Add(PAGINATION_TIME_INTERVAL - time.Hour) // -1 hour to ensure we don't overlap (Amplitude uses an inclusive end time) - insertSqlPrefix := "INSERT INTO " + quotedTrinoTablePath + "(" + quotedColumnNames + ")" + " VALUES " - currentSql := insertSqlPrefix - currentRowCount := 0 - - for _, event := range events { - rowValuesStatement := event.ToTrinoRow() - if rowValuesStatement == "" { - continue - } - - currentRowCount++ - if len(currentSql)+len(rowValuesStatement)+1 < syncerCommon.TRINO_MAX_QUERY_LENGTH { // +1 for the comma - if currentSql != insertSqlPrefix { - currentSql += "," + err := syncer.Amplitude.Export(jsonQueueWriter, startTime, endTime) + if err != nil && strings.Contains(err.Error(), "Raw data files were not found.") { + common.LogInfo(syncer.Config.CommonConfig, "No data found for the time range", startTime, "to", endTime, "- will retry later.") + break } - currentSql += rowValuesStatement - } else { - _, err := trino.ExecContext(ctx, currentSql) common.PanicIfError(syncer.Config.CommonConfig, err) - common.LogInfo(syncer.Config.CommonConfig, "Inserted", currentRowCount, "rows into table:", quotedTrinoTablePath) - currentSql = insertSqlPrefix + rowValuesStatement - currentRowCount = 1 } - } + common.LogInfo(syncer.Config.CommonConfig, "Finished exporting data from Amplitude.") + jsonQueueWriter.Close() + }() - if currentSql != insertSqlPrefix { - _, err := trino.ExecContext(ctx, currentSql) - common.PanicIfError(syncer.Config.CommonConfig, err) - common.LogInfo(syncer.Config.CommonConfig, "Inserted", currentRowCount, "rows into table:", quotedTrinoTablePath) - } -} + // Read from cappedBuffer and write to Iceberg + icebergSchemaColumns := EventIcebergSchemaColumns(syncer.Config.CommonConfig) + icebergWriter := syncerCommon.NewIcebergWriter(syncer.Config.CommonConfig, syncer.StorageS3, syncer.DuckdbClient, icebergSchemaColumns, COMPRESSION_FACTOR) + icebergWriter.AppendFromJsonCappedBuffer(icebergTable, cursorValue, cappedBuffer) -func (syncer *Syncer) deleteHourFromTable(trino *syncerCommon.Trino, quotedTablePath string, startTime time.Time) { - result, err := trino.ExecContext( - context.Background(), - `DELETE FROM `+quotedTablePath+` WHERE "server_upload_time" >= TIMESTAMP '`+syncerCommon.TimeToUtcStringMs(startTime)+`'`, - ) - common.PanicIfError(syncer.Config.CommonConfig, err) - - rowCount, err := result.RowsAffected() - common.PanicIfError(syncer.Config.CommonConfig, err) - common.LogInfo(syncer.Config.CommonConfig, "Deleted", rowCount, "rows after", startTime) + syncerCommon.SendAnonymousAnalytics(syncer.Config.CommonConfig, "syncer-amplitude-finish", syncer.name()) } func (syncer *Syncer) name() string { diff --git a/src/syncer-common/go.mod b/src/syncer-common/go.mod index 4e790e0..1cc67a1 100644 --- a/src/syncer-common/go.mod +++ b/src/syncer-common/go.mod @@ -7,7 +7,6 @@ require ( github.com/google/uuid v1.6.0 github.com/linkedin/goavro v2.1.0+incompatible github.com/marcboeker/go-duckdb/v2 v2.3.2 - github.com/trinodb/trino-go-client v0.323.0 github.com/xitongsys/parquet-go v1.6.2 github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b golang.org/x/exp v0.0.0-20250718183923-645b1fa84792 @@ -38,35 +37,27 @@ require ( github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.35.0 // indirect github.com/aws/smithy-go v1.22.5 // indirect - github.com/duckdb/duckdb-go-bindings v0.1.17 // indirect - github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.12 // indirect - github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.12 // indirect - github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.12 // indirect - github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.12 // indirect - github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.12 // indirect + github.com/duckdb/duckdb-go-bindings v0.1.16 // indirect + github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11 // indirect + github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11 // indirect + github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11 // indirect + github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11 // indirect + github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11 // indirect github.com/go-viper/mapstructure/v2 v2.3.0 // indirect github.com/goccy/go-json v0.10.5 // indirect github.com/golang/snappy v1.0.0 // indirect github.com/google/flatbuffers v25.2.10+incompatible // indirect - github.com/hashicorp/go-uuid v1.0.3 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect github.com/jackc/pgx/v5 v5.7.5 // indirect - github.com/jcmturner/aescts/v2 v2.0.0 // indirect - github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect - github.com/jcmturner/gofork v1.7.6 // indirect - github.com/jcmturner/goidentity/v6 v6.0.1 // indirect - github.com/jcmturner/gokrb5/v8 v8.4.4 // indirect - github.com/jcmturner/rpc/v2 v2.0.3 // indirect github.com/klauspost/compress v1.18.0 // indirect github.com/klauspost/cpuid/v2 v2.2.11 // indirect - github.com/marcboeker/go-duckdb/arrowmapping v0.0.10 // indirect - github.com/marcboeker/go-duckdb/mapping v0.0.11 // indirect + github.com/marcboeker/go-duckdb/arrowmapping v0.0.9 // indirect + github.com/marcboeker/go-duckdb/mapping v0.0.10 // indirect github.com/pierrec/lz4/v4 v4.1.22 // indirect github.com/zeebo/xxh3 v1.0.2 // indirect golang.org/x/crypto v0.40.0 // indirect golang.org/x/mod v0.26.0 // indirect - golang.org/x/net v0.42.0 // indirect golang.org/x/sync v0.16.0 // indirect golang.org/x/sys v0.34.0 // indirect golang.org/x/text v0.27.0 // indirect diff --git a/src/syncer-common/go.sum b/src/syncer-common/go.sum index 61efc30..79719d8 100644 --- a/src/syncer-common/go.sum +++ b/src/syncer-common/go.sum @@ -68,8 +68,6 @@ cloud.google.com/go/trace v1.2.0/go.mod h1:Wc8y/uYyOhPy12KEnXG9XGrvfMz5F5SrYecQl contrib.go.opencensus.io/exporter/aws v0.0.0-20200617204711-c478e41e60e9/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= contrib.go.opencensus.io/exporter/stackdriver v0.13.10/go.mod h1:I5htMbyta491eUxufwwZPQdcKvvgzMB4O9ni41YnIM8= contrib.go.opencensus.io/integrations/ocsql v0.1.7/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= -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= github.com/Azure/azure-amqp-common-go/v3 v3.2.1/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= github.com/Azure/azure-amqp-common-go/v3 v3.2.2/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= @@ -93,8 +91,6 @@ github.com/Azure/azure-service-bus-go v0.11.5/go.mod h1:MI6ge2CuQWBVq+ly456MY7Xq github.com/Azure/azure-storage-blob-go v0.14.0/go.mod h1:SMqIBi+SuiQH32bvyjngEewEeXoPfKMgWlBDaYf6fck= github.com/Azure/go-amqp v0.16.0/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= github.com/Azure/go-amqp v0.16.4/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= -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/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= github.com/Azure/go-autorest/autorest v0.11.19/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= @@ -117,13 +113,7 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/GoogleCloudPlatform/cloudsql-proxy v1.29.0/go.mod h1:spvB9eLJH9dutlbPSRmHvSXXHOwGRyeXh1jVdquA2G8= 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/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/ahmetb/dlog v0.0.0-20170105205344-4fb5f8204f26 h1:3YVZUqkoev4mL+aCwVOSWV4M7pN+NURHL38Z2zq5JKA= -github.com/ahmetb/dlog v0.0.0-20170105205344-4fb5f8204f26/go.mod h1:ymXt5bw5uSNu4jveerFxE0vNYxF8ncqbptntMaFMg3k= github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= @@ -221,8 +211,6 @@ github.com/aws/smithy-go v1.22.5 h1:P9ATCXPMb2mPjYBgueqJNCA5S9UfktsW0tTxi+a7eqw= github.com/aws/smithy-go v1.22.5/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/bobg/gcsobj v0.1.2/go.mod h1:vS49EQ1A1Ib8FgrL58C8xXYZyOCR2TgzAdopy6/ipa8= -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/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= @@ -241,8 +229,6 @@ github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/colinmarc/hdfs/v2 v2.1.1/go.mod h1:M3x+k8UKKmxtFu++uAZ0OtDU8jR3jnaZIAc6yK4Ue0c= -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/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= @@ -257,26 +243,18 @@ github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQ github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -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/duckdb/duckdb-go-bindings v0.1.17 h1:SjpRwrJ7v0vqnIvLeVFHlhuS72+Lp8xxQ5jIER2LZP4= -github.com/duckdb/duckdb-go-bindings v0.1.17/go.mod h1:pBnfviMzANT/9hi4bg+zW4ykRZZPCXlVuvBWEcZofkc= -github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.12 h1:8CLBnsq9YDhi2Gmt3sjSUeXxMzyMQAKefjqUy9zVPFk= -github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.12/go.mod h1:Ezo7IbAfB8NP7CqPIN8XEHKUg5xdRRQhcPPlCXImXYA= -github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.12 h1:wjO4I0GhMh2xIpiUgRpzuyOT4KxXLoUS/rjU7UUVvCE= -github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.12/go.mod h1:eS7m/mLnPQgVF4za1+xTyorKRBuK0/BA44Oy6DgrGXI= -github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.12 h1:HzKQi2C+1jzmwANsPuYH6x9Sfw62SQTjNAEq3OySKFI= -github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.12/go.mod h1:1GOuk1PixiESxLaCGFhag+oFi7aP+9W8byymRAvunBk= -github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.12 h1:YGSR7AFLw2gJ7IbgLE6DkKYmgKv1LaRSd/ZKF1yh2oE= -github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.12/go.mod h1:o7crKMpT2eOIi5/FY6HPqaXcvieeLSqdXXaXbruGX7w= -github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.12 h1:2aduW6fnFnT2Q45PlIgHbatsPOxV9WSZ5B2HzFfxaxA= -github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.12/go.mod h1:IlOhJdVKUJCAPj3QsDszUo8DVdvp1nBFp4TUJVdw99s= +github.com/duckdb/duckdb-go-bindings v0.1.16 h1:XPCk9hzP06PoWIxDPVU3gAy0m1XmLaZHTzLggNx/U9k= +github.com/duckdb/duckdb-go-bindings v0.1.16/go.mod h1:pBnfviMzANT/9hi4bg+zW4ykRZZPCXlVuvBWEcZofkc= +github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11 h1:GXQkG4HmEbwPtqCSabJTp9wZQQ7Gqr3KveLNesQWQOs= +github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11/go.mod h1:Ezo7IbAfB8NP7CqPIN8XEHKUg5xdRRQhcPPlCXImXYA= +github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11 h1:ATJMSBIDA/YAm/6CKeBDRtGK1OOwqfTZbWg9Y5fAc9E= +github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11/go.mod h1:eS7m/mLnPQgVF4za1+xTyorKRBuK0/BA44Oy6DgrGXI= +github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11 h1:AjvnGst1avyOECYiykthyHR4DTYTaqNDPr5W/0t5j0k= +github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11/go.mod h1:1GOuk1PixiESxLaCGFhag+oFi7aP+9W8byymRAvunBk= +github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11 h1:j3B1biawuhtxe2Chkiqcwf1Kxe8VJc8lLVmjBIcJrkI= +github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11/go.mod h1:o7crKMpT2eOIi5/FY6HPqaXcvieeLSqdXXaXbruGX7w= +github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11 h1:xR3vRE8y+48U6xDNkUlOfbl7/OTA7FVcDXJ+5vETuHU= +github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11/go.mod h1:IlOhJdVKUJCAPj3QsDszUo8DVdvp1nBFp4TUJVdw99s= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= 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= @@ -317,17 +295,12 @@ github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= 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/golang-jwt/jwt v3.2.1+incompatible h1:73Z+4BJcrTC+KczS6WvTPvRGOp1WmfEP4Q1lOd9Z/+c= github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.4.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= -github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188/go.mod h1:vXjM/+wXQnTPR4KqTKDgJukSZ6amVRtWMPEjE6sQoK8= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -414,8 +387,6 @@ github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -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/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -429,18 +400,11 @@ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5m github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ= -github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= -github.com/gorilla/sessions v1.2.1 h1:DHd3rPN5lE3Ts3D8rKkQ8x/0kqfeNmBAaiSi+o7FsgI= -github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/hanwen/go-fuse v1.0.0/go.mod h1:unqXarDXqzAk0rt98O2tVndEPIpUgLD9+rwFisZH3Ok= github.com/hanwen/go-fuse/v2 v2.1.0/go.mod h1:oRyA5eK+pvJyv5otpO/DgccS8y/RvYMaO00GgRLGryc= github.com/hashicorp/go-uuid v0.0.0-20180228145832-27454136f036/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= -github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= 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= @@ -491,19 +455,7 @@ github.com/jackc/puddle v1.2.1 h1:gI8os0wpRXFd4FiAY2dWiqRK037tjj3t7rKFeO4X5iw= github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= -github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= -github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= -github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo= -github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= github.com/jcmturner/gofork v0.0.0-20180107083740-2aebee971930/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= -github.com/jcmturner/gofork v1.7.6 h1:QH0l3hzAU1tfT3rZCnW5zXl+orbkNMMRGJfdJjHVETg= -github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo= -github.com/jcmturner/goidentity/v6 v6.0.1 h1:VKnZd2oEIMorCTsFBnJWbExfNN7yZr3EhJAxwOkZg6o= -github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= -github.com/jcmturner/gokrb5/v8 v8.4.4 h1:x1Sv4HaTpepFkXbt2IkL29DXRf8sOfZXo8eRKh687T8= -github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs= -github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY= -github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= @@ -546,10 +498,10 @@ github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/linkedin/goavro v2.1.0+incompatible h1:DV2aUlj2xZiuxQyvag8Dy7zjY69ENjS66bWkSfdpddY= github.com/linkedin/goavro v2.1.0+incompatible/go.mod h1:bBCwI2eGYpUI/4820s67MElg9tdeLbINjLjiM2xZFYM= -github.com/marcboeker/go-duckdb/arrowmapping v0.0.10 h1:G1W+GVnUefR8uy7jHdNO+CRMsmFG5mFPIHVAespfFCA= -github.com/marcboeker/go-duckdb/arrowmapping v0.0.10/go.mod h1:jccUb8TYD0p5TsEEeN4SXuslNJHo23QaKOqKD+U6uFU= -github.com/marcboeker/go-duckdb/mapping v0.0.11 h1:fusN1b1l7Myxafifp596I6dNLNhN5Uv/rw31qAqBwqw= -github.com/marcboeker/go-duckdb/mapping v0.0.11/go.mod h1:aYBjFLgfKO0aJIbDtXPiaL5/avRQISveX/j9tMf9JhU= +github.com/marcboeker/go-duckdb/arrowmapping v0.0.9 h1:xj+kFOqR2gH3Mcxx9LmAVHebSnCiPm303N+uxfkWVmY= +github.com/marcboeker/go-duckdb/arrowmapping v0.0.9/go.mod h1:o56AqVS90v5bpxhPnOK9La7AfNTOrMORiqTQrlRbdPQ= +github.com/marcboeker/go-duckdb/mapping v0.0.10 h1:b/y2W8/hNlD0Dwjq0mCqIlLXpjQMnWy0WqDV9b9lHQQ= +github.com/marcboeker/go-duckdb/mapping v0.0.10/go.mod h1:Ro6Tw6sGG50O8S0daZsA8TrQJz/DvGrzGvMD7Jihirw= github.com/marcboeker/go-duckdb/v2 v2.3.2 h1:96zG2JPyIhCFjHdBjjSpOdhzJzehoGTdl7LskkuMUTs= github.com/marcboeker/go-duckdb/v2 v2.3.2/go.mod h1:VeXz9ZM6klNvICHrXEUzaHSgNqBeTdyMxr4CICw/UaY= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= @@ -568,12 +520,6 @@ github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -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/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= @@ -582,14 +528,6 @@ github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3P github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/ncw/swift v1.0.52/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -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/pborman/getopt v0.0.0-20180729010549-6fdd0a2c7117/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= github.com/pierrec/lz4/v4 v4.1.8/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= @@ -598,7 +536,6 @@ github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= 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/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= @@ -616,15 +553,11 @@ github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFR 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.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= -github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= 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.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -633,20 +566,10 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 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.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/trinodb/trino-go-client v0.323.0 h1:I7Y67um1NnrwKCThzGr8o0xYUldb+n4vPn5R/qUxW2E= -github.com/trinodb/trino-go-client v0.323.0/go.mod h1:F+7TZRD0+0M8XqYsgXT8+EJT1pSlbxTECVD1BDzCc70= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -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/xitongsys/parquet-go v1.5.1/go.mod h1:xUxwM8ELydxh4edHGegYq1pA8NnMKDx0K/GyB0o2bww= github.com/xitongsys/parquet-go v1.6.2 h1:MhCaXii4eqceKPu9BwrjLqyK10oX9WF+xGhwvwbw7xM= github.com/xitongsys/parquet-go v1.6.2/go.mod h1:IulAQyalCm0rPiZVNnCgm/PCL64X2tdSVGMQ/UeKqWA= @@ -710,7 +633,6 @@ golang.org/x/crypto v0.0.0-20211115234514-b4de73f9ece8/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220511200225-c6db032c6c88/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM= @@ -809,8 +731,6 @@ golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs= -golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8= 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= @@ -1222,7 +1142,6 @@ gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/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= diff --git a/src/syncer-common/iceberg_catalog.go b/src/syncer-common/iceberg_catalog.go index 883ba53..ca54789 100644 --- a/src/syncer-common/iceberg_catalog.go +++ b/src/syncer-common/iceberg_catalog.go @@ -28,11 +28,11 @@ func NewIcebergCatalog(config *common.CommonConfig, schemaName string) *IcebergC } func (catalog *IcebergCatalog) TableNames() common.Set[string] { - pgClient := catalog.newPgClient() + pgClient := catalog.newPostgresClient() defer pgClient.Close() - ctx := context.Background() - rows, err := pgClient.Query(ctx, + rows, err := pgClient.Query( + context.Background(), "SELECT table_name FROM iceberg_tables WHERE table_namespace=$1 AND table_name NOT LIKE '%"+TEMP_TABLE_SUFFIX_SYNCING+"' AND table_name NOT LIKE '%"+TEMP_TABLE_SUFFIX_DELETING+"'", catalog.SchemaName, ) @@ -49,12 +49,12 @@ func (catalog *IcebergCatalog) TableNames() common.Set[string] { return tableNames } -func (catalog *IcebergCatalog) S3TablePath(icebergTableName string) string { - pgClient := catalog.newPgClient() +func (catalog *IcebergCatalog) MetadataFileS3Path(icebergTableName string) string { + pgClient := catalog.newPostgresClient() defer pgClient.Close() - ctx := context.Background() - row := pgClient.QueryRow(ctx, + row := pgClient.QueryRow( + context.Background(), "SELECT metadata_location FROM iceberg_tables WHERE table_namespace=$1 AND table_name=$2", catalog.SchemaName, icebergTableName, @@ -67,15 +67,24 @@ func (catalog *IcebergCatalog) S3TablePath(icebergTableName string) string { } common.PanicIfError(catalog.Config, err) - return strings.Split(nullPath.String, "/metadata/")[0] + return nullPath.String +} + +func (catalog *IcebergCatalog) TableS3Path(icebergTableName string) string { + metadataFileS3Path := catalog.MetadataFileS3Path(icebergTableName) + if metadataFileS3Path == "" { + return "" + } + + return strings.Split(metadataFileS3Path, "/metadata/")[0] } func (catalog *IcebergCatalog) RenameTable(oldIcebergTableName string, newIcebergTableName string) { - pgClient := catalog.newPgClient() + pgClient := catalog.newPostgresClient() defer pgClient.Close() - ctx := context.Background() - _, err := pgClient.Exec(ctx, + _, err := pgClient.Exec( + context.Background(), "UPDATE iceberg_tables SET table_name=$1 WHERE table_namespace=$2 AND table_name=$3", newIcebergTableName, catalog.SchemaName, @@ -85,11 +94,11 @@ func (catalog *IcebergCatalog) RenameTable(oldIcebergTableName string, newIceber } func (catalog *IcebergCatalog) DeleteTable(icebergTableName string) { - pgClient := catalog.newPgClient() + pgClient := catalog.newPostgresClient() defer pgClient.Close() - ctx := context.Background() - _, err := pgClient.Exec(ctx, + _, err := pgClient.Exec( + context.Background(), "DELETE FROM iceberg_tables WHERE table_namespace=$1 AND table_name=$2", catalog.SchemaName, icebergTableName, @@ -98,11 +107,11 @@ func (catalog *IcebergCatalog) DeleteTable(icebergTableName string) { } func (catalog *IcebergCatalog) CreateTable(icebergTableName string, metadataLocation string) { - pgClient := catalog.newPgClient() + pgClient := catalog.newPostgresClient() defer pgClient.Close() - ctx := context.Background() - _, err := pgClient.Exec(ctx, + _, err := pgClient.Exec( + context.Background(), "INSERT INTO iceberg_tables (catalog_name, table_namespace, table_name, metadata_location) VALUES ($1, $2, $3, $4)", CATALOG_NAME, catalog.SchemaName, @@ -112,6 +121,6 @@ func (catalog *IcebergCatalog) CreateTable(icebergTableName string, metadataLoca common.PanicIfError(catalog.Config, err) } -func (catalog *IcebergCatalog) newPgClient() *common.PostgresClient { +func (catalog *IcebergCatalog) newPostgresClient() *common.PostgresClient { return common.NewPostgresClient(catalog.Config, catalog.Config.CatalogDatabaseUrl) } diff --git a/src/syncer-common/iceberg_schema_column.go b/src/syncer-common/iceberg_schema_column.go index ebe98cc..e489b67 100644 --- a/src/syncer-common/iceberg_schema_column.go +++ b/src/syncer-common/iceberg_schema_column.go @@ -2,8 +2,11 @@ package syncerCommon import ( "encoding/csv" + "encoding/json" + "fmt" "math" "math/big" + "reflect" "strings" "time" @@ -30,19 +33,26 @@ const ( BEMIDB_NULL_STRING = "BEMIDB_NULL" - PARQUET_NESTED_FIELD_ID_PREFIX = 1000 PARQUET_NAN = 0 // DuckDB crashes on NaN, libc++abi: terminating due to uncaught exception of type duckdb::InvalidConfigurationException: {"exception_type":"Invalid Configuration","exception_message":"Column float4_column lower bound deserialization failed: Failed to deserialize blob '' of size 0, attempting to produce value of type 'FLOAT'"} + PARQUET_MAX_DECIMAL_PRECISION = 38 + PARQUET_FALLBACK_DECIMAL_SCALE = 6 + PARQUET_NESTED_FIELD_ID_PREFIX = 1000 + + PG_USER_DEFINED_PRIMITIVE_TYPE = "USER_DEFINED" ) type IcebergSchemaColumn struct { - Config *common.CommonConfig - ColumnName string - ColumnType IcebergColumnType - Position int - NumericPrecision int - NumericScale int - IsList bool - IsNullable bool + Config *common.CommonConfig + ColumnName string + ColumnType IcebergColumnType + Position int + NumericPrecision int + NumericScale int + DatetimePrecision int + IsList bool + IsRequired bool + IsPartOfUniqueIndex bool + PgPrimitiveColumnType string } type ParquetSchemaField struct { @@ -76,15 +86,15 @@ func (col *IcebergSchemaColumn) QuotedColumnName() string { } func (col *IcebergSchemaColumn) NormalizedPrecision() int { - if col.NumericPrecision > TRINO_MAX_DECIMAL_PRECISION || col.NumericPrecision == 0 { - return TRINO_MAX_DECIMAL_PRECISION + if col.NumericPrecision > PARQUET_MAX_DECIMAL_PRECISION || col.NumericPrecision == 0 { + return PARQUET_MAX_DECIMAL_PRECISION } return col.NumericPrecision } func (col *IcebergSchemaColumn) NormalizedScale() int { if col.NumericPrecision == 0 { - return TRINO_FALLBACK_DECIMAL_SCALE + return PARQUET_FALLBACK_DECIMAL_SCALE } return col.NumericScale } @@ -124,11 +134,7 @@ func (col *IcebergSchemaColumn) IcebergSchemaFieldMap() IcebergSchemaField { panic("Unsupported column type: " + string(col.ColumnType)) } - if col.IsNullable { - icebergSchemaField.Required = false - } else { - icebergSchemaField.Required = true - } + icebergSchemaField.Required = col.IsRequired if col.IsList { icebergSchemaField.Type = map[string]interface{}{ @@ -208,6 +214,23 @@ func (col *IcebergSchemaColumn) DuckdbValueFromCsv(value string) interface{} { return col.duckdbPrimitiveValueFromCsv(value) } +func (col *IcebergSchemaColumn) DuckdbValueFromJson(value any) interface{} { + if value == nil { + return nil + } + + if col.IsList { + var values []interface{} + for _, itemValue := range value.([]any) { + primitiveValue := col.duckdbPrimitiveValueFromJson(itemValue) + values = append(values, primitiveValue) + } + return values + } + + return col.duckdbPrimitiveValueFromJson(value) +} + func (col *IcebergSchemaColumn) duckdbPrimitiveValueFromCsv(value string) interface{} { switch col.ColumnType { case IcebergColumnTypeBoolean: @@ -221,39 +244,48 @@ func (col *IcebergSchemaColumn) duckdbPrimitiveValueFromCsv(value string) interf case IcebergColumnTypeLong: return StringToInt64(value) case IcebergColumnTypeFloat: - floatValue := StringToFloat64(value) - if math.IsNaN(floatValue) { + valueFloat := StringToFloat64(value) + if math.IsNaN(valueFloat) { return PARQUET_NAN } - return float32(floatValue) + return float32(valueFloat) case IcebergColumnTypeDouble: - floatValue := StringToFloat64(value) - if math.IsNaN(floatValue) { + valueFloat := StringToFloat64(value) + if math.IsNaN(valueFloat) { return PARQUET_NAN } - return floatValue + return valueFloat case IcebergColumnTypeDecimal: - scale := col.NormalizedScale() - parts := strings.Split(value, ".") - integerPart := parts[0] - - // Pad fractional part with zeros if necessary - var fractionalPart string - if len(parts) == 1 { - fractionalPart = strings.Repeat("0", scale) - } else { - fractionalPart = parts[1] - if len(fractionalPart) < scale { - fractionalPart += strings.Repeat("0", scale-len(fractionalPart)) - } - } - decimalValue := new(big.Int) - decimalValue.SetString(integerPart+fractionalPart, 10) + switch col.PgPrimitiveColumnType { + case "interval": + microseconds := 0 - return duckdb.Decimal{ - Width: uint8(col.NormalizedPrecision()), - Scale: uint8(scale), - Value: decimalValue, + parts := strings.Split(value, " ") + for i, part := range parts { + if strings.HasPrefix(part, "year") { + common.Panic(col.Config, "Year intervals are not supported yet") + } else if strings.HasPrefix(part, "mon") { + months := StringToInt(parts[i-1]) + microseconds += months * 30_437_500 * 24 * 60 * 60 // Approximation: 30.4375 days per month + } else if strings.HasPrefix(part, "day") { + days := StringToInt(parts[i-1]) + microseconds += days * 24 * 60 * 60 * 1_000_000 + } else if strings.Contains(part, ":") { + timeParts := strings.Split(part, ":") + hours := StringToInt(timeParts[0]) + minutes := StringToInt(timeParts[1]) + secondsParts := strings.Split(timeParts[2], ".") + seconds := StringToInt(secondsParts[0]) + microseconds += (hours * 60 * 60 * 1_000_000) + (minutes * 60 * 1_000_000) + (seconds * 1_000_000) + if len(secondsParts) > 1 && len(secondsParts[1]) == 6 { + microseconds += StringToInt(secondsParts[1]) + } + } + } + valueMicrosecondsString := common.IntToString(microseconds) + return col.duckdbDecimal(valueMicrosecondsString) + default: + return col.duckdbDecimal(value) } case IcebergColumnTypeDate: return StringDateToTime(value) @@ -280,3 +312,152 @@ func (col *IcebergSchemaColumn) duckdbPrimitiveValueFromCsv(value string) interf panic("Unsupported value: " + value + " for column type: " + string(col.ColumnType)) } + +func (col *IcebergSchemaColumn) duckdbPrimitiveValueFromJson(value any) interface{} { + kind := reflect.TypeOf(value).Kind() + + switch col.ColumnType { + case IcebergColumnTypeInteger, + IcebergColumnTypeLong, + IcebergColumnTypeFloat, + IcebergColumnTypeDouble: + switch kind { + case reflect.Bool: + if value.(bool) { + return 1 + } else { + return 0 + } + case reflect.String: + if value.(string) == "NaN" { + return PARQUET_NAN + } + default: + return value + } + case IcebergColumnTypeDecimal: + valueString := Float64ToString(value.(float64)) + return col.duckdbDecimal(valueString) + case IcebergColumnTypeBinary: + return []byte("\\x" + value.(string)) + case IcebergColumnTypeBoolean: + switch kind { + case reflect.String: + return value.(string) == "true" + default: + return value + } + case IcebergColumnTypeString: + switch col.PgPrimitiveColumnType { + case "bpchar": + return strings.TrimRight(value.(string), " ") + case "point": + valueMap := value.(map[string]interface{}) + return "(" + Float64ToString(valueMap["x"].(float64)) + "," + Float64ToString(valueMap["y"].(float64)) + ")" + case PG_USER_DEFINED_PRIMITIVE_TYPE: + valueString := value.(string) + valueDecodedHex, err := HexToString(valueString) + if err == nil { + return valueDecodedHex + } else { + return valueString + } + } + + switch kind { + case reflect.Map: + jsonBytes, err := json.Marshal(value) + common.PanicIfError(col.Config, err) + return string(jsonBytes) + case reflect.Float64: + return Float64ToString(value.(float64)) + default: + return value + } + case IcebergColumnTypeDate: + days := value.(float64) + return time.Unix(0, 0).UTC().AddDate(0, 0, int(days)) + case IcebergColumnTypeTime: + var nanoseconds int64 + if col.DatetimePrecision == 6 { + nanoseconds = int64(value.(float64)) * 1_000 + } else { + nanoseconds = int64(value.(float64)) * 1_000_000 + } + valueTime := time.Unix(0, nanoseconds).UTC() + return valueTime + case IcebergColumnTypeTimeTz: + valueString := value.(string) + if valueString == "" { + return nil + } + if strings.HasSuffix(valueString, "Z") { + valueString = strings.TrimSuffix(valueString, "Z") + "-00" + } + parsedTime, err := time.Parse("15:04:05.999999-07", valueString) + common.PanicIfError(col.Config, err) + return parsedTime + case IcebergColumnTypeTimestamp: + switch kind { + case reflect.String: + valueString := value.(string) + if valueString == "" { + return nil + } + parsedTimestamp, err := time.Parse("2006-01-02 15:04:05.999999", valueString) + common.PanicIfError(col.Config, err) + return parsedTimestamp + case reflect.Float64: + valueFloat := value.(float64) + epoch := time.Unix(0, 0).UTC() + if col.DatetimePrecision == 6 { + microseconds := int64(valueFloat) + return epoch.Add(time.Duration(microseconds) * time.Microsecond) + } + milliseconds := int64(valueFloat) + return epoch.Add(time.Duration(milliseconds) * time.Millisecond) + } + case IcebergColumnTypeTimestampTz: + valueString := value.(string) + if valueString == "" { + return nil + } + if strings.HasSuffix(valueString, "Z") { + valueString = strings.TrimSuffix(valueString, "Z") + "-00" + } + + parsedTimestamp, err := time.Parse("2006-01-02T15:04:05.999999-07:00", valueString) + if err != nil { + parsedTimestamp, err = time.Parse("2006-01-02T15:04:05.999999-07", valueString) + common.PanicIfError(col.Config, err) + } + return parsedTimestamp + } + + panic(fmt.Sprintf("Unsupported value: %v for column type: %s", value, col.ColumnType)) +} + +func (col *IcebergSchemaColumn) duckdbDecimal(value string) duckdb.Decimal { + scale := col.NormalizedScale() + parts := strings.Split(value, ".") + integerPart := parts[0] + + // Pad fractional part with zeros if necessary + var fractionalPart string + if len(parts) == 1 { + fractionalPart = strings.Repeat("0", scale) + } else { + fractionalPart = parts[1] + if len(fractionalPart) < scale { + fractionalPart += strings.Repeat("0", scale-len(fractionalPart)) + } + } + decimalValue := new(big.Int) + decimalValue.SetString(integerPart+fractionalPart, 10) + + return duckdb.Decimal{ + Width: uint8(col.NormalizedPrecision()), + Scale: uint8(scale), + Value: decimalValue, + } +} diff --git a/src/syncer-common/iceberg_table.go b/src/syncer-common/iceberg_table.go index 774b381..fcb6e9d 100644 --- a/src/syncer-common/iceberg_table.go +++ b/src/syncer-common/iceberg_table.go @@ -1,42 +1,60 @@ package syncerCommon import ( - "github.com/BemiHQ/BemiDB/src/common" + "context" + "github.com/google/uuid" + + "github.com/BemiHQ/BemiDB/src/common" ) type IcebergTable struct { - Config *common.CommonConfig - SchemaName string - TableName string - IcebergCatalog *IcebergCatalog - StorageS3 *StorageS3 - GeneratedS3TablePath string + Config *common.CommonConfig + SchemaName string + TableName string + IcebergCatalog *IcebergCatalog + StorageS3 *StorageS3 + DuckdbClient *common.DuckdbClient +} + +type CursorValue struct { + ColumnName string + StringValue string + OverrideRows bool // Override rows that have the same value as this cursor value (if new rows are added with the same value, they will be included in the next sync) } -func NewIcebergTable(config *common.CommonConfig, storageS3 *StorageS3, schemaName string, tableName string) *IcebergTable { +func NewIcebergTable(config *common.CommonConfig, storageS3 *StorageS3, duckdbClient *common.DuckdbClient, schemaName string, tableName string) *IcebergTable { return &IcebergTable{ Config: config, SchemaName: schemaName, TableName: tableName, IcebergCatalog: NewIcebergCatalog(config, schemaName), StorageS3: storageS3, + DuckdbClient: duckdbClient, } } -func (table *IcebergTable) Create() { +func (table *IcebergTable) String() string { + return table.SchemaName + "." + table.TableName +} + +func (table *IcebergTable) MetadataFileS3Path() string { + return table.IcebergCatalog.MetadataFileS3Path(table.TableName) +} + +func (table *IcebergTable) Create(tableS3Path string) { common.LogInfo(table.Config, "Creating Iceberg table:", table.TableName) - table.IcebergCatalog.CreateTable(table.TableName, table.GeneratedS3TablePath+"/metadata/"+ICEBERG_METADATA_INITIAL_FILE_NAME) + table.IcebergCatalog.CreateTable(table.TableName, tableS3Path+"/metadata/"+ICEBERG_METADATA_INITIAL_FILE_NAME) } func (table *IcebergTable) DeleteIfExists() { - s3TablePath := table.IcebergCatalog.S3TablePath(table.TableName) - if s3TablePath == "" { + tableS3Path := table.IcebergCatalog.TableS3Path(table.TableName) + if tableS3Path == "" { return } common.LogInfo(table.Config, "Deleting Iceberg table:", table.TableName) - table.StorageS3.DeleteTableFiles(s3TablePath) + table.StorageS3.DeleteTableFiles(tableS3Path) table.IcebergCatalog.DeleteTable(table.TableName) } @@ -46,6 +64,32 @@ func (table *IcebergTable) Rename(newName string) { table.TableName = newName } -func (table *IcebergTable) GenerateS3TablePath() { - table.GeneratedS3TablePath = "s3://" + table.Config.Aws.S3Bucket + "/iceberg/" + table.SchemaName + "/" + table.TableName + "-" + uuid.New().String() +func (table *IcebergTable) GenerateTableS3Path() string { + return "s3://" + table.Config.Aws.S3Bucket + "/iceberg/" + table.SchemaName + "/" + table.TableName + "-" + uuid.New().String() +} + +func (table *IcebergTable) LastCursorValue(columnName string) CursorValue { + if columnName == "" { + common.Panic(table.Config, "Couldn't find cursor column for table "+table.TableName) + } + + metadataFileS3Path := table.IcebergCatalog.MetadataFileS3Path(table.TableName) + if metadataFileS3Path == "" { + common.LogDebug(table.Config, "No S3 table path found for Iceberg table:", table.TableName) + return CursorValue{ColumnName: columnName} + } + + row := table.DuckdbClient.QueryRowContext( + context.Background(), + `SELECT CAST(max("`+columnName+`") AS VARCHAR) FROM iceberg_scan('`+metadataFileS3Path+`')`, + ) + if row == nil { + return CursorValue{ColumnName: columnName} + } + + var lastCursorValue string + err := row.Scan(&lastCursorValue) + common.PanicIfError(table.Config, err) + + return CursorValue{ColumnName: columnName, StringValue: lastCursorValue} } diff --git a/src/syncer-common/iceberg_writer.go b/src/syncer-common/iceberg_writer.go index da00414..73abcb8 100644 --- a/src/syncer-common/iceberg_writer.go +++ b/src/syncer-common/iceberg_writer.go @@ -1,61 +1,590 @@ package syncerCommon import ( + "context" + "database/sql/driver" + "encoding/csv" + "io" + "sort" + "strings" + + "github.com/google/uuid" + "github.com/BemiHQ/BemiDB/src/common" - "github.com/marcboeker/go-duckdb/v2" +) + +const ( + MAX_ICEBERG_WRITER_BATCH_SIZE = 1024 * 1024 * 1024 // 1 GB + MAX_PARQUET_FILE_SIZE = 100 * 1024 * 1024 // 100 MB ) type IcebergWriter struct { Config *common.CommonConfig IcebergSchemaColumns []*IcebergSchemaColumn StorageS3 *StorageS3 + DuckdbClient *common.DuckdbClient + CompressionFactor int64 } -func NewIcebergWriter(config *common.CommonConfig, storageS3 *StorageS3, icebergSchemaColumns []*IcebergSchemaColumn) *IcebergWriter { +func NewIcebergWriter( + config *common.CommonConfig, + storageS3 *StorageS3, + duckdbClient *common.DuckdbClient, + icebergSchemaColumns []*IcebergSchemaColumn, + compressionFactor int64, +) *IcebergWriter { return &IcebergWriter{ Config: config, IcebergSchemaColumns: icebergSchemaColumns, StorageS3: storageS3, + DuckdbClient: duckdbClient, + CompressionFactor: compressionFactor, + } +} + +func (writer *IcebergWriter) InsertFromCsvCappedBuffer(icebergTable *IcebergTable, cappedBuffer *CappedBuffer) { + csvReader := csv.NewReader(cappedBuffer) + _, err := csvReader.Read() // Read the header row + common.PanicIfError(writer.Config, err) + + writer.insertRows(icebergTable, func(duckdbTableName string, loadedSize int64) (int, bool) { + return writer.loadCsvRows(duckdbTableName, csvReader, loadedSize) + }) +} + +func (writer *IcebergWriter) AppendFromCsvCappedBuffer(icebergTable *IcebergTable, cursorValue CursorValue, cappedBuffer *CappedBuffer) { + metadataFileS3Path := icebergTable.MetadataFileS3Path() + if metadataFileS3Path == "" { // If the table does not exist, insert for the first time + writer.InsertFromCsvCappedBuffer(icebergTable, cappedBuffer) + return + } + + csvReader := csv.NewReader(cappedBuffer) + _, err := csvReader.Read() // Read the header row + common.PanicIfError(writer.Config, err) + + writer.appendRows(metadataFileS3Path, cursorValue, func(duckdbTableName string, loadedSize int64) (int, bool) { + return writer.loadCsvRows(duckdbTableName, csvReader, loadedSize) + }) +} + +func (writer *IcebergWriter) InsertFromJsonCappedBuffer(icebergTable *IcebergTable, cappedBuffer *CappedBuffer) { + jsonQueueReader := NewJsonQueueReader(cappedBuffer) + + writer.insertRows(icebergTable, func(duckdbTableName string, loadedSize int64) (int, bool) { + return writer.loadJsonRows(duckdbTableName, jsonQueueReader, loadedSize) + }) +} + +func (writer *IcebergWriter) AppendFromJsonCappedBuffer(icebergTable *IcebergTable, cursorValue CursorValue, cappedBuffer *CappedBuffer) { + metadataFileS3Path := icebergTable.MetadataFileS3Path() + if metadataFileS3Path == "" { // If the table does not exist, insert for the first time + writer.InsertFromJsonCappedBuffer(icebergTable, cappedBuffer) + return + } + + jsonQueueReader := NewJsonQueueReader(cappedBuffer) + + writer.appendRows(metadataFileS3Path, cursorValue, func(duckdbTableName string, loadedSize int64) (int, bool) { + return writer.loadJsonRows(duckdbTableName, jsonQueueReader, loadedSize) + }) +} + +func (writer *IcebergWriter) UpdateFromJsonCappedBuffer(icebergTable *IcebergTable, cappedBuffer *CappedBuffer) { + metadataFileS3Path := icebergTable.MetadataFileS3Path() + if metadataFileS3Path == "" { // If the table does not exist, insert for the first time + writer.InsertFromJsonCappedBuffer(icebergTable, cappedBuffer) + return } + + jsonQueueReader := NewJsonQueueReader(cappedBuffer) + + uniqueIndexColumnNames := writer.UniqueIndexColumnNames(icebergTable) + writer.updateRows(metadataFileS3Path, uniqueIndexColumnNames, func(duckdbTableName string, loadedSize int64) (int, bool) { + return writer.loadJsonRows(duckdbTableName, jsonQueueReader, loadedSize) + }) +} + +func (writer *IcebergWriter) DeleteFromJsonCappedBuffer(icebergTable *IcebergTable, cappedBuffer *CappedBuffer) { + metadataFileS3Path := icebergTable.MetadataFileS3Path() + if metadataFileS3Path == "" { // If the table does not exist, do nothing + return + } + + jsonQueueReader := NewJsonQueueReader(cappedBuffer) + + uniqueIndexColumnNames := writer.UniqueIndexColumnNames(icebergTable) + writer.deleteRows(metadataFileS3Path, uniqueIndexColumnNames, func(duckdbTableName string, loadedSize int64) (int, bool) { + return writer.loadJsonRows(duckdbTableName, jsonQueueReader, loadedSize) + }) +} + +func (writer *IcebergWriter) UniqueIndexColumnNames(icebergTable *IcebergTable) []string { + uniqueIndexColumnNames := []string{} + for _, icebergSchemaColumn := range writer.IcebergSchemaColumns { + if icebergSchemaColumn.IsPartOfUniqueIndex { + uniqueIndexColumnNames = append(uniqueIndexColumnNames, icebergSchemaColumn.ColumnName) + } + } + if len(uniqueIndexColumnNames) == 0 { + common.Panic(writer.Config, "Cannot update Iceberg table without unique index columns: "+icebergTable.String()) + } + return uniqueIndexColumnNames } -func (writer *IcebergWriter) Write(s3TablePath string, loadRows func(appender *duckdb.Appender) (rowCount int, reachedEnd bool)) { - s3DataPath := s3TablePath + "/data" - s3MetadataPath := s3TablePath + "/metadata" +func (writer *IcebergWriter) insertRows(icebergTable *IcebergTable, loadRowsToDuckdbTableFunc func(duckdbTableName string, loadedSize int64) (loadedRowCount int, reachedEnd bool)) { + tableS3Path := icebergTable.GenerateTableS3Path() + dataS3Path := tableS3Path + "/data" + metadataS3Path := tableS3Path + "/metadata" + var newParquetCount int var lastSequenceNumber int + var firstNewParquetFileUuid string newManifestListItemsSortedDesc := []ManifestListItem{} - finalManifestListFilesSortedAsc := []ManifestListFile{} + var newManifestListFile ManifestListFile + + for { + tempDuckdbTableName := writer.createTempDuckdbTable() + defer writer.deleteTempDuckdbTable(tempDuckdbTableName) + + loadedRowCount, reachedEnd := loadRowsToDuckdbTableFunc(tempDuckdbTableName, 0) + if loadedRowCount == 0 && newParquetCount > 0 { + break + } + + // Create parquet + newParquetFile := writer.StorageS3.CreateParquet(dataS3Path, writer.DuckdbClient, tempDuckdbTableName, writer.IcebergSchemaColumns, loadedRowCount) + common.LogDebug(writer.Config, "Parquet file with", newParquetFile.RecordCount, "record(s) created at:", newParquetFile.Key) + if firstNewParquetFileUuid == "" { + firstNewParquetFileUuid = newParquetFile.Uuid + } + + // Create manifest + lastSequenceNumber++ + newManifestFile := writer.StorageS3.CreateManifest(metadataS3Path, newParquetFile) + newManifestListItem := ManifestListItem{SequenceNumber: lastSequenceNumber, ManifestFile: newManifestFile} + newManifestListItemsSortedDesc = append([]ManifestListItem{newManifestListItem}, newManifestListItemsSortedDesc...) + + // Create manifest list + previousManifestListFile := newManifestListFile + newManifestListFile = writer.StorageS3.CreateManifestList(metadataS3Path, firstNewParquetFileUuid, newManifestListItemsSortedDesc) + + // Create metadata + writer.StorageS3.CreateMetadata(metadataS3Path, writer.IcebergSchemaColumns, []ManifestListFile{newManifestListFile}) + + newParquetCount++ + common.LogInfo(writer.Config, "Written", newParquetFile.RecordCount, "records in Parquet file #"+common.IntToString(newParquetCount), "("+writer.formattedParquetFileSize(newParquetFile.Size)+")") + + // Create table + if newParquetCount == 1 { + icebergTable.Create(tableS3Path) + } + + // Delete previous manifest list file + if previousManifestListFile.Key != "" { + writer.deleteObject(previousManifestListFile.Key) + } + + if reachedEnd { + break + } + } +} + +func (writer *IcebergWriter) appendRows(metadataFileS3Path string, cursorValue CursorValue, loadRowsToDuckdbTableFunc func(duckdbTableName string, loadedSize int64) (loadedRowCount int, reachedEnd bool)) { + tableS3Path := strings.Split(metadataFileS3Path, "/metadata/")[0] + metadataS3Path := tableS3Path + "/metadata" + dataS3Path := tableS3Path + "/data" + + existingManifestListFile := writer.StorageS3.LastManifestListFile(metadataFileS3Path) + existingManifestListItemsSortedDesc := writer.StorageS3.ManifestListItems(existingManifestListFile) + existingLastManifestListItem := existingManifestListItemsSortedDesc[0] + existingLastParquetFileS3Path, lastParquetFileSize := writer.StorageS3.ParquetFileInfo(existingLastManifestListItem.ManifestFile) - var firstNewParquetFile ParquetFile var newParquetCount int + lastSequenceNumber := existingLastManifestListItem.SequenceNumber + firstNewParquetFileUuid := existingManifestListFile.Uuid() + newManifestListItemsSortedDesc := existingManifestListItemsSortedDesc + + objectsToDeleteKeys := []string{} + replaceLastExistingParquetFile := lastParquetFileSize < MAX_PARQUET_FILE_SIZE + if replaceLastExistingParquetFile { + objectsToDeleteKeys = append(objectsToDeleteKeys, existingLastManifestListItem.ManifestFile.Key) + objectsToDeleteKeys = append(objectsToDeleteKeys, writer.StorageS3.S3Client.ObjectKey(existingLastParquetFileS3Path)) + newManifestListItemsSortedDesc = newManifestListItemsSortedDesc[1:] // Remove the last item to replace it + } for { - newParquetFile, reachedEnd := writer.StorageS3.CreateParquet(s3DataPath, writer.IcebergSchemaColumns, loadRows) - newParquetCount++ + tempDuckdbTableName := writer.createTempDuckdbTable() + defer writer.deleteTempDuckdbTable(tempDuckdbTableName) - if firstNewParquetFile.Key == "" { - firstNewParquetFile = newParquetFile + var initialLoadedRowCount int64 + if newParquetCount == 0 && replaceLastExistingParquetFile { + writer.insertToDuckdbTableFromParquet(tempDuckdbTableName, existingLastParquetFileS3Path, cursorValue) + initialLoadedRowCount = lastParquetFileSize * (MAX_ICEBERG_WRITER_BATCH_SIZE * writer.CompressionFactor / MAX_PARQUET_FILE_SIZE) } - newManifestFile, err := writer.StorageS3.CreateManifest(s3MetadataPath, newParquetFile) - common.PanicIfError(writer.Config, err) + loadedRowCount, reachedEnd := loadRowsToDuckdbTableFunc(tempDuckdbTableName, initialLoadedRowCount) + if loadedRowCount == 0 { + if newParquetCount == 0 { + return // no rows to append in the first batch + } else { + break // no more rows to append + } + } + // Create parquet + newParquetFile := writer.StorageS3.CreateParquet(dataS3Path, writer.DuckdbClient, tempDuckdbTableName, writer.IcebergSchemaColumns, loadedRowCount) + common.LogDebug(writer.Config, "Parquet file with", newParquetFile.RecordCount, "record(s) created at:", newParquetFile.Key) + if firstNewParquetFileUuid == "" { + firstNewParquetFileUuid = newParquetFile.Uuid + } + + // Create manifest lastSequenceNumber++ + newManifestFile := writer.StorageS3.CreateManifest(metadataS3Path, newParquetFile) newManifestListItem := ManifestListItem{SequenceNumber: lastSequenceNumber, ManifestFile: newManifestFile} newManifestListItemsSortedDesc = append([]ManifestListItem{newManifestListItem}, newManifestListItemsSortedDesc...) - newManifestListFile, err := writer.StorageS3.CreateManifestList(s3MetadataPath, firstNewParquetFile.Uuid, newManifestListItemsSortedDesc) + newParquetCount++ + common.LogInfo(writer.Config, "Written", newParquetFile.RecordCount, "records in Parquet file #"+common.IntToString(newParquetCount), "("+writer.formattedParquetFileSize(newParquetFile.Size)+")") + + if reachedEnd { + break + } + } + + // Create manifest list + newManifestListFile := writer.StorageS3.CreateManifestList(metadataS3Path, firstNewParquetFileUuid, newManifestListItemsSortedDesc) + + // Create metadata + writer.StorageS3.CreateMetadata(metadataS3Path, writer.IcebergSchemaColumns, []ManifestListFile{newManifestListFile}) + + // Delete old files + objectsToDeleteKeys = append(objectsToDeleteKeys, existingManifestListFile.Key) + for _, key := range objectsToDeleteKeys { + writer.deleteObject(key) + } +} + +func (writer *IcebergWriter) updateRows(metadataFileS3Path string, uniqueIndexColumnNames []string, loadRowsToDuckdbTableFunc func(duckdbTableName string, loadedSize int64) (loadedRowCount int, reachedEnd bool)) { + tableS3Path := strings.Split(metadataFileS3Path, "/metadata/")[0] + metadataS3Path := tableS3Path + "/metadata" + dataS3Path := tableS3Path + "/data" + + existingManifestListFile := writer.StorageS3.LastManifestListFile(metadataFileS3Path) + manifestListItemsSortedDesc := writer.StorageS3.ManifestListItems(existingManifestListFile) + firstNewParquetFileUuid := existingManifestListFile.Uuid() + + objectsToDeleteKeys := []string{} + for { + tempUpdatedRowsDuckdbTableName := writer.createTempDuckdbTable() + defer writer.deleteTempDuckdbTable(tempUpdatedRowsDuckdbTableName) + + loadedRowCount, reachedEnd := loadRowsToDuckdbTableFunc(tempUpdatedRowsDuckdbTableName, 0) + if loadedRowCount == 0 { + if len(objectsToDeleteKeys) == 0 { + return // no rows to update in the first batch + } else { + break // no more rows to update + } + } + + for i, manifestListItem := range manifestListItemsSortedDesc { + parquetFileS3Path, _ := writer.StorageS3.ParquetFileInfo(manifestListItem.ManifestFile) + if !writer.hasOverlappingRowsInParquet(tempUpdatedRowsDuckdbTableName, parquetFileS3Path, uniqueIndexColumnNames) { + continue + } + + objectsToDeleteKeys = append(objectsToDeleteKeys, writer.StorageS3.S3Client.ObjectKey(parquetFileS3Path)) + objectsToDeleteKeys = append(objectsToDeleteKeys, manifestListItem.ManifestFile.Key) + + tempDuckdbTableName := writer.createTempDuckdbTable() + defer writer.deleteTempDuckdbTable(tempDuckdbTableName) + + writer.insertToDuckdbTableFromParquetWithoutOverlappingDuckdbTableRows(tempDuckdbTableName, tempUpdatedRowsDuckdbTableName, parquetFileS3Path, uniqueIndexColumnNames) + writer.insertToDuckdbTableFromDuckdbTableThatOverlapWithParquetRows(tempDuckdbTableName, tempUpdatedRowsDuckdbTableName, parquetFileS3Path, uniqueIndexColumnNames) + + // Create parquet + newParquetFile := writer.StorageS3.CreateParquet(dataS3Path, writer.DuckdbClient, tempDuckdbTableName, writer.IcebergSchemaColumns, loadedRowCount) + common.LogDebug(writer.Config, "Parquet file with", newParquetFile.RecordCount, "record(s) created at:", newParquetFile.Key) + + // Create manifest + newManifestFile := writer.StorageS3.CreateManifest(metadataS3Path, newParquetFile) + manifestListItemsSortedDesc[i].ManifestFile = newManifestFile + } + + if reachedEnd { + break + } + } + + if len(objectsToDeleteKeys) == 0 { + return // no overlapping rows found + } + + // Create manifest list + newManifestListFile := writer.StorageS3.CreateManifestList(metadataS3Path, firstNewParquetFileUuid, manifestListItemsSortedDesc) + + // Create metadata + writer.StorageS3.CreateMetadata(metadataS3Path, writer.IcebergSchemaColumns, []ManifestListFile{newManifestListFile}) + + // Delete old files + objectsToDeleteKeys = append(objectsToDeleteKeys, existingManifestListFile.Key) + for _, key := range objectsToDeleteKeys { + writer.deleteObject(key) + } +} + +func (writer *IcebergWriter) deleteRows(metadataFileS3Path string, uniqueIndexColumnNames []string, loadRowsToDuckdbTableFunc func(duckdbTableName string, loadedSize int64) (loadedRowCount int, reachedEnd bool)) { + tableS3Path := strings.Split(metadataFileS3Path, "/metadata/")[0] + metadataS3Path := tableS3Path + "/metadata" + dataS3Path := tableS3Path + "/data" + + existingManifestListFile := writer.StorageS3.LastManifestListFile(metadataFileS3Path) + manifestListItemsSortedDesc := writer.StorageS3.ManifestListItems(existingManifestListFile) + firstNewParquetFileUuid := existingManifestListFile.Uuid() + + objectsToDeleteKeys := []string{} + for { + tempDeletedRowsDuckdbTableName := writer.createTempDuckdbTable() + defer writer.deleteTempDuckdbTable(tempDeletedRowsDuckdbTableName) + + loadedRowCount, reachedEnd := loadRowsToDuckdbTableFunc(tempDeletedRowsDuckdbTableName, 0) + if loadedRowCount == 0 { + if len(objectsToDeleteKeys) == 0 { + return // no rows to delete in the first batch + } else { + break // no more rows to delete + } + } + + for i, manifestListItem := range manifestListItemsSortedDesc { + parquetFileS3Path, _ := writer.StorageS3.ParquetFileInfo(manifestListItem.ManifestFile) + if !writer.hasOverlappingRowsInParquet(tempDeletedRowsDuckdbTableName, parquetFileS3Path, uniqueIndexColumnNames) { + continue + } + + objectsToDeleteKeys = append(objectsToDeleteKeys, writer.StorageS3.S3Client.ObjectKey(parquetFileS3Path)) + objectsToDeleteKeys = append(objectsToDeleteKeys, manifestListItem.ManifestFile.Key) + + tempDuckdbTableName := writer.createTempDuckdbTable() + defer writer.deleteTempDuckdbTable(tempDuckdbTableName) + + writer.insertToDuckdbTableFromParquetWithoutOverlappingDuckdbTableRows(tempDuckdbTableName, tempDeletedRowsDuckdbTableName, parquetFileS3Path, uniqueIndexColumnNames) + + // Create parquet + newParquetFile := writer.StorageS3.CreateParquet(dataS3Path, writer.DuckdbClient, tempDuckdbTableName, writer.IcebergSchemaColumns, loadedRowCount) + common.LogDebug(writer.Config, "Parquet file with", newParquetFile.RecordCount, "record(s) created at:", newParquetFile.Key) + + // Create manifest + newManifestFile := writer.StorageS3.CreateManifest(metadataS3Path, newParquetFile) + manifestListItemsSortedDesc[i].ManifestFile = newManifestFile + } + + if reachedEnd { + break + } + } + + if len(objectsToDeleteKeys) == 0 { + return // no overlapping rows found + } + + // Create manifest list + newManifestListFile := writer.StorageS3.CreateManifestList(metadataS3Path, firstNewParquetFileUuid, manifestListItemsSortedDesc) + + // Create metadata + writer.StorageS3.CreateMetadata(metadataS3Path, writer.IcebergSchemaColumns, []ManifestListFile{newManifestListFile}) + + // Delete old files + objectsToDeleteKeys = append(objectsToDeleteKeys, existingManifestListFile.Key) + for _, key := range objectsToDeleteKeys { + writer.deleteObject(key) + } +} + +func (writer *IcebergWriter) createTempDuckdbTable() string { + tableName := "temp_" + strings.ReplaceAll(uuid.New().String(), "-", "") + columnSchemas := make([]string, len(writer.IcebergSchemaColumns)) + for i, col := range writer.IcebergSchemaColumns { + columnSchemas[i] = col.QuotedColumnName() + " " + col.DuckdbType() + } + + _, err := writer.DuckdbClient.ExecContext(context.Background(), "CREATE TABLE "+tableName+"("+strings.Join(columnSchemas, ",")+")") + common.PanicIfError(writer.Config, err) + + return tableName +} + +func (writer *IcebergWriter) hasOverlappingRowsInParquet(duckdbTableName string, parquetFileS3Path string, uniqueIndexColumnNames []string) bool { + uniqueIndexConditions := make([]string, len(uniqueIndexColumnNames)) + for i, uniqueIndexColumnName := range uniqueIndexColumnNames { + uniqueIndexConditions[i] = `"` + uniqueIndexColumnName + `" IN (SELECT "` + uniqueIndexColumnName + `" FROM ` + duckdbTableName + ")" + } + countSql := "SELECT COUNT(*) FROM read_parquet('" + parquetFileS3Path + "') WHERE " + strings.Join(uniqueIndexConditions, " AND ") + + var count int + err := writer.DuckdbClient.QueryRowContext(context.Background(), countSql).Scan(&count) + common.PanicIfError(writer.Config, err) + return count > 0 +} + +func (writer *IcebergWriter) insertToDuckdbTableFromParquet(duckdbTableName string, parquetFileS3Path string, cursorValue CursorValue) { + sql := "INSERT INTO " + duckdbTableName + " SELECT * FROM read_parquet('" + parquetFileS3Path + "')" + if cursorValue.OverrideRows { + // Exclude rows with the cursor value + sql += ` WHERE "` + cursorValue.ColumnName + `" != '` + cursorValue.StringValue + `'` + common.LogInfo(writer.Config, "Replacing last existing Parquet file excluding cursor value:", strings.Split(parquetFileS3Path, "/data/")[1]) + } else { + common.LogInfo(writer.Config, "Replacing last existing Parquet file:", strings.Split(parquetFileS3Path, "/data/")[1]) + } + + _, err := writer.DuckdbClient.ExecContext(context.Background(), sql) + common.PanicIfError(writer.Config, err) +} + +func (writer *IcebergWriter) insertToDuckdbTableFromDuckdbTableThatOverlapWithParquetRows(insertDuckdbTableName string, sourceDuckdbTableName string, parquetFileS3Path string, uniqueIndexColumnNames []string) { + uniqueIndexConditions := make([]string, len(uniqueIndexColumnNames)) + for i, uniqueIndexColumnName := range uniqueIndexColumnNames { + uniqueIndexConditions[i] = `"` + uniqueIndexColumnName + `" IN (SELECT "` + uniqueIndexColumnName + `" FROM read_parquet('` + parquetFileS3Path + "'))" + } + sql := "INSERT INTO " + insertDuckdbTableName + " SELECT * FROM " + sourceDuckdbTableName + " WHERE " + strings.Join(uniqueIndexConditions, " AND ") + _, err := writer.DuckdbClient.ExecContext(context.Background(), sql) + common.PanicIfError(writer.Config, err) +} + +func (writer *IcebergWriter) insertToDuckdbTableFromParquetWithoutOverlappingDuckdbTableRows(insertDuckdbTableName string, overlappingDuckdbTableName string, parquetFileS3Path string, uniqueIndexColumnNames []string) { + uniqueIndexConditions := make([]string, len(uniqueIndexColumnNames)) + for i, uniqueIndexColumnName := range uniqueIndexColumnNames { + uniqueIndexConditions[i] = `"` + uniqueIndexColumnName + `" NOT IN (SELECT "` + uniqueIndexColumnName + `" FROM ` + overlappingDuckdbTableName + ")" + } + sql := "INSERT INTO " + insertDuckdbTableName + " SELECT * FROM read_parquet('" + parquetFileS3Path + "') WHERE " + strings.Join(uniqueIndexConditions, " AND ") + _, err := writer.DuckdbClient.ExecContext(context.Background(), sql) + common.PanicIfError(writer.Config, err) +} + +func (writer *IcebergWriter) deleteTempDuckdbTable(duckdbTableName string) { + _, err := writer.DuckdbClient.ExecContext(context.Background(), "DROP TABLE "+duckdbTableName) + common.PanicIfError(writer.Config, err) +} + +func (writer *IcebergWriter) deleteObject(key string) { + var fileName string + if strings.Contains(key, "/data/") { + fileName = strings.Split(key, "/data/")[1] + } else if strings.Contains(key, "/metadata/") { + fileName = strings.Split(key, "/metadata/")[1] + } + + common.LogInfo(writer.Config, "Deleting object:", fileName) + writer.StorageS3.S3Client.DeleteObject(key) +} + +func (writer *IcebergWriter) loadCsvRows(duckdbTableName string, csvReader *csv.Reader, loadedSize int64) (loadedRowCount int, reachedEnd bool) { + appender, err := writer.DuckdbClient.Appender("", duckdbTableName) + common.PanicIfError(writer.Config, err) + defer appender.Close() + + for { + row, err := csvReader.Read() + if err == io.EOF { + reachedEnd = true + break + } common.PanicIfError(writer.Config, err) - finalManifestListFilesSortedAsc = append(finalManifestListFilesSortedAsc, newManifestListFile) - _, err = writer.StorageS3.CreateMetadata(s3MetadataPath, writer.IcebergSchemaColumns, finalManifestListFilesSortedAsc) + duckdbRowValues := make([]driver.Value, len(writer.IcebergSchemaColumns)) + for i, icebergSchemaColumn := range writer.IcebergSchemaColumns { + duckdbRowValues[i] = icebergSchemaColumn.DuckdbValueFromCsv(row[i]) + loadedSize += int64(len(row[i])) + } + + common.LogTrace(writer.Config, "DuckDB appending row values:", duckdbRowValues) + err = appender.AppendRow(duckdbRowValues...) common.PanicIfError(writer.Config, err) - common.LogInfo(writer.Config, "Written", newParquetFile.RecordCount, "records in Parquet file #"+common.IntToString(newParquetCount)) + loadedRowCount++ + if loadedSize >= (MAX_ICEBERG_WRITER_BATCH_SIZE * writer.CompressionFactor) { + common.LogDebug(writer.Config, "Reached batch size limit") + break + } + } - if reachedEnd { - return + common.LogInfo(writer.Config, "Loaded", loadedRowCount, "rows") + return loadedRowCount, reachedEnd +} + +func (writer *IcebergWriter) loadJsonRows(duckdbTableName string, jsonQueueReader *JsonQueueReader, loadedSize int64) (loadedRowCount int, reachedEnd bool) { + appender, err := writer.DuckdbClient.Appender("", duckdbTableName) + common.PanicIfError(writer.Config, err) + defer appender.Close() + + for { + var rowValues map[string]interface{} + valueSize, err := jsonQueueReader.Read(&rowValues) + if err == io.EOF { + reachedEnd = true + break + } + common.PanicIfError(writer.Config, err) + loadedSize += int64(valueSize) + + duckdbRowValues := writer.jsonToDuckdbRowValues(rowValues) + + common.LogTrace(writer.Config, "DuckDB appending row values:", rowValues) + err = appender.AppendRow(duckdbRowValues...) + common.PanicIfError(writer.Config, err) + + loadedRowCount++ + if loadedSize >= (MAX_ICEBERG_WRITER_BATCH_SIZE * writer.CompressionFactor) { + common.LogDebug(writer.Config, "Reached batch size limit") + break + } + } + + common.LogInfo(writer.Config, "Loaded", loadedRowCount, "rows") + return loadedRowCount, reachedEnd +} + +func (writer *IcebergWriter) jsonToDuckdbRowValues(rowValues map[string]interface{}) []driver.Value { + // Detect row column drift + rowColumnNames := []string{} + for columnName := range rowValues { + rowColumnNames = append(rowColumnNames, columnName) + } + tableColumnNames := make([]string, len(writer.IcebergSchemaColumns)) + for i, icebergSchemaColumn := range writer.IcebergSchemaColumns { + tableColumnNames[i] = strings.ToLower(icebergSchemaColumn.ColumnName) // Debezium JSON keys are lowercase + } + if len(rowColumnNames) != len(tableColumnNames) { + common.Panic(writer.Config, "Row column names count doesn't match table column names count: "+strings.Join(rowColumnNames, ", ")+" (row) vs "+strings.Join(tableColumnNames, ", ")+" (table)") + } + sort.Strings(rowColumnNames) + sort.Strings(tableColumnNames) + for i := range rowColumnNames { + if rowColumnNames[i] != tableColumnNames[i] { + common.Panic(writer.Config, "Row column names don't match table column names: "+strings.Join(rowColumnNames, ", ")+" (row) vs "+strings.Join(tableColumnNames, ", ")+" (table)") } } + + // Convert row values to DuckDB values + duckdbRowValues := make([]driver.Value, len(writer.IcebergSchemaColumns)) + for i, icebergSchemaColumn := range writer.IcebergSchemaColumns { + columnName := strings.ToLower(icebergSchemaColumn.ColumnName) // Debezium JSON keys are lowercase + value := rowValues[columnName] + duckdbRowValues[i] = icebergSchemaColumn.DuckdbValueFromJson(value) + } + return duckdbRowValues +} + +func (writer *IcebergWriter) formattedParquetFileSize(parquetFileSize int64) string { + if parquetFileSize < 1024 { + return Int64ToString(parquetFileSize) + "B" + } else if parquetFileSize < 1024*1024 { + return Int64ToString(parquetFileSize/1024) + "KB" + } else if parquetFileSize < 1024*1024*1024 { + return Int64ToString(parquetFileSize/(1024*1024)) + "MB" + } + return Int64ToString(parquetFileSize/(1024*1024*1024)) + "GB" } diff --git a/src/syncer-common/json_queue.go b/src/syncer-common/json_queue.go new file mode 100644 index 0000000..e3ddb69 --- /dev/null +++ b/src/syncer-common/json_queue.go @@ -0,0 +1,80 @@ +package syncerCommon + +import ( + "encoding/binary" + "encoding/json" + "io" +) + +type JsonQueueWriter struct { + Writer io.Writer +} + +func NewJsonQueueWriter(w io.Writer) *JsonQueueWriter { + return &JsonQueueWriter{Writer: w} +} + +func (w *JsonQueueWriter) Write(value interface{}) error { + jsonData, err := json.Marshal(value) + if err != nil { + return err + } + + lenBytes := make([]byte, 4) + binary.BigEndian.PutUint32(lenBytes, uint32(len(jsonData))) + + _, err = w.Writer.Write(lenBytes) + if err != nil { + return err + } + + _, err = w.Writer.Write(jsonData) + return err +} + +func (w *JsonQueueWriter) Close() error { + if closer, ok := w.Writer.(io.Closer); ok { + return closer.Close() + } + return nil +} + +// ------------------------------------------------------------------------------------------------- + +type JsonQueueReader struct { + Reader io.Reader +} + +func NewJsonQueueReader(r io.Reader) *JsonQueueReader { + return &JsonQueueReader{Reader: r} +} + +func (r *JsonQueueReader) Read(value interface{}) (int, error) { + lenBytes := make([]byte, 4) + _, err := io.ReadFull(r.Reader, lenBytes) + if err != nil { + return 0, err // Propagate io.EOF or any other errors + } + + length := binary.BigEndian.Uint32(lenBytes) + + jsonData := make([]byte, length) + _, err = io.ReadFull(r.Reader, jsonData) + if err != nil { + return 0, err // This will return io.ErrUnexpectedEOF if the stream is closed before the full message is read. + } + + err = json.Unmarshal(jsonData, value) + if err != nil { + return 0, err + } + + return int(length), nil +} + +func (r *JsonQueueReader) Close() error { + if closer, ok := r.Reader.(io.Closer); ok { + return closer.Close() + } + return nil +} diff --git a/src/syncer-common/json_queue_test.go b/src/syncer-common/json_queue_test.go new file mode 100644 index 0000000..cebbdf3 --- /dev/null +++ b/src/syncer-common/json_queue_test.go @@ -0,0 +1,38 @@ +package syncerCommon + +import ( + "testing" + + "github.com/BemiHQ/BemiDB/src/common" +) + +func TestJsonQueue(t *testing.T) { + config := &common.CommonConfig{ + LogLevel: "DEBUG", + } + buffer := NewCappedBuffer(config, 1024) + writer := NewJsonQueueWriter(buffer) + reader := NewJsonQueueReader(buffer) + + original := map[string]interface{}{ + "name": "test", + "value": 42, + } + err := writer.Write(original) + if err != nil { + t.Fatalf("Write failed: %v", err) + } + + var result interface{} + _, err = reader.Read(&result) + if err != nil { + t.Fatalf("Read failed: %v", err) + } + + if original["name"] != result.(map[string]interface{})["name"] { + t.Errorf("Expected name %s, got %s", original["name"], result.(map[string]interface{})["name"]) + } + if float64(original["value"].(int)) != result.(map[string]interface{})["value"].(float64) { + t.Errorf("Expected value %d, got %f", original["value"], result.(map[string]interface{})["value"]) + } +} diff --git a/src/syncer-common/storage_s3.go b/src/syncer-common/storage_s3.go index 1c257c3..8994d62 100644 --- a/src/syncer-common/storage_s3.go +++ b/src/syncer-common/storage_s3.go @@ -3,20 +3,24 @@ package syncerCommon import ( "context" "fmt" + "io" "os" "strings" + "time" "github.com/BemiHQ/BemiDB/src/common" "github.com/google/uuid" - "github.com/marcboeker/go-duckdb/v2" "github.com/xitongsys/parquet-go-source/s3v2" ) +const ( + UUID_LENGTH = 36 +) + type StorageS3 struct { S3Client *common.S3Client Config *common.CommonConfig StorageUtils *StorageUtils - DuckdbClient *common.DuckdbClient } type ParquetFileStats struct { @@ -67,6 +71,10 @@ type ManifestListFile struct { DeletedRecords int64 } +func (manifestListFile ManifestListFile) Uuid() string { + return strings.TrimSuffix(manifestListFile.Key[len(manifestListFile.Key)-UUID_LENGTH-5:], ".avro") +} + type MetadataFile struct { Version int64 Key string @@ -77,140 +85,156 @@ func NewStorageS3(Config *common.CommonConfig) *StorageS3 { S3Client: common.NewS3Client(Config), Config: Config, StorageUtils: NewStorageUtils(Config), - DuckdbClient: common.NewDuckdbClient(Config), } } // Write --------------------------------------------------------------------------------------------------------------- -func (storage *StorageS3) CreateParquet(s3DataPath string, icebergSchemaColumns []*IcebergSchemaColumn, loadRows func(appender *duckdb.Appender) (rowCount int, reachedEnd bool)) (parquetFile ParquetFile, reachedEnd bool) { +func (storage *StorageS3) CreateParquet(dataS3Path string, duckdbClient *common.DuckdbClient, tempDuckdbTableName string, icebergSchemaColumns []*IcebergSchemaColumn, rowCount int) ParquetFile { ctx := context.Background() uuid := uuid.New().String() - fileName := fmt.Sprintf("00000-0-%s.parquet", uuid) - fileS3Path := s3DataPath + "/" + fileName - fileKey := storage.S3Client.ObjectKey(fileS3Path) + fileName := storage.generateTimestampString() + "_" + uuid + ".parquet" + fileS3Path := dataS3Path + "/" + fileName + fileS3Key := storage.S3Client.ObjectKey(fileS3Path) - rowCount, reachedEnd := storage.StorageUtils.WriteParquetFile(storage.DuckdbClient, fileS3Path, icebergSchemaColumns, loadRows) - common.LogDebug(storage.Config, "Parquet file with", rowCount, "record(s) created at:", fileKey) + storage.StorageUtils.WriteParquetFile(fileS3Path, duckdbClient, tempDuckdbTableName, icebergSchemaColumns) - headObjectOutput := storage.S3Client.HeadObject(fileKey) + headObjectOutput := storage.S3Client.HeadObject(fileS3Key) fileSize := *headObjectOutput.ContentLength - fileReader, err := s3v2.NewS3FileReaderWithClient(ctx, storage.S3Client.S3, storage.Config.Aws.S3Bucket, fileKey) + fileReader, err := s3v2.NewS3FileReaderWithClient(ctx, storage.S3Client.S3, storage.Config.Aws.S3Bucket, fileS3Key) common.PanicIfError(storage.Config, err) parquetStats := storage.StorageUtils.ReadParquetStats(fileReader, icebergSchemaColumns) return ParquetFile{ Uuid: uuid, - Key: fileKey, - Path: s3DataPath + "/" + fileName, + Key: fileS3Key, + Path: dataS3Path + "/" + fileName, Size: fileSize, RecordCount: int64(rowCount), Stats: parquetStats, - }, reachedEnd -} - -func (storage *StorageS3) DeleteParquet(parquetFile ParquetFile) { - storage.S3Client.DeleteObject(parquetFile.Key) + } } -func (storage *StorageS3) CreateManifest(s3MetadataPath string, parquetFile ParquetFile) (manifestFile ManifestFile, err error) { - fileName := fmt.Sprintf("%s-m0.avro", parquetFile.Uuid) - fileKey := storage.S3Client.ObjectKey(s3MetadataPath) + "/" + fileName +func (storage *StorageS3) CreateManifest(metadataS3Path string, parquetFile ParquetFile) (manifestFile ManifestFile) { + fileName := storage.generateTimestampString() + "_" + parquetFile.Uuid + "-m0.avro" + fileS3Key := storage.S3Client.ObjectKey(metadataS3Path) + "/" + fileName - err = storage.uploadTemporaryFile("manifest", fileKey, func(tempFile *os.File) error { + storage.uploadTemporaryFile("manifest", fileS3Key, func(tempFile *os.File) { + var err error manifestFile, err = storage.StorageUtils.WriteManifestFile(tempFile.Name(), parquetFile) - return err + common.PanicIfError(storage.Config, err) }) - if err != nil { - return manifestFile, err - } - common.LogDebug(storage.Config, "Manifest file created at:", fileKey) - manifestFile.Key = fileKey - manifestFile.Path = s3MetadataPath + "/" + fileName - return manifestFile, nil + common.LogDebug(storage.Config, "Manifest file created at:", fileS3Key) + manifestFile.Key = fileS3Key + manifestFile.Path = metadataS3Path + "/" + fileName + return manifestFile } -func (storage *StorageS3) CreateManifestList(s3MetadataPath string, parquetFileUuid string, manifestListItemsSortedDesc []ManifestListItem) (manifestListFile ManifestListFile, err error) { - fileName := fmt.Sprintf("snap-%d-0-%s.avro", manifestListItemsSortedDesc[0].ManifestFile.SnapshotId, parquetFileUuid) - fileKey := storage.S3Client.ObjectKey(s3MetadataPath) + "/" + fileName +func (storage *StorageS3) CreateManifestList(metadataS3Path string, parquetFileUuid string, manifestListItemsSortedDesc []ManifestListItem) (manifestListFile ManifestListFile) { + fileName := "snap-" + storage.generateTimestampString() + "_" + parquetFileUuid + ".avro" + fileS3Key := storage.S3Client.ObjectKey(metadataS3Path) + "/" + fileName - err = storage.uploadTemporaryFile("manifest-list", fileKey, func(tempFile *os.File) error { + storage.uploadTemporaryFile("manifest-list", fileS3Key, func(tempFile *os.File) { + var err error manifestListFile, err = storage.StorageUtils.WriteManifestListFile(tempFile.Name(), manifestListItemsSortedDesc) - return err + common.PanicIfError(storage.Config, err) }) - if err != nil { - return manifestListFile, err - } - common.LogDebug(storage.Config, "Manifest list file created at:", fileKey) - manifestListFile.Key = fileKey - manifestListFile.Path = s3MetadataPath + "/" + fileName - return manifestListFile, nil + common.LogDebug(storage.Config, "Manifest list file created at:", fileS3Key) + manifestListFile.Key = fileS3Key + manifestListFile.Path = metadataS3Path + "/" + fileName + return manifestListFile } -func (storage *StorageS3) CreateMetadata(s3MetadataPath string, icebergSchemaColumns []*IcebergSchemaColumn, manifestListFilesSortedAsc []ManifestListFile) (metadataFile MetadataFile, err error) { - fileKey := storage.S3Client.ObjectKey(s3MetadataPath) + "/" + ICEBERG_METADATA_INITIAL_FILE_NAME +func (storage *StorageS3) CreateMetadata(metadataS3Path string, icebergSchemaColumns []*IcebergSchemaColumn, manifestListFilesSortedAsc []ManifestListFile) (metadataFile MetadataFile) { + fileS3Key := storage.S3Client.ObjectKey(metadataS3Path) + "/" + ICEBERG_METADATA_INITIAL_FILE_NAME - err = storage.uploadTemporaryFile("metadata", fileKey, func(tempFile *os.File) error { - s3TablePath := strings.TrimSuffix(s3MetadataPath, "/metadata") - return storage.StorageUtils.WriteMetadataFile(s3TablePath, tempFile.Name(), icebergSchemaColumns, manifestListFilesSortedAsc) + storage.uploadTemporaryFile("metadata", fileS3Key, func(tempFile *os.File) { + tableS3Path := strings.TrimSuffix(metadataS3Path, "/metadata") + err := storage.StorageUtils.WriteMetadataFile(tableS3Path, tempFile.Name(), icebergSchemaColumns, manifestListFilesSortedAsc) + common.PanicIfError(storage.Config, err) }) - if err != nil { - return metadataFile, err - } - common.LogDebug(storage.Config, "Metadata file created at:", fileKey) - return MetadataFile{Version: 1, Key: fileKey}, nil + common.LogDebug(storage.Config, "Metadata file created at:", fileS3Key) + return MetadataFile{Version: 1, Key: fileS3Key} +} + +func (storage *StorageS3) DeleteTableFiles(tableS3Path string) { + tableS3Key := storage.S3Client.ObjectKey(tableS3Path) + storage.deleteNestedObjects(tableS3Key) +} + +// Read ---------------------------------------------------------------------------------------------------------------- + +func (storage *StorageS3) LastManifestListFile(metadataS3Path string) ManifestListFile { + metadataContent := storage.readObjectContent(metadataS3Path) + return storage.StorageUtils.ParseLastManifestListFile(storage.S3Client.BucketS3Prefix(), metadataContent) +} + +func (storage *StorageS3) ManifestListItems(manifestListFile ManifestListFile) []ManifestListItem { + manifestListContent := storage.readObjectContent(manifestListFile.Path) + return storage.StorageUtils.ParseManifestListItems(storage.S3Client.BucketS3Prefix(), manifestListContent) } -func (storage *StorageS3) DeleteTableFiles(s3TablePath string) (err error) { - tableKey := storage.S3Client.ObjectKey(s3TablePath) - return storage.deleteNestedObjects(tableKey) +func (storage *StorageS3) ParquetFileInfo(manifestFile ManifestFile) (fileS3Path string, fileSize int64) { + manifestContent := storage.readObjectContent(manifestFile.Path) + fileS3Path = storage.StorageUtils.ParseParquetFileS3Path(manifestContent) + + fileS3Key := storage.S3Client.ObjectKey(fileS3Path) + headObjectOutput := storage.S3Client.HeadObject(fileS3Key) + fileSize = *headObjectOutput.ContentLength + + return fileS3Path, fileSize } // --------------------------------------------------------------------------------------------------------------------- -func (storage *StorageS3) uploadTemporaryFile(tempFilePattern string, uploadFilePath string, writeTempFileFunc func(*os.File) error) error { +func (storage *StorageS3) generateTimestampString() string { + now := time.Now() + return fmt.Sprintf("%s_%06d", now.Format("20060102_150405"), now.Nanosecond()/1000) +} + +func (storage *StorageS3) uploadTemporaryFile(tempFilePattern string, uploadFileS3Key string, writeTempFileFunc func(*os.File)) { tempFile, err := os.CreateTemp("", tempFilePattern) - if err != nil { - return err - } + common.PanicIfError(storage.Config, err) + defer func() { os.Remove(tempFile.Name()) }() - err = writeTempFileFunc(tempFile) - if err != nil { - return err - } + writeTempFileFunc(tempFile) - storage.S3Client.UploadObject(uploadFilePath, tempFile) + storage.S3Client.UploadObject(uploadFileS3Key, tempFile) err = tempFile.Close() - if err != nil { - return err - } + common.PanicIfError(storage.Config, err) +} - return nil +func (storage *StorageS3) readObjectContent(fileS3Path string) []byte { + fileS3Key := storage.S3Client.ObjectKey(fileS3Path) + getObjectResponse := storage.S3Client.GetObject(fileS3Key) + + fileContent, err := io.ReadAll(getObjectResponse.Body) + common.PanicIfError(storage.Config, err) + + return fileContent } -func (storage *StorageS3) deleteNestedObjects(prefixKey string) (err error) { - listResponse := storage.S3Client.ListObjects(prefixKey) +func (storage *StorageS3) deleteNestedObjects(prefixS3Key string) { + listResponse := storage.S3Client.ListObjects(prefixS3Key) - var fileKeys []*string + var fileS3Keys []*string for _, obj := range listResponse.Contents { common.LogDebug(storage.Config, "Object to delete:", *obj.Key) - fileKeys = append(fileKeys, obj.Key) + fileS3Keys = append(fileS3Keys, obj.Key) } - if len(fileKeys) > 0 { - storage.S3Client.DeleteObjects(fileKeys) - common.LogDebug(storage.Config, "Deleted", len(fileKeys), "object(s).") + if len(fileS3Keys) > 0 { + storage.S3Client.DeleteObjects(fileS3Keys) + common.LogDebug(storage.Config, "Deleted", len(fileS3Keys), "object(s).") } else { common.LogDebug(storage.Config, "No objects to delete.") } - - return nil } diff --git a/src/syncer-common/storage_utils.go b/src/syncer-common/storage_utils.go index 312a639..5c3d9ed 100644 --- a/src/syncer-common/storage_utils.go +++ b/src/syncer-common/storage_utils.go @@ -12,7 +12,6 @@ import ( "github.com/BemiHQ/BemiDB/src/common" "github.com/google/uuid" "github.com/linkedin/goavro" - "github.com/marcboeker/go-duckdb/v2" "github.com/xitongsys/parquet-go/reader" "github.com/xitongsys/parquet-go/source" "golang.org/x/exp/maps" @@ -79,47 +78,29 @@ func NewStorageUtils(config *common.CommonConfig) *StorageUtils { // Write --------------------------------------------------------------------------------------------------------------- -func (storage *StorageUtils) WriteParquetFile(duckdbClient *common.DuckdbClient, fileS3Path string, icebergSchemaColumns []*IcebergSchemaColumn, loadRows func(appender *duckdb.Appender) (rowCount int, reachedEnd bool)) (rowCount int, reachedEnd bool) { - ctx := context.Background() - tableName := "temp_" + strings.ReplaceAll(uuid.New().String(), "-", "") - columnSchemas := make([]string, len(icebergSchemaColumns)) +func (utils *StorageUtils) WriteParquetFile(fileS3Path string, duckdbClient *common.DuckdbClient, tempDuckdbTableName string, icebergSchemaColumns []*IcebergSchemaColumn) { fieldIds := make([]string, len(icebergSchemaColumns)) for i, col := range icebergSchemaColumns { - columnSchemas[i] = col.QuotedColumnName() + " " + col.DuckdbType() if col.IsList { fieldIds[i] = col.QuotedColumnName() + ":{__duckdb_field_id: " + common.IntToString(col.Position) + ", element: " + common.IntToString(PARQUET_NESTED_FIELD_ID_PREFIX+col.Position) + "}" } else { fieldIds[i] = col.QuotedColumnName() + ":" + common.IntToString(col.Position) } } - _, err := duckdbClient.ExecContext(ctx, "CREATE TABLE "+tableName+"("+strings.Join(columnSchemas, ",")+")") - common.PanicIfError(storage.Config, err) - appender, err := duckdbClient.Appender("", tableName) - common.PanicIfError(storage.Config, err) - - rowCount, reachedEnd = loadRows(appender) - err = appender.Close() - common.PanicIfError(storage.Config, err) - - copyQuery := "COPY " + tableName + " TO '$fileS3Path' (FORMAT PARQUET, COMPRESSION 'ZSTD', FIELD_IDS {$fieldIds})" - _, err = duckdbClient.ExecContext(ctx, copyQuery, map[string]string{ + copyQuery := "COPY " + tempDuckdbTableName + " TO '$fileS3Path' (FORMAT PARQUET, COMPRESSION 'ZSTD', FIELD_IDS {$fieldIds})" + _, err := duckdbClient.ExecContext(context.Background(), copyQuery, map[string]string{ "fileS3Path": fileS3Path, "fieldIds": strings.Join(fieldIds, ","), }) - common.PanicIfError(storage.Config, err) - - _, err = duckdbClient.ExecContext(ctx, "DROP TABLE "+tableName) - common.PanicIfError(storage.Config, err) - - return rowCount, reachedEnd + common.PanicIfError(utils.Config, err) } -func (storage *StorageUtils) ReadParquetStats(fileReader source.ParquetFile, icebergSchemaColumns []*IcebergSchemaColumn) (parquetStats ParquetFileStats) { +func (utils *StorageUtils) ReadParquetStats(fileReader source.ParquetFile, icebergSchemaColumns []*IcebergSchemaColumn) (parquetStats ParquetFileStats) { defer fileReader.Close() pr, err := reader.NewParquetReader(fileReader, nil, 1) - common.PanicIfError(storage.Config, err) + common.PanicIfError(utils.Config, err) defer pr.ReadStop() parquetStats = ParquetFileStats{ @@ -175,7 +156,7 @@ func (storage *StorageUtils) ReadParquetStats(fileReader source.ParquetFile, ice return parquetStats } -func (storage *StorageUtils) WriteManifestFile(filePath string, parquetFile ParquetFile) (manifestFile ManifestFile, err error) { +func (utils *StorageUtils) WriteManifestFile(filePath string, parquetFile ParquetFile) (manifestFile ManifestFile, err error) { snapshotId := time.Now().UnixNano() codec, err := goavro.NewCodec(MANIFEST_SCHEMA) if err != nil { @@ -299,7 +280,7 @@ func (storage *StorageUtils) WriteManifestFile(filePath string, parquetFile Parq }, nil } -func (storage *StorageUtils) WriteManifestListFile(filePath string, manifestListItemsSortedDesc []ManifestListItem) (ManifestListFile, error) { +func (utils *StorageUtils) WriteManifestListFile(filePath string, manifestListItemsSortedDesc []ManifestListItem) (ManifestListFile, error) { codec, err := goavro.NewCodec(MANIFEST_LIST_SCHEMA) if err != nil { return ManifestListFile{}, fmt.Errorf("failed to create Avro codec for manifest list: %v", err) @@ -398,7 +379,7 @@ func (storage *StorageUtils) WriteManifestListFile(filePath string, manifestList return manifestListFile, nil } -func (storage *StorageUtils) WriteMetadataFile(s3TablePath string, filePath string, icebergSchemaColumns []*IcebergSchemaColumn, manifestListFilesSortedAsc []ManifestListFile) (err error) { +func (utils *StorageUtils) WriteMetadataFile(s3TablePath string, filePath string, icebergSchemaColumns []*IcebergSchemaColumn, manifestListFilesSortedAsc []ManifestListFile) (err error) { tableUuid := uuid.New().String() lastColumnId := 0 @@ -523,21 +504,74 @@ func (storage *StorageUtils) WriteMetadataFile(s3TablePath string, filePath stri return nil } -func (storage *StorageUtils) WriteVersionHintFile(filePath string, metadataFile MetadataFile) (err error) { - file, err := os.Create(filePath) - if err != nil { - return fmt.Errorf("failed to create version hint file: %v", err) +// Read --------------------------------------------------------------------------------------------------------------- + +func (utils *StorageUtils) ParseLastManifestListFile(bucketS3Prefix string, metadataContent []byte) ManifestListFile { + var manifestListsJson ManifestListsJson + err := json.Unmarshal(metadataContent, &manifestListsJson) + common.PanicIfError(utils.Config, err) + + snapshot := manifestListsJson.Snapshots[len(manifestListsJson.Snapshots)-1] + + return ManifestListFile{ + SequenceNumber: snapshot.SequenceNumber, + SnapshotId: snapshot.SnapshotId, + TimestampMs: snapshot.TimestampMs, + Key: strings.TrimPrefix(snapshot.Path, bucketS3Prefix), + Path: snapshot.Path, + Operation: snapshot.Summary.Operation, + AddedFilesSize: StringToInt64(snapshot.Summary.AddedFilesSize), + AddedDataFiles: StringToInt64(snapshot.Summary.AddedDataFiles), + AddedRecords: StringToInt64(snapshot.Summary.AddedRecords), + RemovedFilesSize: StringToInt64(snapshot.Summary.RemovedFilesSize), + DeletedDataFiles: StringToInt64(snapshot.Summary.DeletedDataFiles), + DeletedRecords: StringToInt64(snapshot.Summary.DeletedRecords), } - defer file.Close() +} - _, err = file.WriteString(fmt.Sprintf("%d", metadataFile.Version)) - if err != nil { - return fmt.Errorf("failed to write to version hint file: %v", err) +func (utils *StorageUtils) ParseManifestListItems(bucketS3Prefix string, manifestListFileContent []byte) []ManifestListItem { + ocfReader, err := goavro.NewOCFReader(strings.NewReader(string(manifestListFileContent))) + common.PanicIfError(utils.Config, err) + + manifestListItemsSortedDesc := []ManifestListItem{} + + for ocfReader.Scan() { + record, err := ocfReader.Read() + common.PanicIfError(utils.Config, err) + + recordMap := record.(map[string]interface{}) + + manifestListItemsSortedDesc = append(manifestListItemsSortedDesc, ManifestListItem{ + ManifestFile: ManifestFile{ + SnapshotId: recordMap["added_snapshot_id"].(int64), + Key: strings.TrimPrefix(recordMap["manifest_path"].(string), bucketS3Prefix), + Path: recordMap["manifest_path"].(string), + Size: recordMap["manifest_length"].(int64), + RecordCount: recordMap["added_rows_count"].(int64), + }, + SequenceNumber: int(recordMap["sequence_number"].(int64)), + }) } - return nil + return manifestListItemsSortedDesc } +func (utils *StorageUtils) ParseParquetFileS3Path(manifestContent []byte) string { + ocfReader, err := goavro.NewOCFReader(strings.NewReader(string(manifestContent))) + common.PanicIfError(utils.Config, err) + + ocfReader.Scan() + record, err := ocfReader.Read() + common.PanicIfError(utils.Config, err) + + recordMap := record.(map[string]interface{}) + dataFile := recordMap["data_file"].(map[string]interface{}) + + return dataFile["file_path"].(string) +} + +// --------------------------------------------------------------------------------------------------------------------- + const ( MANIFEST_SCHEMA = `{ "type" : "record", diff --git a/src/syncer-common/trino.go b/src/syncer-common/trino.go deleted file mode 100644 index 09ca6d3..0000000 --- a/src/syncer-common/trino.go +++ /dev/null @@ -1,99 +0,0 @@ -package syncerCommon - -import ( - "context" - "database/sql" - - "github.com/BemiHQ/BemiDB/src/common" - _ "github.com/trinodb/trino-go-client/trino" -) - -const ( - TRINO_MAX_DECIMAL_PRECISION = 38 - TRINO_FALLBACK_DECIMAL_SCALE = 6 - TRINO_MAX_QUERY_LENGTH = 1_000_000 -) - -type TrinoConfig struct { - DatabaseUrl string - CatalogName string -} - -type Trino struct { - Config *common.CommonConfig - TrinoConfig *TrinoConfig - Db *sql.DB - SchemaName string -} - -func NewTrino(config *common.CommonConfig, trinoConfig *TrinoConfig, schemaName string) *Trino { - db, err := sql.Open("trino", trinoConfig.DatabaseUrl) - common.PanicIfError(config, err) - - return &Trino{ - Config: config, - TrinoConfig: trinoConfig, - Db: db, - SchemaName: schemaName, - } -} - -func (trino *Trino) Schema() string { - return trino.TrinoConfig.CatalogName + "." + trino.SchemaName -} - -func (trino *Trino) Close() { - if err := trino.Db.Close(); err != nil { - common.PanicIfError(trino.Config, err) - } -} - -func (trino *Trino) ExecContext(ctx context.Context, query string, args ...interface{}) (sql.Result, error) { - common.LogDebug(trino.Config, "Trino query:", query) - result, err := trino.Db.ExecContext(ctx, query, args...) - if err != nil { - common.LogError(trino.Config, "Trino query failed:", query) - return nil, err - } - - return result, nil -} - -func (trino *Trino) QueryContext(ctx context.Context, query string, args ...interface{}) (*sql.Rows, error) { - common.LogDebug(trino.Config, "Trino query:", query) - return trino.Db.QueryContext(ctx, query, args...) -} - -func (trino *Trino) QueryRowContext(ctx context.Context, query string, args ...interface{}) *sql.Row { - common.LogDebug(trino.Config, "Trino query:", query) - return trino.Db.QueryRowContext(ctx, query, args...) -} - -func (trino *Trino) CompactTable(quotedTrinoTablePath string) { - ctx := context.Background() - - _, err := trino.ExecContext(ctx, "ALTER TABLE "+quotedTrinoTablePath+" EXECUTE optimize") - common.PanicIfError(trino.Config, err) - - _, err = trino.ExecContext(ctx, "ALTER TABLE "+quotedTrinoTablePath+" EXECUTE remove_orphan_files(retention_threshold => '0m')") - common.PanicIfError(trino.Config, err) - - _, err = trino.ExecContext(ctx, "ALTER TABLE "+quotedTrinoTablePath+" EXECUTE optimize_manifests") - common.PanicIfError(trino.Config, err) - - _, err = trino.ExecContext(ctx, "ALTER TABLE "+quotedTrinoTablePath+" EXECUTE expire_snapshots(retention_threshold => '0m')") - common.PanicIfError(trino.Config, err) -} - -func (trino *Trino) CreateSchemaIfNotExists() { - _, err := trino.ExecContext(context.Background(), "CREATE SCHEMA IF NOT EXISTS "+trino.Schema()) - common.PanicIfError(trino.Config, err) -} - -func (trino *Trino) CreateTableIfNotExists(tableName string, tableStructure string) { - ctx := context.Background() - - createTableSql := "CREATE TABLE IF NOT EXISTS " + trino.Schema() + `."` + tableName + `"` + tableStructure - _, err := trino.ExecContext(ctx, createTableSql) - common.PanicIfError(trino.Config, err) -} diff --git a/src/syncer-common/utils.go b/src/syncer-common/utils.go index e04b717..6e81d1a 100644 --- a/src/syncer-common/utils.go +++ b/src/syncer-common/utils.go @@ -14,6 +14,11 @@ import ( "github.com/BemiHQ/BemiDB/src/common" ) +var DUCKDB_BOOT_QUERIES = []string{ + "SET memory_limit='2GB'", + "SET threads=2", +} + func Int64ToString(i int64) string { return strconv.FormatInt(i, 10) } diff --git a/src/syncer-postgres/config.go b/src/syncer-postgres/config.go index c438084..51ff6c5 100644 --- a/src/syncer-postgres/config.go +++ b/src/syncer-postgres/config.go @@ -17,15 +17,6 @@ const ( SyncModeCDC SyncMode = "CDC" SyncModeIncremental SyncMode = "INCREMENTAL" - ENV_NATS_URL = "NATS_URL" - ENV_NATS_STREAM = "NATS_JETSTREAM_STREAM" - ENV_NATS_SUBJECT = "NATS_JETSTREAM_SUBJECT" - ENV_NATS_CONSUMER_NAME = "NATS_JETSTREAM_CONSUMER_NAME" - ENV_NATS_FETCH_TIMEOUT_SECONDS = "NATS_FETCH_TIMEOUT_SECONDS" - - ENV_TRINO_DATABASE_URL = "TRINO_DATABASE_URL" - ENV_TRINO_CATALOG_NAME = "TRINO_CATALOG_NAME" - ENV_DESTINATION_SCHEMA_NAME = "DESTINATION_SCHEMA_NAME" ENV_DATABASE_URL = "SOURCE_POSTGRES_DATABASE_URL" @@ -33,8 +24,16 @@ const ( ENV_INCLUDE_SCHEMAS = "SOURCE_POSTGRES_INCLUDE_SCHEMAS" ENV_INCLUDE_TABLES = "SOURCE_POSTGRES_INCLUDE_TABLES" ENV_EXCLUDE_TABLES = "SOURCE_POSTGRES_EXCLUDE_TABLES" - ENV_CURSOR_COLUMNS = "SOURCE_POSTGRES_CURSOR_COLUMNS" - ENV_IGNORE_UPDATE_COLUMNS = "SOURCE_POSTGRES_IGNORE_UPDATE_COLUMNS" + ENV_CURSOR_COLUMNS = "SOURCE_POSTGRES_CURSOR_COLUMNS" // Incremental sync + ENV_REPLICATION_SLOT = "SOURCE_POSTGRES_REPLICATION_SLOT" // CDC sync + ENV_IGNORE_UPDATE_COLUMNS = "SOURCE_POSTGRES_IGNORE_UPDATE_COLUMNS" // CDC sync + + // CDC sync + ENV_NATS_URL = "NATS_URL" + ENV_NATS_STREAM = "NATS_JETSTREAM_STREAM" + ENV_NATS_SUBJECT = "NATS_JETSTREAM_SUBJECT" + ENV_NATS_CONSUMER_NAME = "NATS_JETSTREAM_CONSUMER_NAME" + ENV_NATS_FETCH_TIMEOUT_SECONDS = "NATS_FETCH_TIMEOUT_SECONDS" DEFAULT_NATS_FETCH_TIMEOUT_SECONDS = 30 ) @@ -49,7 +48,6 @@ type NatsConfig struct { type Config struct { CommonConfig *common.CommonConfig - TrinoConfig *syncerCommon.TrinoConfig DestinationSchemaName string SyncMode SyncMode @@ -58,6 +56,7 @@ type Config struct { IncludeTables common.Set[string] ExcludeTables common.Set[string] CursorColumnNameByTableName map[string]string // Incremental sync + ReplicationSlot string // CDC sync IgnoreUpdateColumns common.Set[string] // CDC sync Nats NatsConfig // CDC sync } @@ -79,7 +78,6 @@ func init() { func registerFlags() { _config.CommonConfig = &common.CommonConfig{} - _config.TrinoConfig = &syncerCommon.TrinoConfig{} flag.StringVar(&_config.CommonConfig.LogLevel, "log-level", os.Getenv(common.ENV_LOG_LEVEL), `Log level: "ERROR", "WARN", "INFO", "DEBUG", "TRACE". Default: "`+common.DEFAULT_LOG_LEVEL+`"`) flag.StringVar(&_config.CommonConfig.CatalogDatabaseUrl, "catalog-database-url", os.Getenv(common.ENV_CATALOG_DATABASE_URL), "Catalog database URL") @@ -90,16 +88,14 @@ func registerFlags() { flag.StringVar(&_config.CommonConfig.Aws.SecretAccessKey, "aws-secret-access-key", os.Getenv(common.ENV_AWS_SECRET_ACCESS_KEY), "AWS secret access key") flag.BoolVar(&_config.CommonConfig.DisableAnonymousAnalytics, "disable-anonymous-analytics", os.Getenv(common.ENV_DISABLE_ANONYMOUS_ANALYTICS) == "true", "Disable anonymous analytics collection") - flag.StringVar(&_config.TrinoConfig.DatabaseUrl, "trino-database-url", os.Getenv(ENV_TRINO_DATABASE_URL), "Trino database URL to sync to") - flag.StringVar(&_config.TrinoConfig.CatalogName, "trino-catalog-name", os.Getenv(ENV_TRINO_CATALOG_NAME), "Trino catalog name") flag.StringVar(&_config.DestinationSchemaName, "destination-schema-name", os.Getenv(ENV_DESTINATION_SCHEMA_NAME), "Destination schema name to store the synced data") - flag.StringVar(&_config.DatabaseUrl, "database-url", os.Getenv(ENV_DATABASE_URL), "PostgreSQL database URL") flag.StringVar((*string)(&_config.SyncMode), "sync-mode", os.Getenv(ENV_SYNC_MODE), `Sync mode: "FULL_REFRESH", "CDC", or "INCREMENTAL"`) flag.StringVar(&_configParseValues.IncludeSchemas, "include-schemas", os.Getenv(ENV_INCLUDE_SCHEMAS), "Comma-separated list of schemas to include in the sync. Default: all schemas included") flag.StringVar(&_configParseValues.IncludeTables, "include-tables", os.Getenv(ENV_INCLUDE_TABLES), "Comma-separated list of tables to include in the sync. Default: all tables included") flag.StringVar(&_configParseValues.ExcludeTables, "exclude-tables", os.Getenv(ENV_EXCLUDE_TABLES), "Comma-separated list of tables to exclude from the sync. Default: no tables excluded") flag.StringVar(&_configParseValues.CursorColumns, "cursor-columns", os.Getenv(ENV_CURSOR_COLUMNS), "Cursor columns to use for incremental sync. Format: schema.table=column,schema2.table2=column2. Default: no cursor columns specified") + flag.StringVar(&_config.ReplicationSlot, "replication-slot", os.Getenv(ENV_REPLICATION_SLOT), "Replication slot name for CDC sync") flag.StringVar(&_configParseValues.IgnoreUpdateColumns, "ignore-update-columns", os.Getenv(ENV_IGNORE_UPDATE_COLUMNS), "Comma-separated list of columns to ignore for updates in CDC mode. Default: no columns ignored") flag.StringVar(&_config.Nats.Url, "nats-url", os.Getenv(ENV_NATS_URL), "NATS URL") flag.StringVar(&_config.Nats.Stream, "nats-stream", os.Getenv(ENV_NATS_STREAM), "NATS stream to read from") @@ -139,16 +135,9 @@ func parseFlags() { panic("AWS access key ID is required") } - if _config.TrinoConfig.DatabaseUrl == "" { - panic("Trino database URL is required") - } - if _config.TrinoConfig.CatalogName == "" { - panic("Trino catalog name is required") - } if _config.DestinationSchemaName == "" { panic("Destination schema name is required") } - if _configParseValues.IncludeSchemas != "" { _config.IncludeSchemas = common.NewSet[string]().AddAll(strings.Split(_configParseValues.IncludeSchemas, ",")) } @@ -161,20 +150,6 @@ func parseFlags() { if _configParseValues.ExcludeTables != "" { _config.ExcludeTables = common.NewSet[string]().AddAll(strings.Split(_configParseValues.ExcludeTables, ",")) } - if _configParseValues.IgnoreUpdateColumns != "" { - _config.IgnoreUpdateColumns = common.NewSet[string]().AddAll(strings.Split(_configParseValues.IgnoreUpdateColumns, ",")) - } - if _configParseValues.CursorColumns != "" { - _config.CursorColumnNameByTableName = make(map[string]string) - cursorColumns := strings.Split(_configParseValues.CursorColumns, ",") - for _, cursorColumn := range cursorColumns { - parts := strings.Split(cursorColumn, "=") - if len(parts) != 2 { - panic("Invalid cursor column format. Expected schema.table=column, got: " + cursorColumn) - } - _config.CursorColumnNameByTableName[parts[0]] = parts[1] - } - } if _config.SyncMode == "" { panic("Sync mode is required") @@ -184,6 +159,13 @@ func parseFlags() { switch _config.SyncMode { case SyncModeCDC: + if _config.ReplicationSlot == "" { + panic("Replication slot name is required for CDC sync") + } + if _configParseValues.IgnoreUpdateColumns != "" { + _config.IgnoreUpdateColumns = common.NewSet[string]().AddAll(strings.Split(_configParseValues.IgnoreUpdateColumns, ",")) + } + if _config.Nats.Url == "" { panic("NATS URL is required") } @@ -193,9 +175,24 @@ func parseFlags() { if _config.Nats.Subject == "" { panic("NATS subject is required") } + if _config.Nats.ConsumerName == "" { + panic("NATS consumer name is required") + } if _config.Nats.FetchTimeoutSeconds <= 0 { panic("NATS fetch timeout must be greater than 0") } + case SyncModeIncremental: + if _configParseValues.CursorColumns != "" { + _config.CursorColumnNameByTableName = make(map[string]string) + cursorColumns := strings.Split(_configParseValues.CursorColumns, ",") + for _, cursorColumn := range cursorColumns { + parts := strings.Split(cursorColumn, "=") + if len(parts) != 2 { + panic("Invalid cursor column format. Expected schema.table=column, got: " + cursorColumn) + } + _config.CursorColumnNameByTableName[parts[0]] = parts[1] + } + } } if _config.DatabaseUrl == "" { diff --git a/src/syncer-postgres/go.mod b/src/syncer-postgres/go.mod index e938c7b..a359417 100644 --- a/src/syncer-postgres/go.mod +++ b/src/syncer-postgres/go.mod @@ -5,7 +5,6 @@ go 1.24.4 require ( github.com/BemiHQ/BemiDB/src/common v0.0.0-00010101000000-000000000000 github.com/BemiHQ/BemiDB/src/syncer-common v0.0.1 - github.com/marcboeker/go-duckdb/v2 v2.3.2 github.com/nats-io/nats.go v1.43.0 ) @@ -36,43 +35,35 @@ require ( github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.35.0 // indirect github.com/aws/smithy-go v1.22.5 // indirect - github.com/duckdb/duckdb-go-bindings v0.1.17 // indirect - github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.12 // indirect - github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.12 // indirect - github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.12 // indirect - github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.12 // indirect - github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.12 // indirect + github.com/duckdb/duckdb-go-bindings v0.1.16 // indirect + github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11 // indirect + github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11 // indirect + github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11 // indirect + github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11 // indirect + github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11 // indirect github.com/go-viper/mapstructure/v2 v2.3.0 // indirect github.com/goccy/go-json v0.10.5 // indirect github.com/golang/snappy v1.0.0 // indirect github.com/google/flatbuffers v25.2.10+incompatible // indirect github.com/google/uuid v1.6.0 // indirect - github.com/hashicorp/go-uuid v1.0.3 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect github.com/jackc/pgx/v5 v5.7.5 // indirect - github.com/jcmturner/aescts/v2 v2.0.0 // indirect - github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect - github.com/jcmturner/gofork v1.7.6 // indirect - github.com/jcmturner/goidentity/v6 v6.0.1 // indirect - github.com/jcmturner/gokrb5/v8 v8.4.4 // indirect - github.com/jcmturner/rpc/v2 v2.0.3 // indirect github.com/klauspost/compress v1.18.0 // indirect github.com/klauspost/cpuid/v2 v2.2.11 // indirect github.com/linkedin/goavro v2.1.0+incompatible // indirect - github.com/marcboeker/go-duckdb/arrowmapping v0.0.10 // indirect - github.com/marcboeker/go-duckdb/mapping v0.0.11 // indirect + github.com/marcboeker/go-duckdb/arrowmapping v0.0.9 // indirect + github.com/marcboeker/go-duckdb/mapping v0.0.10 // indirect + github.com/marcboeker/go-duckdb/v2 v2.3.2 // indirect github.com/nats-io/nkeys v0.4.11 // indirect github.com/nats-io/nuid v1.0.1 // indirect github.com/pierrec/lz4/v4 v4.1.22 // indirect - github.com/trinodb/trino-go-client v0.323.0 // indirect github.com/xitongsys/parquet-go v1.6.2 // indirect github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b // indirect github.com/zeebo/xxh3 v1.0.2 // indirect golang.org/x/crypto v0.40.0 // indirect golang.org/x/exp v0.0.0-20250718183923-645b1fa84792 // indirect golang.org/x/mod v0.26.0 // indirect - golang.org/x/net v0.42.0 // indirect golang.org/x/sync v0.16.0 // indirect golang.org/x/sys v0.34.0 // indirect golang.org/x/text v0.27.0 // indirect diff --git a/src/syncer-postgres/go.sum b/src/syncer-postgres/go.sum index fddabca..d27554a 100644 --- a/src/syncer-postgres/go.sum +++ b/src/syncer-postgres/go.sum @@ -68,8 +68,6 @@ cloud.google.com/go/trace v1.2.0/go.mod h1:Wc8y/uYyOhPy12KEnXG9XGrvfMz5F5SrYecQl contrib.go.opencensus.io/exporter/aws v0.0.0-20200617204711-c478e41e60e9/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= contrib.go.opencensus.io/exporter/stackdriver v0.13.10/go.mod h1:I5htMbyta491eUxufwwZPQdcKvvgzMB4O9ni41YnIM8= contrib.go.opencensus.io/integrations/ocsql v0.1.7/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= -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= github.com/Azure/azure-amqp-common-go/v3 v3.2.1/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= github.com/Azure/azure-amqp-common-go/v3 v3.2.2/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= @@ -93,8 +91,6 @@ github.com/Azure/azure-service-bus-go v0.11.5/go.mod h1:MI6ge2CuQWBVq+ly456MY7Xq github.com/Azure/azure-storage-blob-go v0.14.0/go.mod h1:SMqIBi+SuiQH32bvyjngEewEeXoPfKMgWlBDaYf6fck= github.com/Azure/go-amqp v0.16.0/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= github.com/Azure/go-amqp v0.16.4/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= -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/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= github.com/Azure/go-autorest/autorest v0.11.19/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= @@ -117,13 +113,7 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/GoogleCloudPlatform/cloudsql-proxy v1.29.0/go.mod h1:spvB9eLJH9dutlbPSRmHvSXXHOwGRyeXh1jVdquA2G8= 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/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/ahmetb/dlog v0.0.0-20170105205344-4fb5f8204f26 h1:3YVZUqkoev4mL+aCwVOSWV4M7pN+NURHL38Z2zq5JKA= -github.com/ahmetb/dlog v0.0.0-20170105205344-4fb5f8204f26/go.mod h1:ymXt5bw5uSNu4jveerFxE0vNYxF8ncqbptntMaFMg3k= github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= @@ -221,8 +211,6 @@ github.com/aws/smithy-go v1.22.5 h1:P9ATCXPMb2mPjYBgueqJNCA5S9UfktsW0tTxi+a7eqw= github.com/aws/smithy-go v1.22.5/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/bobg/gcsobj v0.1.2/go.mod h1:vS49EQ1A1Ib8FgrL58C8xXYZyOCR2TgzAdopy6/ipa8= -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/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= @@ -241,8 +229,6 @@ github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/colinmarc/hdfs/v2 v2.1.1/go.mod h1:M3x+k8UKKmxtFu++uAZ0OtDU8jR3jnaZIAc6yK4Ue0c= -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/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= @@ -257,26 +243,18 @@ github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQ github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -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/duckdb/duckdb-go-bindings v0.1.17 h1:SjpRwrJ7v0vqnIvLeVFHlhuS72+Lp8xxQ5jIER2LZP4= -github.com/duckdb/duckdb-go-bindings v0.1.17/go.mod h1:pBnfviMzANT/9hi4bg+zW4ykRZZPCXlVuvBWEcZofkc= -github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.12 h1:8CLBnsq9YDhi2Gmt3sjSUeXxMzyMQAKefjqUy9zVPFk= -github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.12/go.mod h1:Ezo7IbAfB8NP7CqPIN8XEHKUg5xdRRQhcPPlCXImXYA= -github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.12 h1:wjO4I0GhMh2xIpiUgRpzuyOT4KxXLoUS/rjU7UUVvCE= -github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.12/go.mod h1:eS7m/mLnPQgVF4za1+xTyorKRBuK0/BA44Oy6DgrGXI= -github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.12 h1:HzKQi2C+1jzmwANsPuYH6x9Sfw62SQTjNAEq3OySKFI= -github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.12/go.mod h1:1GOuk1PixiESxLaCGFhag+oFi7aP+9W8byymRAvunBk= -github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.12 h1:YGSR7AFLw2gJ7IbgLE6DkKYmgKv1LaRSd/ZKF1yh2oE= -github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.12/go.mod h1:o7crKMpT2eOIi5/FY6HPqaXcvieeLSqdXXaXbruGX7w= -github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.12 h1:2aduW6fnFnT2Q45PlIgHbatsPOxV9WSZ5B2HzFfxaxA= -github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.12/go.mod h1:IlOhJdVKUJCAPj3QsDszUo8DVdvp1nBFp4TUJVdw99s= +github.com/duckdb/duckdb-go-bindings v0.1.16 h1:XPCk9hzP06PoWIxDPVU3gAy0m1XmLaZHTzLggNx/U9k= +github.com/duckdb/duckdb-go-bindings v0.1.16/go.mod h1:pBnfviMzANT/9hi4bg+zW4ykRZZPCXlVuvBWEcZofkc= +github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11 h1:GXQkG4HmEbwPtqCSabJTp9wZQQ7Gqr3KveLNesQWQOs= +github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11/go.mod h1:Ezo7IbAfB8NP7CqPIN8XEHKUg5xdRRQhcPPlCXImXYA= +github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11 h1:ATJMSBIDA/YAm/6CKeBDRtGK1OOwqfTZbWg9Y5fAc9E= +github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11/go.mod h1:eS7m/mLnPQgVF4za1+xTyorKRBuK0/BA44Oy6DgrGXI= +github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11 h1:AjvnGst1avyOECYiykthyHR4DTYTaqNDPr5W/0t5j0k= +github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11/go.mod h1:1GOuk1PixiESxLaCGFhag+oFi7aP+9W8byymRAvunBk= +github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11 h1:j3B1biawuhtxe2Chkiqcwf1Kxe8VJc8lLVmjBIcJrkI= +github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11/go.mod h1:o7crKMpT2eOIi5/FY6HPqaXcvieeLSqdXXaXbruGX7w= +github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11 h1:xR3vRE8y+48U6xDNkUlOfbl7/OTA7FVcDXJ+5vETuHU= +github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11/go.mod h1:IlOhJdVKUJCAPj3QsDszUo8DVdvp1nBFp4TUJVdw99s= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= 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= @@ -317,17 +295,12 @@ github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= 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/golang-jwt/jwt v3.2.1+incompatible h1:73Z+4BJcrTC+KczS6WvTPvRGOp1WmfEP4Q1lOd9Z/+c= github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.4.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= -github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188/go.mod h1:vXjM/+wXQnTPR4KqTKDgJukSZ6amVRtWMPEjE6sQoK8= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -414,8 +387,6 @@ github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -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/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -429,18 +400,11 @@ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5m github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ= -github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= -github.com/gorilla/sessions v1.2.1 h1:DHd3rPN5lE3Ts3D8rKkQ8x/0kqfeNmBAaiSi+o7FsgI= -github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/hanwen/go-fuse v1.0.0/go.mod h1:unqXarDXqzAk0rt98O2tVndEPIpUgLD9+rwFisZH3Ok= github.com/hanwen/go-fuse/v2 v2.1.0/go.mod h1:oRyA5eK+pvJyv5otpO/DgccS8y/RvYMaO00GgRLGryc= github.com/hashicorp/go-uuid v0.0.0-20180228145832-27454136f036/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= -github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= 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= @@ -491,19 +455,7 @@ github.com/jackc/puddle v1.2.1 h1:gI8os0wpRXFd4FiAY2dWiqRK037tjj3t7rKFeO4X5iw= github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= -github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= -github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= -github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo= -github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= github.com/jcmturner/gofork v0.0.0-20180107083740-2aebee971930/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= -github.com/jcmturner/gofork v1.7.6 h1:QH0l3hzAU1tfT3rZCnW5zXl+orbkNMMRGJfdJjHVETg= -github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo= -github.com/jcmturner/goidentity/v6 v6.0.1 h1:VKnZd2oEIMorCTsFBnJWbExfNN7yZr3EhJAxwOkZg6o= -github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= -github.com/jcmturner/gokrb5/v8 v8.4.4 h1:x1Sv4HaTpepFkXbt2IkL29DXRf8sOfZXo8eRKh687T8= -github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs= -github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY= -github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= @@ -546,10 +498,10 @@ github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/linkedin/goavro v2.1.0+incompatible h1:DV2aUlj2xZiuxQyvag8Dy7zjY69ENjS66bWkSfdpddY= github.com/linkedin/goavro v2.1.0+incompatible/go.mod h1:bBCwI2eGYpUI/4820s67MElg9tdeLbINjLjiM2xZFYM= -github.com/marcboeker/go-duckdb/arrowmapping v0.0.10 h1:G1W+GVnUefR8uy7jHdNO+CRMsmFG5mFPIHVAespfFCA= -github.com/marcboeker/go-duckdb/arrowmapping v0.0.10/go.mod h1:jccUb8TYD0p5TsEEeN4SXuslNJHo23QaKOqKD+U6uFU= -github.com/marcboeker/go-duckdb/mapping v0.0.11 h1:fusN1b1l7Myxafifp596I6dNLNhN5Uv/rw31qAqBwqw= -github.com/marcboeker/go-duckdb/mapping v0.0.11/go.mod h1:aYBjFLgfKO0aJIbDtXPiaL5/avRQISveX/j9tMf9JhU= +github.com/marcboeker/go-duckdb/arrowmapping v0.0.9 h1:xj+kFOqR2gH3Mcxx9LmAVHebSnCiPm303N+uxfkWVmY= +github.com/marcboeker/go-duckdb/arrowmapping v0.0.9/go.mod h1:o56AqVS90v5bpxhPnOK9La7AfNTOrMORiqTQrlRbdPQ= +github.com/marcboeker/go-duckdb/mapping v0.0.10 h1:b/y2W8/hNlD0Dwjq0mCqIlLXpjQMnWy0WqDV9b9lHQQ= +github.com/marcboeker/go-duckdb/mapping v0.0.10/go.mod h1:Ro6Tw6sGG50O8S0daZsA8TrQJz/DvGrzGvMD7Jihirw= github.com/marcboeker/go-duckdb/v2 v2.3.2 h1:96zG2JPyIhCFjHdBjjSpOdhzJzehoGTdl7LskkuMUTs= github.com/marcboeker/go-duckdb/v2 v2.3.2/go.mod h1:VeXz9ZM6klNvICHrXEUzaHSgNqBeTdyMxr4CICw/UaY= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= @@ -568,12 +520,6 @@ github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -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/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= @@ -588,14 +534,6 @@ github.com/nats-io/nkeys v0.4.11/go.mod h1:szDimtgmfOi9n25JpfIdGw12tZFYXqhGxjhVx github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/ncw/swift v1.0.52/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -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/pborman/getopt v0.0.0-20180729010549-6fdd0a2c7117/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= github.com/pierrec/lz4/v4 v4.1.8/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= @@ -604,7 +542,6 @@ github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= 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/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= @@ -622,15 +559,11 @@ github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFR 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.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= -github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= 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.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -639,20 +572,10 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 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.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/trinodb/trino-go-client v0.323.0 h1:I7Y67um1NnrwKCThzGr8o0xYUldb+n4vPn5R/qUxW2E= -github.com/trinodb/trino-go-client v0.323.0/go.mod h1:F+7TZRD0+0M8XqYsgXT8+EJT1pSlbxTECVD1BDzCc70= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -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/xitongsys/parquet-go v1.5.1/go.mod h1:xUxwM8ELydxh4edHGegYq1pA8NnMKDx0K/GyB0o2bww= github.com/xitongsys/parquet-go v1.6.2 h1:MhCaXii4eqceKPu9BwrjLqyK10oX9WF+xGhwvwbw7xM= github.com/xitongsys/parquet-go v1.6.2/go.mod h1:IulAQyalCm0rPiZVNnCgm/PCL64X2tdSVGMQ/UeKqWA= @@ -716,7 +639,6 @@ golang.org/x/crypto v0.0.0-20211115234514-b4de73f9ece8/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220511200225-c6db032c6c88/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM= @@ -815,8 +737,6 @@ golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs= -golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8= 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= @@ -1228,7 +1148,6 @@ gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/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= diff --git a/src/syncer-postgres/init_test.go b/src/syncer-postgres/init_test.go index 5eadd9c..8faac51 100644 --- a/src/syncer-postgres/init_test.go +++ b/src/syncer-postgres/init_test.go @@ -11,12 +11,13 @@ import ( var PG_SCHEMA_COLUMNS_TEST_TABLE = []PgSchemaColumn{ { - ColumnName: "id", - DataType: "integer", - UdtName: "int4", - IsNullable: "NO", - NumericPrecision: "32", - Namespace: "pg_catalog", + ColumnName: "id", + DataType: "integer", + UdtName: "int4", + IsNullable: "NO", + NumericPrecision: "32", + Namespace: "pg_catalog", + IsPartOfUniqueIndex: true, }, { ColumnName: "bit_column", @@ -275,28 +276,30 @@ var PG_SCHEMA_COLUMNS_TEST_TABLE = []PgSchemaColumn{ } var PG_SCHEMA_COLUMNS_PARTITIONED_TABLE = []PgSchemaColumn{ { - ColumnName: "timestamp_column", - DataType: "timestamp without time zone", - UdtName: "timestamp", - IsNullable: "NO", - OrdinalPosition: "1", - NumericPrecision: "0", - NumericScale: "0", - DatetimePrecision: "6", - Namespace: "pg_catalog", + ColumnName: "timestamp_column", + DataType: "timestamp without time zone", + UdtName: "timestamp", + IsNullable: "NO", + OrdinalPosition: "1", + NumericPrecision: "0", + NumericScale: "0", + DatetimePrecision: "6", + Namespace: "pg_catalog", + IsPartOfUniqueIndex: true, }, } var PG_SCHEMA_COLUMNS_EMPTY_TABLE = []PgSchemaColumn{ { - ColumnName: "id", - DataType: "integer", - UdtName: "int4", - IsNullable: "NO", - OrdinalPosition: "1", - NumericPrecision: "32", - NumericScale: "0", - DatetimePrecision: "0", - Namespace: "pg_catalog", + ColumnName: "id", + DataType: "integer", + UdtName: "int4", + IsNullable: "NO", + OrdinalPosition: "1", + NumericPrecision: "32", + NumericScale: "0", + DatetimePrecision: "0", + Namespace: "pg_catalog", + IsPartOfUniqueIndex: true, }, } @@ -471,7 +474,7 @@ var JSON_ROWS_TEST_TABLE = []string{ "xmin":null }, "transaction":null, - "op":"r", + "op":"c", "ts_ms":1750942485897, "ts_us":1750942485897437, "ts_ns":1750942485897437000 @@ -539,7 +542,7 @@ var JSON_ROWS_TEST_TABLE = []string{ "xmin":null }, "transaction":null, - "op":"r", + "op":"c", "ts_ms":1750942485898, "ts_us":1750942485898829, "ts_ns":1750942485898829000 @@ -568,7 +571,7 @@ var JSON_ROWS_PARTITIONED_TABLE1 = []string{ "xmin":null }, "transaction":null, - "op":"r", + "op":"c", "ts_ms":1750942485881, "ts_us":1750942485881498, "ts_ns":1750942485881498000 @@ -597,7 +600,7 @@ var JSON_ROWS_PARTITIONED_TABLE2 = []string{ "xmin":null }, "transaction":null, - "op":"r", + "op":"c", "ts_ms":1750942485882, "ts_us":1750942485882849, "ts_ns":1750942485882849000 @@ -626,7 +629,63 @@ var JSON_ROWS_PARTITIONED_TABLE3 = []string{ "xmin":null }, "transaction":null, - "op":"r", + "op":"c", + "ts_ms":1750942485884, + "ts_us":1750942485884078, + "ts_ns":1750942485884078000 + }`, +} +var JSON_ROWS_EMPTY_TABLE = []string{ + `{ + "before":null, + "after":{ + "id":1 + }, + "source":{ + "version":"3.1.3.Final", + "connector":"postgresql", + "name":"prefix", + "ts_ms":1750942485790, + "snapshot":"last_in_data_collection", + "db":"tpch", + "sequence":"[null,\"98162912\"]", + "ts_us":1750942485790370, + "ts_ns":1750942485790370000, + "schema":"test", + "table":"empty_table", + "txId":2352, + "lsn":98162912, + "xmin":null + }, + "transaction":null, + "op":"c", + "ts_ms":1750942485884, + "ts_us":1750942485884078, + "ts_ns":1750942485884078000 + }`, + `{ + "before":{ + "id":1 + }, + "after":null, + "source":{ + "version":"3.1.3.Final", + "connector":"postgresql", + "name":"prefix", + "ts_ms":1750942485790, + "snapshot":"last_in_data_collection", + "db":"tpch", + "sequence":"[null,\"98162912\"]", + "ts_us":1750942485790370, + "ts_ns":1750942485790370000, + "schema":"test", + "table":"empty_table", + "txId":2352, + "lsn":98162912, + "xmin":null + }, + "transaction":null, + "op":"d", "ts_ms":1750942485884, "ts_us":1750942485884078, "ts_ns":1750942485884078000 @@ -635,11 +694,10 @@ var JSON_ROWS_PARTITIONED_TABLE3 = []string{ func init() { config := loadTestConfig() - trino := syncerCommon.NewTrino(config.CommonConfig, config.TrinoConfig, config.DestinationSchemaName) - defer trino.Close() - utils := NewSyncerUtils(config) - trino.CreateSchemaIfNotExists() + storageS3 := syncerCommon.NewStorageS3(config.CommonConfig) + duckdbClient := common.NewDuckdbClient(config.CommonConfig) + utils := NewSyncerUtils(config, storageS3, duckdbClient) // Prepare PgSchemaColumns for i := range PG_SCHEMA_COLUMNS_TEST_TABLE { @@ -653,6 +711,9 @@ func init() { if PG_SCHEMA_COLUMNS_TEST_TABLE[i].NumericScale == "" { PG_SCHEMA_COLUMNS_TEST_TABLE[i].NumericScale = "0" } + if PG_SCHEMA_COLUMNS_TEST_TABLE[i].DatetimePrecision == "" { + PG_SCHEMA_COLUMNS_TEST_TABLE[i].DatetimePrecision = "0" + } PG_SCHEMA_COLUMNS_TEST_TABLE[i].Config = config } for i := range PG_SCHEMA_COLUMNS_PARTITIONED_TABLE { @@ -664,20 +725,14 @@ func init() { switch config.SyncMode { case SyncModeFullRefresh: - storageS3 := syncerCommon.NewStorageS3(config.CommonConfig) - utils.DeleteOldTables(storageS3, common.NewSet[string]()) - createTestTableViaFullRefresh(config, PgSchemaTable{Schema: "public", Table: "test_table"}, PG_SCHEMA_COLUMNS_TEST_TABLE, CSV_ROWS_TEST_TABLE) - createTestTableViaFullRefresh(config, PgSchemaTable{Schema: "public", Table: "partitioned_table1"}, PG_SCHEMA_COLUMNS_PARTITIONED_TABLE, CSV_ROWS_PARTITIONED_TABLE1) - createTestTableViaFullRefresh(config, PgSchemaTable{Schema: "public", Table: "partitioned_table2"}, PG_SCHEMA_COLUMNS_PARTITIONED_TABLE, CSV_ROWS_PARTITIONED_TABLE2) - createTestTableViaFullRefresh(config, PgSchemaTable{Schema: "public", Table: "partitioned_table3"}, PG_SCHEMA_COLUMNS_PARTITIONED_TABLE, CSV_ROWS_PARTITIONED_TABLE3) - createTestTableViaFullRefresh(config, PgSchemaTable{Schema: "test", Table: "empty_table"}, PG_SCHEMA_COLUMNS_EMPTY_TABLE, [][]string{}) + syncer := NewSyncerFullRefresh(config, utils, storageS3, duckdbClient) + createTestTableViaFullRefresh(syncer, PgSchemaTable{Schema: "public", Table: "test_table"}, PG_SCHEMA_COLUMNS_TEST_TABLE, CSV_ROWS_TEST_TABLE) + createTestTableViaFullRefresh(syncer, PgSchemaTable{Schema: "public", Table: "partitioned_table1"}, PG_SCHEMA_COLUMNS_PARTITIONED_TABLE, CSV_ROWS_PARTITIONED_TABLE1) + createTestTableViaFullRefresh(syncer, PgSchemaTable{Schema: "public", Table: "partitioned_table2"}, PG_SCHEMA_COLUMNS_PARTITIONED_TABLE, CSV_ROWS_PARTITIONED_TABLE2) + createTestTableViaFullRefresh(syncer, PgSchemaTable{Schema: "public", Table: "partitioned_table3"}, PG_SCHEMA_COLUMNS_PARTITIONED_TABLE, CSV_ROWS_PARTITIONED_TABLE3) + createTestTableViaFullRefresh(syncer, PgSchemaTable{Schema: "test", Table: "empty_table"}, PG_SCHEMA_COLUMNS_EMPTY_TABLE, [][]string{}) case SyncModeCDC: - utils.DropOldTables(trino, common.NewSet[string]()) - createTestTableViaCdc(config, trino, PgSchemaTable{Schema: "public", Table: "test_table"}, PG_SCHEMA_COLUMNS_TEST_TABLE, JSON_ROWS_TEST_TABLE) - createTestTableViaCdc(config, trino, PgSchemaTable{Schema: "public", Table: "partitioned_table1"}, PG_SCHEMA_COLUMNS_PARTITIONED_TABLE, JSON_ROWS_PARTITIONED_TABLE1) - createTestTableViaCdc(config, trino, PgSchemaTable{Schema: "public", Table: "partitioned_table2"}, PG_SCHEMA_COLUMNS_PARTITIONED_TABLE, JSON_ROWS_PARTITIONED_TABLE2) - createTestTableViaCdc(config, trino, PgSchemaTable{Schema: "public", Table: "partitioned_table3"}, PG_SCHEMA_COLUMNS_PARTITIONED_TABLE, JSON_ROWS_PARTITIONED_TABLE3) - createTestTableViaCdc(config, trino, PgSchemaTable{Schema: "test", Table: "empty_table"}, PG_SCHEMA_COLUMNS_EMPTY_TABLE, []string{}) + panic("CDC is not supported") } } @@ -695,12 +750,8 @@ func setTestArgs(args []string) { registerFlags() } -func createTestTableViaCdc(config *Config, trino *syncerCommon.Trino, pgSchemaTable PgSchemaTable, pgSchemaColumns []PgSchemaColumn, messagesStrings []string) { - panic("CDC is not supported") -} - -func createTestTableViaFullRefresh(config *Config, pgSchemaTable PgSchemaTable, pgSchemaColumns []PgSchemaColumn, rows [][]string) { - cappedBuffer := syncerCommon.NewCappedBuffer(config.CommonConfig, MAX_IN_MEMORY_BUFFER_SIZE) +func createTestTableViaFullRefresh(syncer *SyncerFullRefresh, pgSchemaTable PgSchemaTable, pgSchemaColumns []PgSchemaColumn, rows [][]string) { + cappedBuffer := syncerCommon.NewCappedBuffer(syncer.Config.CommonConfig, MAX_IN_MEMORY_BUFFER_SIZE) writer := csv.NewWriter(cappedBuffer) headerRow := []string{} @@ -708,16 +759,15 @@ func createTestTableViaFullRefresh(config *Config, pgSchemaTable PgSchemaTable, headerRow = append(headerRow, pgSchemaColumn.ColumnName) } err := writer.Write(headerRow) - common.PanicIfError(config.CommonConfig, err) + common.PanicIfError(syncer.Config.CommonConfig, err) for _, row := range rows { err := writer.Write(row) - common.PanicIfError(config.CommonConfig, err) + common.PanicIfError(syncer.Config.CommonConfig, err) } writer.Flush() cappedBuffer.Close() - syncer := NewSyncerFullRefresh(config) syncer.writeToIceberg(pgSchemaTable, pgSchemaColumns, cappedBuffer) } diff --git a/src/syncer-postgres/pg_schema_column.go b/src/syncer-postgres/pg_schema_column.go index 76cc781..91dd1b8 100644 --- a/src/syncer-postgres/pg_schema_column.go +++ b/src/syncer-postgres/pg_schema_column.go @@ -1,13 +1,8 @@ package main import ( - "encoding/csv" - "fmt" - "reflect" "strings" - "time" - "github.com/BemiHQ/BemiDB/src/common" "github.com/BemiHQ/BemiDB/src/syncer-common" ) @@ -17,17 +12,17 @@ const ( ) type PgSchemaColumn struct { - ColumnName string - DataType string - UdtName string - IsNullable string - OrdinalPosition string - NumericPrecision string - NumericScale string - DatetimePrecision string - Namespace string - PartOfPrimaryKey bool - Config *Config + ColumnName string + DataType string + UdtName string + IsNullable string + OrdinalPosition string + NumericPrecision string + NumericScale string + DatetimePrecision string + Namespace string + IsPartOfUniqueIndex bool + Config *Config } func NewPgSchemaColumn(config *Config) *PgSchemaColumn { @@ -37,351 +32,60 @@ func NewPgSchemaColumn(config *Config) *PgSchemaColumn { } func (pgSchemaColumn *PgSchemaColumn) ToIcebergSchemaColumn() *syncerCommon.IcebergSchemaColumn { - var icebergColumnType syncerCommon.IcebergColumnType + icebergSchemaColumn := &syncerCommon.IcebergSchemaColumn{ + Config: pgSchemaColumn.Config.CommonConfig, + ColumnName: pgSchemaColumn.ColumnName, + Position: syncerCommon.StringToInt(pgSchemaColumn.OrdinalPosition), + NumericPrecision: syncerCommon.StringToInt(pgSchemaColumn.NumericPrecision), + NumericScale: syncerCommon.StringToInt(pgSchemaColumn.NumericScale), + IsList: pgSchemaColumn.DataType == PG_DATA_TYPE_ARRAY, + IsRequired: pgSchemaColumn.IsNullable != PG_TRUE, + IsPartOfUniqueIndex: pgSchemaColumn.IsPartOfUniqueIndex, + DatetimePrecision: syncerCommon.StringToInt(pgSchemaColumn.DatetimePrecision), + PgPrimitiveColumnType: strings.TrimLeft(pgSchemaColumn.UdtName, "_"), + } - switch strings.TrimLeft(pgSchemaColumn.UdtName, "_") { + switch icebergSchemaColumn.PgPrimitiveColumnType { case "bool": - icebergColumnType = syncerCommon.IcebergColumnTypeBoolean + icebergSchemaColumn.ColumnType = syncerCommon.IcebergColumnTypeBoolean case "bit", "int2", "int4": - icebergColumnType = syncerCommon.IcebergColumnTypeInteger + icebergSchemaColumn.ColumnType = syncerCommon.IcebergColumnTypeInteger case "xid": - icebergColumnType = syncerCommon.IcebergColumnTypeLong - case "int8", "xid8": - icebergColumnType = syncerCommon.IcebergColumnTypeDecimal + icebergSchemaColumn.ColumnType = syncerCommon.IcebergColumnTypeLong + case "int8", "xid8", "interval": + icebergSchemaColumn.ColumnType = syncerCommon.IcebergColumnTypeDecimal case "float4": - icebergColumnType = syncerCommon.IcebergColumnTypeFloat + icebergSchemaColumn.ColumnType = syncerCommon.IcebergColumnTypeFloat case "float8": - icebergColumnType = syncerCommon.IcebergColumnTypeDouble + icebergSchemaColumn.ColumnType = syncerCommon.IcebergColumnTypeDouble case "numeric": - icebergColumnType = syncerCommon.IcebergColumnTypeDecimal + icebergSchemaColumn.ColumnType = syncerCommon.IcebergColumnTypeDecimal case "date": - icebergColumnType = syncerCommon.IcebergColumnTypeDate + icebergSchemaColumn.ColumnType = syncerCommon.IcebergColumnTypeDate case "time": - icebergColumnType = syncerCommon.IcebergColumnTypeTime + icebergSchemaColumn.ColumnType = syncerCommon.IcebergColumnTypeTime case "timetz": - icebergColumnType = syncerCommon.IcebergColumnTypeTimeTz + icebergSchemaColumn.ColumnType = syncerCommon.IcebergColumnTypeTimeTz case "timestamp": - icebergColumnType = syncerCommon.IcebergColumnTypeTimestamp + icebergSchemaColumn.ColumnType = syncerCommon.IcebergColumnTypeTimestamp case "timestamptz": - icebergColumnType = syncerCommon.IcebergColumnTypeTimestampTz + icebergSchemaColumn.ColumnType = syncerCommon.IcebergColumnTypeTimestampTz case "varchar", "char", "text", "jsonb", "json", "bpchar", "uuid", "point", "line", "lseg", "box", "path", "polygon", "circle", "cidr", "inet", "macaddr", "macaddr8", - "interval", "ltree", "tsvector", "xml", "pg_snapshot": - icebergColumnType = syncerCommon.IcebergColumnTypeString + "ltree", "tsvector", "xml", "pg_snapshot": + icebergSchemaColumn.ColumnType = syncerCommon.IcebergColumnTypeString case "bytea": - icebergColumnType = syncerCommon.IcebergColumnTypeBinary + icebergSchemaColumn.ColumnType = syncerCommon.IcebergColumnTypeBinary default: // User-defined types -> VARCHAR if pgSchemaColumn.Namespace != PG_SCHEMA_PG_CATALOG { - icebergColumnType = syncerCommon.IcebergColumnTypeString + icebergSchemaColumn.PgPrimitiveColumnType = syncerCommon.PG_USER_DEFINED_PRIMITIVE_TYPE + icebergSchemaColumn.ColumnType = syncerCommon.IcebergColumnTypeString } else { panic("Unsupported PostgreSQL type: " + pgSchemaColumn.UdtName) } } - return &syncerCommon.IcebergSchemaColumn{ - Config: pgSchemaColumn.Config.CommonConfig, - ColumnName: pgSchemaColumn.ColumnName, - ColumnType: icebergColumnType, - Position: syncerCommon.StringToInt(pgSchemaColumn.OrdinalPosition), - NumericPrecision: syncerCommon.StringToInt(pgSchemaColumn.NumericPrecision), - NumericScale: syncerCommon.StringToInt(pgSchemaColumn.NumericScale), - IsList: pgSchemaColumn.DataType == PG_DATA_TYPE_ARRAY, - IsNullable: pgSchemaColumn.IsNullable == PG_TRUE, - } -} - -func (pgSchemaColumn *PgSchemaColumn) TrinoType() string { - primitiveType := pgSchemaColumn.primitiveTrinoType() - - if pgSchemaColumn.DataType == PG_DATA_TYPE_ARRAY { - return "ARRAY(" + primitiveType + ")" - } - return primitiveType -} - -func (pgSchemaColumn *PgSchemaColumn) JsonToTrinoValue(jsonValue interface{}) string { - if pgSchemaColumn.DataType == PG_DATA_TYPE_ARRAY { - if jsonValue == nil { - return "NULL" - } - - var values []string - - for _, value := range jsonValue.([]interface{}) { - values = append(values, pgSchemaColumn.jsonToPrimitiveTrinoValue(value)) - } - - return "ARRAY[" + strings.Join(values, ",") + "]" - } - - return pgSchemaColumn.jsonToPrimitiveTrinoValue(jsonValue) -} - -func (pgSchemaColumn *PgSchemaColumn) CsvToTrinoValue(csvValue string) string { - if pgSchemaColumn.DataType == PG_DATA_TYPE_ARRAY { - if csvValue == syncerCommon.BEMIDB_NULL_STRING { - return "NULL" - } - - csvString := strings.TrimPrefix(csvValue, "{") - csvString = strings.TrimSuffix(csvString, "}") - if csvString == "" { - return "ARRAY[]" - } - - // Replace escaped double quotes with double quotes according to CSV format rules - csvString = strings.ReplaceAll(csvString, "\\\"", "\"\"") - csvReader := csv.NewReader(strings.NewReader(csvString)) - stringValues, err := csvReader.Read() - common.PanicIfError(pgSchemaColumn.Config.CommonConfig, err) - - var values []string - for _, stringValue := range stringValues { - values = append(values, pgSchemaColumn.csvToPrimitiveTrinoValue(stringValue)) - } - return "ARRAY[" + strings.Join(values, ",") + "]" - } - - return pgSchemaColumn.csvToPrimitiveTrinoValue(csvValue) -} - -func (pgSchemaColumn *PgSchemaColumn) jsonToPrimitiveTrinoValue(jsonValue interface{}) string { - if jsonValue == nil { - return "NULL" - } - - kind := reflect.TypeOf(jsonValue).Kind() - - switch strings.TrimLeft(pgSchemaColumn.UdtName, "_") { - case "bool": - if jsonValue.(bool) { - return "true" - } - return "false" - case "bit": - if jsonValue.(bool) { - return "1" - } - return "0" - case "int2", "int4", "xid": - return syncerCommon.Float64ToString(jsonValue.(float64)) - case "float4": - if kind == reflect.String { - return "nan()" - } - return syncerCommon.Float64ToString(jsonValue.(float64)) - case "float8": - if kind == reflect.String { - return "nan()" - } - return "CAST('" + syncerCommon.Float64ToString(jsonValue.(float64)) + "' AS DOUBLE)" - case "int8", "xid8", "numeric": - return "DECIMAL '" + syncerCommon.Float64ToString(jsonValue.(float64)) + "'" - case "date": - return "DATE '1970-01-01' + INTERVAL '" + syncerCommon.Float64ToString(jsonValue.(float64)) + "' DAY" - case "timestamp": - if pgSchemaColumn.DatetimePrecision == "6" { - return "from_unixtime_nanos(" + syncerCommon.Float64ToString(jsonValue.(float64)) + " * 1000)" - } - return "from_unixtime_nanos(" + syncerCommon.Float64ToString(jsonValue.(float64)) + " * 1000000)" - case "timestamptz": - return "from_iso8601_timestamp_nanos('" + jsonValue.(string) + "')" - case "time": - if pgSchemaColumn.DatetimePrecision == "6" { - microseconds := int64(jsonValue.(float64)) - hours := microseconds / 3_600_000_000 - microseconds %= 3_600_000_000 - minutes := microseconds / 60_000_000 - microseconds %= 60_000_000 - seconds := microseconds / 1_000_000 - microseconds %= 1_000_000 - return fmt.Sprintf("TIME '%02d:%02d:%02d.%06d'", int(hours), int(minutes), int(seconds), int(microseconds)) - } - milliseconds := int64(jsonValue.(float64)) - hours := milliseconds / 3_600_000 - milliseconds %= 3_600_000 - minutes := milliseconds / 60_000 - milliseconds %= 60_000 - seconds := milliseconds / 1_000 - milliseconds %= 1_000 - return fmt.Sprintf("TIME '%02d:%02d:%02d.%03d'", int(hours), int(minutes), int(seconds), int(milliseconds)) - case "timetz": - return "TIME '" + strings.TrimRight(jsonValue.(string), "Z") + "' AT TIME ZONE 'UTC'" - case "interval": - return "'" + syncerCommon.Float64ToString(jsonValue.(float64)) + "us'" - case "varchar", "char", "text", "jsonb", "json", "uuid", - "line", "lseg", "box", "path", "polygon", "circle", - "cidr", "inet", "macaddr", "macaddr8", - "ltree", "tsvector", "xml", "pg_snapshot": - return "'" + strings.ReplaceAll(jsonValue.(string), "'", "''") + "'" - case "bytea": - return "CAST('\\x" + jsonValue.(string) + "' AS VARBINARY)" - case "bpchar": - trimmedValue := strings.TrimRight(jsonValue.(string), " ") - return "'" + strings.ReplaceAll(trimmedValue, "'", "''") + "'" - case "point", "geometry": - point := jsonValue.(map[string]interface{}) - if point["wkb"] == nil { - return "NULL" - } - return "'" + syncerCommon.Base64ToHex(point["wkb"].(string)) + "'" - default: - // User-defined types -> VARCHAR value - if pgSchemaColumn.Namespace != PG_SCHEMA_PG_CATALOG { - if kind == reflect.String { - stringValue, err := syncerCommon.HexToString(jsonValue.(string)) - if err == nil { - return "'" + stringValue + "'" - } else { - // Fallback to regular string value if not a valid hex string - return "'" + strings.ReplaceAll(jsonValue.(string), "'", "''") + "'" - } - } else { - panic(fmt.Sprintf("Unsupported user-defined type %+v with value %v of type %T", pgSchemaColumn, jsonValue, jsonValue)) - } - } - } - - panic("Unsupported PostgreSQL type: " + pgSchemaColumn.UdtName) -} - -func (pgSchemaColumn *PgSchemaColumn) csvToPrimitiveTrinoValue(csvValue string) string { - if csvValue == syncerCommon.BEMIDB_NULL_STRING { - return "NULL" - } - - switch strings.TrimLeft(pgSchemaColumn.UdtName, "_") { - case "bool": - if csvValue == "t" { - return "TRUE" - } - return "FALSE" - case "bit", "int2", "int4", "xid": - return csvValue - case "float4": - if csvValue == "NaN" { - return "nan()" - } - return csvValue - case "float8": - if csvValue == "NaN" { - return "nan()" - } - return "CAST('" + csvValue + "' AS DOUBLE)" - case "int8", "xid8", "numeric": - return "DECIMAL '" + csvValue + "'" - case "date": - return "DATE '" + csvValue + "'" - case "timestamp", "timestamptz": - return "TIMESTAMP '" + csvValue + "'" - case "time": - return "TIME '" + csvValue + "'" - case "timetz": - var parsedTime time.Time - var err error - if pgSchemaColumn.DatetimePrecision == "6" { - parsedTime, err = time.Parse("15:04:05.999999-07", csvValue) - } else if pgSchemaColumn.DatetimePrecision == "3" { - parsedTime, err = time.Parse("15:04:05.999-07", csvValue) - } - common.PanicIfError(pgSchemaColumn.Config.CommonConfig, err) - - parsedTime = parsedTime.In(time.UTC) - return "TIME '" + parsedTime.Format("15:04:05.999999-07:00") + "' AT TIME ZONE 'UTC'" - case "interval": // 1 mon 2 days 01:00:01.000001 -> '_us' (microseconds) - microseconds := 0 - - parts := strings.Split(csvValue, " ") - for i, part := range parts { - if strings.HasPrefix(part, "mon") { - months := syncerCommon.StringToInt(parts[i-1]) - microseconds += months * 30_437_500 * 24 * 60 * 60 // Approximation: 30.4375 days per month - } else if strings.HasPrefix(part, "day") { - days := syncerCommon.StringToInt(parts[i-1]) - microseconds += days * 24 * 60 * 60 * 1_000_000 - } else if strings.Contains(part, ":") { - timeParts := strings.Split(part, ":") - hours := syncerCommon.StringToInt(timeParts[0]) - minutes := syncerCommon.StringToInt(timeParts[1]) - secondsParts := strings.Split(timeParts[2], ".") - seconds := syncerCommon.StringToInt(secondsParts[0]) - microseconds += (hours * 60 * 60 * 1_000_000) + (minutes * 60 * 1_000_000) + (seconds * 1_000_000) - if len(secondsParts) > 1 && len(secondsParts[1]) == 6 { - microseconds += syncerCommon.StringToInt(secondsParts[1]) - } - } - } - return "'" + common.IntToString(microseconds) + "us'" - case "varchar", "char", "text", "jsonb", "json", "uuid", - "line", "lseg", "box", "path", "polygon", "circle", - "cidr", "inet", "macaddr", "macaddr8", - "ltree", "tsvector", "xml", "pg_snapshot": - return "'" + strings.ReplaceAll(csvValue, "'", "''") + "'" - case "bytea": - return "CAST('" + csvValue + "' AS VARBINARY)" - case "bpchar": - trimmedValue := strings.TrimRight(csvValue, " ") - return "'" + strings.ReplaceAll(trimmedValue, "'", "''") + "'" - case "point": - return "to_hex(ST_AsBinary(ST_Point" + csvValue + "))" // to_hex(ST_AsBinary(ST_Point(1, 2))) - // TODO "geometry": - default: - // User-defined types -> VARCHAR value - if pgSchemaColumn.Namespace != PG_SCHEMA_PG_CATALOG { - return "'" + strings.ReplaceAll(csvValue, "'", "''") + "'" - } - } - - panic("Unsupported PostgreSQL type: " + pgSchemaColumn.UdtName) -} - -func (pgSchemaColumn *PgSchemaColumn) primitiveTrinoType() string { - switch strings.TrimLeft(pgSchemaColumn.UdtName, "_") { - case "bool": - return "BOOLEAN" - case "bit", "int2", "int4": - return "INTEGER" - case "xid": - return "BIGINT" - case "int8", "xid8": - return "DECIMAL(20, 0)" - case "float4": - return "REAL" - case "float8": - return "DOUBLE" - case "numeric": - scale := syncerCommon.StringToInt(pgSchemaColumn.NumericScale) - precision := syncerCommon.StringToInt(pgSchemaColumn.NumericPrecision) - if precision > syncerCommon.TRINO_MAX_DECIMAL_PRECISION { - precision = syncerCommon.TRINO_MAX_DECIMAL_PRECISION - } else if precision == 0 { - precision = syncerCommon.TRINO_MAX_DECIMAL_PRECISION - scale = syncerCommon.TRINO_MAX_DECIMAL_PRECISION / 2 - } - return "DECIMAL(" + common.IntToString(precision) + ", " + common.IntToString(scale) + ")" - case "date": - return "DATE" - case "time", "timetz": // TIME(6) WITH TIME ZONE in Iceberg is not supported by Trino - return "TIME(6)" - case "timestamp": - return "TIMESTAMP(6)" - case "timestamptz": - return "TIMESTAMP(6) WITH TIME ZONE" - case "varchar", "char", "text", "jsonb", "json", "bpchar", "uuid", - "point", "line", "lseg", "box", "path", "polygon", "circle", - "cidr", "inet", "macaddr", "macaddr8", - "interval", "ltree", "tsvector", "xml", "pg_snapshot": - return "VARCHAR" - case "bytea": - return "VARBINARY" - default: - // User-defined types -> VARCHAR - if pgSchemaColumn.Namespace != PG_SCHEMA_PG_CATALOG { - return "VARCHAR" - } - } - - panic("Unsupported PostgreSQL type: " + pgSchemaColumn.UdtName) + return icebergSchemaColumn } diff --git a/src/syncer-postgres/pg_schema_table.go b/src/syncer-postgres/pg_schema_table.go index d824cbd..534d8d7 100644 --- a/src/syncer-postgres/pg_schema_table.go +++ b/src/syncer-postgres/pg_schema_table.go @@ -2,7 +2,6 @@ package main import ( "fmt" - "strings" ) type PgSchemaTable struct { @@ -20,12 +19,12 @@ func (pgSchemaTable PgSchemaTable) ToConfigArg() string { } // public.table -> table -// CustomSchema.TableName -> custom_schema_table_name +// CustomSchema.TableName -> CustomSchemaTableName func (pgSchemaTable PgSchemaTable) IcebergTableName() string { if pgSchemaTable.Schema != PG_SCHEMA_PUBLIC { - return strings.ToLower(pgSchemaTable.Schema) + "_" + strings.ToLower(pgSchemaTable.Table) + return pgSchemaTable.Schema + "_" + pgSchemaTable.Table } - return strings.ToLower(pgSchemaTable.Table) + return pgSchemaTable.Table } func (pgSchemaTable PgSchemaTable) IcebergParentPartitionedTableName() string { diff --git a/src/syncer-postgres/postgres.go b/src/syncer-postgres/postgres.go index eb7d02d..f054723 100644 --- a/src/syncer-postgres/postgres.go +++ b/src/syncer-postgres/postgres.go @@ -2,6 +2,7 @@ package main import ( "context" + "strings" "time" "github.com/BemiHQ/BemiDB/src/common" @@ -26,6 +27,18 @@ func NewPostgres(config *Config) *Postgres { _, err := postgresClient.Exec(context.Background(), "SET SESSION statement_timeout = '"+PG_SESSION_TIMEOUT+"'") common.PanicIfError(config.CommonConfig, err) + var isStandby bool + err = postgresClient.QueryRow(context.Background(), "SELECT pg_is_in_recovery()").Scan(&isStandby) + common.PanicIfError(config.CommonConfig, err) + + if isStandby { + _, err = postgresClient.Exec(context.Background(), "BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ READ ONLY") + common.PanicIfError(config.CommonConfig, err) + } else { + _, err = postgresClient.Exec(context.Background(), "BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE READ ONLY DEFERRABLE") + common.PanicIfError(config.CommonConfig, err) + } + return &Postgres{ Config: config, PostgresClient: postgresClient, @@ -36,6 +49,21 @@ func (postgres *Postgres) Close() { postgres.PostgresClient.Close() } +func (postgres *Postgres) ReplicationSlotExists(slotName string) bool { + var slotExists bool + err := postgres.PostgresClient.QueryRow(context.Background(), "SELECT TRUE FROM pg_replication_slots WHERE slot_name = '"+slotName+"'").Scan(&slotExists) + if err != nil && err.Error() == "no rows in result set" { + return false + } + common.PanicIfError(postgres.Config.CommonConfig, err) + return slotExists +} + +func (postgres *Postgres) CreateReplicationSlot(slotName string) { + _, err := postgres.PostgresClient.Exec(context.Background(), "SELECT pg_create_logical_replication_slot($1, 'pgoutput')", slotName) + common.PanicIfError(postgres.Config.CommonConfig, err) +} + func (postgres *Postgres) Schemas() []string { var schemas []string @@ -98,25 +126,11 @@ func (postgres *Postgres) PgSchemaColumns(pgSchemaTable PgSchemaTable) []PgSchem COALESCE(columns.numeric_precision, 0), COALESCE(columns.numeric_scale, 0), COALESCE(columns.datetime_precision, 0), - pg_namespace.nspname, - CASE WHEN pk.constraint_name IS NOT NULL THEN true ELSE false END + pg_namespace.nspname FROM information_schema.columns JOIN pg_type ON pg_type.typname = columns.udt_name JOIN pg_namespace ON pg_namespace.oid = pg_type.typnamespace - LEFT JOIN ( - SELECT - tc.constraint_name, - kcu.column_name, - kcu.table_schema, - kcu.table_name - FROM information_schema.table_constraints tc - JOIN information_schema.key_column_usage kcu - ON tc.constraint_name = kcu.constraint_name - AND tc.table_schema = kcu.table_schema - AND tc.table_name = kcu.table_name - WHERE tc.constraint_type = 'PRIMARY KEY' - ) pk ON pk.column_name = columns.column_name AND pk.table_schema = columns.table_schema AND pk.table_name = columns.table_name - WHERE columns.table_schema = $1 AND columns.table_name = $2 AND columns.is_generated = 'NEVER' + WHERE columns.table_schema = $1 AND columns.table_name = $2 ORDER BY columns.ordinal_position`, pgSchemaTable.Schema, pgSchemaTable.Table, @@ -136,11 +150,45 @@ func (postgres *Postgres) PgSchemaColumns(pgSchemaTable PgSchemaTable) []PgSchem &pgSchemaColumn.NumericScale, &pgSchemaColumn.DatetimePrecision, &pgSchemaColumn.Namespace, - &pgSchemaColumn.PartOfPrimaryKey, ) common.PanicIfError(postgres.Config.CommonConfig, err) pgSchemaColumns = append(pgSchemaColumns, *pgSchemaColumn) } + var joinedUniqueColumnNames string + err = postgres.PostgresClient.QueryRow( + context.Background(), + `SELECT array_to_string(array_agg(a.attname), ',') as columns + FROM pg_class t + JOIN pg_index ix ON t.oid = ix.indrelid + JOIN unnest(ix.indkey) WITH ORDINALITY AS c(colnum, ordinality) ON true + JOIN pg_attribute a ON t.oid = a.attrelid AND a.attnum = c.colnum + WHERE ix.indisunique = true AND t.relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = $1) AND t.relname = $2 + GROUP BY t.relname, ix.indexrelid + ORDER BY + array_length(array_agg(a.attname), 1), + CASE WHEN array_to_string(array_agg(a.attname), ', ') ILIKE '%id' THEN 0 ELSE 1 END, + array_to_string(array_agg(a.attname), ',')`, + pgSchemaTable.Schema, + pgSchemaTable.Table, + ).Scan(&joinedUniqueColumnNames) + if err != nil && err.Error() == "no rows in result set" { + joinedUniqueColumnNames = "" + } else { + common.PanicIfError(postgres.Config.CommonConfig, err) + } + + uniqueColumnNames := common.NewSet[string]() + uniqueColumnNames.AddAll(strings.Split(joinedUniqueColumnNames, ",")) + if uniqueColumnNames.IsEmpty() { + common.Panic(postgres.Config.CommonConfig, "No unique columns found for table "+pgSchemaTable.String()) + } else { + common.LogInfo(postgres.Config.CommonConfig, "Unique columns for table "+pgSchemaTable.String()+":", joinedUniqueColumnNames) + } + + for i := range pgSchemaColumns { + pgSchemaColumns[i].IsPartOfUniqueIndex = uniqueColumnNames.Contains(pgSchemaColumns[i].ColumnName) + } + return pgSchemaColumns } diff --git a/src/syncer-postgres/syncer.go b/src/syncer-postgres/syncer.go index 84cc786..94732aa 100644 --- a/src/syncer-postgres/syncer.go +++ b/src/syncer-postgres/syncer.go @@ -8,14 +8,21 @@ import ( ) type Syncer struct { - Config *Config - Utils *SyncerUtils + Config *Config + Utils *SyncerUtils + StorageS3 *syncerCommon.StorageS3 + DuckdbClient *common.DuckdbClient } func NewSyncer(config *Config) *Syncer { + storageS3 := syncerCommon.NewStorageS3(config.CommonConfig) + duckdbClient := common.NewDuckdbClient(config.CommonConfig, syncerCommon.DUCKDB_BOOT_QUERIES) + return &Syncer{ - Config: config, - Utils: NewSyncerUtils(config), + Config: config, + Utils: NewSyncerUtils(config, storageS3, duckdbClient), + StorageS3: storageS3, + DuckdbClient: duckdbClient, } } @@ -25,12 +32,7 @@ func (syncer *Syncer) Sync() { postgres := NewPostgres(syncer.Config) defer postgres.Close() - trino := syncerCommon.NewTrino(syncer.Config.CommonConfig, syncer.Config.TrinoConfig, syncer.Config.DestinationSchemaName) - defer trino.Close() - - trino.CreateSchemaIfNotExists() - - pgSchemaTables := syncer.pgSchemaTables(postgres, trino) + pgSchemaTables := syncer.pgSchemaTables(postgres) switch syncer.Config.SyncMode { case SyncModeCDC: @@ -41,13 +43,13 @@ func (syncer *Syncer) Sync() { panic("Incremental sync is not supported") case SyncModeFullRefresh: common.LogInfo(syncer.Config.CommonConfig, "Starting full-refresh sync...") - NewSyncerFullRefresh(syncer.Config).Sync(postgres, pgSchemaTables) + NewSyncerFullRefresh(syncer.Config, syncer.Utils, syncer.StorageS3, syncer.DuckdbClient).Sync(postgres, pgSchemaTables) } syncerCommon.SendAnonymousAnalytics(syncer.Config.CommonConfig, "syncer-postgres-finish", syncer.name()) } -func (syncer *Syncer) pgSchemaTables(postgres *Postgres, trino *syncerCommon.Trino) []PgSchemaTable { +func (syncer *Syncer) pgSchemaTables(postgres *Postgres) []PgSchemaTable { pgSchemaTables := make([]PgSchemaTable, 0) for _, schema := range postgres.Schemas() { for _, pgSchemaTable := range postgres.SchemaTables(schema) { diff --git a/src/syncer-postgres/syncer_full_refresh.go b/src/syncer-postgres/syncer_full_refresh.go index 55a8ae6..5f5021d 100644 --- a/src/syncer-postgres/syncer_full_refresh.go +++ b/src/syncer-postgres/syncer_full_refresh.go @@ -1,8 +1,6 @@ package main import ( - "context" - "github.com/BemiHQ/BemiDB/src/common" "github.com/BemiHQ/BemiDB/src/syncer-common" ) @@ -13,23 +11,22 @@ const ( ) type SyncerFullRefresh struct { - Config *Config - Utils *SyncerUtils - StorageS3 *syncerCommon.StorageS3 + Config *Config + Utils *SyncerUtils + StorageS3 *syncerCommon.StorageS3 + DuckdbClient *common.DuckdbClient } -func NewSyncerFullRefresh(config *Config) *SyncerFullRefresh { +func NewSyncerFullRefresh(config *Config, utils *SyncerUtils, storageS3 *syncerCommon.StorageS3, duckdbClient *common.DuckdbClient) *SyncerFullRefresh { return &SyncerFullRefresh{ - Config: config, - Utils: NewSyncerUtils(config), - StorageS3: syncerCommon.NewStorageS3(config.CommonConfig), + Config: config, + Utils: utils, + StorageS3: storageS3, + DuckdbClient: duckdbClient, } } func (syncer *SyncerFullRefresh) Sync(postgres *Postgres, pgSchemaTables []PgSchemaTable) { - _, err := postgres.PostgresClient.Exec(context.Background(), "BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE READ ONLY DEFERRABLE") - common.PanicIfError(syncer.Config.CommonConfig, err) - icebergTableNames := common.NewSet[string]() for _, pgSchemaTable := range pgSchemaTables { @@ -41,7 +38,7 @@ func (syncer *SyncerFullRefresh) Sync(postgres *Postgres, pgSchemaTables []PgSch icebergTableNames.Add(pgSchemaTable.IcebergTableName()) } - syncer.Utils.DeleteOldTables(syncer.StorageS3, icebergTableNames) + syncer.Utils.DeleteOldTables(icebergTableNames) } func (syncer *SyncerFullRefresh) syncTable(postgres *Postgres, pgSchemaTable PgSchemaTable, pgSchemaColumns []PgSchemaColumn) { @@ -58,27 +55,24 @@ func (syncer *SyncerFullRefresh) syncTable(postgres *Postgres, pgSchemaTable PgS } func (syncer *SyncerFullRefresh) writeToIceberg(pgSchemaTable PgSchemaTable, pgSchemaColumns []PgSchemaColumn, cappedBuffer *syncerCommon.CappedBuffer) { + // Delete -syncing table + syncingIcebergTable := syncerCommon.NewIcebergTable(syncer.Config.CommonConfig, syncer.StorageS3, syncer.DuckdbClient, syncer.Config.DestinationSchemaName, pgSchemaTable.IcebergTableName()+TEMP_TABLE_SUFFIX_SYNCING) + syncingIcebergTable.DeleteIfExists() + + // Insert and create -syncing table icebergSchemaColumns := make([]*syncerCommon.IcebergSchemaColumn, len(pgSchemaColumns)) for i, pgSchemaColumn := range pgSchemaColumns { icebergSchemaColumns[i] = pgSchemaColumn.ToIcebergSchemaColumn() } - - // Delete -syncing table - syncingIcebergTable := syncerCommon.NewIcebergTable(syncer.Config.CommonConfig, syncer.StorageS3, syncer.Config.DestinationSchemaName, pgSchemaTable.IcebergTableName()+TEMP_TABLE_SUFFIX_SYNCING) - syncingIcebergTable.DeleteIfExists() - - // Write and create -syncing table - icebergWriter := syncerCommon.NewIcebergWriter(syncer.Config.CommonConfig, syncer.StorageS3, icebergSchemaColumns) - syncingIcebergTable.GenerateS3TablePath() - syncer.Utils.ReplaceFromCappedBuffer(icebergWriter, syncingIcebergTable, cappedBuffer) - syncingIcebergTable.Create() + icebergWriter := syncerCommon.NewIcebergWriter(syncer.Config.CommonConfig, syncer.StorageS3, syncer.DuckdbClient, icebergSchemaColumns, 1) + icebergWriter.InsertFromCsvCappedBuffer(syncingIcebergTable, cappedBuffer) // Delete -deleting table - deletingIcebergTable := syncerCommon.NewIcebergTable(syncer.Config.CommonConfig, syncer.StorageS3, syncer.Config.DestinationSchemaName, pgSchemaTable.IcebergTableName()+TEMP_TABLE_SUFFIX_DELETING) + deletingIcebergTable := syncerCommon.NewIcebergTable(syncer.Config.CommonConfig, syncer.StorageS3, syncer.DuckdbClient, syncer.Config.DestinationSchemaName, pgSchemaTable.IcebergTableName()+TEMP_TABLE_SUFFIX_DELETING) deletingIcebergTable.DeleteIfExists() // Rename table to -deleting - icebergTable := syncerCommon.NewIcebergTable(syncer.Config.CommonConfig, syncer.StorageS3, syncer.Config.DestinationSchemaName, pgSchemaTable.IcebergTableName()) + icebergTable := syncerCommon.NewIcebergTable(syncer.Config.CommonConfig, syncer.StorageS3, syncer.DuckdbClient, syncer.Config.DestinationSchemaName, pgSchemaTable.IcebergTableName()) icebergTable.Rename(deletingIcebergTable.TableName) // Rename -syncing to table @@ -89,7 +83,7 @@ func (syncer *SyncerFullRefresh) writeToIceberg(pgSchemaTable PgSchemaTable, pgS } func (syncer *SyncerFullRefresh) copyFromPgTable(postgres *Postgres, pgSchemaTable PgSchemaTable, cappedBuffer *syncerCommon.CappedBuffer) { - copySql := "COPY " + pgSchemaTable.String() + " TO STDOUT WITH CSV HEADER NULL '" + syncerCommon.BEMIDB_NULL_STRING + "'" + copySql := "COPY (SELECT * FROM " + pgSchemaTable.String() + ") TO STDOUT WITH CSV HEADER NULL '" + syncerCommon.BEMIDB_NULL_STRING + "'" result, err := postgres.PostgresClient.Copy(cappedBuffer, copySql) common.PanicIfError(syncer.Config.CommonConfig, err) diff --git a/src/syncer-postgres/syncer_utils.go b/src/syncer-postgres/syncer_utils.go index 0fd0de2..af75216 100644 --- a/src/syncer-postgres/syncer_utils.go +++ b/src/syncer-postgres/syncer_utils.go @@ -1,32 +1,27 @@ package main import ( - "context" - "database/sql/driver" - "encoding/csv" - "io" - "strings" - - "github.com/marcboeker/go-duckdb/v2" - "github.com/BemiHQ/BemiDB/src/common" "github.com/BemiHQ/BemiDB/src/syncer-common" ) var ( - MAX_IN_MEMORY_BUFFER_SIZE = 32 * 1024 * 1024 // 32 MB - MAX_ICEBERG_WRITER_BATCH_SIZE = 1024 * 1024 * 1024 // 1 GB + MAX_IN_MEMORY_BUFFER_SIZE = 32 * 1024 * 1024 // 32 MB COMPACT_AFTER_INSERT_BATCH_COUNT = 40 // Compact the table after every N insert batches ) type SyncerUtils struct { - Config *Config + Config *Config + StorageS3 *syncerCommon.StorageS3 + DuckdbClient *common.DuckdbClient } -func NewSyncerUtils(config *Config) *SyncerUtils { +func NewSyncerUtils(config *Config, storageS3 *syncerCommon.StorageS3, duckdbClient *common.DuckdbClient) *SyncerUtils { return &SyncerUtils{ - Config: config, + Config: config, + StorageS3: storageS3, + DuckdbClient: duckdbClient, } } @@ -46,41 +41,7 @@ func (utils *SyncerUtils) ShouldSyncTable(pgSchemaTable PgSchemaTable) bool { return true } -func (utils *SyncerUtils) CreateTableIfNotExists(trino *syncerCommon.Trino, pgSchemaTable PgSchemaTable, pgSchemaColumns []PgSchemaColumn) { - columnSchemas := []string{} - for _, pgSchemaColumn := range pgSchemaColumns { - columnSchemas = append(columnSchemas, `"`+pgSchemaColumn.ColumnName+"\" "+pgSchemaColumn.TrinoType()) - } - - trino.CreateTableIfNotExists(pgSchemaTable.IcebergTableName(), "("+strings.Join(columnSchemas, ",")+")") -} - -func (utils *SyncerUtils) DropOldTables(trino *syncerCommon.Trino, keepIcebergTableNames common.Set[string]) { - ctx := context.Background() - trinoTableNames := make([]string, 0) - - rows, err := trino.QueryContext(ctx, "SHOW TABLES FROM "+trino.Schema()) - common.PanicIfError(utils.Config.CommonConfig, err) - - for rows.Next() { - var tableName string - err := rows.Scan(&tableName) - common.PanicIfError(utils.Config.CommonConfig, err) - trinoTableNames = append(trinoTableNames, tableName) - } - - for _, trinoTableName := range trinoTableNames { - if keepIcebergTableNames.Contains(trinoTableName) { - continue - } - - common.LogInfo(utils.Config.CommonConfig, "Dropping old table: "+trinoTableName) - _, err = trino.ExecContext(ctx, "DROP TABLE IF EXISTS "+trino.Schema()+`."`+trinoTableName+`"`) - common.PanicIfError(utils.Config.CommonConfig, err) - } -} - -func (utils *SyncerUtils) DeleteOldTables(storageS3 *syncerCommon.StorageS3, keepIcebergTableNames common.Set[string]) { +func (utils *SyncerUtils) DeleteOldTables(keepIcebergTableNames common.Set[string]) { icebergCatalog := syncerCommon.NewIcebergCatalog(utils.Config.CommonConfig, utils.Config.DestinationSchemaName) icebergTableNames := icebergCatalog.TableNames() @@ -90,105 +51,7 @@ func (utils *SyncerUtils) DeleteOldTables(storageS3 *syncerCommon.StorageS3, kee } common.LogInfo(utils.Config.CommonConfig, "Deleting old Iceberg table: "+icebergTableName) - icebergTable := syncerCommon.NewIcebergTable(utils.Config.CommonConfig, storageS3, utils.Config.DestinationSchemaName, icebergTableName) + icebergTable := syncerCommon.NewIcebergTable(utils.Config.CommonConfig, utils.StorageS3, utils.DuckdbClient, utils.Config.DestinationSchemaName, icebergTableName) icebergTable.DeleteIfExists() } } - -func (utils *SyncerUtils) InsertFromCappedBuffer(trino *syncerCommon.Trino, quotedTrinoTablePath string, pgSchemaTable PgSchemaTable, pgSchemaColumns []PgSchemaColumn, cappedBuffer *syncerCommon.CappedBuffer) { - ctx := context.Background() - csvReader := csv.NewReader(cappedBuffer) - _, err := csvReader.Read() // Read the header row - common.PanicIfError(utils.Config.CommonConfig, err) - - quotedColumnNames := []string{} - for _, pgSchemaColumn := range pgSchemaColumns { - quotedColumnNames = append(quotedColumnNames, `"`+pgSchemaColumn.ColumnName+`"`) - } - - insertSqlPrefix := "INSERT INTO " + quotedTrinoTablePath + "(" + strings.Join(quotedColumnNames, ",") + ")" + " VALUES " - currentSql := insertSqlPrefix - currentRowCount := 0 - batchCount := 0 - - for { - row, err := csvReader.Read() - if err == io.EOF { - break - } - if err != nil { - common.PanicIfError(utils.Config.CommonConfig, err) - } - - rowValues := []string{} - for i, pgSchemaColumn := range pgSchemaColumns { - rowValues = append(rowValues, pgSchemaColumn.CsvToTrinoValue(row[i])) - } - rowValuesStatement := "(" + strings.Join(rowValues, ",") + ")" - - currentRowCount++ - if len(currentSql)+len(rowValuesStatement)+1 < syncerCommon.TRINO_MAX_QUERY_LENGTH { // +1 for the comma - if currentSql != insertSqlPrefix { - currentSql += "," - } - currentSql += rowValuesStatement - } else { - _, err := trino.ExecContext(ctx, currentSql) - common.PanicIfError(utils.Config.CommonConfig, err) - common.LogInfo(utils.Config.CommonConfig, "Inserted", currentRowCount, "rows into table:", pgSchemaTable.String()) - currentSql = insertSqlPrefix + rowValuesStatement - currentRowCount = 1 - batchCount++ - if batchCount%COMPACT_AFTER_INSERT_BATCH_COUNT == 0 { - common.LogInfo(utils.Config.CommonConfig, "Compacting table:", pgSchemaTable.String(), "after", batchCount, "insert batches") - trino.CompactTable(quotedTrinoTablePath) - } - } - } - - if currentSql != insertSqlPrefix { - _, err := trino.ExecContext(ctx, currentSql) - common.PanicIfError(utils.Config.CommonConfig, err) - common.LogInfo(utils.Config.CommonConfig, "Inserted", currentRowCount, "rows into table:", pgSchemaTable.String()) - } -} - -func (utils *SyncerUtils) ReplaceFromCappedBuffer(icebergWriter *syncerCommon.IcebergWriter, icebergTable *syncerCommon.IcebergTable, cappedBuffer *syncerCommon.CappedBuffer) { - csvReader := csv.NewReader(cappedBuffer) - _, err := csvReader.Read() // Read the header row - common.PanicIfError(utils.Config.CommonConfig, err) - - icebergWriter.Write(icebergTable.GeneratedS3TablePath, func(appender *duckdb.Appender) (rowCount int, reachedEnd bool) { - var loadedSize int - - for { - row, err := csvReader.Read() - if err == io.EOF { - reachedEnd = true - break - } - if err != nil { - common.PanicIfError(utils.Config.CommonConfig, err) - } - - values := make([]driver.Value, len(icebergWriter.IcebergSchemaColumns)) - for i, icebergSchemaColumn := range icebergWriter.IcebergSchemaColumns { - values[i] = icebergSchemaColumn.DuckdbValueFromCsv(row[i]) - loadedSize += len(row[i]) - } - common.LogTrace(utils.Config.CommonConfig, "DuckDB appending values:", values) - - err = appender.AppendRow(values...) - common.PanicIfError(utils.Config.CommonConfig, err) - - rowCount++ - if loadedSize >= MAX_ICEBERG_WRITER_BATCH_SIZE { - common.LogDebug(utils.Config.CommonConfig, "Reached batch size limit") - break - } - } - - common.LogInfo(utils.Config.CommonConfig, "Loaded", rowCount, "rows") - return rowCount, reachedEnd - }) -} From 0fe614c0d9d54ece1a850af19a0483b95f614116 Mon Sep 17 00:00:00 2001 From: exAspArk Date: Wed, 20 Aug 2025 08:47:18 -0400 Subject: [PATCH 07/24] Convert timestamptz to timestamp in UTC data type for DuckDB https://github.com/marcboeker/go-duckdb#notes-and-faqs In the C API, DuckDB stores both TIMESTAMP and TIMESTAMP_TZ as duckdb_timestamp, which holds the number of microseconds elapsed since January 1, 1970, UTC (i.e., an instant without offset information). When passing a time.Time to go-duckdb, go-duckdb transforms it to an instant with UnixMicro(), even when using TIMESTAMP_TZ. Later, scanning either type of value returns an instant, as SQL types do not model time zone information for individual values. --- README.md | 10 +- src/server/query_handler_test.go | 232 +++++++++++++++++++-- src/server/query_remapper_table.go | 15 +- src/syncer-common/iceberg_schema_column.go | 64 +++--- src/syncer-postgres/pg_schema_column.go | 4 +- 5 files changed, 255 insertions(+), 70 deletions(-) diff --git a/README.md b/README.md index 9820012..9a288ec 100644 --- a/README.md +++ b/README.md @@ -273,19 +273,19 @@ Primitive data types are mapped as follows: | PostgreSQL | Parquet | Iceberg | |-------------------------------------------------------------|-----------------------------------------------------------------|----------------------------------| | `bool` | `BOOLEAN` | `boolean` | -| `varchar`, `text`, `bpchar` | `BYTE_ARRAY` (`STRING` / `UTF8`) | `string` | | `bit`, `int2`, `int4` | `INT32` | `int` | -| `int8`, `xid8` | `FIXED_LEN_BYTE_ARRAY(9)` (`DECIMAL(20, 0)` / `DECIMAL(20, 0)`) | `decimal(20, 0)` | +| `int8`, | `FIXED_LEN_BYTE_ARRAY(9)` (`DECIMAL(38, 0)` / `DECIMAL(38, 0)`) | `decimal(38, 0)` | | `xid` | `INT64` | `long` | +| `xid8`, `interval` | `FIXED_LEN_BYTE_ARRAY(9)` (`DECIMAL(38, 6)` / `DECIMAL(38, 6)`) | `decimal(38, 6)` | | `float4` | `FLOAT` | `float` | | `float8` | `DOUBLE` | `double` | | `numeric` | `FIXED_LEN_BYTE_ARRAY(16)` (`DECIMAL(P, S)` / `DECIMAL(P, S)`) | `decimal(P, S)` | | `date` | `INT32` (`DATE` / `DATE`) | `date` | | `time`, `timetz` | `INT64` (`TIME_MICROS`) | `time` | -| `timestamp` | `INT64` (`TIMESTAMP_MICROS`) | `timestamp` | -| `timestamptz` | `INT64` (`TIMESTAMP_MICROS`) | `timestamptz` | +| `timestamp`, `timestamptz` | `INT64` (`TIMESTAMP_MICROS`) | `timestamp` | +| `varchar`, `text`, `bpchar` | `BYTE_ARRAY` (`STRING` / `UTF8`) | `string` | +| `uuid` | `BYTE_ARRAY` (`STRING` / `UTF8`) | `string` | | `bytea` | `BYTE_ARRAY` | `binary` | -| `uuid`, `interval` | `BYTE_ARRAY` (`STRING` / `UTF8`) | `string` | | `point`, `line`, `lseg`, `box`, `path`, `polygon`, `circle` | `BYTE_ARRAY` (`STRING` / `UTF8`) | `string` | | `cidr`, `inet`, `macaddr`, `macaddr8` | `BYTE_ARRAY` (`STRING` / `UTF8`) | `string` | | `tsvector`, `xml`, `pg_snapshot` | `BYTE_ARRAY` (`STRING` / `UTF8`) | `string` | diff --git a/src/server/query_handler_test.go b/src/server/query_handler_test.go index bba292c..73f458a 100644 --- a/src/server/query_handler_test.go +++ b/src/server/query_handler_test.go @@ -138,17 +138,17 @@ func TestHandleQuery(t *testing.T) { "types": {uint32ToString(pgtype.TextOID)}, "values": {"Hello World, Earth, World"}, }, - "SELECT format('%s', \"postgres\".\"test_table\".\"varchar_column\") AS str FROM postgres.test_table LIMIT 1": { + "SELECT format('%s', \"postgres\".\"test_table\".\"varchar_column\") AS str FROM postgres.test_table WHERE varchar_column IS NOT NULL": { "description": {"str"}, "types": {uint32ToString(pgtype.TextOID)}, "values": {"varchar"}, }, - "SELECT jsonb_extract_path_text(json_column, 'key') AS jsonb_extract_path_text FROM postgres.test_table LIMIT 1": { + "SELECT jsonb_extract_path_text(json_column, 'key') AS jsonb_extract_path_text FROM postgres.test_table WHERE json_column IS NOT NULL": { "description": {"jsonb_extract_path_text"}, "types": {uint32ToString(pgtype.TextOID)}, "values": {"value"}, }, - "SELECT jsonb_extract_path_text(json_column, VARIADIC ARRAY['key']) AS jsonb_extract_path_text FROM postgres.test_table LIMIT 1": { + "SELECT jsonb_extract_path_text(json_column, VARIADIC ARRAY['key']) AS jsonb_extract_path_text FROM postgres.test_table WHERE json_column IS NOT NULL": { "description": {"jsonb_extract_path_text"}, "types": {uint32ToString(pgtype.TextOID)}, "values": {"value"}, @@ -371,10 +371,206 @@ func TestHandleQuery(t *testing.T) { "types": {uint32ToString(pgtype.TextOID)}, "values": {"memory", "postgres", "test_table", "BASE TABLE", "", "", "", "", "", "YES", "NO", "", ""}, }, - "SELECT column_name, udt_schema, udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' ORDER BY ordinal_position LIMIT 1": { - "description": {"column_name", "udt_schema", "udt_name"}, - "types": {uint32ToString(pgtype.TextOID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.TextOID)}, - "values": {"id", "pg_catalog", "int4"}, + // information_schema.columns + "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'id'": { + "description": {"udt_name"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"int4"}, + }, + "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'bit_column'": { + "description": {"udt_name"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"int4"}, + }, + "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'bool_column'": { + "description": {"udt_name"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"bool"}, + }, + "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'bpchar_column'": { + "description": {"udt_name"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"text"}, + }, + "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'varchar_column'": { + "description": {"udt_name"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"text"}, + }, + "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'text_column'": { + "description": {"udt_name"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"text"}, + }, + "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'int2_column'": { + "description": {"udt_name"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"int4"}, + }, + "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'int4_column'": { + "description": {"udt_name"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"int4"}, + }, + "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'int8_column'": { + "description": {"udt_name"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"numeric"}, + }, + "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'hugeint_column'": { + "description": {"udt_name"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"numeric"}, + }, + "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'xid_column'": { + "description": {"udt_name"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"int8"}, + }, + "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'xid8_column'": { + "description": {"udt_name"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"numeric"}, + }, + "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'float4_column'": { + "description": {"udt_name"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"float4"}, + }, + "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'float8_column'": { + "description": {"udt_name"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"float8"}, + }, + "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'numeric_column'": { + "description": {"udt_name"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"numeric"}, + }, + "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'numeric_column_without_precision'": { + "description": {"udt_name"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"numeric"}, + }, + "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'date_column'": { + "description": {"udt_name"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"date"}, + }, + "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'time_column'": { + "description": {"udt_name"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"time"}, + }, + "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'timeMsColumn'": { + "description": {"udt_name"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"time"}, + }, + "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'timetz_column'": { + "description": {"udt_name"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"time"}, + }, + "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'timetz_ms_column'": { + "description": {"udt_name"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"time"}, + }, + "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'timestamp_column'": { + "description": {"udt_name"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"timestamp"}, + }, + "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'timestamp_ms_column'": { + "description": {"udt_name"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"timestamp"}, + }, + "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'timestamptz_column'": { + "description": {"udt_name"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"timestamp"}, + }, + "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'timestamptz_ms_column'": { + "description": {"udt_name"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"timestamp"}, + }, + "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'uuid_column'": { + "description": {"udt_name"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"text"}, + }, + "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'bytea_column'": { + "description": {"udt_name"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"bytea"}, + }, + "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'interval_column'": { + "description": {"udt_name"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"numeric"}, + }, + "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'point_column'": { + "description": {"udt_name"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"text"}, + }, + "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'inet_column'": { + "description": {"udt_name"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"text"}, + }, + "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'json_column'": { + "description": {"udt_name"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"text"}, + }, + "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'jsonb_column'": { + "description": {"udt_name"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"text"}, + }, + "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'tsvector_column'": { + "description": {"udt_name"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"text"}, + }, + "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'xml_column'": { + "description": {"udt_name"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"text"}, + }, + "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'pg_snapshot_column'": { + "description": {"udt_name"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"text"}, + }, + "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'array_text_column'": { + "description": {"udt_name"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"_text"}, + }, + "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'array_int_column'": { + "description": {"udt_name"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"_int4"}, + }, + "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'array_jsonb_column'": { + "description": {"udt_name"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"_text"}, + }, + "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'array_ltree_column'": { + "description": {"udt_name"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"_text"}, + }, + "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'user_defined_column'": { + "description": {"udt_name"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"text"}, }, }) }) @@ -586,12 +782,12 @@ func TestHandleQuery(t *testing.T) { "types": {uint32ToString(pgtype.NumericOID)}, "values": {""}, }, - "SELECT date_column FROM postgres.test_table LIMIT 1": { + "SELECT date_column FROM postgres.test_table ORDER BY date_column LIMIT 1": { "description": {"date_column"}, "types": {uint32ToString(pgtype.DateOID)}, "values": {"2024-01-01"}, }, - "SELECT date_column FROM postgres.test_table LIMIT 1 OFFSET 1": { + "SELECT date_column FROM postgres.test_table ORDER BY date_column LIMIT 1 OFFSET 1": { "description": {"date_column"}, "types": {uint32ToString(pgtype.DateOID)}, "values": {"20025-11-12"}, @@ -648,23 +844,23 @@ func TestHandleQuery(t *testing.T) { }, "SELECT timestamptz_column FROM postgres.test_table WHERE bool_column = TRUE": { "description": {"timestamptz_column"}, - "types": {uint32ToString(pgtype.TimestamptzOID)}, - "values": {"2024-01-01 17:00:00.123456+00:00"}, + "types": {uint32ToString(pgtype.TimestampOID)}, + "values": {"2024-01-01 17:00:00.123456"}, }, "SELECT timestamptz_column FROM postgres.test_table WHERE bool_column = FALSE": { "description": {"timestamptz_column"}, - "types": {uint32ToString(pgtype.TimestamptzOID)}, - "values": {"2024-01-01 06:30:00.000123+00:00"}, + "types": {uint32ToString(pgtype.TimestampOID)}, + "values": {"2024-01-01 06:30:00.000123"}, }, "SELECT timestamptz_ms_column FROM postgres.test_table WHERE bool_column = TRUE": { "description": {"timestamptz_ms_column"}, - "types": {uint32ToString(pgtype.TimestamptzOID)}, - "values": {"2024-01-01 17:00:00.123+00:00"}, + "types": {uint32ToString(pgtype.TimestampOID)}, + "values": {"2024-01-01 17:00:00.123"}, }, "SELECT timestamptz_ms_column FROM postgres.test_table WHERE bool_column = FALSE": { "description": {"timestamptz_ms_column"}, - "types": {uint32ToString(pgtype.TimestamptzOID)}, - "values": {"2024-01-01 07:00:00.12+00:00"}, + "types": {uint32ToString(pgtype.TimestampOID)}, + "values": {"2024-01-01 07:00:00.12"}, }, "SELECT uuid_column FROM postgres.test_table WHERE uuid_column = '58a7c845-af77-44b2-8664-7ca613d92f04'": { "description": {"uuid_column"}, @@ -1045,7 +1241,7 @@ func TestHandleQuery(t *testing.T) { "types": {uint32ToString(pgtype.BoolOID)}, "values": {"t"}, }, - "SELECT CASE WHEN FORMAT('%s', postgres.test_table.varchar_column) = 'varchar' THEN 1 ELSE 2 END AS test_case FROM postgres.test_table LIMIT 1": { + "SELECT CASE WHEN FORMAT('%s', postgres.test_table.varchar_column) = 'varchar' THEN 1 ELSE 2 END AS test_case FROM postgres.test_table WHERE varchar_column = 'varchar'": { "description": {"test_case"}, "types": {uint32ToString(pgtype.Int4OID)}, "values": {"1"}, diff --git a/src/server/query_remapper_table.go b/src/server/query_remapper_table.go index beb0506..ecf34ac 100644 --- a/src/server/query_remapper_table.go +++ b/src/server/query_remapper_table.go @@ -75,8 +75,12 @@ func CreateInformationSchemaTableQueries(config *Config) []string { WHEN 'BOOLEAN[]' THEN '_bool' WHEN 'DATE' THEN 'date' WHEN 'DATE[]' THEN '_date' - WHEN 'FLOAT' THEN 'float8' - WHEN 'FLOAT[]' THEN '_float8' + WHEN 'FLOAT' THEN 'float4' + WHEN 'FLOAT[]' THEN '_float4' + WHEN 'DOUBLE' THEN 'float8' + WHEN 'DOUBLE[]' THEN '_float8' + WHEN 'DECIMAL' THEN 'numeric' + WHEN 'DECIMAL[]' THEN '_numeric' WHEN 'INTEGER' THEN 'int4' WHEN 'INTEGER[]' THEN '_int4' WHEN 'VARCHAR' THEN 'text' @@ -87,10 +91,11 @@ func CreateInformationSchemaTableQueries(config *Config) []string { WHEN 'TIMESTAMP[]' THEN '_timestamp' WHEN 'UUID' THEN 'uuid' WHEN 'UUID[]' THEN '_uuid' - ELSE - CASE + ELSE + CASE WHEN starts_with(data_type, 'DECIMAL') THEN 'numeric' - END + ELSE 'unknown' + END END AS udt_name, scope_catalog, scope_schema, scope_name, maximum_cardinality, dtd_identifier, is_self_referencing, is_identity, identity_generation, identity_start, identity_increment, identity_maximum, identity_minimum, identity_cycle, is_generated, generation_expression, is_updatable FROM information_schema.columns`, diff --git a/src/syncer-common/iceberg_schema_column.go b/src/syncer-common/iceberg_schema_column.go index e489b67..5c416da 100644 --- a/src/syncer-common/iceberg_schema_column.go +++ b/src/syncer-common/iceberg_schema_column.go @@ -17,19 +17,18 @@ import ( type IcebergColumnType string const ( - IcebergColumnTypeBoolean IcebergColumnType = "boolean" - IcebergColumnTypeString IcebergColumnType = "string" - IcebergColumnTypeInteger IcebergColumnType = "int" - IcebergColumnTypeDecimal IcebergColumnType = "decimal" - IcebergColumnTypeLong IcebergColumnType = "long" - IcebergColumnTypeFloat IcebergColumnType = "float" - IcebergColumnTypeDouble IcebergColumnType = "double" - IcebergColumnTypeDate IcebergColumnType = "date" - IcebergColumnTypeTime IcebergColumnType = "time" - IcebergColumnTypeTimeTz IcebergColumnType = "timetz" - IcebergColumnTypeTimestamp IcebergColumnType = "timestamp" - IcebergColumnTypeTimestampTz IcebergColumnType = "timestamptz" - IcebergColumnTypeBinary IcebergColumnType = "binary" + IcebergColumnTypeBoolean IcebergColumnType = "boolean" + IcebergColumnTypeString IcebergColumnType = "string" + IcebergColumnTypeInteger IcebergColumnType = "int" + IcebergColumnTypeDecimal IcebergColumnType = "decimal" + IcebergColumnTypeLong IcebergColumnType = "long" + IcebergColumnTypeFloat IcebergColumnType = "float" + IcebergColumnTypeDouble IcebergColumnType = "double" + IcebergColumnTypeDate IcebergColumnType = "date" + IcebergColumnTypeTime IcebergColumnType = "time" + IcebergColumnTypeTimeTz IcebergColumnType = "timetz" + IcebergColumnTypeTimestamp IcebergColumnType = "timestamp" + IcebergColumnTypeBinary IcebergColumnType = "binary" BEMIDB_NULL_STRING = "BEMIDB_NULL" @@ -126,8 +125,6 @@ func (col *IcebergSchemaColumn) IcebergSchemaFieldMap() IcebergSchemaField { icebergSchemaField.Type = "time" case IcebergColumnTypeTimestamp: icebergSchemaField.Type = "timestamp" - case IcebergColumnTypeTimestampTz: - icebergSchemaField.Type = "timestamptz" case IcebergColumnTypeBinary: icebergSchemaField.Type = "binary" default: @@ -171,8 +168,6 @@ func (col *IcebergSchemaColumn) DuckdbType() string { duckdbType = "TIME" case IcebergColumnTypeTimestamp: duckdbType = "TIMESTAMP" - case IcebergColumnTypeTimestampTz: - duckdbType = "TIMESTAMP WITH TIME ZONE" case IcebergColumnTypeBinary: duckdbType = "BLOB" default: @@ -299,13 +294,12 @@ func (col *IcebergSchemaColumn) duckdbPrimitiveValueFromCsv(value string) interf return parsedTime case IcebergColumnTypeTimestamp: parsedTimestamp, err := time.Parse("2006-01-02 15:04:05.999999", value) - common.PanicIfError(col.Config, err) - return parsedTimestamp - case IcebergColumnTypeTimestampTz: - parsedTimestamp, err := time.Parse("2006-01-02 15:04:05.999999-07:00", value) if err != nil { - parsedTimestamp, err = time.Parse("2006-01-02 15:04:05.999999-07", value) - common.PanicIfError(col.Config, err) + parsedTimestamp, err = time.Parse("2006-01-02 15:04:05.999999-07:00", value) + if err != nil { + parsedTimestamp, err = time.Parse("2006-01-02 15:04:05.999999-07", value) + common.PanicIfError(col.Config, err) + } } return parsedTimestamp } @@ -404,8 +398,15 @@ func (col *IcebergSchemaColumn) duckdbPrimitiveValueFromJson(value any) interfac if valueString == "" { return nil } + valueString = strings.TrimSuffix(valueString, "Z") parsedTimestamp, err := time.Parse("2006-01-02 15:04:05.999999", valueString) - common.PanicIfError(col.Config, err) + if err != nil { + parsedTimestamp, err = time.Parse("2006-01-02T15:04:05.999999-07:00", valueString) + if err != nil { + parsedTimestamp, err = time.Parse("2006-01-02T15:04:05.999999-07", valueString) + common.PanicIfError(col.Config, err) + } + } return parsedTimestamp case reflect.Float64: valueFloat := value.(float64) @@ -417,21 +418,6 @@ func (col *IcebergSchemaColumn) duckdbPrimitiveValueFromJson(value any) interfac milliseconds := int64(valueFloat) return epoch.Add(time.Duration(milliseconds) * time.Millisecond) } - case IcebergColumnTypeTimestampTz: - valueString := value.(string) - if valueString == "" { - return nil - } - if strings.HasSuffix(valueString, "Z") { - valueString = strings.TrimSuffix(valueString, "Z") + "-00" - } - - parsedTimestamp, err := time.Parse("2006-01-02T15:04:05.999999-07:00", valueString) - if err != nil { - parsedTimestamp, err = time.Parse("2006-01-02T15:04:05.999999-07", valueString) - common.PanicIfError(col.Config, err) - } - return parsedTimestamp } panic(fmt.Sprintf("Unsupported value: %v for column type: %s", value, col.ColumnType)) diff --git a/src/syncer-postgres/pg_schema_column.go b/src/syncer-postgres/pg_schema_column.go index 91dd1b8..e2b7c03 100644 --- a/src/syncer-postgres/pg_schema_column.go +++ b/src/syncer-postgres/pg_schema_column.go @@ -66,10 +66,8 @@ func (pgSchemaColumn *PgSchemaColumn) ToIcebergSchemaColumn() *syncerCommon.Iceb icebergSchemaColumn.ColumnType = syncerCommon.IcebergColumnTypeTime case "timetz": icebergSchemaColumn.ColumnType = syncerCommon.IcebergColumnTypeTimeTz - case "timestamp": + case "timestamp", "timestamptz": icebergSchemaColumn.ColumnType = syncerCommon.IcebergColumnTypeTimestamp - case "timestamptz": - icebergSchemaColumn.ColumnType = syncerCommon.IcebergColumnTypeTimestampTz case "varchar", "char", "text", "jsonb", "json", "bpchar", "uuid", "point", "line", "lseg", "box", "path", "polygon", "circle", "cidr", "inet", "macaddr", "macaddr8", From 5b268cb8153109d2e18072227a2dc61ea5957747 Mon Sep 17 00:00:00 2001 From: exAspArk Date: Wed, 20 Aug 2025 08:56:20 -0400 Subject: [PATCH 08/24] Handle unexpected Amplitude 404 errors --- src/syncer-amplitude/syncer.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/syncer-amplitude/syncer.go b/src/syncer-amplitude/syncer.go index 3c2c6c7..57c2b29 100644 --- a/src/syncer-amplitude/syncer.go +++ b/src/syncer-amplitude/syncer.go @@ -61,9 +61,11 @@ func (syncer *Syncer) Sync() { endTime := t.Add(PAGINATION_TIME_INTERVAL - time.Hour) // -1 hour to ensure we don't overlap (Amplitude uses an inclusive end time) err := syncer.Amplitude.Export(jsonQueueWriter, startTime, endTime) - if err != nil && strings.Contains(err.Error(), "Raw data files were not found.") { - common.LogInfo(syncer.Config.CommonConfig, "No data found for the time range", startTime, "to", endTime, "- will retry later.") - break + if err != nil { + if strings.Contains(err.Error(), "Raw data files were not found.") || strings.Contains(err.Error(), "404: Not Found") { + common.LogInfo(syncer.Config.CommonConfig, "No data found for the time range", startTime, "to", endTime, "- will retry later.") + break + } } common.PanicIfError(syncer.Config.CommonConfig, err) } From 58e832012d4055eea7fe085474971da118143590 Mon Sep 17 00:00:00 2001 From: exAspArk Date: Wed, 20 Aug 2025 08:56:41 -0400 Subject: [PATCH 09/24] Compact Iceberg tables with multiple Parquet files per manifest file --- src/common/common_config.go | 2 +- src/syncer-common/iceberg_writer.go | 265 ++++++++++-------- src/syncer-common/storage_s3.go | 98 ++++--- src/syncer-common/storage_utils.go | 409 ++++++++++++++-------------- src/syncer-postgres/init_test.go | 110 +++++++- 5 files changed, 511 insertions(+), 373 deletions(-) diff --git a/src/common/common_config.go b/src/common/common_config.go index 6993b9c..26de930 100644 --- a/src/common/common_config.go +++ b/src/common/common_config.go @@ -1,7 +1,7 @@ package common const ( - VERSION = "1.0.0" + VERSION = "1.0.1" ENV_LOG_LEVEL = "BEMIDB_LOG_LEVEL" ENV_DISABLE_ANONYMOUS_ANALYTICS = "BEMIDB_DISABLE_ANONYMOUS_ANALYTICS" diff --git a/src/syncer-common/iceberg_writer.go b/src/syncer-common/iceberg_writer.go index 73abcb8..923ea55 100644 --- a/src/syncer-common/iceberg_writer.go +++ b/src/syncer-common/iceberg_writer.go @@ -14,8 +14,8 @@ import ( ) const ( - MAX_ICEBERG_WRITER_BATCH_SIZE = 1024 * 1024 * 1024 // 1 GB - MAX_PARQUET_FILE_SIZE = 100 * 1024 * 1024 // 100 MB + MAX_LOAD_BATCH_SIZE = 1024 * 1024 * 1024 // 1 GB + MAX_PARQUET_FILE_SIZE = 100 * 1024 * 1024 // 100 MB ) type IcebergWriter struct { @@ -47,7 +47,7 @@ func (writer *IcebergWriter) InsertFromCsvCappedBuffer(icebergTable *IcebergTabl _, err := csvReader.Read() // Read the header row common.PanicIfError(writer.Config, err) - writer.insertRows(icebergTable, func(duckdbTableName string, loadedSize int64) (int, bool) { + writer.insertRows(icebergTable, func(duckdbTableName string, loadedSize int64) (int64, bool) { return writer.loadCsvRows(duckdbTableName, csvReader, loadedSize) }) } @@ -63,7 +63,7 @@ func (writer *IcebergWriter) AppendFromCsvCappedBuffer(icebergTable *IcebergTabl _, err := csvReader.Read() // Read the header row common.PanicIfError(writer.Config, err) - writer.appendRows(metadataFileS3Path, cursorValue, func(duckdbTableName string, loadedSize int64) (int, bool) { + writer.appendRows(metadataFileS3Path, cursorValue, func(duckdbTableName string, loadedSize int64) (int64, bool) { return writer.loadCsvRows(duckdbTableName, csvReader, loadedSize) }) } @@ -71,7 +71,7 @@ func (writer *IcebergWriter) AppendFromCsvCappedBuffer(icebergTable *IcebergTabl func (writer *IcebergWriter) InsertFromJsonCappedBuffer(icebergTable *IcebergTable, cappedBuffer *CappedBuffer) { jsonQueueReader := NewJsonQueueReader(cappedBuffer) - writer.insertRows(icebergTable, func(duckdbTableName string, loadedSize int64) (int, bool) { + writer.insertRows(icebergTable, func(duckdbTableName string, loadedSize int64) (int64, bool) { return writer.loadJsonRows(duckdbTableName, jsonQueueReader, loadedSize) }) } @@ -85,7 +85,7 @@ func (writer *IcebergWriter) AppendFromJsonCappedBuffer(icebergTable *IcebergTab jsonQueueReader := NewJsonQueueReader(cappedBuffer) - writer.appendRows(metadataFileS3Path, cursorValue, func(duckdbTableName string, loadedSize int64) (int, bool) { + writer.appendRows(metadataFileS3Path, cursorValue, func(duckdbTableName string, loadedSize int64) (int64, bool) { return writer.loadJsonRows(duckdbTableName, jsonQueueReader, loadedSize) }) } @@ -100,7 +100,7 @@ func (writer *IcebergWriter) UpdateFromJsonCappedBuffer(icebergTable *IcebergTab jsonQueueReader := NewJsonQueueReader(cappedBuffer) uniqueIndexColumnNames := writer.UniqueIndexColumnNames(icebergTable) - writer.updateRows(metadataFileS3Path, uniqueIndexColumnNames, func(duckdbTableName string, loadedSize int64) (int, bool) { + writer.updateRows(metadataFileS3Path, uniqueIndexColumnNames, func(duckdbTableName string, loadedSize int64) (int64, bool) { return writer.loadJsonRows(duckdbTableName, jsonQueueReader, loadedSize) }) } @@ -114,7 +114,7 @@ func (writer *IcebergWriter) DeleteFromJsonCappedBuffer(icebergTable *IcebergTab jsonQueueReader := NewJsonQueueReader(cappedBuffer) uniqueIndexColumnNames := writer.UniqueIndexColumnNames(icebergTable) - writer.deleteRows(metadataFileS3Path, uniqueIndexColumnNames, func(duckdbTableName string, loadedSize int64) (int, bool) { + writer.deleteRows(metadataFileS3Path, uniqueIndexColumnNames, func(duckdbTableName string, loadedSize int64) (int64, bool) { return writer.loadJsonRows(duckdbTableName, jsonQueueReader, loadedSize) }) } @@ -132,58 +132,58 @@ func (writer *IcebergWriter) UniqueIndexColumnNames(icebergTable *IcebergTable) return uniqueIndexColumnNames } -func (writer *IcebergWriter) insertRows(icebergTable *IcebergTable, loadRowsToDuckdbTableFunc func(duckdbTableName string, loadedSize int64) (loadedRowCount int, reachedEnd bool)) { +func (writer *IcebergWriter) insertRows(icebergTable *IcebergTable, loadRowsToDuckdbTableFunc func(duckdbTableName string, loadedSize int64) (loadedRowCount int64, reachedEnd bool)) { tableS3Path := icebergTable.GenerateTableS3Path() dataS3Path := tableS3Path + "/data" metadataS3Path := tableS3Path + "/metadata" - var newParquetCount int - var lastSequenceNumber int - var firstNewParquetFileUuid string - newManifestListItemsSortedDesc := []ManifestListItem{} - var newManifestListFile ManifestListFile + var totalDataFileSize int64 + parquetFilesSortedAsc := []ParquetFile{} + objectsToDeleteKeys := []string{} + var manifestFile ManifestFile + var manifestListFile ManifestListFile for { tempDuckdbTableName := writer.createTempDuckdbTable() defer writer.deleteTempDuckdbTable(tempDuckdbTableName) loadedRowCount, reachedEnd := loadRowsToDuckdbTableFunc(tempDuckdbTableName, 0) - if loadedRowCount == 0 && newParquetCount > 0 { + if loadedRowCount == 0 && len(parquetFilesSortedAsc) > 0 { break } // Create parquet - newParquetFile := writer.StorageS3.CreateParquet(dataS3Path, writer.DuckdbClient, tempDuckdbTableName, writer.IcebergSchemaColumns, loadedRowCount) - common.LogDebug(writer.Config, "Parquet file with", newParquetFile.RecordCount, "record(s) created at:", newParquetFile.Key) - if firstNewParquetFileUuid == "" { - firstNewParquetFileUuid = newParquetFile.Uuid - } + parquetFile := writer.StorageS3.CreateParquet(dataS3Path, writer.DuckdbClient, tempDuckdbTableName, writer.IcebergSchemaColumns, loadedRowCount) + parquetFilesSortedAsc = append(parquetFilesSortedAsc, parquetFile) + totalDataFileSize += parquetFile.Size - // Create manifest - lastSequenceNumber++ - newManifestFile := writer.StorageS3.CreateManifest(metadataS3Path, newParquetFile) - newManifestListItem := ManifestListItem{SequenceNumber: lastSequenceNumber, ManifestFile: newManifestFile} - newManifestListItemsSortedDesc = append([]ManifestListItem{newManifestListItem}, newManifestListItemsSortedDesc...) + // Replace manifest + if manifestFile.Key != "" { + objectsToDeleteKeys = append(objectsToDeleteKeys, manifestFile.Key) + } + manifestFile = writer.StorageS3.CreateManifest(metadataS3Path, parquetFilesSortedAsc) - // Create manifest list - previousManifestListFile := newManifestListFile - newManifestListFile = writer.StorageS3.CreateManifestList(metadataS3Path, firstNewParquetFileUuid, newManifestListItemsSortedDesc) + // Replace manifest list + if manifestListFile.Key != "" { + objectsToDeleteKeys = append(objectsToDeleteKeys, manifestListFile.Key) + } + manifestListItem := ManifestListItem{SequenceNumber: len(parquetFilesSortedAsc) + 1, ManifestFile: manifestFile} + manifestListFile = writer.StorageS3.CreateManifestList(metadataS3Path, totalDataFileSize, []ManifestListItem{manifestListItem}) // Create metadata - writer.StorageS3.CreateMetadata(metadataS3Path, writer.IcebergSchemaColumns, []ManifestListFile{newManifestListFile}) - - newParquetCount++ - common.LogInfo(writer.Config, "Written", newParquetFile.RecordCount, "records in Parquet file #"+common.IntToString(newParquetCount), "("+writer.formattedParquetFileSize(newParquetFile.Size)+")") + writer.StorageS3.CreateMetadata(metadataS3Path, writer.IcebergSchemaColumns, []ManifestListFile{manifestListFile}) + common.LogInfo(writer.Config, "Written", parquetFile.RecordCount, "records in Parquet file #"+common.IntToString(len(parquetFilesSortedAsc)), "("+writer.formattedParquetFileSize(parquetFile.Size)+")") // Create table - if newParquetCount == 1 { + if len(parquetFilesSortedAsc) == 1 { icebergTable.Create(tableS3Path) } - // Delete previous manifest list file - if previousManifestListFile.Key != "" { - writer.deleteObject(previousManifestListFile.Key) + // Delete old files + for _, key := range objectsToDeleteKeys { + writer.deleteObject(key) } + objectsToDeleteKeys = []string{} if reachedEnd { break @@ -191,42 +191,43 @@ func (writer *IcebergWriter) insertRows(icebergTable *IcebergTable, loadRowsToDu } } -func (writer *IcebergWriter) appendRows(metadataFileS3Path string, cursorValue CursorValue, loadRowsToDuckdbTableFunc func(duckdbTableName string, loadedSize int64) (loadedRowCount int, reachedEnd bool)) { +func (writer *IcebergWriter) appendRows(metadataFileS3Path string, cursorValue CursorValue, loadRowsToDuckdbTableFunc func(duckdbTableName string, loadedSize int64) (loadedRowCount int64, reachedEnd bool)) { tableS3Path := strings.Split(metadataFileS3Path, "/metadata/")[0] metadataS3Path := tableS3Path + "/metadata" dataS3Path := tableS3Path + "/data" existingManifestListFile := writer.StorageS3.LastManifestListFile(metadataFileS3Path) - existingManifestListItemsSortedDesc := writer.StorageS3.ManifestListItems(existingManifestListFile) - existingLastManifestListItem := existingManifestListItemsSortedDesc[0] - existingLastParquetFileS3Path, lastParquetFileSize := writer.StorageS3.ParquetFileInfo(existingLastManifestListItem.ManifestFile) - - var newParquetCount int - lastSequenceNumber := existingLastManifestListItem.SequenceNumber - firstNewParquetFileUuid := existingManifestListFile.Uuid() - newManifestListItemsSortedDesc := existingManifestListItemsSortedDesc + existingManifestListItem := writer.StorageS3.ManifestListItems(existingManifestListFile)[0] + existingParquetFilesSortedAsc := writer.StorageS3.ParquetFiles(existingManifestListItem.ManifestFile, writer.IcebergSchemaColumns) + lastParquetFile := existingParquetFilesSortedAsc[len(existingParquetFilesSortedAsc)-1] + replaceLastExistingParquetFile := lastParquetFile.Size < MAX_PARQUET_FILE_SIZE objectsToDeleteKeys := []string{} - replaceLastExistingParquetFile := lastParquetFileSize < MAX_PARQUET_FILE_SIZE + parquetFilesSortedAsc := existingParquetFilesSortedAsc if replaceLastExistingParquetFile { - objectsToDeleteKeys = append(objectsToDeleteKeys, existingLastManifestListItem.ManifestFile.Key) - objectsToDeleteKeys = append(objectsToDeleteKeys, writer.StorageS3.S3Client.ObjectKey(existingLastParquetFileS3Path)) - newManifestListItemsSortedDesc = newManifestListItemsSortedDesc[1:] // Remove the last item to replace it + objectsToDeleteKeys = append(objectsToDeleteKeys, lastParquetFile.Key) + parquetFilesSortedAsc = existingParquetFilesSortedAsc[:len(existingParquetFilesSortedAsc)-1] // Remove last file from the list + } + var totalDataFileSize int64 + for _, parquetFile := range parquetFilesSortedAsc { + totalDataFileSize += parquetFile.Size } + var newParquetFileCount int for { tempDuckdbTableName := writer.createTempDuckdbTable() defer writer.deleteTempDuckdbTable(tempDuckdbTableName) + var initialLoadedSize int64 var initialLoadedRowCount int64 - if newParquetCount == 0 && replaceLastExistingParquetFile { - writer.insertToDuckdbTableFromParquet(tempDuckdbTableName, existingLastParquetFileS3Path, cursorValue) - initialLoadedRowCount = lastParquetFileSize * (MAX_ICEBERG_WRITER_BATCH_SIZE * writer.CompressionFactor / MAX_PARQUET_FILE_SIZE) + if newParquetFileCount == 0 && replaceLastExistingParquetFile { + initialLoadedRowCount = writer.insertToDuckdbTableFromParquet(tempDuckdbTableName, lastParquetFile.Path, cursorValue) + initialLoadedSize = lastParquetFile.Size * (MAX_LOAD_BATCH_SIZE * writer.CompressionFactor / MAX_PARQUET_FILE_SIZE) } - loadedRowCount, reachedEnd := loadRowsToDuckdbTableFunc(tempDuckdbTableName, initialLoadedRowCount) + loadedRowCount, reachedEnd := loadRowsToDuckdbTableFunc(tempDuckdbTableName, initialLoadedSize) if loadedRowCount == 0 { - if newParquetCount == 0 { + if newParquetFileCount == 0 { return // no rows to append in the first batch } else { break // no more rows to append @@ -234,49 +235,46 @@ func (writer *IcebergWriter) appendRows(metadataFileS3Path string, cursorValue C } // Create parquet - newParquetFile := writer.StorageS3.CreateParquet(dataS3Path, writer.DuckdbClient, tempDuckdbTableName, writer.IcebergSchemaColumns, loadedRowCount) - common.LogDebug(writer.Config, "Parquet file with", newParquetFile.RecordCount, "record(s) created at:", newParquetFile.Key) - if firstNewParquetFileUuid == "" { - firstNewParquetFileUuid = newParquetFile.Uuid - } - - // Create manifest - lastSequenceNumber++ - newManifestFile := writer.StorageS3.CreateManifest(metadataS3Path, newParquetFile) - newManifestListItem := ManifestListItem{SequenceNumber: lastSequenceNumber, ManifestFile: newManifestFile} - newManifestListItemsSortedDesc = append([]ManifestListItem{newManifestListItem}, newManifestListItemsSortedDesc...) - - newParquetCount++ - common.LogInfo(writer.Config, "Written", newParquetFile.RecordCount, "records in Parquet file #"+common.IntToString(newParquetCount), "("+writer.formattedParquetFileSize(newParquetFile.Size)+")") + newParquetFile := writer.StorageS3.CreateParquet(dataS3Path, writer.DuckdbClient, tempDuckdbTableName, writer.IcebergSchemaColumns, initialLoadedRowCount+loadedRowCount) + parquetFilesSortedAsc = append(parquetFilesSortedAsc, newParquetFile) + newParquetFileCount++ + totalDataFileSize += newParquetFile.Size + common.LogInfo(writer.Config, "Written", newParquetFile.RecordCount, "records in Parquet file #"+common.IntToString(newParquetFileCount), "("+writer.formattedParquetFileSize(newParquetFile.Size)+")") if reachedEnd { break } } - // Create manifest list - newManifestListFile := writer.StorageS3.CreateManifestList(metadataS3Path, firstNewParquetFileUuid, newManifestListItemsSortedDesc) + // Replace manifest + objectsToDeleteKeys = append(objectsToDeleteKeys, existingManifestListItem.ManifestFile.Key) + manifestFile := writer.StorageS3.CreateManifest(metadataS3Path, parquetFilesSortedAsc) + + // Replace manifest list + objectsToDeleteKeys = append(objectsToDeleteKeys, existingManifestListFile.Key) + manifestListItem := ManifestListItem{SequenceNumber: len(parquetFilesSortedAsc) + 1, ManifestFile: manifestFile} + manifestListFile := writer.StorageS3.CreateManifestList(metadataS3Path, totalDataFileSize, []ManifestListItem{manifestListItem}) // Create metadata - writer.StorageS3.CreateMetadata(metadataS3Path, writer.IcebergSchemaColumns, []ManifestListFile{newManifestListFile}) + writer.StorageS3.CreateMetadata(metadataS3Path, writer.IcebergSchemaColumns, []ManifestListFile{manifestListFile}) // Delete old files - objectsToDeleteKeys = append(objectsToDeleteKeys, existingManifestListFile.Key) for _, key := range objectsToDeleteKeys { writer.deleteObject(key) } } -func (writer *IcebergWriter) updateRows(metadataFileS3Path string, uniqueIndexColumnNames []string, loadRowsToDuckdbTableFunc func(duckdbTableName string, loadedSize int64) (loadedRowCount int, reachedEnd bool)) { +func (writer *IcebergWriter) updateRows(metadataFileS3Path string, uniqueIndexColumnNames []string, loadRowsToDuckdbTableFunc func(duckdbTableName string, loadedSize int64) (loadedRowCount int64, reachedEnd bool)) { tableS3Path := strings.Split(metadataFileS3Path, "/metadata/")[0] metadataS3Path := tableS3Path + "/metadata" dataS3Path := tableS3Path + "/data" existingManifestListFile := writer.StorageS3.LastManifestListFile(metadataFileS3Path) - manifestListItemsSortedDesc := writer.StorageS3.ManifestListItems(existingManifestListFile) - firstNewParquetFileUuid := existingManifestListFile.Uuid() + existingManifestListItem := writer.StorageS3.ManifestListItems(existingManifestListFile)[0] + existingParquetFilesSortedAsc := writer.StorageS3.ParquetFiles(existingManifestListItem.ManifestFile, writer.IcebergSchemaColumns) objectsToDeleteKeys := []string{} + parquetFilesSortedAsc := existingParquetFilesSortedAsc for { tempUpdatedRowsDuckdbTableName := writer.createTempDuckdbTable() defer writer.deleteTempDuckdbTable(tempUpdatedRowsDuckdbTableName) @@ -290,28 +288,25 @@ func (writer *IcebergWriter) updateRows(metadataFileS3Path string, uniqueIndexCo } } - for i, manifestListItem := range manifestListItemsSortedDesc { - parquetFileS3Path, _ := writer.StorageS3.ParquetFileInfo(manifestListItem.ManifestFile) - if !writer.hasOverlappingRowsInParquet(tempUpdatedRowsDuckdbTableName, parquetFileS3Path, uniqueIndexColumnNames) { + for i, parquetFile := range parquetFilesSortedAsc { + if !writer.hasOverlappingRowsInParquet(tempUpdatedRowsDuckdbTableName, parquetFile.Path, uniqueIndexColumnNames) { continue } - objectsToDeleteKeys = append(objectsToDeleteKeys, writer.StorageS3.S3Client.ObjectKey(parquetFileS3Path)) - objectsToDeleteKeys = append(objectsToDeleteKeys, manifestListItem.ManifestFile.Key) - tempDuckdbTableName := writer.createTempDuckdbTable() defer writer.deleteTempDuckdbTable(tempDuckdbTableName) - writer.insertToDuckdbTableFromParquetWithoutOverlappingDuckdbTableRows(tempDuckdbTableName, tempUpdatedRowsDuckdbTableName, parquetFileS3Path, uniqueIndexColumnNames) - writer.insertToDuckdbTableFromDuckdbTableThatOverlapWithParquetRows(tempDuckdbTableName, tempUpdatedRowsDuckdbTableName, parquetFileS3Path, uniqueIndexColumnNames) + var loadedRowCount int64 + loadedRowCount += writer.insertToDuckdbTableFromParquetWithoutOverlappingDuckdbTableRows(tempDuckdbTableName, tempUpdatedRowsDuckdbTableName, parquetFile.Path, uniqueIndexColumnNames) + loadedRowCount += writer.insertToDuckdbTableFromDuckdbTableThatOverlapWithParquetRows(tempDuckdbTableName, tempUpdatedRowsDuckdbTableName, parquetFile.Path, uniqueIndexColumnNames) // Create parquet newParquetFile := writer.StorageS3.CreateParquet(dataS3Path, writer.DuckdbClient, tempDuckdbTableName, writer.IcebergSchemaColumns, loadedRowCount) - common.LogDebug(writer.Config, "Parquet file with", newParquetFile.RecordCount, "record(s) created at:", newParquetFile.Key) + common.LogInfo(writer.Config, "Written", newParquetFile.RecordCount, "records in 'updated' Parquet file ("+writer.formattedParquetFileSize(newParquetFile.Size)+")") - // Create manifest - newManifestFile := writer.StorageS3.CreateManifest(metadataS3Path, newParquetFile) - manifestListItemsSortedDesc[i].ManifestFile = newManifestFile + // Replace the old Parquet file with the new one + parquetFilesSortedAsc[i] = newParquetFile + objectsToDeleteKeys = append(objectsToDeleteKeys, parquetFile.Key) } if reachedEnd { @@ -323,29 +318,39 @@ func (writer *IcebergWriter) updateRows(metadataFileS3Path string, uniqueIndexCo return // no overlapping rows found } - // Create manifest list - newManifestListFile := writer.StorageS3.CreateManifestList(metadataS3Path, firstNewParquetFileUuid, manifestListItemsSortedDesc) + // Replace manifest + objectsToDeleteKeys = append(objectsToDeleteKeys, existingManifestListItem.ManifestFile.Key) + manifestFile := writer.StorageS3.CreateManifest(metadataS3Path, parquetFilesSortedAsc) + + // Replace manifest list + objectsToDeleteKeys = append(objectsToDeleteKeys, existingManifestListFile.Key) + var totalDataFileSize int64 + for _, parquetFile := range parquetFilesSortedAsc { + totalDataFileSize += parquetFile.Size + } + manifestListItem := ManifestListItem{SequenceNumber: len(parquetFilesSortedAsc) + 1, ManifestFile: manifestFile} + manifestListFile := writer.StorageS3.CreateManifestList(metadataS3Path, totalDataFileSize, []ManifestListItem{manifestListItem}) // Create metadata - writer.StorageS3.CreateMetadata(metadataS3Path, writer.IcebergSchemaColumns, []ManifestListFile{newManifestListFile}) + writer.StorageS3.CreateMetadata(metadataS3Path, writer.IcebergSchemaColumns, []ManifestListFile{manifestListFile}) // Delete old files - objectsToDeleteKeys = append(objectsToDeleteKeys, existingManifestListFile.Key) for _, key := range objectsToDeleteKeys { writer.deleteObject(key) } } -func (writer *IcebergWriter) deleteRows(metadataFileS3Path string, uniqueIndexColumnNames []string, loadRowsToDuckdbTableFunc func(duckdbTableName string, loadedSize int64) (loadedRowCount int, reachedEnd bool)) { +func (writer *IcebergWriter) deleteRows(metadataFileS3Path string, uniqueIndexColumnNames []string, loadRowsToDuckdbTableFunc func(duckdbTableName string, loadedSize int64) (loadedRowCount int64, reachedEnd bool)) { tableS3Path := strings.Split(metadataFileS3Path, "/metadata/")[0] metadataS3Path := tableS3Path + "/metadata" dataS3Path := tableS3Path + "/data" existingManifestListFile := writer.StorageS3.LastManifestListFile(metadataFileS3Path) - manifestListItemsSortedDesc := writer.StorageS3.ManifestListItems(existingManifestListFile) - firstNewParquetFileUuid := existingManifestListFile.Uuid() + existingManifestListItem := writer.StorageS3.ManifestListItems(existingManifestListFile)[0] + existingParquetFilesSortedAsc := writer.StorageS3.ParquetFiles(existingManifestListItem.ManifestFile, writer.IcebergSchemaColumns) objectsToDeleteKeys := []string{} + parquetFilesSortedAsc := existingParquetFilesSortedAsc for { tempDeletedRowsDuckdbTableName := writer.createTempDuckdbTable() defer writer.deleteTempDuckdbTable(tempDeletedRowsDuckdbTableName) @@ -359,27 +364,23 @@ func (writer *IcebergWriter) deleteRows(metadataFileS3Path string, uniqueIndexCo } } - for i, manifestListItem := range manifestListItemsSortedDesc { - parquetFileS3Path, _ := writer.StorageS3.ParquetFileInfo(manifestListItem.ManifestFile) - if !writer.hasOverlappingRowsInParquet(tempDeletedRowsDuckdbTableName, parquetFileS3Path, uniqueIndexColumnNames) { + for i, parquetFile := range parquetFilesSortedAsc { + if !writer.hasOverlappingRowsInParquet(tempDeletedRowsDuckdbTableName, parquetFile.Path, uniqueIndexColumnNames) { continue } - objectsToDeleteKeys = append(objectsToDeleteKeys, writer.StorageS3.S3Client.ObjectKey(parquetFileS3Path)) - objectsToDeleteKeys = append(objectsToDeleteKeys, manifestListItem.ManifestFile.Key) - tempDuckdbTableName := writer.createTempDuckdbTable() defer writer.deleteTempDuckdbTable(tempDuckdbTableName) - writer.insertToDuckdbTableFromParquetWithoutOverlappingDuckdbTableRows(tempDuckdbTableName, tempDeletedRowsDuckdbTableName, parquetFileS3Path, uniqueIndexColumnNames) + rowCount := writer.insertToDuckdbTableFromParquetWithoutOverlappingDuckdbTableRows(tempDuckdbTableName, tempDeletedRowsDuckdbTableName, parquetFile.Path, uniqueIndexColumnNames) // Create parquet - newParquetFile := writer.StorageS3.CreateParquet(dataS3Path, writer.DuckdbClient, tempDuckdbTableName, writer.IcebergSchemaColumns, loadedRowCount) - common.LogDebug(writer.Config, "Parquet file with", newParquetFile.RecordCount, "record(s) created at:", newParquetFile.Key) + newParquetFile := writer.StorageS3.CreateParquet(dataS3Path, writer.DuckdbClient, tempDuckdbTableName, writer.IcebergSchemaColumns, rowCount) + common.LogInfo(writer.Config, "Written", newParquetFile.RecordCount, "records in 'deleted' Parquet file ("+writer.formattedParquetFileSize(newParquetFile.Size)+")") - // Create manifest - newManifestFile := writer.StorageS3.CreateManifest(metadataS3Path, newParquetFile) - manifestListItemsSortedDesc[i].ManifestFile = newManifestFile + // Replace the old Parquet file with the new one + parquetFilesSortedAsc[i] = newParquetFile + objectsToDeleteKeys = append(objectsToDeleteKeys, parquetFile.Key) } if reachedEnd { @@ -391,14 +392,23 @@ func (writer *IcebergWriter) deleteRows(metadataFileS3Path string, uniqueIndexCo return // no overlapping rows found } - // Create manifest list - newManifestListFile := writer.StorageS3.CreateManifestList(metadataS3Path, firstNewParquetFileUuid, manifestListItemsSortedDesc) + // Replace manifest + objectsToDeleteKeys = append(objectsToDeleteKeys, existingManifestListItem.ManifestFile.Key) + manifestFile := writer.StorageS3.CreateManifest(metadataS3Path, parquetFilesSortedAsc) + + // Replace manifest list + objectsToDeleteKeys = append(objectsToDeleteKeys, existingManifestListFile.Key) + var totalDataFileSize int64 + for _, parquetFile := range parquetFilesSortedAsc { + totalDataFileSize += parquetFile.Size + } + manifestListItem := ManifestListItem{SequenceNumber: len(parquetFilesSortedAsc) + 1, ManifestFile: manifestFile} + manifestListFile := writer.StorageS3.CreateManifestList(metadataS3Path, totalDataFileSize, []ManifestListItem{manifestListItem}) // Create metadata - writer.StorageS3.CreateMetadata(metadataS3Path, writer.IcebergSchemaColumns, []ManifestListFile{newManifestListFile}) + writer.StorageS3.CreateMetadata(metadataS3Path, writer.IcebergSchemaColumns, []ManifestListFile{manifestListFile}) // Delete old files - objectsToDeleteKeys = append(objectsToDeleteKeys, existingManifestListFile.Key) for _, key := range objectsToDeleteKeys { writer.deleteObject(key) } @@ -430,7 +440,7 @@ func (writer *IcebergWriter) hasOverlappingRowsInParquet(duckdbTableName string, return count > 0 } -func (writer *IcebergWriter) insertToDuckdbTableFromParquet(duckdbTableName string, parquetFileS3Path string, cursorValue CursorValue) { +func (writer *IcebergWriter) insertToDuckdbTableFromParquet(duckdbTableName string, parquetFileS3Path string, cursorValue CursorValue) int64 { sql := "INSERT INTO " + duckdbTableName + " SELECT * FROM read_parquet('" + parquetFileS3Path + "')" if cursorValue.OverrideRows { // Exclude rows with the cursor value @@ -440,28 +450,43 @@ func (writer *IcebergWriter) insertToDuckdbTableFromParquet(duckdbTableName stri common.LogInfo(writer.Config, "Replacing last existing Parquet file:", strings.Split(parquetFileS3Path, "/data/")[1]) } - _, err := writer.DuckdbClient.ExecContext(context.Background(), sql) + result, err := writer.DuckdbClient.ExecContext(context.Background(), sql) + common.PanicIfError(writer.Config, err) + + rowsAffected, err := result.RowsAffected() common.PanicIfError(writer.Config, err) + + return rowsAffected } -func (writer *IcebergWriter) insertToDuckdbTableFromDuckdbTableThatOverlapWithParquetRows(insertDuckdbTableName string, sourceDuckdbTableName string, parquetFileS3Path string, uniqueIndexColumnNames []string) { +func (writer *IcebergWriter) insertToDuckdbTableFromDuckdbTableThatOverlapWithParquetRows(insertDuckdbTableName string, sourceDuckdbTableName string, parquetFileS3Path string, uniqueIndexColumnNames []string) int64 { uniqueIndexConditions := make([]string, len(uniqueIndexColumnNames)) for i, uniqueIndexColumnName := range uniqueIndexColumnNames { uniqueIndexConditions[i] = `"` + uniqueIndexColumnName + `" IN (SELECT "` + uniqueIndexColumnName + `" FROM read_parquet('` + parquetFileS3Path + "'))" } sql := "INSERT INTO " + insertDuckdbTableName + " SELECT * FROM " + sourceDuckdbTableName + " WHERE " + strings.Join(uniqueIndexConditions, " AND ") - _, err := writer.DuckdbClient.ExecContext(context.Background(), sql) + result, err := writer.DuckdbClient.ExecContext(context.Background(), sql) + common.PanicIfError(writer.Config, err) + + rowsAffected, err := result.RowsAffected() common.PanicIfError(writer.Config, err) + + return rowsAffected } -func (writer *IcebergWriter) insertToDuckdbTableFromParquetWithoutOverlappingDuckdbTableRows(insertDuckdbTableName string, overlappingDuckdbTableName string, parquetFileS3Path string, uniqueIndexColumnNames []string) { +func (writer *IcebergWriter) insertToDuckdbTableFromParquetWithoutOverlappingDuckdbTableRows(insertDuckdbTableName string, overlappingDuckdbTableName string, parquetFileS3Path string, uniqueIndexColumnNames []string) int64 { uniqueIndexConditions := make([]string, len(uniqueIndexColumnNames)) for i, uniqueIndexColumnName := range uniqueIndexColumnNames { uniqueIndexConditions[i] = `"` + uniqueIndexColumnName + `" NOT IN (SELECT "` + uniqueIndexColumnName + `" FROM ` + overlappingDuckdbTableName + ")" } sql := "INSERT INTO " + insertDuckdbTableName + " SELECT * FROM read_parquet('" + parquetFileS3Path + "') WHERE " + strings.Join(uniqueIndexConditions, " AND ") - _, err := writer.DuckdbClient.ExecContext(context.Background(), sql) + result, err := writer.DuckdbClient.ExecContext(context.Background(), sql) + common.PanicIfError(writer.Config, err) + + rowsAffected, err := result.RowsAffected() common.PanicIfError(writer.Config, err) + + return rowsAffected } func (writer *IcebergWriter) deleteTempDuckdbTable(duckdbTableName string) { @@ -481,7 +506,7 @@ func (writer *IcebergWriter) deleteObject(key string) { writer.StorageS3.S3Client.DeleteObject(key) } -func (writer *IcebergWriter) loadCsvRows(duckdbTableName string, csvReader *csv.Reader, loadedSize int64) (loadedRowCount int, reachedEnd bool) { +func (writer *IcebergWriter) loadCsvRows(duckdbTableName string, csvReader *csv.Reader, loadedSize int64) (loadedRowCount int64, reachedEnd bool) { appender, err := writer.DuckdbClient.Appender("", duckdbTableName) common.PanicIfError(writer.Config, err) defer appender.Close() @@ -505,7 +530,7 @@ func (writer *IcebergWriter) loadCsvRows(duckdbTableName string, csvReader *csv. common.PanicIfError(writer.Config, err) loadedRowCount++ - if loadedSize >= (MAX_ICEBERG_WRITER_BATCH_SIZE * writer.CompressionFactor) { + if loadedSize >= (MAX_LOAD_BATCH_SIZE * writer.CompressionFactor) { common.LogDebug(writer.Config, "Reached batch size limit") break } @@ -515,7 +540,7 @@ func (writer *IcebergWriter) loadCsvRows(duckdbTableName string, csvReader *csv. return loadedRowCount, reachedEnd } -func (writer *IcebergWriter) loadJsonRows(duckdbTableName string, jsonQueueReader *JsonQueueReader, loadedSize int64) (loadedRowCount int, reachedEnd bool) { +func (writer *IcebergWriter) loadJsonRows(duckdbTableName string, jsonQueueReader *JsonQueueReader, loadedSize int64) (loadedRowCount int64, reachedEnd bool) { appender, err := writer.DuckdbClient.Appender("", duckdbTableName) common.PanicIfError(writer.Config, err) defer appender.Close() @@ -537,7 +562,7 @@ func (writer *IcebergWriter) loadJsonRows(duckdbTableName string, jsonQueueReade common.PanicIfError(writer.Config, err) loadedRowCount++ - if loadedSize >= (MAX_ICEBERG_WRITER_BATCH_SIZE * writer.CompressionFactor) { + if loadedSize >= (MAX_LOAD_BATCH_SIZE * writer.CompressionFactor) { common.LogDebug(writer.Config, "Reached batch size limit") break } diff --git a/src/syncer-common/storage_s3.go b/src/syncer-common/storage_s3.go index 8994d62..9095ad0 100644 --- a/src/syncer-common/storage_s3.go +++ b/src/syncer-common/storage_s3.go @@ -33,7 +33,6 @@ type ParquetFileStats struct { } type ParquetFile struct { - Uuid string Key string Path string // With s3://bucket/ prefix Size int64 @@ -42,13 +41,12 @@ type ParquetFile struct { } type ManifestFile struct { - RecordsDeleted bool - SnapshotId int64 - Key string - Path string // With s3://bucket/ prefix - Size int64 - RecordCount int64 - DataFileSize int64 + Key string + Path string // With s3://bucket/ prefix + Size int64 + TotalRecordCount int64 + TotalDataFileCount int32 + RecordsDeleted bool } type ManifestListItem struct { @@ -57,22 +55,15 @@ type ManifestListItem struct { } type ManifestListFile struct { - SequenceNumber int - SnapshotId int64 - TimestampMs int64 - Key string - Path string // With s3://bucket/ prefix - Operation string - AddedFilesSize int64 - AddedDataFiles int64 - AddedRecords int64 - RemovedFilesSize int64 - DeletedDataFiles int64 - DeletedRecords int64 -} - -func (manifestListFile ManifestListFile) Uuid() string { - return strings.TrimSuffix(manifestListFile.Key[len(manifestListFile.Key)-UUID_LENGTH-5:], ".avro") + SequenceNumber int + SnapshotId int64 + TimestampMs int64 + Key string + Path string // With s3://bucket/ prefix + Operation string + TotalFilesSize int64 + TotalDataFiles int64 + TotalRecords int64 } type MetadataFile struct { @@ -90,10 +81,9 @@ func NewStorageS3(Config *common.CommonConfig) *StorageS3 { // Write --------------------------------------------------------------------------------------------------------------- -func (storage *StorageS3) CreateParquet(dataS3Path string, duckdbClient *common.DuckdbClient, tempDuckdbTableName string, icebergSchemaColumns []*IcebergSchemaColumn, rowCount int) ParquetFile { +func (storage *StorageS3) CreateParquet(dataS3Path string, duckdbClient *common.DuckdbClient, tempDuckdbTableName string, icebergSchemaColumns []*IcebergSchemaColumn, rowCount int64) ParquetFile { ctx := context.Background() - uuid := uuid.New().String() - fileName := storage.generateTimestampString() + "_" + uuid + ".parquet" + fileName := storage.generateTimestampString() + "_" + uuid.New().String() + ".parquet" fileS3Path := dataS3Path + "/" + fileName fileS3Key := storage.S3Client.ObjectKey(fileS3Path) @@ -107,38 +97,48 @@ func (storage *StorageS3) CreateParquet(dataS3Path string, duckdbClient *common. parquetStats := storage.StorageUtils.ReadParquetStats(fileReader, icebergSchemaColumns) return ParquetFile{ - Uuid: uuid, Key: fileS3Key, Path: dataS3Path + "/" + fileName, Size: fileSize, - RecordCount: int64(rowCount), + RecordCount: rowCount, Stats: parquetStats, } } -func (storage *StorageS3) CreateManifest(metadataS3Path string, parquetFile ParquetFile) (manifestFile ManifestFile) { - fileName := storage.generateTimestampString() + "_" + parquetFile.Uuid + "-m0.avro" +func (storage *StorageS3) CreateManifest(metadataS3Path string, parquetFilesSortedAsc []ParquetFile) (manifestFile ManifestFile) { + fileName := storage.generateTimestampString() + "_" + uuid.New().String() + "-m0.avro" fileS3Key := storage.S3Client.ObjectKey(metadataS3Path) + "/" + fileName + var fileSize int64 storage.uploadTemporaryFile("manifest", fileS3Key, func(tempFile *os.File) { var err error - manifestFile, err = storage.StorageUtils.WriteManifestFile(tempFile.Name(), parquetFile) + fileSize, err = storage.StorageUtils.WriteManifestFile(tempFile.Name(), parquetFilesSortedAsc) common.PanicIfError(storage.Config, err) }) - common.LogDebug(storage.Config, "Manifest file created at:", fileS3Key) - manifestFile.Key = fileS3Key - manifestFile.Path = metadataS3Path + "/" + fileName - return manifestFile + + var totalRecordCount int64 + for _, parquetFile := range parquetFilesSortedAsc { + totalRecordCount += parquetFile.RecordCount + } + + return ManifestFile{ + Key: fileS3Key, + Path: metadataS3Path + "/" + fileName, + Size: fileSize, + TotalDataFileCount: int32(len(parquetFilesSortedAsc)), + TotalRecordCount: totalRecordCount, + RecordsDeleted: false, + } } -func (storage *StorageS3) CreateManifestList(metadataS3Path string, parquetFileUuid string, manifestListItemsSortedDesc []ManifestListItem) (manifestListFile ManifestListFile) { - fileName := "snap-" + storage.generateTimestampString() + "_" + parquetFileUuid + ".avro" +func (storage *StorageS3) CreateManifestList(metadataS3Path string, totalDataFileSize int64, manifestListItemsSortedDesc []ManifestListItem) (manifestListFile ManifestListFile) { + fileName := "snap-" + storage.generateTimestampString() + "_" + uuid.New().String() + ".avro" fileS3Key := storage.S3Client.ObjectKey(metadataS3Path) + "/" + fileName storage.uploadTemporaryFile("manifest-list", fileS3Key, func(tempFile *os.File) { var err error - manifestListFile, err = storage.StorageUtils.WriteManifestListFile(tempFile.Name(), manifestListItemsSortedDesc) + manifestListFile, err = storage.StorageUtils.WriteManifestListFile(tempFile.Name(), totalDataFileSize, manifestListItemsSortedDesc) common.PanicIfError(storage.Config, err) }) @@ -178,15 +178,23 @@ func (storage *StorageS3) ManifestListItems(manifestListFile ManifestListFile) [ return storage.StorageUtils.ParseManifestListItems(storage.S3Client.BucketS3Prefix(), manifestListContent) } -func (storage *StorageS3) ParquetFileInfo(manifestFile ManifestFile) (fileS3Path string, fileSize int64) { +func (storage *StorageS3) ParquetFiles(manifestFile ManifestFile, icebergSchemaColumns []*IcebergSchemaColumn) []ParquetFile { + ctx := context.Background() manifestContent := storage.readObjectContent(manifestFile.Path) - fileS3Path = storage.StorageUtils.ParseParquetFileS3Path(manifestContent) + parquetFilesSortedAsc := storage.StorageUtils.ParseParquetFiles(manifestContent) - fileS3Key := storage.S3Client.ObjectKey(fileS3Path) - headObjectOutput := storage.S3Client.HeadObject(fileS3Key) - fileSize = *headObjectOutput.ContentLength + for i, parquetFile := range parquetFilesSortedAsc { + fileS3Key := storage.S3Client.ObjectKey(parquetFile.Path) + + fileReader, err := s3v2.NewS3FileReaderWithClient(ctx, storage.S3Client.S3, storage.Config.Aws.S3Bucket, fileS3Key) + common.PanicIfError(storage.Config, err) + parquetStats := storage.StorageUtils.ReadParquetStats(fileReader, icebergSchemaColumns) + + parquetFilesSortedAsc[i].Key = fileS3Key + parquetFilesSortedAsc[i].Stats = parquetStats + } - return fileS3Path, fileSize + return parquetFilesSortedAsc } // --------------------------------------------------------------------------------------------------------------------- diff --git a/src/syncer-common/storage_utils.go b/src/syncer-common/storage_utils.go index 5c3d9ed..cc65e53 100644 --- a/src/syncer-common/storage_utils.go +++ b/src/syncer-common/storage_utils.go @@ -14,13 +14,14 @@ import ( "github.com/linkedin/goavro" "github.com/xitongsys/parquet-go/reader" "github.com/xitongsys/parquet-go/source" - "golang.org/x/exp/maps" ) const ( - ICEBERG_MANIFEST_STATUS_ADDED = 1 - ICEBERG_MANIFEST_STATUS_DELETED = 2 + ICEBERG_MANIFEST_STATUS_EXISTING = 0 + ICEBERG_MANIFEST_STATUS_ADDED = 1 + ICEBERG_MANIFEST_STATUS_DELETED = 2 + ICEBERG_MANIFEST_LIST_OPERATION_REPLACE = "replace" ICEBERG_MANIFEST_LIST_OPERATION_APPEND = "append" ICEBERG_MANIFEST_LIST_OPERATION_OVERWRITE = "overwrite" ICEBERG_MANIFEST_LIST_OPERATION_DELETE = "delete" @@ -46,24 +47,18 @@ type ManifestListsJson struct { TimestampMs int64 `json:"timestamp-ms"` Path string `json:"manifest-list"` Summary struct { - Operation string `json:"operation"` - AddedFilesSize string `json:"added-files-size"` - AddedDataFiles string `json:"added-data-files"` - AddedRecords string `json:"added-records"` - RemovedFilesSize string `json:"removed-files-size"` - DeletedDataFiles string `json:"deleted-data-files"` - DeletedRecords string `json:"deleted-records"` + Operation string `json:"operation"` + TotalDataFiles string `json:"total-data-files"` + TotalFilesSize string `json:"total-files-size"` + TotalRecords string `json:"total-records"` } `json:"summary"` } `json:"snapshots"` } type ManifestListSequenceStats struct { - AddedFilesSize int64 - AddedDataFiles int64 - AddedRecords int64 - RemovedFilesSize int64 - DeletedDataFiles int64 - DeletedRecords int64 + TotalFilesSize int64 + TotalDataFiles int64 + TotalRecords int64 } type StorageUtils struct { @@ -112,12 +107,19 @@ func (utils *StorageUtils) ReadParquetStats(fileReader source.ParquetFile, icebe SplitOffsets: []int64{}, } + stringColumnNames := common.NewSet[string]() fieldIdByColumnName := make(map[string]int) for _, column := range icebergSchemaColumns { + columnName := strings.ToLower(column.NormalizedColumnName()) + if column.IsList { - fieldIdByColumnName[strings.ToLower(column.NormalizedColumnName())] = PARQUET_NESTED_FIELD_ID_PREFIX + column.Position + fieldIdByColumnName[columnName] = PARQUET_NESTED_FIELD_ID_PREFIX + column.Position } else { - fieldIdByColumnName[strings.ToLower(column.NormalizedColumnName())] = column.Position + fieldIdByColumnName[columnName] = column.Position + } + + if column.ColumnType == IcebergColumnTypeString { + stringColumnNames.Add(columnName) } } @@ -128,26 +130,28 @@ func (utils *StorageUtils) ReadParquetStats(fileReader source.ParquetFile, icebe for _, columnChunk := range rowGroup.Columns { columnMetaData := columnChunk.MetaData - columnName := columnMetaData.PathInSchema[0] - fieldId, ok := fieldIdByColumnName[strings.ToLower(columnName)] + columnName := strings.ToLower(columnMetaData.PathInSchema[0]) // Parquet column names look like Timemscolumn instead of timeMsColumn + fieldId, ok := fieldIdByColumnName[columnName] if !ok { continue } parquetStats.ColumnSizes[fieldId] += columnMetaData.TotalCompressedSize parquetStats.ValueCounts[fieldId] += int64(columnMetaData.NumValues) + if columnMetaData.Statistics != nil && columnMetaData.Statistics.NullCount != nil { + parquetStats.NullValueCounts[fieldId] += *columnMetaData.Statistics.NullCount + } else { + parquetStats.NullValueCounts[fieldId] += 0 + } - if columnMetaData.Statistics != nil { - if columnMetaData.Statistics.NullCount != nil { - parquetStats.NullValueCounts[fieldId] += *columnMetaData.Statistics.NullCount - } - + if columnMetaData.Statistics != nil && fieldId <= PARQUET_NESTED_FIELD_ID_PREFIX { // Not a nested field minValue := columnMetaData.Statistics.Min maxValue := columnMetaData.Statistics.Max - if parquetStats.LowerBounds[fieldId] == nil || bytes.Compare(parquetStats.LowerBounds[fieldId], minValue) > 0 { + // Ignore empty values for non-string columns + if (stringColumnNames.Contains(columnName) || len(minValue) > 0) && (parquetStats.LowerBounds[fieldId] == nil || bytes.Compare(parquetStats.LowerBounds[fieldId], minValue) > 0) { parquetStats.LowerBounds[fieldId] = minValue } - if parquetStats.UpperBounds[fieldId] == nil || bytes.Compare(parquetStats.UpperBounds[fieldId], maxValue) < 0 { + if (stringColumnNames.Contains(columnName) || len(maxValue) > 0) && (parquetStats.UpperBounds[fieldId] == nil || bytes.Compare(parquetStats.UpperBounds[fieldId], maxValue) < 0) { parquetStats.UpperBounds[fieldId] = maxValue } } @@ -156,156 +160,151 @@ func (utils *StorageUtils) ReadParquetStats(fileReader source.ParquetFile, icebe return parquetStats } -func (utils *StorageUtils) WriteManifestFile(filePath string, parquetFile ParquetFile) (manifestFile ManifestFile, err error) { - snapshotId := time.Now().UnixNano() - codec, err := goavro.NewCodec(MANIFEST_SCHEMA) - if err != nil { - return ManifestFile{}, fmt.Errorf("failed to create Avro codec: %v", err) - } - - columnSizesArr := []interface{}{} - for fieldId, size := range parquetFile.Stats.ColumnSizes { - columnSizesArr = append(columnSizesArr, map[string]interface{}{ - "key": fieldId, - "value": size, - }) - } +func (utils *StorageUtils) WriteManifestFile(filePath string, parquetFilesSortedAsc []ParquetFile) (int64, error) { + manifestEntries := make([]map[string]interface{}, len(parquetFilesSortedAsc)) + + for i, parquetFile := range parquetFilesSortedAsc { + snapshotId := time.Now().UnixNano() + + columnSizesArr := []interface{}{} + for fieldId, size := range parquetFile.Stats.ColumnSizes { + columnSizesArr = append(columnSizesArr, map[string]interface{}{ + "key": fieldId, + "value": size, + }) + } - valueCountsArr := []interface{}{} - for fieldId, count := range parquetFile.Stats.ValueCounts { - valueCountsArr = append(valueCountsArr, map[string]interface{}{ - "key": fieldId, - "value": count, - }) - } + valueCountsArr := []interface{}{} + for fieldId, count := range parquetFile.Stats.ValueCounts { + valueCountsArr = append(valueCountsArr, map[string]interface{}{ + "key": fieldId, + "value": count, + }) + } - nullValueCountsArr := []interface{}{} - for fieldId, count := range parquetFile.Stats.NullValueCounts { - nullValueCountsArr = append(nullValueCountsArr, map[string]interface{}{ - "key": fieldId, - "value": count, - }) - } + nullValueCountsArr := []interface{}{} + for fieldId, count := range parquetFile.Stats.NullValueCounts { + nullValueCountsArr = append(nullValueCountsArr, map[string]interface{}{ + "key": fieldId, + "value": count, + }) + } - lowerBoundsArr := []interface{}{} - for fieldId, value := range parquetFile.Stats.LowerBounds { - lowerBoundsArr = append(lowerBoundsArr, map[string]interface{}{ - "key": fieldId, - "value": value, - }) - } + lowerBoundsArr := []interface{}{} + for fieldId, value := range parquetFile.Stats.LowerBounds { + lowerBoundsArr = append(lowerBoundsArr, map[string]interface{}{ + "key": fieldId, + "value": value, + }) + } - upperBoundsArr := []interface{}{} - for fieldId, value := range parquetFile.Stats.UpperBounds { - upperBoundsArr = append(upperBoundsArr, map[string]interface{}{ - "key": fieldId, - "value": value, - }) - } + upperBoundsArr := []interface{}{} + for fieldId, value := range parquetFile.Stats.UpperBounds { + upperBoundsArr = append(upperBoundsArr, map[string]interface{}{ + "key": fieldId, + "value": value, + }) + } - dataFile := map[string]interface{}{ - "content": 0, // 0: DATA, 1: POSITION DELETES, 2: EQUALITY DELETES - "file_path": parquetFile.Path, - "file_format": "PARQUET", - "partition": map[string]interface{}{}, - "record_count": parquetFile.RecordCount, - "file_size_in_bytes": parquetFile.Size, - "column_sizes": map[string]interface{}{ - "array": columnSizesArr, - }, - "value_counts": map[string]interface{}{ - "array": valueCountsArr, - }, - "null_value_counts": map[string]interface{}{ - "array": nullValueCountsArr, - }, - "nan_value_counts": map[string]interface{}{ - "array": []interface{}{}, - }, - "lower_bounds": map[string]interface{}{ - "array": lowerBoundsArr, - }, - "upper_bounds": map[string]interface{}{ - "array": upperBoundsArr, - }, - "key_metadata": nil, - "split_offsets": map[string]interface{}{ - "array": parquetFile.Stats.SplitOffsets, - }, - "equality_ids": nil, - "sort_order_id": map[string]interface{}{ - "int": 0, - }, - } + dataFile := map[string]interface{}{ + "content": 0, // 0: DATA, 1: POSITION DELETES, 2: EQUALITY DELETES + "file_path": parquetFile.Path, + "file_format": "PARQUET", + "partition": map[string]interface{}{}, + "record_count": parquetFile.RecordCount, + "file_size_in_bytes": parquetFile.Size, + "column_sizes": map[string]interface{}{ + "array": columnSizesArr, + }, + "value_counts": map[string]interface{}{ + "array": valueCountsArr, + }, + "null_value_counts": map[string]interface{}{ + "array": nullValueCountsArr, + }, + "nan_value_counts": map[string]interface{}{ + "array": []interface{}{}, + }, + "lower_bounds": map[string]interface{}{ + "array": lowerBoundsArr, + }, + "upper_bounds": map[string]interface{}{ + "array": upperBoundsArr, + }, + "key_metadata": nil, + "split_offsets": map[string]interface{}{ + "array": parquetFile.Stats.SplitOffsets, + }, + "equality_ids": nil, + "sort_order_id": map[string]interface{}{ + "int": 0, + }, + } - manifestEntry := map[string]interface{}{ - "status": ICEBERG_MANIFEST_STATUS_ADDED, - "snapshot_id": map[string]interface{}{"long": snapshotId}, - "sequence_number": nil, - "file_sequence_number": nil, - "data_file": dataFile, + manifestEntries[i] = map[string]interface{}{ + "status": ICEBERG_MANIFEST_STATUS_EXISTING, + "snapshot_id": map[string]interface{}{"long": snapshotId}, + "sequence_number": map[string]interface{}{"long": i + 1}, + "file_sequence_number": map[string]interface{}{"long": i + 1}, + "data_file": dataFile, + } } avroFile, err := os.Create(filePath) if err != nil { - return ManifestFile{}, fmt.Errorf("failed to create manifest file: %v", err) + return 0, fmt.Errorf("failed to create manifest file: %v", err) } defer avroFile.Close() + codec, err := goavro.NewCodec(MANIFEST_SCHEMA) + if err != nil { + return 0, fmt.Errorf("failed to create Avro codec: %v", err) + } + ocfWriter, err := goavro.NewOCFWriter(goavro.OCFConfig{ W: avroFile, Codec: codec, Schema: MANIFEST_SCHEMA, }) if err != nil { - return ManifestFile{}, fmt.Errorf("failed to create Avro OCF writer: %v", err) + return 0, fmt.Errorf("failed to create Avro OCF writer: %v", err) } - err = ocfWriter.Append([]interface{}{manifestEntry}) + err = ocfWriter.Append(manifestEntries) if err != nil { - return ManifestFile{}, fmt.Errorf("failed to write to manifest file: %v", err) + return 0, fmt.Errorf("failed to write to manifest file: %v", err) } fileInfo, err := os.Stat(filePath) if err != nil { - return ManifestFile{}, fmt.Errorf("failed to get manifest file info: %v", err) + return 0, fmt.Errorf("failed to get manifest file info: %v", err) } fileSize := fileInfo.Size() - return ManifestFile{ - SnapshotId: snapshotId, - Size: fileSize, - RecordCount: parquetFile.RecordCount, - DataFileSize: parquetFile.Size, - }, nil + return fileSize, nil } -func (utils *StorageUtils) WriteManifestListFile(filePath string, manifestListItemsSortedDesc []ManifestListItem) (ManifestListFile, error) { - codec, err := goavro.NewCodec(MANIFEST_LIST_SCHEMA) - if err != nil { - return ManifestListFile{}, fmt.Errorf("failed to create Avro codec for manifest list: %v", err) - } - - var manifestListRecords []interface{} - +func (utils *StorageUtils) WriteManifestListFile(filePath string, totalDataFileSize int64, manifestListItemsSortedDesc []ManifestListItem) (ManifestListFile, error) { + snapshotId := time.Now().UnixNano() + manifestListEntries := make([]map[string]interface{}, len(manifestListItemsSortedDesc)) statsBySequenceNumber := make(map[string]ManifestListSequenceStats) - for _, manifestListItem := range manifestListItemsSortedDesc { + for i, manifestListItem := range manifestListItemsSortedDesc { sequenceNumber := manifestListItem.SequenceNumber sequenceStats := statsBySequenceNumber[common.IntToString(sequenceNumber)] manifestFile := manifestListItem.ManifestFile manifestListRecord := map[string]interface{}{ - "added_snapshot_id": manifestFile.SnapshotId, + "added_snapshot_id": snapshotId, "manifest_length": manifestFile.Size, "manifest_path": manifestFile.Path, - "min_sequence_number": sequenceNumber, + "min_sequence_number": 1, "sequence_number": sequenceNumber, "content": 0, "deleted_files_count": 0, "deleted_rows_count": 0, - "existing_files_count": 0, - "existing_rows_count": 0, + "existing_files_count": manifestFile.TotalDataFileCount, + "existing_rows_count": manifestFile.TotalRecordCount, "key_metadata": nil, "partition_spec_id": 0, "partitions": map[string]interface{}{"array": []string{}}, @@ -315,22 +314,24 @@ func (utils *StorageUtils) WriteManifestListFile(filePath string, manifestListIt manifestListRecord["added_files_count"] = 0 manifestListRecord["added_rows_count"] = 0 manifestListRecord["deleted_files_count"] = 1 - manifestListRecord["deleted_rows_count"] = manifestFile.RecordCount - sequenceStats.RemovedFilesSize += manifestFile.DataFileSize - sequenceStats.DeletedDataFiles += 1 - sequenceStats.DeletedRecords += manifestFile.RecordCount + manifestListRecord["deleted_rows_count"] = manifestFile.TotalRecordCount } else { - manifestListRecord["added_files_count"] = 1 - manifestListRecord["added_rows_count"] = manifestFile.RecordCount + manifestListRecord["added_files_count"] = 0 + manifestListRecord["added_rows_count"] = 0 manifestListRecord["deleted_files_count"] = 0 manifestListRecord["deleted_rows_count"] = 0 - sequenceStats.AddedFilesSize += manifestFile.DataFileSize - sequenceStats.AddedDataFiles += 1 - sequenceStats.AddedRecords += manifestFile.RecordCount + sequenceStats.TotalFilesSize += totalDataFileSize + sequenceStats.TotalDataFiles += int64(manifestFile.TotalDataFileCount) + sequenceStats.TotalRecords += manifestFile.TotalRecordCount } statsBySequenceNumber[common.IntToString(sequenceNumber)] = sequenceStats - manifestListRecords = append(manifestListRecords, manifestListRecord) + manifestListEntries[i] = manifestListRecord + } + + codec, err := goavro.NewCodec(MANIFEST_LIST_SCHEMA) + if err != nil { + return ManifestListFile{}, fmt.Errorf("failed to create Avro codec for manifest list: %v", err) } avroFile, err := os.Create(filePath) @@ -348,39 +349,29 @@ func (utils *StorageUtils) WriteManifestListFile(filePath string, manifestListIt return ManifestListFile{}, fmt.Errorf("failed to create OCF writer for manifest list: %v", err) } - err = ocfWriter.Append(manifestListRecords) + err = ocfWriter.Append(manifestListEntries) if err != nil { return ManifestListFile{}, fmt.Errorf("failed to write manifest list record: %v", err) } - sequenceNumbers := maps.Keys(statsBySequenceNumber) lastManifestListItem := manifestListItemsSortedDesc[0] lastSequenceStats := statsBySequenceNumber[common.IntToString(lastManifestListItem.SequenceNumber)] - operation := ICEBERG_MANIFEST_LIST_OPERATION_APPEND - if len(sequenceNumbers) == 1 && len(manifestListRecords) == 2 && lastSequenceStats.AddedDataFiles == 1 && lastSequenceStats.DeletedDataFiles == 1 { - operation = ICEBERG_MANIFEST_LIST_OPERATION_OVERWRITE - } else if lastSequenceStats.AddedDataFiles == 0 && lastSequenceStats.DeletedDataFiles > 0 { - operation = ICEBERG_MANIFEST_LIST_OPERATION_DELETE - } - manifestListFile := ManifestListFile{ - SequenceNumber: lastManifestListItem.SequenceNumber, - SnapshotId: lastManifestListItem.ManifestFile.SnapshotId, - TimestampMs: time.Now().UnixNano() / int64(time.Millisecond), - Operation: operation, - AddedFilesSize: lastSequenceStats.AddedFilesSize, - AddedDataFiles: lastSequenceStats.AddedDataFiles, - AddedRecords: lastSequenceStats.AddedRecords, - RemovedFilesSize: lastSequenceStats.RemovedFilesSize, - DeletedDataFiles: lastSequenceStats.DeletedDataFiles, - DeletedRecords: lastSequenceStats.DeletedRecords, + SequenceNumber: lastManifestListItem.SequenceNumber, + SnapshotId: snapshotId, + TimestampMs: time.Now().UnixNano() / int64(time.Millisecond), + Operation: ICEBERG_MANIFEST_LIST_OPERATION_REPLACE, + TotalFilesSize: lastSequenceStats.TotalFilesSize, + TotalDataFiles: lastSequenceStats.TotalDataFiles, + TotalRecords: lastSequenceStats.TotalRecords, } return manifestListFile, nil } func (utils *StorageUtils) WriteMetadataFile(s3TablePath string, filePath string, icebergSchemaColumns []*IcebergSchemaColumn, manifestListFilesSortedAsc []ManifestListFile) (err error) { tableUuid := uuid.New().String() + snapshotId := time.Now().UnixNano() lastColumnId := 0 for _, col := range icebergSchemaColumns { @@ -405,30 +396,29 @@ func (utils *StorageUtils) WriteMetadataFile(s3TablePath string, filePath string var totalDataFiles, totalFilesSize, totalRecords int64 for i, manifestListFile := range manifestListFilesSortedAsc { - totalDataFiles += manifestListFile.AddedDataFiles - manifestListFile.DeletedDataFiles - totalFilesSize += manifestListFile.AddedFilesSize - manifestListFile.RemovedFilesSize - totalRecords += manifestListFile.AddedRecords - manifestListFile.DeletedRecords + totalDataFiles += manifestListFile.TotalDataFiles + totalFilesSize += manifestListFile.TotalFilesSize + totalRecords += manifestListFile.TotalRecords snapshot := map[string]interface{}{ "schema-id": 0, - "snapshot-id": manifestListFile.SnapshotId, + "snapshot-id": snapshotId, "sequence-number": manifestListFile.SequenceNumber, "timestamp-ms": manifestListFile.TimestampMs, "manifest-list": manifestListFile.Path, "summary": map[string]interface{}{ - "operation": manifestListFile.Operation, - "added-data-files": Int64ToString(manifestListFile.AddedDataFiles), - "added-files-size": Int64ToString(manifestListFile.AddedFilesSize), - "added-records": Int64ToString(manifestListFile.AddedRecords), - "deleted-data-files": Int64ToString(manifestListFile.DeletedDataFiles), - "deleted-records": Int64ToString(manifestListFile.DeletedRecords), - "removed-files-size": Int64ToString(manifestListFile.RemovedFilesSize), - "total-data-files": Int64ToString(totalDataFiles), - "total-files-size": Int64ToString(totalFilesSize), - "total-records": Int64ToString(totalRecords), - "total-delete-files": "0", - "total-equality-deletes": "0", - "total-position-deletes": "0", + "changed-partition-count": "0", + "manifests-kept": "0", + "manifests-replaced": "0", + "manifests-created": "1", + "entries-processed": Int64ToString(totalDataFiles), + "operation": manifestListFile.Operation, + "total-data-files": Int64ToString(totalDataFiles), + "total-files-size": Int64ToString(totalFilesSize), + "total-records": Int64ToString(totalRecords), + "total-delete-files": "0", + "total-equality-deletes": "0", + "total-position-deletes": "0", }, } if i != 0 { @@ -437,7 +427,7 @@ func (utils *StorageUtils) WriteMetadataFile(s3TablePath string, filePath string snapshots[i] = snapshot snapshotLog[i] = map[string]interface{}{ - "snapshot-id": manifestListFile.SnapshotId, + "snapshot-id": snapshotId, "timestamp-ms": manifestListFile.TimestampMs, } } @@ -470,10 +460,10 @@ func (utils *StorageUtils) WriteMetadataFile(s3TablePath string, filePath string "default-sort-order-id": 0, "last-partition-id": 999, // Assuming no partitions; set to a placeholder "properties": map[string]string{}, - "current-snapshot-id": lastManifestListFile.SnapshotId, + "current-snapshot-id": snapshotId, "refs": map[string]interface{}{ "main": map[string]interface{}{ - "snapshot-id": lastManifestListFile.SnapshotId, + "snapshot-id": snapshotId, "type": "branch", }, }, @@ -514,18 +504,15 @@ func (utils *StorageUtils) ParseLastManifestListFile(bucketS3Prefix string, meta snapshot := manifestListsJson.Snapshots[len(manifestListsJson.Snapshots)-1] return ManifestListFile{ - SequenceNumber: snapshot.SequenceNumber, - SnapshotId: snapshot.SnapshotId, - TimestampMs: snapshot.TimestampMs, - Key: strings.TrimPrefix(snapshot.Path, bucketS3Prefix), - Path: snapshot.Path, - Operation: snapshot.Summary.Operation, - AddedFilesSize: StringToInt64(snapshot.Summary.AddedFilesSize), - AddedDataFiles: StringToInt64(snapshot.Summary.AddedDataFiles), - AddedRecords: StringToInt64(snapshot.Summary.AddedRecords), - RemovedFilesSize: StringToInt64(snapshot.Summary.RemovedFilesSize), - DeletedDataFiles: StringToInt64(snapshot.Summary.DeletedDataFiles), - DeletedRecords: StringToInt64(snapshot.Summary.DeletedRecords), + SequenceNumber: snapshot.SequenceNumber, + SnapshotId: snapshot.SnapshotId, + TimestampMs: snapshot.TimestampMs, + Key: strings.TrimPrefix(snapshot.Path, bucketS3Prefix), + Path: snapshot.Path, + Operation: snapshot.Summary.Operation, + TotalFilesSize: StringToInt64(snapshot.Summary.TotalFilesSize), + TotalDataFiles: StringToInt64(snapshot.Summary.TotalDataFiles), + TotalRecords: StringToInt64(snapshot.Summary.TotalRecords), } } @@ -543,11 +530,12 @@ func (utils *StorageUtils) ParseManifestListItems(bucketS3Prefix string, manifes manifestListItemsSortedDesc = append(manifestListItemsSortedDesc, ManifestListItem{ ManifestFile: ManifestFile{ - SnapshotId: recordMap["added_snapshot_id"].(int64), - Key: strings.TrimPrefix(recordMap["manifest_path"].(string), bucketS3Prefix), - Path: recordMap["manifest_path"].(string), - Size: recordMap["manifest_length"].(int64), - RecordCount: recordMap["added_rows_count"].(int64), + Key: strings.TrimPrefix(recordMap["manifest_path"].(string), bucketS3Prefix), + Path: recordMap["manifest_path"].(string), + Size: recordMap["manifest_length"].(int64), + TotalRecordCount: recordMap["added_rows_count"].(int64), + TotalDataFileCount: recordMap["existing_files_count"].(int32), + RecordsDeleted: false, }, SequenceNumber: int(recordMap["sequence_number"].(int64)), }) @@ -556,18 +544,27 @@ func (utils *StorageUtils) ParseManifestListItems(bucketS3Prefix string, manifes return manifestListItemsSortedDesc } -func (utils *StorageUtils) ParseParquetFileS3Path(manifestContent []byte) string { +func (utils *StorageUtils) ParseParquetFiles(manifestContent []byte) []ParquetFile { ocfReader, err := goavro.NewOCFReader(strings.NewReader(string(manifestContent))) common.PanicIfError(utils.Config, err) - ocfReader.Scan() - record, err := ocfReader.Read() - common.PanicIfError(utils.Config, err) + parquetFilesSortedAsc := []ParquetFile{} + + for ocfReader.Scan() { + record, err := ocfReader.Read() + common.PanicIfError(utils.Config, err) - recordMap := record.(map[string]interface{}) - dataFile := recordMap["data_file"].(map[string]interface{}) + recordMap := record.(map[string]interface{}) + dataFile := recordMap["data_file"].(map[string]interface{}) + + parquetFilesSortedAsc = append(parquetFilesSortedAsc, ParquetFile{ + Path: dataFile["file_path"].(string), + Size: dataFile["file_size_in_bytes"].(int64), + RecordCount: dataFile["record_count"].(int64), + }) + } - return dataFile["file_path"].(string) + return parquetFilesSortedAsc } // --------------------------------------------------------------------------------------------------------------------- diff --git a/src/syncer-postgres/init_test.go b/src/syncer-postgres/init_test.go index 8faac51..fa9529a 100644 --- a/src/syncer-postgres/init_test.go +++ b/src/syncer-postgres/init_test.go @@ -481,6 +481,114 @@ var JSON_ROWS_TEST_TABLE = []string{ }`, `{ "before":null, + "after":{ + "id":2, + "bit_column":null, + "bool_column":false, + "bpchar_column":"TEST", + "varchar_column":null, + "text_column":"", + "int2_column":-32767, + "int4_column":null, + "int8_column":-9223372036854775807, + "hugeint_column":null, + "xid_column":null, + "xid8_column":null, + "float4_column":"NaN", + "float8_column":-3.141592653589793, + "numeric_column":-12345.0, + "numeric_column_without_precision":null, + "date_column":6594769, + "time_column":43200123000, + "timemscolumn":null, + "timetz_column":"07:00:00.123Z", + "timetz_ms_column":"07:00:00.1Z", + "timestamp_column":1704110400000000, + "timestamp_ms_column":null, + "timestamptz_column":"2024-01-01T06:30:00.000123Z", + "timestamptz_ms_column":"2024-01-01T07:00:00.120Z", + "uuid_column":null, + "bytea_column":null, + "interval_column":null, + "point_column":null, + "inet_column":null, + "json_column":null, + "jsonb_column":"{}", + "tsvector_column":null, + "xml_column":null, + "pg_snapshot_column":null, + "array_text_column":null, + "array_int_column":[], + "array_jsonb_column":null, + "array_ltree_column":null, + "user_defined_column":null + }, + "source":{ + "version":"3.1.3.Final", + "connector":"postgresql", + "name":"prefix", + "ts_ms":1750942485790, + "snapshot":"last", + "db":"tpch", + "sequence":"[null,\"98162912\"]", + "ts_us":1750942485790370, + "ts_ns":1750942485790370000, + "schema":"public", + "table":"test_table", + "txId":2352, + "lsn":98162912, + "xmin":null + }, + "transaction":null, + "op":"c", + "ts_ms":1750942485898, + "ts_us":1750942485898829, + "ts_ns":1750942485898829000 + }`, + `{ + "before":{ + "id":2, + "bit_column":null, + "bool_column":false, + "bpchar_column":"TEST", + "varchar_column":null, + "text_column":"", + "int2_column":-32767, + "int4_column":null, + "int8_column":-9223372036854775807, + "hugeint_column":null, + "xid_column":null, + "xid8_column":null, + "float4_column":"NaN", + "float8_column":-3.141592653589793, + "numeric_column":-12345.0, + "numeric_column_without_precision":null, + "date_column":6594769, + "time_column":43200123000, + "timemscolumn":null, + "timetz_column":"07:00:00.123Z", + "timetz_ms_column":"07:00:00.1Z", + "timestamp_column":1704110400000000, + "timestamp_ms_column":null, + "timestamptz_column":"2024-01-01T06:30:00.000123Z", + "timestamptz_ms_column":"2024-01-01T07:00:00.120Z", + "uuid_column":null, + "bytea_column":null, + "interval_column":null, + "point_column":null, + "inet_column":null, + "json_column":null, + "jsonb_column":"{}", + "tsvector_column":null, + "xml_column":null, + "pg_snapshot_column":null, + "array_text_column":null, + "array_int_column":[], + "array_jsonb_column":null, + "array_ltree_column":null, + "user_defined_column":null + + }, "after":{ "id":2, "bit_column":null, @@ -542,7 +650,7 @@ var JSON_ROWS_TEST_TABLE = []string{ "xmin":null }, "transaction":null, - "op":"c", + "op":"u", "ts_ms":1750942485898, "ts_us":1750942485898829, "ts_ns":1750942485898829000 From a268cb3e6b21cf06a396f8d18d8685a3dd8781d5 Mon Sep 17 00:00:00 2001 From: exAspArk Date: Fri, 22 Aug 2025 11:47:48 -0400 Subject: [PATCH 10/24] Add support for materialized views --- Dockerfile | 2 - Dockerfile.test | 2 - Makefile | 2 - README.md | 1 + docker/bin-test/test.sh | 2 +- scripts/catalog.sql | 8 + .../capped_buffer.go | 18 +- .../capped_buffer_test.go | 10 +- src/common/common_config.go | 2 +- src/common/duckdb_client.go | 22 +- src/common/duckdb_schema_column.go | 62 + src/common/go.mod | 9 +- src/common/go.sum | 1029 +++++++++++++++ src/common/iceberg_catalog.go | 294 +++++ .../iceberg_schema_column.go | 29 +- src/common/iceberg_table.go | 91 ++ .../iceberg_table_writer.go} | 259 ++-- src/{syncer-common => common}/json_queue.go | 2 +- .../json_queue_test.go | 6 +- src/common/set.go | 5 + src/{syncer-common => common}/storage_s3.go | 101 +- .../storage_utils.go | 35 +- src/common/utils.go | 122 ++ src/server/custom_types.go | 32 +- src/server/go.mod | 6 + src/server/go.sum | 1025 +++++++++++++++ src/server/iceberg_catalog.go | 94 -- src/server/iceberg_reader.go | 36 +- src/server/iceberg_writer.go | 75 ++ src/server/main.go | 9 +- src/server/parser_a_expr.go | 32 +- src/server/pg_constants.go | 1 + src/server/query_handler.go | 43 +- src/server/query_handler_test.go | 30 +- src/server/query_remapper.go | 150 ++- src/server/query_remapper_select.go | 24 +- src/server/query_remapper_table.go | 208 ++- src/server/storage_s3.go | 87 -- src/syncer-amplitude/amplitude.go | 3 +- src/syncer-amplitude/event.go | 115 +- src/syncer-amplitude/go.mod | 7 +- src/syncer-amplitude/syncer.go | 24 +- src/syncer-common/go.mod | 67 - src/syncer-common/go.sum | 1160 ----------------- src/syncer-common/iceberg_catalog.go | 126 -- src/syncer-common/iceberg_table.go | 95 -- src/syncer-common/utils.go | 135 -- src/syncer-postgres/config.go | 3 +- src/syncer-postgres/go.mod | 3 - src/syncer-postgres/init_test.go | 49 +- src/syncer-postgres/pg_schema_column.go | 44 +- src/syncer-postgres/syncer.go | 11 +- src/syncer-postgres/syncer_full_refresh.go | 41 +- src/syncer-postgres/syncer_utils.go | 14 +- 54 files changed, 3623 insertions(+), 2239 deletions(-) rename src/{syncer-common => common}/capped_buffer.go (75%) rename src/{syncer-common => common}/capped_buffer_test.go (97%) create mode 100644 src/common/duckdb_schema_column.go create mode 100644 src/common/iceberg_catalog.go rename src/{syncer-common => common}/iceberg_schema_column.go (93%) create mode 100644 src/common/iceberg_table.go rename src/{syncer-common/iceberg_writer.go => common/iceberg_table_writer.go} (65%) rename src/{syncer-common => common}/json_queue.go (98%) rename src/{syncer-common => common}/json_queue_test.go (89%) rename src/{syncer-common => common}/storage_s3.go (74%) rename src/{syncer-common => common}/storage_utils.go (96%) delete mode 100644 src/server/iceberg_catalog.go create mode 100644 src/server/iceberg_writer.go delete mode 100644 src/server/storage_s3.go delete mode 100644 src/syncer-common/go.mod delete mode 100644 src/syncer-common/go.sum delete mode 100644 src/syncer-common/iceberg_catalog.go delete mode 100644 src/syncer-common/iceberg_table.go delete mode 100644 src/syncer-common/utils.go diff --git a/Dockerfile b/Dockerfile index 3e857c7..0bf825f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -36,7 +36,6 @@ RUN \ # Compile syncers and server COPY --chown=app:app src/common/go.mod src/common/go.sum /app/src/common/ -COPY --chown=app:app src/syncer-common/go.mod src/syncer-common/go.sum /app/src/syncer-common/ COPY --chown=app:app src/syncer-postgres/go.mod src/syncer-postgres/go.sum /app/src/syncer-postgres/ RUN cd /app/src/syncer-postgres && go mod download @@ -48,7 +47,6 @@ COPY --chown=app:app src/server/go.mod src/server/go.sum /app/src/server/ RUN cd /app/src/server && go mod download COPY --chown=app:app src/common /app/src/common -COPY --chown=app:app src/syncer-common /app/src/syncer-common COPY --chown=app:app src/syncer-postgres /app/src/syncer-postgres COPY --chown=app:app src/syncer-amplitude /app/src/syncer-amplitude COPY --chown=app:app src/server /app/src/server diff --git a/Dockerfile.test b/Dockerfile.test index f59c823..4879f11 100644 --- a/Dockerfile.test +++ b/Dockerfile.test @@ -56,7 +56,6 @@ RUN \ # Prepare syncers and server COPY --chown=app:app src/common/go.mod src/common/go.sum /app/src/common/ -COPY --chown=app:app src/syncer-common/go.mod src/syncer-common/go.sum /app/src/syncer-common/ COPY --chown=app:app src/syncer-postgres/go.mod src/syncer-postgres/go.sum /app/src/syncer-postgres/ RUN cd /app/src/syncer-postgres && go mod download @@ -65,7 +64,6 @@ COPY --chown=app:app src/server/go.mod src/server/go.sum /app/src/server/ RUN cd /app/src/server && go mod download COPY --chown=app:app src/common /app/src/common -COPY --chown=app:app src/syncer-common /app/src/syncer-common COPY --chown=app:app src/syncer-postgres /app/src/syncer-postgres COPY --chown=app:app src/server /app/src/server diff --git a/Makefile b/Makefile index 3dd8993..78a7ba6 100644 --- a/Makefile +++ b/Makefile @@ -3,14 +3,12 @@ sh: install: devbox run "cd src/common && go mod tidy && \ - cd ../syncer-common && go mod tidy && \ cd ../syncer-postgres && go mod tidy && \ cd ../syncer-amplitude && go mod tidy && \ cd ../server && go mod tidy" lint: devbox run "cd src/common && go fmt && staticcheck . && \ - cd ../syncer-common && go fmt && staticcheck . && \ cd ../syncer-postgres && go fmt && deadcode . && staticcheck . && \ cd ../syncer-amplitude && go fmt && deadcode . && staticcheck . && \ cd ../server && go fmt && deadcode . && staticcheck ." diff --git a/README.md b/README.md index 9a288ec..7f03eed 100644 --- a/README.md +++ b/README.md @@ -323,6 +323,7 @@ SELECT * FROM [TABLE] WHERE [JSON_COLUMN]->>'[JSON_KEY]' = '[JSON_VALUE]'; - [x] Iceberg tables compaction - [x] Packaging in a Docker image - [x] Table compaction without Trino as a dependency +- [x] Materialized views - [ ] Partitioned tables ([#15](https://github.com/BemiHQ/BemiDB/issues/15)) - [ ] Transformations with dbt ([#25](https://github.com/BemiHQ/BemiDB/issues/25)) diff --git a/docker/bin-test/test.sh b/docker/bin-test/test.sh index 935e6e7..fbf8d02 100755 --- a/docker/bin-test/test.sh +++ b/docker/bin-test/test.sh @@ -28,7 +28,7 @@ SOURCE_POSTGRES_SYNC_MODE=FULL_REFRESH \ go test -v ./... # Run tests -cd /app/src/syncer-common +cd /app/src/common go test -v -count=1 ./... cd /app/src/server BEMIDB_USER=user \ diff --git a/scripts/catalog.sql b/scripts/catalog.sql index ca8c6c9..2c4219f 100644 --- a/scripts/catalog.sql +++ b/scripts/catalog.sql @@ -6,3 +6,11 @@ CREATE TABLE IF NOT EXISTS iceberg_tables ( previous_metadata_location VARCHAR(1000), PRIMARY KEY (catalog_name, table_namespace, table_name) ); + +CREATE TABLE IF NOT EXISTS iceberg_materialized_views ( + schema_name VARCHAR(255) NOT NULL, + table_name VARCHAR(255) NOT NULL, + definition TEXT NOT NULL +); + +CREATE UNIQUE INDEX IF NOT EXISTS idx_materialized_views ON iceberg_materialized_views (schema_name, table_name); diff --git a/src/syncer-common/capped_buffer.go b/src/common/capped_buffer.go similarity index 75% rename from src/syncer-common/capped_buffer.go rename to src/common/capped_buffer.go index e4603cd..54d9b46 100644 --- a/src/syncer-common/capped_buffer.go +++ b/src/common/capped_buffer.go @@ -1,15 +1,13 @@ -package syncerCommon +package common import ( "errors" "io" "sync" - - "github.com/BemiHQ/BemiDB/src/common" ) type CappedBuffer struct { - Config *common.CommonConfig + Config *CommonConfig MaxSizeBytes int buffer []byte @@ -20,7 +18,7 @@ type CappedBuffer struct { closed bool } -func NewCappedBuffer(config *common.CommonConfig, maxSizeBytes int) *CappedBuffer { +func NewCappedBuffer(config *CommonConfig, maxSizeBytes int) *CappedBuffer { sizedBuffer := &CappedBuffer{ Config: config, buffer: make([]byte, 0, maxSizeBytes), @@ -44,7 +42,7 @@ func (buf *CappedBuffer) Write(payload []byte) (writtenBytes int, err error) { } for len(buf.buffer)+len(payload) > buf.MaxSizeBytes && !buf.closed { - common.LogTrace(buf.Config, ">> Waiting for more space in capped buffer...") + LogTrace(buf.Config, ">> Waiting for more space in capped buffer...") buf.conditionalSync.Wait() // Wait for the reader } @@ -55,7 +53,7 @@ func (buf *CappedBuffer) Write(payload []byte) (writtenBytes int, err error) { writtenBytes = len(payload) buf.buffer = append(buf.buffer, payload...) - common.LogTrace(buf.Config, ">> Writing", writtenBytes, "bytes to capped buffer...") + LogTrace(buf.Config, ">> Writing", writtenBytes, "bytes to capped buffer...") buf.conditionalSync.Broadcast() // Notify the reader that new data is available @@ -72,7 +70,7 @@ func (buf *CappedBuffer) Read(payload []byte) (readBytes int, err error) { defer buf.mutex.Unlock() for len(buf.buffer) == 0 && !buf.closed { - common.LogTrace(buf.Config, "<< Waiting for more data in capped buffer...") + LogTrace(buf.Config, "<< Waiting for more data in capped buffer...") buf.conditionalSync.Wait() // Wait for the writer } @@ -83,7 +81,7 @@ func (buf *CappedBuffer) Read(payload []byte) (readBytes int, err error) { maxReadBytes := len(payload) readBytes = copy(payload, buf.buffer) buf.buffer = buf.buffer[readBytes:] - common.LogTrace(buf.Config, "<< Reading "+common.IntToString(readBytes)+"/"+common.IntToString(maxReadBytes)+" bytes from capped buffer...") + LogTrace(buf.Config, "<< Reading "+IntToString(readBytes)+"/"+IntToString(maxReadBytes)+" bytes from capped buffer...") buf.conditionalSync.Broadcast() // Notify the writer that space is now available @@ -94,7 +92,7 @@ func (buf *CappedBuffer) Close() error { buf.closeOnceSync.Do(func() { buf.mutex.Lock() - common.LogTrace(buf.Config, "== Closing capped buffer...") + LogTrace(buf.Config, "== Closing capped buffer...") buf.closed = true buf.conditionalSync.Broadcast() // Wake up any waiting writers/readers diff --git a/src/syncer-common/capped_buffer_test.go b/src/common/capped_buffer_test.go similarity index 97% rename from src/syncer-common/capped_buffer_test.go rename to src/common/capped_buffer_test.go index f43500c..0e9dda2 100644 --- a/src/syncer-common/capped_buffer_test.go +++ b/src/common/capped_buffer_test.go @@ -1,4 +1,4 @@ -package syncerCommon +package common import ( "bytes" @@ -6,13 +6,11 @@ import ( "sync" "testing" "time" - - "github.com/BemiHQ/BemiDB/src/common" ) -func initTestConfig() *common.CommonConfig { - return &common.CommonConfig{ - LogLevel: common.LOG_LEVEL_INFO, // Use INFO to avoid excessive logging during tests +func initTestConfig() *CommonConfig { + return &CommonConfig{ + LogLevel: LOG_LEVEL_INFO, // Use INFO to avoid excessive logging during tests } } diff --git a/src/common/common_config.go b/src/common/common_config.go index 26de930..db490b7 100644 --- a/src/common/common_config.go +++ b/src/common/common_config.go @@ -1,7 +1,7 @@ package common const ( - VERSION = "1.0.1" + VERSION = "1.1.0" ENV_LOG_LEVEL = "BEMIDB_LOG_LEVEL" ENV_DISABLE_ANONYMOUS_ANALYTICS = "BEMIDB_DISABLE_ANONYMOUS_ANALYTICS" diff --git a/src/common/duckdb_client.go b/src/common/duckdb_client.go index 78b1dbf..a958e65 100644 --- a/src/common/duckdb_client.go +++ b/src/common/duckdb_client.go @@ -8,6 +8,11 @@ import ( "github.com/marcboeker/go-duckdb/v2" ) +var SYNCER_DUCKDB_BOOT_QUERIES = []string{ + "SET memory_limit='2GB'", + "SET threads=2", +} + type DuckdbClient struct { Config *CommonConfig Db *sql.DB @@ -88,16 +93,21 @@ func (client *DuckdbClient) ExecContext(ctx context.Context, query string, args return client.Db.ExecContext(ctx, replaceNamedStringArgs(query, args[0])) } -func (client *DuckdbClient) ExecTransactionContext(ctx context.Context, queries []string) error { +func (client *DuckdbClient) ExecTransactionContext(ctx context.Context, queries []string, args ...[]map[string]string) error { tx, err := client.Db.Begin() LogDebug(client.Config, "Querying DuckDBClient: BEGIN") if err != nil { return err } - for _, query := range queries { + for i, query := range queries { LogDebug(client.Config, "Querying DuckDBClient:", query) - _, err := tx.ExecContext(ctx, query) + var err error + if len(args) == 0 { + _, err = tx.ExecContext(ctx, query) + } else { + _, err = tx.ExecContext(ctx, replaceNamedStringArgs(query, args[0][i])) + } if err != nil { tx.Rollback() return err @@ -135,7 +145,11 @@ func (client *DuckdbClient) setExplicitAwsCredentials(ctx context.Context) { func replaceNamedStringArgs(query string, args map[string]string) string { for key, value := range args { - query = strings.ReplaceAll(query, "$"+key, value) + query = strings.ReplaceAll( + query, + "$"+key, + strings.ReplaceAll(value, "'", "''"), + ) } return query } diff --git a/src/common/duckdb_schema_column.go b/src/common/duckdb_schema_column.go new file mode 100644 index 0000000..9e62be4 --- /dev/null +++ b/src/common/duckdb_schema_column.go @@ -0,0 +1,62 @@ +package common + +import "strings" + +const ( + DUCKDB_YES = "YES" +) + +type DuckdbSchemaColumn struct { + ColumnName string + DataType string + IsNullable string + OrdinalPosition string + NumericPrecision string + NumericScale string + DatetimePrecision string + Config *CommonConfig +} + +func (column *DuckdbSchemaColumn) ToIcebergSchemaColumn() *IcebergSchemaColumn { + icebergSchemaColumn := &IcebergSchemaColumn{ + Config: column.Config, + ColumnName: column.ColumnName, + Position: StringToInt(column.OrdinalPosition), + NumericPrecision: StringToInt(column.NumericPrecision), + NumericScale: StringToInt(column.NumericScale), + IsRequired: column.IsNullable != DUCKDB_YES, + DatetimePrecision: StringToInt(column.DatetimePrecision), + IsList: strings.HasSuffix(column.DataType, "[]"), + } + + switch strings.TrimSuffix(column.DataType, "[]") { + case "BOOLEAN": + icebergSchemaColumn.ColumnType = IcebergColumnTypeBoolean + case "INTEGER": + icebergSchemaColumn.ColumnType = IcebergColumnTypeInteger + case "BIGINT": + icebergSchemaColumn.ColumnType = IcebergColumnTypeLong + case "FLOAT": + icebergSchemaColumn.ColumnType = IcebergColumnTypeFloat + case "DOUBLE": + icebergSchemaColumn.ColumnType = IcebergColumnTypeDouble + case "DATE": + icebergSchemaColumn.ColumnType = IcebergColumnTypeDate + case "TIME": + icebergSchemaColumn.ColumnType = IcebergColumnTypeTime + case "TIMESTAMP": + icebergSchemaColumn.ColumnType = IcebergColumnTypeTimestamp + case "BLOB": + icebergSchemaColumn.ColumnType = IcebergColumnTypeBinary + case "VARCHAR", "JSON": + icebergSchemaColumn.ColumnType = IcebergColumnTypeString + default: + if strings.HasPrefix(column.DataType, "DECIMAL(") { + icebergSchemaColumn.ColumnType = IcebergColumnTypeDecimal + } else { + panic("Unsupported DuckDB type: " + column.DataType) + } + } + + return icebergSchemaColumn +} diff --git a/src/common/go.mod b/src/common/go.mod index 2edde00..1290641 100644 --- a/src/common/go.mod +++ b/src/common/go.mod @@ -8,12 +8,18 @@ require ( github.com/aws/aws-sdk-go-v2/credentials v1.18.1 github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1 github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0 + github.com/google/uuid v1.6.0 github.com/jackc/pgx/v5 v5.7.5 + github.com/linkedin/goavro v2.1.0+incompatible github.com/marcboeker/go-duckdb/v2 v2.3.2 + github.com/xitongsys/parquet-go v1.6.2 + github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b ) require ( github.com/apache/arrow-go/v18 v18.4.0 // indirect + github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 // indirect + github.com/apache/thrift v0.22.0 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0 // indirect @@ -36,8 +42,8 @@ require ( github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11 // indirect github.com/go-viper/mapstructure/v2 v2.3.0 // indirect github.com/goccy/go-json v0.10.5 // indirect + github.com/golang/snappy v1.0.0 // indirect github.com/google/flatbuffers v25.2.10+incompatible // indirect - github.com/google/uuid v1.6.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect github.com/klauspost/compress v1.18.0 // indirect @@ -54,4 +60,5 @@ require ( golang.org/x/text v0.26.0 // indirect golang.org/x/tools v0.34.0 // indirect golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect + gopkg.in/linkedin/goavro.v1 v1.0.5 // indirect ) diff --git a/src/common/go.sum b/src/common/go.sum index 79c6056..74c3ead 100644 --- a/src/common/go.sum +++ b/src/common/go.sum @@ -1,50 +1,248 @@ +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.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.66.0/go.mod h1:dgqGAjKCDxyhGTtC9dAREQGUJpkceNm1yt590Qno0Ko= +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.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.82.0/go.mod h1:vlKccHJGuFBFufnAnuB08dfEH9Y3H7dzDzRECFdC2TA= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= +cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +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 v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= +cloud.google.com/go/compute v1.2.0/go.mod h1:xlogom/6gr8RJGBe7nT2eGsQYAFUbbv8dbC29qE3Xmw= +cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= +cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= +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/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= +cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= +cloud.google.com/go/iam v0.1.1/go.mod h1:CKqrcnI/suGpybEHxZ7BMehL0oA4LpdyJdUlTl9jVMw= +cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= +cloud.google.com/go/kms v1.1.0/go.mod h1:WdbppnCDMDpOvoYBMn1+gNmOeEoZYqAv+HeuKARGCXI= +cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= +cloud.google.com/go/monitoring v1.1.0/go.mod h1:L81pzz7HKn14QCMaCs6NTQkdBnE87TElyanS95vIcl4= +cloud.google.com/go/monitoring v1.4.0/go.mod h1:y6xnxfwI3hTFWOdkOaD7nfJVlwuC3/mS/5kvtT131p4= +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/pubsub v1.19.0/go.mod h1:/O9kmSe9bb9KRnIAWkzmqhPjHo6LtzGOBYd/kr06XSs= +cloud.google.com/go/secretmanager v1.3.0/go.mod h1:+oLTkouyiYiabAQNugCeTS3PAArGiMJuBqvJnJsyH+U= +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.12.0/go.mod h1:fFLk2dp2oAhDz8QFKwqrjdJvxSp/W2g7nillojlL5Ho= +cloud.google.com/go/storage v1.21.0/go.mod h1:XmRlxkgPjlBONznT2dDUU/5XlpU2OjMnKuqnZI01LAA= +cloud.google.com/go/trace v1.0.0/go.mod h1:4iErSByzxkyHWzzlAj63/Gmjz0NH1ASqhJguHpGcr6A= +cloud.google.com/go/trace v1.2.0/go.mod h1:Wc8y/uYyOhPy12KEnXG9XGrvfMz5F5SrYecQlbW1rwM= +contrib.go.opencensus.io/exporter/aws v0.0.0-20200617204711-c478e41e60e9/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= +contrib.go.opencensus.io/exporter/stackdriver v0.13.10/go.mod h1:I5htMbyta491eUxufwwZPQdcKvvgzMB4O9ni41YnIM8= +contrib.go.opencensus.io/integrations/ocsql v0.1.7/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/Azure/azure-amqp-common-go/v3 v3.2.1/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= +github.com/Azure/azure-amqp-common-go/v3 v3.2.2/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= +github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k= +github.com/Azure/azure-sdk-for-go v51.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v59.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.0.0/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.0.0/go.mod h1:+6sju8gk8FRmSajX3Oz4G5Gm7P+mbqE9FVaXXFYTkCM= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U= +github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.0.0/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.0.0/go.mod h1:ceIuwmxDWptoW3eCqSXlnPsZFKh4X+R38dWPv7GS9Vs= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.0.0/go.mod h1:s1tW/At+xHqjNFvWU4G0c0Qv33KOhvbGNj0RCTQDV8s= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.2.0/go.mod h1:c+Lifp3EDEamAkPVzMooRNOK6CZjNSdEnf1A7jsI9u4= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.1.0/go.mod h1:7QJP7dr2wznCMeqIrhMgWGf7XpAQnVrJqDm9nvV3Cu4= +github.com/Azure/azure-service-bus-go v0.11.5/go.mod h1:MI6ge2CuQWBVq+ly456MY7XqNLJip5LO1iSFodbNLbU= +github.com/Azure/azure-storage-blob-go v0.14.0/go.mod h1:SMqIBi+SuiQH32bvyjngEewEeXoPfKMgWlBDaYf6fck= +github.com/Azure/go-amqp v0.16.0/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= +github.com/Azure/go-amqp v0.16.4/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= +github.com/Azure/go-autorest/autorest v0.11.19/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= +github.com/Azure/go-autorest/autorest v0.11.22/go.mod h1:BAWYUWGPEtKPzjVkp0Q6an0MJcJDsoh5Z1BFAEFs4Xs= +github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= +github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/adal v0.9.14/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/adal v0.9.17/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= +github.com/Azure/go-autorest/autorest/azure/auth v0.5.9/go.mod h1:hg3/1yw0Bq87O3KvvnJoAh34/0zbP7SFizX/qN5JvjU= +github.com/Azure/go-autorest/autorest/azure/cli v0.4.2/go.mod h1:7qkJkT+j6b+hIpzMOwPChJhTqS8VbsqqgULzMNRugoM= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= +github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= +github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= +github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= +github.com/AzureAD/microsoft-authentication-library-for-go v0.4.0/go.mod h1:Vt9sXTKwMyGcOxSmLDMnGPgqsUg7m8pe215qMLrDXw4= +github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/GoogleCloudPlatform/cloudsql-proxy v1.29.0/go.mod h1:spvB9eLJH9dutlbPSRmHvSXXHOwGRyeXh1jVdquA2G8= +github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/apache/arrow-go/v18 v18.4.0 h1:/RvkGqH517iY8bZKc4FD5/kkdwXJGjxf28JIXbJ/oB0= github.com/apache/arrow-go/v18 v18.4.0/go.mod h1:Aawvwhj8x2jURIzD9Moy72cF0FyJXOpkYpdmGRHcw14= +github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 h1:byKBBF2CKWBjjA4J1ZL2JXttJULvWSl50LegTyRZ728= +github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516/go.mod h1:QNYViu/X0HXDHw7m3KXzWSVXIbfUvJqBFe6Gj8/pYA0= +github.com/apache/thrift v0.0.0-20181112125854-24918abba929/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.14.2/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.22.0 h1:r7mTJdj51TMDe6RtcmNdQxgn9XcyfGDOzegMDRg47uc= github.com/apache/thrift v0.22.0/go.mod h1:1e7J/O1Ae6ZQMTYdy9xa3w9k+XHWPfRvdPyJeynQ+/g= +github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= +github.com/aws/aws-sdk-go v1.30.19/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= +github.com/aws/aws-sdk-go v1.37.0/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= +github.com/aws/aws-sdk-go v1.43.31 h1:yJZIr8nMV1hXjAvvOLUFqZRJcHV7udPQBfhJqawDzI0= +github.com/aws/aws-sdk-go v1.43.31/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= +github.com/aws/aws-sdk-go-v2 v1.16.2/go.mod h1:ytwTPBG6fXTZLxxeeCCWj2/EMYp/xDUgX+OET6TLNNU= +github.com/aws/aws-sdk-go-v2 v1.23.0/go.mod h1:i1XDttT4rnf6vxc9AuskLc6s7XBee8rlLilKlc03uAA= github.com/aws/aws-sdk-go-v2 v1.37.0 h1:YtCOESR/pN4j5oA7cVHSfOwIcuh/KwHC4DOSXFbv5F0= github.com/aws/aws-sdk-go-v2 v1.37.0/go.mod h1:9Q0OoGQoboYIAJyslFyF1f5K1Ryddop8gqMhWx/n4Wg= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.1/go.mod h1:n8Bs1ElDD2wJ9kCRTczA83gYbBmjSwZp3umc6zF4EeM= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.1/go.mod h1:t8PYl/6LzdAqsU4/9tz28V/kU+asFePvpOMkdul0gEQ= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 h1:6GMWV6CNpA/6fbFHnoAjrv4+LGfyTqZz2LtCHnspgDg= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0/go.mod h1:/mXlTIVG9jbxkqDnr5UQNQxW1HRYxeGklkM9vAFeabg= +github.com/aws/aws-sdk-go-v2/config v1.15.3/go.mod h1:9YL3v07Xc/ohTsxFXzan9ZpFpdTOFl4X65BAKYaz8jg= +github.com/aws/aws-sdk-go-v2/config v1.25.3/go.mod h1:tAByZy03nH5jcq0vZmkcVoo6tRzRHEwSFx3QW4NmDw8= github.com/aws/aws-sdk-go-v2/config v1.30.1 h1:sHL8g/+9tcZATeV2tEkEfxZeaNokDtKsSjGMGHD49qA= github.com/aws/aws-sdk-go-v2/config v1.30.1/go.mod h1:wkibEyFfxXRyTSzRU4bbF5IUsSXyE4xQ4ZjkGmi5tFo= +github.com/aws/aws-sdk-go-v2/credentials v1.11.2/go.mod h1:j8YsY9TXTm31k4eFhspiQicfXPLZ0gYXA50i4gxPE8g= +github.com/aws/aws-sdk-go-v2/credentials v1.16.2/go.mod h1:sDdvGhXrSVT5yzBDR7qXz+rhbpiMpUYfF3vJ01QSdrc= github.com/aws/aws-sdk-go-v2/credentials v1.18.1 h1:E55xvOqlX7CvB66Z7rSM9usCrFU1ryUIUHqiXsEzVoE= github.com/aws/aws-sdk-go-v2/credentials v1.18.1/go.mod h1:iobSQfR5MkvILxssGOvi/P1jjOhrRzfTiCPCzku0vx4= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.3/go.mod h1:uk1vhHHERfSVCUnqSqz8O48LBYDSC+k6brng09jcMOk= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.4/go.mod h1:t4i+yGHMCcUNIX1x7YVYa6bH/Do7civ5I6cG/6PMfyA= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0 h1:9sBTeKQwAvmJUWKIACIoiFSnxxl+sS++YDfr17/ngq0= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0/go.mod h1:LW9/PxQD1SYFC7pnWcgqPhoyZprhjEdg5hBK6qYPLW8= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.3/go.mod h1:0dHuD2HZZSiwfJSy1FO5bX1hQ1TxVV1QXXjpn3XUE44= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.14.0/go.mod h1:UcgIwJ9KHquYxs6Q5skC9qXjhYMK+JASDYcXQ4X7JZE= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1 h1:aAjA/1JZ1xH/F9XvxJu9cXZyp7BqVXtHpztyZ6p799E= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1/go.mod h1:ia9HASsPba/7o84sp6iE4wZPdNTJ0oicBe5sWQQk+Ys= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.9/go.mod h1:AnVH5pvai0pAF4lXRq0bmhbes1u9R8wTE+g+183bZNM= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.3/go.mod h1:7sGSz1JCKHWWBHq98m6sMtWQikmYPpxjqOydDemiVoM= github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0 h1:H2iZoqW/v2Jnrh1FnU725Bq6KJ0k2uP63yH+DcY+HUI= github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0/go.mod h1:L0FqLbwMXHvNC/7crWV1iIxUlOKYZUE8KuTIA+TozAI= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.3/go.mod h1:ssOhaLpRlh88H3UmEcsBoVKq309quMvm3Ds8e9d4eJM= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.3/go.mod h1:ify42Rb7nKeDDPkFjKn7q1bPscVPu/+gmHH8d2c+anU= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0 h1:EDped/rNzAhFPhVY0sDGbtD16OKqksfA8OjF/kLEgw8= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0/go.mod h1:uUI335jvzpZRPpjYx6ODc/wg1qH+NnoSTK/FwVeK0C0= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.10/go.mod h1:8DcYQcz0+ZJaSxANlHIsbbi6S+zMwjwdDqwW3r9AzaE= +github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.3/go.mod h1:5yzAuE9i2RkVAttBl8yxZgQr5OCq4D5yDnG7j9x2L0U= github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0 h1:iLvW/zOkHGU3BDU5thWnj+UZ9pjhuVhv1loLj7yVtBw= github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0/go.mod h1:Fn3gvhdF1x5Rs9nUoCy/fJT1ms8f8dO7RqM9lJHuazQ= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.1/go.mod h1:GeUru+8VzrTXV/83XyMJ80KpH8xO89VPoUileyNQ+tc= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1/go.mod h1:l9ymW25HOqymeU2m1gbUQ3rUIsTwKs8gYHXkqDQUhiI= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 h1:6+lZi2JeGKtCraAj1rpoZfKqnQ9SptseRZioejfUOLM= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0/go.mod h1:eb3gfbVIxIoGgJsi9pGne19dhCBpK6opTYpQqAmdy44= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.3/go.mod h1:Seb8KNmD6kVTjwRjVEgOT5hPin6sq+v4C2ycJQDwuH8= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.3/go.mod h1:R+/S1O4TYpcktbVwddeOYg+uwUfLhADP2S/x4QwsCTM= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0 h1:qGyLBQPphYzUf+IIlb5tHnvg1U2Vc5hXPcP7oRSQfy0= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0/go.mod h1:g+dzKSLXiR/8ATkPXmLhPOI6rDdjLP3tngeo3FvDcIw= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.3/go.mod h1:wlY6SVjuwvh3TVRpTqdy4I1JpBFLX4UGeKZdWntaocw= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.3/go.mod h1:Owv1I59vaghv1Ax8zz8ELY8DN7/Y0rGS+WWAmjgi950= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0 h1:eRhU3Sh8dGbaniI6B+I48XJMrTPRkK4DKo+vqIxziOU= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0/go.mod h1:paNLV18DZ6FnWE/bd06RIKPDIFpjuvCkGKWTG/GDBeM= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.3/go.mod h1:Bm/v2IaN6rZ+Op7zX+bOUMdL4fsrYZiD0dsjLhNKwZc= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.3/go.mod h1:KZgs2ny8HsxRIRbDwgvJcHHBZPOzQr/+NtGwnP+w2ec= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0 h1:6jusT+XCcvnD+Elxvm7bUf5sCMTpZEp3AKjYQ4tWJSo= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0/go.mod h1:LimGpdIF/sTBdgqwOEkrArXLCoTamK/9L9x8IKBFTIc= +github.com/aws/aws-sdk-go-v2/service/kms v1.16.3/go.mod h1:QuiHPBqlOFCi4LqdSskYYAWpQlx3PKmohy+rE2F+o5g= +github.com/aws/aws-sdk-go-v2/service/s3 v1.26.3/go.mod h1:g1qvDuRsJY+XghsV6zg00Z4KJ7DtFFCx8fJD2a491Ak= +github.com/aws/aws-sdk-go-v2/service/s3 v1.43.0/go.mod h1:NXRKkiRF+erX2hnybnVU660cYT5/KChRD4iUgJ97cI8= github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0 h1:gAV4NEp4A+JOrIdoXkAeyy6IOo7+X2s/jRuaHKYiMaU= github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0/go.mod h1:JIQwK8sZ5MuKGm5rrFwp9MHUcyYEsQNpVixuPDlnwaU= +github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.15.4/go.mod h1:PJc8s+lxyU8rrre0/4a0pn2wgwiDvOEzoOjcJUBr67o= +github.com/aws/aws-sdk-go-v2/service/sns v1.17.4/go.mod h1:kElt+uCcXxcqFyc+bQqZPFD9DME/eC6oHBXvFzQ9Bcw= +github.com/aws/aws-sdk-go-v2/service/sqs v1.18.3/go.mod h1:skmQo0UPvsjsuYYSYMVmrPc1HWCbHUJyrCEp+ZaLzqM= +github.com/aws/aws-sdk-go-v2/service/ssm v1.24.1/go.mod h1:NR/xoKjdbRJ+qx0pMR4mI+N/H1I1ynHwXnO6FowXJc0= +github.com/aws/aws-sdk-go-v2/service/sso v1.11.3/go.mod h1:7UQ/e69kU7LDPtY40OyoHYgRmgfGM4mgsLYtcObdveU= +github.com/aws/aws-sdk-go-v2/service/sso v1.17.2/go.mod h1:/pE21vno3q1h4bbhUOEi+6Zu/aT26UK2WKkDXd+TssQ= github.com/aws/aws-sdk-go-v2/service/sso v1.26.0 h1:cuFWHH87GP1NBGXXfMicUbE7Oty5KpPxN6w4JpmuxYc= github.com/aws/aws-sdk-go-v2/service/sso v1.26.0/go.mod h1:aJBemdlbCKyOXEXdXBqS7E+8S9XTDcOTaoOjtng54hA= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.20.0/go.mod h1:dWqm5G767qwKPuayKfzm4rjzFmVjiBFbOJrpSPnAMDs= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0 h1:t2va+wewPOYIqC6XyJ4MGjiGKkczMAPsgq5W4FtL9ME= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0/go.mod h1:ExCTcqYqN0hYYRsDlBVU8+68grqlWdgX9/nZJwQW4aY= +github.com/aws/aws-sdk-go-v2/service/sts v1.16.3/go.mod h1:bfBj0iVmsUyUg4weDB4NxktD9rDGeKSVWnjTnwbx9b8= +github.com/aws/aws-sdk-go-v2/service/sts v1.25.3/go.mod h1:4EqRHDCKP78hq3zOnmFXu5k0j4bXbRFfCh/zQ6KnEfQ= github.com/aws/aws-sdk-go-v2/service/sts v1.35.0 h1:FD9agdG4CeOGS3ORLByJk56YIXDS7mxFpmZyCtpqExc= github.com/aws/aws-sdk-go-v2/service/sts v1.35.0/go.mod h1:NDzDPbBF1xtSTZUMuZx0w3hIfWzcL7X2AQ0Tr9becIQ= +github.com/aws/smithy-go v1.11.2/go.mod h1:3xHYmszWVx2c0kIwQeEVf9uSm4fYZt67FBJnwub1bgM= +github.com/aws/smithy-go v1.17.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= github.com/aws/smithy-go v1.22.5 h1:P9ATCXPMb2mPjYBgueqJNCA5S9UfktsW0tTxi+a7eqw= github.com/aws/smithy-go v1.22.5/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/bobg/gcsobj v0.1.2/go.mod h1:vS49EQ1A1Ib8FgrL58C8xXYZyOCR2TgzAdopy6/ipa8= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +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/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/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= +github.com/colinmarc/hdfs/v2 v2.1.1/go.mod h1:M3x+k8UKKmxtFu++uAZ0OtDU8jR3jnaZIAc6yK4Ue0c= +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/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU= +github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= +github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= +github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= +github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= +github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= github.com/duckdb/duckdb-go-bindings v0.1.16 h1:XPCk9hzP06PoWIxDPVU3gAy0m1XmLaZHTzLggNx/U9k= github.com/duckdb/duckdb-go-bindings v0.1.16/go.mod h1:pBnfviMzANT/9hi4bg+zW4ykRZZPCXlVuvBWEcZofkc= github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11 h1:GXQkG4HmEbwPtqCSabJTp9wZQQ7Gqr3KveLNesQWQOs= @@ -57,75 +255,906 @@ github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11 h1:j3B1biawuhtxe2Chkiqc github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11/go.mod h1:o7crKMpT2eOIi5/FY6HPqaXcvieeLSqdXXaXbruGX7w= github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11 h1:xR3vRE8y+48U6xDNkUlOfbl7/OTA7FVcDXJ+5vETuHU= github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11/go.mod h1:IlOhJdVKUJCAPj3QsDszUo8DVdvp1nBFp4TUJVdw99s= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +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/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= +github.com/gin-gonic/gin v1.7.3/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= +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-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +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-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= +github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-viper/mapstructure/v2 v2.3.0 h1:27XbWsHIqhbdR5TIC911OfYvgSaW93HM+dX7970Q7jk= github.com/go-viper/mapstructure/v2 v2.3.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-jwt/jwt/v4 v4.4.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188/go.mod h1:vXjM/+wXQnTPR4KqTKDgJukSZ6amVRtWMPEjE6sQoK8= +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/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/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +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.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +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/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/flatbuffers v25.2.10+incompatible h1:F3vclr7C3HpB1k9mxCGRMXq6FdUalZ6H/pNX4FP1v0Q= github.com/google/flatbuffers v25.2.10+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +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.6/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.8/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/go-replayers/grpcreplay v1.1.0/go.mod h1:qzAvJ8/wi57zq7gWqaE6AwLM6miiXUQwP1S+I9icmhk= +github.com/google/go-replayers/httpreplay v1.1.1/go.mod h1:gN9GeLIs7l6NUoVaSSnv2RiqK1NiwAmD0MrKeC9IIks= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+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/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +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-20200905233945-acf8798be1f7/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-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210506205249-923b5ab0fc1a/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.2.0/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.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/wire v0.5.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU= +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.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/hanwen/go-fuse v1.0.0/go.mod h1:unqXarDXqzAk0rt98O2tVndEPIpUgLD9+rwFisZH3Ok= +github.com/hanwen/go-fuse/v2 v2.1.0/go.mod h1:oRyA5eK+pvJyv5otpO/DgccS8y/RvYMaO00GgRLGryc= +github.com/hashicorp/go-uuid v0.0.0-20180228145832-27454136f036/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +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/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/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.11.0/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= +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/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.2.0/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-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/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.10.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.15.0/go.mod h1:D/zyOyXiaM1TmVWnOM18p0xdDtdakRBa0RsVGI3U3bw= github.com/jackc/pgx/v5 v5.7.5 h1:JHGfMnQY+IEtGM63d+NGMjoRpysB2JBwDr5fsngwmJs= github.com/jackc/pgx/v5 v5.7.5/go.mod h1:aruU7o91Tc2q2cFp5h4uP3f6ztExVpyVv88Xl/8Vl8M= +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.2.1 h1:gI8os0wpRXFd4FiAY2dWiqRK037tjj3t7rKFeO4X5iw= +github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/jcmturner/gofork v0.0.0-20180107083740-2aebee971930/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= +github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +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/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= +github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.13.1/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= github.com/klauspost/cpuid/v2 v2.2.11 h1:0OwqZRYI2rFrjS4kvkDnqJkKHdHaRnCm68/DY4OxRzU= github.com/klauspost/cpuid/v2 v2.2.11/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= +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/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +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/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +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.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/linkedin/goavro v2.1.0+incompatible h1:DV2aUlj2xZiuxQyvag8Dy7zjY69ENjS66bWkSfdpddY= +github.com/linkedin/goavro v2.1.0+incompatible/go.mod h1:bBCwI2eGYpUI/4820s67MElg9tdeLbINjLjiM2xZFYM= github.com/marcboeker/go-duckdb/arrowmapping v0.0.9 h1:xj+kFOqR2gH3Mcxx9LmAVHebSnCiPm303N+uxfkWVmY= github.com/marcboeker/go-duckdb/arrowmapping v0.0.9/go.mod h1:o56AqVS90v5bpxhPnOK9La7AfNTOrMORiqTQrlRbdPQ= github.com/marcboeker/go-duckdb/mapping v0.0.10 h1:b/y2W8/hNlD0Dwjq0mCqIlLXpjQMnWy0WqDV9b9lHQQ= github.com/marcboeker/go-duckdb/mapping v0.0.10/go.mod h1:Ro6Tw6sGG50O8S0daZsA8TrQJz/DvGrzGvMD7Jihirw= github.com/marcboeker/go-duckdb/v2 v2.3.2 h1:96zG2JPyIhCFjHdBjjSpOdhzJzehoGTdl7LskkuMUTs= github.com/marcboeker/go-duckdb/v2 v2.3.2/go.mod h1:VeXz9ZM6klNvICHrXEUzaHSgNqBeTdyMxr4CICw/UaY= +github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= +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.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs= github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI= github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= +github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= +github.com/minio/minio-go/v7 v7.0.34/go.mod h1:nCrRzjoSUQh8hgKKtu3Y708OLvRLtuASMg2/nvmbarw= +github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= +github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/ncw/swift v1.0.52/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= +github.com/pborman/getopt v0.0.0-20180729010549-6fdd0a2c7117/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= +github.com/pierrec/lz4/v4 v4.1.8/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= +github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +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/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +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/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.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= 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/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +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.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 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.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/xitongsys/parquet-go v1.5.1/go.mod h1:xUxwM8ELydxh4edHGegYq1pA8NnMKDx0K/GyB0o2bww= +github.com/xitongsys/parquet-go v1.6.2 h1:MhCaXii4eqceKPu9BwrjLqyK10oX9WF+xGhwvwbw7xM= +github.com/xitongsys/parquet-go v1.6.2/go.mod h1:IulAQyalCm0rPiZVNnCgm/PCL64X2tdSVGMQ/UeKqWA= +github.com/xitongsys/parquet-go-source v0.0.0-20190524061010-2b72cbee77d5/go.mod h1:xxCx7Wpym/3QCo6JhujJX51dzSXrwmb0oH6FQb39SEA= +github.com/xitongsys/parquet-go-source v0.0.0-20200817004010-026bad9b25d0/go.mod h1:HYhIKsdns7xz80OgkbgJYrtQY7FjHWHKH6cvN7+czGE= +github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b h1:zbb5qM/t3N+O33Vp5sFyG6yIcWZV1q7rfEjJM8UsRBQ= +github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b/go.mod h1:2ActxmJ4q17Cdruar9nKEkzKSOL1Ol03737Bkz10rTY= +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.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= +github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= +go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0= +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.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +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/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +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.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= +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.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= +gocloud.dev v0.26.0/go.mod h1:mkUgejbnbLotorqDyvedJO20XcZNTynmSeVSQS9btVg= +golang.org/x/crypto v0.0.0-20180723164146-c126467f60eb/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +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-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/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-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-20211115234514-b4de73f9ece8/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220511200225-c6db032c6c88/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= +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-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +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/lint v0.0.0-20210508222113-6edffad5e616/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.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w= golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= +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-20191112182307-2180aed22343/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-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +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-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211020060615-d418f374d309/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220401154927-543a649e0bdd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +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.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +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.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +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-20210220032951-036812b2e83c/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.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +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-20191112214154-59a1497f0cea/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-20200828194041-157a740278f4/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-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/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-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/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-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220204135822-1c1b9b1eba6a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220330033206-e17cdc41300f/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-20220704084225-05e143d24a9e/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.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +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/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +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.5/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.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= +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/time v0.0.0-20211116232009-f0f3c7e86c11/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220224211638-0e9765cccd65/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-20190422233926-fe54fb35175b/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-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-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-20200828161849-5deb26317202/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20200915173823-2db8f0ff891c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20200918232735-d647fc253266/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +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.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo= golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg= +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= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +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.31.0/go.mod h1:CL+9IBCa2WWU6gRuBWaKqGWLFFwbEUXkfeMkHLQWYWo= +google.golang.org/api v0.32.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +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.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.46.0/go.mod h1:ceL4oozhkAiTID8XMmJBsIxID/9wMXJVVFXPg4ylg3I= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.58.0/go.mod h1:cAbP2FsxoGVNwtgNAmmn3y5G1TWAiVYRmg4yku3lv+E= +google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.64.0/go.mod h1:931CdxA8Rm4t6zqTFGSsgwbAEZ2+GMYurbndwSimebM= +google.golang.org/api v0.66.0/go.mod h1:I1dmXYpX7HGwz/ejRxwQp2qj5bFAz93HiCU1C1oYd9M= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.68.0/go.mod h1:sOM8pTpwgflXRhz+oC8H2Dr+UcbMqkPPWNJo88Q7TH8= +google.golang.org/api v0.69.0/go.mod h1:boanBiw+h5c3s+tBPgEzLDRHfFLWV0qXxRHz3ws7C80= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= +google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +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/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-20200513103714-09dca8ec2884/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-20200831141814-d751682dd103/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-20200914193844-75d14daec038/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200921151605-7abf4a1a14d5/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-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210429181445-86c259c2b4ab/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210517163617-5e0236093d7a/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210921142501-181ce0d877f6/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211018162055-cf77aa76bad2/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211223182754-3ac035c7e7cb/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220111164026-67b88f271998/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220114231437-d2e6a121cae0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220201184016-50beb8ab5c44/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220204002441-d6cc3cc0770e/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220211171837-173942840c17/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220216160803-4663080d8bc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220401170504-314d38edb7de/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +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.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +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.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +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.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= 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-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= +gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= +gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q= +gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mNfM5bm88whjWx4= +gopkg.in/jcmturner/gokrb5.v7 v7.3.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= +gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8= +gopkg.in/linkedin/goavro.v1 v1.0.5 h1:BJa69CDh0awSsLUmZ9+BowBdokpduDZSM9Zk8oKHfN4= +gopkg.in/linkedin/goavro.v1 v1.0.5/go.mod h1:Aw5GdAbizjOEl0kAMHV9iHmA8reZzW/OKuJAl4Hb9F0= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/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/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= +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= +nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= +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/src/common/iceberg_catalog.go b/src/common/iceberg_catalog.go new file mode 100644 index 0000000..001e454 --- /dev/null +++ b/src/common/iceberg_catalog.go @@ -0,0 +1,294 @@ +package common + +import ( + "context" + "fmt" + "strings" +) + +const ( + TEMP_TABLE_SUFFIX_SYNCING = "-bemidb-syncing" + TEMP_TABLE_SUFFIX_DELETING = "-bemidb-deleting" + + CATALOG_NAME_PLACEHOLDER = "postgres" // Trino legacy, to delete +) + +type IcebergSchemaTable struct { + Schema string + Table string +} + +func (schemaTable IcebergSchemaTable) String() string { + return fmt.Sprintf(`"%s"."%s"`, schemaTable.Schema, schemaTable.Table) +} + +type IcebergMaterializedView struct { + Schema string + Table string + Definition string +} + +func (view IcebergMaterializedView) ToIcebergSchemaTable() IcebergSchemaTable { + return IcebergSchemaTable{ + Schema: view.Schema, + Table: view.Table, + } +} + +type IcebergCatalog struct { + Config *CommonConfig +} + +func NewIcebergCatalog(config *CommonConfig) *IcebergCatalog { + return &IcebergCatalog{ + Config: config, + } +} + +// Read ---------------------------------------------------------------------------------------------------------------- + +func (catalog *IcebergCatalog) Schemas() ([]string, error) { + pgClient := catalog.newPostgresClient() + defer pgClient.Close() + + ctx := context.Background() + rows, err := pgClient.Query(ctx, "SELECT table_namespace FROM iceberg_tables WHERE table_name NOT LIKE '%"+TEMP_TABLE_SUFFIX_SYNCING+"' AND table_name NOT LIKE '%"+TEMP_TABLE_SUFFIX_DELETING+"' GROUP BY table_namespace") + if err != nil { + return nil, err + } + defer rows.Close() + + var schemas []string + for rows.Next() { + var schema string + err := rows.Scan(&schema) + if err != nil { + return nil, err + } + schemas = append(schemas, schema) + } + return schemas, nil +} + +func (catalog *IcebergCatalog) SchemaTables() (Set[IcebergSchemaTable], error) { + pgClient := catalog.newPostgresClient() + defer pgClient.Close() + + rows, err := pgClient.Query( + context.Background(), + "SELECT table_namespace, table_name FROM iceberg_tables WHERE table_name NOT LIKE '%"+TEMP_TABLE_SUFFIX_SYNCING+"' AND table_name NOT LIKE '%"+TEMP_TABLE_SUFFIX_DELETING+"'", + ) + if err != nil { + return nil, err + } + defer rows.Close() + + schemaTables := make(Set[IcebergSchemaTable]) + for rows.Next() { + var schema, table string + err := rows.Scan(&schema, &table) + if err != nil { + return nil, err + } + schemaTables.Add(IcebergSchemaTable{Schema: schema, Table: table}) + } + return schemaTables, nil +} + +func (catalog *IcebergCatalog) MaterializedViews() ([]IcebergMaterializedView, error) { + pgClient := catalog.newPostgresClient() + defer pgClient.Close() + + rows, err := pgClient.Query( + context.Background(), + "SELECT schema_name, table_name, definition FROM iceberg_materialized_views WHERE table_name NOT LIKE '%"+TEMP_TABLE_SUFFIX_SYNCING+"' AND table_name NOT LIKE '%"+TEMP_TABLE_SUFFIX_DELETING+"'", + ) + if err != nil { + return nil, err + } + defer rows.Close() + + materializedViews := []IcebergMaterializedView{} + for rows.Next() { + var schema, table, definition string + err := rows.Scan(&schema, &table, &definition) + if err != nil { + return nil, err + } + materializedViews = append(materializedViews, IcebergMaterializedView{ + Schema: schema, + Table: table, + Definition: definition, + }) + + } + return materializedViews, nil +} + +func (catalog *IcebergCatalog) MaterializedView(icebergSchemaTable IcebergSchemaTable) (IcebergMaterializedView, error) { + pgClient := catalog.newPostgresClient() + defer pgClient.Close() + + var schema, table, definition string + err := pgClient.QueryRow( + context.Background(), + "SELECT schema_name, table_name, definition FROM iceberg_materialized_views WHERE schema_name=$1 AND table_name=$2", + icebergSchemaTable.Schema, icebergSchemaTable.Table, + ).Scan(&schema, &table, &definition) + + if err != nil { + if err.Error() == "no rows in result set" { + return IcebergMaterializedView{}, fmt.Errorf("relation %s does not exist", icebergSchemaTable.String()) + } + return IcebergMaterializedView{}, err + } + + return IcebergMaterializedView{ + Schema: schema, + Table: table, + Definition: definition, + }, nil +} + +func (catalog *IcebergCatalog) MetadataFileS3Path(icebergSchemaTable IcebergSchemaTable) string { + pgClient := catalog.newPostgresClient() + defer pgClient.Close() + + var path string + err := pgClient.QueryRow( + context.Background(), + "SELECT metadata_location FROM iceberg_tables WHERE table_namespace=$1 AND table_name=$2", + icebergSchemaTable.Schema, icebergSchemaTable.Table, + ).Scan(&path) + if err != nil && err.Error() == "no rows in result set" { + return "" + } + PanicIfError(catalog.Config, err) + + return path +} + +func (catalog *IcebergCatalog) SchemaTableNames(schemaName string) Set[string] { + pgClient := catalog.newPostgresClient() + defer pgClient.Close() + + rows, err := pgClient.Query( + context.Background(), + "SELECT table_name FROM iceberg_tables WHERE table_namespace=$1 AND table_name NOT LIKE '%"+TEMP_TABLE_SUFFIX_SYNCING+"' AND table_name NOT LIKE '%"+TEMP_TABLE_SUFFIX_DELETING+"'", + schemaName, + ) + PanicIfError(catalog.Config, err) + defer rows.Close() + + tableNames := make(Set[string]) + for rows.Next() { + var table string + err := rows.Scan(&table) + PanicIfError(catalog.Config, err) + tableNames.Add(table) + } + return tableNames +} + +func (catalog *IcebergCatalog) TableS3Path(icebergTableName IcebergSchemaTable) string { + metadataFileS3Path := catalog.MetadataFileS3Path(icebergTableName) + if metadataFileS3Path == "" { + return "" + } + + return strings.Split(metadataFileS3Path, "/metadata/")[0] +} + +// Write --------------------------------------------------------------------------------------------------------------- + +func (catalog *IcebergCatalog) CreateTable(icebergSchemaTable IcebergSchemaTable, metadataLocation string) { + pgClient := catalog.newPostgresClient() + defer pgClient.Close() + + _, err := pgClient.Exec( + context.Background(), + "INSERT INTO iceberg_tables (catalog_name, table_namespace, table_name, metadata_location) VALUES ($1, $2, $3, $4)", + CATALOG_NAME_PLACEHOLDER, + icebergSchemaTable.Schema, + icebergSchemaTable.Table, + metadataLocation, + ) + PanicIfError(catalog.Config, err) +} + +func (catalog *IcebergCatalog) RenameTable(oldIcebergSchemaTable IcebergSchemaTable, newIcebergTableName string) { + pgClient := catalog.newPostgresClient() + defer pgClient.Close() + + _, err := pgClient.Exec( + context.Background(), + "UPDATE iceberg_tables SET table_name=$1 WHERE table_namespace=$2 AND table_name=$3", + newIcebergTableName, + oldIcebergSchemaTable.Schema, + oldIcebergSchemaTable.Table, + ) + PanicIfError(catalog.Config, err) +} + +func (catalog *IcebergCatalog) DropTable(icebergSchemaTable IcebergSchemaTable) { + pgClient := catalog.newPostgresClient() + defer pgClient.Close() + + _, err := pgClient.Exec( + context.Background(), + "DELETE FROM iceberg_tables WHERE table_namespace=$1 AND table_name=$2", + icebergSchemaTable.Schema, + icebergSchemaTable.Table, + ) + PanicIfError(catalog.Config, err) +} + +func (catalog *IcebergCatalog) CreateMaterializedView(icebergSchemaTable IcebergSchemaTable, definition string) error { + pgClient := catalog.newPostgresClient() + defer pgClient.Close() + + ctx := context.Background() + _, err := pgClient.Exec( + ctx, + "INSERT INTO iceberg_materialized_views (schema_name, table_name, definition) VALUES ($1, $2, $3)", + icebergSchemaTable.Schema, icebergSchemaTable.Table, definition, + ) + + return err +} + +func (catalog *IcebergCatalog) DropMaterializedView(icebergSchemaTable IcebergSchemaTable) error { + ctx := context.Background() + + pgClient := catalog.newPostgresClient() + defer pgClient.Close() + + var exists bool + err := pgClient.QueryRow( + ctx, + "SELECT TRUE FROM iceberg_materialized_views WHERE schema_name=$1 AND table_name=$2", + icebergSchemaTable.Schema, icebergSchemaTable.Table, + ).Scan(&exists) + + if err != nil { + if err.Error() == "no rows in result set" { + return fmt.Errorf("materialized view %s does not exist", icebergSchemaTable.String()) + } else { + return fmt.Errorf("error checking materialized view existence: %w", err) + } + } + + _, err = pgClient.Exec( + ctx, + "DELETE FROM iceberg_materialized_views WHERE schema_name=$1 AND table_name=$2", + icebergSchemaTable.Schema, icebergSchemaTable.Table, + ) + + return err +} + +// --------------------------------------------------------------------------------------------------------------------- + +func (catalog *IcebergCatalog) newPostgresClient() *PostgresClient { + return NewPostgresClient(catalog.Config, catalog.Config.CatalogDatabaseUrl) +} diff --git a/src/syncer-common/iceberg_schema_column.go b/src/common/iceberg_schema_column.go similarity index 93% rename from src/syncer-common/iceberg_schema_column.go rename to src/common/iceberg_schema_column.go index 5c416da..d9b8119 100644 --- a/src/syncer-common/iceberg_schema_column.go +++ b/src/common/iceberg_schema_column.go @@ -1,4 +1,4 @@ -package syncerCommon +package common import ( "encoding/csv" @@ -10,7 +10,6 @@ import ( "strings" "time" - "github.com/BemiHQ/BemiDB/src/common" "github.com/marcboeker/go-duckdb/v2" ) @@ -41,7 +40,7 @@ const ( ) type IcebergSchemaColumn struct { - Config *common.CommonConfig + Config *CommonConfig ColumnName string ColumnType IcebergColumnType Position int @@ -112,7 +111,7 @@ func (col *IcebergSchemaColumn) IcebergSchemaFieldMap() IcebergSchemaField { case IcebergColumnTypeInteger: icebergSchemaField.Type = "int" case IcebergColumnTypeDecimal: - icebergSchemaField.Type = "decimal(" + common.IntToString(col.NormalizedPrecision()) + ", " + common.IntToString(col.NormalizedScale()) + ")" + icebergSchemaField.Type = "decimal(" + IntToString(col.NormalizedPrecision()) + ", " + IntToString(col.NormalizedScale()) + ")" case IcebergColumnTypeLong: icebergSchemaField.Type = "long" case IcebergColumnTypeFloat: @@ -157,7 +156,7 @@ func (col *IcebergSchemaColumn) DuckdbType() string { case IcebergColumnTypeLong: duckdbType = "BIGINT" case IcebergColumnTypeDecimal: - duckdbType = "DECIMAL(" + common.IntToString(col.NormalizedPrecision()) + ", " + common.IntToString(col.NormalizedScale()) + ")" + duckdbType = "DECIMAL(" + IntToString(col.NormalizedPrecision()) + ", " + IntToString(col.NormalizedScale()) + ")" case IcebergColumnTypeFloat: duckdbType = "FLOAT" case IcebergColumnTypeDouble: @@ -197,7 +196,7 @@ func (col *IcebergSchemaColumn) DuckdbValueFromCsv(value string) interface{} { csvString = strings.ReplaceAll(csvString, "\\\"", "\"\"") // Replace escaped double quotes with double quotes according to CSV format rules csvReader := csv.NewReader(strings.NewReader(csvString)) stringValues, err := csvReader.Read() - common.PanicIfError(col.Config, err) + PanicIfError(col.Config, err) for _, stringValue := range stringValues { primitiveValue := col.duckdbPrimitiveValueFromCsv(stringValue) @@ -258,7 +257,7 @@ func (col *IcebergSchemaColumn) duckdbPrimitiveValueFromCsv(value string) interf parts := strings.Split(value, " ") for i, part := range parts { if strings.HasPrefix(part, "year") { - common.Panic(col.Config, "Year intervals are not supported yet") + Panic(col.Config, "Year intervals are not supported yet") } else if strings.HasPrefix(part, "mon") { months := StringToInt(parts[i-1]) microseconds += months * 30_437_500 * 24 * 60 * 60 // Approximation: 30.4375 days per month @@ -277,7 +276,7 @@ func (col *IcebergSchemaColumn) duckdbPrimitiveValueFromCsv(value string) interf } } } - valueMicrosecondsString := common.IntToString(microseconds) + valueMicrosecondsString := IntToString(microseconds) return col.duckdbDecimal(valueMicrosecondsString) default: return col.duckdbDecimal(value) @@ -286,11 +285,11 @@ func (col *IcebergSchemaColumn) duckdbPrimitiveValueFromCsv(value string) interf return StringDateToTime(value) case IcebergColumnTypeTime: parsedTime, err := time.Parse("15:04:05.999999", value) - common.PanicIfError(col.Config, err) + PanicIfError(col.Config, err) return parsedTime case IcebergColumnTypeTimeTz: parsedTime, err := time.Parse("15:04:05.999999-07", value) - common.PanicIfError(col.Config, err) + PanicIfError(col.Config, err) return parsedTime case IcebergColumnTypeTimestamp: parsedTimestamp, err := time.Parse("2006-01-02 15:04:05.999999", value) @@ -298,7 +297,7 @@ func (col *IcebergSchemaColumn) duckdbPrimitiveValueFromCsv(value string) interf parsedTimestamp, err = time.Parse("2006-01-02 15:04:05.999999-07:00", value) if err != nil { parsedTimestamp, err = time.Parse("2006-01-02 15:04:05.999999-07", value) - common.PanicIfError(col.Config, err) + PanicIfError(col.Config, err) } } return parsedTimestamp @@ -361,7 +360,7 @@ func (col *IcebergSchemaColumn) duckdbPrimitiveValueFromJson(value any) interfac switch kind { case reflect.Map: jsonBytes, err := json.Marshal(value) - common.PanicIfError(col.Config, err) + PanicIfError(col.Config, err) return string(jsonBytes) case reflect.Float64: return Float64ToString(value.(float64)) @@ -389,7 +388,7 @@ func (col *IcebergSchemaColumn) duckdbPrimitiveValueFromJson(value any) interfac valueString = strings.TrimSuffix(valueString, "Z") + "-00" } parsedTime, err := time.Parse("15:04:05.999999-07", valueString) - common.PanicIfError(col.Config, err) + PanicIfError(col.Config, err) return parsedTime case IcebergColumnTypeTimestamp: switch kind { @@ -399,12 +398,12 @@ func (col *IcebergSchemaColumn) duckdbPrimitiveValueFromJson(value any) interfac return nil } valueString = strings.TrimSuffix(valueString, "Z") - parsedTimestamp, err := time.Parse("2006-01-02 15:04:05.999999", valueString) + parsedTimestamp, err := time.Parse("2006-01-02T15:04:05.999999", valueString) if err != nil { parsedTimestamp, err = time.Parse("2006-01-02T15:04:05.999999-07:00", valueString) if err != nil { parsedTimestamp, err = time.Parse("2006-01-02T15:04:05.999999-07", valueString) - common.PanicIfError(col.Config, err) + PanicIfError(col.Config, err) } } return parsedTimestamp diff --git a/src/common/iceberg_table.go b/src/common/iceberg_table.go new file mode 100644 index 0000000..9aa7d17 --- /dev/null +++ b/src/common/iceberg_table.go @@ -0,0 +1,91 @@ +package common + +import ( + "context" + + "github.com/google/uuid" +) + +type IcebergTable struct { + Config *CommonConfig + IcebergSchemaTable IcebergSchemaTable + IcebergCatalog *IcebergCatalog + StorageS3 *StorageS3 + DuckdbClient *DuckdbClient +} + +type CursorValue struct { + ColumnName string + StringValue string + OverrideRows bool // Override rows that have the same value as this cursor value (if new rows are added with the same value, they will be included in the next sync) +} + +func NewIcebergTable(config *CommonConfig, storageS3 *StorageS3, duckdbClient *DuckdbClient, icebergSchemaTable IcebergSchemaTable) *IcebergTable { + return &IcebergTable{ + Config: config, + IcebergSchemaTable: icebergSchemaTable, + IcebergCatalog: NewIcebergCatalog(config), + StorageS3: storageS3, + DuckdbClient: duckdbClient, + } +} + +func (table *IcebergTable) String() string { + return table.IcebergSchemaTable.String() +} + +func (table *IcebergTable) MetadataFileS3Path() string { + return table.IcebergCatalog.MetadataFileS3Path(table.IcebergSchemaTable) +} + +func (table *IcebergTable) Create(tableS3Path string) { + LogInfo(table.Config, "Creating Iceberg table:", table.IcebergSchemaTable.Table) + table.IcebergCatalog.CreateTable(table.IcebergSchemaTable, tableS3Path+"/metadata/"+ICEBERG_METADATA_INITIAL_FILE_NAME) +} + +func (table *IcebergTable) DropIfExists() { + tableS3Path := table.IcebergCatalog.TableS3Path(table.IcebergSchemaTable) + if tableS3Path == "" { + return + } + + LogInfo(table.Config, "Deleting Iceberg table:", table.IcebergSchemaTable.Table) + table.StorageS3.DeleteTableFiles(tableS3Path) + table.IcebergCatalog.DropTable(table.IcebergSchemaTable) +} + +func (table *IcebergTable) Rename(newName string) { + LogInfo(table.Config, "Renaming Iceberg table from", table.IcebergSchemaTable.Table, "to", newName) + table.IcebergCatalog.RenameTable(table.IcebergSchemaTable, newName) + table.IcebergSchemaTable.Table = newName +} + +func (table *IcebergTable) GenerateTableS3Path() string { + return "s3://" + table.Config.Aws.S3Bucket + "/iceberg/" + table.IcebergSchemaTable.Schema + "/" + table.IcebergSchemaTable.Table + "-" + uuid.New().String() +} + +func (table *IcebergTable) LastCursorValue(columnName string) CursorValue { + if columnName == "" { + Panic(table.Config, "Couldn't find cursor column for table "+table.IcebergSchemaTable.Table) + } + + metadataFileS3Path := table.MetadataFileS3Path() + if metadataFileS3Path == "" { + LogDebug(table.Config, "No S3 table path found for Iceberg table:", table.IcebergSchemaTable.Table) + return CursorValue{ColumnName: columnName} + } + + row := table.DuckdbClient.QueryRowContext( + context.Background(), + `SELECT CAST(max("`+columnName+`") AS VARCHAR) FROM iceberg_scan('`+metadataFileS3Path+`')`, + ) + if row == nil { + return CursorValue{ColumnName: columnName} + } + + var lastCursorValue string + err := row.Scan(&lastCursorValue) + PanicIfError(table.Config, err) + + return CursorValue{ColumnName: columnName, StringValue: lastCursorValue} +} diff --git a/src/syncer-common/iceberg_writer.go b/src/common/iceberg_table_writer.go similarity index 65% rename from src/syncer-common/iceberg_writer.go rename to src/common/iceberg_table_writer.go index 923ea55..394edc9 100644 --- a/src/syncer-common/iceberg_writer.go +++ b/src/common/iceberg_table_writer.go @@ -1,4 +1,4 @@ -package syncerCommon +package common import ( "context" @@ -9,8 +9,6 @@ import ( "strings" "github.com/google/uuid" - - "github.com/BemiHQ/BemiDB/src/common" ) const ( @@ -18,68 +16,73 @@ const ( MAX_PARQUET_FILE_SIZE = 100 * 1024 * 1024 // 100 MB ) -type IcebergWriter struct { - Config *common.CommonConfig - IcebergSchemaColumns []*IcebergSchemaColumn +type IcebergTableWriter struct { + Config *CommonConfig StorageS3 *StorageS3 - DuckdbClient *common.DuckdbClient + DuckdbClient *DuckdbClient + IcebergTable *IcebergTable + IcebergSchemaColumns []*IcebergSchemaColumn CompressionFactor int64 } -func NewIcebergWriter( - config *common.CommonConfig, +func NewIcebergTableWriter( + config *CommonConfig, storageS3 *StorageS3, - duckdbClient *common.DuckdbClient, + duckdbClient *DuckdbClient, + icebergTable *IcebergTable, icebergSchemaColumns []*IcebergSchemaColumn, compressionFactor int64, -) *IcebergWriter { - return &IcebergWriter{ +) *IcebergTableWriter { + return &IcebergTableWriter{ Config: config, - IcebergSchemaColumns: icebergSchemaColumns, StorageS3: storageS3, DuckdbClient: duckdbClient, + IcebergTable: icebergTable, + IcebergSchemaColumns: icebergSchemaColumns, CompressionFactor: compressionFactor, } } -func (writer *IcebergWriter) InsertFromCsvCappedBuffer(icebergTable *IcebergTable, cappedBuffer *CappedBuffer) { +// Public functions ---------------------------------------------------------------------------------------------------- + +func (writer *IcebergTableWriter) InsertFromCsvCappedBuffer(cappedBuffer *CappedBuffer) { csvReader := csv.NewReader(cappedBuffer) _, err := csvReader.Read() // Read the header row - common.PanicIfError(writer.Config, err) + PanicIfError(writer.Config, err) - writer.insertRows(icebergTable, func(duckdbTableName string, loadedSize int64) (int64, bool) { + writer.insertRows(func(duckdbTableName string, loadedSize int64) (int64, bool) { return writer.loadCsvRows(duckdbTableName, csvReader, loadedSize) }) } -func (writer *IcebergWriter) AppendFromCsvCappedBuffer(icebergTable *IcebergTable, cursorValue CursorValue, cappedBuffer *CappedBuffer) { - metadataFileS3Path := icebergTable.MetadataFileS3Path() +func (writer *IcebergTableWriter) AppendFromCsvCappedBuffer(cursorValue CursorValue, cappedBuffer *CappedBuffer) { + metadataFileS3Path := writer.IcebergTable.MetadataFileS3Path() if metadataFileS3Path == "" { // If the table does not exist, insert for the first time - writer.InsertFromCsvCappedBuffer(icebergTable, cappedBuffer) + writer.InsertFromCsvCappedBuffer(cappedBuffer) return } csvReader := csv.NewReader(cappedBuffer) _, err := csvReader.Read() // Read the header row - common.PanicIfError(writer.Config, err) + PanicIfError(writer.Config, err) writer.appendRows(metadataFileS3Path, cursorValue, func(duckdbTableName string, loadedSize int64) (int64, bool) { return writer.loadCsvRows(duckdbTableName, csvReader, loadedSize) }) } -func (writer *IcebergWriter) InsertFromJsonCappedBuffer(icebergTable *IcebergTable, cappedBuffer *CappedBuffer) { +func (writer *IcebergTableWriter) InsertFromJsonCappedBuffer(cappedBuffer *CappedBuffer) { jsonQueueReader := NewJsonQueueReader(cappedBuffer) - writer.insertRows(icebergTable, func(duckdbTableName string, loadedSize int64) (int64, bool) { + writer.insertRows(func(duckdbTableName string, loadedSize int64) (int64, bool) { return writer.loadJsonRows(duckdbTableName, jsonQueueReader, loadedSize) }) } -func (writer *IcebergWriter) AppendFromJsonCappedBuffer(icebergTable *IcebergTable, cursorValue CursorValue, cappedBuffer *CappedBuffer) { - metadataFileS3Path := icebergTable.MetadataFileS3Path() +func (writer *IcebergTableWriter) AppendFromJsonCappedBuffer(cursorValue CursorValue, cappedBuffer *CappedBuffer) { + metadataFileS3Path := writer.IcebergTable.MetadataFileS3Path() if metadataFileS3Path == "" { // If the table does not exist, insert for the first time - writer.InsertFromJsonCappedBuffer(icebergTable, cappedBuffer) + writer.InsertFromJsonCappedBuffer(cappedBuffer) return } @@ -90,36 +93,36 @@ func (writer *IcebergWriter) AppendFromJsonCappedBuffer(icebergTable *IcebergTab }) } -func (writer *IcebergWriter) UpdateFromJsonCappedBuffer(icebergTable *IcebergTable, cappedBuffer *CappedBuffer) { - metadataFileS3Path := icebergTable.MetadataFileS3Path() +func (writer *IcebergTableWriter) UpdateFromJsonCappedBuffer(cappedBuffer *CappedBuffer) { + metadataFileS3Path := writer.IcebergTable.MetadataFileS3Path() if metadataFileS3Path == "" { // If the table does not exist, insert for the first time - writer.InsertFromJsonCappedBuffer(icebergTable, cappedBuffer) + writer.InsertFromJsonCappedBuffer(cappedBuffer) return } jsonQueueReader := NewJsonQueueReader(cappedBuffer) - uniqueIndexColumnNames := writer.UniqueIndexColumnNames(icebergTable) + uniqueIndexColumnNames := writer.UniqueIndexColumnNames() writer.updateRows(metadataFileS3Path, uniqueIndexColumnNames, func(duckdbTableName string, loadedSize int64) (int64, bool) { return writer.loadJsonRows(duckdbTableName, jsonQueueReader, loadedSize) }) } -func (writer *IcebergWriter) DeleteFromJsonCappedBuffer(icebergTable *IcebergTable, cappedBuffer *CappedBuffer) { - metadataFileS3Path := icebergTable.MetadataFileS3Path() +func (writer *IcebergTableWriter) DeleteFromJsonCappedBuffer(cappedBuffer *CappedBuffer) { + metadataFileS3Path := writer.IcebergTable.MetadataFileS3Path() if metadataFileS3Path == "" { // If the table does not exist, do nothing return } jsonQueueReader := NewJsonQueueReader(cappedBuffer) - uniqueIndexColumnNames := writer.UniqueIndexColumnNames(icebergTable) + uniqueIndexColumnNames := writer.UniqueIndexColumnNames() writer.deleteRows(metadataFileS3Path, uniqueIndexColumnNames, func(duckdbTableName string, loadedSize int64) (int64, bool) { return writer.loadJsonRows(duckdbTableName, jsonQueueReader, loadedSize) }) } -func (writer *IcebergWriter) UniqueIndexColumnNames(icebergTable *IcebergTable) []string { +func (writer *IcebergTableWriter) UniqueIndexColumnNames() []string { uniqueIndexColumnNames := []string{} for _, icebergSchemaColumn := range writer.IcebergSchemaColumns { if icebergSchemaColumn.IsPartOfUniqueIndex { @@ -127,13 +130,50 @@ func (writer *IcebergWriter) UniqueIndexColumnNames(icebergTable *IcebergTable) } } if len(uniqueIndexColumnNames) == 0 { - common.Panic(writer.Config, "Cannot update Iceberg table without unique index columns: "+icebergTable.String()) + Panic(writer.Config, "Cannot update Iceberg table without unique index columns: "+writer.IcebergTable.String()) } return uniqueIndexColumnNames } -func (writer *IcebergWriter) insertRows(icebergTable *IcebergTable, loadRowsToDuckdbTableFunc func(duckdbTableName string, loadedSize int64) (loadedRowCount int64, reachedEnd bool)) { - tableS3Path := icebergTable.GenerateTableS3Path() +func (writer *IcebergTableWriter) InsertFromQuery(query string) error { + tableS3Path := writer.IcebergTable.GenerateTableS3Path() + dataS3Path := tableS3Path + "/data" + metadataS3Path := tableS3Path + "/metadata" + + tempDuckdbTableName := "temp_" + strings.ReplaceAll(uuid.New().String(), "-", "") + + loadedRowCount, icebergSchemaColumns, err := writer.insertToDuckdbTableFromQuery(tempDuckdbTableName, query) + defer writer.deleteTempDuckdbTable(tempDuckdbTableName) + if err != nil { + return err + } + + // Create parquet + parquetFile := writer.StorageS3.CreateParquet(dataS3Path, writer.DuckdbClient, tempDuckdbTableName, icebergSchemaColumns, loadedRowCount) + parquetFilesSortedAsc := []ParquetFile{parquetFile} + totalDataFileSize := parquetFile.Size + + // Create manifest + manifestFile := writer.StorageS3.CreateManifest(metadataS3Path, parquetFilesSortedAsc) + + // Create manifest list + manifestListItem := ManifestListItem{SequenceNumber: len(parquetFilesSortedAsc) + 1, ManifestFile: manifestFile} + manifestListFile := writer.StorageS3.CreateManifestList(metadataS3Path, totalDataFileSize, []ManifestListItem{manifestListItem}) + + // Create metadata + writer.StorageS3.CreateMetadata(metadataS3Path, icebergSchemaColumns, []ManifestListFile{manifestListFile}) + LogInfo(writer.Config, "Written", parquetFile.RecordCount, "records in Parquet file #"+IntToString(len(parquetFilesSortedAsc)), "("+writer.formattedParquetFileSize(parquetFile.Size)+")") + + // Create as table + writer.IcebergTable.Create(tableS3Path) + + return nil +} + +// Iceberg logic ------------------------------------------------------------------------------------------------------- + +func (writer *IcebergTableWriter) insertRows(loadRowsToDuckdbTableFunc func(duckdbTableName string, loadedSize int64) (loadedRowCount int64, reachedEnd bool)) { + tableS3Path := writer.IcebergTable.GenerateTableS3Path() dataS3Path := tableS3Path + "/data" metadataS3Path := tableS3Path + "/metadata" @@ -172,11 +212,11 @@ func (writer *IcebergWriter) insertRows(icebergTable *IcebergTable, loadRowsToDu // Create metadata writer.StorageS3.CreateMetadata(metadataS3Path, writer.IcebergSchemaColumns, []ManifestListFile{manifestListFile}) - common.LogInfo(writer.Config, "Written", parquetFile.RecordCount, "records in Parquet file #"+common.IntToString(len(parquetFilesSortedAsc)), "("+writer.formattedParquetFileSize(parquetFile.Size)+")") + LogInfo(writer.Config, "Written", parquetFile.RecordCount, "records in Parquet file #"+IntToString(len(parquetFilesSortedAsc)), "("+writer.formattedParquetFileSize(parquetFile.Size)+")") // Create table if len(parquetFilesSortedAsc) == 1 { - icebergTable.Create(tableS3Path) + writer.IcebergTable.Create(tableS3Path) } // Delete old files @@ -191,7 +231,7 @@ func (writer *IcebergWriter) insertRows(icebergTable *IcebergTable, loadRowsToDu } } -func (writer *IcebergWriter) appendRows(metadataFileS3Path string, cursorValue CursorValue, loadRowsToDuckdbTableFunc func(duckdbTableName string, loadedSize int64) (loadedRowCount int64, reachedEnd bool)) { +func (writer *IcebergTableWriter) appendRows(metadataFileS3Path string, cursorValue CursorValue, loadRowsToDuckdbTableFunc func(duckdbTableName string, loadedSize int64) (loadedRowCount int64, reachedEnd bool)) { tableS3Path := strings.Split(metadataFileS3Path, "/metadata/")[0] metadataS3Path := tableS3Path + "/metadata" dataS3Path := tableS3Path + "/data" @@ -239,7 +279,7 @@ func (writer *IcebergWriter) appendRows(metadataFileS3Path string, cursorValue C parquetFilesSortedAsc = append(parquetFilesSortedAsc, newParquetFile) newParquetFileCount++ totalDataFileSize += newParquetFile.Size - common.LogInfo(writer.Config, "Written", newParquetFile.RecordCount, "records in Parquet file #"+common.IntToString(newParquetFileCount), "("+writer.formattedParquetFileSize(newParquetFile.Size)+")") + LogInfo(writer.Config, "Written", newParquetFile.RecordCount, "records in Parquet file #"+IntToString(newParquetFileCount), "("+writer.formattedParquetFileSize(newParquetFile.Size)+")") if reachedEnd { break @@ -264,7 +304,7 @@ func (writer *IcebergWriter) appendRows(metadataFileS3Path string, cursorValue C } } -func (writer *IcebergWriter) updateRows(metadataFileS3Path string, uniqueIndexColumnNames []string, loadRowsToDuckdbTableFunc func(duckdbTableName string, loadedSize int64) (loadedRowCount int64, reachedEnd bool)) { +func (writer *IcebergTableWriter) updateRows(metadataFileS3Path string, uniqueIndexColumnNames []string, loadRowsToDuckdbTableFunc func(duckdbTableName string, loadedSize int64) (loadedRowCount int64, reachedEnd bool)) { tableS3Path := strings.Split(metadataFileS3Path, "/metadata/")[0] metadataS3Path := tableS3Path + "/metadata" dataS3Path := tableS3Path + "/data" @@ -302,7 +342,7 @@ func (writer *IcebergWriter) updateRows(metadataFileS3Path string, uniqueIndexCo // Create parquet newParquetFile := writer.StorageS3.CreateParquet(dataS3Path, writer.DuckdbClient, tempDuckdbTableName, writer.IcebergSchemaColumns, loadedRowCount) - common.LogInfo(writer.Config, "Written", newParquetFile.RecordCount, "records in 'updated' Parquet file ("+writer.formattedParquetFileSize(newParquetFile.Size)+")") + LogInfo(writer.Config, "Written", newParquetFile.RecordCount, "records in 'updated' Parquet file ("+writer.formattedParquetFileSize(newParquetFile.Size)+")") // Replace the old Parquet file with the new one parquetFilesSortedAsc[i] = newParquetFile @@ -340,7 +380,7 @@ func (writer *IcebergWriter) updateRows(metadataFileS3Path string, uniqueIndexCo } } -func (writer *IcebergWriter) deleteRows(metadataFileS3Path string, uniqueIndexColumnNames []string, loadRowsToDuckdbTableFunc func(duckdbTableName string, loadedSize int64) (loadedRowCount int64, reachedEnd bool)) { +func (writer *IcebergTableWriter) deleteRows(metadataFileS3Path string, uniqueIndexColumnNames []string, loadRowsToDuckdbTableFunc func(duckdbTableName string, loadedSize int64) (loadedRowCount int64, reachedEnd bool)) { tableS3Path := strings.Split(metadataFileS3Path, "/metadata/")[0] metadataS3Path := tableS3Path + "/metadata" dataS3Path := tableS3Path + "/data" @@ -376,7 +416,7 @@ func (writer *IcebergWriter) deleteRows(metadataFileS3Path string, uniqueIndexCo // Create parquet newParquetFile := writer.StorageS3.CreateParquet(dataS3Path, writer.DuckdbClient, tempDuckdbTableName, writer.IcebergSchemaColumns, rowCount) - common.LogInfo(writer.Config, "Written", newParquetFile.RecordCount, "records in 'deleted' Parquet file ("+writer.formattedParquetFileSize(newParquetFile.Size)+")") + LogInfo(writer.Config, "Written", newParquetFile.RecordCount, "records in 'deleted' Parquet file ("+writer.formattedParquetFileSize(newParquetFile.Size)+")") // Replace the old Parquet file with the new one parquetFilesSortedAsc[i] = newParquetFile @@ -414,7 +454,9 @@ func (writer *IcebergWriter) deleteRows(metadataFileS3Path string, uniqueIndexCo } } -func (writer *IcebergWriter) createTempDuckdbTable() string { +// DuckDB -------------------------------------------------------------------------------------------------------------- + +func (writer *IcebergTableWriter) createTempDuckdbTable() string { tableName := "temp_" + strings.ReplaceAll(uuid.New().String(), "-", "") columnSchemas := make([]string, len(writer.IcebergSchemaColumns)) for i, col := range writer.IcebergSchemaColumns { @@ -422,12 +464,12 @@ func (writer *IcebergWriter) createTempDuckdbTable() string { } _, err := writer.DuckdbClient.ExecContext(context.Background(), "CREATE TABLE "+tableName+"("+strings.Join(columnSchemas, ",")+")") - common.PanicIfError(writer.Config, err) + PanicIfError(writer.Config, err) return tableName } -func (writer *IcebergWriter) hasOverlappingRowsInParquet(duckdbTableName string, parquetFileS3Path string, uniqueIndexColumnNames []string) bool { +func (writer *IcebergTableWriter) hasOverlappingRowsInParquet(duckdbTableName string, parquetFileS3Path string, uniqueIndexColumnNames []string) bool { uniqueIndexConditions := make([]string, len(uniqueIndexColumnNames)) for i, uniqueIndexColumnName := range uniqueIndexColumnNames { uniqueIndexConditions[i] = `"` + uniqueIndexColumnName + `" IN (SELECT "` + uniqueIndexColumnName + `" FROM ` + duckdbTableName + ")" @@ -436,65 +478,118 @@ func (writer *IcebergWriter) hasOverlappingRowsInParquet(duckdbTableName string, var count int err := writer.DuckdbClient.QueryRowContext(context.Background(), countSql).Scan(&count) - common.PanicIfError(writer.Config, err) + PanicIfError(writer.Config, err) return count > 0 } -func (writer *IcebergWriter) insertToDuckdbTableFromParquet(duckdbTableName string, parquetFileS3Path string, cursorValue CursorValue) int64 { +func (writer *IcebergTableWriter) insertToDuckdbTableFromParquet(duckdbTableName string, parquetFileS3Path string, cursorValue CursorValue) int64 { sql := "INSERT INTO " + duckdbTableName + " SELECT * FROM read_parquet('" + parquetFileS3Path + "')" if cursorValue.OverrideRows { // Exclude rows with the cursor value sql += ` WHERE "` + cursorValue.ColumnName + `" != '` + cursorValue.StringValue + `'` - common.LogInfo(writer.Config, "Replacing last existing Parquet file excluding cursor value:", strings.Split(parquetFileS3Path, "/data/")[1]) + LogInfo(writer.Config, "Replacing last existing Parquet file excluding cursor value:", strings.Split(parquetFileS3Path, "/data/")[1]) } else { - common.LogInfo(writer.Config, "Replacing last existing Parquet file:", strings.Split(parquetFileS3Path, "/data/")[1]) + LogInfo(writer.Config, "Replacing last existing Parquet file:", strings.Split(parquetFileS3Path, "/data/")[1]) } result, err := writer.DuckdbClient.ExecContext(context.Background(), sql) - common.PanicIfError(writer.Config, err) + PanicIfError(writer.Config, err) rowsAffected, err := result.RowsAffected() - common.PanicIfError(writer.Config, err) + PanicIfError(writer.Config, err) return rowsAffected } -func (writer *IcebergWriter) insertToDuckdbTableFromDuckdbTableThatOverlapWithParquetRows(insertDuckdbTableName string, sourceDuckdbTableName string, parquetFileS3Path string, uniqueIndexColumnNames []string) int64 { +func (writer *IcebergTableWriter) insertToDuckdbTableFromDuckdbTableThatOverlapWithParquetRows(insertDuckdbTableName string, sourceDuckdbTableName string, parquetFileS3Path string, uniqueIndexColumnNames []string) int64 { uniqueIndexConditions := make([]string, len(uniqueIndexColumnNames)) for i, uniqueIndexColumnName := range uniqueIndexColumnNames { uniqueIndexConditions[i] = `"` + uniqueIndexColumnName + `" IN (SELECT "` + uniqueIndexColumnName + `" FROM read_parquet('` + parquetFileS3Path + "'))" } sql := "INSERT INTO " + insertDuckdbTableName + " SELECT * FROM " + sourceDuckdbTableName + " WHERE " + strings.Join(uniqueIndexConditions, " AND ") result, err := writer.DuckdbClient.ExecContext(context.Background(), sql) - common.PanicIfError(writer.Config, err) + PanicIfError(writer.Config, err) rowsAffected, err := result.RowsAffected() - common.PanicIfError(writer.Config, err) + PanicIfError(writer.Config, err) return rowsAffected } -func (writer *IcebergWriter) insertToDuckdbTableFromParquetWithoutOverlappingDuckdbTableRows(insertDuckdbTableName string, overlappingDuckdbTableName string, parquetFileS3Path string, uniqueIndexColumnNames []string) int64 { +func (writer *IcebergTableWriter) insertToDuckdbTableFromParquetWithoutOverlappingDuckdbTableRows(insertDuckdbTableName string, overlappingDuckdbTableName string, parquetFileS3Path string, uniqueIndexColumnNames []string) int64 { uniqueIndexConditions := make([]string, len(uniqueIndexColumnNames)) for i, uniqueIndexColumnName := range uniqueIndexColumnNames { uniqueIndexConditions[i] = `"` + uniqueIndexColumnName + `" NOT IN (SELECT "` + uniqueIndexColumnName + `" FROM ` + overlappingDuckdbTableName + ")" } sql := "INSERT INTO " + insertDuckdbTableName + " SELECT * FROM read_parquet('" + parquetFileS3Path + "') WHERE " + strings.Join(uniqueIndexConditions, " AND ") result, err := writer.DuckdbClient.ExecContext(context.Background(), sql) - common.PanicIfError(writer.Config, err) + PanicIfError(writer.Config, err) rowsAffected, err := result.RowsAffected() - common.PanicIfError(writer.Config, err) + PanicIfError(writer.Config, err) return rowsAffected } -func (writer *IcebergWriter) deleteTempDuckdbTable(duckdbTableName string) { - _, err := writer.DuckdbClient.ExecContext(context.Background(), "DROP TABLE "+duckdbTableName) - common.PanicIfError(writer.Config, err) +func (writer *IcebergTableWriter) insertToDuckdbTableFromQuery(duckdbTableName string, query string) (int64, []*IcebergSchemaColumn, error) { + ctx := context.Background() + + result, err := writer.DuckdbClient.ExecContext(ctx, "CREATE TABLE "+duckdbTableName+" AS "+query) + if err != nil { + return 0, nil, err + } + + rowsAffected, err := result.RowsAffected() + if err != nil { + return 0, nil, err + } + + var icebergSchemaColumns []*IcebergSchemaColumn + rows, err := writer.DuckdbClient.QueryContext( + ctx, + `SELECT + columns.column_name, + columns.data_type, + columns.is_nullable, + columns.ordinal_position, + COALESCE(columns.numeric_precision, 0), + COALESCE(columns.numeric_scale, 0), + COALESCE(columns.datetime_precision, 0), + FROM information_schema.columns + WHERE columns.table_name = '`+duckdbTableName+`'`, + ) + if err != nil { + return 0, nil, err + } + defer rows.Close() + + for rows.Next() { + duckdbSchemaColumn := &DuckdbSchemaColumn{Config: writer.Config} + err := rows.Scan( + &duckdbSchemaColumn.ColumnName, + &duckdbSchemaColumn.DataType, + &duckdbSchemaColumn.IsNullable, + &duckdbSchemaColumn.OrdinalPosition, + &duckdbSchemaColumn.NumericPrecision, + &duckdbSchemaColumn.NumericScale, + &duckdbSchemaColumn.DatetimePrecision, + ) + if err != nil { + return 0, nil, err + } + + icebergSchemaColumns = append(icebergSchemaColumns, duckdbSchemaColumn.ToIcebergSchemaColumn()) + } + + return rowsAffected, icebergSchemaColumns, nil +} + +func (writer *IcebergTableWriter) deleteTempDuckdbTable(duckdbTableName string) { + _, err := writer.DuckdbClient.ExecContext(context.Background(), "DROP TABLE IF EXISTS "+duckdbTableName) + PanicIfError(writer.Config, err) } -func (writer *IcebergWriter) deleteObject(key string) { +func (writer *IcebergTableWriter) deleteObject(key string) { var fileName string if strings.Contains(key, "/data/") { fileName = strings.Split(key, "/data/")[1] @@ -502,13 +597,13 @@ func (writer *IcebergWriter) deleteObject(key string) { fileName = strings.Split(key, "/metadata/")[1] } - common.LogInfo(writer.Config, "Deleting object:", fileName) + LogInfo(writer.Config, "Deleting object:", fileName) writer.StorageS3.S3Client.DeleteObject(key) } -func (writer *IcebergWriter) loadCsvRows(duckdbTableName string, csvReader *csv.Reader, loadedSize int64) (loadedRowCount int64, reachedEnd bool) { +func (writer *IcebergTableWriter) loadCsvRows(duckdbTableName string, csvReader *csv.Reader, loadedSize int64) (loadedRowCount int64, reachedEnd bool) { appender, err := writer.DuckdbClient.Appender("", duckdbTableName) - common.PanicIfError(writer.Config, err) + PanicIfError(writer.Config, err) defer appender.Close() for { @@ -517,7 +612,7 @@ func (writer *IcebergWriter) loadCsvRows(duckdbTableName string, csvReader *csv. reachedEnd = true break } - common.PanicIfError(writer.Config, err) + PanicIfError(writer.Config, err) duckdbRowValues := make([]driver.Value, len(writer.IcebergSchemaColumns)) for i, icebergSchemaColumn := range writer.IcebergSchemaColumns { @@ -525,24 +620,24 @@ func (writer *IcebergWriter) loadCsvRows(duckdbTableName string, csvReader *csv. loadedSize += int64(len(row[i])) } - common.LogTrace(writer.Config, "DuckDB appending row values:", duckdbRowValues) + LogTrace(writer.Config, "DuckDB appending row values:", duckdbRowValues) err = appender.AppendRow(duckdbRowValues...) - common.PanicIfError(writer.Config, err) + PanicIfError(writer.Config, err) loadedRowCount++ if loadedSize >= (MAX_LOAD_BATCH_SIZE * writer.CompressionFactor) { - common.LogDebug(writer.Config, "Reached batch size limit") + LogDebug(writer.Config, "Reached batch size limit") break } } - common.LogInfo(writer.Config, "Loaded", loadedRowCount, "rows") + LogInfo(writer.Config, "Loaded", loadedRowCount, "rows") return loadedRowCount, reachedEnd } -func (writer *IcebergWriter) loadJsonRows(duckdbTableName string, jsonQueueReader *JsonQueueReader, loadedSize int64) (loadedRowCount int64, reachedEnd bool) { +func (writer *IcebergTableWriter) loadJsonRows(duckdbTableName string, jsonQueueReader *JsonQueueReader, loadedSize int64) (loadedRowCount int64, reachedEnd bool) { appender, err := writer.DuckdbClient.Appender("", duckdbTableName) - common.PanicIfError(writer.Config, err) + PanicIfError(writer.Config, err) defer appender.Close() for { @@ -552,27 +647,27 @@ func (writer *IcebergWriter) loadJsonRows(duckdbTableName string, jsonQueueReade reachedEnd = true break } - common.PanicIfError(writer.Config, err) + PanicIfError(writer.Config, err) loadedSize += int64(valueSize) duckdbRowValues := writer.jsonToDuckdbRowValues(rowValues) - common.LogTrace(writer.Config, "DuckDB appending row values:", rowValues) + LogTrace(writer.Config, "DuckDB appending row values:", rowValues) err = appender.AppendRow(duckdbRowValues...) - common.PanicIfError(writer.Config, err) + PanicIfError(writer.Config, err) loadedRowCount++ if loadedSize >= (MAX_LOAD_BATCH_SIZE * writer.CompressionFactor) { - common.LogDebug(writer.Config, "Reached batch size limit") + LogDebug(writer.Config, "Reached batch size limit") break } } - common.LogInfo(writer.Config, "Loaded", loadedRowCount, "rows") + LogInfo(writer.Config, "Loaded", loadedRowCount, "rows") return loadedRowCount, reachedEnd } -func (writer *IcebergWriter) jsonToDuckdbRowValues(rowValues map[string]interface{}) []driver.Value { +func (writer *IcebergTableWriter) jsonToDuckdbRowValues(rowValues map[string]interface{}) []driver.Value { // Detect row column drift rowColumnNames := []string{} for columnName := range rowValues { @@ -583,13 +678,13 @@ func (writer *IcebergWriter) jsonToDuckdbRowValues(rowValues map[string]interfac tableColumnNames[i] = strings.ToLower(icebergSchemaColumn.ColumnName) // Debezium JSON keys are lowercase } if len(rowColumnNames) != len(tableColumnNames) { - common.Panic(writer.Config, "Row column names count doesn't match table column names count: "+strings.Join(rowColumnNames, ", ")+" (row) vs "+strings.Join(tableColumnNames, ", ")+" (table)") + Panic(writer.Config, "Row column names count doesn't match table column names count: "+strings.Join(rowColumnNames, ", ")+" (row) vs "+strings.Join(tableColumnNames, ", ")+" (table)") } sort.Strings(rowColumnNames) sort.Strings(tableColumnNames) for i := range rowColumnNames { if rowColumnNames[i] != tableColumnNames[i] { - common.Panic(writer.Config, "Row column names don't match table column names: "+strings.Join(rowColumnNames, ", ")+" (row) vs "+strings.Join(tableColumnNames, ", ")+" (table)") + Panic(writer.Config, "Row column names don't match table column names: "+strings.Join(rowColumnNames, ", ")+" (row) vs "+strings.Join(tableColumnNames, ", ")+" (table)") } } @@ -603,7 +698,7 @@ func (writer *IcebergWriter) jsonToDuckdbRowValues(rowValues map[string]interfac return duckdbRowValues } -func (writer *IcebergWriter) formattedParquetFileSize(parquetFileSize int64) string { +func (writer *IcebergTableWriter) formattedParquetFileSize(parquetFileSize int64) string { if parquetFileSize < 1024 { return Int64ToString(parquetFileSize) + "B" } else if parquetFileSize < 1024*1024 { diff --git a/src/syncer-common/json_queue.go b/src/common/json_queue.go similarity index 98% rename from src/syncer-common/json_queue.go rename to src/common/json_queue.go index e3ddb69..8052859 100644 --- a/src/syncer-common/json_queue.go +++ b/src/common/json_queue.go @@ -1,4 +1,4 @@ -package syncerCommon +package common import ( "encoding/binary" diff --git a/src/syncer-common/json_queue_test.go b/src/common/json_queue_test.go similarity index 89% rename from src/syncer-common/json_queue_test.go rename to src/common/json_queue_test.go index cebbdf3..14da512 100644 --- a/src/syncer-common/json_queue_test.go +++ b/src/common/json_queue_test.go @@ -1,13 +1,11 @@ -package syncerCommon +package common import ( "testing" - - "github.com/BemiHQ/BemiDB/src/common" ) func TestJsonQueue(t *testing.T) { - config := &common.CommonConfig{ + config := &CommonConfig{ LogLevel: "DEBUG", } buffer := NewCappedBuffer(config, 1024) diff --git a/src/common/set.go b/src/common/set.go index cd684ff..ff847d9 100644 --- a/src/common/set.go +++ b/src/common/set.go @@ -19,6 +19,11 @@ func (set Set[T]) AddAll(items []T) Set[T] { return set } +func (set Set[T]) Remove(item T) Set[T] { + delete(set, item) + return set +} + func (set Set[T]) Contains(item T) bool { _, ok := set[item] return ok diff --git a/src/syncer-common/storage_s3.go b/src/common/storage_s3.go similarity index 74% rename from src/syncer-common/storage_s3.go rename to src/common/storage_s3.go index 9095ad0..717feeb 100644 --- a/src/syncer-common/storage_s3.go +++ b/src/common/storage_s3.go @@ -1,14 +1,15 @@ -package syncerCommon +package common import ( "context" + "encoding/json" "fmt" "io" "os" + "reflect" "strings" "time" - "github.com/BemiHQ/BemiDB/src/common" "github.com/google/uuid" "github.com/xitongsys/parquet-go-source/s3v2" ) @@ -18,8 +19,8 @@ const ( ) type StorageS3 struct { - S3Client *common.S3Client - Config *common.CommonConfig + S3Client *S3Client + Config *CommonConfig StorageUtils *StorageUtils } @@ -71,9 +72,30 @@ type MetadataFile struct { Key string } -func NewStorageS3(Config *common.CommonConfig) *StorageS3 { +type IcebergTableField struct { + Name string + Type string + Required bool + IsList bool +} + +func (tableField IcebergTableField) ToSql() string { + sql := fmt.Sprintf(`"%s" %s`, tableField.Name, tableField.Type) + + if tableField.IsList { + sql += "[]" + } + + if tableField.Required { + sql += " NOT NULL" + } + + return sql +} + +func NewStorageS3(Config *CommonConfig) *StorageS3 { return &StorageS3{ - S3Client: common.NewS3Client(Config), + S3Client: NewS3Client(Config), Config: Config, StorageUtils: NewStorageUtils(Config), } @@ -81,7 +103,7 @@ func NewStorageS3(Config *common.CommonConfig) *StorageS3 { // Write --------------------------------------------------------------------------------------------------------------- -func (storage *StorageS3) CreateParquet(dataS3Path string, duckdbClient *common.DuckdbClient, tempDuckdbTableName string, icebergSchemaColumns []*IcebergSchemaColumn, rowCount int64) ParquetFile { +func (storage *StorageS3) CreateParquet(dataS3Path string, duckdbClient *DuckdbClient, tempDuckdbTableName string, icebergSchemaColumns []*IcebergSchemaColumn, rowCount int64) ParquetFile { ctx := context.Background() fileName := storage.generateTimestampString() + "_" + uuid.New().String() + ".parquet" fileS3Path := dataS3Path + "/" + fileName @@ -93,7 +115,7 @@ func (storage *StorageS3) CreateParquet(dataS3Path string, duckdbClient *common. fileSize := *headObjectOutput.ContentLength fileReader, err := s3v2.NewS3FileReaderWithClient(ctx, storage.S3Client.S3, storage.Config.Aws.S3Bucket, fileS3Key) - common.PanicIfError(storage.Config, err) + PanicIfError(storage.Config, err) parquetStats := storage.StorageUtils.ReadParquetStats(fileReader, icebergSchemaColumns) return ParquetFile{ @@ -113,9 +135,9 @@ func (storage *StorageS3) CreateManifest(metadataS3Path string, parquetFilesSort storage.uploadTemporaryFile("manifest", fileS3Key, func(tempFile *os.File) { var err error fileSize, err = storage.StorageUtils.WriteManifestFile(tempFile.Name(), parquetFilesSortedAsc) - common.PanicIfError(storage.Config, err) + PanicIfError(storage.Config, err) }) - common.LogDebug(storage.Config, "Manifest file created at:", fileS3Key) + LogDebug(storage.Config, "Manifest file created at:", fileS3Key) var totalRecordCount int64 for _, parquetFile := range parquetFilesSortedAsc { @@ -139,10 +161,10 @@ func (storage *StorageS3) CreateManifestList(metadataS3Path string, totalDataFil storage.uploadTemporaryFile("manifest-list", fileS3Key, func(tempFile *os.File) { var err error manifestListFile, err = storage.StorageUtils.WriteManifestListFile(tempFile.Name(), totalDataFileSize, manifestListItemsSortedDesc) - common.PanicIfError(storage.Config, err) + PanicIfError(storage.Config, err) }) - common.LogDebug(storage.Config, "Manifest list file created at:", fileS3Key) + LogDebug(storage.Config, "Manifest list file created at:", fileS3Key) manifestListFile.Key = fileS3Key manifestListFile.Path = metadataS3Path + "/" + fileName return manifestListFile @@ -154,10 +176,10 @@ func (storage *StorageS3) CreateMetadata(metadataS3Path string, icebergSchemaCol storage.uploadTemporaryFile("metadata", fileS3Key, func(tempFile *os.File) { tableS3Path := strings.TrimSuffix(metadataS3Path, "/metadata") err := storage.StorageUtils.WriteMetadataFile(tableS3Path, tempFile.Name(), icebergSchemaColumns, manifestListFilesSortedAsc) - common.PanicIfError(storage.Config, err) + PanicIfError(storage.Config, err) }) - common.LogDebug(storage.Config, "Metadata file created at:", fileS3Key) + LogDebug(storage.Config, "Metadata file created at:", fileS3Key) return MetadataFile{Version: 1, Key: fileS3Key} } @@ -168,6 +190,11 @@ func (storage *StorageS3) DeleteTableFiles(tableS3Path string) { // Read ---------------------------------------------------------------------------------------------------------------- +func (storage *StorageS3) IcebergTableFields(metadataS3Path string) ([]IcebergTableField, error) { + metadataContent := storage.readObjectContent(metadataS3Path) + return storage.parseIcebergTableFields(metadataContent) +} + func (storage *StorageS3) LastManifestListFile(metadataS3Path string) ManifestListFile { metadataContent := storage.readObjectContent(metadataS3Path) return storage.StorageUtils.ParseLastManifestListFile(storage.S3Client.BucketS3Prefix(), metadataContent) @@ -187,7 +214,7 @@ func (storage *StorageS3) ParquetFiles(manifestFile ManifestFile, icebergSchemaC fileS3Key := storage.S3Client.ObjectKey(parquetFile.Path) fileReader, err := s3v2.NewS3FileReaderWithClient(ctx, storage.S3Client.S3, storage.Config.Aws.S3Bucket, fileS3Key) - common.PanicIfError(storage.Config, err) + PanicIfError(storage.Config, err) parquetStats := storage.StorageUtils.ReadParquetStats(fileReader, icebergSchemaColumns) parquetFilesSortedAsc[i].Key = fileS3Key @@ -206,7 +233,7 @@ func (storage *StorageS3) generateTimestampString() string { func (storage *StorageS3) uploadTemporaryFile(tempFilePattern string, uploadFileS3Key string, writeTempFileFunc func(*os.File)) { tempFile, err := os.CreateTemp("", tempFilePattern) - common.PanicIfError(storage.Config, err) + PanicIfError(storage.Config, err) defer func() { os.Remove(tempFile.Name()) @@ -217,7 +244,7 @@ func (storage *StorageS3) uploadTemporaryFile(tempFilePattern string, uploadFile storage.S3Client.UploadObject(uploadFileS3Key, tempFile) err = tempFile.Close() - common.PanicIfError(storage.Config, err) + PanicIfError(storage.Config, err) } func (storage *StorageS3) readObjectContent(fileS3Path string) []byte { @@ -225,7 +252,7 @@ func (storage *StorageS3) readObjectContent(fileS3Path string) []byte { getObjectResponse := storage.S3Client.GetObject(fileS3Key) fileContent, err := io.ReadAll(getObjectResponse.Body) - common.PanicIfError(storage.Config, err) + PanicIfError(storage.Config, err) return fileContent } @@ -235,14 +262,46 @@ func (storage *StorageS3) deleteNestedObjects(prefixS3Key string) { var fileS3Keys []*string for _, obj := range listResponse.Contents { - common.LogDebug(storage.Config, "Object to delete:", *obj.Key) + LogDebug(storage.Config, "Object to delete:", *obj.Key) fileS3Keys = append(fileS3Keys, obj.Key) } if len(fileS3Keys) > 0 { storage.S3Client.DeleteObjects(fileS3Keys) - common.LogDebug(storage.Config, "Deleted", len(fileS3Keys), "object(s).") + LogDebug(storage.Config, "Deleted", len(fileS3Keys), "object(s).") } else { - common.LogDebug(storage.Config, "No objects to delete.") + LogDebug(storage.Config, "No objects to delete.") } } + +func (storage *StorageS3) parseIcebergTableFields(metadataContent []byte) ([]IcebergTableField, error) { + var metadataJson MetadataJson + err := json.Unmarshal(metadataContent, &metadataJson) + if err != nil { + return nil, err + } + + var icebergTableFields []IcebergTableField + schema := metadataJson.Schemas[len(metadataJson.Schemas)-1] // Get the last schema + if schema.Fields != nil { + for _, field := range schema.Fields { + icebergTableField := IcebergTableField{ + Name: field.Name, + } + + if reflect.TypeOf(field.Type).Kind() == reflect.String { + icebergTableField.Type = field.Type.(string) + icebergTableField.Required = field.Required + } else { + listType := field.Type.(map[string]interface{}) + icebergTableField.Type = listType["element"].(string) + icebergTableField.Required = listType["element-required"].(bool) + icebergTableField.IsList = true + } + + icebergTableFields = append(icebergTableFields, icebergTableField) + } + } + + return icebergTableFields, nil +} diff --git a/src/syncer-common/storage_utils.go b/src/common/storage_utils.go similarity index 96% rename from src/syncer-common/storage_utils.go rename to src/common/storage_utils.go index cc65e53..75aff4b 100644 --- a/src/syncer-common/storage_utils.go +++ b/src/common/storage_utils.go @@ -1,4 +1,4 @@ -package syncerCommon +package common import ( "bytes" @@ -9,7 +9,6 @@ import ( "strings" "time" - "github.com/BemiHQ/BemiDB/src/common" "github.com/google/uuid" "github.com/linkedin/goavro" "github.com/xitongsys/parquet-go/reader" @@ -62,10 +61,10 @@ type ManifestListSequenceStats struct { } type StorageUtils struct { - Config *common.CommonConfig + Config *CommonConfig } -func NewStorageUtils(config *common.CommonConfig) *StorageUtils { +func NewStorageUtils(config *CommonConfig) *StorageUtils { return &StorageUtils{ Config: config, } @@ -73,13 +72,13 @@ func NewStorageUtils(config *common.CommonConfig) *StorageUtils { // Write --------------------------------------------------------------------------------------------------------------- -func (utils *StorageUtils) WriteParquetFile(fileS3Path string, duckdbClient *common.DuckdbClient, tempDuckdbTableName string, icebergSchemaColumns []*IcebergSchemaColumn) { +func (utils *StorageUtils) WriteParquetFile(fileS3Path string, duckdbClient *DuckdbClient, tempDuckdbTableName string, icebergSchemaColumns []*IcebergSchemaColumn) { fieldIds := make([]string, len(icebergSchemaColumns)) for i, col := range icebergSchemaColumns { if col.IsList { - fieldIds[i] = col.QuotedColumnName() + ":{__duckdb_field_id: " + common.IntToString(col.Position) + ", element: " + common.IntToString(PARQUET_NESTED_FIELD_ID_PREFIX+col.Position) + "}" + fieldIds[i] = col.QuotedColumnName() + ":{__duckdb_field_id: " + IntToString(col.Position) + ", element: " + IntToString(PARQUET_NESTED_FIELD_ID_PREFIX+col.Position) + "}" } else { - fieldIds[i] = col.QuotedColumnName() + ":" + common.IntToString(col.Position) + fieldIds[i] = col.QuotedColumnName() + ":" + IntToString(col.Position) } } @@ -88,14 +87,14 @@ func (utils *StorageUtils) WriteParquetFile(fileS3Path string, duckdbClient *com "fileS3Path": fileS3Path, "fieldIds": strings.Join(fieldIds, ","), }) - common.PanicIfError(utils.Config, err) + PanicIfError(utils.Config, err) } func (utils *StorageUtils) ReadParquetStats(fileReader source.ParquetFile, icebergSchemaColumns []*IcebergSchemaColumn) (parquetStats ParquetFileStats) { defer fileReader.Close() pr, err := reader.NewParquetReader(fileReader, nil, 1) - common.PanicIfError(utils.Config, err) + PanicIfError(utils.Config, err) defer pr.ReadStop() parquetStats = ParquetFileStats{ @@ -107,7 +106,7 @@ func (utils *StorageUtils) ReadParquetStats(fileReader source.ParquetFile, icebe SplitOffsets: []int64{}, } - stringColumnNames := common.NewSet[string]() + stringColumnNames := NewSet[string]() fieldIdByColumnName := make(map[string]int) for _, column := range icebergSchemaColumns { columnName := strings.ToLower(column.NormalizedColumnName()) @@ -291,7 +290,7 @@ func (utils *StorageUtils) WriteManifestListFile(filePath string, totalDataFileS for i, manifestListItem := range manifestListItemsSortedDesc { sequenceNumber := manifestListItem.SequenceNumber - sequenceStats := statsBySequenceNumber[common.IntToString(sequenceNumber)] + sequenceStats := statsBySequenceNumber[IntToString(sequenceNumber)] manifestFile := manifestListItem.ManifestFile manifestListRecord := map[string]interface{}{ @@ -325,7 +324,7 @@ func (utils *StorageUtils) WriteManifestListFile(filePath string, totalDataFileS sequenceStats.TotalRecords += manifestFile.TotalRecordCount } - statsBySequenceNumber[common.IntToString(sequenceNumber)] = sequenceStats + statsBySequenceNumber[IntToString(sequenceNumber)] = sequenceStats manifestListEntries[i] = manifestListRecord } @@ -355,7 +354,7 @@ func (utils *StorageUtils) WriteManifestListFile(filePath string, totalDataFileS } lastManifestListItem := manifestListItemsSortedDesc[0] - lastSequenceStats := statsBySequenceNumber[common.IntToString(lastManifestListItem.SequenceNumber)] + lastSequenceStats := statsBySequenceNumber[IntToString(lastManifestListItem.SequenceNumber)] manifestListFile := ManifestListFile{ SequenceNumber: lastManifestListItem.SequenceNumber, @@ -499,7 +498,7 @@ func (utils *StorageUtils) WriteMetadataFile(s3TablePath string, filePath string func (utils *StorageUtils) ParseLastManifestListFile(bucketS3Prefix string, metadataContent []byte) ManifestListFile { var manifestListsJson ManifestListsJson err := json.Unmarshal(metadataContent, &manifestListsJson) - common.PanicIfError(utils.Config, err) + PanicIfError(utils.Config, err) snapshot := manifestListsJson.Snapshots[len(manifestListsJson.Snapshots)-1] @@ -518,13 +517,13 @@ func (utils *StorageUtils) ParseLastManifestListFile(bucketS3Prefix string, meta func (utils *StorageUtils) ParseManifestListItems(bucketS3Prefix string, manifestListFileContent []byte) []ManifestListItem { ocfReader, err := goavro.NewOCFReader(strings.NewReader(string(manifestListFileContent))) - common.PanicIfError(utils.Config, err) + PanicIfError(utils.Config, err) manifestListItemsSortedDesc := []ManifestListItem{} for ocfReader.Scan() { record, err := ocfReader.Read() - common.PanicIfError(utils.Config, err) + PanicIfError(utils.Config, err) recordMap := record.(map[string]interface{}) @@ -546,13 +545,13 @@ func (utils *StorageUtils) ParseManifestListItems(bucketS3Prefix string, manifes func (utils *StorageUtils) ParseParquetFiles(manifestContent []byte) []ParquetFile { ocfReader, err := goavro.NewOCFReader(strings.NewReader(string(manifestContent))) - common.PanicIfError(utils.Config, err) + PanicIfError(utils.Config, err) parquetFilesSortedAsc := []ParquetFile{} for ocfReader.Scan() { record, err := ocfReader.Read() - common.PanicIfError(utils.Config, err) + PanicIfError(utils.Config, err) recordMap := record.(map[string]interface{}) dataFile := recordMap["data_file"].(map[string]interface{}) diff --git a/src/common/utils.go b/src/common/utils.go index 1f2c994..611616f 100644 --- a/src/common/utils.go +++ b/src/common/utils.go @@ -1,8 +1,15 @@ package common import ( + "bytes" + "encoding/base64" + "encoding/hex" + "encoding/json" + "net/http" + "runtime" "strconv" "strings" + "time" ) func IntToString(i int) string { @@ -12,3 +19,118 @@ func IntToString(i int) string { func IsLocalHost(host string) bool { return strings.HasPrefix(host, "127.0.0.1") || strings.HasPrefix(host, "localhost") } + +func Int64ToString(i int64) string { + return strconv.FormatInt(i, 10) +} + +func Float64ToString(i float64) string { + return strconv.FormatFloat(i, 'f', -1, 64) +} + +func StringToInt(s string) int { + int, err := strconv.Atoi(s) + if err != nil { + panic(err) + } + + return int +} + +func StringToInt64(s string) int64 { + int64Value, err := strconv.ParseInt(s, 10, 64) + if err != nil { + panic(err) + } + + return int64Value +} + +func StringToFloat64(s string) float64 { + floatValue, err := strconv.ParseFloat(s, 64) + if err != nil { + panic(err) + } + + return floatValue +} + +func StringDateToTime(str string) time.Time { + // Golang's time.Parse() function does not support parsing dates with 5+ digit years + // So we need to handle this case manually by parsing the year separately + var nonStandardYear int + parts := strings.Split(str, "-") + if len(parts) == 3 && len(parts[0]) > 4 { + nonStandardYear = StringToInt(parts[0]) + str = str[len(parts[0])-4:] // Remove the prefix from str leaving only the standard 10 characters (YYYY-MM-DD) + } + + // Parse the date string as a standard date + parsedTime, err := time.Parse("2006-01-02", str) + + // If the year is non-standard, add the year difference to the parsed time after parsing + if err == nil && nonStandardYear != 0 { + parsedTime = parsedTime.AddDate(nonStandardYear-parsedTime.Year(), 0, 0) + return parsedTime + } + + return parsedTime +} + +func HexToString(s string) (string, error) { + decoded, err := hex.DecodeString(s) + if err != nil { + return "", err + } + return string(decoded), nil +} + +func Base64ToHex(s string) string { + decoded, err := base64.StdEncoding.DecodeString(s) + if err != nil { + panic(err) + } + return strings.ToUpper(hex.EncodeToString(decoded)) +} + +func TimeToUtcStringMs(t time.Time) string { + return t.UTC().Format("2006-01-02 15:04:05.999999") +} + +func StringMsToUtcTime(s string) time.Time { + t, err := time.Parse("2006-01-02 15:04:05.999999", s) + if err != nil { + panic(err) + } + return t.UTC() +} + +type AnonymousAnalyticsData struct { + Command string `json:"command"` + OsName string `json:"osName"` + Version string `json:"version"` + S3Bucket string `json:"s3Bucket"` + Name string `json:"name"` +} + +func SendAnonymousAnalytics(config *CommonConfig, command string, name string) { + if config.DisableAnonymousAnalytics { + return + } + + data := AnonymousAnalyticsData{ + Command: command, + OsName: runtime.GOOS + "-" + runtime.GOARCH, + Version: VERSION, + S3Bucket: config.Aws.S3Endpoint + "/" + config.Aws.S3Bucket, + Name: name, + } + + jsonData, err := json.Marshal(data) + if err != nil { + return + } + + client := http.Client{Timeout: 5 * time.Second} + _, _ = client.Post("https://api.bemidb.com/api/analytics", "application/json", bytes.NewBuffer(jsonData)) +} diff --git a/src/server/custom_types.go b/src/server/custom_types.go index 4889031..835ce5c 100644 --- a/src/server/custom_types.go +++ b/src/server/custom_types.go @@ -1,32 +1,10 @@ package main import ( - "fmt" "strings" -) - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -type IcebergTableField struct { - Name string - Type string - Required bool - IsList bool -} - -func (tableField IcebergTableField) ToSql() string { - sql := fmt.Sprintf(`"%s" %s`, tableField.Name, tableField.Type) - if tableField.IsList { - sql += "[]" - } - - if tableField.Required { - sql += " NOT NULL" - } - - return sql -} + "github.com/BemiHQ/BemiDB/src/common" +) //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -56,15 +34,15 @@ func NewQuerySchemaTableFromString(schemaTable string) QuerySchemaTable { return qSchemaTable } -func (qSchemaTable QuerySchemaTable) ToIcebergSchemaTable() IcebergSchemaTable { +func (qSchemaTable QuerySchemaTable) ToIcebergSchemaTable() common.IcebergSchemaTable { if qSchemaTable.Schema == "" { - return IcebergSchemaTable{ + return common.IcebergSchemaTable{ Schema: PG_SCHEMA_PUBLIC, Table: qSchemaTable.Table, } } - return IcebergSchemaTable{ + return common.IcebergSchemaTable{ Schema: qSchemaTable.Schema, Table: qSchemaTable.Table, } diff --git a/src/server/go.mod b/src/server/go.mod index 67159e3..b4748ff 100644 --- a/src/server/go.mod +++ b/src/server/go.mod @@ -15,6 +15,8 @@ replace github.com/BemiHQ/BemiDB/src/common => ../common require ( github.com/apache/arrow-go/v18 v18.4.0 // indirect + github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 // indirect + github.com/apache/thrift v0.22.0 // indirect github.com/aws/aws-sdk-go-v2 v1.37.0 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 // indirect github.com/aws/aws-sdk-go-v2/config v1.30.1 // indirect @@ -42,14 +44,18 @@ require ( github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11 // indirect github.com/go-viper/mapstructure/v2 v2.3.0 // indirect github.com/goccy/go-json v0.10.5 // indirect + github.com/golang/snappy v1.0.0 // indirect github.com/google/flatbuffers v25.2.10+incompatible // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect github.com/klauspost/compress v1.18.0 // indirect github.com/klauspost/cpuid/v2 v2.2.11 // indirect + github.com/linkedin/goavro v2.1.0+incompatible // indirect github.com/marcboeker/go-duckdb/arrowmapping v0.0.9 // indirect github.com/marcboeker/go-duckdb/mapping v0.0.10 // indirect github.com/pierrec/lz4/v4 v4.1.22 // indirect + github.com/xitongsys/parquet-go v1.6.2 // indirect + github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b // indirect github.com/zeebo/xxh3 v1.0.2 // indirect golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect golang.org/x/mod v0.25.0 // indirect diff --git a/src/server/go.sum b/src/server/go.sum index 3fe7d82..d27f4e3 100644 --- a/src/server/go.sum +++ b/src/server/go.sum @@ -1,50 +1,248 @@ +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.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.66.0/go.mod h1:dgqGAjKCDxyhGTtC9dAREQGUJpkceNm1yt590Qno0Ko= +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.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.82.0/go.mod h1:vlKccHJGuFBFufnAnuB08dfEH9Y3H7dzDzRECFdC2TA= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= +cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +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 v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= +cloud.google.com/go/compute v1.2.0/go.mod h1:xlogom/6gr8RJGBe7nT2eGsQYAFUbbv8dbC29qE3Xmw= +cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= +cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= +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/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= +cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= +cloud.google.com/go/iam v0.1.1/go.mod h1:CKqrcnI/suGpybEHxZ7BMehL0oA4LpdyJdUlTl9jVMw= +cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= +cloud.google.com/go/kms v1.1.0/go.mod h1:WdbppnCDMDpOvoYBMn1+gNmOeEoZYqAv+HeuKARGCXI= +cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= +cloud.google.com/go/monitoring v1.1.0/go.mod h1:L81pzz7HKn14QCMaCs6NTQkdBnE87TElyanS95vIcl4= +cloud.google.com/go/monitoring v1.4.0/go.mod h1:y6xnxfwI3hTFWOdkOaD7nfJVlwuC3/mS/5kvtT131p4= +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/pubsub v1.19.0/go.mod h1:/O9kmSe9bb9KRnIAWkzmqhPjHo6LtzGOBYd/kr06XSs= +cloud.google.com/go/secretmanager v1.3.0/go.mod h1:+oLTkouyiYiabAQNugCeTS3PAArGiMJuBqvJnJsyH+U= +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.12.0/go.mod h1:fFLk2dp2oAhDz8QFKwqrjdJvxSp/W2g7nillojlL5Ho= +cloud.google.com/go/storage v1.21.0/go.mod h1:XmRlxkgPjlBONznT2dDUU/5XlpU2OjMnKuqnZI01LAA= +cloud.google.com/go/trace v1.0.0/go.mod h1:4iErSByzxkyHWzzlAj63/Gmjz0NH1ASqhJguHpGcr6A= +cloud.google.com/go/trace v1.2.0/go.mod h1:Wc8y/uYyOhPy12KEnXG9XGrvfMz5F5SrYecQlbW1rwM= +contrib.go.opencensus.io/exporter/aws v0.0.0-20200617204711-c478e41e60e9/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= +contrib.go.opencensus.io/exporter/stackdriver v0.13.10/go.mod h1:I5htMbyta491eUxufwwZPQdcKvvgzMB4O9ni41YnIM8= +contrib.go.opencensus.io/integrations/ocsql v0.1.7/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/Azure/azure-amqp-common-go/v3 v3.2.1/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= +github.com/Azure/azure-amqp-common-go/v3 v3.2.2/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= +github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k= +github.com/Azure/azure-sdk-for-go v51.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v59.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.0.0/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.0.0/go.mod h1:+6sju8gk8FRmSajX3Oz4G5Gm7P+mbqE9FVaXXFYTkCM= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U= +github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.0.0/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.0.0/go.mod h1:ceIuwmxDWptoW3eCqSXlnPsZFKh4X+R38dWPv7GS9Vs= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.0.0/go.mod h1:s1tW/At+xHqjNFvWU4G0c0Qv33KOhvbGNj0RCTQDV8s= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.2.0/go.mod h1:c+Lifp3EDEamAkPVzMooRNOK6CZjNSdEnf1A7jsI9u4= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.1.0/go.mod h1:7QJP7dr2wznCMeqIrhMgWGf7XpAQnVrJqDm9nvV3Cu4= +github.com/Azure/azure-service-bus-go v0.11.5/go.mod h1:MI6ge2CuQWBVq+ly456MY7XqNLJip5LO1iSFodbNLbU= +github.com/Azure/azure-storage-blob-go v0.14.0/go.mod h1:SMqIBi+SuiQH32bvyjngEewEeXoPfKMgWlBDaYf6fck= +github.com/Azure/go-amqp v0.16.0/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= +github.com/Azure/go-amqp v0.16.4/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= +github.com/Azure/go-autorest/autorest v0.11.19/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= +github.com/Azure/go-autorest/autorest v0.11.22/go.mod h1:BAWYUWGPEtKPzjVkp0Q6an0MJcJDsoh5Z1BFAEFs4Xs= +github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= +github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/adal v0.9.14/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/adal v0.9.17/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= +github.com/Azure/go-autorest/autorest/azure/auth v0.5.9/go.mod h1:hg3/1yw0Bq87O3KvvnJoAh34/0zbP7SFizX/qN5JvjU= +github.com/Azure/go-autorest/autorest/azure/cli v0.4.2/go.mod h1:7qkJkT+j6b+hIpzMOwPChJhTqS8VbsqqgULzMNRugoM= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= +github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= +github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= +github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= +github.com/AzureAD/microsoft-authentication-library-for-go v0.4.0/go.mod h1:Vt9sXTKwMyGcOxSmLDMnGPgqsUg7m8pe215qMLrDXw4= +github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/GoogleCloudPlatform/cloudsql-proxy v1.29.0/go.mod h1:spvB9eLJH9dutlbPSRmHvSXXHOwGRyeXh1jVdquA2G8= +github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/apache/arrow-go/v18 v18.4.0 h1:/RvkGqH517iY8bZKc4FD5/kkdwXJGjxf28JIXbJ/oB0= github.com/apache/arrow-go/v18 v18.4.0/go.mod h1:Aawvwhj8x2jURIzD9Moy72cF0FyJXOpkYpdmGRHcw14= +github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 h1:byKBBF2CKWBjjA4J1ZL2JXttJULvWSl50LegTyRZ728= +github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516/go.mod h1:QNYViu/X0HXDHw7m3KXzWSVXIbfUvJqBFe6Gj8/pYA0= +github.com/apache/thrift v0.0.0-20181112125854-24918abba929/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.14.2/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.22.0 h1:r7mTJdj51TMDe6RtcmNdQxgn9XcyfGDOzegMDRg47uc= github.com/apache/thrift v0.22.0/go.mod h1:1e7J/O1Ae6ZQMTYdy9xa3w9k+XHWPfRvdPyJeynQ+/g= +github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= +github.com/aws/aws-sdk-go v1.30.19/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= +github.com/aws/aws-sdk-go v1.37.0/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= +github.com/aws/aws-sdk-go v1.43.31 h1:yJZIr8nMV1hXjAvvOLUFqZRJcHV7udPQBfhJqawDzI0= +github.com/aws/aws-sdk-go v1.43.31/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= +github.com/aws/aws-sdk-go-v2 v1.16.2/go.mod h1:ytwTPBG6fXTZLxxeeCCWj2/EMYp/xDUgX+OET6TLNNU= +github.com/aws/aws-sdk-go-v2 v1.23.0/go.mod h1:i1XDttT4rnf6vxc9AuskLc6s7XBee8rlLilKlc03uAA= github.com/aws/aws-sdk-go-v2 v1.37.0 h1:YtCOESR/pN4j5oA7cVHSfOwIcuh/KwHC4DOSXFbv5F0= github.com/aws/aws-sdk-go-v2 v1.37.0/go.mod h1:9Q0OoGQoboYIAJyslFyF1f5K1Ryddop8gqMhWx/n4Wg= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.1/go.mod h1:n8Bs1ElDD2wJ9kCRTczA83gYbBmjSwZp3umc6zF4EeM= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.1/go.mod h1:t8PYl/6LzdAqsU4/9tz28V/kU+asFePvpOMkdul0gEQ= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 h1:6GMWV6CNpA/6fbFHnoAjrv4+LGfyTqZz2LtCHnspgDg= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0/go.mod h1:/mXlTIVG9jbxkqDnr5UQNQxW1HRYxeGklkM9vAFeabg= +github.com/aws/aws-sdk-go-v2/config v1.15.3/go.mod h1:9YL3v07Xc/ohTsxFXzan9ZpFpdTOFl4X65BAKYaz8jg= +github.com/aws/aws-sdk-go-v2/config v1.25.3/go.mod h1:tAByZy03nH5jcq0vZmkcVoo6tRzRHEwSFx3QW4NmDw8= github.com/aws/aws-sdk-go-v2/config v1.30.1 h1:sHL8g/+9tcZATeV2tEkEfxZeaNokDtKsSjGMGHD49qA= github.com/aws/aws-sdk-go-v2/config v1.30.1/go.mod h1:wkibEyFfxXRyTSzRU4bbF5IUsSXyE4xQ4ZjkGmi5tFo= +github.com/aws/aws-sdk-go-v2/credentials v1.11.2/go.mod h1:j8YsY9TXTm31k4eFhspiQicfXPLZ0gYXA50i4gxPE8g= +github.com/aws/aws-sdk-go-v2/credentials v1.16.2/go.mod h1:sDdvGhXrSVT5yzBDR7qXz+rhbpiMpUYfF3vJ01QSdrc= github.com/aws/aws-sdk-go-v2/credentials v1.18.1 h1:E55xvOqlX7CvB66Z7rSM9usCrFU1ryUIUHqiXsEzVoE= github.com/aws/aws-sdk-go-v2/credentials v1.18.1/go.mod h1:iobSQfR5MkvILxssGOvi/P1jjOhrRzfTiCPCzku0vx4= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.3/go.mod h1:uk1vhHHERfSVCUnqSqz8O48LBYDSC+k6brng09jcMOk= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.4/go.mod h1:t4i+yGHMCcUNIX1x7YVYa6bH/Do7civ5I6cG/6PMfyA= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0 h1:9sBTeKQwAvmJUWKIACIoiFSnxxl+sS++YDfr17/ngq0= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0/go.mod h1:LW9/PxQD1SYFC7pnWcgqPhoyZprhjEdg5hBK6qYPLW8= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.3/go.mod h1:0dHuD2HZZSiwfJSy1FO5bX1hQ1TxVV1QXXjpn3XUE44= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.14.0/go.mod h1:UcgIwJ9KHquYxs6Q5skC9qXjhYMK+JASDYcXQ4X7JZE= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1 h1:aAjA/1JZ1xH/F9XvxJu9cXZyp7BqVXtHpztyZ6p799E= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1/go.mod h1:ia9HASsPba/7o84sp6iE4wZPdNTJ0oicBe5sWQQk+Ys= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.9/go.mod h1:AnVH5pvai0pAF4lXRq0bmhbes1u9R8wTE+g+183bZNM= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.3/go.mod h1:7sGSz1JCKHWWBHq98m6sMtWQikmYPpxjqOydDemiVoM= github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0 h1:H2iZoqW/v2Jnrh1FnU725Bq6KJ0k2uP63yH+DcY+HUI= github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0/go.mod h1:L0FqLbwMXHvNC/7crWV1iIxUlOKYZUE8KuTIA+TozAI= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.3/go.mod h1:ssOhaLpRlh88H3UmEcsBoVKq309quMvm3Ds8e9d4eJM= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.3/go.mod h1:ify42Rb7nKeDDPkFjKn7q1bPscVPu/+gmHH8d2c+anU= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0 h1:EDped/rNzAhFPhVY0sDGbtD16OKqksfA8OjF/kLEgw8= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0/go.mod h1:uUI335jvzpZRPpjYx6ODc/wg1qH+NnoSTK/FwVeK0C0= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.10/go.mod h1:8DcYQcz0+ZJaSxANlHIsbbi6S+zMwjwdDqwW3r9AzaE= +github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.3/go.mod h1:5yzAuE9i2RkVAttBl8yxZgQr5OCq4D5yDnG7j9x2L0U= github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0 h1:iLvW/zOkHGU3BDU5thWnj+UZ9pjhuVhv1loLj7yVtBw= github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0/go.mod h1:Fn3gvhdF1x5Rs9nUoCy/fJT1ms8f8dO7RqM9lJHuazQ= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.1/go.mod h1:GeUru+8VzrTXV/83XyMJ80KpH8xO89VPoUileyNQ+tc= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1/go.mod h1:l9ymW25HOqymeU2m1gbUQ3rUIsTwKs8gYHXkqDQUhiI= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 h1:6+lZi2JeGKtCraAj1rpoZfKqnQ9SptseRZioejfUOLM= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0/go.mod h1:eb3gfbVIxIoGgJsi9pGne19dhCBpK6opTYpQqAmdy44= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.3/go.mod h1:Seb8KNmD6kVTjwRjVEgOT5hPin6sq+v4C2ycJQDwuH8= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.3/go.mod h1:R+/S1O4TYpcktbVwddeOYg+uwUfLhADP2S/x4QwsCTM= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0 h1:qGyLBQPphYzUf+IIlb5tHnvg1U2Vc5hXPcP7oRSQfy0= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0/go.mod h1:g+dzKSLXiR/8ATkPXmLhPOI6rDdjLP3tngeo3FvDcIw= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.3/go.mod h1:wlY6SVjuwvh3TVRpTqdy4I1JpBFLX4UGeKZdWntaocw= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.3/go.mod h1:Owv1I59vaghv1Ax8zz8ELY8DN7/Y0rGS+WWAmjgi950= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0 h1:eRhU3Sh8dGbaniI6B+I48XJMrTPRkK4DKo+vqIxziOU= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0/go.mod h1:paNLV18DZ6FnWE/bd06RIKPDIFpjuvCkGKWTG/GDBeM= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.3/go.mod h1:Bm/v2IaN6rZ+Op7zX+bOUMdL4fsrYZiD0dsjLhNKwZc= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.3/go.mod h1:KZgs2ny8HsxRIRbDwgvJcHHBZPOzQr/+NtGwnP+w2ec= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0 h1:6jusT+XCcvnD+Elxvm7bUf5sCMTpZEp3AKjYQ4tWJSo= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0/go.mod h1:LimGpdIF/sTBdgqwOEkrArXLCoTamK/9L9x8IKBFTIc= +github.com/aws/aws-sdk-go-v2/service/kms v1.16.3/go.mod h1:QuiHPBqlOFCi4LqdSskYYAWpQlx3PKmohy+rE2F+o5g= +github.com/aws/aws-sdk-go-v2/service/s3 v1.26.3/go.mod h1:g1qvDuRsJY+XghsV6zg00Z4KJ7DtFFCx8fJD2a491Ak= +github.com/aws/aws-sdk-go-v2/service/s3 v1.43.0/go.mod h1:NXRKkiRF+erX2hnybnVU660cYT5/KChRD4iUgJ97cI8= github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0 h1:gAV4NEp4A+JOrIdoXkAeyy6IOo7+X2s/jRuaHKYiMaU= github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0/go.mod h1:JIQwK8sZ5MuKGm5rrFwp9MHUcyYEsQNpVixuPDlnwaU= +github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.15.4/go.mod h1:PJc8s+lxyU8rrre0/4a0pn2wgwiDvOEzoOjcJUBr67o= +github.com/aws/aws-sdk-go-v2/service/sns v1.17.4/go.mod h1:kElt+uCcXxcqFyc+bQqZPFD9DME/eC6oHBXvFzQ9Bcw= +github.com/aws/aws-sdk-go-v2/service/sqs v1.18.3/go.mod h1:skmQo0UPvsjsuYYSYMVmrPc1HWCbHUJyrCEp+ZaLzqM= +github.com/aws/aws-sdk-go-v2/service/ssm v1.24.1/go.mod h1:NR/xoKjdbRJ+qx0pMR4mI+N/H1I1ynHwXnO6FowXJc0= +github.com/aws/aws-sdk-go-v2/service/sso v1.11.3/go.mod h1:7UQ/e69kU7LDPtY40OyoHYgRmgfGM4mgsLYtcObdveU= +github.com/aws/aws-sdk-go-v2/service/sso v1.17.2/go.mod h1:/pE21vno3q1h4bbhUOEi+6Zu/aT26UK2WKkDXd+TssQ= github.com/aws/aws-sdk-go-v2/service/sso v1.26.0 h1:cuFWHH87GP1NBGXXfMicUbE7Oty5KpPxN6w4JpmuxYc= github.com/aws/aws-sdk-go-v2/service/sso v1.26.0/go.mod h1:aJBemdlbCKyOXEXdXBqS7E+8S9XTDcOTaoOjtng54hA= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.20.0/go.mod h1:dWqm5G767qwKPuayKfzm4rjzFmVjiBFbOJrpSPnAMDs= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0 h1:t2va+wewPOYIqC6XyJ4MGjiGKkczMAPsgq5W4FtL9ME= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0/go.mod h1:ExCTcqYqN0hYYRsDlBVU8+68grqlWdgX9/nZJwQW4aY= +github.com/aws/aws-sdk-go-v2/service/sts v1.16.3/go.mod h1:bfBj0iVmsUyUg4weDB4NxktD9rDGeKSVWnjTnwbx9b8= +github.com/aws/aws-sdk-go-v2/service/sts v1.25.3/go.mod h1:4EqRHDCKP78hq3zOnmFXu5k0j4bXbRFfCh/zQ6KnEfQ= github.com/aws/aws-sdk-go-v2/service/sts v1.35.0 h1:FD9agdG4CeOGS3ORLByJk56YIXDS7mxFpmZyCtpqExc= github.com/aws/aws-sdk-go-v2/service/sts v1.35.0/go.mod h1:NDzDPbBF1xtSTZUMuZx0w3hIfWzcL7X2AQ0Tr9becIQ= +github.com/aws/smithy-go v1.11.2/go.mod h1:3xHYmszWVx2c0kIwQeEVf9uSm4fYZt67FBJnwub1bgM= +github.com/aws/smithy-go v1.17.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= github.com/aws/smithy-go v1.22.5 h1:P9ATCXPMb2mPjYBgueqJNCA5S9UfktsW0tTxi+a7eqw= github.com/aws/smithy-go v1.22.5/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/bobg/gcsobj v0.1.2/go.mod h1:vS49EQ1A1Ib8FgrL58C8xXYZyOCR2TgzAdopy6/ipa8= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +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/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/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= +github.com/colinmarc/hdfs/v2 v2.1.1/go.mod h1:M3x+k8UKKmxtFu++uAZ0OtDU8jR3jnaZIAc6yK4Ue0c= +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/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU= +github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= +github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= +github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= +github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= +github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= github.com/duckdb/duckdb-go-bindings v0.1.16 h1:XPCk9hzP06PoWIxDPVU3gAy0m1XmLaZHTzLggNx/U9k= github.com/duckdb/duckdb-go-bindings v0.1.16/go.mod h1:pBnfviMzANT/9hi4bg+zW4ykRZZPCXlVuvBWEcZofkc= github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11 h1:GXQkG4HmEbwPtqCSabJTp9wZQQ7Gqr3KveLNesQWQOs= @@ -57,84 +255,911 @@ github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11 h1:j3B1biawuhtxe2Chkiqc github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11/go.mod h1:o7crKMpT2eOIi5/FY6HPqaXcvieeLSqdXXaXbruGX7w= github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11 h1:xR3vRE8y+48U6xDNkUlOfbl7/OTA7FVcDXJ+5vETuHU= github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11/go.mod h1:IlOhJdVKUJCAPj3QsDszUo8DVdvp1nBFp4TUJVdw99s= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +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/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= +github.com/gin-gonic/gin v1.7.3/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= +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-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +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-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= +github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-viper/mapstructure/v2 v2.3.0 h1:27XbWsHIqhbdR5TIC911OfYvgSaW93HM+dX7970Q7jk= github.com/go-viper/mapstructure/v2 v2.3.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-jwt/jwt/v4 v4.4.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188/go.mod h1:vXjM/+wXQnTPR4KqTKDgJukSZ6amVRtWMPEjE6sQoK8= +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/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/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +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.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +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/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/flatbuffers v25.2.10+incompatible h1:F3vclr7C3HpB1k9mxCGRMXq6FdUalZ6H/pNX4FP1v0Q= github.com/google/flatbuffers v25.2.10+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +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.6/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.8/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/go-replayers/grpcreplay v1.1.0/go.mod h1:qzAvJ8/wi57zq7gWqaE6AwLM6miiXUQwP1S+I9icmhk= +github.com/google/go-replayers/httpreplay v1.1.1/go.mod h1:gN9GeLIs7l6NUoVaSSnv2RiqK1NiwAmD0MrKeC9IIks= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+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/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +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-20200905233945-acf8798be1f7/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-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210506205249-923b5ab0fc1a/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.2.0/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.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/wire v0.5.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU= +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.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/hanwen/go-fuse v1.0.0/go.mod h1:unqXarDXqzAk0rt98O2tVndEPIpUgLD9+rwFisZH3Ok= +github.com/hanwen/go-fuse/v2 v2.1.0/go.mod h1:oRyA5eK+pvJyv5otpO/DgccS8y/RvYMaO00GgRLGryc= +github.com/hashicorp/go-uuid v0.0.0-20180228145832-27454136f036/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +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/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/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.11.0/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= +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/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.2.0/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-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/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.10.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.15.0/go.mod h1:D/zyOyXiaM1TmVWnOM18p0xdDtdakRBa0RsVGI3U3bw= github.com/jackc/pgx/v5 v5.7.5 h1:JHGfMnQY+IEtGM63d+NGMjoRpysB2JBwDr5fsngwmJs= github.com/jackc/pgx/v5 v5.7.5/go.mod h1:aruU7o91Tc2q2cFp5h4uP3f6ztExVpyVv88Xl/8Vl8M= +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.2.1 h1:gI8os0wpRXFd4FiAY2dWiqRK037tjj3t7rKFeO4X5iw= +github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/jcmturner/gofork v0.0.0-20180107083740-2aebee971930/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= +github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +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/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= +github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.13.1/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= github.com/klauspost/cpuid/v2 v2.2.11 h1:0OwqZRYI2rFrjS4kvkDnqJkKHdHaRnCm68/DY4OxRzU= github.com/klauspost/cpuid/v2 v2.2.11/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= +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/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +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/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +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.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/linkedin/goavro v2.1.0+incompatible h1:DV2aUlj2xZiuxQyvag8Dy7zjY69ENjS66bWkSfdpddY= +github.com/linkedin/goavro v2.1.0+incompatible/go.mod h1:bBCwI2eGYpUI/4820s67MElg9tdeLbINjLjiM2xZFYM= github.com/marcboeker/go-duckdb/arrowmapping v0.0.9 h1:xj+kFOqR2gH3Mcxx9LmAVHebSnCiPm303N+uxfkWVmY= github.com/marcboeker/go-duckdb/arrowmapping v0.0.9/go.mod h1:o56AqVS90v5bpxhPnOK9La7AfNTOrMORiqTQrlRbdPQ= github.com/marcboeker/go-duckdb/mapping v0.0.10 h1:b/y2W8/hNlD0Dwjq0mCqIlLXpjQMnWy0WqDV9b9lHQQ= github.com/marcboeker/go-duckdb/mapping v0.0.10/go.mod h1:Ro6Tw6sGG50O8S0daZsA8TrQJz/DvGrzGvMD7Jihirw= github.com/marcboeker/go-duckdb/v2 v2.3.2 h1:96zG2JPyIhCFjHdBjjSpOdhzJzehoGTdl7LskkuMUTs= github.com/marcboeker/go-duckdb/v2 v2.3.2/go.mod h1:VeXz9ZM6klNvICHrXEUzaHSgNqBeTdyMxr4CICw/UaY= +github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= +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.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs= github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI= github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= +github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= +github.com/minio/minio-go/v7 v7.0.34/go.mod h1:nCrRzjoSUQh8hgKKtu3Y708OLvRLtuASMg2/nvmbarw= +github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= +github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/ncw/swift v1.0.52/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= +github.com/pborman/getopt v0.0.0-20180729010549-6fdd0a2c7117/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= github.com/pganalyze/pg_query_go/v6 v6.1.0 h1:jG5ZLhcVgL1FAw4C/0VNQaVmX1SUJx71wBGdtTtBvls= github.com/pganalyze/pg_query_go/v6 v6.1.0/go.mod h1:nvTHIuoud6e1SfrUaFwHqT0i4b5Nr+1rPWVds3B5+50= +github.com/pierrec/lz4/v4 v4.1.8/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= +github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +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/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +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/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.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= 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/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +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.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 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.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/xitongsys/parquet-go v1.5.1/go.mod h1:xUxwM8ELydxh4edHGegYq1pA8NnMKDx0K/GyB0o2bww= +github.com/xitongsys/parquet-go v1.6.2 h1:MhCaXii4eqceKPu9BwrjLqyK10oX9WF+xGhwvwbw7xM= +github.com/xitongsys/parquet-go v1.6.2/go.mod h1:IulAQyalCm0rPiZVNnCgm/PCL64X2tdSVGMQ/UeKqWA= +github.com/xitongsys/parquet-go-source v0.0.0-20190524061010-2b72cbee77d5/go.mod h1:xxCx7Wpym/3QCo6JhujJX51dzSXrwmb0oH6FQb39SEA= +github.com/xitongsys/parquet-go-source v0.0.0-20200817004010-026bad9b25d0/go.mod h1:HYhIKsdns7xz80OgkbgJYrtQY7FjHWHKH6cvN7+czGE= +github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b h1:zbb5qM/t3N+O33Vp5sFyG6yIcWZV1q7rfEjJM8UsRBQ= +github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b/go.mod h1:2ActxmJ4q17Cdruar9nKEkzKSOL1Ol03737Bkz10rTY= +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.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= +github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= +go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0= +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.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +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/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +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.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= +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.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= +gocloud.dev v0.26.0/go.mod h1:mkUgejbnbLotorqDyvedJO20XcZNTynmSeVSQS9btVg= +golang.org/x/crypto v0.0.0-20180723164146-c126467f60eb/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +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-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/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-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-20211115234514-b4de73f9ece8/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220511200225-c6db032c6c88/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= +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-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +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/lint v0.0.0-20210508222113-6edffad5e616/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.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w= golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= +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-20191112182307-2180aed22343/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-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +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-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211020060615-d418f374d309/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220401154927-543a649e0bdd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +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.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +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.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +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-20210220032951-036812b2e83c/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.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +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-20191112214154-59a1497f0cea/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-20200828194041-157a740278f4/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-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/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-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/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-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220204135822-1c1b9b1eba6a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220330033206-e17cdc41300f/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-20220704084225-05e143d24a9e/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.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +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/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +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.5/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.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= +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/time v0.0.0-20211116232009-f0f3c7e86c11/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220224211638-0e9765cccd65/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-20190422233926-fe54fb35175b/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-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-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-20200828161849-5deb26317202/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20200915173823-2db8f0ff891c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20200918232735-d647fc253266/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +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.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo= golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg= +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= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +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.31.0/go.mod h1:CL+9IBCa2WWU6gRuBWaKqGWLFFwbEUXkfeMkHLQWYWo= +google.golang.org/api v0.32.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +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.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.46.0/go.mod h1:ceL4oozhkAiTID8XMmJBsIxID/9wMXJVVFXPg4ylg3I= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.58.0/go.mod h1:cAbP2FsxoGVNwtgNAmmn3y5G1TWAiVYRmg4yku3lv+E= +google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.64.0/go.mod h1:931CdxA8Rm4t6zqTFGSsgwbAEZ2+GMYurbndwSimebM= +google.golang.org/api v0.66.0/go.mod h1:I1dmXYpX7HGwz/ejRxwQp2qj5bFAz93HiCU1C1oYd9M= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.68.0/go.mod h1:sOM8pTpwgflXRhz+oC8H2Dr+UcbMqkPPWNJo88Q7TH8= +google.golang.org/api v0.69.0/go.mod h1:boanBiw+h5c3s+tBPgEzLDRHfFLWV0qXxRHz3ws7C80= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= +google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +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/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-20200513103714-09dca8ec2884/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-20200831141814-d751682dd103/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-20200914193844-75d14daec038/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200921151605-7abf4a1a14d5/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-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210429181445-86c259c2b4ab/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210517163617-5e0236093d7a/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210921142501-181ce0d877f6/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211018162055-cf77aa76bad2/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211223182754-3ac035c7e7cb/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220111164026-67b88f271998/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220114231437-d2e6a121cae0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220201184016-50beb8ab5c44/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220204002441-d6cc3cc0770e/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220211171837-173942840c17/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220216160803-4663080d8bc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220401170504-314d38edb7de/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +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.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +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.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +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.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= 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-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= +gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= +gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q= +gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mNfM5bm88whjWx4= +gopkg.in/jcmturner/gokrb5.v7 v7.3.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= +gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8= +gopkg.in/linkedin/goavro.v1 v1.0.5 h1:BJa69CDh0awSsLUmZ9+BowBdokpduDZSM9Zk8oKHfN4= +gopkg.in/linkedin/goavro.v1 v1.0.5/go.mod h1:Aw5GdAbizjOEl0kAMHV9iHmA8reZzW/OKuJAl4Hb9F0= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/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/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= +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= +nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= +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/src/server/iceberg_catalog.go b/src/server/iceberg_catalog.go deleted file mode 100644 index 310a8bf..0000000 --- a/src/server/iceberg_catalog.go +++ /dev/null @@ -1,94 +0,0 @@ -package main - -import ( - "context" - "fmt" - - "github.com/BemiHQ/BemiDB/src/common" -) - -const ( - TEMP_TABLE_SUFFIX_SYNCING = "-bemidb-syncing" - TEMP_TABLE_SUFFIX_DELETING = "-bemidb-deleting" -) - -type IcebergSchemaTable struct { - Schema string - Table string -} - -func (schemaTable IcebergSchemaTable) String() string { - return fmt.Sprintf(`"%s"."%s"`, schemaTable.Schema, schemaTable.Table) -} - -type IcebergCatalog struct { - Config *Config -} - -func NewIcebergCatalog(config *Config) *IcebergCatalog { - return &IcebergCatalog{Config: config} -} - -func (catalog *IcebergCatalog) Schemas() ([]string, error) { - pgClient := catalog.newPostgresClient() - defer pgClient.Close() - - ctx := context.Background() - rows, err := pgClient.Query(ctx, "SELECT table_namespace FROM iceberg_tables WHERE table_name NOT LIKE '%"+TEMP_TABLE_SUFFIX_SYNCING+"' AND table_name NOT LIKE '%"+TEMP_TABLE_SUFFIX_DELETING+"' GROUP BY table_namespace") - if err != nil { - return nil, err - } - defer rows.Close() - - var schemas []string - for rows.Next() { - var schema string - err := rows.Scan(&schema) - if err != nil { - return nil, err - } - schemas = append(schemas, schema) - } - return schemas, nil -} - -func (catalog *IcebergCatalog) SchemaTables() (common.Set[IcebergSchemaTable], error) { - pgClient := catalog.newPostgresClient() - defer pgClient.Close() - - ctx := context.Background() - rows, err := pgClient.Query(ctx, "SELECT table_namespace, table_name FROM iceberg_tables WHERE table_name NOT LIKE '%"+TEMP_TABLE_SUFFIX_SYNCING+"' AND table_name NOT LIKE '%"+TEMP_TABLE_SUFFIX_DELETING+"'") - if err != nil { - return nil, err - } - defer rows.Close() - - schemaTables := make(common.Set[IcebergSchemaTable]) - for rows.Next() { - var schema, table string - err := rows.Scan(&schema, &table) - if err != nil { - return nil, err - } - schemaTables.Add(IcebergSchemaTable{Schema: schema, Table: table}) - } - return schemaTables, nil -} - -func (catalog *IcebergCatalog) MetadataFileS3Path(t IcebergSchemaTable) string { - pgClient := catalog.newPostgresClient() - defer pgClient.Close() - - ctx := context.Background() - row := pgClient.QueryRow(ctx, "SELECT metadata_location FROM iceberg_tables WHERE table_namespace=$1 AND table_name=$2", t.Schema, t.Table) - - var path string - err := row.Scan(&path) - common.PanicIfError(catalog.Config.CommonConfig, err) - - return path -} - -func (catalog *IcebergCatalog) newPostgresClient() *common.PostgresClient { - return common.NewPostgresClient(catalog.Config.CommonConfig, catalog.Config.CommonConfig.CatalogDatabaseUrl) -} diff --git a/src/server/iceberg_reader.go b/src/server/iceberg_reader.go index e838137..488759f 100644 --- a/src/server/iceberg_reader.go +++ b/src/server/iceberg_reader.go @@ -5,33 +5,41 @@ import ( ) type IcebergReader struct { - Config *Config - Storage *StorageS3 - Catalog *IcebergCatalog + Config *Config + StorageS3 *common.StorageS3 + IcebergCatalog *common.IcebergCatalog } -func NewIcebergReader(config *Config, catalog *IcebergCatalog) *IcebergReader { +func NewIcebergReader(config *Config, storageS3 *common.StorageS3, icebergCatalog *common.IcebergCatalog) *IcebergReader { return &IcebergReader{ - Config: config, - Catalog: catalog, - Storage: NewS3Storage(config), + Config: config, + StorageS3: storageS3, + IcebergCatalog: icebergCatalog, } } func (reader *IcebergReader) Schemas() (icebergSchemas []string, err error) { - return reader.Catalog.Schemas() + return reader.IcebergCatalog.Schemas() } -func (reader *IcebergReader) SchemaTables() (icebergSchemaTables common.Set[IcebergSchemaTable], err error) { - return reader.Catalog.SchemaTables() +func (reader *IcebergReader) SchemaTables() (icebergSchemaTables common.Set[common.IcebergSchemaTable], err error) { + return reader.IcebergCatalog.SchemaTables() } -func (reader *IcebergReader) TableFields(icebergSchemaTable IcebergSchemaTable) (icebergTableFields []IcebergTableField, err error) { +func (reader *IcebergReader) MaterializedViews() (icebergSchemaTables []common.IcebergMaterializedView, err error) { + return reader.IcebergCatalog.MaterializedViews() +} + +func (reader *IcebergReader) MaterializedView(icebergSchemaTable common.IcebergSchemaTable) (icebergMaterializedView common.IcebergMaterializedView, err error) { + return reader.IcebergCatalog.MaterializedView(icebergSchemaTable) +} + +func (reader *IcebergReader) TableFields(icebergSchemaTable common.IcebergSchemaTable) (icebergTableFields []common.IcebergTableField, err error) { metadataPath := reader.MetadataFileS3Path(icebergSchemaTable) common.LogDebug(reader.Config.CommonConfig, "Reading Iceberg table "+icebergSchemaTable.String()+" fields from "+metadataPath+" ...") - return reader.Storage.IcebergTableFields(metadataPath) + return reader.StorageS3.IcebergTableFields(metadataPath) } -func (reader *IcebergReader) MetadataFileS3Path(icebergSchemaTable IcebergSchemaTable) string { - return reader.Catalog.MetadataFileS3Path(icebergSchemaTable) +func (reader *IcebergReader) MetadataFileS3Path(icebergSchemaTable common.IcebergSchemaTable) string { + return reader.IcebergCatalog.MetadataFileS3Path(icebergSchemaTable) } diff --git a/src/server/iceberg_writer.go b/src/server/iceberg_writer.go new file mode 100644 index 0000000..63b747b --- /dev/null +++ b/src/server/iceberg_writer.go @@ -0,0 +1,75 @@ +package main + +import ( + "github.com/BemiHQ/BemiDB/src/common" +) + +type IcebergWriter struct { + Config *Config + StorageS3 *common.StorageS3 + ServerDuckdbClient *common.DuckdbClient + IcebergCatalog *common.IcebergCatalog +} + +func NewIcebergWriter(config *Config, storageS3 *common.StorageS3, serverDuckdbClient *common.DuckdbClient, icebergCatalog *common.IcebergCatalog) *IcebergWriter { + return &IcebergWriter{ + Config: config, + StorageS3: storageS3, + ServerDuckdbClient: serverDuckdbClient, + IcebergCatalog: icebergCatalog, + } +} + +func (writer *IcebergWriter) CreateMaterializedView(icebergSchemaTable common.IcebergSchemaTable, remappedDefinitionQuery string) error { + return writer.IcebergCatalog.CreateMaterializedView(icebergSchemaTable, remappedDefinitionQuery) +} + +func (writer *IcebergWriter) RefreshMaterializedView(icebergSchemaTable common.IcebergSchemaTable, remappedDefinitionQuery string) error { + // Delete -syncing table + syncingIcebergSchemaTable := common.IcebergSchemaTable{Schema: icebergSchemaTable.Schema, Table: icebergSchemaTable.Table + common.TEMP_TABLE_SUFFIX_SYNCING} + syncingIcebergTable := common.NewIcebergTable(writer.Config.CommonConfig, writer.StorageS3, writer.ServerDuckdbClient, syncingIcebergSchemaTable) + syncingIcebergTable.DropIfExists() + + // Insert and create -syncing table + icebergTableWriter := common.NewIcebergTableWriter( + writer.Config.CommonConfig, + writer.StorageS3, + writer.ServerDuckdbClient, + syncingIcebergTable, + []*common.IcebergSchemaColumn{}, + 1, + ) + err := icebergTableWriter.InsertFromQuery(remappedDefinitionQuery) + if err != nil { + return err + } + + // Delete -deleting table + deletingIcebergSchemaTable := common.IcebergSchemaTable{Schema: icebergSchemaTable.Schema, Table: icebergSchemaTable.Table + common.TEMP_TABLE_SUFFIX_DELETING} + deletingIcebergTable := common.NewIcebergTable(writer.Config.CommonConfig, writer.StorageS3, writer.ServerDuckdbClient, deletingIcebergSchemaTable) + deletingIcebergTable.DropIfExists() + + // Rename table to -deleting + icebergTable := common.NewIcebergTable(writer.Config.CommonConfig, writer.StorageS3, writer.ServerDuckdbClient, icebergSchemaTable) + icebergTable.Rename(deletingIcebergSchemaTable.Table) + + // Rename -syncing to table + syncingIcebergTable.Rename(icebergSchemaTable.Table) + + // Delete -deleting table + deletingIcebergTable.DropIfExists() + + return nil +} + +func (writer *IcebergWriter) DropMaterializedView(icebergSchemaTable common.IcebergSchemaTable) error { + err := writer.IcebergCatalog.DropMaterializedView(icebergSchemaTable) + if err != nil { + return err + } + + icebergTable := common.NewIcebergTable(writer.Config.CommonConfig, writer.StorageS3, writer.ServerDuckdbClient, icebergSchemaTable) + icebergTable.DropIfExists() + + return nil +} diff --git a/src/server/main.go b/src/server/main.go index 5d181ce..e181d7b 100644 --- a/src/server/main.go +++ b/src/server/main.go @@ -31,10 +31,7 @@ func main() { common.LogInfo(config.CommonConfig, "DuckDB: Connected") defer duckdbClient.Close() - catalog := NewIcebergCatalog(config) - - icebergReader := NewIcebergReader(config, catalog) - queryHandler := NewQueryHandler(config, duckdbClient, icebergReader) + queryHandler := NewQueryHandler(config, duckdbClient) for { conn := AcceptConnection(config, tcpListener) @@ -58,7 +55,7 @@ func duckdbBootQueris(config *Config) []string { // Set up schemas "SELECT oid FROM pg_catalog.pg_namespace", - "CREATE SCHEMA public", + "CREATE SCHEMA " + PG_SCHEMA_PUBLIC, // Configure DuckDB "SET memory_limit='3GB'", @@ -75,7 +72,7 @@ func duckdbBootQueris(config *Config) []string { CreateInformationSchemaTableQueries(config), // Use the public schema - []string{"USE public"}, + []string{"USE " + PG_SCHEMA_PUBLIC}, ) } diff --git a/src/server/parser_a_expr.go b/src/server/parser_a_expr.go index 1fdf5c9..3d70051 100644 --- a/src/server/parser_a_expr.go +++ b/src/server/parser_a_expr.go @@ -18,6 +18,10 @@ func NewParserAExpr(config *Config) *ParserAExpr { } } +func (parser *ParserAExpr) AExprFromTargetNode(targetNode *pgQuery.Node) *pgQuery.A_Expr { + return targetNode.GetResTarget().Val.GetAExpr() +} + func (parser *ParserAExpr) AExpr(node *pgQuery.Node) *pgQuery.A_Expr { return node.GetAExpr() } @@ -29,7 +33,7 @@ func (parser *ParserAExpr) AExpr(node *pgQuery.Node) *pgQuery.A_Expr { // ^ Could not convert string '...' to BOOL when casting from source column json_column func (parser *ParserAExpr) RemappedJsonExtractString(node *pgQuery.Node) *pgQuery.Node { aExpr := parser.AExpr(node) - if aExpr == nil || aExpr.Kind != pgQuery.A_Expr_Kind_AEXPR_OP || len(aExpr.Name) != 1 || aExpr.Name[0].GetString_().Sval != "->>" { + if aExpr == nil || parser.OperatorName(aExpr) != "->>" { return node } @@ -47,7 +51,7 @@ func (parser *ParserAExpr) RemappedJsonExtractString(node *pgQuery.Node) *pgQuer // ^ Binder Error: No function matches the given name and argument types 'json_extract(VARCHAR, BOOLEAN)' func (parser *ParserAExpr) RemappedJsonExtract(node *pgQuery.Node) *pgQuery.Node { aExpr := parser.AExpr(node) - if aExpr == nil || aExpr.Kind != pgQuery.A_Expr_Kind_AEXPR_OP || len(aExpr.Name) != 1 || aExpr.Name[0].GetString_().Sval != "->" { + if aExpr == nil || parser.OperatorName(aExpr) != "->" { return node } @@ -58,6 +62,30 @@ func (parser *ParserAExpr) RemappedJsonExtract(node *pgQuery.Node) *pgQuery.Node ) } +func (parser *ParserAExpr) OperatorName(aExpr *pgQuery.A_Expr) string { + if aExpr.Kind != pgQuery.A_Expr_Kind_AEXPR_OP || len(aExpr.Name) != 1 { + return "" + } + + return aExpr.Name[0].GetString_().Sval +} + +func (parser *ParserAExpr) LeftColumnRefName(aExpr *pgQuery.A_Expr) string { + if aExpr.Lexpr == nil || aExpr.Lexpr.GetColumnRef() == nil || len(aExpr.Lexpr.GetColumnRef().Fields) != 1 { + return "" + } + + return aExpr.Lexpr.GetColumnRef().Fields[0].GetString_().Sval +} + +func (parser *ParserAExpr) RightAConstValue(aExpr *pgQuery.A_Expr) string { + if aExpr.Rexpr == nil || aExpr.Rexpr.GetAConst() == nil { + return "" + } + + return aExpr.Rexpr.GetAConst().GetSval().Sval +} + // = ANY({schema_information}) -> IN (schema_information) func (parser *ParserAExpr) ConvertedRightAnyToIn(node *pgQuery.Node) *pgQuery.Node { aExpr := parser.AExpr(node) diff --git a/src/server/pg_constants.go b/src/server/pg_constants.go index 0968995..d24ff0b 100644 --- a/src/server/pg_constants.go +++ b/src/server/pg_constants.go @@ -13,6 +13,7 @@ const ( PG_FUNCTION_ENCODE = "encode" PG_FUNCTION_JSONB_AGG = "jsonb_agg" + PG_TABLE_PG_MATVIEWS = "pg_matviews" PG_TABLE_PG_CLASS = "pg_class" PG_TABLE_PG_STAT_USER_TABLES = "pg_stat_user_tables" PG_TABLE_TABLES = "tables" diff --git a/src/server/query_handler.go b/src/server/query_handler.go index 8b33983..2d5cb0d 100644 --- a/src/server/query_handler.go +++ b/src/server/query_handler.go @@ -20,11 +20,10 @@ const ( ) type QueryHandler struct { - Config *Config - DuckdbClient *common.DuckdbClient - IcebergReader *IcebergReader - QueryRemapper *QueryRemapper - ResponseHandler *ResponseHandler + Config *Config + ServerDuckdbClient *common.DuckdbClient + QueryRemapper *QueryRemapper + ResponseHandler *ResponseHandler } type PreparedStatement struct { @@ -47,16 +46,20 @@ type PreparedStatement struct { Rows *sql.Rows } -func NewQueryHandler(config *Config, duckdbClient *common.DuckdbClient, icebergReader *IcebergReader) *QueryHandler { +func NewQueryHandler(config *Config, serverDuckdbClient *common.DuckdbClient) *QueryHandler { + storageS3 := common.NewStorageS3(config.CommonConfig) + icebergCatalog := common.NewIcebergCatalog(config.CommonConfig) + icebergReader := NewIcebergReader(config, storageS3, icebergCatalog) + icebergWriter := NewIcebergWriter(config, storageS3, serverDuckdbClient, icebergCatalog) + queryHandler := &QueryHandler{ - Config: config, - DuckdbClient: duckdbClient, - IcebergReader: icebergReader, - QueryRemapper: NewQueryRemapper(config, icebergReader, duckdbClient), - ResponseHandler: NewResponseHandler(config), + Config: config, + ServerDuckdbClient: serverDuckdbClient, + QueryRemapper: NewQueryRemapper(config, icebergReader, icebergWriter, serverDuckdbClient), + ResponseHandler: NewResponseHandler(config), } - queryHandler.createSchemas() + queryHandler.createSchemas(icebergReader) return queryHandler } @@ -73,7 +76,7 @@ func (queryHandler *QueryHandler) HandleSimpleQuery(originalQuery string) ([]pgp var queriesMessages []pgproto3.Message for i, queryStatement := range queryStatements { - rows, err := queryHandler.DuckdbClient.QueryContext(context.Background(), queryStatement) + rows, err := queryHandler.ServerDuckdbClient.QueryContext(context.Background(), queryStatement) if err != nil { errorMessage := err.Error() if errorMessage == "Binder Error: UNNEST requires a single list as input" { @@ -131,7 +134,7 @@ func (queryHandler *QueryHandler) HandleParseQuery(message *pgproto3.Parse) ([]p query := queryStatements[0] preparedStatement.Query = query - statement, err := queryHandler.DuckdbClient.PrepareContext(ctx, query) + statement, err := queryHandler.ServerDuckdbClient.PrepareContext(ctx, query) preparedStatement.Statement = statement if err != nil { return nil, nil, err @@ -235,13 +238,13 @@ func (queryHandler *QueryHandler) HandleExecuteQuery(message *pgproto3.Execute, return queryHandler.rowsToDataMessages(preparedStatement.Rows, preparedStatement.OriginalQuery) } -func (queryHandler *QueryHandler) createSchemas() { +func (queryHandler *QueryHandler) createSchemas(icebergReader *IcebergReader) { ctx := context.Background() - schemas, err := queryHandler.IcebergReader.Schemas() + schemas, err := icebergReader.Schemas() common.PanicIfError(queryHandler.Config.CommonConfig, err) for _, schema := range schemas { - _, err := queryHandler.DuckdbClient.ExecContext( + _, err := queryHandler.ServerDuckdbClient.ExecContext( ctx, "CREATE SCHEMA IF NOT EXISTS \"$schema\"", map[string]string{"schema": schema}, @@ -292,6 +295,12 @@ func (queryHandler *QueryHandler) rowsToDataMessages(rows *sql.Rows, originalQue commandTag = "DISCARD ALL" case strings.HasPrefix(upperOriginalQueryStatement, "BEGIN"): commandTag = "BEGIN" + case strings.HasPrefix(upperOriginalQueryStatement, "CREATE MATERIALIZED VIEW "): + commandTag = "CREATE MATERIALIZED VIEW" + case strings.HasPrefix(upperOriginalQueryStatement, "DROP MATERIALIZED VIEW "): + commandTag = "DROP MATERIALIZED VIEW" + case strings.HasPrefix(upperOriginalQueryStatement, "REFRESH MATERIALIZED VIEW "): + commandTag = "REFRESH MATERIALIZED VIEW" } messages = append(messages, &pgproto3.CommandComplete{CommandTag: []byte(commandTag)}) diff --git a/src/server/query_handler_test.go b/src/server/query_handler_test.go index 73f458a..d33bba0 100644 --- a/src/server/query_handler_test.go +++ b/src/server/query_handler_test.go @@ -18,7 +18,7 @@ import ( func TestHandleQuery(t *testing.T) { queryHandler := initQueryHandler() - defer queryHandler.DuckdbClient.Close() + defer queryHandler.ServerDuckdbClient.Close() t.Run("PG functions", func(t *testing.T) { testResponseByQuery(t, queryHandler, map[string]map[string][]string{ @@ -367,9 +367,9 @@ func TestHandleQuery(t *testing.T) { t.Run("Information schema", func(t *testing.T) { testResponseByQuery(t, queryHandler, map[string]map[string][]string{ "SELECT * FROM information_schema.tables WHERE table_schema = 'postgres' ORDER BY table_name DESC LIMIT 1": { - "description": {"table_catalog", "table_schema", "table_name", "table_type", "self_referencing_column_name", "reference_generation", "user_defined_type_catalog", "user_defined_type_schema", "user_defined_type_name", "is_insertable_into", "is_typed", "commit_action", "TABLE_COMMENT"}, + "description": {"table_catalog", "table_schema", "table_name", "table_type", "self_referencing_column_name", "reference_generation", "user_defined_type_catalog", "user_defined_type_schema", "user_defined_type_name", "is_insertable_into", "is_typed", "commit_action"}, "types": {uint32ToString(pgtype.TextOID)}, - "values": {"memory", "postgres", "test_table", "BASE TABLE", "", "", "", "", "", "YES", "NO", "", ""}, + "values": {"memory", "postgres", "test_table", "BASE TABLE", "", "", "", "", "", "YES", "NO", ""}, }, // information_schema.columns "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'id'": { @@ -907,13 +907,13 @@ func TestHandleQuery(t *testing.T) { "types": {uint32ToString(pgtype.TextOID)}, "values": {"{\"key\": \"value\", \"nestedKey\": { \"key\": \"value\" }}"}, }, - "SELECT jsonb_column->'key' AS key FROM postgres.test_table WHERE jsonb_column->'nestedKey'->>'key' = 'value'": { - "description": {"key"}, + "SELECT jsonb_column->'key' FROM postgres.test_table WHERE jsonb_column->'nestedKey'->>'key' = 'value'": { + "description": {"jsonb_column_key"}, "types": {uint32ToString(pgtype.JSONOID)}, "values": {"\"value\""}, }, - "SELECT json_column->>'key' AS key FROM postgres.test_table WHERE id = 1 AND json_column::json->>'key' IN ('value')": { - "description": {"key"}, + "SELECT json_column->>'key' FROM postgres.test_table WHERE id = 1 AND json_column::json->>'key' IN ('value')": { + "description": {"json_column_key"}, "types": {uint32ToString(pgtype.TextOID)}, "values": {"value"}, }, @@ -1474,7 +1474,7 @@ func TestHandleQuery(t *testing.T) { func TestHandleParseQuery(t *testing.T) { queryHandler := initQueryHandler() - defer queryHandler.DuckdbClient.Close() + defer queryHandler.ServerDuckdbClient.Close() t.Run("Handles PARSE extended query step", func(t *testing.T) { query := "SELECT usename, passwd FROM pg_shadow WHERE usename=$1" @@ -1517,7 +1517,7 @@ func TestHandleParseQuery(t *testing.T) { func TestHandleBindQuery(t *testing.T) { queryHandler := initQueryHandler() - defer queryHandler.DuckdbClient.Close() + defer queryHandler.ServerDuckdbClient.Close() t.Run("Handles BIND extended query step with text format parameter", func(t *testing.T) { parseMessage := &pgproto3.Parse{Query: "SELECT usename, passwd FROM pg_shadow WHERE usename=$1"} @@ -1625,7 +1625,7 @@ func TestHandleBindQuery(t *testing.T) { func TestHandleDescribeQuery(t *testing.T) { queryHandler := initQueryHandler() - defer queryHandler.DuckdbClient.Close() + defer queryHandler.ServerDuckdbClient.Close() t.Run("Handles DESCRIBE extended query step", func(t *testing.T) { query := "SELECT usename, passwd FROM pg_shadow WHERE usename=$1" @@ -1679,7 +1679,7 @@ func TestHandleDescribeQuery(t *testing.T) { func TestHandleExecuteQuery(t *testing.T) { queryHandler := initQueryHandler() - defer queryHandler.DuckdbClient.Close() + defer queryHandler.ServerDuckdbClient.Close() t.Run("Handles EXECUTE extended query step", func(t *testing.T) { query := "SELECT usename, split_part(passwd, ':', 1) FROM pg_shadow WHERE usename=$1" @@ -1721,7 +1721,7 @@ func TestHandleExecuteQuery(t *testing.T) { func TestHandleMultipleQueries(t *testing.T) { queryHandler := initQueryHandler() - defer queryHandler.DuckdbClient.Close() + defer queryHandler.ServerDuckdbClient.Close() t.Run("Handles multiple SET statements", func(t *testing.T) { query := `SET client_encoding TO 'UTF8'; @@ -1800,10 +1800,8 @@ SET standard_conforming_strings = on;` func initQueryHandler() *QueryHandler { config := loadTestConfig() - duckdbClient := common.NewDuckdbClient(config.CommonConfig, duckdbBootQueris(config)) - catalog := NewIcebergCatalog(config) - icebergReader := NewIcebergReader(config, catalog) - return NewQueryHandler(config, duckdbClient, icebergReader) + serverDuckdbClient := common.NewDuckdbClient(config.CommonConfig, duckdbBootQueris(config)) + return NewQueryHandler(config, serverDuckdbClient) } func loadTestConfig() *Config { diff --git a/src/server/query_remapper.go b/src/server/query_remapper.go index 376427f..0b0816a 100644 --- a/src/server/query_remapper.go +++ b/src/server/query_remapper.go @@ -34,19 +34,21 @@ type QueryRemapper struct { remapperFunction *QueryRemapperFunction remapperSelect *QueryRemapperSelect remapperShow *QueryRemapperShow - icebergReader *IcebergReader + IcebergReader *IcebergReader + IcebergWriter *IcebergWriter config *Config } -func NewQueryRemapper(config *Config, icebergReader *IcebergReader, duckdbClient *common.DuckdbClient) *QueryRemapper { +func NewQueryRemapper(config *Config, icebergReader *IcebergReader, icebergWriter *IcebergWriter, serverDuckdbClient *common.DuckdbClient) *QueryRemapper { return &QueryRemapper{ parserTypeCast: NewParserTypeCast(config), - remapperTable: NewQueryRemapperTable(config, icebergReader, duckdbClient), + remapperTable: NewQueryRemapperTable(config, icebergReader, serverDuckdbClient), remapperExpression: NewQueryRemapperExpression(config), remapperFunction: NewQueryRemapperFunction(config, icebergReader), remapperSelect: NewQueryRemapperSelect(config), remapperShow: NewQueryRemapperShow(config), - icebergReader: icebergReader, + IcebergReader: icebergReader, + IcebergWriter: icebergWriter, config: config, } } @@ -72,7 +74,7 @@ func (remapper *QueryRemapper) ParseAndRemapQuery(query string) ([]string, []str remappedStatements, err := remapper.remapStatements(queryTree.Stmts) if err != nil { - return nil, nil, fmt.Errorf("couldn't remap query: %s. %w", query, err) + return nil, nil, err } var queryStatements []string @@ -128,6 +130,30 @@ func (remapper *QueryRemapper) remapStatements(statements []*pgQuery.RawStmt) ([ case node.GetTransactionStmt() != nil: statements[i] = NOOP_QUERY_TREE.Stmts[0] + // CREATE MATERIALIZED VIEW + case node.GetCreateTableAsStmt() != nil: + err := remapper.createMaterializedView(node) + if err != nil { + return nil, err + } + statements[i] = NOOP_QUERY_TREE.Stmts[0] + + // DROP MATERIALIZED VIEW + case node.GetDropStmt() != nil && node.GetDropStmt().RemoveType == pgQuery.ObjectType_OBJECT_MATVIEW: + err := remapper.dropMaterializedViewFromNode(node) + if err != nil { + return nil, err + } + statements[i] = NOOP_QUERY_TREE.Stmts[0] + + // REFRESH MATERIALIZED VIEW + case node.GetRefreshMatViewStmt() != nil: + err := remapper.refreshMaterializedViewFromNode(node) + if err != nil { + return nil, err + } + statements[i] = NOOP_QUERY_TREE.Stmts[0] + // Unsupported query default: common.LogDebug(remapper.config.CommonConfig, "Query tree:", stmt, node) @@ -407,7 +433,7 @@ func (remapper *QueryRemapper) remapSelect(selectStatement *pgQuery.SelectStmt, // SELECT ... for targetNodeIdx, targetNode := range selectStatement.TargetList { - targetNode = remapper.remapperSelect.SetDefaultTargetNameToFunctionName(targetNode) + targetNode = remapper.remapperSelect.SetDefaultTargetName(targetNode) valNode := targetNode.GetResTarget().Val if valNode != nil { @@ -493,6 +519,118 @@ func (remapper *QueryRemapper) removeWhereClause(whereClause *pgQuery.Node) bool return true } +func (remapper *QueryRemapper) createMaterializedView(node *pgQuery.Node) error { + // Extract the schema and table names + icebergSchemaTable := common.IcebergSchemaTable{ + Schema: node.GetCreateTableAsStmt().Into.Rel.Schemaname, + Table: node.GetCreateTableAsStmt().Into.Rel.Relname, + } + if icebergSchemaTable.Schema == "" { + icebergSchemaTable.Schema = PG_SCHEMA_PUBLIC + } + + // Extract the definition of the materialized view + definitionSelectStmt := node.GetCreateTableAsStmt().Query.GetSelectStmt() + definitionRawStmt := &pgQuery.RawStmt{Stmt: &pgQuery.Node{Node: &pgQuery.Node_SelectStmt{SelectStmt: definitionSelectStmt}}} + definition, err := pgQuery.Deparse(&pgQuery.ParseResult{Stmts: []*pgQuery.RawStmt{definitionRawStmt}}) + if err != nil { + return fmt.Errorf("couldn't read definition of CREATE MATERIALIZED VIEW: %w", err) + } + + // Store the materialized view in the catalog + err = remapper.IcebergWriter.CreateMaterializedView(icebergSchemaTable, definition) + if err != nil { + if strings.HasPrefix(err.Error(), "ERROR: duplicate key value violates unique constraint") { + return fmt.Errorf("relation %s already exists", icebergSchemaTable.String()) + } else { + return fmt.Errorf("couldn't create materialized view: %w", err) + } + } + + // Refresh the materialized view if it is not a "CREATE MATERIALIZED VIEW ... WITH NO DATA" statement + if !node.GetCreateTableAsStmt().Into.SkipData { + queryStatements, _, err := remapper.ParseAndRemapQuery(definition) + if err != nil { + deleteErr := remapper.IcebergWriter.DropMaterializedView(icebergSchemaTable) + if deleteErr != nil { + return fmt.Errorf("couldn't remap definition of CREATE MATERIALIZED VIEW: %w (%w)", err, deleteErr) + } + return fmt.Errorf("couldn't remap definition of CREATE MATERIALIZED VIEW: %w", err) + } + + err = remapper.IcebergWriter.RefreshMaterializedView(icebergSchemaTable, queryStatements[0]) + if err != nil { + deleteErr := remapper.IcebergWriter.DropMaterializedView(icebergSchemaTable) + if deleteErr != nil { + return fmt.Errorf("couldn't refresh materialized view: %w (%w)", err, deleteErr) + } + return fmt.Errorf("couldn't refresh materialized view: %w", err) + } + } + + return nil +} + +func (remapper *QueryRemapper) dropMaterializedViewFromNode(node *pgQuery.Node) error { + var icebergSchemaTable common.IcebergSchemaTable + nodeItems := node.GetDropStmt().Objects[0].GetList().Items + if len(nodeItems) == 2 { + icebergSchemaTable = common.IcebergSchemaTable{ + Schema: nodeItems[0].GetString_().Sval, + Table: nodeItems[1].GetString_().Sval, + } + } else { + icebergSchemaTable = common.IcebergSchemaTable{ + Schema: PG_SCHEMA_PUBLIC, + Table: nodeItems[0].GetString_().Sval, + } + } + + // Delete the materialized view from the catalog + err := remapper.IcebergWriter.DropMaterializedView(icebergSchemaTable) + if err != nil { + return err + } + + return nil +} + +func (remapper *QueryRemapper) refreshMaterializedViewFromNode(node *pgQuery.Node) error { + icebergSchemaTable := common.IcebergSchemaTable{ + Schema: node.GetRefreshMatViewStmt().Relation.Schemaname, + Table: node.GetRefreshMatViewStmt().Relation.Relname, + } + if icebergSchemaTable.Schema == "" { + icebergSchemaTable.Schema = PG_SCHEMA_PUBLIC + } + + materializedView, err := remapper.IcebergReader.MaterializedView(icebergSchemaTable) + if err != nil { + return err + } + + queryStatements, _, err := remapper.ParseAndRemapQuery(materializedView.Definition) + if err != nil { + return fmt.Errorf("couldn't remap definition of REFRESH MATERIALIZED VIEW: %w", err) + } + + if node.GetRefreshMatViewStmt().Concurrent { + go func() { + err := remapper.IcebergWriter.RefreshMaterializedView(icebergSchemaTable, queryStatements[0]) + if err != nil { + common.LogError(remapper.config.CommonConfig, "couldn't refresh materialized view concurrently: %s", err) + } + }() + } else { + err = remapper.IcebergWriter.RefreshMaterializedView(icebergSchemaTable, queryStatements[0]) + if err != nil { + return fmt.Errorf("couldn't refresh materialized view: %w", err) + } + } + + return nil +} + func (remapper *QueryRemapper) traceTreeTraversal(label string, indentLevel int) { common.LogTrace(remapper.config.CommonConfig, strings.Repeat(">", indentLevel), label) } diff --git a/src/server/query_remapper_select.go b/src/server/query_remapper_select.go index d58efae..9be2067 100644 --- a/src/server/query_remapper_select.go +++ b/src/server/query_remapper_select.go @@ -7,6 +7,7 @@ import ( type QueryRemapperSelect struct { parserSelect *ParserSelect parserFunction *ParserFunction + parserAExpr *ParserAExpr config *Config } @@ -14,17 +15,36 @@ func NewQueryRemapperSelect(config *Config) *QueryRemapperSelect { return &QueryRemapperSelect{ parserSelect: NewParserSelect(config), parserFunction: NewParserFunction(config), + parserAExpr: NewParserAExpr(config), config: config, } } // SELECT FUNCTION(...) -> SELECT FUNCTION(...) AS FUNCTION -func (remapper *QueryRemapperSelect) SetDefaultTargetNameToFunctionName(targetNode *pgQuery.Node) *pgQuery.Node { +func (remapper *QueryRemapperSelect) SetDefaultTargetName(targetNode *pgQuery.Node) *pgQuery.Node { + aExpr := remapper.parserAExpr.AExprFromTargetNode(targetNode) + if aExpr != nil { + operatorName := remapper.parserAExpr.OperatorName(aExpr) + + // [column]->'value' or [column]->>'value' -> column_value + if operatorName == "->" || operatorName == "->>" { + columnName := remapper.parserAExpr.LeftColumnRefName(aExpr) + valueName := remapper.parserAExpr.RightAConstValue(aExpr) + + if columnName != "" && valueName != "" { + remapper.parserSelect.SetDefaultTargetName(targetNode, columnName+"_"+valueName) + return targetNode + } + } + } + functionCall := remapper.parserFunction.FunctionCall(targetNode) if functionCall != nil { schemaFunction := remapper.parserFunction.SchemaFunction(functionCall) + functionName := schemaFunction.Function + // FUNCTION(...) -> FUNCTION(...) AS FUNCTION - remapper.parserSelect.SetDefaultTargetName(targetNode, schemaFunction.Function) + remapper.parserSelect.SetDefaultTargetName(targetNode, functionName) return targetNode } diff --git a/src/server/query_remapper_table.go b/src/server/query_remapper_table.go index ecf34ac..d5ba316 100644 --- a/src/server/query_remapper_table.go +++ b/src/server/query_remapper_table.go @@ -49,9 +49,38 @@ func CreatePgCatalogTableQueries(config *Config) []string { // DuckDB does not support indnullsnotdistinct column "CREATE VIEW pg_index AS SELECT *, FALSE AS indnullsnotdistinct FROM pg_catalog.pg_index", // Hide DuckDB's system and duplicate schemas - "CREATE VIEW pg_namespace AS SELECT * FROM pg_catalog.pg_namespace WHERE oid > 1265", + "CREATE VIEW pg_namespace AS SELECT * FROM pg_catalog.pg_namespace WHERE oid >= (SELECT oid FROM pg_catalog.pg_namespace WHERE nspname = '" + PG_SCHEMA_PUBLIC + "')", // DuckDB does not support relforcerowsecurity column - "CREATE VIEW pg_class AS SELECT *, FALSE AS relforcerowsecurity FROM pg_catalog.pg_class", + `CREATE VIEW pg_class AS SELECT + oid, + relname, + relnamespace, + reltype, + reloftype, + relowner, + relam, + relfilenode, + reltablespace, + relpages, + reltuples, + relallvisible, + reltoastrelid, + relhasindex, + relisshared, + relpersistence, + CASE relkind + WHEN 'v' THEN + CASE relnamespace >= (SELECT oid FROM pg_catalog.pg_namespace WHERE nspname = '` + PG_SCHEMA_PUBLIC + `') + WHEN TRUE THEN + 'm' + ELSE + 'v' + END + ELSE + relkind + END AS relkind, + FALSE AS relforcerowsecurity + FROM pg_catalog.pg_class`, } PG_CATALOG_TABLE_NAMES = extractTableNames(result) return result @@ -99,31 +128,48 @@ func CreateInformationSchemaTableQueries(config *Config) []string { END AS udt_name, scope_catalog, scope_schema, scope_name, maximum_cardinality, dtd_identifier, is_self_referencing, is_identity, identity_generation, identity_start, identity_increment, identity_maximum, identity_minimum, identity_cycle, is_generated, generation_expression, is_updatable FROM information_schema.columns`, + `CREATE VIEW tables AS SELECT + table_catalog, + table_schema, + table_name, + table_type, + self_referencing_column_name, + reference_generation, + user_defined_type_catalog, + user_defined_type_schema, + user_defined_type_name, + is_insertable_into, + is_typed, + commit_action + FROM information_schema.tables + WHERE table_type != 'VIEW'`, } PG_INFORMATION_SCHEMA_TABLE_NAMES = extractTableNames(result) return result } type QueryRemapperTable struct { - parserTable *ParserTable - parserFunction *ParserFunction - remapperFunction *QueryRemapperFunction - icebergSchemaTables common.Set[IcebergSchemaTable] - icebergReader *IcebergReader - duckdb *common.DuckdbClient // nilable - config *Config + parserTable *ParserTable + parserFunction *ParserFunction + remapperFunction *QueryRemapperFunction + IcebergPersistentSchemaTables common.Set[common.IcebergSchemaTable] + IcebergMaterlizedSchemaTables common.Set[common.IcebergSchemaTable] + IcebergMaterializedViews []common.IcebergMaterializedView + icebergReader *IcebergReader + ServerDuckdbClient *common.DuckdbClient // nilable + config *Config } -func NewQueryRemapperTable(config *Config, icebergReader *IcebergReader, duckdb *common.DuckdbClient) *QueryRemapperTable { +func NewQueryRemapperTable(config *Config, icebergReader *IcebergReader, serverDuckdbClient *common.DuckdbClient) *QueryRemapperTable { remapper := &QueryRemapperTable{ - parserTable: NewParserTable(config), - parserFunction: NewParserFunction(config), - remapperFunction: NewQueryRemapperFunction(config, icebergReader), - icebergReader: icebergReader, - duckdb: duckdb, - config: config, + parserTable: NewParserTable(config), + parserFunction: NewParserFunction(config), + remapperFunction: NewQueryRemapperFunction(config, icebergReader), + icebergReader: icebergReader, + ServerDuckdbClient: serverDuckdbClient, + config: config, } - remapper.reloadIceberSchemaTables() + remapper.reloadIcebergTables() return remapper } @@ -138,12 +184,17 @@ func (remapper *QueryRemapperTable) RemapTable(node *pgQuery.Node) *pgQuery.Node // pg_class -> reload Iceberg tables case PG_TABLE_PG_CLASS: - remapper.reloadIceberSchemaTables() + remapper.reloadIcebergTables() // pg_stat_user_tables -> return Iceberg tables case PG_TABLE_PG_STAT_USER_TABLES: - remapper.reloadIceberSchemaTables() - remapper.upsertPgStatUserTables(remapper.icebergSchemaTables) + remapper.reloadIcebergTables() + remapper.upsertPgStatUserTables() + + // pg_matviews -> reload Iceberg materialized views + case PG_TABLE_PG_MATVIEWS: + remapper.reloadIcebergMaterializedViews() + remapper.upsertPgMatviews() } // pg_catalog.pg_table -> main.pg_table @@ -161,7 +212,9 @@ func (remapper *QueryRemapperTable) RemapTable(node *pgQuery.Node) *pgQuery.Node switch qSchemaTable.Table { // information_schema.tables -> reload Iceberg tables case PG_TABLE_TABLES: - remapper.reloadIceberSchemaTables() + remapper.reloadIcebergTables() + parser.RemapSchemaToMain(node) + return node } // information_schema.table -> main.table @@ -177,9 +230,9 @@ func (remapper *QueryRemapperTable) RemapTable(node *pgQuery.Node) *pgQuery.Node // public.table -> FROM iceberg_scan('path') table // schema.table -> FROM iceberg_scan('path') schema_table schemaTable := qSchemaTable.ToIcebergSchemaTable() - if !remapper.icebergSchemaTables.Contains(schemaTable) { // Reload Iceberg tables if not found - remapper.reloadIceberSchemaTables() - if !remapper.icebergSchemaTables.Contains(schemaTable) { + if !remapper.IcebergPersistentSchemaTables.Contains(schemaTable) && !remapper.IcebergMaterlizedSchemaTables.Contains(schemaTable) { // Reload Iceberg tables if not found + remapper.reloadIcebergTables() + if !remapper.IcebergPersistentSchemaTables.Contains(schemaTable) && !remapper.IcebergMaterlizedSchemaTables.Contains(schemaTable) { return node // Let it return "Catalog Error: Table with name _ does not exist!" } } @@ -204,22 +257,21 @@ func (remapper *QueryRemapperTable) RemapTableFunctionCall(rangeFunction *pgQuer } } -func (remapper *QueryRemapperTable) reloadIceberSchemaTables() { +func (remapper *QueryRemapperTable) reloadIcebergTables() { + remapper.reloadIcebergMaterializedViews() + remapper.reloadIcebergPersistentTables() +} + +func (remapper *QueryRemapperTable) reloadIcebergPersistentTables() { newIcebergSchemaTables, err := remapper.icebergReader.SchemaTables() - if err != nil && strings.Contains(err.Error(), "no Iceberg directory found") { - common.PrintErrorAndExit(remapper.config.CommonConfig, err.Error()+".\n\n"+ - "Please make sure to run 'bemidb sync' first.\n"+ - "See https://github.com/BemiHQ/BemiDB#quickstart for more information.") - } common.PanicIfError(remapper.config.CommonConfig, err) - - previousIcebergSchemaTables := remapper.icebergSchemaTables - remapper.icebergSchemaTables = newIcebergSchemaTables - - if remapper.duckdb == nil { - return + for _, icebergSchemaTable := range remapper.IcebergMaterlizedSchemaTables.Values() { + newIcebergSchemaTables.Remove(icebergSchemaTable) } + previousIcebergSchemaTables := remapper.IcebergPersistentSchemaTables + remapper.IcebergPersistentSchemaTables = newIcebergSchemaTables + ctx := context.Background() // CREATE TABLE IF NOT EXISTS for _, icebergSchemaTable := range newIcebergSchemaTables.Values() { @@ -232,35 +284,90 @@ func (remapper *QueryRemapperTable) reloadIceberSchemaTables() { sqlColumns = append(sqlColumns, icebergTableField.ToSql()) } - _, err = remapper.duckdb.ExecContext(ctx, "CREATE SCHEMA IF NOT EXISTS "+icebergSchemaTable.Schema) + _, err = remapper.ServerDuckdbClient.ExecContext(ctx, "CREATE SCHEMA IF NOT EXISTS "+icebergSchemaTable.Schema) common.PanicIfError(remapper.config.CommonConfig, err) - _, err = remapper.duckdb.ExecContext(ctx, "CREATE TABLE IF NOT EXISTS "+icebergSchemaTable.String()+" ("+strings.Join(sqlColumns, ", ")+")") + _, err = remapper.ServerDuckdbClient.ExecContext(ctx, "CREATE TABLE IF NOT EXISTS "+icebergSchemaTable.String()+" ("+strings.Join(sqlColumns, ", ")+")") common.PanicIfError(remapper.config.CommonConfig, err) } } // DROP TABLE IF EXISTS for _, icebergSchemaTable := range previousIcebergSchemaTables.Values() { if !newIcebergSchemaTables.Contains(icebergSchemaTable) { - _, err = remapper.duckdb.ExecContext(ctx, "DROP TABLE IF EXISTS "+icebergSchemaTable.String()) + _, err = remapper.ServerDuckdbClient.ExecContext(ctx, "DROP TABLE IF EXISTS "+icebergSchemaTable.String()) common.PanicIfError(remapper.config.CommonConfig, err) } } } -func (remapper *QueryRemapperTable) upsertPgStatUserTables(icebergSchemaTables common.Set[IcebergSchemaTable]) { - if remapper.duckdb == nil { - return +func (remapper *QueryRemapperTable) reloadIcebergMaterializedViews() { + newIcebergMaterializedViews, err := remapper.icebergReader.MaterializedViews() + common.PanicIfError(remapper.config.CommonConfig, err) + + remapper.IcebergMaterializedViews = newIcebergMaterializedViews + + newMaterializedSchemaTables := common.NewSet[common.IcebergSchemaTable]() + for _, icebergMaterializedView := range newIcebergMaterializedViews { + newMaterializedSchemaTables.Add(icebergMaterializedView.ToIcebergSchemaTable()) + } + previousIcebergSchemaTables := remapper.IcebergMaterlizedSchemaTables + remapper.IcebergMaterlizedSchemaTables = newMaterializedSchemaTables + + ctx := context.Background() + // CREATE VIEW IF NOT EXISTS + for _, icebergSchemaTable := range remapper.IcebergMaterlizedSchemaTables.Values() { + if !previousIcebergSchemaTables.Contains(icebergSchemaTable) { + _, err = remapper.ServerDuckdbClient.ExecContext(ctx, "CREATE SCHEMA IF NOT EXISTS "+icebergSchemaTable.Schema) + common.PanicIfError(remapper.config.CommonConfig, err) + _, err = remapper.ServerDuckdbClient.ExecContext(ctx, "CREATE VIEW IF NOT EXISTS "+icebergSchemaTable.String()+" AS SELECT 1") + common.PanicIfError(remapper.config.CommonConfig, err) + _, err = remapper.ServerDuckdbClient.ExecContext(ctx, "INSERT INTO pg_matviews VALUES ('"+icebergSchemaTable.Schema+"', '"+icebergSchemaTable.Table+"', '"+remapper.config.User+"', NULL, FALSE, TRUE, '')") + common.PanicIfError(remapper.config.CommonConfig, err) + } + } + // DROP VIEW IF EXISTS + for _, icebergSchemaTable := range previousIcebergSchemaTables.Values() { + if !newMaterializedSchemaTables.Contains(icebergSchemaTable) { + _, err = remapper.ServerDuckdbClient.ExecContext(ctx, "DROP VIEW IF EXISTS "+icebergSchemaTable.String()) + common.PanicIfError(remapper.config.CommonConfig, err) + _, err = remapper.ServerDuckdbClient.ExecContext(ctx, "DELETE FROM pg_matviews WHERE schemaname = '"+icebergSchemaTable.Schema+"' AND matviewname = '"+icebergSchemaTable.Table+"'") + common.PanicIfError(remapper.config.CommonConfig, err) + } } +} + +func (remapper *QueryRemapperTable) upsertPgStatUserTables() { + icebergSchemaTables := append(remapper.IcebergPersistentSchemaTables.Values(), remapper.IcebergMaterlizedSchemaTables.Values()...) - values := make([]string, len(icebergSchemaTables)) - for i, icebergSchemaTable := range icebergSchemaTables.Values() { - values[i] = "('123456', '" + icebergSchemaTable.Schema + "', '" + icebergSchemaTable.Table + "', 0, NULL, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, NULL, NULL, NULL, NULL, 0, 0, 0, 0)" + sqls := []string{"DELETE FROM pg_stat_user_tables"} + if len(icebergSchemaTables) > 0 { + values := make([]string, len(icebergSchemaTables)) + for i, icebergSchemaTable := range icebergSchemaTables { + values[i] = "('123456', '" + icebergSchemaTable.Schema + "', '" + icebergSchemaTable.Table + "', 0, NULL, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, NULL, NULL, NULL, NULL, 0, 0, 0, 0)" + } + sqls = append(sqls, "INSERT INTO pg_stat_user_tables VALUES "+strings.Join(values, ", ")) } + err := remapper.ServerDuckdbClient.ExecTransactionContext(context.Background(), sqls) + common.PanicIfError(remapper.config.CommonConfig, err) +} - err := remapper.duckdb.ExecTransactionContext(context.Background(), []string{ - "DELETE FROM pg_stat_user_tables", - "INSERT INTO pg_stat_user_tables VALUES " + strings.Join(values, ", "), - }) +func (remapper *QueryRemapperTable) upsertPgMatviews() { + args := []map[string]string{map[string]string{}} + sqls := []string{"DELETE FROM pg_matviews"} + if len(remapper.IcebergMaterializedViews) > 0 { + values := make([]string, len(remapper.IcebergMaterializedViews)) + arg := map[string]string{} + for i, icebergMaterializedView := range remapper.IcebergMaterializedViews { + iStr := common.IntToString(i) + values[i] = "('$schema" + iStr + "', '$table" + iStr + "', '$owner" + iStr + "', NULL, FALSE, TRUE, '$definition" + iStr + "')" + arg["schema"+iStr] = icebergMaterializedView.Schema + arg["table"+iStr] = icebergMaterializedView.Table + arg["owner"+iStr] = remapper.config.User + arg["definition"+iStr] = icebergMaterializedView.Definition + } + sqls = append(sqls, "INSERT INTO pg_matviews VALUES "+strings.Join(values, ", ")) + args = append(args, arg) + } + err := remapper.ServerDuckdbClient.ExecTransactionContext(context.Background(), sqls, args) common.PanicIfError(remapper.config.CommonConfig, err) } @@ -269,7 +376,8 @@ func (remapper *QueryRemapperTable) isTableFromPgCatalog(qSchemaTable QuerySchem return qSchemaTable.Schema == PG_SCHEMA_PG_CATALOG || (qSchemaTable.Schema == "" && (PG_SYSTEM_TABLES.Contains(qSchemaTable.Table) || PG_SYSTEM_VIEWS.Contains(qSchemaTable.Table)) && - !remapper.icebergSchemaTables.Contains(qSchemaTable.ToIcebergSchemaTable())) + !remapper.IcebergPersistentSchemaTables.Contains(qSchemaTable.ToIcebergSchemaTable()) && + !remapper.IcebergMaterlizedSchemaTables.Contains(qSchemaTable.ToIcebergSchemaTable())) } func extractTableNames(tables []string) common.Set[string] { diff --git a/src/server/storage_s3.go b/src/server/storage_s3.go deleted file mode 100644 index 1f17d69..0000000 --- a/src/server/storage_s3.go +++ /dev/null @@ -1,87 +0,0 @@ -package main - -import ( - "encoding/json" - "io" - "reflect" - - "github.com/BemiHQ/BemiDB/src/common" -) - -type MetadataJson struct { - Schemas []struct { - Fields []struct { - ID int `json:"id"` - Name string `json:"name"` - Type interface{} `json:"type"` - Required bool `json:"required"` - } `json:"fields"` - } `json:"schemas"` -} - -type StorageS3 struct { - S3Client *common.S3Client - Config *Config -} - -func NewS3Storage(config *Config) *StorageS3 { - s3Client := common.NewS3Client(config.CommonConfig) - - return &StorageS3{ - Config: config, - S3Client: s3Client, - } -} - -func (storage *StorageS3) IcebergTableFields(metadataPath string) ([]IcebergTableField, error) { - metadataKey := storage.S3Client.ObjectKey(metadataPath) - metadataContent, err := storage.readFileContent(metadataKey) - if err != nil { - return nil, err - } - - return storage.parseIcebergTableFields(metadataContent) -} - -func (storage *StorageS3) readFileContent(fileKey string) ([]byte, error) { - getObjectResponse := storage.S3Client.GetObject(fileKey) - - fileContent, err := io.ReadAll(getObjectResponse.Body) - if err != nil { - return nil, err - } - - return fileContent, nil -} - -func (storage *StorageS3) parseIcebergTableFields(metadataContent []byte) ([]IcebergTableField, error) { - var metadataJson MetadataJson - err := json.Unmarshal(metadataContent, &metadataJson) - if err != nil { - return nil, err - } - - var icebergTableFields []IcebergTableField - schema := metadataJson.Schemas[len(metadataJson.Schemas)-1] // Get the last schema - if schema.Fields != nil { - for _, field := range schema.Fields { - icebergTableField := IcebergTableField{ - Name: field.Name, - } - - if reflect.TypeOf(field.Type).Kind() == reflect.String { - icebergTableField.Type = field.Type.(string) - icebergTableField.Required = field.Required - } else { - listType := field.Type.(map[string]interface{}) - icebergTableField.Type = listType["element"].(string) - icebergTableField.Required = listType["element-required"].(bool) - icebergTableField.IsList = true - } - - icebergTableFields = append(icebergTableFields, icebergTableField) - } - } - - return icebergTableFields, nil -} diff --git a/src/syncer-amplitude/amplitude.go b/src/syncer-amplitude/amplitude.go index 060d5f1..725f98f 100644 --- a/src/syncer-amplitude/amplitude.go +++ b/src/syncer-amplitude/amplitude.go @@ -11,7 +11,6 @@ import ( "time" "github.com/BemiHQ/BemiDB/src/common" - "github.com/BemiHQ/BemiDB/src/syncer-common" ) const ( @@ -31,7 +30,7 @@ func NewAmplitude(config *Config) *Amplitude { } } -func (amplitude *Amplitude) Export(jsonQueueWriter *syncerCommon.JsonQueueWriter, startTime, endTime time.Time) error { +func (amplitude *Amplitude) Export(jsonQueueWriter *common.JsonQueueWriter, startTime, endTime time.Time) error { startString := startTime.UTC().Format(AMPLITUDE_TIME_FORMAT) endString := endTime.UTC().Format(AMPLITUDE_TIME_FORMAT) diff --git a/src/syncer-amplitude/event.go b/src/syncer-amplitude/event.go index 6aae7f6..14461e2 100644 --- a/src/syncer-amplitude/event.go +++ b/src/syncer-amplitude/event.go @@ -2,7 +2,6 @@ package main import ( "github.com/BemiHQ/BemiDB/src/common" - "github.com/BemiHQ/BemiDB/src/syncer-common" ) const ( @@ -129,62 +128,62 @@ func (event *Event) ToMap() map[string]interface{} { return result } -func EventIcebergSchemaColumns(config *common.CommonConfig) []*syncerCommon.IcebergSchemaColumn { - return []*syncerCommon.IcebergSchemaColumn{ - {Config: config, ColumnName: "adid", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 1}, - {Config: config, ColumnName: "amplitude_attribution_ids", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 2}, - {Config: config, ColumnName: "amplitude_event_type", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 3}, - {Config: config, ColumnName: "amplitude_id", ColumnType: syncerCommon.IcebergColumnTypeLong, Position: 4}, - {Config: config, ColumnName: "app", ColumnType: syncerCommon.IcebergColumnTypeInteger, Position: 5}, - {Config: config, ColumnName: "city", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 6}, - {Config: config, ColumnName: "client_event_time", ColumnType: syncerCommon.IcebergColumnTypeTimestamp, Position: 7}, - {Config: config, ColumnName: "client_upload_time", ColumnType: syncerCommon.IcebergColumnTypeTimestamp, Position: 8}, - {Config: config, ColumnName: "country", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 9}, - {Config: config, ColumnName: "data", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 10}, - {Config: config, ColumnName: "data_type", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 11}, - {Config: config, ColumnName: "device_brand", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 12}, - {Config: config, ColumnName: "device_carrier", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 13}, - {Config: config, ColumnName: "device_family", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 14}, - {Config: config, ColumnName: "device_id", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 15}, - {Config: config, ColumnName: "device_manufacturer", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 16}, - {Config: config, ColumnName: "device_model", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 17}, - {Config: config, ColumnName: "device_type", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 18}, - {Config: config, ColumnName: "dma", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 19}, - {Config: config, ColumnName: "event_id", ColumnType: syncerCommon.IcebergColumnTypeInteger, Position: 20}, - {Config: config, ColumnName: "event_properties", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 21}, - {Config: config, ColumnName: "event_time", ColumnType: syncerCommon.IcebergColumnTypeTimestamp, Position: 22}, - {Config: config, ColumnName: "event_type", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 23}, - {Config: config, ColumnName: "global_user_properties", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 24}, - {Config: config, ColumnName: "group_properties", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 25}, - {Config: config, ColumnName: "groups", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 26}, - {Config: config, ColumnName: "idfa", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 27}, - {Config: config, ColumnName: "insert_id", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 28}, - {Config: config, ColumnName: "insert_key", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 29}, - {Config: config, ColumnName: "ip_address", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 30}, - {Config: config, ColumnName: "is_attribution_event", ColumnType: syncerCommon.IcebergColumnTypeBoolean, Position: 31}, - {Config: config, ColumnName: "language", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 32}, - {Config: config, ColumnName: "library", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 33}, - {Config: config, ColumnName: "location_lat", ColumnType: syncerCommon.IcebergColumnTypeFloat, Position: 34}, - {Config: config, ColumnName: "location_lng", ColumnType: syncerCommon.IcebergColumnTypeFloat, Position: 35}, - {Config: config, ColumnName: "os_name", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 36}, - {Config: config, ColumnName: "os_version", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 37}, - {Config: config, ColumnName: "partner_id", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 38}, - {Config: config, ColumnName: "paying", ColumnType: syncerCommon.IcebergColumnTypeBoolean, Position: 39}, - {Config: config, ColumnName: "plan", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 40}, - {Config: config, ColumnName: "platform", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 41}, - {Config: config, ColumnName: "processed_time", ColumnType: syncerCommon.IcebergColumnTypeTimestamp, Position: 42}, - {Config: config, ColumnName: "region", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 43}, - {Config: config, ColumnName: "sample_rate", ColumnType: syncerCommon.IcebergColumnTypeFloat, Position: 44}, - {Config: config, ColumnName: "schema", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 45}, - {Config: config, ColumnName: "server_received_time", ColumnType: syncerCommon.IcebergColumnTypeTimestamp, Position: 46}, - {Config: config, ColumnName: "server_upload_time", ColumnType: syncerCommon.IcebergColumnTypeTimestamp, Position: 47}, - {Config: config, ColumnName: "session_id", ColumnType: syncerCommon.IcebergColumnTypeLong, Position: 48}, - {Config: config, ColumnName: "source_id", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 49}, - {Config: config, ColumnName: "start_version", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 50}, - {Config: config, ColumnName: "user_creation_time", ColumnType: syncerCommon.IcebergColumnTypeTimestamp, Position: 51}, - {Config: config, ColumnName: "user_id", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 52}, - {Config: config, ColumnName: "user_properties", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 53}, - {Config: config, ColumnName: "uuid", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 54}, - {Config: config, ColumnName: "version_name", ColumnType: syncerCommon.IcebergColumnTypeString, Position: 55}, +func EventIcebergSchemaColumns(config *common.CommonConfig) []*common.IcebergSchemaColumn { + return []*common.IcebergSchemaColumn{ + {Config: config, ColumnName: "adid", ColumnType: common.IcebergColumnTypeString, Position: 1}, + {Config: config, ColumnName: "amplitude_attribution_ids", ColumnType: common.IcebergColumnTypeString, Position: 2}, + {Config: config, ColumnName: "amplitude_event_type", ColumnType: common.IcebergColumnTypeString, Position: 3}, + {Config: config, ColumnName: "amplitude_id", ColumnType: common.IcebergColumnTypeLong, Position: 4}, + {Config: config, ColumnName: "app", ColumnType: common.IcebergColumnTypeInteger, Position: 5}, + {Config: config, ColumnName: "city", ColumnType: common.IcebergColumnTypeString, Position: 6}, + {Config: config, ColumnName: "client_event_time", ColumnType: common.IcebergColumnTypeTimestamp, Position: 7}, + {Config: config, ColumnName: "client_upload_time", ColumnType: common.IcebergColumnTypeTimestamp, Position: 8}, + {Config: config, ColumnName: "country", ColumnType: common.IcebergColumnTypeString, Position: 9}, + {Config: config, ColumnName: "data", ColumnType: common.IcebergColumnTypeString, Position: 10}, + {Config: config, ColumnName: "data_type", ColumnType: common.IcebergColumnTypeString, Position: 11}, + {Config: config, ColumnName: "device_brand", ColumnType: common.IcebergColumnTypeString, Position: 12}, + {Config: config, ColumnName: "device_carrier", ColumnType: common.IcebergColumnTypeString, Position: 13}, + {Config: config, ColumnName: "device_family", ColumnType: common.IcebergColumnTypeString, Position: 14}, + {Config: config, ColumnName: "device_id", ColumnType: common.IcebergColumnTypeString, Position: 15}, + {Config: config, ColumnName: "device_manufacturer", ColumnType: common.IcebergColumnTypeString, Position: 16}, + {Config: config, ColumnName: "device_model", ColumnType: common.IcebergColumnTypeString, Position: 17}, + {Config: config, ColumnName: "device_type", ColumnType: common.IcebergColumnTypeString, Position: 18}, + {Config: config, ColumnName: "dma", ColumnType: common.IcebergColumnTypeString, Position: 19}, + {Config: config, ColumnName: "event_id", ColumnType: common.IcebergColumnTypeInteger, Position: 20}, + {Config: config, ColumnName: "event_properties", ColumnType: common.IcebergColumnTypeString, Position: 21}, + {Config: config, ColumnName: "event_time", ColumnType: common.IcebergColumnTypeTimestamp, Position: 22}, + {Config: config, ColumnName: "event_type", ColumnType: common.IcebergColumnTypeString, Position: 23}, + {Config: config, ColumnName: "global_user_properties", ColumnType: common.IcebergColumnTypeString, Position: 24}, + {Config: config, ColumnName: "group_properties", ColumnType: common.IcebergColumnTypeString, Position: 25}, + {Config: config, ColumnName: "groups", ColumnType: common.IcebergColumnTypeString, Position: 26}, + {Config: config, ColumnName: "idfa", ColumnType: common.IcebergColumnTypeString, Position: 27}, + {Config: config, ColumnName: "insert_id", ColumnType: common.IcebergColumnTypeString, Position: 28}, + {Config: config, ColumnName: "insert_key", ColumnType: common.IcebergColumnTypeString, Position: 29}, + {Config: config, ColumnName: "ip_address", ColumnType: common.IcebergColumnTypeString, Position: 30}, + {Config: config, ColumnName: "is_attribution_event", ColumnType: common.IcebergColumnTypeBoolean, Position: 31}, + {Config: config, ColumnName: "language", ColumnType: common.IcebergColumnTypeString, Position: 32}, + {Config: config, ColumnName: "library", ColumnType: common.IcebergColumnTypeString, Position: 33}, + {Config: config, ColumnName: "location_lat", ColumnType: common.IcebergColumnTypeFloat, Position: 34}, + {Config: config, ColumnName: "location_lng", ColumnType: common.IcebergColumnTypeFloat, Position: 35}, + {Config: config, ColumnName: "os_name", ColumnType: common.IcebergColumnTypeString, Position: 36}, + {Config: config, ColumnName: "os_version", ColumnType: common.IcebergColumnTypeString, Position: 37}, + {Config: config, ColumnName: "partner_id", ColumnType: common.IcebergColumnTypeString, Position: 38}, + {Config: config, ColumnName: "paying", ColumnType: common.IcebergColumnTypeBoolean, Position: 39}, + {Config: config, ColumnName: "plan", ColumnType: common.IcebergColumnTypeString, Position: 40}, + {Config: config, ColumnName: "platform", ColumnType: common.IcebergColumnTypeString, Position: 41}, + {Config: config, ColumnName: "processed_time", ColumnType: common.IcebergColumnTypeTimestamp, Position: 42}, + {Config: config, ColumnName: "region", ColumnType: common.IcebergColumnTypeString, Position: 43}, + {Config: config, ColumnName: "sample_rate", ColumnType: common.IcebergColumnTypeFloat, Position: 44}, + {Config: config, ColumnName: "schema", ColumnType: common.IcebergColumnTypeString, Position: 45}, + {Config: config, ColumnName: "server_received_time", ColumnType: common.IcebergColumnTypeTimestamp, Position: 46}, + {Config: config, ColumnName: "server_upload_time", ColumnType: common.IcebergColumnTypeTimestamp, Position: 47}, + {Config: config, ColumnName: "session_id", ColumnType: common.IcebergColumnTypeLong, Position: 48}, + {Config: config, ColumnName: "source_id", ColumnType: common.IcebergColumnTypeString, Position: 49}, + {Config: config, ColumnName: "start_version", ColumnType: common.IcebergColumnTypeString, Position: 50}, + {Config: config, ColumnName: "user_creation_time", ColumnType: common.IcebergColumnTypeTimestamp, Position: 51}, + {Config: config, ColumnName: "user_id", ColumnType: common.IcebergColumnTypeString, Position: 52}, + {Config: config, ColumnName: "user_properties", ColumnType: common.IcebergColumnTypeString, Position: 53}, + {Config: config, ColumnName: "uuid", ColumnType: common.IcebergColumnTypeString, Position: 54}, + {Config: config, ColumnName: "version_name", ColumnType: common.IcebergColumnTypeString, Position: 55}, } } diff --git a/src/syncer-amplitude/go.mod b/src/syncer-amplitude/go.mod index f9897f6..9498c07 100644 --- a/src/syncer-amplitude/go.mod +++ b/src/syncer-amplitude/go.mod @@ -2,15 +2,10 @@ module github.com/BemiHQ/BemiDB/src/syncer-amplitude go 1.24.4 -require ( - github.com/BemiHQ/BemiDB/src/common v0.0.0-00010101000000-000000000000 - github.com/BemiHQ/BemiDB/src/syncer-common v0.0.1 -) +require github.com/BemiHQ/BemiDB/src/common v0.0.0-00010101000000-000000000000 replace github.com/BemiHQ/BemiDB/src/common => ../common -replace github.com/BemiHQ/BemiDB/src/syncer-common => ../syncer-common - require ( github.com/apache/arrow-go/v18 v18.4.0 // indirect github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 // indirect diff --git a/src/syncer-amplitude/syncer.go b/src/syncer-amplitude/syncer.go index 57c2b29..ef02034 100644 --- a/src/syncer-amplitude/syncer.go +++ b/src/syncer-amplitude/syncer.go @@ -5,7 +5,6 @@ import ( "time" "github.com/BemiHQ/BemiDB/src/common" - "github.com/BemiHQ/BemiDB/src/syncer-common" ) const ( @@ -21,13 +20,13 @@ const ( type Syncer struct { Config *Config Amplitude *Amplitude - StorageS3 *syncerCommon.StorageS3 + StorageS3 *common.StorageS3 DuckdbClient *common.DuckdbClient } func NewSyncer(config *Config) *Syncer { - storageS3 := syncerCommon.NewStorageS3(config.CommonConfig) - duckdbClient := common.NewDuckdbClient(config.CommonConfig, syncerCommon.DUCKDB_BOOT_QUERIES) + storageS3 := common.NewStorageS3(config.CommonConfig) + duckdbClient := common.NewDuckdbClient(config.CommonConfig, common.SYNCER_DUCKDB_BOOT_QUERIES) return &Syncer{ Config: config, @@ -38,17 +37,18 @@ func NewSyncer(config *Config) *Syncer { } func (syncer *Syncer) Sync() { - syncerCommon.SendAnonymousAnalytics(syncer.Config.CommonConfig, "syncer-amplitude-start", syncer.name()) + common.SendAnonymousAnalytics(syncer.Config.CommonConfig, "syncer-amplitude-start", syncer.name()) - cappedBuffer := syncerCommon.NewCappedBuffer(syncer.Config.CommonConfig, MAX_IN_MEMORY_BUFFER_SIZE) - jsonQueueWriter := syncerCommon.NewJsonQueueWriter(cappedBuffer) + cappedBuffer := common.NewCappedBuffer(syncer.Config.CommonConfig, MAX_IN_MEMORY_BUFFER_SIZE) + jsonQueueWriter := common.NewJsonQueueWriter(cappedBuffer) - icebergTable := syncerCommon.NewIcebergTable(syncer.Config.CommonConfig, syncer.StorageS3, syncer.DuckdbClient, syncer.Config.DestinationSchemaName, EVENTS_TABLE_NAME) + icebergSchemaTable := common.IcebergSchemaTable{Schema: syncer.Config.DestinationSchemaName, Table: EVENTS_TABLE_NAME} + icebergTable := common.NewIcebergTable(syncer.Config.CommonConfig, syncer.StorageS3, syncer.DuckdbClient, icebergSchemaTable) cursorValue := icebergTable.LastCursorValue(CURSOR_COLUMN_NAME) lastSyncedTime := syncer.Config.StartDate if cursorValue.StringValue != "" { - lastSyncedTime = syncerCommon.StringMsToUtcTime(cursorValue.StringValue).Truncate(time.Hour).Add(time.Hour) // add 1 hour to ensure we don't overlap + lastSyncedTime = common.StringMsToUtcTime(cursorValue.StringValue).Truncate(time.Hour).Add(time.Hour) // add 1 hour to ensure we don't overlap } now := time.Now().UTC() endOfSyncWindow := now.Add(-AMPLITUDE_DATA_DELAY).Truncate(time.Hour) @@ -75,10 +75,10 @@ func (syncer *Syncer) Sync() { // Read from cappedBuffer and write to Iceberg icebergSchemaColumns := EventIcebergSchemaColumns(syncer.Config.CommonConfig) - icebergWriter := syncerCommon.NewIcebergWriter(syncer.Config.CommonConfig, syncer.StorageS3, syncer.DuckdbClient, icebergSchemaColumns, COMPRESSION_FACTOR) - icebergWriter.AppendFromJsonCappedBuffer(icebergTable, cursorValue, cappedBuffer) + icebergTableWriter := common.NewIcebergTableWriter(syncer.Config.CommonConfig, syncer.StorageS3, syncer.DuckdbClient, icebergTable, icebergSchemaColumns, COMPRESSION_FACTOR) + icebergTableWriter.AppendFromJsonCappedBuffer(cursorValue, cappedBuffer) - syncerCommon.SendAnonymousAnalytics(syncer.Config.CommonConfig, "syncer-amplitude-finish", syncer.name()) + common.SendAnonymousAnalytics(syncer.Config.CommonConfig, "syncer-amplitude-finish", syncer.name()) } func (syncer *Syncer) name() string { diff --git a/src/syncer-common/go.mod b/src/syncer-common/go.mod deleted file mode 100644 index 1cc67a1..0000000 --- a/src/syncer-common/go.mod +++ /dev/null @@ -1,67 +0,0 @@ -module github.com/BemiHQ/BemiDB/src/syncer-common - -go 1.24.4 - -require ( - github.com/BemiHQ/BemiDB/src/common v0.0.0-00010101000000-000000000000 - github.com/google/uuid v1.6.0 - github.com/linkedin/goavro v2.1.0+incompatible - github.com/marcboeker/go-duckdb/v2 v2.3.2 - github.com/xitongsys/parquet-go v1.6.2 - github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b - golang.org/x/exp v0.0.0-20250718183923-645b1fa84792 -) - -replace github.com/BemiHQ/BemiDB/src/common => ../common - -require ( - github.com/apache/arrow-go/v18 v18.4.0 // indirect - github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 // indirect - github.com/apache/thrift v0.22.0 // indirect - github.com/aws/aws-sdk-go-v2 v1.37.0 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 // indirect - github.com/aws/aws-sdk-go-v2/config v1.30.1 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.18.1 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0 // indirect - github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.26.0 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.35.0 // indirect - github.com/aws/smithy-go v1.22.5 // indirect - github.com/duckdb/duckdb-go-bindings v0.1.16 // indirect - github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11 // indirect - github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11 // indirect - github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11 // indirect - github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11 // indirect - github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11 // indirect - github.com/go-viper/mapstructure/v2 v2.3.0 // indirect - github.com/goccy/go-json v0.10.5 // indirect - github.com/golang/snappy v1.0.0 // indirect - github.com/google/flatbuffers v25.2.10+incompatible // indirect - github.com/jackc/pgpassfile v1.0.0 // indirect - github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect - github.com/jackc/pgx/v5 v5.7.5 // indirect - github.com/klauspost/compress v1.18.0 // indirect - github.com/klauspost/cpuid/v2 v2.2.11 // indirect - github.com/marcboeker/go-duckdb/arrowmapping v0.0.9 // indirect - github.com/marcboeker/go-duckdb/mapping v0.0.10 // indirect - github.com/pierrec/lz4/v4 v4.1.22 // indirect - github.com/zeebo/xxh3 v1.0.2 // indirect - golang.org/x/crypto v0.40.0 // indirect - golang.org/x/mod v0.26.0 // indirect - golang.org/x/sync v0.16.0 // indirect - golang.org/x/sys v0.34.0 // indirect - golang.org/x/text v0.27.0 // indirect - golang.org/x/tools v0.35.0 // indirect - golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect - gopkg.in/linkedin/goavro.v1 v1.0.5 // indirect -) diff --git a/src/syncer-common/go.sum b/src/syncer-common/go.sum deleted file mode 100644 index 79719d8..0000000 --- a/src/syncer-common/go.sum +++ /dev/null @@ -1,1160 +0,0 @@ -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.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.66.0/go.mod h1:dgqGAjKCDxyhGTtC9dAREQGUJpkceNm1yt590Qno0Ko= -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.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.82.0/go.mod h1:vlKccHJGuFBFufnAnuB08dfEH9Y3H7dzDzRECFdC2TA= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= -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 v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.2.0/go.mod h1:xlogom/6gr8RJGBe7nT2eGsQYAFUbbv8dbC29qE3Xmw= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -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/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= -cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= -cloud.google.com/go/iam v0.1.1/go.mod h1:CKqrcnI/suGpybEHxZ7BMehL0oA4LpdyJdUlTl9jVMw= -cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= -cloud.google.com/go/kms v1.1.0/go.mod h1:WdbppnCDMDpOvoYBMn1+gNmOeEoZYqAv+HeuKARGCXI= -cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= -cloud.google.com/go/monitoring v1.1.0/go.mod h1:L81pzz7HKn14QCMaCs6NTQkdBnE87TElyanS95vIcl4= -cloud.google.com/go/monitoring v1.4.0/go.mod h1:y6xnxfwI3hTFWOdkOaD7nfJVlwuC3/mS/5kvtT131p4= -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/pubsub v1.19.0/go.mod h1:/O9kmSe9bb9KRnIAWkzmqhPjHo6LtzGOBYd/kr06XSs= -cloud.google.com/go/secretmanager v1.3.0/go.mod h1:+oLTkouyiYiabAQNugCeTS3PAArGiMJuBqvJnJsyH+U= -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.12.0/go.mod h1:fFLk2dp2oAhDz8QFKwqrjdJvxSp/W2g7nillojlL5Ho= -cloud.google.com/go/storage v1.21.0/go.mod h1:XmRlxkgPjlBONznT2dDUU/5XlpU2OjMnKuqnZI01LAA= -cloud.google.com/go/trace v1.0.0/go.mod h1:4iErSByzxkyHWzzlAj63/Gmjz0NH1ASqhJguHpGcr6A= -cloud.google.com/go/trace v1.2.0/go.mod h1:Wc8y/uYyOhPy12KEnXG9XGrvfMz5F5SrYecQlbW1rwM= -contrib.go.opencensus.io/exporter/aws v0.0.0-20200617204711-c478e41e60e9/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= -contrib.go.opencensus.io/exporter/stackdriver v0.13.10/go.mod h1:I5htMbyta491eUxufwwZPQdcKvvgzMB4O9ni41YnIM8= -contrib.go.opencensus.io/integrations/ocsql v0.1.7/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/azure-amqp-common-go/v3 v3.2.1/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= -github.com/Azure/azure-amqp-common-go/v3 v3.2.2/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= -github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k= -github.com/Azure/azure-sdk-for-go v51.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v59.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.0.0/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.0.0/go.mod h1:+6sju8gk8FRmSajX3Oz4G5Gm7P+mbqE9FVaXXFYTkCM= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U= -github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.0.0/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.0.0/go.mod h1:ceIuwmxDWptoW3eCqSXlnPsZFKh4X+R38dWPv7GS9Vs= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.0.0/go.mod h1:s1tW/At+xHqjNFvWU4G0c0Qv33KOhvbGNj0RCTQDV8s= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.2.0/go.mod h1:c+Lifp3EDEamAkPVzMooRNOK6CZjNSdEnf1A7jsI9u4= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.1.0/go.mod h1:7QJP7dr2wznCMeqIrhMgWGf7XpAQnVrJqDm9nvV3Cu4= -github.com/Azure/azure-service-bus-go v0.11.5/go.mod h1:MI6ge2CuQWBVq+ly456MY7XqNLJip5LO1iSFodbNLbU= -github.com/Azure/azure-storage-blob-go v0.14.0/go.mod h1:SMqIBi+SuiQH32bvyjngEewEeXoPfKMgWlBDaYf6fck= -github.com/Azure/go-amqp v0.16.0/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= -github.com/Azure/go-amqp v0.16.4/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest v0.11.19/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest v0.11.22/go.mod h1:BAWYUWGPEtKPzjVkp0Q6an0MJcJDsoh5Z1BFAEFs4Xs= -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/adal v0.9.14/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/adal v0.9.17/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= -github.com/Azure/go-autorest/autorest/azure/auth v0.5.9/go.mod h1:hg3/1yw0Bq87O3KvvnJoAh34/0zbP7SFizX/qN5JvjU= -github.com/Azure/go-autorest/autorest/azure/cli v0.4.2/go.mod h1:7qkJkT+j6b+hIpzMOwPChJhTqS8VbsqqgULzMNRugoM= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= -github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/AzureAD/microsoft-authentication-library-for-go v0.4.0/go.mod h1:Vt9sXTKwMyGcOxSmLDMnGPgqsUg7m8pe215qMLrDXw4= -github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/GoogleCloudPlatform/cloudsql-proxy v1.29.0/go.mod h1:spvB9eLJH9dutlbPSRmHvSXXHOwGRyeXh1jVdquA2G8= -github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= -github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/apache/arrow-go/v18 v18.4.0 h1:/RvkGqH517iY8bZKc4FD5/kkdwXJGjxf28JIXbJ/oB0= -github.com/apache/arrow-go/v18 v18.4.0/go.mod h1:Aawvwhj8x2jURIzD9Moy72cF0FyJXOpkYpdmGRHcw14= -github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 h1:byKBBF2CKWBjjA4J1ZL2JXttJULvWSl50LegTyRZ728= -github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516/go.mod h1:QNYViu/X0HXDHw7m3KXzWSVXIbfUvJqBFe6Gj8/pYA0= -github.com/apache/thrift v0.0.0-20181112125854-24918abba929/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.14.2/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.22.0 h1:r7mTJdj51TMDe6RtcmNdQxgn9XcyfGDOzegMDRg47uc= -github.com/apache/thrift v0.22.0/go.mod h1:1e7J/O1Ae6ZQMTYdy9xa3w9k+XHWPfRvdPyJeynQ+/g= -github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= -github.com/aws/aws-sdk-go v1.30.19/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= -github.com/aws/aws-sdk-go v1.37.0/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go v1.43.31 h1:yJZIr8nMV1hXjAvvOLUFqZRJcHV7udPQBfhJqawDzI0= -github.com/aws/aws-sdk-go v1.43.31/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= -github.com/aws/aws-sdk-go-v2 v1.16.2/go.mod h1:ytwTPBG6fXTZLxxeeCCWj2/EMYp/xDUgX+OET6TLNNU= -github.com/aws/aws-sdk-go-v2 v1.23.0/go.mod h1:i1XDttT4rnf6vxc9AuskLc6s7XBee8rlLilKlc03uAA= -github.com/aws/aws-sdk-go-v2 v1.37.0 h1:YtCOESR/pN4j5oA7cVHSfOwIcuh/KwHC4DOSXFbv5F0= -github.com/aws/aws-sdk-go-v2 v1.37.0/go.mod h1:9Q0OoGQoboYIAJyslFyF1f5K1Ryddop8gqMhWx/n4Wg= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.1/go.mod h1:n8Bs1ElDD2wJ9kCRTczA83gYbBmjSwZp3umc6zF4EeM= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.1/go.mod h1:t8PYl/6LzdAqsU4/9tz28V/kU+asFePvpOMkdul0gEQ= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 h1:6GMWV6CNpA/6fbFHnoAjrv4+LGfyTqZz2LtCHnspgDg= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0/go.mod h1:/mXlTIVG9jbxkqDnr5UQNQxW1HRYxeGklkM9vAFeabg= -github.com/aws/aws-sdk-go-v2/config v1.15.3/go.mod h1:9YL3v07Xc/ohTsxFXzan9ZpFpdTOFl4X65BAKYaz8jg= -github.com/aws/aws-sdk-go-v2/config v1.25.3/go.mod h1:tAByZy03nH5jcq0vZmkcVoo6tRzRHEwSFx3QW4NmDw8= -github.com/aws/aws-sdk-go-v2/config v1.30.1 h1:sHL8g/+9tcZATeV2tEkEfxZeaNokDtKsSjGMGHD49qA= -github.com/aws/aws-sdk-go-v2/config v1.30.1/go.mod h1:wkibEyFfxXRyTSzRU4bbF5IUsSXyE4xQ4ZjkGmi5tFo= -github.com/aws/aws-sdk-go-v2/credentials v1.11.2/go.mod h1:j8YsY9TXTm31k4eFhspiQicfXPLZ0gYXA50i4gxPE8g= -github.com/aws/aws-sdk-go-v2/credentials v1.16.2/go.mod h1:sDdvGhXrSVT5yzBDR7qXz+rhbpiMpUYfF3vJ01QSdrc= -github.com/aws/aws-sdk-go-v2/credentials v1.18.1 h1:E55xvOqlX7CvB66Z7rSM9usCrFU1ryUIUHqiXsEzVoE= -github.com/aws/aws-sdk-go-v2/credentials v1.18.1/go.mod h1:iobSQfR5MkvILxssGOvi/P1jjOhrRzfTiCPCzku0vx4= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.3/go.mod h1:uk1vhHHERfSVCUnqSqz8O48LBYDSC+k6brng09jcMOk= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.4/go.mod h1:t4i+yGHMCcUNIX1x7YVYa6bH/Do7civ5I6cG/6PMfyA= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0 h1:9sBTeKQwAvmJUWKIACIoiFSnxxl+sS++YDfr17/ngq0= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0/go.mod h1:LW9/PxQD1SYFC7pnWcgqPhoyZprhjEdg5hBK6qYPLW8= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.3/go.mod h1:0dHuD2HZZSiwfJSy1FO5bX1hQ1TxVV1QXXjpn3XUE44= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.14.0/go.mod h1:UcgIwJ9KHquYxs6Q5skC9qXjhYMK+JASDYcXQ4X7JZE= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1 h1:aAjA/1JZ1xH/F9XvxJu9cXZyp7BqVXtHpztyZ6p799E= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1/go.mod h1:ia9HASsPba/7o84sp6iE4wZPdNTJ0oicBe5sWQQk+Ys= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.9/go.mod h1:AnVH5pvai0pAF4lXRq0bmhbes1u9R8wTE+g+183bZNM= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.3/go.mod h1:7sGSz1JCKHWWBHq98m6sMtWQikmYPpxjqOydDemiVoM= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0 h1:H2iZoqW/v2Jnrh1FnU725Bq6KJ0k2uP63yH+DcY+HUI= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0/go.mod h1:L0FqLbwMXHvNC/7crWV1iIxUlOKYZUE8KuTIA+TozAI= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.3/go.mod h1:ssOhaLpRlh88H3UmEcsBoVKq309quMvm3Ds8e9d4eJM= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.3/go.mod h1:ify42Rb7nKeDDPkFjKn7q1bPscVPu/+gmHH8d2c+anU= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0 h1:EDped/rNzAhFPhVY0sDGbtD16OKqksfA8OjF/kLEgw8= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0/go.mod h1:uUI335jvzpZRPpjYx6ODc/wg1qH+NnoSTK/FwVeK0C0= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.10/go.mod h1:8DcYQcz0+ZJaSxANlHIsbbi6S+zMwjwdDqwW3r9AzaE= -github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.3/go.mod h1:5yzAuE9i2RkVAttBl8yxZgQr5OCq4D5yDnG7j9x2L0U= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0 h1:iLvW/zOkHGU3BDU5thWnj+UZ9pjhuVhv1loLj7yVtBw= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0/go.mod h1:Fn3gvhdF1x5Rs9nUoCy/fJT1ms8f8dO7RqM9lJHuazQ= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.1/go.mod h1:GeUru+8VzrTXV/83XyMJ80KpH8xO89VPoUileyNQ+tc= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1/go.mod h1:l9ymW25HOqymeU2m1gbUQ3rUIsTwKs8gYHXkqDQUhiI= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 h1:6+lZi2JeGKtCraAj1rpoZfKqnQ9SptseRZioejfUOLM= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0/go.mod h1:eb3gfbVIxIoGgJsi9pGne19dhCBpK6opTYpQqAmdy44= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.3/go.mod h1:Seb8KNmD6kVTjwRjVEgOT5hPin6sq+v4C2ycJQDwuH8= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.3/go.mod h1:R+/S1O4TYpcktbVwddeOYg+uwUfLhADP2S/x4QwsCTM= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0 h1:qGyLBQPphYzUf+IIlb5tHnvg1U2Vc5hXPcP7oRSQfy0= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0/go.mod h1:g+dzKSLXiR/8ATkPXmLhPOI6rDdjLP3tngeo3FvDcIw= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.3/go.mod h1:wlY6SVjuwvh3TVRpTqdy4I1JpBFLX4UGeKZdWntaocw= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.3/go.mod h1:Owv1I59vaghv1Ax8zz8ELY8DN7/Y0rGS+WWAmjgi950= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0 h1:eRhU3Sh8dGbaniI6B+I48XJMrTPRkK4DKo+vqIxziOU= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0/go.mod h1:paNLV18DZ6FnWE/bd06RIKPDIFpjuvCkGKWTG/GDBeM= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.3/go.mod h1:Bm/v2IaN6rZ+Op7zX+bOUMdL4fsrYZiD0dsjLhNKwZc= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.3/go.mod h1:KZgs2ny8HsxRIRbDwgvJcHHBZPOzQr/+NtGwnP+w2ec= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0 h1:6jusT+XCcvnD+Elxvm7bUf5sCMTpZEp3AKjYQ4tWJSo= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0/go.mod h1:LimGpdIF/sTBdgqwOEkrArXLCoTamK/9L9x8IKBFTIc= -github.com/aws/aws-sdk-go-v2/service/kms v1.16.3/go.mod h1:QuiHPBqlOFCi4LqdSskYYAWpQlx3PKmohy+rE2F+o5g= -github.com/aws/aws-sdk-go-v2/service/s3 v1.26.3/go.mod h1:g1qvDuRsJY+XghsV6zg00Z4KJ7DtFFCx8fJD2a491Ak= -github.com/aws/aws-sdk-go-v2/service/s3 v1.43.0/go.mod h1:NXRKkiRF+erX2hnybnVU660cYT5/KChRD4iUgJ97cI8= -github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0 h1:gAV4NEp4A+JOrIdoXkAeyy6IOo7+X2s/jRuaHKYiMaU= -github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0/go.mod h1:JIQwK8sZ5MuKGm5rrFwp9MHUcyYEsQNpVixuPDlnwaU= -github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.15.4/go.mod h1:PJc8s+lxyU8rrre0/4a0pn2wgwiDvOEzoOjcJUBr67o= -github.com/aws/aws-sdk-go-v2/service/sns v1.17.4/go.mod h1:kElt+uCcXxcqFyc+bQqZPFD9DME/eC6oHBXvFzQ9Bcw= -github.com/aws/aws-sdk-go-v2/service/sqs v1.18.3/go.mod h1:skmQo0UPvsjsuYYSYMVmrPc1HWCbHUJyrCEp+ZaLzqM= -github.com/aws/aws-sdk-go-v2/service/ssm v1.24.1/go.mod h1:NR/xoKjdbRJ+qx0pMR4mI+N/H1I1ynHwXnO6FowXJc0= -github.com/aws/aws-sdk-go-v2/service/sso v1.11.3/go.mod h1:7UQ/e69kU7LDPtY40OyoHYgRmgfGM4mgsLYtcObdveU= -github.com/aws/aws-sdk-go-v2/service/sso v1.17.2/go.mod h1:/pE21vno3q1h4bbhUOEi+6Zu/aT26UK2WKkDXd+TssQ= -github.com/aws/aws-sdk-go-v2/service/sso v1.26.0 h1:cuFWHH87GP1NBGXXfMicUbE7Oty5KpPxN6w4JpmuxYc= -github.com/aws/aws-sdk-go-v2/service/sso v1.26.0/go.mod h1:aJBemdlbCKyOXEXdXBqS7E+8S9XTDcOTaoOjtng54hA= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.20.0/go.mod h1:dWqm5G767qwKPuayKfzm4rjzFmVjiBFbOJrpSPnAMDs= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0 h1:t2va+wewPOYIqC6XyJ4MGjiGKkczMAPsgq5W4FtL9ME= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0/go.mod h1:ExCTcqYqN0hYYRsDlBVU8+68grqlWdgX9/nZJwQW4aY= -github.com/aws/aws-sdk-go-v2/service/sts v1.16.3/go.mod h1:bfBj0iVmsUyUg4weDB4NxktD9rDGeKSVWnjTnwbx9b8= -github.com/aws/aws-sdk-go-v2/service/sts v1.25.3/go.mod h1:4EqRHDCKP78hq3zOnmFXu5k0j4bXbRFfCh/zQ6KnEfQ= -github.com/aws/aws-sdk-go-v2/service/sts v1.35.0 h1:FD9agdG4CeOGS3ORLByJk56YIXDS7mxFpmZyCtpqExc= -github.com/aws/aws-sdk-go-v2/service/sts v1.35.0/go.mod h1:NDzDPbBF1xtSTZUMuZx0w3hIfWzcL7X2AQ0Tr9becIQ= -github.com/aws/smithy-go v1.11.2/go.mod h1:3xHYmszWVx2c0kIwQeEVf9uSm4fYZt67FBJnwub1bgM= -github.com/aws/smithy-go v1.17.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= -github.com/aws/smithy-go v1.22.5 h1:P9ATCXPMb2mPjYBgueqJNCA5S9UfktsW0tTxi+a7eqw= -github.com/aws/smithy-go v1.22.5/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/bobg/gcsobj v0.1.2/go.mod h1:vS49EQ1A1Ib8FgrL58C8xXYZyOCR2TgzAdopy6/ipa8= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -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/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/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= -github.com/colinmarc/hdfs/v2 v2.1.1/go.mod h1:M3x+k8UKKmxtFu++uAZ0OtDU8jR3jnaZIAc6yK4Ue0c= -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/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU= -github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= -github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= -github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= -github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= -github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/duckdb/duckdb-go-bindings v0.1.16 h1:XPCk9hzP06PoWIxDPVU3gAy0m1XmLaZHTzLggNx/U9k= -github.com/duckdb/duckdb-go-bindings v0.1.16/go.mod h1:pBnfviMzANT/9hi4bg+zW4ykRZZPCXlVuvBWEcZofkc= -github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11 h1:GXQkG4HmEbwPtqCSabJTp9wZQQ7Gqr3KveLNesQWQOs= -github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11/go.mod h1:Ezo7IbAfB8NP7CqPIN8XEHKUg5xdRRQhcPPlCXImXYA= -github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11 h1:ATJMSBIDA/YAm/6CKeBDRtGK1OOwqfTZbWg9Y5fAc9E= -github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11/go.mod h1:eS7m/mLnPQgVF4za1+xTyorKRBuK0/BA44Oy6DgrGXI= -github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11 h1:AjvnGst1avyOECYiykthyHR4DTYTaqNDPr5W/0t5j0k= -github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11/go.mod h1:1GOuk1PixiESxLaCGFhag+oFi7aP+9W8byymRAvunBk= -github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11 h1:j3B1biawuhtxe2Chkiqcwf1Kxe8VJc8lLVmjBIcJrkI= -github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11/go.mod h1:o7crKMpT2eOIi5/FY6HPqaXcvieeLSqdXXaXbruGX7w= -github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11 h1:xR3vRE8y+48U6xDNkUlOfbl7/OTA7FVcDXJ+5vETuHU= -github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11/go.mod h1:IlOhJdVKUJCAPj3QsDszUo8DVdvp1nBFp4TUJVdw99s= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -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/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= -github.com/gin-gonic/gin v1.7.3/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= -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-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= -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-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= -github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-viper/mapstructure/v2 v2.3.0 h1:27XbWsHIqhbdR5TIC911OfYvgSaW93HM+dX7970Q7jk= -github.com/go-viper/mapstructure/v2 v2.3.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= -github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= -github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.4.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= -github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188/go.mod h1:vXjM/+wXQnTPR4KqTKDgJukSZ6amVRtWMPEjE6sQoK8= -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/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/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -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.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= -github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -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/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/flatbuffers v25.2.10+incompatible h1:F3vclr7C3HpB1k9mxCGRMXq6FdUalZ6H/pNX4FP1v0Q= -github.com/google/flatbuffers v25.2.10+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -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.6/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.8/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/go-replayers/grpcreplay v1.1.0/go.mod h1:qzAvJ8/wi57zq7gWqaE6AwLM6miiXUQwP1S+I9icmhk= -github.com/google/go-replayers/httpreplay v1.1.1/go.mod h1:gN9GeLIs7l6NUoVaSSnv2RiqK1NiwAmD0MrKeC9IIks= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+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/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -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-20200905233945-acf8798be1f7/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-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210506205249-923b5ab0fc1a/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.2.0/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.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= -github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/wire v0.5.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU= -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.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hanwen/go-fuse v1.0.0/go.mod h1:unqXarDXqzAk0rt98O2tVndEPIpUgLD9+rwFisZH3Ok= -github.com/hanwen/go-fuse/v2 v2.1.0/go.mod h1:oRyA5eK+pvJyv5otpO/DgccS8y/RvYMaO00GgRLGryc= -github.com/hashicorp/go-uuid v0.0.0-20180228145832-27454136f036/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -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/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/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.11.0/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= -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/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.2.0/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-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= -github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/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.10.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.15.0/go.mod h1:D/zyOyXiaM1TmVWnOM18p0xdDtdakRBa0RsVGI3U3bw= -github.com/jackc/pgx/v5 v5.7.5 h1:JHGfMnQY+IEtGM63d+NGMjoRpysB2JBwDr5fsngwmJs= -github.com/jackc/pgx/v5 v5.7.5/go.mod h1:aruU7o91Tc2q2cFp5h4uP3f6ztExVpyVv88Xl/8Vl8M= -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.2.1 h1:gI8os0wpRXFd4FiAY2dWiqRK037tjj3t7rKFeO4X5iw= -github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= -github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= -github.com/jcmturner/gofork v0.0.0-20180107083740-2aebee971930/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= -github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= -github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -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/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= -github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= -github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.13.1/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= -github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= -github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= -github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= -github.com/klauspost/cpuid/v2 v2.2.11 h1:0OwqZRYI2rFrjS4kvkDnqJkKHdHaRnCm68/DY4OxRzU= -github.com/klauspost/cpuid/v2 v2.2.11/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= -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/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -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/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -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.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/linkedin/goavro v2.1.0+incompatible h1:DV2aUlj2xZiuxQyvag8Dy7zjY69ENjS66bWkSfdpddY= -github.com/linkedin/goavro v2.1.0+incompatible/go.mod h1:bBCwI2eGYpUI/4820s67MElg9tdeLbINjLjiM2xZFYM= -github.com/marcboeker/go-duckdb/arrowmapping v0.0.9 h1:xj+kFOqR2gH3Mcxx9LmAVHebSnCiPm303N+uxfkWVmY= -github.com/marcboeker/go-duckdb/arrowmapping v0.0.9/go.mod h1:o56AqVS90v5bpxhPnOK9La7AfNTOrMORiqTQrlRbdPQ= -github.com/marcboeker/go-duckdb/mapping v0.0.10 h1:b/y2W8/hNlD0Dwjq0mCqIlLXpjQMnWy0WqDV9b9lHQQ= -github.com/marcboeker/go-duckdb/mapping v0.0.10/go.mod h1:Ro6Tw6sGG50O8S0daZsA8TrQJz/DvGrzGvMD7Jihirw= -github.com/marcboeker/go-duckdb/v2 v2.3.2 h1:96zG2JPyIhCFjHdBjjSpOdhzJzehoGTdl7LskkuMUTs= -github.com/marcboeker/go-duckdb/v2 v2.3.2/go.mod h1:VeXz9ZM6klNvICHrXEUzaHSgNqBeTdyMxr4CICw/UaY= -github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= -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.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs= -github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= -github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI= -github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= -github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= -github.com/minio/minio-go/v7 v7.0.34/go.mod h1:nCrRzjoSUQh8hgKKtu3Y708OLvRLtuASMg2/nvmbarw= -github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= -github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= -github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= -github.com/ncw/swift v1.0.52/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -github.com/pborman/getopt v0.0.0-20180729010549-6fdd0a2c7117/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= -github.com/pierrec/lz4/v4 v4.1.8/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= -github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= -github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= -github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= -github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -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/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -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/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.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -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/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -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.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -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.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/xitongsys/parquet-go v1.5.1/go.mod h1:xUxwM8ELydxh4edHGegYq1pA8NnMKDx0K/GyB0o2bww= -github.com/xitongsys/parquet-go v1.6.2 h1:MhCaXii4eqceKPu9BwrjLqyK10oX9WF+xGhwvwbw7xM= -github.com/xitongsys/parquet-go v1.6.2/go.mod h1:IulAQyalCm0rPiZVNnCgm/PCL64X2tdSVGMQ/UeKqWA= -github.com/xitongsys/parquet-go-source v0.0.0-20190524061010-2b72cbee77d5/go.mod h1:xxCx7Wpym/3QCo6JhujJX51dzSXrwmb0oH6FQb39SEA= -github.com/xitongsys/parquet-go-source v0.0.0-20200817004010-026bad9b25d0/go.mod h1:HYhIKsdns7xz80OgkbgJYrtQY7FjHWHKH6cvN7+czGE= -github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b h1:zbb5qM/t3N+O33Vp5sFyG6yIcWZV1q7rfEjJM8UsRBQ= -github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b/go.mod h1:2ActxmJ4q17Cdruar9nKEkzKSOL1Ol03737Bkz10rTY= -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.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= -github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= -github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= -github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= -github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= -go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0= -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.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -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/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -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.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= -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.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= -gocloud.dev v0.26.0/go.mod h1:mkUgejbnbLotorqDyvedJO20XcZNTynmSeVSQS9btVg= -golang.org/x/crypto v0.0.0-20180723164146-c126467f60eb/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -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-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/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-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-20211115234514-b4de73f9ece8/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220511200225-c6db032c6c88/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= -golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM= -golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY= -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-20250718183923-645b1fa84792 h1:R9PFI6EUdfVKgwKjZef7QIwGcBKu86OEFpJ9nUEP2l4= -golang.org/x/exp v0.0.0-20250718183923-645b1fa84792/go.mod h1:A+z0yzpGtvnG90cToK5n2tu8UJVP2XUATh+r+sfOOOc= -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/lint v0.0.0-20210508222113-6edffad5e616/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.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg= -golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ= -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-20191112182307-2180aed22343/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-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -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-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211020060615-d418f374d309/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220401154927-543a649e0bdd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -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.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -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.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -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-20210220032951-036812b2e83c/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.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= -golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= -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-20191112214154-59a1497f0cea/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-20200828194041-157a740278f4/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-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/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-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/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-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220204135822-1c1b9b1eba6a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220330033206-e17cdc41300f/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-20220704084225-05e143d24a9e/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.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA= -golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -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/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -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.5/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.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4= -golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU= -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/time v0.0.0-20211116232009-f0f3c7e86c11/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220224211638-0e9765cccd65/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-20190422233926-fe54fb35175b/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-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-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-20200828161849-5deb26317202/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20200915173823-2db8f0ff891c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20200918232735-d647fc253266/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -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.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0= -golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw= -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= -golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= -golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= -gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= -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.31.0/go.mod h1:CL+9IBCa2WWU6gRuBWaKqGWLFFwbEUXkfeMkHLQWYWo= -google.golang.org/api v0.32.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -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.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.46.0/go.mod h1:ceL4oozhkAiTID8XMmJBsIxID/9wMXJVVFXPg4ylg3I= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.58.0/go.mod h1:cAbP2FsxoGVNwtgNAmmn3y5G1TWAiVYRmg4yku3lv+E= -google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.64.0/go.mod h1:931CdxA8Rm4t6zqTFGSsgwbAEZ2+GMYurbndwSimebM= -google.golang.org/api v0.66.0/go.mod h1:I1dmXYpX7HGwz/ejRxwQp2qj5bFAz93HiCU1C1oYd9M= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.68.0/go.mod h1:sOM8pTpwgflXRhz+oC8H2Dr+UcbMqkPPWNJo88Q7TH8= -google.golang.org/api v0.69.0/go.mod h1:boanBiw+h5c3s+tBPgEzLDRHfFLWV0qXxRHz3ws7C80= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -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/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-20200513103714-09dca8ec2884/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-20200831141814-d751682dd103/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-20200914193844-75d14daec038/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200921151605-7abf4a1a14d5/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-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210429181445-86c259c2b4ab/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210517163617-5e0236093d7a/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210921142501-181ce0d877f6/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211018162055-cf77aa76bad2/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211223182754-3ac035c7e7cb/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220111164026-67b88f271998/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220114231437-d2e6a121cae0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220201184016-50beb8ab5c44/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220204002441-d6cc3cc0770e/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220211171837-173942840c17/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220216160803-4663080d8bc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220401170504-314d38edb7de/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -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.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -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.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= -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.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -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-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= -gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= -gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q= -gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mNfM5bm88whjWx4= -gopkg.in/jcmturner/gokrb5.v7 v7.3.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= -gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8= -gopkg.in/linkedin/goavro.v1 v1.0.5 h1:BJa69CDh0awSsLUmZ9+BowBdokpduDZSM9Zk8oKHfN4= -gopkg.in/linkedin/goavro.v1 v1.0.5/go.mod h1:Aw5GdAbizjOEl0kAMHV9iHmA8reZzW/OKuJAl4Hb9F0= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/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/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= -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= -nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= -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/src/syncer-common/iceberg_catalog.go b/src/syncer-common/iceberg_catalog.go deleted file mode 100644 index ca54789..0000000 --- a/src/syncer-common/iceberg_catalog.go +++ /dev/null @@ -1,126 +0,0 @@ -package syncerCommon - -import ( - "context" - "database/sql" - "strings" - - "github.com/BemiHQ/BemiDB/src/common" -) - -const ( - TEMP_TABLE_SUFFIX_SYNCING = "-bemidb-syncing" - TEMP_TABLE_SUFFIX_DELETING = "-bemidb-deleting" - - CATALOG_NAME = "postgres" -) - -type IcebergCatalog struct { - Config *common.CommonConfig - SchemaName string -} - -func NewIcebergCatalog(config *common.CommonConfig, schemaName string) *IcebergCatalog { - return &IcebergCatalog{ - Config: config, - SchemaName: schemaName, - } -} - -func (catalog *IcebergCatalog) TableNames() common.Set[string] { - pgClient := catalog.newPostgresClient() - defer pgClient.Close() - - rows, err := pgClient.Query( - context.Background(), - "SELECT table_name FROM iceberg_tables WHERE table_namespace=$1 AND table_name NOT LIKE '%"+TEMP_TABLE_SUFFIX_SYNCING+"' AND table_name NOT LIKE '%"+TEMP_TABLE_SUFFIX_DELETING+"'", - catalog.SchemaName, - ) - common.PanicIfError(catalog.Config, err) - defer rows.Close() - - tableNames := make(common.Set[string]) - for rows.Next() { - var table string - err := rows.Scan(&table) - common.PanicIfError(catalog.Config, err) - tableNames.Add(table) - } - return tableNames -} - -func (catalog *IcebergCatalog) MetadataFileS3Path(icebergTableName string) string { - pgClient := catalog.newPostgresClient() - defer pgClient.Close() - - row := pgClient.QueryRow( - context.Background(), - "SELECT metadata_location FROM iceberg_tables WHERE table_namespace=$1 AND table_name=$2", - catalog.SchemaName, - icebergTableName, - ) - - var nullPath sql.NullString - err := row.Scan(&nullPath) - if !nullPath.Valid || nullPath.String == "" { - return "" - } - common.PanicIfError(catalog.Config, err) - - return nullPath.String -} - -func (catalog *IcebergCatalog) TableS3Path(icebergTableName string) string { - metadataFileS3Path := catalog.MetadataFileS3Path(icebergTableName) - if metadataFileS3Path == "" { - return "" - } - - return strings.Split(metadataFileS3Path, "/metadata/")[0] -} - -func (catalog *IcebergCatalog) RenameTable(oldIcebergTableName string, newIcebergTableName string) { - pgClient := catalog.newPostgresClient() - defer pgClient.Close() - - _, err := pgClient.Exec( - context.Background(), - "UPDATE iceberg_tables SET table_name=$1 WHERE table_namespace=$2 AND table_name=$3", - newIcebergTableName, - catalog.SchemaName, - oldIcebergTableName, - ) - common.PanicIfError(catalog.Config, err) -} - -func (catalog *IcebergCatalog) DeleteTable(icebergTableName string) { - pgClient := catalog.newPostgresClient() - defer pgClient.Close() - - _, err := pgClient.Exec( - context.Background(), - "DELETE FROM iceberg_tables WHERE table_namespace=$1 AND table_name=$2", - catalog.SchemaName, - icebergTableName, - ) - common.PanicIfError(catalog.Config, err) -} - -func (catalog *IcebergCatalog) CreateTable(icebergTableName string, metadataLocation string) { - pgClient := catalog.newPostgresClient() - defer pgClient.Close() - - _, err := pgClient.Exec( - context.Background(), - "INSERT INTO iceberg_tables (catalog_name, table_namespace, table_name, metadata_location) VALUES ($1, $2, $3, $4)", - CATALOG_NAME, - catalog.SchemaName, - icebergTableName, - metadataLocation, - ) - common.PanicIfError(catalog.Config, err) -} - -func (catalog *IcebergCatalog) newPostgresClient() *common.PostgresClient { - return common.NewPostgresClient(catalog.Config, catalog.Config.CatalogDatabaseUrl) -} diff --git a/src/syncer-common/iceberg_table.go b/src/syncer-common/iceberg_table.go deleted file mode 100644 index fcb6e9d..0000000 --- a/src/syncer-common/iceberg_table.go +++ /dev/null @@ -1,95 +0,0 @@ -package syncerCommon - -import ( - "context" - - "github.com/google/uuid" - - "github.com/BemiHQ/BemiDB/src/common" -) - -type IcebergTable struct { - Config *common.CommonConfig - SchemaName string - TableName string - IcebergCatalog *IcebergCatalog - StorageS3 *StorageS3 - DuckdbClient *common.DuckdbClient -} - -type CursorValue struct { - ColumnName string - StringValue string - OverrideRows bool // Override rows that have the same value as this cursor value (if new rows are added with the same value, they will be included in the next sync) -} - -func NewIcebergTable(config *common.CommonConfig, storageS3 *StorageS3, duckdbClient *common.DuckdbClient, schemaName string, tableName string) *IcebergTable { - return &IcebergTable{ - Config: config, - SchemaName: schemaName, - TableName: tableName, - IcebergCatalog: NewIcebergCatalog(config, schemaName), - StorageS3: storageS3, - DuckdbClient: duckdbClient, - } -} - -func (table *IcebergTable) String() string { - return table.SchemaName + "." + table.TableName -} - -func (table *IcebergTable) MetadataFileS3Path() string { - return table.IcebergCatalog.MetadataFileS3Path(table.TableName) -} - -func (table *IcebergTable) Create(tableS3Path string) { - common.LogInfo(table.Config, "Creating Iceberg table:", table.TableName) - table.IcebergCatalog.CreateTable(table.TableName, tableS3Path+"/metadata/"+ICEBERG_METADATA_INITIAL_FILE_NAME) -} - -func (table *IcebergTable) DeleteIfExists() { - tableS3Path := table.IcebergCatalog.TableS3Path(table.TableName) - if tableS3Path == "" { - return - } - - common.LogInfo(table.Config, "Deleting Iceberg table:", table.TableName) - table.StorageS3.DeleteTableFiles(tableS3Path) - table.IcebergCatalog.DeleteTable(table.TableName) -} - -func (table *IcebergTable) Rename(newName string) { - common.LogInfo(table.Config, "Renaming Iceberg table from", table.TableName, "to", newName) - table.IcebergCatalog.RenameTable(table.TableName, newName) - table.TableName = newName -} - -func (table *IcebergTable) GenerateTableS3Path() string { - return "s3://" + table.Config.Aws.S3Bucket + "/iceberg/" + table.SchemaName + "/" + table.TableName + "-" + uuid.New().String() -} - -func (table *IcebergTable) LastCursorValue(columnName string) CursorValue { - if columnName == "" { - common.Panic(table.Config, "Couldn't find cursor column for table "+table.TableName) - } - - metadataFileS3Path := table.IcebergCatalog.MetadataFileS3Path(table.TableName) - if metadataFileS3Path == "" { - common.LogDebug(table.Config, "No S3 table path found for Iceberg table:", table.TableName) - return CursorValue{ColumnName: columnName} - } - - row := table.DuckdbClient.QueryRowContext( - context.Background(), - `SELECT CAST(max("`+columnName+`") AS VARCHAR) FROM iceberg_scan('`+metadataFileS3Path+`')`, - ) - if row == nil { - return CursorValue{ColumnName: columnName} - } - - var lastCursorValue string - err := row.Scan(&lastCursorValue) - common.PanicIfError(table.Config, err) - - return CursorValue{ColumnName: columnName, StringValue: lastCursorValue} -} diff --git a/src/syncer-common/utils.go b/src/syncer-common/utils.go deleted file mode 100644 index 6e81d1a..0000000 --- a/src/syncer-common/utils.go +++ /dev/null @@ -1,135 +0,0 @@ -package syncerCommon - -import ( - "bytes" - "encoding/base64" - "encoding/hex" - "encoding/json" - "net/http" - "runtime" - "strconv" - "strings" - "time" - - "github.com/BemiHQ/BemiDB/src/common" -) - -var DUCKDB_BOOT_QUERIES = []string{ - "SET memory_limit='2GB'", - "SET threads=2", -} - -func Int64ToString(i int64) string { - return strconv.FormatInt(i, 10) -} - -func Float64ToString(i float64) string { - return strconv.FormatFloat(i, 'f', -1, 64) -} - -func StringToInt(s string) int { - int, err := strconv.Atoi(s) - if err != nil { - panic(err) - } - - return int -} - -func StringToInt64(s string) int64 { - int64Value, err := strconv.ParseInt(s, 10, 64) - if err != nil { - panic(err) - } - - return int64Value -} - -func StringToFloat64(s string) float64 { - floatValue, err := strconv.ParseFloat(s, 64) - if err != nil { - panic(err) - } - - return floatValue -} - -func StringDateToTime(str string) time.Time { - // Golang's time.Parse() function does not support parsing dates with 5+ digit years - // So we need to handle this case manually by parsing the year separately - var nonStandardYear int - parts := strings.Split(str, "-") - if len(parts) == 3 && len(parts[0]) > 4 { - nonStandardYear = StringToInt(parts[0]) - str = str[len(parts[0])-4:] // Remove the prefix from str leaving only the standard 10 characters (YYYY-MM-DD) - } - - // Parse the date string as a standard date - parsedTime, err := time.Parse("2006-01-02", str) - - // If the year is non-standard, add the year difference to the parsed time after parsing - if err == nil && nonStandardYear != 0 { - parsedTime = parsedTime.AddDate(nonStandardYear-parsedTime.Year(), 0, 0) - return parsedTime - } - - return parsedTime -} - -func HexToString(s string) (string, error) { - decoded, err := hex.DecodeString(s) - if err != nil { - return "", err - } - return string(decoded), nil -} - -func Base64ToHex(s string) string { - decoded, err := base64.StdEncoding.DecodeString(s) - if err != nil { - panic(err) - } - return strings.ToUpper(hex.EncodeToString(decoded)) -} - -func TimeToUtcStringMs(t time.Time) string { - return t.UTC().Format("2006-01-02 15:04:05.999999") -} - -func StringMsToUtcTime(s string) time.Time { - t, err := time.Parse("2006-01-02 15:04:05.999999", s) - if err != nil { - panic(err) - } - return t.UTC() -} - -type AnonymousAnalyticsData struct { - Command string `json:"command"` - OsName string `json:"osName"` - Version string `json:"version"` - S3Bucket string `json:"s3Bucket"` - Name string `json:"name"` -} - -func SendAnonymousAnalytics(config *common.CommonConfig, command string, name string) { - if config.DisableAnonymousAnalytics { - return - } - - data := AnonymousAnalyticsData{ - Command: command, - OsName: runtime.GOOS + "-" + runtime.GOARCH, - Version: common.VERSION, - S3Bucket: config.Aws.S3Endpoint + "/" + config.Aws.S3Bucket, - Name: name, - } - - jsonData, err := json.Marshal(data) - if err != nil { - return - } - - client := http.Client{Timeout: 5 * time.Second} - _, _ = client.Post("https://api.bemidb.com/api/analytics", "application/json", bytes.NewBuffer(jsonData)) -} diff --git a/src/syncer-postgres/config.go b/src/syncer-postgres/config.go index 51ff6c5..9c9f6c7 100644 --- a/src/syncer-postgres/config.go +++ b/src/syncer-postgres/config.go @@ -7,7 +7,6 @@ import ( "strings" "github.com/BemiHQ/BemiDB/src/common" - "github.com/BemiHQ/BemiDB/src/syncer-common" ) type SyncMode string @@ -104,7 +103,7 @@ func registerFlags() { flag.IntVar(&_config.Nats.FetchTimeoutSeconds, "nats-fetch-timeout-seconds", DEFAULT_NATS_FETCH_TIMEOUT_SECONDS, "NATS fetch timeout in seconds") fetchTimeoutSeconds := os.Getenv(ENV_NATS_FETCH_TIMEOUT_SECONDS) if fetchTimeoutSeconds != "" { - _config.Nats.FetchTimeoutSeconds = syncerCommon.StringToInt(fetchTimeoutSeconds) + _config.Nats.FetchTimeoutSeconds = common.StringToInt(fetchTimeoutSeconds) } } diff --git a/src/syncer-postgres/go.mod b/src/syncer-postgres/go.mod index a359417..73a68f4 100644 --- a/src/syncer-postgres/go.mod +++ b/src/syncer-postgres/go.mod @@ -4,14 +4,11 @@ go 1.24.4 require ( github.com/BemiHQ/BemiDB/src/common v0.0.0-00010101000000-000000000000 - github.com/BemiHQ/BemiDB/src/syncer-common v0.0.1 github.com/nats-io/nats.go v1.43.0 ) replace github.com/BemiHQ/BemiDB/src/common => ../common -replace github.com/BemiHQ/BemiDB/src/syncer-common => ../syncer-common - require ( github.com/apache/arrow-go/v18 v18.4.0 // indirect github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 // indirect diff --git a/src/syncer-postgres/init_test.go b/src/syncer-postgres/init_test.go index fa9529a..fa939a4 100644 --- a/src/syncer-postgres/init_test.go +++ b/src/syncer-postgres/init_test.go @@ -6,7 +6,6 @@ import ( "os" "github.com/BemiHQ/BemiDB/src/common" - "github.com/BemiHQ/BemiDB/src/syncer-common" ) var PG_SCHEMA_COLUMNS_TEST_TABLE = []PgSchemaColumn{ @@ -348,45 +347,45 @@ var CSV_ROWS_TEST_TABLE = [][]string{ }, { "2", // id - syncerCommon.BEMIDB_NULL_STRING, // bit_column + common.BEMIDB_NULL_STRING, // bit_column "f", // bool_column "", // bpchar_column - syncerCommon.BEMIDB_NULL_STRING, // varchar_column + common.BEMIDB_NULL_STRING, // varchar_column "", // text_column "-32767", // int2_column - syncerCommon.BEMIDB_NULL_STRING, // int4_column + common.BEMIDB_NULL_STRING, // int4_column "-9223372036854775807", // int8_column - syncerCommon.BEMIDB_NULL_STRING, // hugeint_column - syncerCommon.BEMIDB_NULL_STRING, // xid_column - syncerCommon.BEMIDB_NULL_STRING, // xid8_column + common.BEMIDB_NULL_STRING, // hugeint_column + common.BEMIDB_NULL_STRING, // xid_column + common.BEMIDB_NULL_STRING, // xid8_column "NaN", // float4_column "-3.141592653589793", // float8_column "-12345.00", // numeric_column - syncerCommon.BEMIDB_NULL_STRING, // numeric_column_without_precision + common.BEMIDB_NULL_STRING, // numeric_column_without_precision "20025-11-12", // date_column "12:00:00.123", // time_column - syncerCommon.BEMIDB_NULL_STRING, // timeMsColumn + common.BEMIDB_NULL_STRING, // timeMsColumn "12:00:00.12300+05", // timetz_column "12:00:00.1+05", // timetz_ms_column "2024-01-01 12:00:00", // timestamp_column - syncerCommon.BEMIDB_NULL_STRING, // timestamp_ms_column + common.BEMIDB_NULL_STRING, // timestamp_ms_column "2024-01-01 12:00:00.000123+05:30", // timestamptz_column "2024-01-01 12:00:00.12+05", // timestamptz_ms_column - syncerCommon.BEMIDB_NULL_STRING, // uuid_column - syncerCommon.BEMIDB_NULL_STRING, // bytea_column - syncerCommon.BEMIDB_NULL_STRING, // interval_column - syncerCommon.BEMIDB_NULL_STRING, // tsvector_column - syncerCommon.BEMIDB_NULL_STRING, // xml_column - syncerCommon.BEMIDB_NULL_STRING, // pg_snapshot_column - syncerCommon.BEMIDB_NULL_STRING, // point_column - syncerCommon.BEMIDB_NULL_STRING, // inet_column - syncerCommon.BEMIDB_NULL_STRING, // json_column + common.BEMIDB_NULL_STRING, // uuid_column + common.BEMIDB_NULL_STRING, // bytea_column + common.BEMIDB_NULL_STRING, // interval_column + common.BEMIDB_NULL_STRING, // tsvector_column + common.BEMIDB_NULL_STRING, // xml_column + common.BEMIDB_NULL_STRING, // pg_snapshot_column + common.BEMIDB_NULL_STRING, // point_column + common.BEMIDB_NULL_STRING, // inet_column + common.BEMIDB_NULL_STRING, // json_column "{}", // jsonb_column - syncerCommon.BEMIDB_NULL_STRING, // array_text_column + common.BEMIDB_NULL_STRING, // array_text_column "{}", // array_int_column - syncerCommon.BEMIDB_NULL_STRING, // array_jsonb_column - syncerCommon.BEMIDB_NULL_STRING, // array_ltree_column - syncerCommon.BEMIDB_NULL_STRING, // user_defined_column + common.BEMIDB_NULL_STRING, // array_jsonb_column + common.BEMIDB_NULL_STRING, // array_ltree_column + common.BEMIDB_NULL_STRING, // user_defined_column }, } var CSV_ROWS_PARTITIONED_TABLE1 = [][]string{{"2024-01-01 01:02:03.123456"}} @@ -803,7 +802,7 @@ var JSON_ROWS_EMPTY_TABLE = []string{ func init() { config := loadTestConfig() - storageS3 := syncerCommon.NewStorageS3(config.CommonConfig) + storageS3 := common.NewStorageS3(config.CommonConfig) duckdbClient := common.NewDuckdbClient(config.CommonConfig) utils := NewSyncerUtils(config, storageS3, duckdbClient) @@ -859,7 +858,7 @@ func setTestArgs(args []string) { } func createTestTableViaFullRefresh(syncer *SyncerFullRefresh, pgSchemaTable PgSchemaTable, pgSchemaColumns []PgSchemaColumn, rows [][]string) { - cappedBuffer := syncerCommon.NewCappedBuffer(syncer.Config.CommonConfig, MAX_IN_MEMORY_BUFFER_SIZE) + cappedBuffer := common.NewCappedBuffer(syncer.Config.CommonConfig, MAX_IN_MEMORY_BUFFER_SIZE) writer := csv.NewWriter(cappedBuffer) headerRow := []string{} diff --git a/src/syncer-postgres/pg_schema_column.go b/src/syncer-postgres/pg_schema_column.go index e2b7c03..d8ab70e 100644 --- a/src/syncer-postgres/pg_schema_column.go +++ b/src/syncer-postgres/pg_schema_column.go @@ -3,7 +3,7 @@ package main import ( "strings" - "github.com/BemiHQ/BemiDB/src/syncer-common" + "github.com/BemiHQ/BemiDB/src/common" ) const ( @@ -31,55 +31,55 @@ func NewPgSchemaColumn(config *Config) *PgSchemaColumn { } } -func (pgSchemaColumn *PgSchemaColumn) ToIcebergSchemaColumn() *syncerCommon.IcebergSchemaColumn { - icebergSchemaColumn := &syncerCommon.IcebergSchemaColumn{ +func (pgSchemaColumn *PgSchemaColumn) ToIcebergSchemaColumn() *common.IcebergSchemaColumn { + icebergSchemaColumn := &common.IcebergSchemaColumn{ Config: pgSchemaColumn.Config.CommonConfig, ColumnName: pgSchemaColumn.ColumnName, - Position: syncerCommon.StringToInt(pgSchemaColumn.OrdinalPosition), - NumericPrecision: syncerCommon.StringToInt(pgSchemaColumn.NumericPrecision), - NumericScale: syncerCommon.StringToInt(pgSchemaColumn.NumericScale), + Position: common.StringToInt(pgSchemaColumn.OrdinalPosition), + NumericPrecision: common.StringToInt(pgSchemaColumn.NumericPrecision), + NumericScale: common.StringToInt(pgSchemaColumn.NumericScale), IsList: pgSchemaColumn.DataType == PG_DATA_TYPE_ARRAY, IsRequired: pgSchemaColumn.IsNullable != PG_TRUE, IsPartOfUniqueIndex: pgSchemaColumn.IsPartOfUniqueIndex, - DatetimePrecision: syncerCommon.StringToInt(pgSchemaColumn.DatetimePrecision), + DatetimePrecision: common.StringToInt(pgSchemaColumn.DatetimePrecision), PgPrimitiveColumnType: strings.TrimLeft(pgSchemaColumn.UdtName, "_"), } switch icebergSchemaColumn.PgPrimitiveColumnType { case "bool": - icebergSchemaColumn.ColumnType = syncerCommon.IcebergColumnTypeBoolean + icebergSchemaColumn.ColumnType = common.IcebergColumnTypeBoolean case "bit", "int2", "int4": - icebergSchemaColumn.ColumnType = syncerCommon.IcebergColumnTypeInteger + icebergSchemaColumn.ColumnType = common.IcebergColumnTypeInteger case "xid": - icebergSchemaColumn.ColumnType = syncerCommon.IcebergColumnTypeLong + icebergSchemaColumn.ColumnType = common.IcebergColumnTypeLong case "int8", "xid8", "interval": - icebergSchemaColumn.ColumnType = syncerCommon.IcebergColumnTypeDecimal + icebergSchemaColumn.ColumnType = common.IcebergColumnTypeDecimal case "float4": - icebergSchemaColumn.ColumnType = syncerCommon.IcebergColumnTypeFloat + icebergSchemaColumn.ColumnType = common.IcebergColumnTypeFloat case "float8": - icebergSchemaColumn.ColumnType = syncerCommon.IcebergColumnTypeDouble + icebergSchemaColumn.ColumnType = common.IcebergColumnTypeDouble case "numeric": - icebergSchemaColumn.ColumnType = syncerCommon.IcebergColumnTypeDecimal + icebergSchemaColumn.ColumnType = common.IcebergColumnTypeDecimal case "date": - icebergSchemaColumn.ColumnType = syncerCommon.IcebergColumnTypeDate + icebergSchemaColumn.ColumnType = common.IcebergColumnTypeDate case "time": - icebergSchemaColumn.ColumnType = syncerCommon.IcebergColumnTypeTime + icebergSchemaColumn.ColumnType = common.IcebergColumnTypeTime case "timetz": - icebergSchemaColumn.ColumnType = syncerCommon.IcebergColumnTypeTimeTz + icebergSchemaColumn.ColumnType = common.IcebergColumnTypeTimeTz case "timestamp", "timestamptz": - icebergSchemaColumn.ColumnType = syncerCommon.IcebergColumnTypeTimestamp + icebergSchemaColumn.ColumnType = common.IcebergColumnTypeTimestamp case "varchar", "char", "text", "jsonb", "json", "bpchar", "uuid", "point", "line", "lseg", "box", "path", "polygon", "circle", "cidr", "inet", "macaddr", "macaddr8", "ltree", "tsvector", "xml", "pg_snapshot": - icebergSchemaColumn.ColumnType = syncerCommon.IcebergColumnTypeString + icebergSchemaColumn.ColumnType = common.IcebergColumnTypeString case "bytea": - icebergSchemaColumn.ColumnType = syncerCommon.IcebergColumnTypeBinary + icebergSchemaColumn.ColumnType = common.IcebergColumnTypeBinary default: // User-defined types -> VARCHAR if pgSchemaColumn.Namespace != PG_SCHEMA_PG_CATALOG { - icebergSchemaColumn.PgPrimitiveColumnType = syncerCommon.PG_USER_DEFINED_PRIMITIVE_TYPE - icebergSchemaColumn.ColumnType = syncerCommon.IcebergColumnTypeString + icebergSchemaColumn.PgPrimitiveColumnType = common.PG_USER_DEFINED_PRIMITIVE_TYPE + icebergSchemaColumn.ColumnType = common.IcebergColumnTypeString } else { panic("Unsupported PostgreSQL type: " + pgSchemaColumn.UdtName) } diff --git a/src/syncer-postgres/syncer.go b/src/syncer-postgres/syncer.go index 94732aa..f696c08 100644 --- a/src/syncer-postgres/syncer.go +++ b/src/syncer-postgres/syncer.go @@ -4,19 +4,18 @@ import ( "net/url" "github.com/BemiHQ/BemiDB/src/common" - "github.com/BemiHQ/BemiDB/src/syncer-common" ) type Syncer struct { Config *Config Utils *SyncerUtils - StorageS3 *syncerCommon.StorageS3 + StorageS3 *common.StorageS3 DuckdbClient *common.DuckdbClient } func NewSyncer(config *Config) *Syncer { - storageS3 := syncerCommon.NewStorageS3(config.CommonConfig) - duckdbClient := common.NewDuckdbClient(config.CommonConfig, syncerCommon.DUCKDB_BOOT_QUERIES) + storageS3 := common.NewStorageS3(config.CommonConfig) + duckdbClient := common.NewDuckdbClient(config.CommonConfig, common.SYNCER_DUCKDB_BOOT_QUERIES) return &Syncer{ Config: config, @@ -27,7 +26,7 @@ func NewSyncer(config *Config) *Syncer { } func (syncer *Syncer) Sync() { - syncerCommon.SendAnonymousAnalytics(syncer.Config.CommonConfig, "syncer-postgres-start", syncer.name()) + common.SendAnonymousAnalytics(syncer.Config.CommonConfig, "syncer-postgres-start", syncer.name()) postgres := NewPostgres(syncer.Config) defer postgres.Close() @@ -46,7 +45,7 @@ func (syncer *Syncer) Sync() { NewSyncerFullRefresh(syncer.Config, syncer.Utils, syncer.StorageS3, syncer.DuckdbClient).Sync(postgres, pgSchemaTables) } - syncerCommon.SendAnonymousAnalytics(syncer.Config.CommonConfig, "syncer-postgres-finish", syncer.name()) + common.SendAnonymousAnalytics(syncer.Config.CommonConfig, "syncer-postgres-finish", syncer.name()) } func (syncer *Syncer) pgSchemaTables(postgres *Postgres) []PgSchemaTable { diff --git a/src/syncer-postgres/syncer_full_refresh.go b/src/syncer-postgres/syncer_full_refresh.go index 5f5021d..67cd0d9 100644 --- a/src/syncer-postgres/syncer_full_refresh.go +++ b/src/syncer-postgres/syncer_full_refresh.go @@ -2,22 +2,16 @@ package main import ( "github.com/BemiHQ/BemiDB/src/common" - "github.com/BemiHQ/BemiDB/src/syncer-common" -) - -const ( - TEMP_TABLE_SUFFIX_SYNCING = "-bemidb-syncing" - TEMP_TABLE_SUFFIX_DELETING = "-bemidb-deleting" ) type SyncerFullRefresh struct { Config *Config Utils *SyncerUtils - StorageS3 *syncerCommon.StorageS3 + StorageS3 *common.StorageS3 DuckdbClient *common.DuckdbClient } -func NewSyncerFullRefresh(config *Config, utils *SyncerUtils, storageS3 *syncerCommon.StorageS3, duckdbClient *common.DuckdbClient) *SyncerFullRefresh { +func NewSyncerFullRefresh(config *Config, utils *SyncerUtils, storageS3 *common.StorageS3, duckdbClient *common.DuckdbClient) *SyncerFullRefresh { return &SyncerFullRefresh{ Config: config, Utils: utils, @@ -43,7 +37,7 @@ func (syncer *SyncerFullRefresh) Sync(postgres *Postgres, pgSchemaTables []PgSch func (syncer *SyncerFullRefresh) syncTable(postgres *Postgres, pgSchemaTable PgSchemaTable, pgSchemaColumns []PgSchemaColumn) { // Create a capped buffer read and written in parallel - cappedBuffer := syncerCommon.NewCappedBuffer(syncer.Config.CommonConfig, MAX_IN_MEMORY_BUFFER_SIZE) + cappedBuffer := common.NewCappedBuffer(syncer.Config.CommonConfig, MAX_IN_MEMORY_BUFFER_SIZE) // Copy from PG to cappedBuffer in a separate goroutine in parallel go func() { @@ -54,36 +48,39 @@ func (syncer *SyncerFullRefresh) syncTable(postgres *Postgres, pgSchemaTable PgS syncer.writeToIceberg(pgSchemaTable, pgSchemaColumns, cappedBuffer) } -func (syncer *SyncerFullRefresh) writeToIceberg(pgSchemaTable PgSchemaTable, pgSchemaColumns []PgSchemaColumn, cappedBuffer *syncerCommon.CappedBuffer) { +func (syncer *SyncerFullRefresh) writeToIceberg(pgSchemaTable PgSchemaTable, pgSchemaColumns []PgSchemaColumn, cappedBuffer *common.CappedBuffer) { // Delete -syncing table - syncingIcebergTable := syncerCommon.NewIcebergTable(syncer.Config.CommonConfig, syncer.StorageS3, syncer.DuckdbClient, syncer.Config.DestinationSchemaName, pgSchemaTable.IcebergTableName()+TEMP_TABLE_SUFFIX_SYNCING) - syncingIcebergTable.DeleteIfExists() + syncingIcebergSchemaTable := common.IcebergSchemaTable{Schema: syncer.Config.DestinationSchemaName, Table: pgSchemaTable.IcebergTableName() + common.TEMP_TABLE_SUFFIX_SYNCING} + syncingIcebergTable := common.NewIcebergTable(syncer.Config.CommonConfig, syncer.StorageS3, syncer.DuckdbClient, syncingIcebergSchemaTable) + syncingIcebergTable.DropIfExists() // Insert and create -syncing table - icebergSchemaColumns := make([]*syncerCommon.IcebergSchemaColumn, len(pgSchemaColumns)) + icebergSchemaColumns := make([]*common.IcebergSchemaColumn, len(pgSchemaColumns)) for i, pgSchemaColumn := range pgSchemaColumns { icebergSchemaColumns[i] = pgSchemaColumn.ToIcebergSchemaColumn() } - icebergWriter := syncerCommon.NewIcebergWriter(syncer.Config.CommonConfig, syncer.StorageS3, syncer.DuckdbClient, icebergSchemaColumns, 1) - icebergWriter.InsertFromCsvCappedBuffer(syncingIcebergTable, cappedBuffer) + icebergTableWriter := common.NewIcebergTableWriter(syncer.Config.CommonConfig, syncer.StorageS3, syncer.DuckdbClient, syncingIcebergTable, icebergSchemaColumns, 1) + icebergTableWriter.InsertFromCsvCappedBuffer(cappedBuffer) // Delete -deleting table - deletingIcebergTable := syncerCommon.NewIcebergTable(syncer.Config.CommonConfig, syncer.StorageS3, syncer.DuckdbClient, syncer.Config.DestinationSchemaName, pgSchemaTable.IcebergTableName()+TEMP_TABLE_SUFFIX_DELETING) - deletingIcebergTable.DeleteIfExists() + deletingIcebergSchemaTable := common.IcebergSchemaTable{Schema: syncer.Config.DestinationSchemaName, Table: pgSchemaTable.IcebergTableName() + common.TEMP_TABLE_SUFFIX_DELETING} + deletingIcebergTable := common.NewIcebergTable(syncer.Config.CommonConfig, syncer.StorageS3, syncer.DuckdbClient, deletingIcebergSchemaTable) + deletingIcebergTable.DropIfExists() // Rename table to -deleting - icebergTable := syncerCommon.NewIcebergTable(syncer.Config.CommonConfig, syncer.StorageS3, syncer.DuckdbClient, syncer.Config.DestinationSchemaName, pgSchemaTable.IcebergTableName()) - icebergTable.Rename(deletingIcebergTable.TableName) + icebergSchemaTable := common.IcebergSchemaTable{Schema: syncer.Config.DestinationSchemaName, Table: pgSchemaTable.IcebergTableName()} + icebergTable := common.NewIcebergTable(syncer.Config.CommonConfig, syncer.StorageS3, syncer.DuckdbClient, icebergSchemaTable) + icebergTable.Rename(deletingIcebergSchemaTable.Table) // Rename -syncing to table syncingIcebergTable.Rename(pgSchemaTable.IcebergTableName()) // Delete -deleting table - deletingIcebergTable.DeleteIfExists() + deletingIcebergTable.DropIfExists() } -func (syncer *SyncerFullRefresh) copyFromPgTable(postgres *Postgres, pgSchemaTable PgSchemaTable, cappedBuffer *syncerCommon.CappedBuffer) { - copySql := "COPY (SELECT * FROM " + pgSchemaTable.String() + ") TO STDOUT WITH CSV HEADER NULL '" + syncerCommon.BEMIDB_NULL_STRING + "'" +func (syncer *SyncerFullRefresh) copyFromPgTable(postgres *Postgres, pgSchemaTable PgSchemaTable, cappedBuffer *common.CappedBuffer) { + copySql := "COPY (SELECT * FROM " + pgSchemaTable.String() + ") TO STDOUT WITH CSV HEADER NULL '" + common.BEMIDB_NULL_STRING + "'" result, err := postgres.PostgresClient.Copy(cappedBuffer, copySql) common.PanicIfError(syncer.Config.CommonConfig, err) diff --git a/src/syncer-postgres/syncer_utils.go b/src/syncer-postgres/syncer_utils.go index af75216..7b03a86 100644 --- a/src/syncer-postgres/syncer_utils.go +++ b/src/syncer-postgres/syncer_utils.go @@ -2,7 +2,6 @@ package main import ( "github.com/BemiHQ/BemiDB/src/common" - "github.com/BemiHQ/BemiDB/src/syncer-common" ) var ( @@ -13,11 +12,11 @@ var ( type SyncerUtils struct { Config *Config - StorageS3 *syncerCommon.StorageS3 + StorageS3 *common.StorageS3 DuckdbClient *common.DuckdbClient } -func NewSyncerUtils(config *Config, storageS3 *syncerCommon.StorageS3, duckdbClient *common.DuckdbClient) *SyncerUtils { +func NewSyncerUtils(config *Config, storageS3 *common.StorageS3, duckdbClient *common.DuckdbClient) *SyncerUtils { return &SyncerUtils{ Config: config, StorageS3: storageS3, @@ -42,8 +41,8 @@ func (utils *SyncerUtils) ShouldSyncTable(pgSchemaTable PgSchemaTable) bool { } func (utils *SyncerUtils) DeleteOldTables(keepIcebergTableNames common.Set[string]) { - icebergCatalog := syncerCommon.NewIcebergCatalog(utils.Config.CommonConfig, utils.Config.DestinationSchemaName) - icebergTableNames := icebergCatalog.TableNames() + icebergCatalog := common.NewIcebergCatalog(utils.Config.CommonConfig) + icebergTableNames := icebergCatalog.SchemaTableNames(utils.Config.DestinationSchemaName) for _, icebergTableName := range icebergTableNames.Values() { if keepIcebergTableNames.Contains(icebergTableName) { @@ -51,7 +50,8 @@ func (utils *SyncerUtils) DeleteOldTables(keepIcebergTableNames common.Set[strin } common.LogInfo(utils.Config.CommonConfig, "Deleting old Iceberg table: "+icebergTableName) - icebergTable := syncerCommon.NewIcebergTable(utils.Config.CommonConfig, utils.StorageS3, utils.DuckdbClient, utils.Config.DestinationSchemaName, icebergTableName) - icebergTable.DeleteIfExists() + icebergSchemaTable := common.IcebergSchemaTable{Schema: utils.Config.DestinationSchemaName, Table: icebergTableName} + icebergTable := common.NewIcebergTable(utils.Config.CommonConfig, utils.StorageS3, utils.DuckdbClient, icebergSchemaTable) + icebergTable.DropIfExists() } } From 93b50873a0deb39893a62b34be518d0ae0376f88 Mon Sep 17 00:00:00 2001 From: exAspArk Date: Wed, 27 Aug 2025 11:45:49 -0400 Subject: [PATCH 11/24] Add support for pg_rewrite --- .env.sample | 1 + Makefile | 18 ++++-- src/common/iceberg_schema_column.go | 1 + src/server/parser_column_ref.go | 9 ++- src/server/parser_select.go | 11 +++- src/server/query_remapper.go | 71 +++++++++++++-------- src/server/query_remapper_expression.go | 7 ++- src/server/query_remapper_select.go | 53 ++++++++++++---- src/server/query_remapper_table.go | 3 +- src/syncer-postgres/postgres.go | 84 ++++++++++++++++--------- 10 files changed, 176 insertions(+), 82 deletions(-) diff --git a/.env.sample b/.env.sample index c5f982f..39038b8 100644 --- a/.env.sample +++ b/.env.sample @@ -2,6 +2,7 @@ AWS_REGION=us-west-1 AWS_S3_BUCKET=[REPLACE_ME] AWS_ACCESS_KEY_ID=[REPLACE_ME] AWS_SECRET_ACCESS_KEY=[REPLACE_ME] + CATALOG_DATABASE_URL=postgres://postgres:postgres@host.docker.internal:5432/catalog SOURCE_POSTGRES_DATABASE_URL=postgres://postgres:postgres@host.docker.internal:5432/source diff --git a/Makefile b/Makefile index 78a7ba6..4220ee9 100644 --- a/Makefile +++ b/Makefile @@ -19,22 +19,28 @@ build: publish: ./scripts/publish-docker.sh -build-local: +server: + docker run -it --rm --env-file .env -p 54321:54321 ghcr.io/bemihq/bemidb:latest server + +syncer-postgres: + docker run -it --rm --env-file .env -e DESTINATION_SCHEMA_NAME=postgres ghcr.io/bemihq/bemidb:latest syncer-postgres + +local-build: docker build --build-arg PLATFORM=linux/arm64 -t bemidb:local . -server: build-local +local-server: local-build docker run -it --rm --env-file .env -p 54321:54321 bemidb:local server -syncer-postgres: build-local +local-syncer-postgres: local-build docker run -it --rm --env-file .env -e DESTINATION_SCHEMA_NAME=postgres bemidb:local syncer-postgres -syncer-amplitude: build-local +local-syncer-amplitude: local-build docker run -it --rm --env-file .env -e DESTINATION_SCHEMA_NAME=amplitude bemidb:local syncer-amplitude -bash: +local-sh: docker run -it --rm --env-file .env bemidb:local bash -build-test: +test-build: docker build --build-arg PLATFORM=linux/arm64 -t bemidb:test -f Dockerfile.test . test: build-test diff --git a/src/common/iceberg_schema_column.go b/src/common/iceberg_schema_column.go index d9b8119..a7e9ff8 100644 --- a/src/common/iceberg_schema_column.go +++ b/src/common/iceberg_schema_column.go @@ -397,6 +397,7 @@ func (col *IcebergSchemaColumn) duckdbPrimitiveValueFromJson(value any) interfac if valueString == "" { return nil } + valueString = strings.Replace(valueString, " ", "T", 1) // Amplitude valueString = strings.TrimSuffix(valueString, "Z") parsedTimestamp, err := time.Parse("2006-01-02T15:04:05.999999", valueString) if err != nil { diff --git a/src/server/parser_column_ref.go b/src/server/parser_column_ref.go index 5fc1dd0..ec09cad 100644 --- a/src/server/parser_column_ref.go +++ b/src/server/parser_column_ref.go @@ -12,12 +12,11 @@ func NewParserColumnRef(config *Config) *ParserColumnRef { return &ParserColumnRef{config: config} } -func (parser *ParserColumnRef) FieldNames(node *pgQuery.Node) []string { - columnRef := node.GetColumnRef() - if columnRef == nil { - return nil - } +func (parser *ParserColumnRef) ColumnRefFromTargetNode(targetNode *pgQuery.Node) *pgQuery.ColumnRef { + return targetNode.GetResTarget().Val.GetColumnRef() +} +func (parser *ParserColumnRef) FieldNames(columnRef *pgQuery.ColumnRef) []string { fieldNames := make([]string, 0) for _, field := range columnRef.Fields { if field.GetString_() == nil { diff --git a/src/server/parser_select.go b/src/server/parser_select.go index 23c09e6..be5b9d8 100644 --- a/src/server/parser_select.go +++ b/src/server/parser_select.go @@ -13,10 +13,19 @@ func NewParserSelect(config *Config) *ParserSelect { return &ParserSelect{config: config, utils: NewParserUtils(config)} } -func (parser *ParserSelect) SetDefaultTargetName(targetNode *pgQuery.Node, name string) { +func (parser *ParserSelect) SetTargetNameIfEmpty(targetNode *pgQuery.Node, name string) { target := targetNode.GetResTarget() if target.Name == "" { target.Name = name } } + +func (parser *ParserSelect) SetTargetName(targetNode *pgQuery.Node, name string) { + target := targetNode.GetResTarget() + target.Name = name +} + +func (parser *ParserSelect) TargetName(targetNode *pgQuery.Node) string { + return targetNode.GetResTarget().Name +} diff --git a/src/server/query_remapper.go b/src/server/query_remapper.go index 0b0816a..e3a5954 100644 --- a/src/server/query_remapper.go +++ b/src/server/query_remapper.go @@ -180,6 +180,9 @@ func (remapper *QueryRemapper) remapSetStatement(stmt *pgQuery.RawStmt) *pgQuery } func (remapper *QueryRemapper) remapSelectStatement(selectStatement *pgQuery.SelectStmt, indentLevel int) { + // SELECT + remappedColumnRefs := remapper.remapSelect(selectStatement, indentLevel) // recursion + // UNION if selectStatement.FromClause == nil && selectStatement.Larg != nil && selectStatement.Rarg != nil { remapper.traceTreeTraversal("UNION left", indentLevel) @@ -193,7 +196,7 @@ func (remapper *QueryRemapper) remapSelectStatement(selectStatement *pgQuery.Sel // JOIN if len(selectStatement.FromClause) > 0 && selectStatement.FromClause[0].GetJoinExpr() != nil { - selectStatement.FromClause[0] = remapper.remapJoinExpressions(selectStatement, selectStatement.FromClause[0], indentLevel+1) // recursion + selectStatement.FromClause[0] = remapper.remapJoinExpressions(selectStatement, selectStatement.FromClause[0], remappedColumnRefs, indentLevel+1) // recursion } // WHERE @@ -203,7 +206,7 @@ func (remapper *QueryRemapper) remapSelectStatement(selectStatement *pgQuery.Sel if remapper.removeWhereClause(selectStatement.WhereClause) { selectStatement.WhereClause = nil } else { - selectStatement.WhereClause = remapper.remappedExpressions(selectStatement.WhereClause, indentLevel) // recursion + selectStatement.WhereClause = remapper.remappedExpressions(selectStatement.WhereClause, remappedColumnRefs, indentLevel) // recursion } } @@ -241,7 +244,7 @@ func (remapper *QueryRemapper) remapSelectStatement(selectStatement *pgQuery.Sel if selectStatement.SortClause != nil { remapper.traceTreeTraversal("ORDER BY statements", indentLevel) for _, sortNode := range selectStatement.SortClause { - sortNode.GetSortBy().Node = remapper.remappedExpressions(sortNode.GetSortBy().Node, indentLevel) // recursion + sortNode.GetSortBy().Node = remapper.remappedExpressions(sortNode.GetSortBy().Node, remappedColumnRefs, indentLevel) // recursion } } @@ -249,19 +252,16 @@ func (remapper *QueryRemapper) remapSelectStatement(selectStatement *pgQuery.Sel if selectStatement.GroupClause != nil { remapper.traceTreeTraversal("GROUP BY statements", indentLevel) for i, groupNode := range selectStatement.GroupClause { - selectStatement.GroupClause[i] = remapper.remappedExpressions(groupNode, indentLevel) // recursion + selectStatement.GroupClause[i] = remapper.remappedExpressions(groupNode, remappedColumnRefs, indentLevel) // recursion } } - - // SELECT - remapper.remapSelect(selectStatement, indentLevel) // recursion } -func (remapper *QueryRemapper) remapJoinExpressions(selectStatement *pgQuery.SelectStmt, node *pgQuery.Node, indentLevel int) *pgQuery.Node { +func (remapper *QueryRemapper) remapJoinExpressions(selectStatement *pgQuery.SelectStmt, node *pgQuery.Node, remappedColumnRefs map[string]string, indentLevel int) *pgQuery.Node { remapper.traceTreeTraversal("JOIN left", indentLevel) leftJoinNode := node.GetJoinExpr().Larg if leftJoinNode.GetJoinExpr() != nil { - leftJoinNode = remapper.remapJoinExpressions(selectStatement, leftJoinNode, indentLevel+1) // self-recursion + leftJoinNode = remapper.remapJoinExpressions(selectStatement, leftJoinNode, remappedColumnRefs, indentLevel+1) // self-recursion } else if leftJoinNode.GetRangeVar() != nil { // TABLE remapper.traceTreeTraversal("TABLE left", indentLevel+1) @@ -275,7 +275,7 @@ func (remapper *QueryRemapper) remapJoinExpressions(selectStatement *pgQuery.Sel remapper.traceTreeTraversal("JOIN right", indentLevel) rightJoinNode := node.GetJoinExpr().Rarg if rightJoinNode.GetJoinExpr() != nil { - rightJoinNode = remapper.remapJoinExpressions(selectStatement, rightJoinNode, indentLevel+1) // self-recursion + rightJoinNode = remapper.remapJoinExpressions(selectStatement, rightJoinNode, remappedColumnRefs, indentLevel+1) // self-recursion } else if rightJoinNode.GetRangeVar() != nil { // TABLE remapper.traceTreeTraversal("TABLE right", indentLevel+1) @@ -288,7 +288,7 @@ func (remapper *QueryRemapper) remapJoinExpressions(selectStatement *pgQuery.Sel if quals := node.GetJoinExpr().Quals; quals != nil { remapper.traceTreeTraversal("JOIN on", indentLevel) - node.GetJoinExpr().Quals = remapper.remappedExpressions(quals, indentLevel) // recursion + node.GetJoinExpr().Quals = remapper.remappedExpressions(quals, remappedColumnRefs, indentLevel) // recursion // DuckDB doesn't support non-INNER JOINs with ON clauses that reference columns from outer tables: // SELECT ( @@ -313,18 +313,18 @@ func (remapper *QueryRemapper) remapJoinExpressions(selectStatement *pgQuery.Sel return node } -func (remapper *QueryRemapper) remappedExpressions(node *pgQuery.Node, indentLevel int) *pgQuery.Node { +func (remapper *QueryRemapper) remappedExpressions(node *pgQuery.Node, remappedColumnRefs map[string]string, indentLevel int) *pgQuery.Node { // CASE caseExpression := node.GetCaseExpr() if caseExpression != nil { - remapper.remapCaseExpression(caseExpression, indentLevel) // recursion + remapper.remapCaseExpression(caseExpression, remappedColumnRefs, indentLevel) // recursion } // OR/AND boolExpr := node.GetBoolExpr() if boolExpr != nil { for i, arg := range boolExpr.Args { - boolExpr.Args[i] = remapper.remappedExpressions(arg, indentLevel+1) // self-recursion + boolExpr.Args[i] = remapper.remappedExpressions(arg, remappedColumnRefs, indentLevel+1) // self-recursion } } @@ -352,17 +352,17 @@ func (remapper *QueryRemapper) remappedExpressions(node *pgQuery.Node, indentLev if aExpr != nil { node = remapper.remapperExpression.RemappedExpression(node) if aExpr.Lexpr != nil { - aExpr.Lexpr = remapper.remappedExpressions(aExpr.Lexpr, indentLevel+1) // self-recursion + aExpr.Lexpr = remapper.remappedExpressions(aExpr.Lexpr, remappedColumnRefs, indentLevel+1) // self-recursion } if aExpr.Rexpr != nil { - aExpr.Rexpr = remapper.remappedExpressions(aExpr.Rexpr, indentLevel+1) // self-recursion + aExpr.Rexpr = remapper.remappedExpressions(aExpr.Rexpr, remappedColumnRefs, indentLevel+1) // self-recursion } } // IS NULL nullTest := node.GetNullTest() if nullTest != nil { - nullTest.Arg = remapper.remappedExpressions(nullTest.Arg, indentLevel+1) // self-recursion + nullTest.Arg = remapper.remappedExpressions(nullTest.Arg, remappedColumnRefs, indentLevel+1) // self-recursion } // IN @@ -383,12 +383,12 @@ func (remapper *QueryRemapper) remappedExpressions(node *pgQuery.Node, indentLev for i, arg := range functionCall.Args { if arg != nil { - functionCall.Args[i] = remapper.remappedExpressions(arg, indentLevel+1) // self-recursion + functionCall.Args[i] = remapper.remappedExpressions(arg, remappedColumnRefs, indentLevel+1) // self-recursion } } if functionCall.AggFilter != nil && functionCall.AggFilter.GetNullTest() != nil { - functionCall.AggFilter.GetNullTest().Arg = remapper.remappedExpressions(functionCall.AggFilter.GetNullTest().Arg, indentLevel+1) // self-recursion + functionCall.AggFilter.GetNullTest().Arg = remapper.remappedExpressions(functionCall.AggFilter.GetNullTest().Arg, remappedColumnRefs, indentLevel+1) // self-recursion } } @@ -402,42 +402,59 @@ func (remapper *QueryRemapper) remappedExpressions(node *pgQuery.Node, indentLev } } + // [column] + columnRef := node.GetColumnRef() + if columnRef != nil { + if len(columnRef.Fields) == 1 && columnRef.Fields[0].GetString_() != nil { + remappedField, ok := remappedColumnRefs[columnRef.Fields[0].GetString_().Sval] + if ok { + columnRef.Fields[0] = pgQuery.MakeStrNode(remappedField) + } + } + } + return remapper.remapperExpression.RemappedExpression(node) } // CASE ... -func (remapper *QueryRemapper) remapCaseExpression(caseExpr *pgQuery.CaseExpr, indentLevel int) { +func (remapper *QueryRemapper) remapCaseExpression(caseExpr *pgQuery.CaseExpr, remappedColumnRefs map[string]string, indentLevel int) { for _, when := range caseExpr.Args { if whenClause := when.GetCaseWhen(); whenClause != nil { // WHEN ... if whenClause.Expr != nil { - whenClause.Expr = remapper.remappedExpressions(whenClause.Expr, indentLevel+1) // recursion + whenClause.Expr = remapper.remappedExpressions(whenClause.Expr, remappedColumnRefs, indentLevel+1) // recursion } // THEN ... if whenClause.Result != nil { - whenClause.Result = remapper.remappedExpressions(whenClause.Result, indentLevel+1) // recursion + whenClause.Result = remapper.remappedExpressions(whenClause.Result, remappedColumnRefs, indentLevel+1) // recursion } } } // ELSE ... if caseExpr.Defresult != nil { - caseExpr.Defresult = remapper.remappedExpressions(caseExpr.Defresult, indentLevel+1) // recursion + caseExpr.Defresult = remapper.remappedExpressions(caseExpr.Defresult, remappedColumnRefs, indentLevel+1) // recursion } } // SELECT ... -func (remapper *QueryRemapper) remapSelect(selectStatement *pgQuery.SelectStmt, indentLevel int) *pgQuery.SelectStmt { +func (remapper *QueryRemapper) remapSelect(selectStatement *pgQuery.SelectStmt, indentLevel int) map[string]string { remapper.traceTreeTraversal("SELECT statements", indentLevel) + remappedColumnRefs := make(map[string]string) // SELECT ... for targetNodeIdx, targetNode := range selectStatement.TargetList { - targetNode = remapper.remapperSelect.SetDefaultTargetName(targetNode) + targetNode, remappedColRefs := remapper.remapperSelect.RemapTargetName(targetNode) + for previousName, newName := range remappedColRefs { + remappedColumnRefs[previousName] = newName + } + + targetNode = remapper.remapperSelect.SetTargetNameIfEmpty(targetNode) valNode := targetNode.GetResTarget().Val if valNode != nil { - targetNode.GetResTarget().Val = remapper.remappedExpressions(valNode, indentLevel) // recursion + targetNode.GetResTarget().Val = remapper.remappedExpressions(valNode, remappedColumnRefs, indentLevel) // recursion } // Nested SELECT @@ -469,7 +486,7 @@ func (remapper *QueryRemapper) remapSelect(selectStatement *pgQuery.SelectStmt, } } - return selectStatement + return remappedColumnRefs } // Fix the query sent by psql "\d [table]": ... WHERE attrelid = pr.prrelid AND attnum = prattrs[s] ... diff --git a/src/server/query_remapper_expression.go b/src/server/query_remapper_expression.go index 42f1ea1..bb4747b 100644 --- a/src/server/query_remapper_expression.go +++ b/src/server/query_remapper_expression.go @@ -119,7 +119,12 @@ func (remapper *QueryRemapperExpression) remappedNullColumnExpression(node *pgQu // public.table.column -> table.column // schema.table.column -> schema_table.column func (remapper *QueryRemapperExpression) remapColumnReference(node *pgQuery.Node) { - fieldNames := remapper.parserColumnRef.FieldNames(node) + columnRef := node.GetColumnRef() + if columnRef == nil { + return + } + + fieldNames := remapper.parserColumnRef.FieldNames(columnRef) if fieldNames == nil || len(fieldNames) != 3 { return } diff --git a/src/server/query_remapper_select.go b/src/server/query_remapper_select.go index 9be2067..aff9074 100644 --- a/src/server/query_remapper_select.go +++ b/src/server/query_remapper_select.go @@ -5,23 +5,50 @@ import ( ) type QueryRemapperSelect struct { - parserSelect *ParserSelect - parserFunction *ParserFunction - parserAExpr *ParserAExpr - config *Config + parserSelect *ParserSelect + parserFunction *ParserFunction + parserAExpr *ParserAExpr + parserColumnRef *ParserColumnRef + config *Config } func NewQueryRemapperSelect(config *Config) *QueryRemapperSelect { return &QueryRemapperSelect{ - parserSelect: NewParserSelect(config), - parserFunction: NewParserFunction(config), - parserAExpr: NewParserAExpr(config), - config: config, + parserSelect: NewParserSelect(config), + parserFunction: NewParserFunction(config), + parserAExpr: NewParserAExpr(config), + parserColumnRef: NewParserColumnRef(config), + config: config, } } -// SELECT FUNCTION(...) -> SELECT FUNCTION(...) AS FUNCTION -func (remapper *QueryRemapperSelect) SetDefaultTargetName(targetNode *pgQuery.Node) *pgQuery.Node { +// table.column AS table -> table.column AS table_ +// +// DuckDB can't execute GROUP BY table, thinking it's a table name instead of an alias: +// column "name" must appear in the GROUP BY clause or must be part of an aggregate function. +// Either add it to the GROUP BY list, or use "ANY_VALUE(name)" if the exact value of "name" is not important. +// +// So we rename the alias to table_ and use it in GROUP BY and ORDER BY clauses. +func (remapper *QueryRemapperSelect) RemapTargetName(targetNode *pgQuery.Node) (*pgQuery.Node, map[string]string) { + remappedColumnRefs := make(map[string]string) + + columnRef := remapper.parserColumnRef.ColumnRefFromTargetNode(targetNode) + if columnRef != nil { + fieldNames := remapper.parserColumnRef.FieldNames(columnRef) + targetName := remapper.parserSelect.TargetName(targetNode) + + if len(fieldNames) == 2 && fieldNames[0] == targetName { + newTargetName := targetName + "_" + remapper.parserSelect.SetTargetName(targetNode, newTargetName) + remappedColumnRefs[targetName] = newTargetName + } + } + + return targetNode, remappedColumnRefs +} + +// SELECT ... -> SELECT ... AS ... +func (remapper *QueryRemapperSelect) SetTargetNameIfEmpty(targetNode *pgQuery.Node) *pgQuery.Node { aExpr := remapper.parserAExpr.AExprFromTargetNode(targetNode) if aExpr != nil { operatorName := remapper.parserAExpr.OperatorName(aExpr) @@ -32,7 +59,7 @@ func (remapper *QueryRemapperSelect) SetDefaultTargetName(targetNode *pgQuery.No valueName := remapper.parserAExpr.RightAConstValue(aExpr) if columnName != "" && valueName != "" { - remapper.parserSelect.SetDefaultTargetName(targetNode, columnName+"_"+valueName) + remapper.parserSelect.SetTargetNameIfEmpty(targetNode, columnName+"_"+valueName) return targetNode } } @@ -44,14 +71,14 @@ func (remapper *QueryRemapperSelect) SetDefaultTargetName(targetNode *pgQuery.No functionName := schemaFunction.Function // FUNCTION(...) -> FUNCTION(...) AS FUNCTION - remapper.parserSelect.SetDefaultTargetName(targetNode, functionName) + remapper.parserSelect.SetTargetNameIfEmpty(targetNode, functionName) return targetNode } indirectionName := remapper.parserFunction.IndirectionName(targetNode) if indirectionName != "" { // (FUNCTION()).n -> (FUNCTION()).n AS n - remapper.parserSelect.SetDefaultTargetName(targetNode, indirectionName) + remapper.parserSelect.SetTargetNameIfEmpty(targetNode, indirectionName) return targetNode } diff --git a/src/server/query_remapper_table.go b/src/server/query_remapper_table.go index d5ba316..b24e623 100644 --- a/src/server/query_remapper_table.go +++ b/src/server/query_remapper_table.go @@ -31,6 +31,7 @@ func CreatePgCatalogTableQueries(config *Config) []string { "CREATE TABLE pg_publication(oid oid, pubname text, pubowner oid, puballtables bool, pubinsert bool, pubupdate bool, pubdelete bool, pubtruncate bool, pubviaroot bool)", "CREATE TABLE pg_publication_rel(oid oid, prpubid oid, prrelid oid, prqual text, prattrs text)", "CREATE TABLE pg_publication_namespace(oid oid, pnpubid oid, pnnspid oid)", + "CREATE TABLE pg_rewrite(oid oid, rulename text, ev_class oid, ev_type char, ev_enabled char, is_instead bool, ev_qual text, ev_action text)", // Dynamic tables // DuckDB doesn't handle dynamic view replacement properly @@ -197,7 +198,7 @@ func (remapper *QueryRemapperTable) RemapTable(node *pgQuery.Node) *pgQuery.Node remapper.upsertPgMatviews() } - // pg_catalog.pg_table -> main.pg_table + // pg_catalog -> main for tables defined in CreatePgCatalogTableQueries if PG_CATALOG_TABLE_NAMES.Contains(qSchemaTable.Table) { parser.RemapSchemaToMain(node) return node diff --git a/src/syncer-postgres/postgres.go b/src/syncer-postgres/postgres.go index f054723..adb69d2 100644 --- a/src/syncer-postgres/postgres.go +++ b/src/syncer-postgres/postgres.go @@ -14,6 +14,8 @@ const ( PG_CONNECTION_TIMEOUT = 30 * time.Second PG_SESSION_TIMEOUT = "2h" + + POSTGRES_MAX_RETRY_COUNT = 1 ) type Postgres struct { @@ -22,27 +24,9 @@ type Postgres struct { } func NewPostgres(config *Config) *Postgres { - postgresClient := common.NewPostgresClient(config.CommonConfig, config.DatabaseUrl) - - _, err := postgresClient.Exec(context.Background(), "SET SESSION statement_timeout = '"+PG_SESSION_TIMEOUT+"'") - common.PanicIfError(config.CommonConfig, err) - - var isStandby bool - err = postgresClient.QueryRow(context.Background(), "SELECT pg_is_in_recovery()").Scan(&isStandby) - common.PanicIfError(config.CommonConfig, err) - - if isStandby { - _, err = postgresClient.Exec(context.Background(), "BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ READ ONLY") - common.PanicIfError(config.CommonConfig, err) - } else { - _, err = postgresClient.Exec(context.Background(), "BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE READ ONLY DEFERRABLE") - common.PanicIfError(config.CommonConfig, err) - } - - return &Postgres{ - Config: config, - PostgresClient: postgresClient, - } + postgres := Postgres{Config: config} + postgres.Reconnect() + return &postgres } func (postgres *Postgres) Close() { @@ -69,7 +53,11 @@ func (postgres *Postgres) Schemas() []string { schemasRows, err := postgres.PostgresClient.Query( context.Background(), - "SELECT schema_name FROM information_schema.schemata WHERE schema_name NOT IN ('pg_catalog', 'pg_toast', 'information_schema')", + `SELECT schema_name + FROM information_schema.schemata + WHERE + schema_name NOT IN ('pg_catalog', 'pg_toast', 'information_schema') AND + has_schema_privilege(current_user, schema_name, 'USAGE')`, ) common.PanicIfError(postgres.Config.CommonConfig, err) defer schemasRows.Close() @@ -95,7 +83,10 @@ func (postgres *Postgres) SchemaTables(schema string) []PgSchemaTable { JOIN pg_namespace ON pg_namespace.oid = pg_class.relnamespace LEFT JOIN pg_inherits ON pg_inherits.inhrelid = pg_class.oid LEFT JOIN pg_class AS parent ON pg_inherits.inhparent = parent.oid - WHERE pg_namespace.nspname = $1 AND pg_class.relkind = 'r' AND has_table_privilege(pg_class.oid, 'SELECT') + WHERE + pg_namespace.nspname = $1 AND + pg_class.relkind = 'r' AND + has_table_privilege(pg_class.oid, 'SELECT') `, schema, ) @@ -112,7 +103,7 @@ func (postgres *Postgres) SchemaTables(schema string) []PgSchemaTable { return pgSchemaTables } -func (postgres *Postgres) PgSchemaColumns(pgSchemaTable PgSchemaTable) []PgSchemaColumn { +func (postgres *Postgres) PgSchemaColumns(pgSchemaTable PgSchemaTable, retryCount ...int) []PgSchemaColumn { var pgSchemaColumns []PgSchemaColumn rows, err := postgres.PostgresClient.Query( @@ -172,10 +163,25 @@ func (postgres *Postgres) PgSchemaColumns(pgSchemaTable PgSchemaTable) []PgSchem pgSchemaTable.Schema, pgSchemaTable.Table, ).Scan(&joinedUniqueColumnNames) - if err != nil && err.Error() == "no rows in result set" { - joinedUniqueColumnNames = "" - } else { - common.PanicIfError(postgres.Config.CommonConfig, err) + if err != nil { + if err.Error() == "no rows in result set" { + joinedUniqueColumnNames = "" + } else { + if strings.Contains(err.Error(), "terminating connection due to conflict with recovery (SQLSTATE 40001)") || + strings.Contains(err.Error(), "failed to deallocate cached statement(s): conn closed") { + currentRetryCount := 0 + if len(retryCount) > 0 { + currentRetryCount = retryCount[0] + } + + if currentRetryCount < POSTGRES_MAX_RETRY_COUNT { + common.LogWarn(postgres.Config.CommonConfig, "Retrying PgSchemaColumns() for table "+pgSchemaTable.String()+" due to failure:", err) + postgres.Reconnect() + return postgres.PgSchemaColumns(pgSchemaTable, currentRetryCount+1) + } + } + common.PanicIfError(postgres.Config.CommonConfig, err) + } } uniqueColumnNames := common.NewSet[string]() @@ -192,3 +198,25 @@ func (postgres *Postgres) PgSchemaColumns(pgSchemaTable PgSchemaTable) []PgSchem return pgSchemaColumns } + +func (postgres *Postgres) Reconnect() { + if postgres.PostgresClient != nil { + postgres.Close() + } + postgres.PostgresClient = common.NewPostgresClient(postgres.Config.CommonConfig, postgres.Config.DatabaseUrl) + + _, err := postgres.PostgresClient.Exec(context.Background(), "SET SESSION statement_timeout = '"+PG_SESSION_TIMEOUT+"'") + common.PanicIfError(postgres.Config.CommonConfig, err) + + var isStandby bool + err = postgres.PostgresClient.QueryRow(context.Background(), "SELECT pg_is_in_recovery()").Scan(&isStandby) + common.PanicIfError(postgres.Config.CommonConfig, err) + + if isStandby { + _, err = postgres.PostgresClient.Exec(context.Background(), "BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ READ ONLY") + common.PanicIfError(postgres.Config.CommonConfig, err) + } else { + _, err = postgres.PostgresClient.Exec(context.Background(), "BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE READ ONLY DEFERRABLE") + common.PanicIfError(postgres.Config.CommonConfig, err) + } +} From dbef518676d02ee2e530725c299073f78ae9380a Mon Sep 17 00:00:00 2001 From: exAspArk Date: Wed, 27 Aug 2025 14:18:55 -0400 Subject: [PATCH 12/24] Add support for dbt with materialized views --- README.md | 2 +- src/common/common_config.go | 2 +- src/common/iceberg_catalog.go | 77 +++++++++++++++++++++++++++----- src/server/iceberg_writer.go | 19 ++++++-- src/server/query_handler_test.go | 9 ++++ src/server/query_remapper.go | 67 ++++++++++++++++++++++----- 6 files changed, 147 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index 7f03eed..218f2e8 100644 --- a/README.md +++ b/README.md @@ -324,8 +324,8 @@ SELECT * FROM [TABLE] WHERE [JSON_COLUMN]->>'[JSON_KEY]' = '[JSON_VALUE]'; - [x] Packaging in a Docker image - [x] Table compaction without Trino as a dependency - [x] Materialized views +- [x] Transformations with dbt ([#25](https://github.com/BemiHQ/BemiDB/issues/25)) - [ ] Partitioned tables ([#15](https://github.com/BemiHQ/BemiDB/issues/15)) -- [ ] Transformations with dbt ([#25](https://github.com/BemiHQ/BemiDB/issues/25)) Are you looking for real-time data syncing? Check out [BemiDB Cloud](https://bemidb.com), our managed data platform. diff --git a/src/common/common_config.go b/src/common/common_config.go index db490b7..c701b8b 100644 --- a/src/common/common_config.go +++ b/src/common/common_config.go @@ -1,7 +1,7 @@ package common const ( - VERSION = "1.1.0" + VERSION = "1.2.0" ENV_LOG_LEVEL = "BEMIDB_LOG_LEVEL" ENV_DISABLE_ANONYMOUS_ANALYTICS = "BEMIDB_DISABLE_ANONYMOUS_ANALYTICS" diff --git a/src/common/iceberg_catalog.go b/src/common/iceberg_catalog.go index 001e454..7f8894c 100644 --- a/src/common/iceberg_catalog.go +++ b/src/common/iceberg_catalog.go @@ -243,12 +243,24 @@ func (catalog *IcebergCatalog) DropTable(icebergSchemaTable IcebergSchemaTable) PanicIfError(catalog.Config, err) } -func (catalog *IcebergCatalog) CreateMaterializedView(icebergSchemaTable IcebergSchemaTable, definition string) error { +func (catalog *IcebergCatalog) CreateMaterializedView(icebergSchemaTable IcebergSchemaTable, definition string, ifNotExists bool) error { pgClient := catalog.newPostgresClient() defer pgClient.Close() + exists, err := catalog.doesMaterializedViewExist(pgClient, icebergSchemaTable) + if err != nil { + return err + } + if exists { + if ifNotExists { + return nil + } else { + return fmt.Errorf("materialized view %s already exists", icebergSchemaTable.String()) + } + } + ctx := context.Background() - _, err := pgClient.Exec( + _, err = pgClient.Exec( ctx, "INSERT INTO iceberg_materialized_views (schema_name, table_name, definition) VALUES ($1, $2, $3)", icebergSchemaTable.Schema, icebergSchemaTable.Table, definition, @@ -257,24 +269,47 @@ func (catalog *IcebergCatalog) CreateMaterializedView(icebergSchemaTable Iceberg return err } -func (catalog *IcebergCatalog) DropMaterializedView(icebergSchemaTable IcebergSchemaTable) error { +func (catalog *IcebergCatalog) RenameMaterializedView(icebergSchemaTable IcebergSchemaTable, newName string, missingOk bool) error { ctx := context.Background() - pgClient := catalog.newPostgresClient() defer pgClient.Close() - var exists bool - err := pgClient.QueryRow( + exists, err := catalog.doesMaterializedViewExist(pgClient, icebergSchemaTable) + if err != nil { + return err + } + if !exists { + if missingOk { + return nil + } else { + return fmt.Errorf("materialized view %s does not exist", icebergSchemaTable.String()) + } + } + + _, err = pgClient.Exec( ctx, - "SELECT TRUE FROM iceberg_materialized_views WHERE schema_name=$1 AND table_name=$2", - icebergSchemaTable.Schema, icebergSchemaTable.Table, - ).Scan(&exists) + "UPDATE iceberg_materialized_views SET table_name=$1 WHERE schema_name=$2 AND table_name=$3", + newName, icebergSchemaTable.Schema, icebergSchemaTable.Table, + ) + return err +} + +func (catalog *IcebergCatalog) DropMaterializedView(icebergSchemaTable IcebergSchemaTable, missingOk bool) error { + ctx := context.Background() + + pgClient := catalog.newPostgresClient() + defer pgClient.Close() + + exists, err := catalog.doesMaterializedViewExist(pgClient, icebergSchemaTable) if err != nil { - if err.Error() == "no rows in result set" { - return fmt.Errorf("materialized view %s does not exist", icebergSchemaTable.String()) + return err + } + if !exists { + if missingOk { + return nil } else { - return fmt.Errorf("error checking materialized view existence: %w", err) + return fmt.Errorf("materialized view %s does not exist", icebergSchemaTable.String()) } } @@ -287,6 +322,24 @@ func (catalog *IcebergCatalog) DropMaterializedView(icebergSchemaTable IcebergSc return err } +func (catalog *IcebergCatalog) doesMaterializedViewExist(pgClient *PostgresClient, icebergSchemaTable IcebergSchemaTable) (bool, error) { + var exists bool + err := pgClient.QueryRow( + context.Background(), + "SELECT TRUE FROM iceberg_materialized_views WHERE schema_name=$1 AND table_name=$2", + icebergSchemaTable.Schema, icebergSchemaTable.Table, + ).Scan(&exists) + + if err != nil { + if err.Error() == "no rows in result set" { + return false, nil + } else { + return false, fmt.Errorf("error checking materialized view existence: %w", err) + } + } + return exists, nil +} + // --------------------------------------------------------------------------------------------------------------------- func (catalog *IcebergCatalog) newPostgresClient() *PostgresClient { diff --git a/src/server/iceberg_writer.go b/src/server/iceberg_writer.go index 63b747b..3e817bb 100644 --- a/src/server/iceberg_writer.go +++ b/src/server/iceberg_writer.go @@ -20,8 +20,19 @@ func NewIcebergWriter(config *Config, storageS3 *common.StorageS3, serverDuckdbC } } -func (writer *IcebergWriter) CreateMaterializedView(icebergSchemaTable common.IcebergSchemaTable, remappedDefinitionQuery string) error { - return writer.IcebergCatalog.CreateMaterializedView(icebergSchemaTable, remappedDefinitionQuery) +func (writer *IcebergWriter) CreateMaterializedView(icebergSchemaTable common.IcebergSchemaTable, remappedDefinitionQuery string, ifNotExists bool) error { + return writer.IcebergCatalog.CreateMaterializedView(icebergSchemaTable, remappedDefinitionQuery, ifNotExists) +} + +func (writer *IcebergWriter) RenameMaterializedView(icebergSchemaTable common.IcebergSchemaTable, newName string, missingOk bool) error { + err := writer.IcebergCatalog.RenameMaterializedView(icebergSchemaTable, newName, missingOk) + if err != nil { + return err + } + + icebergTable := common.NewIcebergTable(writer.Config.CommonConfig, writer.StorageS3, writer.ServerDuckdbClient, icebergSchemaTable) + icebergTable.Rename(newName) + return nil } func (writer *IcebergWriter) RefreshMaterializedView(icebergSchemaTable common.IcebergSchemaTable, remappedDefinitionQuery string) error { @@ -62,8 +73,8 @@ func (writer *IcebergWriter) RefreshMaterializedView(icebergSchemaTable common.I return nil } -func (writer *IcebergWriter) DropMaterializedView(icebergSchemaTable common.IcebergSchemaTable) error { - err := writer.IcebergCatalog.DropMaterializedView(icebergSchemaTable) +func (writer *IcebergWriter) DropMaterializedView(icebergSchemaTable common.IcebergSchemaTable, missingOk bool) error { + err := writer.IcebergCatalog.DropMaterializedView(icebergSchemaTable, missingOk) if err != nil { return err } diff --git a/src/server/query_handler_test.go b/src/server/query_handler_test.go index d33bba0..def5a02 100644 --- a/src/server/query_handler_test.go +++ b/src/server/query_handler_test.go @@ -352,6 +352,10 @@ func TestHandleQuery(t *testing.T) { "description": {"oid", "pnpubid", "pnnspid"}, "types": {uint32ToString(pgtype.OIDOID), uint32ToString(pgtype.Int8OID), uint32ToString(pgtype.Int8OID)}, }, + "SELECT * FROM pg_catalog.pg_rewrite": { + "description": {"oid", "rulename", "ev_class", "ev_type", "ev_enabled", "is_instead", "ev_qual", "ev_action"}, + "types": {uint32ToString(pgtype.OIDOID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.Int8OID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.BoolOID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.TextOID)}, + }, "SELECT pubname, NULL, NULL FROM pg_catalog.pg_publication p JOIN pg_catalog.pg_publication_namespace pn ON p.oid = pn.pnpubid JOIN pg_catalog.pg_class pc ON pc.relnamespace = pn.pnnspid UNION SELECT pubname, pg_get_expr(pr.prqual, c.oid), (CASE WHEN pr.prattrs IS NOT NULL THEN (SELECT string_agg(attname, ', ') FROM pg_catalog.generate_series(0, pg_catalog.array_upper(pr.prattrs::pg_catalog.int2[], 1)) s, pg_catalog.pg_attribute WHERE attrelid = pr.prrelid AND attnum = prattrs[s]) ELSE NULL END) FROM pg_catalog.pg_publication p JOIN pg_catalog.pg_publication_rel pr ON p.oid = pr.prpubid JOIN pg_catalog.pg_class c ON c.oid = pr.prrelid UNION SELECT pubname, NULL, NULL FROM pg_catalog.pg_publication p ORDER BY 1": { "description": {"pubname", "NULL", "NULL"}, "types": {uint32ToString(pgtype.TextOID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.TextOID)}, @@ -1310,6 +1314,11 @@ func TestHandleQuery(t *testing.T) { "types": {uint32ToString(pgtype.Int4OID)}, "values": {"1"}, }, + `WITH schema AS (SELECT pg_namespace.nspname AS name FROM pg_namespace WHERE nspname != 'information_schema' AND nspname NOT LIKE 'pg\_%') SELECT schema.name AS schema FROM schema GROUP BY schema ORDER BY schema LIMIT 1`: { + "description": {"schema_"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"postgres"}, + }, }) }) diff --git a/src/server/query_remapper.go b/src/server/query_remapper.go index e3a5954..a86876c 100644 --- a/src/server/query_remapper.go +++ b/src/server/query_remapper.go @@ -130,7 +130,7 @@ func (remapper *QueryRemapper) remapStatements(statements []*pgQuery.RawStmt) ([ case node.GetTransactionStmt() != nil: statements[i] = NOOP_QUERY_TREE.Stmts[0] - // CREATE MATERIALIZED VIEW + // CREATE MATERIALIZED VIEW [IF NOT EXISTS] AS ... [WITH NO DATA] case node.GetCreateTableAsStmt() != nil: err := remapper.createMaterializedView(node) if err != nil { @@ -138,8 +138,9 @@ func (remapper *QueryRemapper) remapStatements(statements []*pgQuery.RawStmt) ([ } statements[i] = NOOP_QUERY_TREE.Stmts[0] - // DROP MATERIALIZED VIEW - case node.GetDropStmt() != nil && node.GetDropStmt().RemoveType == pgQuery.ObjectType_OBJECT_MATVIEW: + // DROP MATERIALIZED VIEW [IF EXISTS] + case node.GetDropStmt() != nil && + (node.GetDropStmt().RemoveType == pgQuery.ObjectType_OBJECT_TABLE || node.GetDropStmt().RemoveType == pgQuery.ObjectType_OBJECT_MATVIEW): err := remapper.dropMaterializedViewFromNode(node) if err != nil { return nil, err @@ -154,6 +155,15 @@ func (remapper *QueryRemapper) remapStatements(statements []*pgQuery.RawStmt) ([ } statements[i] = NOOP_QUERY_TREE.Stmts[0] + // ALTER TABLE [IF EXISTS] ... RENAME TO ... + case node.GetRenameStmt() != nil && + (node.GetRenameStmt().RenameType == pgQuery.ObjectType_OBJECT_TABLE || node.GetRenameStmt().RenameType == pgQuery.ObjectType_OBJECT_MATVIEW): + err := remapper.renameMaterializedViewFromNode(node) + if err != nil { + return nil, err + } + statements[i] = NOOP_QUERY_TREE.Stmts[0] + // Unsupported query default: common.LogDebug(remapper.config.CommonConfig, "Query tree:", stmt, node) @@ -554,8 +564,10 @@ func (remapper *QueryRemapper) createMaterializedView(node *pgQuery.Node) error return fmt.Errorf("couldn't read definition of CREATE MATERIALIZED VIEW: %w", err) } + ifNotExists := node.GetCreateTableAsStmt().IfNotExists + // Store the materialized view in the catalog - err = remapper.IcebergWriter.CreateMaterializedView(icebergSchemaTable, definition) + err = remapper.IcebergWriter.CreateMaterializedView(icebergSchemaTable, definition, ifNotExists) if err != nil { if strings.HasPrefix(err.Error(), "ERROR: duplicate key value violates unique constraint") { return fmt.Errorf("relation %s already exists", icebergSchemaTable.String()) @@ -568,7 +580,7 @@ func (remapper *QueryRemapper) createMaterializedView(node *pgQuery.Node) error if !node.GetCreateTableAsStmt().Into.SkipData { queryStatements, _, err := remapper.ParseAndRemapQuery(definition) if err != nil { - deleteErr := remapper.IcebergWriter.DropMaterializedView(icebergSchemaTable) + deleteErr := remapper.IcebergWriter.DropMaterializedView(icebergSchemaTable, true) if deleteErr != nil { return fmt.Errorf("couldn't remap definition of CREATE MATERIALIZED VIEW: %w (%w)", err, deleteErr) } @@ -577,7 +589,7 @@ func (remapper *QueryRemapper) createMaterializedView(node *pgQuery.Node) error err = remapper.IcebergWriter.RefreshMaterializedView(icebergSchemaTable, queryStatements[0]) if err != nil { - deleteErr := remapper.IcebergWriter.DropMaterializedView(icebergSchemaTable) + deleteErr := remapper.IcebergWriter.DropMaterializedView(icebergSchemaTable, true) if deleteErr != nil { return fmt.Errorf("couldn't refresh materialized view: %w (%w)", err, deleteErr) } @@ -590,21 +602,34 @@ func (remapper *QueryRemapper) createMaterializedView(node *pgQuery.Node) error func (remapper *QueryRemapper) dropMaterializedViewFromNode(node *pgQuery.Node) error { var icebergSchemaTable common.IcebergSchemaTable - nodeItems := node.GetDropStmt().Objects[0].GetList().Items - if len(nodeItems) == 2 { + dropStatement := node.GetDropStmt() + nodeItems := dropStatement.Objects[0].GetList().Items + + switch len(nodeItems) { + case 3: + if nodeItems[0].GetString_().Sval != remapper.config.Database { + return fmt.Errorf("cross-database materialized view drop is not supported: %s", nodeItems[0].GetString_().Sval) + } + icebergSchemaTable = common.IcebergSchemaTable{ + Schema: nodeItems[1].GetString_().Sval, + Table: nodeItems[2].GetString_().Sval, + } + case 2: icebergSchemaTable = common.IcebergSchemaTable{ Schema: nodeItems[0].GetString_().Sval, Table: nodeItems[1].GetString_().Sval, } - } else { + case 1: icebergSchemaTable = common.IcebergSchemaTable{ Schema: PG_SCHEMA_PUBLIC, Table: nodeItems[0].GetString_().Sval, } + default: + return errors.New("couldn't read DROP MATERIALIZED VIEW statement") } - // Delete the materialized view from the catalog - err := remapper.IcebergWriter.DropMaterializedView(icebergSchemaTable) + // Drop the materialized view from the catalog + err := remapper.IcebergWriter.DropMaterializedView(icebergSchemaTable, dropStatement.MissingOk) if err != nil { return err } @@ -648,6 +673,26 @@ func (remapper *QueryRemapper) refreshMaterializedViewFromNode(node *pgQuery.Nod return nil } +func (remapper *QueryRemapper) renameMaterializedViewFromNode(node *pgQuery.Node) error { + icebergSchemaTable := common.IcebergSchemaTable{ + Schema: node.GetRenameStmt().Relation.Schemaname, + Table: node.GetRenameStmt().Relation.Relname, + } + if icebergSchemaTable.Schema == "" { + icebergSchemaTable.Schema = PG_SCHEMA_PUBLIC + } + + renameStatement := node.GetRenameStmt() + newName := renameStatement.Newname + + err := remapper.IcebergWriter.RenameMaterializedView(icebergSchemaTable, newName, renameStatement.MissingOk) + if err != nil { + return fmt.Errorf("couldn't rename table: %w", err) + } + + return nil +} + func (remapper *QueryRemapper) traceTreeTraversal(label string, indentLevel int) { common.LogTrace(remapper.config.CommonConfig, strings.Repeat(">", indentLevel), label) } From 6e208568d932cebe77c3cc9e23e555f77dcf6088 Mon Sep 17 00:00:00 2001 From: exAspArk Date: Fri, 5 Sep 2025 12:47:57 -0400 Subject: [PATCH 13/24] Add a data connector for Attio CRM --- .env.sample | 2 + Dockerfile | 12 +- Makefile | 5 + README.md | 18 + docker/bin/run.sh | 10 + src/common/capped_buffer.go | 2 + src/common/common_config.go | 2 +- src/common/iceberg_schema_column.go | 13 +- src/common/iceberg_table.go | 26 + src/syncer-amplitude/event.go | 2 +- src/syncer-amplitude/syncer.go | 7 +- src/syncer-attio/attio.go | 124 +++ src/syncer-attio/config.go | 83 ++ src/syncer-attio/go.mod | 64 ++ src/syncer-attio/go.sum | 1160 ++++++++++++++++++++ src/syncer-attio/main.go | 13 + src/syncer-attio/parser.go | 193 ++++ src/syncer-attio/record_company.go | 121 ++ src/syncer-attio/record_deal.go | 49 + src/syncer-attio/record_person.go | 112 ++ src/syncer-attio/syncer.go | 73 ++ src/syncer-postgres/init_test.go | 2 +- src/syncer-postgres/postgres.go | 1 + src/syncer-postgres/syncer_full_refresh.go | 35 +- src/syncer-postgres/syncer_utils.go | 6 - 25 files changed, 2093 insertions(+), 42 deletions(-) create mode 100644 src/syncer-attio/attio.go create mode 100644 src/syncer-attio/config.go create mode 100644 src/syncer-attio/go.mod create mode 100644 src/syncer-attio/go.sum create mode 100644 src/syncer-attio/main.go create mode 100644 src/syncer-attio/parser.go create mode 100644 src/syncer-attio/record_company.go create mode 100644 src/syncer-attio/record_deal.go create mode 100644 src/syncer-attio/record_person.go create mode 100644 src/syncer-attio/syncer.go diff --git a/.env.sample b/.env.sample index 39038b8..02c0630 100644 --- a/.env.sample +++ b/.env.sample @@ -10,5 +10,7 @@ SOURCE_POSTGRES_DATABASE_URL=postgres://postgres:postgres@host.docker.internal:5 SOURCE_AMPLITUDE_API_KEY=[REPLACE_ME] SOURCE_AMPLITUDE_SECRET_KEY=[REPLACE_ME] +SOURCE_ATTIO_API_ACCESS_TOKEN=[REPLACE_ME] + BEMIDB_LOG_LEVEL=INFO BEMIDB_DISABLE_ANONYMOUS_ANALYTICS=true diff --git a/Dockerfile b/Dockerfile index 0bf825f..5b2fbdb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -43,24 +43,34 @@ RUN cd /app/src/syncer-postgres && go mod download COPY --chown=app:app src/syncer-amplitude/go.mod src/syncer-amplitude/go.sum /app/src/syncer-amplitude/ RUN cd /app/src/syncer-amplitude && go mod download +COPY --chown=app:app src/syncer-attio/go.mod src/syncer-attio/go.sum /app/src/syncer-attio/ +RUN cd /app/src/syncer-attio && go mod download + COPY --chown=app:app src/server/go.mod src/server/go.sum /app/src/server/ RUN cd /app/src/server && go mod download COPY --chown=app:app src/common /app/src/common COPY --chown=app:app src/syncer-postgres /app/src/syncer-postgres COPY --chown=app:app src/syncer-amplitude /app/src/syncer-amplitude +COPY --chown=app:app src/syncer-attio /app/src/syncer-attio COPY --chown=app:app src/server /app/src/server RUN ARCH=$(dpkg --print-architecture) \ && cd /app/src/syncer-postgres && CGO_ENABLED=1 GOOS=linux GOARCH=$ARCH go build -o /app/bin/syncer-postgres \ && cd /app/src/syncer-amplitude && CGO_ENABLED=1 GOOS=linux GOARCH=$ARCH go build -o /app/bin/syncer-amplitude \ + && cd /app/src/syncer-attio && CGO_ENABLED=1 GOOS=linux GOARCH=$ARCH go build -o /app/bin/syncer-attio \ && cd /app/src/server && CGO_ENABLED=1 GOOS=linux GOARCH=$ARCH go build -o /app/bin/server # Prepare final image ############################################################################## FROM base AS final -COPY --chown=app:app --from=compile /app/bin/syncer-postgres /app/bin/syncer-amplitude /app/bin/server /app/bin/ +COPY --chown=app:app --from=compile \ + /app/bin/syncer-postgres \ + /app/bin/syncer-amplitude \ + /app/bin/syncer-attio \ + /app/bin/server \ + /app/bin/ COPY --chown=app:app docker/bin /app/bin/ USER app diff --git a/Makefile b/Makefile index 4220ee9..588296b 100644 --- a/Makefile +++ b/Makefile @@ -5,12 +5,14 @@ install: devbox run "cd src/common && go mod tidy && \ cd ../syncer-postgres && go mod tidy && \ cd ../syncer-amplitude && go mod tidy && \ + cd ../syncer-attio && go mod tidy && \ cd ../server && go mod tidy" lint: devbox run "cd src/common && go fmt && staticcheck . && \ cd ../syncer-postgres && go fmt && deadcode . && staticcheck . && \ cd ../syncer-amplitude && go fmt && deadcode . && staticcheck . && \ + cd ../syncer-attio && go fmt && deadcode . && staticcheck . && \ cd ../server && go fmt && deadcode . && staticcheck ." build: @@ -37,6 +39,9 @@ local-syncer-postgres: local-build local-syncer-amplitude: local-build docker run -it --rm --env-file .env -e DESTINATION_SCHEMA_NAME=amplitude bemidb:local syncer-amplitude +local-syncer-attio: local-build + docker run -it --rm --env-file .env -e DESTINATION_SCHEMA_NAME=attio bemidb:local syncer-attio + local-sh: docker run -it --rm --env-file .env bemidb:local bash diff --git a/README.md b/README.md index 218f2e8..13808ea 100644 --- a/README.md +++ b/README.md @@ -165,6 +165,16 @@ docker run \ ghcr.io/bemihq/bemidb:latest syncer-amplitude ``` +#### Syncing from Attio + +```sh +docker run \ + -e SOURCE_ATTIO_API_ACCESS_TOKEN=[...] \ + -e DESTINATION_SCHEMA_NAME=attio \ + -e AWS_REGION -e AWS_S3_BUCKET -e AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY -e CATALOG_DATABASE_URL \ + ghcr.io/bemihq/bemidb:latest syncer-attio +``` + #### Customizing S3 endpoint BemiDB can work with various S3-compatible object storage solutions, such as MinIO. @@ -215,6 +225,13 @@ export AWS_S3_ENDPOINT=http://localhost:9000 | `SOURCE_AMPLITUDE_SECRET_KEY` | Required | Amplitude secret key for authentication. | | `SOURCE_AMPLITUDE_START_DATE` | `2025-01-01` | Start date for syncing data from Amplitude in `YYYY-MM-DD` format. | +#### `syncer-attio` command options + +| Environment variable | Default value | Description | +|---------------------------------|---------------|--------------------------------------------| +| `DESTINATION_SCHEMA_NAME` | Required | Schema name in BemiDB to sync data to. | +| `SOURCE_ATTIO_API_ACCESS_TOKEN` | Required | Attio API access token for authentication. | + #### `server` command options | Environment variable | Default value | Description | @@ -314,6 +331,7 @@ SELECT * FROM [TABLE] WHERE [JSON_COLUMN]->>'[JSON_KEY]' = '[JSON_VALUE]'; - [ ] Jupyter notebooks ([#27](https://github.com/BemiHQ/BemiDB/issues/27)) - [x] Data syncing from other sources - [x] Amplitude (incremental) + - [x] Attio CRM (full-refresh) - [x] Postgres (full-refresh) - [ ] HubSpot - [ ] Stripe diff --git a/docker/bin/run.sh b/docker/bin/run.sh index bc52840..e5ec4e5 100755 --- a/docker/bin/run.sh +++ b/docker/bin/run.sh @@ -27,6 +27,16 @@ case "${1:-}" in ./bin/syncer-amplitude 2>&1 | sed 's/^/[Syncer] /' echo "Syncer for Amplitude finished." ;; + syncer-attio) + : "${SOURCE_ATTIO_API_ACCESS_TOKEN:?Environment variable SOURCE_ATTIO_API_ACCESS_TOKEN must be set}" + : "${DESTINATION_SCHEMA_NAME:?Environment variable DESTINATION_SCHEMA_NAME must be set}" + + psql $CATALOG_DATABASE_URL -f /app/scripts/catalog.sql + + echo "Starting Syncer for Attio..." + ./bin/syncer-attio 2>&1 | sed 's/^/[Syncer] /' + echo "Syncer for Attio finished." + ;; server) : "${AWS_REGION:?Environment variable AWS_REGION must be set}" : "${AWS_S3_BUCKET:?Environment variable AWS_S3_BUCKET must be set}" diff --git a/src/common/capped_buffer.go b/src/common/capped_buffer.go index 54d9b46..32a7724 100644 --- a/src/common/capped_buffer.go +++ b/src/common/capped_buffer.go @@ -6,6 +6,8 @@ import ( "sync" ) +const DEFAULT_CAPPED_BUFFER_SIZE = 32 * 1024 * 1024 // 32 MB in memory + type CappedBuffer struct { Config *CommonConfig MaxSizeBytes int diff --git a/src/common/common_config.go b/src/common/common_config.go index c701b8b..63ca19c 100644 --- a/src/common/common_config.go +++ b/src/common/common_config.go @@ -1,7 +1,7 @@ package common const ( - VERSION = "1.2.0" + VERSION = "1.3.0" ENV_LOG_LEVEL = "BEMIDB_LOG_LEVEL" ENV_DISABLE_ANONYMOUS_ANALYTICS = "BEMIDB_DISABLE_ANONYMOUS_ANALYTICS" diff --git a/src/common/iceberg_schema_column.go b/src/common/iceberg_schema_column.go index a7e9ff8..cd02ecd 100644 --- a/src/common/iceberg_schema_column.go +++ b/src/common/iceberg_schema_column.go @@ -368,8 +368,17 @@ func (col *IcebergSchemaColumn) duckdbPrimitiveValueFromJson(value any) interfac return value } case IcebergColumnTypeDate: - days := value.(float64) - return time.Unix(0, 0).UTC().AddDate(0, 0, int(days)) + switch kind { + case reflect.String: + valueString := value.(string) + if valueString == "" { + return nil + } + return StringDateToTime(valueString) + case reflect.Float64: + days := value.(float64) + return time.Unix(0, 0).UTC().AddDate(0, 0, int(days)) + } case IcebergColumnTypeTime: var nanoseconds int64 if col.DatetimePrecision == 6 { diff --git a/src/common/iceberg_table.go b/src/common/iceberg_table.go index 9aa7d17..000498a 100644 --- a/src/common/iceberg_table.go +++ b/src/common/iceberg_table.go @@ -43,6 +43,32 @@ func (table *IcebergTable) Create(tableS3Path string) { table.IcebergCatalog.CreateTable(table.IcebergSchemaTable, tableS3Path+"/metadata/"+ICEBERG_METADATA_INITIAL_FILE_NAME) } +func (table *IcebergTable) ReplaceWith(callbackFunc func(syncingIcebergTable *IcebergTable)) { + originalTableName := table.IcebergSchemaTable.Table + + // Delete -syncing table + syncingIcebergSchemaTable := IcebergSchemaTable{Schema: table.IcebergSchemaTable.Schema, Table: originalTableName + TEMP_TABLE_SUFFIX_SYNCING} + syncingIcebergTable := NewIcebergTable(table.Config, table.StorageS3, table.DuckdbClient, syncingIcebergSchemaTable) + syncingIcebergTable.DropIfExists() + + // Insert into -syncing table + callbackFunc(syncingIcebergTable) + + // Delete -deleting table + deletingIcebergSchemaTable := IcebergSchemaTable{Schema: table.IcebergSchemaTable.Schema, Table: originalTableName + TEMP_TABLE_SUFFIX_DELETING} + deletingIcebergTable := NewIcebergTable(table.Config, table.StorageS3, table.DuckdbClient, deletingIcebergSchemaTable) + deletingIcebergTable.DropIfExists() + + // Rename table to -deleting + table.Rename(deletingIcebergSchemaTable.Table) + + // Rename -syncing to table + syncingIcebergTable.Rename(originalTableName) + + // Delete -deleting table + deletingIcebergTable.DropIfExists() +} + func (table *IcebergTable) DropIfExists() { tableS3Path := table.IcebergCatalog.TableS3Path(table.IcebergSchemaTable) if tableS3Path == "" { diff --git a/src/syncer-amplitude/event.go b/src/syncer-amplitude/event.go index 14461e2..6a6e74b 100644 --- a/src/syncer-amplitude/event.go +++ b/src/syncer-amplitude/event.go @@ -128,7 +128,7 @@ func (event *Event) ToMap() map[string]interface{} { return result } -func EventIcebergSchemaColumns(config *common.CommonConfig) []*common.IcebergSchemaColumn { +func EventsIcebergSchemaColumns(config *common.CommonConfig) []*common.IcebergSchemaColumn { return []*common.IcebergSchemaColumn{ {Config: config, ColumnName: "adid", ColumnType: common.IcebergColumnTypeString, Position: 1}, {Config: config, ColumnName: "amplitude_attribution_ids", ColumnType: common.IcebergColumnTypeString, Position: 2}, diff --git a/src/syncer-amplitude/syncer.go b/src/syncer-amplitude/syncer.go index ef02034..eabea9b 100644 --- a/src/syncer-amplitude/syncer.go +++ b/src/syncer-amplitude/syncer.go @@ -13,8 +13,7 @@ const ( CURSOR_COLUMN_NAME = "server_upload_time" - MAX_IN_MEMORY_BUFFER_SIZE = 32 * 1024 * 1024 // 32 MB - COMPRESSION_FACTOR = 2 // 1 GB uncompressed data x 2 = ~90MB compressed data + COMPRESSION_FACTOR = 2 // 1 GB uncompressed data x 2 = ~90MB compressed data ) type Syncer struct { @@ -39,7 +38,7 @@ func NewSyncer(config *Config) *Syncer { func (syncer *Syncer) Sync() { common.SendAnonymousAnalytics(syncer.Config.CommonConfig, "syncer-amplitude-start", syncer.name()) - cappedBuffer := common.NewCappedBuffer(syncer.Config.CommonConfig, MAX_IN_MEMORY_BUFFER_SIZE) + cappedBuffer := common.NewCappedBuffer(syncer.Config.CommonConfig, common.DEFAULT_CAPPED_BUFFER_SIZE) jsonQueueWriter := common.NewJsonQueueWriter(cappedBuffer) icebergSchemaTable := common.IcebergSchemaTable{Schema: syncer.Config.DestinationSchemaName, Table: EVENTS_TABLE_NAME} @@ -74,7 +73,7 @@ func (syncer *Syncer) Sync() { }() // Read from cappedBuffer and write to Iceberg - icebergSchemaColumns := EventIcebergSchemaColumns(syncer.Config.CommonConfig) + icebergSchemaColumns := EventsIcebergSchemaColumns(syncer.Config.CommonConfig) icebergTableWriter := common.NewIcebergTableWriter(syncer.Config.CommonConfig, syncer.StorageS3, syncer.DuckdbClient, icebergTable, icebergSchemaColumns, COMPRESSION_FACTOR) icebergTableWriter.AppendFromJsonCappedBuffer(cursorValue, cappedBuffer) diff --git a/src/syncer-attio/attio.go b/src/syncer-attio/attio.go new file mode 100644 index 0000000..898f1ec --- /dev/null +++ b/src/syncer-attio/attio.go @@ -0,0 +1,124 @@ +package main + +import ( + "encoding/json" + "fmt" + "io" + "net/http" + "time" + + "github.com/BemiHQ/BemiDB/src/common" +) + +const ( + ATTIO_API_URL = "https://api.attio.com/v2" + ATTIO_API_LIMIT = 500 + + ATTIO_OBJECT_COMPANIES = "companies" + ATTIO_OBJECT_DEALS = "deals" + ATTIO_OBJECT_PEOPLE = "people" +) + +type Attio struct { + Config *Config + HttpClient *http.Client + Parser *Parser +} + +func NewAttio(config *Config) *Attio { + return &Attio{ + Config: config, + HttpClient: &http.Client{Timeout: 30 * time.Second}, + Parser: NewParser(config), + } +} + +type ListRecordsResponse struct { + Data []json.RawMessage `json:"data"` +} + +func (attio *Attio) Load(object string, jsonQueueWriter *common.JsonQueueWriter) error { + offset := 0 + for { + req, err := http.NewRequest("POST", ATTIO_API_URL+"/objects/"+object+"/records/query", nil) + if err != nil { + return err + } + q := req.URL.Query() + q.Add("limit", common.IntToString(ATTIO_API_LIMIT)) + q.Add("offset", common.IntToString(offset)) + req.URL.RawQuery = q.Encode() + + req.Header.Set("Authorization", "Bearer "+attio.Config.ApiAccessToken) + req.Header.Set("Content-Type", "application/json") + + resp, err := attio.HttpClient.Do(req) + if err != nil { + return err + } + + if resp.StatusCode != http.StatusOK { + body, _ := io.ReadAll(resp.Body) + resp.Body.Close() + return fmt.Errorf("failed to list Attio records for object '%s': status %d, body: %s", object, resp.StatusCode, string(body)) + } + + var response ListRecordsResponse + err = json.NewDecoder(resp.Body).Decode(&response) + resp.Body.Close() + if err != nil { + return err + } + + switch object { + case ATTIO_OBJECT_COMPANIES: + for _, rawCompany := range response.Data { + var record RecordCompany + err = json.Unmarshal(rawCompany, &record) + if err != nil { + return err + } + parsedMap := record.ToMap(attio.Parser) + err = jsonQueueWriter.Write(parsedMap) + if err != nil { + return err + } + } + case ATTIO_OBJECT_DEALS: + for _, rawDeal := range response.Data { + var record RecordDeal + err = json.Unmarshal(rawDeal, &record) + if err != nil { + return err + } + parsedMap := record.ToMap(attio.Parser) + err = jsonQueueWriter.Write(parsedMap) + if err != nil { + return err + } + } + case ATTIO_OBJECT_PEOPLE: + for _, rawDeal := range response.Data { + var person RecordPerson + err = json.Unmarshal(rawDeal, &person) + if err != nil { + return err + } + parsedMap := person.ToMap(attio.Parser) + err = jsonQueueWriter.Write(parsedMap) + if err != nil { + return err + } + } + default: + return fmt.Errorf("unknown Attio object type: %s", object) + } + + if len(response.Data) < ATTIO_API_LIMIT { + break + } + offset += ATTIO_API_LIMIT + } + + return nil +} diff --git a/src/syncer-attio/config.go b/src/syncer-attio/config.go new file mode 100644 index 0000000..bf4cc3e --- /dev/null +++ b/src/syncer-attio/config.go @@ -0,0 +1,83 @@ +package main + +import ( + "flag" + "os" + "slices" + "strings" + + "github.com/BemiHQ/BemiDB/src/common" +) + +const ( + ENV_DESTINATION_SCHEMA_NAME = "DESTINATION_SCHEMA_NAME" + ENV_API_ACCESS_TOKEN = "SOURCE_ATTIO_API_ACCESS_TOKEN" +) + +type Config struct { + CommonConfig *common.CommonConfig + DestinationSchemaName string + ApiAccessToken string +} + +var _config Config + +func init() { + registerFlags() +} + +func registerFlags() { + _config.CommonConfig = &common.CommonConfig{} + + flag.StringVar(&_config.CommonConfig.LogLevel, "log-level", os.Getenv(common.ENV_LOG_LEVEL), `Log level: "ERROR", "WARN", "INFO", "DEBUG", "TRACE". Default: "`+common.DEFAULT_LOG_LEVEL+`"`) + flag.StringVar(&_config.CommonConfig.CatalogDatabaseUrl, "catalog-database-url", os.Getenv(common.ENV_CATALOG_DATABASE_URL), "Catalog database URL") + flag.StringVar(&_config.CommonConfig.Aws.Region, "aws-region", os.Getenv(common.ENV_AWS_REGION), "AWS region") + flag.StringVar(&_config.CommonConfig.Aws.S3Endpoint, "aws-s3-endpoint", os.Getenv(common.ENV_AWS_S3_ENDPOINT), "AWS S3 endpoint. Default: \""+common.DEFAULT_AWS_S3_ENDPOINT+`"`) + flag.StringVar(&_config.CommonConfig.Aws.S3Bucket, "aws-s3-bucket", os.Getenv(common.ENV_AWS_S3_BUCKET), "AWS S3 bucket name") + flag.StringVar(&_config.CommonConfig.Aws.AccessKeyId, "aws-access-key-id", os.Getenv(common.ENV_AWS_ACCESS_KEY_ID), "AWS access key ID") + flag.StringVar(&_config.CommonConfig.Aws.SecretAccessKey, "aws-secret-access-key", os.Getenv(common.ENV_AWS_SECRET_ACCESS_KEY), "AWS secret access key") + flag.BoolVar(&_config.CommonConfig.DisableAnonymousAnalytics, "disable-anonymous-analytics", os.Getenv(common.ENV_DISABLE_ANONYMOUS_ANALYTICS) == "true", "Disable anonymous analytics collection") + + flag.StringVar(&_config.DestinationSchemaName, "destination-schema-name", os.Getenv(ENV_DESTINATION_SCHEMA_NAME), "Destination schema name to store the synced data") + flag.StringVar(&_config.ApiAccessToken, "api-access-token", os.Getenv(ENV_API_ACCESS_TOKEN), "Attio API Key") +} + +func parseFlags() { + flag.Parse() + + if _config.CommonConfig.LogLevel == "" { + _config.CommonConfig.LogLevel = common.DEFAULT_LOG_LEVEL + } else if !slices.Contains(common.LOG_LEVELS, _config.CommonConfig.LogLevel) { + panic("Invalid log level " + _config.CommonConfig.LogLevel + ". Must be one of " + strings.Join(common.LOG_LEVELS, ", ")) + } + if _config.CommonConfig.CatalogDatabaseUrl == "" { + panic("Catalog database URL is required") + } + if _config.CommonConfig.Aws.Region == "" { + panic("AWS region is required") + } + if _config.CommonConfig.Aws.S3Endpoint == "" { + _config.CommonConfig.Aws.S3Endpoint = common.DEFAULT_AWS_S3_ENDPOINT + } + if _config.CommonConfig.Aws.S3Bucket == "" { + panic("AWS S3 bucket name is required") + } + if _config.CommonConfig.Aws.AccessKeyId != "" && _config.CommonConfig.Aws.SecretAccessKey == "" { + panic("AWS secret access key is required") + } + if _config.CommonConfig.Aws.AccessKeyId == "" && _config.CommonConfig.Aws.SecretAccessKey != "" { + panic("AWS access key ID is required") + } + + if _config.DestinationSchemaName == "" { + panic("Destination schema name is required") + } + if _config.ApiAccessToken == "" { + panic("Attio API key is required") + } +} + +func LoadConfig() *Config { + parseFlags() + return &_config +} diff --git a/src/syncer-attio/go.mod b/src/syncer-attio/go.mod new file mode 100644 index 0000000..eeef2a6 --- /dev/null +++ b/src/syncer-attio/go.mod @@ -0,0 +1,64 @@ +module github.com/BemiHQ/BemiDB/src/syncer-attio + +go 1.24.4 + +require github.com/BemiHQ/BemiDB/src/common v0.0.0-00010101000000-000000000000 + +replace github.com/BemiHQ/BemiDB/src/common => ../common + +require ( + github.com/apache/arrow-go/v18 v18.4.0 // indirect + github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 // indirect + github.com/apache/thrift v0.22.0 // indirect + github.com/aws/aws-sdk-go-v2 v1.37.0 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 // indirect + github.com/aws/aws-sdk-go-v2/config v1.30.1 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.18.1 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0 // indirect + github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.26.0 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.35.0 // indirect + github.com/aws/smithy-go v1.22.5 // indirect + github.com/duckdb/duckdb-go-bindings v0.1.16 // indirect + github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11 // indirect + github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11 // indirect + github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11 // indirect + github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11 // indirect + github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11 // indirect + github.com/go-viper/mapstructure/v2 v2.3.0 // indirect + github.com/goccy/go-json v0.10.5 // indirect + github.com/golang/snappy v1.0.0 // indirect + github.com/google/flatbuffers v25.2.10+incompatible // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect + github.com/jackc/pgx/v5 v5.7.5 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.11 // indirect + github.com/linkedin/goavro v2.1.0+incompatible // indirect + github.com/marcboeker/go-duckdb/arrowmapping v0.0.9 // indirect + github.com/marcboeker/go-duckdb/mapping v0.0.10 // indirect + github.com/marcboeker/go-duckdb/v2 v2.3.2 // indirect + github.com/pierrec/lz4/v4 v4.1.22 // indirect + github.com/xitongsys/parquet-go v1.6.2 // indirect + github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b // indirect + github.com/zeebo/xxh3 v1.0.2 // indirect + golang.org/x/crypto v0.37.0 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.25.0 // indirect + golang.org/x/sync v0.15.0 // indirect + golang.org/x/sys v0.33.0 // indirect + golang.org/x/text v0.26.0 // indirect + golang.org/x/tools v0.34.0 // indirect + golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect +) diff --git a/src/syncer-attio/go.sum b/src/syncer-attio/go.sum new file mode 100644 index 0000000..74c3ead --- /dev/null +++ b/src/syncer-attio/go.sum @@ -0,0 +1,1160 @@ +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.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.66.0/go.mod h1:dgqGAjKCDxyhGTtC9dAREQGUJpkceNm1yt590Qno0Ko= +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.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.82.0/go.mod h1:vlKccHJGuFBFufnAnuB08dfEH9Y3H7dzDzRECFdC2TA= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= +cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +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 v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= +cloud.google.com/go/compute v1.2.0/go.mod h1:xlogom/6gr8RJGBe7nT2eGsQYAFUbbv8dbC29qE3Xmw= +cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= +cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= +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/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= +cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= +cloud.google.com/go/iam v0.1.1/go.mod h1:CKqrcnI/suGpybEHxZ7BMehL0oA4LpdyJdUlTl9jVMw= +cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= +cloud.google.com/go/kms v1.1.0/go.mod h1:WdbppnCDMDpOvoYBMn1+gNmOeEoZYqAv+HeuKARGCXI= +cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= +cloud.google.com/go/monitoring v1.1.0/go.mod h1:L81pzz7HKn14QCMaCs6NTQkdBnE87TElyanS95vIcl4= +cloud.google.com/go/monitoring v1.4.0/go.mod h1:y6xnxfwI3hTFWOdkOaD7nfJVlwuC3/mS/5kvtT131p4= +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/pubsub v1.19.0/go.mod h1:/O9kmSe9bb9KRnIAWkzmqhPjHo6LtzGOBYd/kr06XSs= +cloud.google.com/go/secretmanager v1.3.0/go.mod h1:+oLTkouyiYiabAQNugCeTS3PAArGiMJuBqvJnJsyH+U= +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.12.0/go.mod h1:fFLk2dp2oAhDz8QFKwqrjdJvxSp/W2g7nillojlL5Ho= +cloud.google.com/go/storage v1.21.0/go.mod h1:XmRlxkgPjlBONznT2dDUU/5XlpU2OjMnKuqnZI01LAA= +cloud.google.com/go/trace v1.0.0/go.mod h1:4iErSByzxkyHWzzlAj63/Gmjz0NH1ASqhJguHpGcr6A= +cloud.google.com/go/trace v1.2.0/go.mod h1:Wc8y/uYyOhPy12KEnXG9XGrvfMz5F5SrYecQlbW1rwM= +contrib.go.opencensus.io/exporter/aws v0.0.0-20200617204711-c478e41e60e9/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= +contrib.go.opencensus.io/exporter/stackdriver v0.13.10/go.mod h1:I5htMbyta491eUxufwwZPQdcKvvgzMB4O9ni41YnIM8= +contrib.go.opencensus.io/integrations/ocsql v0.1.7/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/Azure/azure-amqp-common-go/v3 v3.2.1/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= +github.com/Azure/azure-amqp-common-go/v3 v3.2.2/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= +github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k= +github.com/Azure/azure-sdk-for-go v51.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v59.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.0.0/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.0.0/go.mod h1:+6sju8gk8FRmSajX3Oz4G5Gm7P+mbqE9FVaXXFYTkCM= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U= +github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.0.0/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.0.0/go.mod h1:ceIuwmxDWptoW3eCqSXlnPsZFKh4X+R38dWPv7GS9Vs= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.0.0/go.mod h1:s1tW/At+xHqjNFvWU4G0c0Qv33KOhvbGNj0RCTQDV8s= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.2.0/go.mod h1:c+Lifp3EDEamAkPVzMooRNOK6CZjNSdEnf1A7jsI9u4= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.1.0/go.mod h1:7QJP7dr2wznCMeqIrhMgWGf7XpAQnVrJqDm9nvV3Cu4= +github.com/Azure/azure-service-bus-go v0.11.5/go.mod h1:MI6ge2CuQWBVq+ly456MY7XqNLJip5LO1iSFodbNLbU= +github.com/Azure/azure-storage-blob-go v0.14.0/go.mod h1:SMqIBi+SuiQH32bvyjngEewEeXoPfKMgWlBDaYf6fck= +github.com/Azure/go-amqp v0.16.0/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= +github.com/Azure/go-amqp v0.16.4/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= +github.com/Azure/go-autorest/autorest v0.11.19/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= +github.com/Azure/go-autorest/autorest v0.11.22/go.mod h1:BAWYUWGPEtKPzjVkp0Q6an0MJcJDsoh5Z1BFAEFs4Xs= +github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= +github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/adal v0.9.14/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/adal v0.9.17/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= +github.com/Azure/go-autorest/autorest/azure/auth v0.5.9/go.mod h1:hg3/1yw0Bq87O3KvvnJoAh34/0zbP7SFizX/qN5JvjU= +github.com/Azure/go-autorest/autorest/azure/cli v0.4.2/go.mod h1:7qkJkT+j6b+hIpzMOwPChJhTqS8VbsqqgULzMNRugoM= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= +github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= +github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= +github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= +github.com/AzureAD/microsoft-authentication-library-for-go v0.4.0/go.mod h1:Vt9sXTKwMyGcOxSmLDMnGPgqsUg7m8pe215qMLrDXw4= +github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/GoogleCloudPlatform/cloudsql-proxy v1.29.0/go.mod h1:spvB9eLJH9dutlbPSRmHvSXXHOwGRyeXh1jVdquA2G8= +github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= +github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apache/arrow-go/v18 v18.4.0 h1:/RvkGqH517iY8bZKc4FD5/kkdwXJGjxf28JIXbJ/oB0= +github.com/apache/arrow-go/v18 v18.4.0/go.mod h1:Aawvwhj8x2jURIzD9Moy72cF0FyJXOpkYpdmGRHcw14= +github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 h1:byKBBF2CKWBjjA4J1ZL2JXttJULvWSl50LegTyRZ728= +github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516/go.mod h1:QNYViu/X0HXDHw7m3KXzWSVXIbfUvJqBFe6Gj8/pYA0= +github.com/apache/thrift v0.0.0-20181112125854-24918abba929/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.14.2/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.22.0 h1:r7mTJdj51TMDe6RtcmNdQxgn9XcyfGDOzegMDRg47uc= +github.com/apache/thrift v0.22.0/go.mod h1:1e7J/O1Ae6ZQMTYdy9xa3w9k+XHWPfRvdPyJeynQ+/g= +github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= +github.com/aws/aws-sdk-go v1.30.19/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= +github.com/aws/aws-sdk-go v1.37.0/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= +github.com/aws/aws-sdk-go v1.43.31 h1:yJZIr8nMV1hXjAvvOLUFqZRJcHV7udPQBfhJqawDzI0= +github.com/aws/aws-sdk-go v1.43.31/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= +github.com/aws/aws-sdk-go-v2 v1.16.2/go.mod h1:ytwTPBG6fXTZLxxeeCCWj2/EMYp/xDUgX+OET6TLNNU= +github.com/aws/aws-sdk-go-v2 v1.23.0/go.mod h1:i1XDttT4rnf6vxc9AuskLc6s7XBee8rlLilKlc03uAA= +github.com/aws/aws-sdk-go-v2 v1.37.0 h1:YtCOESR/pN4j5oA7cVHSfOwIcuh/KwHC4DOSXFbv5F0= +github.com/aws/aws-sdk-go-v2 v1.37.0/go.mod h1:9Q0OoGQoboYIAJyslFyF1f5K1Ryddop8gqMhWx/n4Wg= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.1/go.mod h1:n8Bs1ElDD2wJ9kCRTczA83gYbBmjSwZp3umc6zF4EeM= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.1/go.mod h1:t8PYl/6LzdAqsU4/9tz28V/kU+asFePvpOMkdul0gEQ= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 h1:6GMWV6CNpA/6fbFHnoAjrv4+LGfyTqZz2LtCHnspgDg= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0/go.mod h1:/mXlTIVG9jbxkqDnr5UQNQxW1HRYxeGklkM9vAFeabg= +github.com/aws/aws-sdk-go-v2/config v1.15.3/go.mod h1:9YL3v07Xc/ohTsxFXzan9ZpFpdTOFl4X65BAKYaz8jg= +github.com/aws/aws-sdk-go-v2/config v1.25.3/go.mod h1:tAByZy03nH5jcq0vZmkcVoo6tRzRHEwSFx3QW4NmDw8= +github.com/aws/aws-sdk-go-v2/config v1.30.1 h1:sHL8g/+9tcZATeV2tEkEfxZeaNokDtKsSjGMGHD49qA= +github.com/aws/aws-sdk-go-v2/config v1.30.1/go.mod h1:wkibEyFfxXRyTSzRU4bbF5IUsSXyE4xQ4ZjkGmi5tFo= +github.com/aws/aws-sdk-go-v2/credentials v1.11.2/go.mod h1:j8YsY9TXTm31k4eFhspiQicfXPLZ0gYXA50i4gxPE8g= +github.com/aws/aws-sdk-go-v2/credentials v1.16.2/go.mod h1:sDdvGhXrSVT5yzBDR7qXz+rhbpiMpUYfF3vJ01QSdrc= +github.com/aws/aws-sdk-go-v2/credentials v1.18.1 h1:E55xvOqlX7CvB66Z7rSM9usCrFU1ryUIUHqiXsEzVoE= +github.com/aws/aws-sdk-go-v2/credentials v1.18.1/go.mod h1:iobSQfR5MkvILxssGOvi/P1jjOhrRzfTiCPCzku0vx4= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.3/go.mod h1:uk1vhHHERfSVCUnqSqz8O48LBYDSC+k6brng09jcMOk= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.4/go.mod h1:t4i+yGHMCcUNIX1x7YVYa6bH/Do7civ5I6cG/6PMfyA= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0 h1:9sBTeKQwAvmJUWKIACIoiFSnxxl+sS++YDfr17/ngq0= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0/go.mod h1:LW9/PxQD1SYFC7pnWcgqPhoyZprhjEdg5hBK6qYPLW8= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.3/go.mod h1:0dHuD2HZZSiwfJSy1FO5bX1hQ1TxVV1QXXjpn3XUE44= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.14.0/go.mod h1:UcgIwJ9KHquYxs6Q5skC9qXjhYMK+JASDYcXQ4X7JZE= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1 h1:aAjA/1JZ1xH/F9XvxJu9cXZyp7BqVXtHpztyZ6p799E= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1/go.mod h1:ia9HASsPba/7o84sp6iE4wZPdNTJ0oicBe5sWQQk+Ys= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.9/go.mod h1:AnVH5pvai0pAF4lXRq0bmhbes1u9R8wTE+g+183bZNM= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.3/go.mod h1:7sGSz1JCKHWWBHq98m6sMtWQikmYPpxjqOydDemiVoM= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0 h1:H2iZoqW/v2Jnrh1FnU725Bq6KJ0k2uP63yH+DcY+HUI= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0/go.mod h1:L0FqLbwMXHvNC/7crWV1iIxUlOKYZUE8KuTIA+TozAI= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.3/go.mod h1:ssOhaLpRlh88H3UmEcsBoVKq309quMvm3Ds8e9d4eJM= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.3/go.mod h1:ify42Rb7nKeDDPkFjKn7q1bPscVPu/+gmHH8d2c+anU= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0 h1:EDped/rNzAhFPhVY0sDGbtD16OKqksfA8OjF/kLEgw8= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0/go.mod h1:uUI335jvzpZRPpjYx6ODc/wg1qH+NnoSTK/FwVeK0C0= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.10/go.mod h1:8DcYQcz0+ZJaSxANlHIsbbi6S+zMwjwdDqwW3r9AzaE= +github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.3/go.mod h1:5yzAuE9i2RkVAttBl8yxZgQr5OCq4D5yDnG7j9x2L0U= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0 h1:iLvW/zOkHGU3BDU5thWnj+UZ9pjhuVhv1loLj7yVtBw= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0/go.mod h1:Fn3gvhdF1x5Rs9nUoCy/fJT1ms8f8dO7RqM9lJHuazQ= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.1/go.mod h1:GeUru+8VzrTXV/83XyMJ80KpH8xO89VPoUileyNQ+tc= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1/go.mod h1:l9ymW25HOqymeU2m1gbUQ3rUIsTwKs8gYHXkqDQUhiI= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 h1:6+lZi2JeGKtCraAj1rpoZfKqnQ9SptseRZioejfUOLM= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0/go.mod h1:eb3gfbVIxIoGgJsi9pGne19dhCBpK6opTYpQqAmdy44= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.3/go.mod h1:Seb8KNmD6kVTjwRjVEgOT5hPin6sq+v4C2ycJQDwuH8= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.3/go.mod h1:R+/S1O4TYpcktbVwddeOYg+uwUfLhADP2S/x4QwsCTM= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0 h1:qGyLBQPphYzUf+IIlb5tHnvg1U2Vc5hXPcP7oRSQfy0= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0/go.mod h1:g+dzKSLXiR/8ATkPXmLhPOI6rDdjLP3tngeo3FvDcIw= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.3/go.mod h1:wlY6SVjuwvh3TVRpTqdy4I1JpBFLX4UGeKZdWntaocw= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.3/go.mod h1:Owv1I59vaghv1Ax8zz8ELY8DN7/Y0rGS+WWAmjgi950= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0 h1:eRhU3Sh8dGbaniI6B+I48XJMrTPRkK4DKo+vqIxziOU= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0/go.mod h1:paNLV18DZ6FnWE/bd06RIKPDIFpjuvCkGKWTG/GDBeM= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.3/go.mod h1:Bm/v2IaN6rZ+Op7zX+bOUMdL4fsrYZiD0dsjLhNKwZc= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.3/go.mod h1:KZgs2ny8HsxRIRbDwgvJcHHBZPOzQr/+NtGwnP+w2ec= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0 h1:6jusT+XCcvnD+Elxvm7bUf5sCMTpZEp3AKjYQ4tWJSo= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0/go.mod h1:LimGpdIF/sTBdgqwOEkrArXLCoTamK/9L9x8IKBFTIc= +github.com/aws/aws-sdk-go-v2/service/kms v1.16.3/go.mod h1:QuiHPBqlOFCi4LqdSskYYAWpQlx3PKmohy+rE2F+o5g= +github.com/aws/aws-sdk-go-v2/service/s3 v1.26.3/go.mod h1:g1qvDuRsJY+XghsV6zg00Z4KJ7DtFFCx8fJD2a491Ak= +github.com/aws/aws-sdk-go-v2/service/s3 v1.43.0/go.mod h1:NXRKkiRF+erX2hnybnVU660cYT5/KChRD4iUgJ97cI8= +github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0 h1:gAV4NEp4A+JOrIdoXkAeyy6IOo7+X2s/jRuaHKYiMaU= +github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0/go.mod h1:JIQwK8sZ5MuKGm5rrFwp9MHUcyYEsQNpVixuPDlnwaU= +github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.15.4/go.mod h1:PJc8s+lxyU8rrre0/4a0pn2wgwiDvOEzoOjcJUBr67o= +github.com/aws/aws-sdk-go-v2/service/sns v1.17.4/go.mod h1:kElt+uCcXxcqFyc+bQqZPFD9DME/eC6oHBXvFzQ9Bcw= +github.com/aws/aws-sdk-go-v2/service/sqs v1.18.3/go.mod h1:skmQo0UPvsjsuYYSYMVmrPc1HWCbHUJyrCEp+ZaLzqM= +github.com/aws/aws-sdk-go-v2/service/ssm v1.24.1/go.mod h1:NR/xoKjdbRJ+qx0pMR4mI+N/H1I1ynHwXnO6FowXJc0= +github.com/aws/aws-sdk-go-v2/service/sso v1.11.3/go.mod h1:7UQ/e69kU7LDPtY40OyoHYgRmgfGM4mgsLYtcObdveU= +github.com/aws/aws-sdk-go-v2/service/sso v1.17.2/go.mod h1:/pE21vno3q1h4bbhUOEi+6Zu/aT26UK2WKkDXd+TssQ= +github.com/aws/aws-sdk-go-v2/service/sso v1.26.0 h1:cuFWHH87GP1NBGXXfMicUbE7Oty5KpPxN6w4JpmuxYc= +github.com/aws/aws-sdk-go-v2/service/sso v1.26.0/go.mod h1:aJBemdlbCKyOXEXdXBqS7E+8S9XTDcOTaoOjtng54hA= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.20.0/go.mod h1:dWqm5G767qwKPuayKfzm4rjzFmVjiBFbOJrpSPnAMDs= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0 h1:t2va+wewPOYIqC6XyJ4MGjiGKkczMAPsgq5W4FtL9ME= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0/go.mod h1:ExCTcqYqN0hYYRsDlBVU8+68grqlWdgX9/nZJwQW4aY= +github.com/aws/aws-sdk-go-v2/service/sts v1.16.3/go.mod h1:bfBj0iVmsUyUg4weDB4NxktD9rDGeKSVWnjTnwbx9b8= +github.com/aws/aws-sdk-go-v2/service/sts v1.25.3/go.mod h1:4EqRHDCKP78hq3zOnmFXu5k0j4bXbRFfCh/zQ6KnEfQ= +github.com/aws/aws-sdk-go-v2/service/sts v1.35.0 h1:FD9agdG4CeOGS3ORLByJk56YIXDS7mxFpmZyCtpqExc= +github.com/aws/aws-sdk-go-v2/service/sts v1.35.0/go.mod h1:NDzDPbBF1xtSTZUMuZx0w3hIfWzcL7X2AQ0Tr9becIQ= +github.com/aws/smithy-go v1.11.2/go.mod h1:3xHYmszWVx2c0kIwQeEVf9uSm4fYZt67FBJnwub1bgM= +github.com/aws/smithy-go v1.17.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= +github.com/aws/smithy-go v1.22.5 h1:P9ATCXPMb2mPjYBgueqJNCA5S9UfktsW0tTxi+a7eqw= +github.com/aws/smithy-go v1.22.5/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/bobg/gcsobj v0.1.2/go.mod h1:vS49EQ1A1Ib8FgrL58C8xXYZyOCR2TgzAdopy6/ipa8= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +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/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/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= +github.com/colinmarc/hdfs/v2 v2.1.1/go.mod h1:M3x+k8UKKmxtFu++uAZ0OtDU8jR3jnaZIAc6yK4Ue0c= +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/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU= +github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= +github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= +github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= +github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= +github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= +github.com/duckdb/duckdb-go-bindings v0.1.16 h1:XPCk9hzP06PoWIxDPVU3gAy0m1XmLaZHTzLggNx/U9k= +github.com/duckdb/duckdb-go-bindings v0.1.16/go.mod h1:pBnfviMzANT/9hi4bg+zW4ykRZZPCXlVuvBWEcZofkc= +github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11 h1:GXQkG4HmEbwPtqCSabJTp9wZQQ7Gqr3KveLNesQWQOs= +github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11/go.mod h1:Ezo7IbAfB8NP7CqPIN8XEHKUg5xdRRQhcPPlCXImXYA= +github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11 h1:ATJMSBIDA/YAm/6CKeBDRtGK1OOwqfTZbWg9Y5fAc9E= +github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11/go.mod h1:eS7m/mLnPQgVF4za1+xTyorKRBuK0/BA44Oy6DgrGXI= +github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11 h1:AjvnGst1avyOECYiykthyHR4DTYTaqNDPr5W/0t5j0k= +github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11/go.mod h1:1GOuk1PixiESxLaCGFhag+oFi7aP+9W8byymRAvunBk= +github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11 h1:j3B1biawuhtxe2Chkiqcwf1Kxe8VJc8lLVmjBIcJrkI= +github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11/go.mod h1:o7crKMpT2eOIi5/FY6HPqaXcvieeLSqdXXaXbruGX7w= +github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11 h1:xR3vRE8y+48U6xDNkUlOfbl7/OTA7FVcDXJ+5vETuHU= +github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11/go.mod h1:IlOhJdVKUJCAPj3QsDszUo8DVdvp1nBFp4TUJVdw99s= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +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/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= +github.com/gin-gonic/gin v1.7.3/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= +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-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +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-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= +github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-viper/mapstructure/v2 v2.3.0 h1:27XbWsHIqhbdR5TIC911OfYvgSaW93HM+dX7970Q7jk= +github.com/go-viper/mapstructure/v2 v2.3.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= +github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= +github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-jwt/jwt/v4 v4.4.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188/go.mod h1:vXjM/+wXQnTPR4KqTKDgJukSZ6amVRtWMPEjE6sQoK8= +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/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/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +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.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= +github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +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/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/flatbuffers v25.2.10+incompatible h1:F3vclr7C3HpB1k9mxCGRMXq6FdUalZ6H/pNX4FP1v0Q= +github.com/google/flatbuffers v25.2.10+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +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.6/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.8/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/go-replayers/grpcreplay v1.1.0/go.mod h1:qzAvJ8/wi57zq7gWqaE6AwLM6miiXUQwP1S+I9icmhk= +github.com/google/go-replayers/httpreplay v1.1.1/go.mod h1:gN9GeLIs7l6NUoVaSSnv2RiqK1NiwAmD0MrKeC9IIks= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+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/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +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-20200905233945-acf8798be1f7/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-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210506205249-923b5ab0fc1a/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.2.0/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.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/wire v0.5.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU= +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.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/hanwen/go-fuse v1.0.0/go.mod h1:unqXarDXqzAk0rt98O2tVndEPIpUgLD9+rwFisZH3Ok= +github.com/hanwen/go-fuse/v2 v2.1.0/go.mod h1:oRyA5eK+pvJyv5otpO/DgccS8y/RvYMaO00GgRLGryc= +github.com/hashicorp/go-uuid v0.0.0-20180228145832-27454136f036/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +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/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/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.11.0/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= +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/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.2.0/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-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/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.10.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.15.0/go.mod h1:D/zyOyXiaM1TmVWnOM18p0xdDtdakRBa0RsVGI3U3bw= +github.com/jackc/pgx/v5 v5.7.5 h1:JHGfMnQY+IEtGM63d+NGMjoRpysB2JBwDr5fsngwmJs= +github.com/jackc/pgx/v5 v5.7.5/go.mod h1:aruU7o91Tc2q2cFp5h4uP3f6ztExVpyVv88Xl/8Vl8M= +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.2.1 h1:gI8os0wpRXFd4FiAY2dWiqRK037tjj3t7rKFeO4X5iw= +github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= +github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/jcmturner/gofork v0.0.0-20180107083740-2aebee971930/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= +github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +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/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= +github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= +github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.13.1/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/klauspost/cpuid/v2 v2.2.11 h1:0OwqZRYI2rFrjS4kvkDnqJkKHdHaRnCm68/DY4OxRzU= +github.com/klauspost/cpuid/v2 v2.2.11/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= +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/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +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/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +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.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/linkedin/goavro v2.1.0+incompatible h1:DV2aUlj2xZiuxQyvag8Dy7zjY69ENjS66bWkSfdpddY= +github.com/linkedin/goavro v2.1.0+incompatible/go.mod h1:bBCwI2eGYpUI/4820s67MElg9tdeLbINjLjiM2xZFYM= +github.com/marcboeker/go-duckdb/arrowmapping v0.0.9 h1:xj+kFOqR2gH3Mcxx9LmAVHebSnCiPm303N+uxfkWVmY= +github.com/marcboeker/go-duckdb/arrowmapping v0.0.9/go.mod h1:o56AqVS90v5bpxhPnOK9La7AfNTOrMORiqTQrlRbdPQ= +github.com/marcboeker/go-duckdb/mapping v0.0.10 h1:b/y2W8/hNlD0Dwjq0mCqIlLXpjQMnWy0WqDV9b9lHQQ= +github.com/marcboeker/go-duckdb/mapping v0.0.10/go.mod h1:Ro6Tw6sGG50O8S0daZsA8TrQJz/DvGrzGvMD7Jihirw= +github.com/marcboeker/go-duckdb/v2 v2.3.2 h1:96zG2JPyIhCFjHdBjjSpOdhzJzehoGTdl7LskkuMUTs= +github.com/marcboeker/go-duckdb/v2 v2.3.2/go.mod h1:VeXz9ZM6klNvICHrXEUzaHSgNqBeTdyMxr4CICw/UaY= +github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= +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.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= +github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= +github.com/minio/minio-go/v7 v7.0.34/go.mod h1:nCrRzjoSUQh8hgKKtu3Y708OLvRLtuASMg2/nvmbarw= +github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= +github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/ncw/swift v1.0.52/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= +github.com/pborman/getopt v0.0.0-20180729010549-6fdd0a2c7117/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= +github.com/pierrec/lz4/v4 v4.1.8/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= +github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= +github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +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/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +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/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.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +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/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +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.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +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.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/xitongsys/parquet-go v1.5.1/go.mod h1:xUxwM8ELydxh4edHGegYq1pA8NnMKDx0K/GyB0o2bww= +github.com/xitongsys/parquet-go v1.6.2 h1:MhCaXii4eqceKPu9BwrjLqyK10oX9WF+xGhwvwbw7xM= +github.com/xitongsys/parquet-go v1.6.2/go.mod h1:IulAQyalCm0rPiZVNnCgm/PCL64X2tdSVGMQ/UeKqWA= +github.com/xitongsys/parquet-go-source v0.0.0-20190524061010-2b72cbee77d5/go.mod h1:xxCx7Wpym/3QCo6JhujJX51dzSXrwmb0oH6FQb39SEA= +github.com/xitongsys/parquet-go-source v0.0.0-20200817004010-026bad9b25d0/go.mod h1:HYhIKsdns7xz80OgkbgJYrtQY7FjHWHKH6cvN7+czGE= +github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b h1:zbb5qM/t3N+O33Vp5sFyG6yIcWZV1q7rfEjJM8UsRBQ= +github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b/go.mod h1:2ActxmJ4q17Cdruar9nKEkzKSOL1Ol03737Bkz10rTY= +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.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= +github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= +github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= +github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= +go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0= +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.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +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/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +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.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= +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.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= +gocloud.dev v0.26.0/go.mod h1:mkUgejbnbLotorqDyvedJO20XcZNTynmSeVSQS9btVg= +golang.org/x/crypto v0.0.0-20180723164146-c126467f60eb/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +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-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/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-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-20211115234514-b4de73f9ece8/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220511200225-c6db032c6c88/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= +golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= +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-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +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/lint v0.0.0-20210508222113-6edffad5e616/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.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w= +golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= +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-20191112182307-2180aed22343/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-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +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-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211020060615-d418f374d309/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220401154927-543a649e0bdd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +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.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +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.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +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-20210220032951-036812b2e83c/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.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= +golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +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-20191112214154-59a1497f0cea/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-20200828194041-157a740278f4/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-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/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-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/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-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220204135822-1c1b9b1eba6a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220330033206-e17cdc41300f/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-20220704084225-05e143d24a9e/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.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= +golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +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/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +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.5/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.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= +golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= +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/time v0.0.0-20211116232009-f0f3c7e86c11/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220224211638-0e9765cccd65/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-20190422233926-fe54fb35175b/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-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-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-20200828161849-5deb26317202/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20200915173823-2db8f0ff891c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20200918232735-d647fc253266/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +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.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo= +golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg= +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= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +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.31.0/go.mod h1:CL+9IBCa2WWU6gRuBWaKqGWLFFwbEUXkfeMkHLQWYWo= +google.golang.org/api v0.32.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +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.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.46.0/go.mod h1:ceL4oozhkAiTID8XMmJBsIxID/9wMXJVVFXPg4ylg3I= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.58.0/go.mod h1:cAbP2FsxoGVNwtgNAmmn3y5G1TWAiVYRmg4yku3lv+E= +google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.64.0/go.mod h1:931CdxA8Rm4t6zqTFGSsgwbAEZ2+GMYurbndwSimebM= +google.golang.org/api v0.66.0/go.mod h1:I1dmXYpX7HGwz/ejRxwQp2qj5bFAz93HiCU1C1oYd9M= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.68.0/go.mod h1:sOM8pTpwgflXRhz+oC8H2Dr+UcbMqkPPWNJo88Q7TH8= +google.golang.org/api v0.69.0/go.mod h1:boanBiw+h5c3s+tBPgEzLDRHfFLWV0qXxRHz3ws7C80= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= +google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +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/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-20200513103714-09dca8ec2884/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-20200831141814-d751682dd103/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-20200914193844-75d14daec038/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200921151605-7abf4a1a14d5/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-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210429181445-86c259c2b4ab/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210517163617-5e0236093d7a/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210921142501-181ce0d877f6/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211018162055-cf77aa76bad2/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211223182754-3ac035c7e7cb/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220111164026-67b88f271998/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220114231437-d2e6a121cae0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220201184016-50beb8ab5c44/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220204002441-d6cc3cc0770e/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220211171837-173942840c17/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220216160803-4663080d8bc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220401170504-314d38edb7de/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +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.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +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.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +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.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +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-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= +gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= +gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q= +gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mNfM5bm88whjWx4= +gopkg.in/jcmturner/gokrb5.v7 v7.3.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= +gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8= +gopkg.in/linkedin/goavro.v1 v1.0.5 h1:BJa69CDh0awSsLUmZ9+BowBdokpduDZSM9Zk8oKHfN4= +gopkg.in/linkedin/goavro.v1 v1.0.5/go.mod h1:Aw5GdAbizjOEl0kAMHV9iHmA8reZzW/OKuJAl4Hb9F0= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/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/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= +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= +nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= +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/src/syncer-attio/main.go b/src/syncer-attio/main.go new file mode 100644 index 0000000..175e944 --- /dev/null +++ b/src/syncer-attio/main.go @@ -0,0 +1,13 @@ +package main + +import ( + "github.com/BemiHQ/BemiDB/src/common" +) + +func main() { + config := LoadConfig() + defer common.HandleUnexpectedPanic(config.CommonConfig) + + syncer := NewSyncer(config) + syncer.Sync() +} diff --git a/src/syncer-attio/parser.go b/src/syncer-attio/parser.go new file mode 100644 index 0000000..f20971e --- /dev/null +++ b/src/syncer-attio/parser.go @@ -0,0 +1,193 @@ +package main + +import ( + "strings" +) + +type Value struct { + Value interface{} `json:"value"` +} +type DomainValue struct { + Value string `json:"domain"` +} +type RelationshipValue struct { + Value string `json:"target_record_id"` +} +type SelectValue struct { + Option struct { + Value string `json:"title"` + } `json:"option"` +} +type CurrencyValue struct { + Value float64 `json:"currency_value"` +} +type InteractionValue struct { + Value string `json:"interacted_at"` +} +type UserValue struct { + Value string `json:"referenced_actor_id"` +} +type StatusValue struct { + Status struct { + Value string `json:"title"` + } `json:"status"` +} +type PhoneNumberValue struct { + Value string `json:"phone_number"` +} +type EmailValue struct { + Value string `json:"email_address"` +} +type NameValue struct { + Value string `json:"full_name"` +} + +type LocationValue struct { + Line1 string `json:"line_1"` + Line2 string `json:"line_2"` + Line3 string `json:"line_3"` + Line4 string `json:"line_4"` + Locality string `json:"locality"` + Region string `json:"region"` + Postcode string `json:"postcode"` + Country string `json:"country_code"` +} + +type Parser struct { + Config *Config +} + +func NewParser(config *Config) *Parser { + return &Parser{ + Config: config, + } +} + +func (parser *Parser) FirstValue(values []Value) interface{} { + if len(values) > 0 { + return values[0].Value + } + return nil +} + +func (parser *Parser) FirstCurrencyValue(values []CurrencyValue) interface{} { + if len(values) > 0 { + return values[0].Value + } + return nil +} + +func (parser *Parser) FirstInteractionValue(values []InteractionValue) interface{} { + if len(values) > 0 { + return values[0].Value + } + return nil +} + +func (parser *Parser) FirstUserValue(values []UserValue) interface{} { + if len(values) > 0 { + return values[0].Value + } + return nil +} + +func (parser *Parser) FirstSelectValue(values []SelectValue) interface{} { + if len(values) > 0 { + return values[0].Option.Value + } + return nil +} + +func (parser *Parser) FirstStatusValue(values []StatusValue) interface{} { + if len(values) > 0 { + return values[0].Status.Value + } + return nil +} + +func (parser *Parser) FirstRelationshipId(values []RelationshipValue) interface{} { + if len(values) > 0 { + return values[0].Value + } + return nil +} + +func (parser *Parser) FirstNameValue(values []NameValue) interface{} { + if len(values) > 0 { + return values[0].Value + } + return nil +} + +func (parser *Parser) FirstLocationValue(values []LocationValue) interface{} { + if len(values) > 0 { + location := values[0] + parts := []string{} + if location.Line1 != "" { + parts = append(parts, location.Line1) + } + if location.Line2 != "" { + parts = append(parts, location.Line2) + } + if location.Line3 != "" { + parts = append(parts, location.Line3) + } + if location.Line4 != "" { + parts = append(parts, location.Line4) + } + if location.Locality != "" { + parts = append(parts, location.Locality) + } + if location.Region != "" { + parts = append(parts, location.Region) + } + if location.Postcode != "" { + parts = append(parts, location.Postcode) + } + if location.Country != "" { + parts = append(parts, location.Country) + } + return strings.Join(parts, ", ") + } + return nil +} + +func (parser *Parser) AllDomainValues(values []DomainValue) []string { + domains := []string{} + for _, value := range values { + domains = append(domains, value.Value) + } + return domains +} + +func (parser *Parser) AllRelationshipIds(values []RelationshipValue) []string { + ids := []string{} + for _, value := range values { + ids = append(ids, value.Value) + } + return ids +} + +func (parser *Parser) AllSelectValues(values []SelectValue) []string { + options := []string{} + for _, value := range values { + options = append(options, value.Option.Value) + } + return options +} + +func (parser *Parser) AllEmailValues(values []EmailValue) []string { + emails := []string{} + for _, value := range values { + emails = append(emails, value.Value) + } + return emails +} + +func (parser *Parser) AllPhoneNumberValues(values []PhoneNumberValue) []string { + phones := []string{} + for _, value := range values { + phones = append(phones, value.Value) + } + return phones +} diff --git a/src/syncer-attio/record_company.go b/src/syncer-attio/record_company.go new file mode 100644 index 0000000..0024c99 --- /dev/null +++ b/src/syncer-attio/record_company.go @@ -0,0 +1,121 @@ +package main + +import ( + "github.com/BemiHQ/BemiDB/src/common" +) + +type RecordCompany struct { + Values struct { + Id []Value `json:"record_id"` + Name []Value `json:"name"` + Description []Value `json:"description"` + Domains []DomainValue `json:"domains"` + Team []RelationshipValue `json:"team"` + Categories []SelectValue `json:"categories"` + PrimaryLocation []LocationValue `json:"primary_location"` + LogoUrl []Value `json:"logo_url"` + Angellist []Value `json:"angellist"` + Facebook []Value `json:"facebook"` + Instagram []Value `json:"instagram"` + Linkedin []Value `json:"linkedin"` + Twitter []Value `json:"twitter"` + TwitterFollowerCount []Value `json:"twitter_follower_count"` + EstimatedArrUsd []SelectValue `json:"estimated_arr_usd"` + FundingRaisedUsd []CurrencyValue `json:"funding_raised_usd"` + FoundationDate []Value `json:"foundation_date"` + EmployeeRange []SelectValue `json:"employee_range"` + FirstCalendarInteraction []InteractionValue `json:"first_calendar_interaction"` + LastCalendarInteraction []InteractionValue `json:"last_calendar_interaction"` + NextCalendarInteraction []InteractionValue `json:"next_calendar_interaction"` + FirstEmailInteraction []InteractionValue `json:"first_email_interaction"` + LastEmailInteraction []InteractionValue `json:"last_email_interaction"` + FirstInteraction []InteractionValue `json:"first_interaction"` + LastInteraction []InteractionValue `json:"last_interaction"` + NextInteraction []InteractionValue `json:"next_interaction"` + StrongestConnectionStrengthLegacy []Value `json:"strongest_connection_strength_legacy"` + StrongestConnectionStrength []SelectValue `json:"strongest_connection_strength"` + StrongestConnectionUser []UserValue `json:"strongest_connection_user"` + AssociatedDeals []RelationshipValue `json:"associated_deals"` + AssociatedWorkspaces []RelationshipValue `json:"associated_workspaces"` + CreatedAt []Value `json:"created_at"` + CreatedBy []UserValue `json:"created_by"` + } `json:"values"` +} + +func (record *RecordCompany) ToMap(parser *Parser) map[string]interface{} { + result := make(map[string]interface{}) + + result["id"] = parser.FirstValue(record.Values.Id) + result["name"] = parser.FirstValue(record.Values.Name) + result["description"] = parser.FirstValue(record.Values.Description) + result["domains"] = parser.AllDomainValues(record.Values.Domains) + result["team"] = parser.AllRelationshipIds(record.Values.Team) + result["categories"] = parser.AllSelectValues(record.Values.Categories) + result["primary_location"] = parser.FirstLocationValue(record.Values.PrimaryLocation) + result["logo_url"] = parser.FirstValue(record.Values.LogoUrl) + result["angellist"] = parser.FirstValue(record.Values.Angellist) + result["facebook"] = parser.FirstValue(record.Values.Facebook) + result["instagram"] = parser.FirstValue(record.Values.Instagram) + result["linkedin"] = parser.FirstValue(record.Values.Linkedin) + result["twitter"] = parser.FirstValue(record.Values.Twitter) + result["twitter_follower_count"] = parser.FirstValue(record.Values.TwitterFollowerCount) + result["estimated_arr_usd"] = parser.FirstSelectValue(record.Values.EstimatedArrUsd) + result["funding_raised_usd"] = parser.FirstCurrencyValue(record.Values.FundingRaisedUsd) + result["foundation_date"] = parser.FirstValue(record.Values.FoundationDate) + result["employee_range"] = parser.FirstSelectValue(record.Values.EmployeeRange) + result["first_calendar_interaction"] = parser.FirstInteractionValue(record.Values.FirstCalendarInteraction) + result["last_calendar_interaction"] = parser.FirstInteractionValue(record.Values.LastCalendarInteraction) + result["next_calendar_interaction"] = parser.FirstInteractionValue(record.Values.NextCalendarInteraction) + result["first_email_interaction"] = parser.FirstInteractionValue(record.Values.FirstEmailInteraction) + result["last_email_interaction"] = parser.FirstInteractionValue(record.Values.LastEmailInteraction) + result["first_interaction"] = parser.FirstInteractionValue(record.Values.FirstInteraction) + result["last_interaction"] = parser.FirstInteractionValue(record.Values.LastInteraction) + result["next_interaction"] = parser.FirstInteractionValue(record.Values.NextInteraction) + result["strongest_connection_strength_legacy"] = parser.FirstValue(record.Values.StrongestConnectionStrengthLegacy) + result["strongest_connection_strength"] = parser.FirstSelectValue(record.Values.StrongestConnectionStrength) + result["strongest_connection_user"] = parser.FirstUserValue(record.Values.StrongestConnectionUser) + result["associated_deals"] = parser.AllRelationshipIds(record.Values.AssociatedDeals) + result["associated_workspaces"] = parser.AllRelationshipIds(record.Values.AssociatedWorkspaces) + result["created_at"] = parser.FirstValue(record.Values.CreatedAt) + result["created_by"] = parser.FirstUserValue(record.Values.CreatedBy) + + return result +} + +func CompaniesIcebergSchemaColumns(config *common.CommonConfig) []*common.IcebergSchemaColumn { + return []*common.IcebergSchemaColumn{ + {Config: config, ColumnName: "id", ColumnType: common.IcebergColumnTypeString, Position: 1}, + {Config: config, ColumnName: "name", ColumnType: common.IcebergColumnTypeString, Position: 2}, + {Config: config, ColumnName: "description", ColumnType: common.IcebergColumnTypeString, Position: 3}, + {Config: config, ColumnName: "domains", ColumnType: common.IcebergColumnTypeString, IsList: true, Position: 4}, + {Config: config, ColumnName: "team", ColumnType: common.IcebergColumnTypeString, IsList: true, Position: 5}, + {Config: config, ColumnName: "categories", ColumnType: common.IcebergColumnTypeString, IsList: true, Position: 6}, + {Config: config, ColumnName: "primary_location", ColumnType: common.IcebergColumnTypeString, Position: 7}, + {Config: config, ColumnName: "logo_url", ColumnType: common.IcebergColumnTypeString, Position: 8}, + {Config: config, ColumnName: "angellist", ColumnType: common.IcebergColumnTypeString, Position: 9}, + {Config: config, ColumnName: "facebook", ColumnType: common.IcebergColumnTypeString, Position: 10}, + {Config: config, ColumnName: "instagram", ColumnType: common.IcebergColumnTypeString, Position: 11}, + {Config: config, ColumnName: "linkedin", ColumnType: common.IcebergColumnTypeString, Position: 12}, + {Config: config, ColumnName: "twitter", ColumnType: common.IcebergColumnTypeString, Position: 13}, + {Config: config, ColumnName: "twitter_follower_count", ColumnType: common.IcebergColumnTypeInteger, Position: 14}, + {Config: config, ColumnName: "estimated_arr_usd", ColumnType: common.IcebergColumnTypeString, Position: 15}, + {Config: config, ColumnName: "funding_raised_usd", ColumnType: common.IcebergColumnTypeFloat, Position: 16}, + {Config: config, ColumnName: "foundation_date", ColumnType: common.IcebergColumnTypeDate, Position: 17}, + {Config: config, ColumnName: "employee_range", ColumnType: common.IcebergColumnTypeString, Position: 18}, + {Config: config, ColumnName: "first_calendar_interaction", ColumnType: common.IcebergColumnTypeTimestamp, Position: 19}, + {Config: config, ColumnName: "last_calendar_interaction", ColumnType: common.IcebergColumnTypeTimestamp, Position: 20}, + {Config: config, ColumnName: "next_calendar_interaction", ColumnType: common.IcebergColumnTypeTimestamp, Position: 21}, + {Config: config, ColumnName: "first_email_interaction", ColumnType: common.IcebergColumnTypeTimestamp, Position: 22}, + {Config: config, ColumnName: "last_email_interaction", ColumnType: common.IcebergColumnTypeTimestamp, Position: 23}, + {Config: config, ColumnName: "first_interaction", ColumnType: common.IcebergColumnTypeTimestamp, Position: 24}, + {Config: config, ColumnName: "last_interaction", ColumnType: common.IcebergColumnTypeTimestamp, Position: 25}, + {Config: config, ColumnName: "next_interaction", ColumnType: common.IcebergColumnTypeTimestamp, Position: 26}, + {Config: config, ColumnName: "strongest_connection_strength_legacy", ColumnType: common.IcebergColumnTypeInteger, Position: 27}, + {Config: config, ColumnName: "strongest_connection_strength", ColumnType: common.IcebergColumnTypeString, Position: 28}, + {Config: config, ColumnName: "strongest_connection_user", ColumnType: common.IcebergColumnTypeString, Position: 29}, + {Config: config, ColumnName: "associated_deals", ColumnType: common.IcebergColumnTypeString, IsList: true, Position: 30}, + {Config: config, ColumnName: "associated_workspaces", ColumnType: common.IcebergColumnTypeString, IsList: true, Position: 31}, + {Config: config, ColumnName: "created_at", ColumnType: common.IcebergColumnTypeTimestamp, Position: 32}, + {Config: config, ColumnName: "created_by", ColumnType: common.IcebergColumnTypeString, Position: 33}, + } +} diff --git a/src/syncer-attio/record_deal.go b/src/syncer-attio/record_deal.go new file mode 100644 index 0000000..2f793de --- /dev/null +++ b/src/syncer-attio/record_deal.go @@ -0,0 +1,49 @@ +package main + +import ( + "github.com/BemiHQ/BemiDB/src/common" +) + +type RecordDeal struct { + Values struct { + Id []Value `json:"record_id"` + Name []Value `json:"name"` + Stage []StatusValue `json:"stage"` + Owner []UserValue `json:"owner"` + Value []CurrencyValue `json:"value"` + AssociatedPeople []RelationshipValue `json:"associated_people"` + AssociatedCompany []RelationshipValue `json:"associated_company"` + CreatedAt []Value `json:"created_at"` + CreatedBy []UserValue `json:"created_by"` + } `json:"values"` +} + +func (record *RecordDeal) ToMap(parser *Parser) map[string]interface{} { + result := make(map[string]interface{}) + + result["id"] = parser.FirstValue(record.Values.Id) + result["name"] = parser.FirstValue(record.Values.Name) + result["stage"] = parser.FirstStatusValue(record.Values.Stage) + result["owner"] = parser.FirstUserValue(record.Values.Owner) + result["value"] = parser.FirstCurrencyValue(record.Values.Value) + result["associated_people"] = parser.AllRelationshipIds(record.Values.AssociatedPeople) + result["associated_company"] = parser.FirstRelationshipId(record.Values.AssociatedCompany) + result["created_at"] = parser.FirstValue(record.Values.CreatedAt) + result["created_by"] = parser.FirstUserValue(record.Values.CreatedBy) + + return result +} + +func DealsIcebergSchemaColumns(config *common.CommonConfig) []*common.IcebergSchemaColumn { + return []*common.IcebergSchemaColumn{ + {Config: config, ColumnName: "id", ColumnType: common.IcebergColumnTypeString, Position: 1}, + {Config: config, ColumnName: "name", ColumnType: common.IcebergColumnTypeString, Position: 2}, + {Config: config, ColumnName: "stage", ColumnType: common.IcebergColumnTypeString, Position: 3}, + {Config: config, ColumnName: "owner", ColumnType: common.IcebergColumnTypeString, Position: 4}, + {Config: config, ColumnName: "value", ColumnType: common.IcebergColumnTypeFloat, Position: 5}, + {Config: config, ColumnName: "associated_people", ColumnType: common.IcebergColumnTypeString, IsList: true, Position: 6}, + {Config: config, ColumnName: "associated_company", ColumnType: common.IcebergColumnTypeString, Position: 7}, + {Config: config, ColumnName: "created_at", ColumnType: common.IcebergColumnTypeTimestamp, Position: 8}, + {Config: config, ColumnName: "created_by", ColumnType: common.IcebergColumnTypeString, Position: 9}, + } +} diff --git a/src/syncer-attio/record_person.go b/src/syncer-attio/record_person.go new file mode 100644 index 0000000..b6640b2 --- /dev/null +++ b/src/syncer-attio/record_person.go @@ -0,0 +1,112 @@ +package main + +import ( + "github.com/BemiHQ/BemiDB/src/common" +) + +type RecordPerson struct { + Values struct { + Id []Value `json:"record_id"` + Name []NameValue `json:"name"` + Description []Value `json:"description"` + EmailAddresses []EmailValue `json:"email_addresses"` + Company []RelationshipValue `json:"company"` + JobTitle []Value `json:"job_title"` + AvatarUrl []Value `json:"avatar_url"` + PhoneNumbers []PhoneNumberValue `json:"phone_numbers"` + PrimaryLocation []LocationValue `json:"primary_location"` + Angellist []Value `json:"angellist"` + Facebook []Value `json:"facebook"` + Instagram []Value `json:"instagram"` + Linkedin []Value `json:"linkedin"` + Twitter []Value `json:"twitter"` + TwitterFollowerCount []Value `json:"twitter_follower_count"` + FirstCalendarInteraction []InteractionValue `json:"first_calendar_interaction"` + LastCalendarInteraction []InteractionValue `json:"last_calendar_interaction"` + NextCalendarInteraction []InteractionValue `json:"next_calendar_interaction"` + FirstEmailInteraction []InteractionValue `json:"first_email_interaction"` + LastEmailInteraction []InteractionValue `json:"last_email_interaction"` + FirstInteraction []InteractionValue `json:"first_interaction"` + LastInteraction []InteractionValue `json:"last_interaction"` + NextInteraction []InteractionValue `json:"next_interaction"` + StrongestConnectionStrengthLegacy []Value `json:"strongest_connection_strength_legacy"` + StrongestConnectionStrength []SelectValue `json:"strongest_connection_strength"` + StrongestConnectionUser []UserValue `json:"strongest_connection_user"` + AssociatedDeals []RelationshipValue `json:"associated_deals"` + AssociatedUsers []RelationshipValue `json:"associated_users"` + CreatedAt []Value `json:"created_at"` + CreatedBy []UserValue `json:"created_by"` + } `json:"values"` +} + +func (record *RecordPerson) ToMap(parser *Parser) map[string]interface{} { + result := make(map[string]interface{}) + + result["id"] = parser.FirstValue(record.Values.Id) + result["name"] = parser.FirstNameValue(record.Values.Name) + result["description"] = parser.FirstValue(record.Values.Description) + result["email_addresses"] = parser.AllEmailValues(record.Values.EmailAddresses) + result["company"] = parser.FirstRelationshipId(record.Values.Company) + result["job_title"] = parser.FirstValue(record.Values.JobTitle) + result["avatar_url"] = parser.FirstValue(record.Values.AvatarUrl) + result["phone_numbers"] = parser.AllPhoneNumberValues(record.Values.PhoneNumbers) + result["primary_location"] = parser.FirstLocationValue(record.Values.PrimaryLocation) + result["angellist"] = parser.FirstValue(record.Values.Angellist) + result["facebook"] = parser.FirstValue(record.Values.Facebook) + result["instagram"] = parser.FirstValue(record.Values.Instagram) + result["linkedin"] = parser.FirstValue(record.Values.Linkedin) + result["twitter"] = parser.FirstValue(record.Values.Twitter) + result["twitter_follower_count"] = parser.FirstValue(record.Values.TwitterFollowerCount) + result["first_calendar_interaction"] = parser.FirstInteractionValue(record.Values.FirstCalendarInteraction) + result["last_calendar_interaction"] = parser.FirstInteractionValue(record.Values.LastCalendarInteraction) + result["next_calendar_interaction"] = parser.FirstInteractionValue(record.Values.NextCalendarInteraction) + result["first_email_interaction"] = parser.FirstInteractionValue(record.Values.FirstEmailInteraction) + result["last_email_interaction"] = parser.FirstInteractionValue(record.Values.LastEmailInteraction) + result["first_interaction"] = parser.FirstInteractionValue(record.Values.FirstInteraction) + result["last_interaction"] = parser.FirstInteractionValue(record.Values.LastInteraction) + result["next_interaction"] = parser.FirstInteractionValue(record.Values.NextInteraction) + result["strongest_connection_strength_legacy"] = parser.FirstValue(record.Values.StrongestConnectionStrengthLegacy) + result["strongest_connection_strength"] = parser.FirstSelectValue(record.Values.StrongestConnectionStrength) + result["strongest_connection_user"] = parser.FirstUserValue(record.Values.StrongestConnectionUser) + result["associated_deals"] = parser.AllRelationshipIds(record.Values.AssociatedDeals) + result["associated_users"] = parser.AllRelationshipIds(record.Values.AssociatedUsers) + result["created_at"] = parser.FirstValue(record.Values.CreatedAt) + result["created_by"] = parser.FirstUserValue(record.Values.CreatedBy) + + return result +} + +func PeopleIcebergSchemaColumns(config *common.CommonConfig) []*common.IcebergSchemaColumn { + return []*common.IcebergSchemaColumn{ + {Config: config, ColumnName: "id", ColumnType: common.IcebergColumnTypeString, Position: 1}, + {Config: config, ColumnName: "name", ColumnType: common.IcebergColumnTypeString, Position: 2}, + {Config: config, ColumnName: "description", ColumnType: common.IcebergColumnTypeString, Position: 3}, + {Config: config, ColumnName: "email_addresses", ColumnType: common.IcebergColumnTypeString, IsList: true, Position: 4}, + {Config: config, ColumnName: "company", ColumnType: common.IcebergColumnTypeString, Position: 5}, + {Config: config, ColumnName: "job_title", ColumnType: common.IcebergColumnTypeString, Position: 6}, + {Config: config, ColumnName: "avatar_url", ColumnType: common.IcebergColumnTypeString, Position: 7}, + {Config: config, ColumnName: "phone_numbers", ColumnType: common.IcebergColumnTypeString, IsList: true, Position: 8}, + {Config: config, ColumnName: "primary_location", ColumnType: common.IcebergColumnTypeString, Position: 9}, + {Config: config, ColumnName: "angellist", ColumnType: common.IcebergColumnTypeString, Position: 10}, + {Config: config, ColumnName: "facebook", ColumnType: common.IcebergColumnTypeString, Position: 11}, + {Config: config, ColumnName: "instagram", ColumnType: common.IcebergColumnTypeString, Position: 12}, + {Config: config, ColumnName: "linkedin", ColumnType: common.IcebergColumnTypeString, Position: 13}, + {Config: config, ColumnName: "twitter", ColumnType: common.IcebergColumnTypeString, Position: 14}, + {Config: config, ColumnName: "twitter_follower_count", ColumnType: common.IcebergColumnTypeInteger, Position: 15}, + {Config: config, ColumnName: "first_calendar_interaction", ColumnType: common.IcebergColumnTypeTimestamp, Position: 16}, + {Config: config, ColumnName: "last_calendar_interaction", ColumnType: common.IcebergColumnTypeTimestamp, Position: 17}, + {Config: config, ColumnName: "next_calendar_interaction", ColumnType: common.IcebergColumnTypeTimestamp, Position: 18}, + {Config: config, ColumnName: "first_email_interaction", ColumnType: common.IcebergColumnTypeTimestamp, Position: 19}, + {Config: config, ColumnName: "last_email_interaction", ColumnType: common.IcebergColumnTypeTimestamp, Position: 20}, + {Config: config, ColumnName: "first_interaction", ColumnType: common.IcebergColumnTypeTimestamp, Position: 21}, + {Config: config, ColumnName: "last_interaction", ColumnType: common.IcebergColumnTypeTimestamp, Position: 22}, + {Config: config, ColumnName: "next_interaction", ColumnType: common.IcebergColumnTypeTimestamp, Position: 23}, + {Config: config, ColumnName: "strongest_connection_strength_legacy", ColumnType: common.IcebergColumnTypeInteger, Position: 24}, + {Config: config, ColumnName: "strongest_connection_strength", ColumnType: common.IcebergColumnTypeString, Position: 25}, + {Config: config, ColumnName: "strongest_connection_user", ColumnType: common.IcebergColumnTypeString, Position: 26}, + {Config: config, ColumnName: "associated_deals", ColumnType: common.IcebergColumnTypeString, IsList: true, Position: 27}, + {Config: config, ColumnName: "associated_users", ColumnType: common.IcebergColumnTypeString, IsList: true, Position: 28}, + {Config: config, ColumnName: "created_at", ColumnType: common.IcebergColumnTypeTimestamp, Position: 29}, + {Config: config, ColumnName: "created_by", ColumnType: common.IcebergColumnTypeString, Position: 30}, + } +} diff --git a/src/syncer-attio/syncer.go b/src/syncer-attio/syncer.go new file mode 100644 index 0000000..033a2b5 --- /dev/null +++ b/src/syncer-attio/syncer.go @@ -0,0 +1,73 @@ +package main + +import ( + "github.com/BemiHQ/BemiDB/src/common" +) + +const ( + COMPRESSION_FACTOR = 2 // 1 GB uncompressed data x 2 = ~90MB compressed data +) + +type Syncer struct { + Config *Config + Attio *Attio + StorageS3 *common.StorageS3 + DuckdbClient *common.DuckdbClient +} + +func NewSyncer(config *Config) *Syncer { + storageS3 := common.NewStorageS3(config.CommonConfig) + duckdbClient := common.NewDuckdbClient(config.CommonConfig, common.SYNCER_DUCKDB_BOOT_QUERIES) + + return &Syncer{ + Config: config, + Attio: NewAttio(config), + StorageS3: storageS3, + DuckdbClient: duckdbClient, + } +} + +func (syncer *Syncer) Sync() { + common.SendAnonymousAnalytics(syncer.Config.CommonConfig, "syncer-attio-start", syncer.name()) + + for _, object := range []string{ATTIO_OBJECT_COMPANIES, ATTIO_OBJECT_DEALS, ATTIO_OBJECT_PEOPLE} { + cappedBuffer := common.NewCappedBuffer(syncer.Config.CommonConfig, common.DEFAULT_CAPPED_BUFFER_SIZE) + jsonQueueWriter := common.NewJsonQueueWriter(cappedBuffer) + + // Copy from Attio to cappedBuffer in a separate goroutine in parallel + go func() { + err := syncer.Attio.Load(object, jsonQueueWriter) + common.PanicIfError(syncer.Config.CommonConfig, err) + + common.LogInfo(syncer.Config.CommonConfig, "Finished exporting data from Attio.") + jsonQueueWriter.Close() + }() + + icebergSchemaTable := common.IcebergSchemaTable{Schema: syncer.Config.DestinationSchemaName, Table: object} + icebergTable := common.NewIcebergTable(syncer.Config.CommonConfig, syncer.StorageS3, syncer.DuckdbClient, icebergSchemaTable) + icebergTable.ReplaceWith(func(syncingIcebergTable *common.IcebergTable) { + var icebergSchemaColumns []*common.IcebergSchemaColumn + + switch object { + case ATTIO_OBJECT_COMPANIES: + icebergSchemaColumns = CompaniesIcebergSchemaColumns(syncer.Config.CommonConfig) + case ATTIO_OBJECT_DEALS: + icebergSchemaColumns = DealsIcebergSchemaColumns(syncer.Config.CommonConfig) + case ATTIO_OBJECT_PEOPLE: + icebergSchemaColumns = PeopleIcebergSchemaColumns(syncer.Config.CommonConfig) + default: + common.Panic(syncer.Config.CommonConfig, "Unknown object: "+object) + } + + // Read from cappedBuffer and write to Iceberg + icebergTableWriter := common.NewIcebergTableWriter(syncer.Config.CommonConfig, syncer.StorageS3, syncer.DuckdbClient, syncingIcebergTable, icebergSchemaColumns, 1) + icebergTableWriter.InsertFromJsonCappedBuffer(cappedBuffer) + }) + + common.SendAnonymousAnalytics(syncer.Config.CommonConfig, "syncer-attio-finish", syncer.name()) + } +} + +func (syncer *Syncer) name() string { + return syncer.Config.ApiAccessToken[:5] + "..." +} diff --git a/src/syncer-postgres/init_test.go b/src/syncer-postgres/init_test.go index fa939a4..cbe2326 100644 --- a/src/syncer-postgres/init_test.go +++ b/src/syncer-postgres/init_test.go @@ -858,7 +858,7 @@ func setTestArgs(args []string) { } func createTestTableViaFullRefresh(syncer *SyncerFullRefresh, pgSchemaTable PgSchemaTable, pgSchemaColumns []PgSchemaColumn, rows [][]string) { - cappedBuffer := common.NewCappedBuffer(syncer.Config.CommonConfig, MAX_IN_MEMORY_BUFFER_SIZE) + cappedBuffer := common.NewCappedBuffer(syncer.Config.CommonConfig, common.DEFAULT_CAPPED_BUFFER_SIZE) writer := csv.NewWriter(cappedBuffer) headerRow := []string{} diff --git a/src/syncer-postgres/postgres.go b/src/syncer-postgres/postgres.go index adb69d2..5852856 100644 --- a/src/syncer-postgres/postgres.go +++ b/src/syncer-postgres/postgres.go @@ -168,6 +168,7 @@ func (postgres *Postgres) PgSchemaColumns(pgSchemaTable PgSchemaTable, retryCoun joinedUniqueColumnNames = "" } else { if strings.Contains(err.Error(), "terminating connection due to conflict with recovery (SQLSTATE 40001)") || + strings.Contains(err.Error(), "current transaction is aborted, commands ignored until end of transaction block (SQLSTATE 25P02)") || strings.Contains(err.Error(), "failed to deallocate cached statement(s): conn closed") { currentRetryCount := 0 if len(retryCount) > 0 { diff --git a/src/syncer-postgres/syncer_full_refresh.go b/src/syncer-postgres/syncer_full_refresh.go index 67cd0d9..c9e9505 100644 --- a/src/syncer-postgres/syncer_full_refresh.go +++ b/src/syncer-postgres/syncer_full_refresh.go @@ -37,7 +37,7 @@ func (syncer *SyncerFullRefresh) Sync(postgres *Postgres, pgSchemaTables []PgSch func (syncer *SyncerFullRefresh) syncTable(postgres *Postgres, pgSchemaTable PgSchemaTable, pgSchemaColumns []PgSchemaColumn) { // Create a capped buffer read and written in parallel - cappedBuffer := common.NewCappedBuffer(syncer.Config.CommonConfig, MAX_IN_MEMORY_BUFFER_SIZE) + cappedBuffer := common.NewCappedBuffer(syncer.Config.CommonConfig, common.DEFAULT_CAPPED_BUFFER_SIZE) // Copy from PG to cappedBuffer in a separate goroutine in parallel go func() { @@ -49,34 +49,17 @@ func (syncer *SyncerFullRefresh) syncTable(postgres *Postgres, pgSchemaTable PgS } func (syncer *SyncerFullRefresh) writeToIceberg(pgSchemaTable PgSchemaTable, pgSchemaColumns []PgSchemaColumn, cappedBuffer *common.CappedBuffer) { - // Delete -syncing table - syncingIcebergSchemaTable := common.IcebergSchemaTable{Schema: syncer.Config.DestinationSchemaName, Table: pgSchemaTable.IcebergTableName() + common.TEMP_TABLE_SUFFIX_SYNCING} - syncingIcebergTable := common.NewIcebergTable(syncer.Config.CommonConfig, syncer.StorageS3, syncer.DuckdbClient, syncingIcebergSchemaTable) - syncingIcebergTable.DropIfExists() - - // Insert and create -syncing table - icebergSchemaColumns := make([]*common.IcebergSchemaColumn, len(pgSchemaColumns)) - for i, pgSchemaColumn := range pgSchemaColumns { - icebergSchemaColumns[i] = pgSchemaColumn.ToIcebergSchemaColumn() - } - icebergTableWriter := common.NewIcebergTableWriter(syncer.Config.CommonConfig, syncer.StorageS3, syncer.DuckdbClient, syncingIcebergTable, icebergSchemaColumns, 1) - icebergTableWriter.InsertFromCsvCappedBuffer(cappedBuffer) - - // Delete -deleting table - deletingIcebergSchemaTable := common.IcebergSchemaTable{Schema: syncer.Config.DestinationSchemaName, Table: pgSchemaTable.IcebergTableName() + common.TEMP_TABLE_SUFFIX_DELETING} - deletingIcebergTable := common.NewIcebergTable(syncer.Config.CommonConfig, syncer.StorageS3, syncer.DuckdbClient, deletingIcebergSchemaTable) - deletingIcebergTable.DropIfExists() - - // Rename table to -deleting icebergSchemaTable := common.IcebergSchemaTable{Schema: syncer.Config.DestinationSchemaName, Table: pgSchemaTable.IcebergTableName()} icebergTable := common.NewIcebergTable(syncer.Config.CommonConfig, syncer.StorageS3, syncer.DuckdbClient, icebergSchemaTable) - icebergTable.Rename(deletingIcebergSchemaTable.Table) - - // Rename -syncing to table - syncingIcebergTable.Rename(pgSchemaTable.IcebergTableName()) - // Delete -deleting table - deletingIcebergTable.DropIfExists() + icebergTable.ReplaceWith(func(syncingIcebergTable *common.IcebergTable) { + icebergSchemaColumns := make([]*common.IcebergSchemaColumn, len(pgSchemaColumns)) + for i, pgSchemaColumn := range pgSchemaColumns { + icebergSchemaColumns[i] = pgSchemaColumn.ToIcebergSchemaColumn() + } + icebergTableWriter := common.NewIcebergTableWriter(syncer.Config.CommonConfig, syncer.StorageS3, syncer.DuckdbClient, syncingIcebergTable, icebergSchemaColumns, 1) + icebergTableWriter.InsertFromCsvCappedBuffer(cappedBuffer) + }) } func (syncer *SyncerFullRefresh) copyFromPgTable(postgres *Postgres, pgSchemaTable PgSchemaTable, cappedBuffer *common.CappedBuffer) { diff --git a/src/syncer-postgres/syncer_utils.go b/src/syncer-postgres/syncer_utils.go index 7b03a86..f112918 100644 --- a/src/syncer-postgres/syncer_utils.go +++ b/src/syncer-postgres/syncer_utils.go @@ -4,12 +4,6 @@ import ( "github.com/BemiHQ/BemiDB/src/common" ) -var ( - MAX_IN_MEMORY_BUFFER_SIZE = 32 * 1024 * 1024 // 32 MB - - COMPACT_AFTER_INSERT_BATCH_COUNT = 40 // Compact the table after every N insert batches -) - type SyncerUtils struct { Config *Config StorageS3 *common.StorageS3 From 19e145388f47d7c0627bbde08fc6eb3ef0fa72f6 Mon Sep 17 00:00:00 2001 From: exAspArk Date: Tue, 9 Sep 2025 22:14:32 -0400 Subject: [PATCH 14/24] Allow per-column permissions in runtime. Deprecate PG include_schemas --- README.md | 12 --- src/common/common_config.go | 2 +- src/common/iceberg_catalog.go | 28 +------ src/server/iceberg_reader.go | 4 - src/server/parser_table.go | 118 +++++++++++++++++++++------- src/server/parser_utils.go | 29 ------- src/server/pg_constants.go | 1 + src/server/query_handler.go | 20 +---- src/server/query_handler_test.go | 29 +++++++ src/server/query_remapper.go | 111 +++++++++++++++++--------- src/server/query_remapper_table.go | 37 ++++----- src/syncer-postgres/config.go | 7 -- src/syncer-postgres/syncer_utils.go | 4 - 13 files changed, 217 insertions(+), 185 deletions(-) diff --git a/README.md b/README.md index 13808ea..d316897 100644 --- a/README.md +++ b/README.md @@ -131,17 +131,6 @@ docker run \ ghcr.io/bemihq/bemidb:latest syncer-postgres ``` -To include all tables from a specific schema: - -```sh -docker run \ - -e SOURCE_POSTGRES_DATABASE_URL=postgres://user:password@host.docker.internal:5432/source \ - -e SOURCE_POSTGRES_INCLUDE_SCHEMAS=public \ # A comma-separated list of schemas to include - -e DESTINATION_SCHEMA_NAME=postgres \ - -e AWS_REGION -e AWS_S3_BUCKET -e AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY -e CATALOG_DATABASE_URL \ - ghcr.io/bemihq/bemidb:latest syncer-postgres -``` - To exclude specific tables during the sync: ```sh @@ -212,7 +201,6 @@ export AWS_S3_ENDPOINT=http://localhost:9000 |-------------------------------------|---------------|----------------------------------------------------------------------| | `DESTINATION_SCHEMA_NAME` | Required | Schema name in BemiDB to sync data to. | | `SOURCE_POSTGRES_DATABASE_URL` | Required | Postgres database URL to sync data from. | -| `SOURCE_POSTGRES_INCLUDE_SCHEMAS` | | List of schemas to include in sync. Comma-separated `schema.table`. | | `SOURCE_POSTGRES_INCLUDE_TABLES` | | List of tables to include in sync. Comma-separated `schema.table`. | | `SOURCE_POSTGRES_EXCLUDE_TABLES` | | List of tables to exclude from sync. Comma-separated `schema.table`. | diff --git a/src/common/common_config.go b/src/common/common_config.go index 63ca19c..b909e82 100644 --- a/src/common/common_config.go +++ b/src/common/common_config.go @@ -1,7 +1,7 @@ package common const ( - VERSION = "1.3.0" + VERSION = "1.4.0" ENV_LOG_LEVEL = "BEMIDB_LOG_LEVEL" ENV_DISABLE_ANONYMOUS_ANALYTICS = "BEMIDB_DISABLE_ANONYMOUS_ANALYTICS" diff --git a/src/common/iceberg_catalog.go b/src/common/iceberg_catalog.go index 7f8894c..ff2f2e3 100644 --- a/src/common/iceberg_catalog.go +++ b/src/common/iceberg_catalog.go @@ -18,6 +18,10 @@ type IcebergSchemaTable struct { Table string } +func (schemaTable IcebergSchemaTable) ToArg() string { + return schemaTable.Schema + "." + schemaTable.Table +} + func (schemaTable IcebergSchemaTable) String() string { return fmt.Sprintf(`"%s"."%s"`, schemaTable.Schema, schemaTable.Table) } @@ -47,29 +51,6 @@ func NewIcebergCatalog(config *CommonConfig) *IcebergCatalog { // Read ---------------------------------------------------------------------------------------------------------------- -func (catalog *IcebergCatalog) Schemas() ([]string, error) { - pgClient := catalog.newPostgresClient() - defer pgClient.Close() - - ctx := context.Background() - rows, err := pgClient.Query(ctx, "SELECT table_namespace FROM iceberg_tables WHERE table_name NOT LIKE '%"+TEMP_TABLE_SUFFIX_SYNCING+"' AND table_name NOT LIKE '%"+TEMP_TABLE_SUFFIX_DELETING+"' GROUP BY table_namespace") - if err != nil { - return nil, err - } - defer rows.Close() - - var schemas []string - for rows.Next() { - var schema string - err := rows.Scan(&schema) - if err != nil { - return nil, err - } - schemas = append(schemas, schema) - } - return schemas, nil -} - func (catalog *IcebergCatalog) SchemaTables() (Set[IcebergSchemaTable], error) { pgClient := catalog.newPostgresClient() defer pgClient.Close() @@ -120,7 +101,6 @@ func (catalog *IcebergCatalog) MaterializedViews() ([]IcebergMaterializedView, e Table: table, Definition: definition, }) - } return materializedViews, nil } diff --git a/src/server/iceberg_reader.go b/src/server/iceberg_reader.go index 488759f..c59aabd 100644 --- a/src/server/iceberg_reader.go +++ b/src/server/iceberg_reader.go @@ -18,10 +18,6 @@ func NewIcebergReader(config *Config, storageS3 *common.StorageS3, icebergCatalo } } -func (reader *IcebergReader) Schemas() (icebergSchemas []string, err error) { - return reader.IcebergCatalog.Schemas() -} - func (reader *IcebergReader) SchemaTables() (icebergSchemaTables common.Set[common.IcebergSchemaTable], err error) { return reader.IcebergCatalog.SchemaTables() } diff --git a/src/server/parser_table.go b/src/server/parser_table.go index a18feae..2af9f87 100644 --- a/src/server/parser_table.go +++ b/src/server/parser_table.go @@ -1,6 +1,9 @@ package main import ( + "strings" + + "github.com/BemiHQ/BemiDB/src/common" pgQuery "github.com/pganalyze/pg_query_go/v6" ) @@ -42,35 +45,60 @@ func (parser *ParserTable) IsTableFromInformationSchema(qSchemaTable QuerySchema return qSchemaTable.Schema == PG_SCHEMA_INFORMATION_SCHEMA } -// public.table -> FROM iceberg_scan('path') table -// schema.table -> FROM iceberg_scan('path') schema_table -func (parser *ParserTable) MakeIcebergTableNode(queryToIcebergTable QueryToIcebergTable) *pgQuery.Node { - node := pgQuery.MakeSimpleRangeFunctionNode([]*pgQuery.Node{ - pgQuery.MakeListNode([]*pgQuery.Node{ - pgQuery.MakeFuncCallNode( - []*pgQuery.Node{ - pgQuery.MakeStrNode("iceberg_scan"), - }, - []*pgQuery.Node{ - pgQuery.MakeAConstStrNode( - queryToIcebergTable.IcebergTablePath, - 0, - ), - }, - 0, - ), - }), - }) - - // DuckDB doesn't support aliases on iceberg_scan() functions, so we need to wrap it in a nested select that can have an alias - selectStarNode := pgQuery.MakeResTargetNodeWithVal( - pgQuery.MakeColumnRefNode( - []*pgQuery.Node{pgQuery.MakeAStarNode()}, - 0, - ), - 0, - ) - return parser.utils.MakeSubselectFromNode(queryToIcebergTable.QuerySchemaTable, []*pgQuery.Node{selectStarNode}, node) +// public.table -> (SELECT * FROM iceberg_scan('path')) table +// schema.table -> (SELECT * FROM iceberg_scan('path')) schema_table +// public.table -> (SELECT permitted, columns FROM iceberg_scan('path')) table +// public.table -> (SELECT NULL WHERE FALSE) table +// public.table t -> (SELECT * FROM iceberg_scan('path')) t +func (parser *ParserTable) MakeIcebergTableNode(queryToIcebergTable QueryToIcebergTable, permissions *map[string][]string) *pgQuery.Node { + var query string + if permissions == nil { + query = "SELECT * FROM iceberg_scan('" + queryToIcebergTable.IcebergTablePath + "')" + } else if columnNames, allowed := (*permissions)[queryToIcebergTable.QuerySchemaTable.ToIcebergSchemaTable().ToArg()]; allowed { + query = "SELECT " + strings.Join(columnNames, ", ") + " FROM iceberg_scan('" + queryToIcebergTable.IcebergTablePath + "')" + } else { + query = "SELECT NULL WHERE FALSE" + } + + return parser.makeSubselectNode(query, queryToIcebergTable.QuerySchemaTable) +} + +// information_schema.tables -> (SELECT * FROM main.tables) information_schema_tables +// information_schema.tables -> (SELECT * FROM main.tables WHERE table_schema || '.' || table_name IN ('permitted.table')) information_schema_tables +// information_schema.tables t -> (SELECT * FROM main.tables) t +func (parser *ParserTable) MakeInformationSchemaTablesNode(qSchemaTable QuerySchemaTable, permissions *map[string][]string) *pgQuery.Node { + query := "SELECT * FROM main.tables" + + if permissions != nil { + quotedSchemaTableNames := []string{} + for schemaTable := range *permissions { + quotedSchemaTableNames = append(quotedSchemaTableNames, "'"+schemaTable+"'") + } + query += " WHERE table_schema || '.' || table_name IN (" + strings.Join(quotedSchemaTableNames, ", ") + ")" + } + + return parser.makeSubselectNode(query, qSchemaTable) +} + +// information_schema.columns -> (SELECT * FROM main.columns) information_schema_columns +// information_schema.columns -> (SELECT * FROM main.columns WHERE (table_schema || '.' || table_name IN ('permitted.table') AND column_name IN ('permitted', 'columns')) OR ...) information_schema_columns +// information_schema.columns c -> (SELECT * FROM main.columns) c +func (parser *ParserTable) MakeInformationSchemaColumnsNode(qSchemaTable QuerySchemaTable, permissions *map[string][]string) *pgQuery.Node { + query := "SELECT * FROM main.columns" + + if permissions != nil { + conditions := []string{} + for schemaTable, columnNames := range *permissions { + quotedColumnNames := []string{} + for _, columnName := range columnNames { + quotedColumnNames = append(quotedColumnNames, "'"+columnName+"'") + } + conditions = append(conditions, "(table_schema || '.' || table_name = '"+schemaTable+"' AND column_name IN ("+strings.Join(quotedColumnNames, ", ")+"))") + } + query += " WHERE " + strings.Join(conditions, " OR ") + } + + return parser.makeSubselectNode(query, qSchemaTable) } func (parser *ParserTable) TopLevelSchemaFunction(rangeFunction *pgQuery.RangeFunction) *QuerySchemaFunction { @@ -108,3 +136,35 @@ func (parser *ParserTable) SetAliasIfNotExists(rangeFunction *pgQuery.RangeFunct rangeFunction.Alias = &pgQuery.Alias{Aliasname: alias} } + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// (query) AS qSchemaTable +func (parser *ParserTable) makeSubselectNode(query string, qSchemaTable QuerySchemaTable) *pgQuery.Node { + queryTree, err := pgQuery.Parse(query) + common.PanicIfError(parser.config.CommonConfig, err) + + alias := qSchemaTable.Alias + if alias == "" { + if qSchemaTable.Schema == PG_SCHEMA_PUBLIC || qSchemaTable.Schema == "" { + alias = qSchemaTable.Table + } else { + alias = qSchemaTable.Schema + "_" + qSchemaTable.Table + } + } + + return &pgQuery.Node{ + Node: &pgQuery.Node_RangeSubselect{ + RangeSubselect: &pgQuery.RangeSubselect{ + Subquery: &pgQuery.Node{ + Node: &pgQuery.Node_SelectStmt{ + SelectStmt: queryTree.Stmts[0].Stmt.GetSelectStmt(), + }, + }, + Alias: &pgQuery.Alias{ + Aliasname: alias, + }, + }, + }, + } +} diff --git a/src/server/parser_utils.go b/src/server/parser_utils.go index 8fddabc..8465a8c 100644 --- a/src/server/parser_utils.go +++ b/src/server/parser_utils.go @@ -32,35 +32,6 @@ func (utils *ParserUtils) SchemaFunction(functionCall *pgQuery.FuncCall) *QueryS } } -func (utils *ParserUtils) MakeSubselectFromNode(qSchemaTable QuerySchemaTable, targetList []*pgQuery.Node, fromNode *pgQuery.Node) *pgQuery.Node { - alias := qSchemaTable.Alias - if alias == "" { - if qSchemaTable.Schema == PG_SCHEMA_PUBLIC || qSchemaTable.Schema == "" { - alias = qSchemaTable.Table - } else { - alias = qSchemaTable.Schema + "_" + qSchemaTable.Table - } - } - - return &pgQuery.Node{ - Node: &pgQuery.Node_RangeSubselect{ - RangeSubselect: &pgQuery.RangeSubselect{ - Subquery: &pgQuery.Node{ - Node: &pgQuery.Node_SelectStmt{ - SelectStmt: &pgQuery.SelectStmt{ - TargetList: targetList, - FromClause: []*pgQuery.Node{fromNode}, - }, - }, - }, - Alias: &pgQuery.Alias{ - Aliasname: alias, - }, - }, - }, - } -} - func (utils *ParserUtils) MakeNullNode() *pgQuery.Node { return &pgQuery.Node{ Node: &pgQuery.Node_AConst{ diff --git a/src/server/pg_constants.go b/src/server/pg_constants.go index d24ff0b..8ed8c74 100644 --- a/src/server/pg_constants.go +++ b/src/server/pg_constants.go @@ -17,6 +17,7 @@ const ( PG_TABLE_PG_CLASS = "pg_class" PG_TABLE_PG_STAT_USER_TABLES = "pg_stat_user_tables" PG_TABLE_TABLES = "tables" + PG_TABLE_COLUMNS = "columns" PG_VAR_SEARCH_PATH = "search_path" ) diff --git a/src/server/query_handler.go b/src/server/query_handler.go index 2d5cb0d..4728008 100644 --- a/src/server/query_handler.go +++ b/src/server/query_handler.go @@ -15,8 +15,7 @@ import ( ) const ( - FALLBACK_SQL_QUERY = "SELECT 1" - INSPECT_SQL_COMMENT = " --INSPECT" + FALLBACK_SQL_QUERY = "SELECT 1" ) type QueryHandler struct { @@ -59,8 +58,6 @@ func NewQueryHandler(config *Config, serverDuckdbClient *common.DuckdbClient) *Q ResponseHandler: NewResponseHandler(config), } - queryHandler.createSchemas(icebergReader) - return queryHandler } @@ -238,21 +235,6 @@ func (queryHandler *QueryHandler) HandleExecuteQuery(message *pgproto3.Execute, return queryHandler.rowsToDataMessages(preparedStatement.Rows, preparedStatement.OriginalQuery) } -func (queryHandler *QueryHandler) createSchemas(icebergReader *IcebergReader) { - ctx := context.Background() - schemas, err := icebergReader.Schemas() - common.PanicIfError(queryHandler.Config.CommonConfig, err) - - for _, schema := range schemas { - _, err := queryHandler.ServerDuckdbClient.ExecContext( - ctx, - "CREATE SCHEMA IF NOT EXISTS \"$schema\"", - map[string]string{"schema": schema}, - ) - common.PanicIfError(queryHandler.Config.CommonConfig, err) - } -} - func (queryHandler *QueryHandler) rowsToDescriptionMessages(rows *sql.Rows, originalQuery string) ([]pgproto3.Message, error) { cols, err := rows.ColumnTypes() if err != nil { diff --git a/src/server/query_handler_test.go b/src/server/query_handler_test.go index def5a02..10b1990 100644 --- a/src/server/query_handler_test.go +++ b/src/server/query_handler_test.go @@ -375,6 +375,11 @@ func TestHandleQuery(t *testing.T) { "types": {uint32ToString(pgtype.TextOID)}, "values": {"memory", "postgres", "test_table", "BASE TABLE", "", "", "", "", "", "YES", "NO", ""}, }, + "SELECT * FROM information_schema.tables WHERE table_schema = 'postgres' /*BEMIDB_PERMISSIONS {\"postgres.test_table\": [\"id\"]} BEMIDB_PERMISSIONS*/": { + "description": {"table_catalog", "table_schema", "table_name", "table_type", "self_referencing_column_name", "reference_generation", "user_defined_type_catalog", "user_defined_type_schema", "user_defined_type_name", "is_insertable_into", "is_typed", "commit_action"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"memory", "postgres", "test_table", "BASE TABLE", "", "", "", "", "", "YES", "NO", ""}, + }, // information_schema.columns "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'id'": { "description": {"udt_name"}, @@ -576,6 +581,11 @@ func TestHandleQuery(t *testing.T) { "types": {uint32ToString(pgtype.TextOID)}, "values": {"text"}, }, + "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' /*BEMIDB_PERMISSIONS {\"postgres.test_table\": [\"id\"]} BEMIDB_PERMISSIONS*/": { + "description": {"udt_name"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"int4"}, + }, }) }) @@ -1425,6 +1435,25 @@ func TestHandleQuery(t *testing.T) { } }) + t.Run("Returns an error if permission for a column is denied", func(t *testing.T) { + _, err := queryHandler.HandleSimpleQuery("SELECT id, bit_column FROM postgres.test_table /*BEMIDB_PERMISSIONS {\"postgres.test_table\": [\"id\"]} BEMIDB_PERMISSIONS*/") + + if err == nil { + t.Errorf("Expected an error, got nil") + } + + expectedErrorMessage := strings.Join([]string{ + "Binder Error: Referenced column \"bit_column\" not found in FROM clause!", + "Candidate bindings: \"id\"", + "", + "LINE 1: SELECT id, bit_column FROM (SELECT id FROM iceberg_scan('s3://bemidb...", + " ^", + }, "\n") + if err.Error() != expectedErrorMessage { + t.Errorf("Expected the error to be '"+expectedErrorMessage+"', got %v", err.Error()) + } + }) + t.Run("Returns a result without a row description for SET queries", func(t *testing.T) { messages, err := queryHandler.HandleSimpleQuery("SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL READ UNCOMMITTED") diff --git a/src/server/query_remapper.go b/src/server/query_remapper.go index a86876c..4143fcf 100644 --- a/src/server/query_remapper.go +++ b/src/server/query_remapper.go @@ -1,6 +1,7 @@ package main import ( + "encoding/json" "errors" "fmt" "strings" @@ -10,6 +11,11 @@ import ( "github.com/BemiHQ/BemiDB/src/common" ) +const ( + INSPECT_SQL_COMMENT = " --INSPECT" + PERMISSIONS_SQL_COMMENT = "BEMIDB_PERMISSIONS" +) + var SUPPORTED_SET_STATEMENTS = common.NewSet[string]().AddAll([]string{ "timezone", // SET SESSION timezone TO 'UTC' }) @@ -63,6 +69,15 @@ func (remapper *QueryRemapper) ParseAndRemapQuery(query string) ([]string, []str common.LogDebug(remapper.config.CommonConfig, queryTree.Stmts) } + var permissions *map[string][]string + if strings.Count(query, "/*"+PERMISSIONS_SQL_COMMENT+" ") == 1 && strings.Count(query, " "+PERMISSIONS_SQL_COMMENT+"*/") == 1 { + permissions, err = remapper.extractPermissions(query) + if err != nil { + return nil, nil, fmt.Errorf("couldn't extract permissions from query comment: %s. %w", query, err) + } + common.LogDebug(remapper.config.CommonConfig, "Parsed permissions:", permissions) + } + var originalQueryStatements []string for _, stmt := range queryTree.Stmts { originalQueryStatement, err := pgQuery.Deparse(&pgQuery.ParseResult{Stmts: []*pgQuery.RawStmt{stmt}}) @@ -72,7 +87,7 @@ func (remapper *QueryRemapper) ParseAndRemapQuery(query string) ([]string, []str originalQueryStatements = append(originalQueryStatements, originalQueryStatement) } - remappedStatements, err := remapper.remapStatements(queryTree.Stmts) + remappedStatements, err := remapper.remapStatements(queryTree.Stmts, permissions) if err != nil { return nil, nil, err } @@ -91,7 +106,7 @@ func (remapper *QueryRemapper) ParseAndRemapQuery(query string) ([]string, []str //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -func (remapper *QueryRemapper) remapStatements(statements []*pgQuery.RawStmt) ([]*pgQuery.RawStmt, error) { +func (remapper *QueryRemapper) remapStatements(statements []*pgQuery.RawStmt, permissions *map[string][]string) ([]*pgQuery.RawStmt, error) { // Empty query if len(statements) == 0 { return statements, nil @@ -110,7 +125,7 @@ func (remapper *QueryRemapper) remapStatements(statements []*pgQuery.RawStmt) ([ // SELECT case node.GetSelectStmt() != nil: selectStatement := node.GetSelectStmt() - remapper.remapSelectStatement(selectStatement, 1) + remapper.remapSelectStatement(selectStatement, permissions, 1) stmt.Stmt = &pgQuery.Node{Node: &pgQuery.Node_SelectStmt{SelectStmt: selectStatement}} statements[i] = stmt @@ -189,24 +204,24 @@ func (remapper *QueryRemapper) remapSetStatement(stmt *pgQuery.RawStmt) *pgQuery return NOOP_QUERY_TREE.Stmts[0] } -func (remapper *QueryRemapper) remapSelectStatement(selectStatement *pgQuery.SelectStmt, indentLevel int) { +func (remapper *QueryRemapper) remapSelectStatement(selectStatement *pgQuery.SelectStmt, permissions *map[string][]string, indentLevel int) { // SELECT - remappedColumnRefs := remapper.remapSelect(selectStatement, indentLevel) // recursion + remappedColumnRefs := remapper.remapSelect(selectStatement, permissions, indentLevel) // recursion // UNION if selectStatement.FromClause == nil && selectStatement.Larg != nil && selectStatement.Rarg != nil { remapper.traceTreeTraversal("UNION left", indentLevel) leftSelectStatement := selectStatement.Larg - remapper.remapSelectStatement(leftSelectStatement, indentLevel+1) // self-recursion + remapper.remapSelectStatement(leftSelectStatement, permissions, indentLevel+1) // self-recursion remapper.traceTreeTraversal("UNION right", indentLevel) rightSelectStatement := selectStatement.Rarg - remapper.remapSelectStatement(rightSelectStatement, indentLevel+1) // self-recursion + remapper.remapSelectStatement(rightSelectStatement, permissions, indentLevel+1) // self-recursion } // JOIN if len(selectStatement.FromClause) > 0 && selectStatement.FromClause[0].GetJoinExpr() != nil { - selectStatement.FromClause[0] = remapper.remapJoinExpressions(selectStatement, selectStatement.FromClause[0], remappedColumnRefs, indentLevel+1) // recursion + selectStatement.FromClause[0] = remapper.remapJoinExpressions(selectStatement, selectStatement.FromClause[0], remappedColumnRefs, permissions, indentLevel+1) // recursion } // WHERE @@ -216,7 +231,7 @@ func (remapper *QueryRemapper) remapSelectStatement(selectStatement *pgQuery.Sel if remapper.removeWhereClause(selectStatement.WhereClause) { selectStatement.WhereClause = nil } else { - selectStatement.WhereClause = remapper.remappedExpressions(selectStatement.WhereClause, remappedColumnRefs, indentLevel) // recursion + selectStatement.WhereClause = remapper.remappedExpressions(selectStatement.WhereClause, remappedColumnRefs, permissions, indentLevel) // recursion } } @@ -225,7 +240,7 @@ func (remapper *QueryRemapper) remapSelectStatement(selectStatement *pgQuery.Sel remapper.traceTreeTraversal("WITH CTE's", indentLevel) for _, cte := range selectStatement.WithClause.Ctes { if cteSelect := cte.GetCommonTableExpr().Ctequery.GetSelectStmt(); cteSelect != nil { - remapper.remapSelectStatement(cteSelect, indentLevel+1) // self-recursion + remapper.remapSelectStatement(cteSelect, permissions, indentLevel+1) // self-recursion } } } @@ -236,12 +251,12 @@ func (remapper *QueryRemapper) remapSelectStatement(selectStatement *pgQuery.Sel if fromNode.GetRangeVar() != nil { // FROM [TABLE] remapper.traceTreeTraversal("FROM table", indentLevel) - selectStatement.FromClause[i] = remapper.remapperTable.RemapTable(fromNode) + selectStatement.FromClause[i] = remapper.remapperTable.RemapTable(fromNode, permissions) } else if fromNode.GetRangeSubselect() != nil { // FROM (SELECT ...) remapper.traceTreeTraversal("FROM subselect", indentLevel) subSelectStatement := fromNode.GetRangeSubselect().Subquery.GetSelectStmt() - remapper.remapSelectStatement(subSelectStatement, indentLevel+1) // self-recursion + remapper.remapSelectStatement(subSelectStatement, permissions, indentLevel+1) // self-recursion } else if fromNode.GetRangeFunction() != nil { // FROM PG_FUNCTION() remapper.traceTreeTraversal("FROM function()", indentLevel) @@ -254,7 +269,7 @@ func (remapper *QueryRemapper) remapSelectStatement(selectStatement *pgQuery.Sel if selectStatement.SortClause != nil { remapper.traceTreeTraversal("ORDER BY statements", indentLevel) for _, sortNode := range selectStatement.SortClause { - sortNode.GetSortBy().Node = remapper.remappedExpressions(sortNode.GetSortBy().Node, remappedColumnRefs, indentLevel) // recursion + sortNode.GetSortBy().Node = remapper.remappedExpressions(sortNode.GetSortBy().Node, remappedColumnRefs, permissions, indentLevel) // recursion } } @@ -262,43 +277,43 @@ func (remapper *QueryRemapper) remapSelectStatement(selectStatement *pgQuery.Sel if selectStatement.GroupClause != nil { remapper.traceTreeTraversal("GROUP BY statements", indentLevel) for i, groupNode := range selectStatement.GroupClause { - selectStatement.GroupClause[i] = remapper.remappedExpressions(groupNode, remappedColumnRefs, indentLevel) // recursion + selectStatement.GroupClause[i] = remapper.remappedExpressions(groupNode, remappedColumnRefs, permissions, indentLevel) // recursion } } } -func (remapper *QueryRemapper) remapJoinExpressions(selectStatement *pgQuery.SelectStmt, node *pgQuery.Node, remappedColumnRefs map[string]string, indentLevel int) *pgQuery.Node { +func (remapper *QueryRemapper) remapJoinExpressions(selectStatement *pgQuery.SelectStmt, node *pgQuery.Node, remappedColumnRefs map[string]string, permissions *map[string][]string, indentLevel int) *pgQuery.Node { remapper.traceTreeTraversal("JOIN left", indentLevel) leftJoinNode := node.GetJoinExpr().Larg if leftJoinNode.GetJoinExpr() != nil { - leftJoinNode = remapper.remapJoinExpressions(selectStatement, leftJoinNode, remappedColumnRefs, indentLevel+1) // self-recursion + leftJoinNode = remapper.remapJoinExpressions(selectStatement, leftJoinNode, remappedColumnRefs, permissions, indentLevel+1) // self-recursion } else if leftJoinNode.GetRangeVar() != nil { // TABLE remapper.traceTreeTraversal("TABLE left", indentLevel+1) - leftJoinNode = remapper.remapperTable.RemapTable(leftJoinNode) + leftJoinNode = remapper.remapperTable.RemapTable(leftJoinNode, permissions) } else if leftJoinNode.GetRangeSubselect() != nil { leftSelectStatement := leftJoinNode.GetRangeSubselect().Subquery.GetSelectStmt() - remapper.remapSelectStatement(leftSelectStatement, indentLevel+1) // parent-recursion + remapper.remapSelectStatement(leftSelectStatement, permissions, indentLevel+1) // parent-recursion } node.GetJoinExpr().Larg = leftJoinNode remapper.traceTreeTraversal("JOIN right", indentLevel) rightJoinNode := node.GetJoinExpr().Rarg if rightJoinNode.GetJoinExpr() != nil { - rightJoinNode = remapper.remapJoinExpressions(selectStatement, rightJoinNode, remappedColumnRefs, indentLevel+1) // self-recursion + rightJoinNode = remapper.remapJoinExpressions(selectStatement, rightJoinNode, remappedColumnRefs, permissions, indentLevel+1) // self-recursion } else if rightJoinNode.GetRangeVar() != nil { // TABLE remapper.traceTreeTraversal("TABLE right", indentLevel+1) - rightJoinNode = remapper.remapperTable.RemapTable(rightJoinNode) + rightJoinNode = remapper.remapperTable.RemapTable(rightJoinNode, permissions) } else if rightJoinNode.GetRangeSubselect() != nil { rightSelectStatement := rightJoinNode.GetRangeSubselect().Subquery.GetSelectStmt() - remapper.remapSelectStatement(rightSelectStatement, indentLevel+1) // parent-recursion + remapper.remapSelectStatement(rightSelectStatement, permissions, indentLevel+1) // parent-recursion } node.GetJoinExpr().Rarg = rightJoinNode if quals := node.GetJoinExpr().Quals; quals != nil { remapper.traceTreeTraversal("JOIN on", indentLevel) - node.GetJoinExpr().Quals = remapper.remappedExpressions(quals, remappedColumnRefs, indentLevel) // recursion + node.GetJoinExpr().Quals = remapper.remappedExpressions(quals, remappedColumnRefs, permissions, indentLevel) // recursion // DuckDB doesn't support non-INNER JOINs with ON clauses that reference columns from outer tables: // SELECT ( @@ -323,18 +338,18 @@ func (remapper *QueryRemapper) remapJoinExpressions(selectStatement *pgQuery.Sel return node } -func (remapper *QueryRemapper) remappedExpressions(node *pgQuery.Node, remappedColumnRefs map[string]string, indentLevel int) *pgQuery.Node { +func (remapper *QueryRemapper) remappedExpressions(node *pgQuery.Node, remappedColumnRefs map[string]string, permissions *map[string][]string, indentLevel int) *pgQuery.Node { // CASE caseExpression := node.GetCaseExpr() if caseExpression != nil { - remapper.remapCaseExpression(caseExpression, remappedColumnRefs, indentLevel) // recursion + remapper.remapCaseExpression(caseExpression, remappedColumnRefs, permissions, indentLevel) // recursion } // OR/AND boolExpr := node.GetBoolExpr() if boolExpr != nil { for i, arg := range boolExpr.Args { - boolExpr.Args[i] = remapper.remappedExpressions(arg, remappedColumnRefs, indentLevel+1) // self-recursion + boolExpr.Args[i] = remapper.remappedExpressions(arg, remappedColumnRefs, permissions, indentLevel+1) // self-recursion } } @@ -345,7 +360,7 @@ func (remapper *QueryRemapper) remappedExpressions(node *pgQuery.Node, remappedC if arg.GetSubLink() != nil { // Nested SELECT subSelect := arg.GetSubLink().Subselect.GetSelectStmt() - remapper.remapSelectStatement(subSelect, indentLevel+1) // recursion + remapper.remapSelectStatement(subSelect, permissions, indentLevel+1) // recursion } } } @@ -354,7 +369,7 @@ func (remapper *QueryRemapper) remappedExpressions(node *pgQuery.Node, remappedC subLink := node.GetSubLink() if subLink != nil { subSelect := subLink.Subselect.GetSelectStmt() - remapper.remapSelectStatement(subSelect, indentLevel+1) // recursion + remapper.remapSelectStatement(subSelect, permissions, indentLevel+1) // recursion } // Comparison @@ -362,17 +377,17 @@ func (remapper *QueryRemapper) remappedExpressions(node *pgQuery.Node, remappedC if aExpr != nil { node = remapper.remapperExpression.RemappedExpression(node) if aExpr.Lexpr != nil { - aExpr.Lexpr = remapper.remappedExpressions(aExpr.Lexpr, remappedColumnRefs, indentLevel+1) // self-recursion + aExpr.Lexpr = remapper.remappedExpressions(aExpr.Lexpr, remappedColumnRefs, permissions, indentLevel+1) // self-recursion } if aExpr.Rexpr != nil { - aExpr.Rexpr = remapper.remappedExpressions(aExpr.Rexpr, remappedColumnRefs, indentLevel+1) // self-recursion + aExpr.Rexpr = remapper.remappedExpressions(aExpr.Rexpr, remappedColumnRefs, permissions, indentLevel+1) // self-recursion } } // IS NULL nullTest := node.GetNullTest() if nullTest != nil { - nullTest.Arg = remapper.remappedExpressions(nullTest.Arg, remappedColumnRefs, indentLevel+1) // self-recursion + nullTest.Arg = remapper.remappedExpressions(nullTest.Arg, remappedColumnRefs, permissions, indentLevel+1) // self-recursion } // IN @@ -393,12 +408,12 @@ func (remapper *QueryRemapper) remappedExpressions(node *pgQuery.Node, remappedC for i, arg := range functionCall.Args { if arg != nil { - functionCall.Args[i] = remapper.remappedExpressions(arg, remappedColumnRefs, indentLevel+1) // self-recursion + functionCall.Args[i] = remapper.remappedExpressions(arg, remappedColumnRefs, permissions, indentLevel+1) // self-recursion } } if functionCall.AggFilter != nil && functionCall.AggFilter.GetNullTest() != nil { - functionCall.AggFilter.GetNullTest().Arg = remapper.remappedExpressions(functionCall.AggFilter.GetNullTest().Arg, remappedColumnRefs, indentLevel+1) // self-recursion + functionCall.AggFilter.GetNullTest().Arg = remapper.remappedExpressions(functionCall.AggFilter.GetNullTest().Arg, remappedColumnRefs, permissions, indentLevel+1) // self-recursion } } @@ -427,29 +442,29 @@ func (remapper *QueryRemapper) remappedExpressions(node *pgQuery.Node, remappedC } // CASE ... -func (remapper *QueryRemapper) remapCaseExpression(caseExpr *pgQuery.CaseExpr, remappedColumnRefs map[string]string, indentLevel int) { +func (remapper *QueryRemapper) remapCaseExpression(caseExpr *pgQuery.CaseExpr, remappedColumnRefs map[string]string, permissions *map[string][]string, indentLevel int) { for _, when := range caseExpr.Args { if whenClause := when.GetCaseWhen(); whenClause != nil { // WHEN ... if whenClause.Expr != nil { - whenClause.Expr = remapper.remappedExpressions(whenClause.Expr, remappedColumnRefs, indentLevel+1) // recursion + whenClause.Expr = remapper.remappedExpressions(whenClause.Expr, remappedColumnRefs, permissions, indentLevel+1) // recursion } // THEN ... if whenClause.Result != nil { - whenClause.Result = remapper.remappedExpressions(whenClause.Result, remappedColumnRefs, indentLevel+1) // recursion + whenClause.Result = remapper.remappedExpressions(whenClause.Result, remappedColumnRefs, permissions, indentLevel+1) // recursion } } } // ELSE ... if caseExpr.Defresult != nil { - caseExpr.Defresult = remapper.remappedExpressions(caseExpr.Defresult, remappedColumnRefs, indentLevel+1) // recursion + caseExpr.Defresult = remapper.remappedExpressions(caseExpr.Defresult, remappedColumnRefs, permissions, indentLevel+1) // recursion } } // SELECT ... -func (remapper *QueryRemapper) remapSelect(selectStatement *pgQuery.SelectStmt, indentLevel int) map[string]string { +func (remapper *QueryRemapper) remapSelect(selectStatement *pgQuery.SelectStmt, permissions *map[string][]string, indentLevel int) map[string]string { remapper.traceTreeTraversal("SELECT statements", indentLevel) remappedColumnRefs := make(map[string]string) @@ -464,7 +479,7 @@ func (remapper *QueryRemapper) remapSelect(selectStatement *pgQuery.SelectStmt, valNode := targetNode.GetResTarget().Val if valNode != nil { - targetNode.GetResTarget().Val = remapper.remappedExpressions(valNode, remappedColumnRefs, indentLevel) // recursion + targetNode.GetResTarget().Val = remapper.remappedExpressions(valNode, remappedColumnRefs, permissions, indentLevel) // recursion } // Nested SELECT @@ -693,6 +708,26 @@ func (remapper *QueryRemapper) renameMaterializedViewFromNode(node *pgQuery.Node return nil } +func (remapper *QueryRemapper) extractPermissions(query string) (*map[string][]string, error) { + parts := strings.Split(query, "/*"+PERMISSIONS_SQL_COMMENT+" ") + if len(parts) != 2 { + return nil, nil + } + parts = strings.Split(parts[1], " "+PERMISSIONS_SQL_COMMENT+"*/") + if len(parts) != 2 { + return nil, nil + } + + // JSON parse + var permissions map[string][]string + err := json.Unmarshal([]byte(parts[0]), &permissions) + if err != nil { + return nil, err + } + + return &permissions, nil +} + func (remapper *QueryRemapper) traceTreeTraversal(label string, indentLevel int) { common.LogTrace(remapper.config.CommonConfig, strings.Repeat(">", indentLevel), label) } diff --git a/src/server/query_remapper_table.go b/src/server/query_remapper_table.go index b24e623..ce7ba7e 100644 --- a/src/server/query_remapper_table.go +++ b/src/server/query_remapper_table.go @@ -11,7 +11,6 @@ import ( ) var PG_CATALOG_TABLE_NAMES = common.Set[string]{} -var PG_INFORMATION_SCHEMA_TABLE_NAMES = common.Set[string]{} func CreatePgCatalogTableQueries(config *Config) []string { result := []string{ @@ -91,7 +90,7 @@ func CreateInformationSchemaTableQueries(config *Config) []string { result := []string{ // Dynamic views // DuckDB does not support udt_catalog, udt_schema, udt_name - `CREATE VIEW columns AS + `CREATE VIEW ` + PG_TABLE_COLUMNS + ` AS SELECT table_catalog, table_schema, table_name, column_name, ordinal_position, column_default, is_nullable, data_type, character_maximum_length, character_octet_length, numeric_precision, numeric_precision_radix, numeric_scale, datetime_precision, interval_type, interval_precision, character_set_catalog, character_set_schema, character_set_name, collation_catalog, collation_schema, collation_name, domain_catalog, domain_schema, domain_name, '` + config.Database + `' AS udt_catalog, @@ -129,7 +128,7 @@ func CreateInformationSchemaTableQueries(config *Config) []string { END AS udt_name, scope_catalog, scope_schema, scope_name, maximum_cardinality, dtd_identifier, is_self_referencing, is_identity, identity_generation, identity_start, identity_increment, identity_maximum, identity_minimum, identity_cycle, is_generated, generation_expression, is_updatable FROM information_schema.columns`, - `CREATE VIEW tables AS SELECT + `CREATE VIEW ` + PG_TABLE_TABLES + ` AS SELECT table_catalog, table_schema, table_name, @@ -143,9 +142,8 @@ func CreateInformationSchemaTableQueries(config *Config) []string { is_typed, commit_action FROM information_schema.tables - WHERE table_type != 'VIEW'`, + WHERE table_type != 'VIEW' AND table_schema != 'main'`, } - PG_INFORMATION_SCHEMA_TABLE_NAMES = extractTableNames(result) return result } @@ -175,7 +173,7 @@ func NewQueryRemapperTable(config *Config, icebergReader *IcebergReader, serverD } // FROM / JOIN [TABLE] -func (remapper *QueryRemapperTable) RemapTable(node *pgQuery.Node) *pgQuery.Node { +func (remapper *QueryRemapperTable) RemapTable(node *pgQuery.Node, permissions *map[string][]string) *pgQuery.Node { parser := remapper.parserTable qSchemaTable := parser.NodeToQuerySchemaTable(node) @@ -198,7 +196,7 @@ func (remapper *QueryRemapperTable) RemapTable(node *pgQuery.Node) *pgQuery.Node remapper.upsertPgMatviews() } - // pg_catalog -> main for tables defined in CreatePgCatalogTableQueries + // pg_catalog.[table] -> main.[table] for tables defined in CreatePgCatalogTableQueries if PG_CATALOG_TABLE_NAMES.Contains(qSchemaTable.Table) { parser.RemapSchemaToMain(node) return node @@ -211,25 +209,26 @@ func (remapper *QueryRemapperTable) RemapTable(node *pgQuery.Node) *pgQuery.Node // information_schema.* system tables if parser.IsTableFromInformationSchema(qSchemaTable) { switch qSchemaTable.Table { - // information_schema.tables -> reload Iceberg tables + // information_schema.tables -> (SELECT * FROM main.tables) information_schema_tables + // information_schema.tables -> (SELECT * FROM main.tables WHERE table_schema || '.' || table_name IN ('permitted.table')) information_schema_tables case PG_TABLE_TABLES: remapper.reloadIcebergTables() - parser.RemapSchemaToMain(node) - return node - } + return parser.MakeInformationSchemaTablesNode(qSchemaTable, permissions) - // information_schema.table -> main.table - if PG_INFORMATION_SCHEMA_TABLE_NAMES.Contains(qSchemaTable.Table) { - parser.RemapSchemaToMain(node) - return node + // information_schema.columns -> (SELECT * FROM main.columns) information_schema_columns + // information_schema.columns -> (SELECT * FROM main.columns WHERE (table_schema || '.' || table_name IN ('permitted.table') AND column_name IN ('permitted', 'columns')) OR ...) information_schema_columns + case PG_TABLE_COLUMNS: + return parser.MakeInformationSchemaColumnsNode(qSchemaTable, permissions) } // information_schema.* other system tables -> return as is return node } - // public.table -> FROM iceberg_scan('path') table - // schema.table -> FROM iceberg_scan('path') schema_table + // public.table -> (SELECT * FROM iceberg_scan('path')) table + // schema.table -> (SELECT * FROM iceberg_scan('path')) schema_table + // public.table -> (SELECT permitted, columns FROM iceberg_scan('path')) table + // public.table -> (SELECT NULL WHERE FALSE) table schemaTable := qSchemaTable.ToIcebergSchemaTable() if !remapper.IcebergPersistentSchemaTables.Contains(schemaTable) && !remapper.IcebergMaterlizedSchemaTables.Contains(schemaTable) { // Reload Iceberg tables if not found remapper.reloadIcebergTables() @@ -242,7 +241,7 @@ func (remapper *QueryRemapperTable) RemapTable(node *pgQuery.Node) *pgQuery.Node return parser.MakeIcebergTableNode(QueryToIcebergTable{ QuerySchemaTable: qSchemaTable, IcebergTablePath: icebergPath, - }) + }, permissions) } // FROM FUNCTION() @@ -266,6 +265,8 @@ func (remapper *QueryRemapperTable) reloadIcebergTables() { func (remapper *QueryRemapperTable) reloadIcebergPersistentTables() { newIcebergSchemaTables, err := remapper.icebergReader.SchemaTables() common.PanicIfError(remapper.config.CommonConfig, err) + + // Exclude materialized views for _, icebergSchemaTable := range remapper.IcebergMaterlizedSchemaTables.Values() { newIcebergSchemaTables.Remove(icebergSchemaTable) } diff --git a/src/syncer-postgres/config.go b/src/syncer-postgres/config.go index 9c9f6c7..9144fc6 100644 --- a/src/syncer-postgres/config.go +++ b/src/syncer-postgres/config.go @@ -20,7 +20,6 @@ const ( ENV_DATABASE_URL = "SOURCE_POSTGRES_DATABASE_URL" ENV_SYNC_MODE = "SOURCE_POSTGRES_SYNC_MODE" - ENV_INCLUDE_SCHEMAS = "SOURCE_POSTGRES_INCLUDE_SCHEMAS" ENV_INCLUDE_TABLES = "SOURCE_POSTGRES_INCLUDE_TABLES" ENV_EXCLUDE_TABLES = "SOURCE_POSTGRES_EXCLUDE_TABLES" ENV_CURSOR_COLUMNS = "SOURCE_POSTGRES_CURSOR_COLUMNS" // Incremental sync @@ -51,7 +50,6 @@ type Config struct { SyncMode SyncMode DatabaseUrl string - IncludeSchemas common.Set[string] IncludeTables common.Set[string] ExcludeTables common.Set[string] CursorColumnNameByTableName map[string]string // Incremental sync @@ -61,7 +59,6 @@ type Config struct { } type configParseValues struct { - IncludeSchemas string IncludeTables string ExcludeTables string IgnoreUpdateColumns string @@ -90,7 +87,6 @@ func registerFlags() { flag.StringVar(&_config.DestinationSchemaName, "destination-schema-name", os.Getenv(ENV_DESTINATION_SCHEMA_NAME), "Destination schema name to store the synced data") flag.StringVar(&_config.DatabaseUrl, "database-url", os.Getenv(ENV_DATABASE_URL), "PostgreSQL database URL") flag.StringVar((*string)(&_config.SyncMode), "sync-mode", os.Getenv(ENV_SYNC_MODE), `Sync mode: "FULL_REFRESH", "CDC", or "INCREMENTAL"`) - flag.StringVar(&_configParseValues.IncludeSchemas, "include-schemas", os.Getenv(ENV_INCLUDE_SCHEMAS), "Comma-separated list of schemas to include in the sync. Default: all schemas included") flag.StringVar(&_configParseValues.IncludeTables, "include-tables", os.Getenv(ENV_INCLUDE_TABLES), "Comma-separated list of tables to include in the sync. Default: all tables included") flag.StringVar(&_configParseValues.ExcludeTables, "exclude-tables", os.Getenv(ENV_EXCLUDE_TABLES), "Comma-separated list of tables to exclude from the sync. Default: no tables excluded") flag.StringVar(&_configParseValues.CursorColumns, "cursor-columns", os.Getenv(ENV_CURSOR_COLUMNS), "Cursor columns to use for incremental sync. Format: schema.table=column,schema2.table2=column2. Default: no cursor columns specified") @@ -137,9 +133,6 @@ func parseFlags() { if _config.DestinationSchemaName == "" { panic("Destination schema name is required") } - if _configParseValues.IncludeSchemas != "" { - _config.IncludeSchemas = common.NewSet[string]().AddAll(strings.Split(_configParseValues.IncludeSchemas, ",")) - } if _configParseValues.IncludeTables != "" && _configParseValues.ExcludeTables != "" { panic("Cannot specify both include-tables and exclude-tables. Please use one or the other.") } diff --git a/src/syncer-postgres/syncer_utils.go b/src/syncer-postgres/syncer_utils.go index f112918..c2b4a21 100644 --- a/src/syncer-postgres/syncer_utils.go +++ b/src/syncer-postgres/syncer_utils.go @@ -19,10 +19,6 @@ func NewSyncerUtils(config *Config, storageS3 *common.StorageS3, duckdbClient *c } func (utils *SyncerUtils) ShouldSyncTable(pgSchemaTable PgSchemaTable) bool { - if utils.Config.IncludeSchemas != nil && !utils.Config.IncludeSchemas.Contains(pgSchemaTable.Schema) { - return false - } - if utils.Config.IncludeTables != nil && !utils.Config.IncludeTables.Contains(pgSchemaTable.ToConfigArg()) { return false } From eb53fa4dc054bec68a460a732a4de5e2389faa3a Mon Sep 17 00:00:00 2001 From: exAspArk Date: Tue, 16 Sep 2025 19:37:15 -0400 Subject: [PATCH 15/24] Add support for ::JSONB type casting and WHERE 'val' = ANY(column) --- Dockerfile | 3 + Dockerfile.test | 3 + Makefile | 16 +- docker/bin-test/test.sh | 2 +- src/server/parser_a_expr.go | 9 +- src/server/parser_type_cast.go | 8 + src/server/query_handler_test.go | 8 +- src/server/query_remapper_expression.go | 7 +- src/syncer-amplitude/go.mod | 7 +- src/syncer-amplitude/{ => lib}/amplitude.go | 2 +- src/syncer-amplitude/{ => lib}/config.go | 18 +- src/syncer-amplitude/{ => lib}/event.go | 2 +- src/syncer-amplitude/lib/go.mod | 64 + src/syncer-amplitude/lib/go.sum | 1160 ++++++++++++++++ src/syncer-amplitude/{ => lib}/syncer.go | 16 +- src/syncer-amplitude/main.go | 11 +- src/syncer-attio/go.mod | 7 +- src/syncer-attio/{ => lib}/attio.go | 6 +- src/syncer-attio/{ => lib}/config.go | 18 +- src/syncer-attio/lib/go.mod | 64 + src/syncer-attio/lib/go.sum | 1160 ++++++++++++++++ src/syncer-attio/{ => lib}/parser.go | 2 +- src/syncer-attio/{ => lib}/record_company.go | 2 +- src/syncer-attio/{ => lib}/record_deal.go | 2 +- src/syncer-attio/{ => lib}/record_person.go | 2 +- src/syncer-attio/lib/syncer.go | 76 ++ src/syncer-attio/main.go | 11 +- src/syncer-attio/syncer.go | 73 -- src/syncer-postgres/go.mod | 5 +- src/syncer-postgres/{ => lib}/config.go | 18 +- src/syncer-postgres/{ => lib}/debezium.go | 2 +- src/syncer-postgres/lib/go.mod | 69 + src/syncer-postgres/lib/go.sum | 1166 +++++++++++++++++ src/syncer-postgres/{ => lib}/init_test.go | 415 +----- src/syncer-postgres/{ => lib}/nats.go | 2 +- .../{ => lib}/pg_schema_column.go | 2 +- .../{ => lib}/pg_schema_table.go | 2 +- src/syncer-postgres/{ => lib}/postgres.go | 2 +- src/syncer-postgres/{ => lib}/syncer.go | 2 +- .../{ => lib}/syncer_full_refresh.go | 2 +- src/syncer-postgres/{ => lib}/syncer_utils.go | 2 +- src/syncer-postgres/main.go | 9 +- 42 files changed, 3888 insertions(+), 569 deletions(-) rename src/syncer-amplitude/{ => lib}/amplitude.go (99%) rename src/syncer-amplitude/{ => lib}/config.go (98%) rename src/syncer-amplitude/{ => lib}/event.go (99%) create mode 100644 src/syncer-amplitude/lib/go.mod create mode 100644 src/syncer-amplitude/lib/go.sum rename src/syncer-amplitude/{ => lib}/syncer.go (90%) rename src/syncer-attio/{ => lib}/attio.go (96%) rename src/syncer-attio/{ => lib}/config.go (97%) create mode 100644 src/syncer-attio/lib/go.mod create mode 100644 src/syncer-attio/lib/go.sum rename src/syncer-attio/{ => lib}/parser.go (99%) rename src/syncer-attio/{ => lib}/record_company.go (99%) rename src/syncer-attio/{ => lib}/record_deal.go (99%) rename src/syncer-attio/{ => lib}/record_person.go (99%) create mode 100644 src/syncer-attio/lib/syncer.go delete mode 100644 src/syncer-attio/syncer.go rename src/syncer-postgres/{ => lib}/config.go (99%) rename src/syncer-postgres/{ => lib}/debezium.go (97%) create mode 100644 src/syncer-postgres/lib/go.mod create mode 100644 src/syncer-postgres/lib/go.sum rename src/syncer-postgres/{ => lib}/init_test.go (60%) rename src/syncer-postgres/{ => lib}/nats.go (97%) rename src/syncer-postgres/{ => lib}/pg_schema_column.go (99%) rename src/syncer-postgres/{ => lib}/pg_schema_table.go (98%) rename src/syncer-postgres/{ => lib}/postgres.go (99%) rename src/syncer-postgres/{ => lib}/syncer.go (99%) rename src/syncer-postgres/{ => lib}/syncer_full_refresh.go (99%) rename src/syncer-postgres/{ => lib}/syncer_utils.go (98%) diff --git a/Dockerfile b/Dockerfile index 5b2fbdb..93cd6e8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -37,12 +37,15 @@ RUN \ COPY --chown=app:app src/common/go.mod src/common/go.sum /app/src/common/ +COPY --chown=app:app src/syncer-postgres/lib/go.mod src/syncer-postgres/lib/go.sum /app/src/syncer-postgres/lib/ COPY --chown=app:app src/syncer-postgres/go.mod src/syncer-postgres/go.sum /app/src/syncer-postgres/ RUN cd /app/src/syncer-postgres && go mod download +COPY --chown=app:app src/syncer-amplitude/lib/go.mod src/syncer-amplitude/lib/go.sum /app/src/syncer-amplitude/lib/ COPY --chown=app:app src/syncer-amplitude/go.mod src/syncer-amplitude/go.sum /app/src/syncer-amplitude/ RUN cd /app/src/syncer-amplitude && go mod download +COPY --chown=app:app src/syncer-attio/lib/go.mod src/syncer-attio/lib/go.sum /app/src/syncer-attio/lib/ COPY --chown=app:app src/syncer-attio/go.mod src/syncer-attio/go.sum /app/src/syncer-attio/ RUN cd /app/src/syncer-attio && go mod download diff --git a/Dockerfile.test b/Dockerfile.test index 4879f11..ce60406 100644 --- a/Dockerfile.test +++ b/Dockerfile.test @@ -57,6 +57,9 @@ RUN \ COPY --chown=app:app src/common/go.mod src/common/go.sum /app/src/common/ +COPY --chown=app:app src/syncer-postgres/lib/go.mod src/syncer-postgres/lib/go.sum /app/src/syncer-postgres/lib/ +RUN cd /app/src/syncer-postgres/lib && go mod download + COPY --chown=app:app src/syncer-postgres/go.mod src/syncer-postgres/go.sum /app/src/syncer-postgres/ RUN cd /app/src/syncer-postgres && go mod download diff --git a/Makefile b/Makefile index 588296b..65fd3b1 100644 --- a/Makefile +++ b/Makefile @@ -3,17 +3,17 @@ sh: install: devbox run "cd src/common && go mod tidy && \ - cd ../syncer-postgres && go mod tidy && \ - cd ../syncer-amplitude && go mod tidy && \ - cd ../syncer-attio && go mod tidy && \ - cd ../server && go mod tidy" + cd ../syncer-postgres && go mod tidy && cd ../lib && go mod tidy && \ + cd ../../syncer-amplitude && go mod tidy && cd ./lib && go mod tidy && \ + cd ../../syncer-attio && go mod tidy && cd ./lib && go mod tidy && \ + cd ../../server && go mod tidy" lint: devbox run "cd src/common && go fmt && staticcheck . && \ - cd ../syncer-postgres && go fmt && deadcode . && staticcheck . && \ - cd ../syncer-amplitude && go fmt && deadcode . && staticcheck . && \ - cd ../syncer-attio && go fmt && deadcode . && staticcheck . && \ - cd ../server && go fmt && deadcode . && staticcheck ." + cd ../syncer-postgres && go fmt && deadcode . && staticcheck . && cd ./lib && go fmt && staticcheck . && \ + cd ../../syncer-amplitude && go fmt && deadcode . && staticcheck . && cd ./lib && go fmt && staticcheck . && \ + cd ../../syncer-attio && go fmt && deadcode . && staticcheck . && cd ./lib && go fmt && staticcheck . && \ + cd ../../server && go fmt && deadcode . && staticcheck ." build: ./scripts/build-docker.sh diff --git a/docker/bin-test/test.sh b/docker/bin-test/test.sh index fbf8d02..87280a5 100755 --- a/docker/bin-test/test.sh +++ b/docker/bin-test/test.sh @@ -22,7 +22,7 @@ trap 'kill -s TERM $postgres_pid $minio_pid 2>/dev/null' EXIT # kill children on /app/bin/minio_configure.sh # Seed data -cd /app/src/syncer-postgres +cd /app/src/syncer-postgres/lib SOURCE_POSTGRES_SYNC_MODE=FULL_REFRESH \ DESTINATION_SCHEMA_NAME=postgres \ go test -v ./... diff --git a/src/server/parser_a_expr.go b/src/server/parser_a_expr.go index 3d70051..6ac2204 100644 --- a/src/server/parser_a_expr.go +++ b/src/server/parser_a_expr.go @@ -86,8 +86,10 @@ func (parser *ParserAExpr) RightAConstValue(aExpr *pgQuery.A_Expr) string { return aExpr.Rexpr.GetAConst().GetSval().Sval } -// = ANY({schema_information}) -> IN (schema_information) -func (parser *ParserAExpr) ConvertedRightAnyToIn(node *pgQuery.Node) *pgQuery.Node { +// = ANY('{information_schema, ...}') -> IN ('information_schema', ...) +// +// DuckDB error: UNNEST() for correlated expressions is not supported yet +func (parser *ParserAExpr) ConvertedRightAnyStringConstantToIn(node *pgQuery.Node) *pgQuery.Node { aExpr := parser.AExpr(node) if aExpr.Kind != pgQuery.A_Expr_Kind_AEXPR_OP_ANY { @@ -95,8 +97,7 @@ func (parser *ParserAExpr) ConvertedRightAnyToIn(node *pgQuery.Node) *pgQuery.No } if aExpr.Rexpr.GetAConst() == nil { - // NOTE: ... = ANY() on non-constants is not fully supported yet - return parser.utils.MakeNullNode() + return node } arrayStr := aExpr.Rexpr.GetAConst().GetSval().Sval diff --git a/src/server/parser_type_cast.go b/src/server/parser_type_cast.go index fdbea92..6f6fd0e 100644 --- a/src/server/parser_type_cast.go +++ b/src/server/parser_type_cast.go @@ -49,6 +49,14 @@ func (parser *ParserTypeCast) TypeName(typeCast *pgQuery.TypeCast) string { return typeName } +func (parser *ParserTypeCast) SetTypeName(typeCast *pgQuery.TypeCast, typeName string) { + if typeCast == nil || len(typeCast.TypeName.Names) != 1 { + return + } + + typeCast.TypeName.Names[0] = pgQuery.MakeStrNode(typeName) +} + func (parser *ParserTypeCast) NestedTypeCast(typeCast *pgQuery.TypeCast) *pgQuery.TypeCast { return parser.TypeCast(typeCast.Arg) } diff --git a/src/server/query_handler_test.go b/src/server/query_handler_test.go index 10b1990..887250a 100644 --- a/src/server/query_handler_test.go +++ b/src/server/query_handler_test.go @@ -1126,6 +1126,11 @@ func TestHandleQuery(t *testing.T) { "types": {uint32ToString(pgtype.IntervalOID)}, "values": {"0 months 7 days 0 microseconds"}, }, + "SELECT '{\"key\": \"value\"}'::JSONB AS jsonb": { + "description": {"jsonb"}, + "types": {uint32ToString(pgtype.JSONOID)}, + "values": {"{\"key\":\"value\"}"}, + }, "SELECT date_trunc('month', '2025-02-24 15:58:23-05'::timestamptz + '-1 month'::interval) AS date": { "description": {"date"}, "types": {uint32ToString(pgtype.TimestamptzOID)}, @@ -1285,9 +1290,10 @@ func TestHandleQuery(t *testing.T) { t.Run("WHERE ANY(column reference)", func(t *testing.T) { testResponseByQuery(t, queryHandler, map[string]map[string][]string{ - "SELECT id FROM postgres.test_table WHERE id = ANY(id)": { // NOTE: ... = ANY() on non-constants is not fully supported yet + "SELECT id FROM postgres.test_table WHERE 'one' = ANY(array_text_column)": { "description": {"id"}, "types": {uint32ToString(pgtype.Int4OID)}, + "values": {"1"}, }, }) }) diff --git a/src/server/query_remapper_expression.go b/src/server/query_remapper_expression.go index bb4747b..c7bede5 100644 --- a/src/server/query_remapper_expression.go +++ b/src/server/query_remapper_expression.go @@ -63,6 +63,9 @@ func (remapper *QueryRemapperExpression) remappedTypeCast(node *pgQuery.Node) *p return node } return remapper.parserTypeCast.MakeSubselectOidBySchemaTableArg(nestedTypeCast.Arg) + case "jsonb": + // value::jsonb -> value::json + remapper.parserTypeCast.SetTypeName(typeCast, "json") case "text": // value::(regtype|regnamespace|regclass)::text -> value::text nestedTypeCast := remapper.parserTypeCast.NestedTypeCast(typeCast) @@ -83,8 +86,8 @@ func (remapper *QueryRemapperExpression) remappedArithmeticExpression(node *pgQu return node } - // = ANY({schema_information}) -> IN (schema_information) - node = remapper.parserAExpr.ConvertedRightAnyToIn(node) + // = ANY('{information_schema, ...}') -> IN ('information_schema', ...) + node = remapper.parserAExpr.ConvertedRightAnyStringConstantToIn(node) // pg_catalog.[operator] -> [operator] remapper.parserAExpr.RemovePgCatalog(node) diff --git a/src/syncer-amplitude/go.mod b/src/syncer-amplitude/go.mod index 9498c07..0cb7a1c 100644 --- a/src/syncer-amplitude/go.mod +++ b/src/syncer-amplitude/go.mod @@ -2,10 +2,15 @@ module github.com/BemiHQ/BemiDB/src/syncer-amplitude go 1.24.4 -require github.com/BemiHQ/BemiDB/src/common v0.0.0-00010101000000-000000000000 +require ( + github.com/BemiHQ/BemiDB/src/common v0.0.0-00010101000000-000000000000 + github.com/BemiHQ/BemiDB/src/syncer-amplitude/lib v0.0.0-00010101000000-000000000000 +) replace github.com/BemiHQ/BemiDB/src/common => ../common +replace github.com/BemiHQ/BemiDB/src/syncer-amplitude/lib => ./lib + require ( github.com/apache/arrow-go/v18 v18.4.0 // indirect github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 // indirect diff --git a/src/syncer-amplitude/amplitude.go b/src/syncer-amplitude/lib/amplitude.go similarity index 99% rename from src/syncer-amplitude/amplitude.go rename to src/syncer-amplitude/lib/amplitude.go index 725f98f..8efce64 100644 --- a/src/syncer-amplitude/amplitude.go +++ b/src/syncer-amplitude/lib/amplitude.go @@ -1,4 +1,4 @@ -package main +package amplitude import ( "archive/zip" diff --git a/src/syncer-amplitude/config.go b/src/syncer-amplitude/lib/config.go similarity index 98% rename from src/syncer-amplitude/config.go rename to src/syncer-amplitude/lib/config.go index fefe684..d64b00e 100644 --- a/src/syncer-amplitude/config.go +++ b/src/syncer-amplitude/lib/config.go @@ -1,4 +1,4 @@ -package main +package amplitude import ( "flag" @@ -35,11 +35,7 @@ type configParseValues struct { var _config Config var _configParseValues configParseValues -func init() { - registerFlags() -} - -func registerFlags() { +func RegisterFlags() { _config.CommonConfig = &common.CommonConfig{} flag.StringVar(&_config.CommonConfig.LogLevel, "log-level", os.Getenv(common.ENV_LOG_LEVEL), `Log level: "ERROR", "WARN", "INFO", "DEBUG", "TRACE". Default: "`+common.DEFAULT_LOG_LEVEL+`"`) @@ -57,6 +53,11 @@ func registerFlags() { flag.StringVar(&_configParseValues.StartDate, "start-date", os.Getenv(ENV_START_DATE), "Amplitude start date in YYYY-MM-DD format") } +func LoadConfig() *Config { + parseFlags() + return &_config +} + func parseFlags() { flag.Parse() @@ -103,8 +104,3 @@ func parseFlags() { } _config.StartDate = parsedStartDate } - -func LoadConfig() *Config { - parseFlags() - return &_config -} diff --git a/src/syncer-amplitude/event.go b/src/syncer-amplitude/lib/event.go similarity index 99% rename from src/syncer-amplitude/event.go rename to src/syncer-amplitude/lib/event.go index 6a6e74b..42e821f 100644 --- a/src/syncer-amplitude/event.go +++ b/src/syncer-amplitude/lib/event.go @@ -1,4 +1,4 @@ -package main +package amplitude import ( "github.com/BemiHQ/BemiDB/src/common" diff --git a/src/syncer-amplitude/lib/go.mod b/src/syncer-amplitude/lib/go.mod new file mode 100644 index 0000000..944a1c3 --- /dev/null +++ b/src/syncer-amplitude/lib/go.mod @@ -0,0 +1,64 @@ +module github.com/BemiHQ/BemiDB/src/syncer-amplitude/lib + +go 1.24.4 + +require github.com/BemiHQ/BemiDB/src/common v0.0.0-00010101000000-000000000000 + +replace github.com/BemiHQ/BemiDB/src/common => ../../common + +require ( + github.com/apache/arrow-go/v18 v18.4.0 // indirect + github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 // indirect + github.com/apache/thrift v0.22.0 // indirect + github.com/aws/aws-sdk-go-v2 v1.37.0 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 // indirect + github.com/aws/aws-sdk-go-v2/config v1.30.1 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.18.1 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0 // indirect + github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.26.0 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.35.0 // indirect + github.com/aws/smithy-go v1.22.5 // indirect + github.com/duckdb/duckdb-go-bindings v0.1.16 // indirect + github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11 // indirect + github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11 // indirect + github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11 // indirect + github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11 // indirect + github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11 // indirect + github.com/go-viper/mapstructure/v2 v2.3.0 // indirect + github.com/goccy/go-json v0.10.5 // indirect + github.com/golang/snappy v1.0.0 // indirect + github.com/google/flatbuffers v25.2.10+incompatible // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect + github.com/jackc/pgx/v5 v5.7.5 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.11 // indirect + github.com/linkedin/goavro v2.1.0+incompatible // indirect + github.com/marcboeker/go-duckdb/arrowmapping v0.0.9 // indirect + github.com/marcboeker/go-duckdb/mapping v0.0.10 // indirect + github.com/marcboeker/go-duckdb/v2 v2.3.2 // indirect + github.com/pierrec/lz4/v4 v4.1.22 // indirect + github.com/xitongsys/parquet-go v1.6.2 // indirect + github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b // indirect + github.com/zeebo/xxh3 v1.0.2 // indirect + golang.org/x/crypto v0.40.0 // indirect + golang.org/x/exp v0.0.0-20250718183923-645b1fa84792 // indirect + golang.org/x/mod v0.26.0 // indirect + golang.org/x/sync v0.16.0 // indirect + golang.org/x/sys v0.34.0 // indirect + golang.org/x/text v0.27.0 // indirect + golang.org/x/tools v0.35.0 // indirect + golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect +) diff --git a/src/syncer-amplitude/lib/go.sum b/src/syncer-amplitude/lib/go.sum new file mode 100644 index 0000000..79719d8 --- /dev/null +++ b/src/syncer-amplitude/lib/go.sum @@ -0,0 +1,1160 @@ +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.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.66.0/go.mod h1:dgqGAjKCDxyhGTtC9dAREQGUJpkceNm1yt590Qno0Ko= +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.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.82.0/go.mod h1:vlKccHJGuFBFufnAnuB08dfEH9Y3H7dzDzRECFdC2TA= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= +cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +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 v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= +cloud.google.com/go/compute v1.2.0/go.mod h1:xlogom/6gr8RJGBe7nT2eGsQYAFUbbv8dbC29qE3Xmw= +cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= +cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= +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/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= +cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= +cloud.google.com/go/iam v0.1.1/go.mod h1:CKqrcnI/suGpybEHxZ7BMehL0oA4LpdyJdUlTl9jVMw= +cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= +cloud.google.com/go/kms v1.1.0/go.mod h1:WdbppnCDMDpOvoYBMn1+gNmOeEoZYqAv+HeuKARGCXI= +cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= +cloud.google.com/go/monitoring v1.1.0/go.mod h1:L81pzz7HKn14QCMaCs6NTQkdBnE87TElyanS95vIcl4= +cloud.google.com/go/monitoring v1.4.0/go.mod h1:y6xnxfwI3hTFWOdkOaD7nfJVlwuC3/mS/5kvtT131p4= +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/pubsub v1.19.0/go.mod h1:/O9kmSe9bb9KRnIAWkzmqhPjHo6LtzGOBYd/kr06XSs= +cloud.google.com/go/secretmanager v1.3.0/go.mod h1:+oLTkouyiYiabAQNugCeTS3PAArGiMJuBqvJnJsyH+U= +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.12.0/go.mod h1:fFLk2dp2oAhDz8QFKwqrjdJvxSp/W2g7nillojlL5Ho= +cloud.google.com/go/storage v1.21.0/go.mod h1:XmRlxkgPjlBONznT2dDUU/5XlpU2OjMnKuqnZI01LAA= +cloud.google.com/go/trace v1.0.0/go.mod h1:4iErSByzxkyHWzzlAj63/Gmjz0NH1ASqhJguHpGcr6A= +cloud.google.com/go/trace v1.2.0/go.mod h1:Wc8y/uYyOhPy12KEnXG9XGrvfMz5F5SrYecQlbW1rwM= +contrib.go.opencensus.io/exporter/aws v0.0.0-20200617204711-c478e41e60e9/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= +contrib.go.opencensus.io/exporter/stackdriver v0.13.10/go.mod h1:I5htMbyta491eUxufwwZPQdcKvvgzMB4O9ni41YnIM8= +contrib.go.opencensus.io/integrations/ocsql v0.1.7/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/Azure/azure-amqp-common-go/v3 v3.2.1/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= +github.com/Azure/azure-amqp-common-go/v3 v3.2.2/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= +github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k= +github.com/Azure/azure-sdk-for-go v51.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v59.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.0.0/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.0.0/go.mod h1:+6sju8gk8FRmSajX3Oz4G5Gm7P+mbqE9FVaXXFYTkCM= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U= +github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.0.0/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.0.0/go.mod h1:ceIuwmxDWptoW3eCqSXlnPsZFKh4X+R38dWPv7GS9Vs= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.0.0/go.mod h1:s1tW/At+xHqjNFvWU4G0c0Qv33KOhvbGNj0RCTQDV8s= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.2.0/go.mod h1:c+Lifp3EDEamAkPVzMooRNOK6CZjNSdEnf1A7jsI9u4= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.1.0/go.mod h1:7QJP7dr2wznCMeqIrhMgWGf7XpAQnVrJqDm9nvV3Cu4= +github.com/Azure/azure-service-bus-go v0.11.5/go.mod h1:MI6ge2CuQWBVq+ly456MY7XqNLJip5LO1iSFodbNLbU= +github.com/Azure/azure-storage-blob-go v0.14.0/go.mod h1:SMqIBi+SuiQH32bvyjngEewEeXoPfKMgWlBDaYf6fck= +github.com/Azure/go-amqp v0.16.0/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= +github.com/Azure/go-amqp v0.16.4/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= +github.com/Azure/go-autorest/autorest v0.11.19/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= +github.com/Azure/go-autorest/autorest v0.11.22/go.mod h1:BAWYUWGPEtKPzjVkp0Q6an0MJcJDsoh5Z1BFAEFs4Xs= +github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= +github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/adal v0.9.14/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/adal v0.9.17/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= +github.com/Azure/go-autorest/autorest/azure/auth v0.5.9/go.mod h1:hg3/1yw0Bq87O3KvvnJoAh34/0zbP7SFizX/qN5JvjU= +github.com/Azure/go-autorest/autorest/azure/cli v0.4.2/go.mod h1:7qkJkT+j6b+hIpzMOwPChJhTqS8VbsqqgULzMNRugoM= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= +github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= +github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= +github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= +github.com/AzureAD/microsoft-authentication-library-for-go v0.4.0/go.mod h1:Vt9sXTKwMyGcOxSmLDMnGPgqsUg7m8pe215qMLrDXw4= +github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/GoogleCloudPlatform/cloudsql-proxy v1.29.0/go.mod h1:spvB9eLJH9dutlbPSRmHvSXXHOwGRyeXh1jVdquA2G8= +github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= +github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apache/arrow-go/v18 v18.4.0 h1:/RvkGqH517iY8bZKc4FD5/kkdwXJGjxf28JIXbJ/oB0= +github.com/apache/arrow-go/v18 v18.4.0/go.mod h1:Aawvwhj8x2jURIzD9Moy72cF0FyJXOpkYpdmGRHcw14= +github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 h1:byKBBF2CKWBjjA4J1ZL2JXttJULvWSl50LegTyRZ728= +github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516/go.mod h1:QNYViu/X0HXDHw7m3KXzWSVXIbfUvJqBFe6Gj8/pYA0= +github.com/apache/thrift v0.0.0-20181112125854-24918abba929/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.14.2/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.22.0 h1:r7mTJdj51TMDe6RtcmNdQxgn9XcyfGDOzegMDRg47uc= +github.com/apache/thrift v0.22.0/go.mod h1:1e7J/O1Ae6ZQMTYdy9xa3w9k+XHWPfRvdPyJeynQ+/g= +github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= +github.com/aws/aws-sdk-go v1.30.19/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= +github.com/aws/aws-sdk-go v1.37.0/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= +github.com/aws/aws-sdk-go v1.43.31 h1:yJZIr8nMV1hXjAvvOLUFqZRJcHV7udPQBfhJqawDzI0= +github.com/aws/aws-sdk-go v1.43.31/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= +github.com/aws/aws-sdk-go-v2 v1.16.2/go.mod h1:ytwTPBG6fXTZLxxeeCCWj2/EMYp/xDUgX+OET6TLNNU= +github.com/aws/aws-sdk-go-v2 v1.23.0/go.mod h1:i1XDttT4rnf6vxc9AuskLc6s7XBee8rlLilKlc03uAA= +github.com/aws/aws-sdk-go-v2 v1.37.0 h1:YtCOESR/pN4j5oA7cVHSfOwIcuh/KwHC4DOSXFbv5F0= +github.com/aws/aws-sdk-go-v2 v1.37.0/go.mod h1:9Q0OoGQoboYIAJyslFyF1f5K1Ryddop8gqMhWx/n4Wg= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.1/go.mod h1:n8Bs1ElDD2wJ9kCRTczA83gYbBmjSwZp3umc6zF4EeM= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.1/go.mod h1:t8PYl/6LzdAqsU4/9tz28V/kU+asFePvpOMkdul0gEQ= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 h1:6GMWV6CNpA/6fbFHnoAjrv4+LGfyTqZz2LtCHnspgDg= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0/go.mod h1:/mXlTIVG9jbxkqDnr5UQNQxW1HRYxeGklkM9vAFeabg= +github.com/aws/aws-sdk-go-v2/config v1.15.3/go.mod h1:9YL3v07Xc/ohTsxFXzan9ZpFpdTOFl4X65BAKYaz8jg= +github.com/aws/aws-sdk-go-v2/config v1.25.3/go.mod h1:tAByZy03nH5jcq0vZmkcVoo6tRzRHEwSFx3QW4NmDw8= +github.com/aws/aws-sdk-go-v2/config v1.30.1 h1:sHL8g/+9tcZATeV2tEkEfxZeaNokDtKsSjGMGHD49qA= +github.com/aws/aws-sdk-go-v2/config v1.30.1/go.mod h1:wkibEyFfxXRyTSzRU4bbF5IUsSXyE4xQ4ZjkGmi5tFo= +github.com/aws/aws-sdk-go-v2/credentials v1.11.2/go.mod h1:j8YsY9TXTm31k4eFhspiQicfXPLZ0gYXA50i4gxPE8g= +github.com/aws/aws-sdk-go-v2/credentials v1.16.2/go.mod h1:sDdvGhXrSVT5yzBDR7qXz+rhbpiMpUYfF3vJ01QSdrc= +github.com/aws/aws-sdk-go-v2/credentials v1.18.1 h1:E55xvOqlX7CvB66Z7rSM9usCrFU1ryUIUHqiXsEzVoE= +github.com/aws/aws-sdk-go-v2/credentials v1.18.1/go.mod h1:iobSQfR5MkvILxssGOvi/P1jjOhrRzfTiCPCzku0vx4= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.3/go.mod h1:uk1vhHHERfSVCUnqSqz8O48LBYDSC+k6brng09jcMOk= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.4/go.mod h1:t4i+yGHMCcUNIX1x7YVYa6bH/Do7civ5I6cG/6PMfyA= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0 h1:9sBTeKQwAvmJUWKIACIoiFSnxxl+sS++YDfr17/ngq0= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0/go.mod h1:LW9/PxQD1SYFC7pnWcgqPhoyZprhjEdg5hBK6qYPLW8= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.3/go.mod h1:0dHuD2HZZSiwfJSy1FO5bX1hQ1TxVV1QXXjpn3XUE44= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.14.0/go.mod h1:UcgIwJ9KHquYxs6Q5skC9qXjhYMK+JASDYcXQ4X7JZE= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1 h1:aAjA/1JZ1xH/F9XvxJu9cXZyp7BqVXtHpztyZ6p799E= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1/go.mod h1:ia9HASsPba/7o84sp6iE4wZPdNTJ0oicBe5sWQQk+Ys= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.9/go.mod h1:AnVH5pvai0pAF4lXRq0bmhbes1u9R8wTE+g+183bZNM= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.3/go.mod h1:7sGSz1JCKHWWBHq98m6sMtWQikmYPpxjqOydDemiVoM= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0 h1:H2iZoqW/v2Jnrh1FnU725Bq6KJ0k2uP63yH+DcY+HUI= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0/go.mod h1:L0FqLbwMXHvNC/7crWV1iIxUlOKYZUE8KuTIA+TozAI= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.3/go.mod h1:ssOhaLpRlh88H3UmEcsBoVKq309quMvm3Ds8e9d4eJM= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.3/go.mod h1:ify42Rb7nKeDDPkFjKn7q1bPscVPu/+gmHH8d2c+anU= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0 h1:EDped/rNzAhFPhVY0sDGbtD16OKqksfA8OjF/kLEgw8= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0/go.mod h1:uUI335jvzpZRPpjYx6ODc/wg1qH+NnoSTK/FwVeK0C0= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.10/go.mod h1:8DcYQcz0+ZJaSxANlHIsbbi6S+zMwjwdDqwW3r9AzaE= +github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.3/go.mod h1:5yzAuE9i2RkVAttBl8yxZgQr5OCq4D5yDnG7j9x2L0U= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0 h1:iLvW/zOkHGU3BDU5thWnj+UZ9pjhuVhv1loLj7yVtBw= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0/go.mod h1:Fn3gvhdF1x5Rs9nUoCy/fJT1ms8f8dO7RqM9lJHuazQ= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.1/go.mod h1:GeUru+8VzrTXV/83XyMJ80KpH8xO89VPoUileyNQ+tc= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1/go.mod h1:l9ymW25HOqymeU2m1gbUQ3rUIsTwKs8gYHXkqDQUhiI= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 h1:6+lZi2JeGKtCraAj1rpoZfKqnQ9SptseRZioejfUOLM= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0/go.mod h1:eb3gfbVIxIoGgJsi9pGne19dhCBpK6opTYpQqAmdy44= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.3/go.mod h1:Seb8KNmD6kVTjwRjVEgOT5hPin6sq+v4C2ycJQDwuH8= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.3/go.mod h1:R+/S1O4TYpcktbVwddeOYg+uwUfLhADP2S/x4QwsCTM= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0 h1:qGyLBQPphYzUf+IIlb5tHnvg1U2Vc5hXPcP7oRSQfy0= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0/go.mod h1:g+dzKSLXiR/8ATkPXmLhPOI6rDdjLP3tngeo3FvDcIw= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.3/go.mod h1:wlY6SVjuwvh3TVRpTqdy4I1JpBFLX4UGeKZdWntaocw= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.3/go.mod h1:Owv1I59vaghv1Ax8zz8ELY8DN7/Y0rGS+WWAmjgi950= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0 h1:eRhU3Sh8dGbaniI6B+I48XJMrTPRkK4DKo+vqIxziOU= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0/go.mod h1:paNLV18DZ6FnWE/bd06RIKPDIFpjuvCkGKWTG/GDBeM= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.3/go.mod h1:Bm/v2IaN6rZ+Op7zX+bOUMdL4fsrYZiD0dsjLhNKwZc= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.3/go.mod h1:KZgs2ny8HsxRIRbDwgvJcHHBZPOzQr/+NtGwnP+w2ec= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0 h1:6jusT+XCcvnD+Elxvm7bUf5sCMTpZEp3AKjYQ4tWJSo= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0/go.mod h1:LimGpdIF/sTBdgqwOEkrArXLCoTamK/9L9x8IKBFTIc= +github.com/aws/aws-sdk-go-v2/service/kms v1.16.3/go.mod h1:QuiHPBqlOFCi4LqdSskYYAWpQlx3PKmohy+rE2F+o5g= +github.com/aws/aws-sdk-go-v2/service/s3 v1.26.3/go.mod h1:g1qvDuRsJY+XghsV6zg00Z4KJ7DtFFCx8fJD2a491Ak= +github.com/aws/aws-sdk-go-v2/service/s3 v1.43.0/go.mod h1:NXRKkiRF+erX2hnybnVU660cYT5/KChRD4iUgJ97cI8= +github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0 h1:gAV4NEp4A+JOrIdoXkAeyy6IOo7+X2s/jRuaHKYiMaU= +github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0/go.mod h1:JIQwK8sZ5MuKGm5rrFwp9MHUcyYEsQNpVixuPDlnwaU= +github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.15.4/go.mod h1:PJc8s+lxyU8rrre0/4a0pn2wgwiDvOEzoOjcJUBr67o= +github.com/aws/aws-sdk-go-v2/service/sns v1.17.4/go.mod h1:kElt+uCcXxcqFyc+bQqZPFD9DME/eC6oHBXvFzQ9Bcw= +github.com/aws/aws-sdk-go-v2/service/sqs v1.18.3/go.mod h1:skmQo0UPvsjsuYYSYMVmrPc1HWCbHUJyrCEp+ZaLzqM= +github.com/aws/aws-sdk-go-v2/service/ssm v1.24.1/go.mod h1:NR/xoKjdbRJ+qx0pMR4mI+N/H1I1ynHwXnO6FowXJc0= +github.com/aws/aws-sdk-go-v2/service/sso v1.11.3/go.mod h1:7UQ/e69kU7LDPtY40OyoHYgRmgfGM4mgsLYtcObdveU= +github.com/aws/aws-sdk-go-v2/service/sso v1.17.2/go.mod h1:/pE21vno3q1h4bbhUOEi+6Zu/aT26UK2WKkDXd+TssQ= +github.com/aws/aws-sdk-go-v2/service/sso v1.26.0 h1:cuFWHH87GP1NBGXXfMicUbE7Oty5KpPxN6w4JpmuxYc= +github.com/aws/aws-sdk-go-v2/service/sso v1.26.0/go.mod h1:aJBemdlbCKyOXEXdXBqS7E+8S9XTDcOTaoOjtng54hA= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.20.0/go.mod h1:dWqm5G767qwKPuayKfzm4rjzFmVjiBFbOJrpSPnAMDs= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0 h1:t2va+wewPOYIqC6XyJ4MGjiGKkczMAPsgq5W4FtL9ME= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0/go.mod h1:ExCTcqYqN0hYYRsDlBVU8+68grqlWdgX9/nZJwQW4aY= +github.com/aws/aws-sdk-go-v2/service/sts v1.16.3/go.mod h1:bfBj0iVmsUyUg4weDB4NxktD9rDGeKSVWnjTnwbx9b8= +github.com/aws/aws-sdk-go-v2/service/sts v1.25.3/go.mod h1:4EqRHDCKP78hq3zOnmFXu5k0j4bXbRFfCh/zQ6KnEfQ= +github.com/aws/aws-sdk-go-v2/service/sts v1.35.0 h1:FD9agdG4CeOGS3ORLByJk56YIXDS7mxFpmZyCtpqExc= +github.com/aws/aws-sdk-go-v2/service/sts v1.35.0/go.mod h1:NDzDPbBF1xtSTZUMuZx0w3hIfWzcL7X2AQ0Tr9becIQ= +github.com/aws/smithy-go v1.11.2/go.mod h1:3xHYmszWVx2c0kIwQeEVf9uSm4fYZt67FBJnwub1bgM= +github.com/aws/smithy-go v1.17.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= +github.com/aws/smithy-go v1.22.5 h1:P9ATCXPMb2mPjYBgueqJNCA5S9UfktsW0tTxi+a7eqw= +github.com/aws/smithy-go v1.22.5/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/bobg/gcsobj v0.1.2/go.mod h1:vS49EQ1A1Ib8FgrL58C8xXYZyOCR2TgzAdopy6/ipa8= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +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/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/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= +github.com/colinmarc/hdfs/v2 v2.1.1/go.mod h1:M3x+k8UKKmxtFu++uAZ0OtDU8jR3jnaZIAc6yK4Ue0c= +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/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU= +github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= +github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= +github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= +github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= +github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= +github.com/duckdb/duckdb-go-bindings v0.1.16 h1:XPCk9hzP06PoWIxDPVU3gAy0m1XmLaZHTzLggNx/U9k= +github.com/duckdb/duckdb-go-bindings v0.1.16/go.mod h1:pBnfviMzANT/9hi4bg+zW4ykRZZPCXlVuvBWEcZofkc= +github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11 h1:GXQkG4HmEbwPtqCSabJTp9wZQQ7Gqr3KveLNesQWQOs= +github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11/go.mod h1:Ezo7IbAfB8NP7CqPIN8XEHKUg5xdRRQhcPPlCXImXYA= +github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11 h1:ATJMSBIDA/YAm/6CKeBDRtGK1OOwqfTZbWg9Y5fAc9E= +github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11/go.mod h1:eS7m/mLnPQgVF4za1+xTyorKRBuK0/BA44Oy6DgrGXI= +github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11 h1:AjvnGst1avyOECYiykthyHR4DTYTaqNDPr5W/0t5j0k= +github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11/go.mod h1:1GOuk1PixiESxLaCGFhag+oFi7aP+9W8byymRAvunBk= +github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11 h1:j3B1biawuhtxe2Chkiqcwf1Kxe8VJc8lLVmjBIcJrkI= +github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11/go.mod h1:o7crKMpT2eOIi5/FY6HPqaXcvieeLSqdXXaXbruGX7w= +github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11 h1:xR3vRE8y+48U6xDNkUlOfbl7/OTA7FVcDXJ+5vETuHU= +github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11/go.mod h1:IlOhJdVKUJCAPj3QsDszUo8DVdvp1nBFp4TUJVdw99s= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +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/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= +github.com/gin-gonic/gin v1.7.3/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= +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-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +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-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= +github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-viper/mapstructure/v2 v2.3.0 h1:27XbWsHIqhbdR5TIC911OfYvgSaW93HM+dX7970Q7jk= +github.com/go-viper/mapstructure/v2 v2.3.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= +github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= +github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-jwt/jwt/v4 v4.4.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188/go.mod h1:vXjM/+wXQnTPR4KqTKDgJukSZ6amVRtWMPEjE6sQoK8= +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/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/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +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.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= +github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +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/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/flatbuffers v25.2.10+incompatible h1:F3vclr7C3HpB1k9mxCGRMXq6FdUalZ6H/pNX4FP1v0Q= +github.com/google/flatbuffers v25.2.10+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +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.6/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.8/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/go-replayers/grpcreplay v1.1.0/go.mod h1:qzAvJ8/wi57zq7gWqaE6AwLM6miiXUQwP1S+I9icmhk= +github.com/google/go-replayers/httpreplay v1.1.1/go.mod h1:gN9GeLIs7l6NUoVaSSnv2RiqK1NiwAmD0MrKeC9IIks= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+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/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +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-20200905233945-acf8798be1f7/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-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210506205249-923b5ab0fc1a/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.2.0/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.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/wire v0.5.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU= +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.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/hanwen/go-fuse v1.0.0/go.mod h1:unqXarDXqzAk0rt98O2tVndEPIpUgLD9+rwFisZH3Ok= +github.com/hanwen/go-fuse/v2 v2.1.0/go.mod h1:oRyA5eK+pvJyv5otpO/DgccS8y/RvYMaO00GgRLGryc= +github.com/hashicorp/go-uuid v0.0.0-20180228145832-27454136f036/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +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/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/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.11.0/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= +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/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.2.0/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-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/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.10.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.15.0/go.mod h1:D/zyOyXiaM1TmVWnOM18p0xdDtdakRBa0RsVGI3U3bw= +github.com/jackc/pgx/v5 v5.7.5 h1:JHGfMnQY+IEtGM63d+NGMjoRpysB2JBwDr5fsngwmJs= +github.com/jackc/pgx/v5 v5.7.5/go.mod h1:aruU7o91Tc2q2cFp5h4uP3f6ztExVpyVv88Xl/8Vl8M= +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.2.1 h1:gI8os0wpRXFd4FiAY2dWiqRK037tjj3t7rKFeO4X5iw= +github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= +github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/jcmturner/gofork v0.0.0-20180107083740-2aebee971930/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= +github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +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/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= +github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= +github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.13.1/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/klauspost/cpuid/v2 v2.2.11 h1:0OwqZRYI2rFrjS4kvkDnqJkKHdHaRnCm68/DY4OxRzU= +github.com/klauspost/cpuid/v2 v2.2.11/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= +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/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +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/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +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.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/linkedin/goavro v2.1.0+incompatible h1:DV2aUlj2xZiuxQyvag8Dy7zjY69ENjS66bWkSfdpddY= +github.com/linkedin/goavro v2.1.0+incompatible/go.mod h1:bBCwI2eGYpUI/4820s67MElg9tdeLbINjLjiM2xZFYM= +github.com/marcboeker/go-duckdb/arrowmapping v0.0.9 h1:xj+kFOqR2gH3Mcxx9LmAVHebSnCiPm303N+uxfkWVmY= +github.com/marcboeker/go-duckdb/arrowmapping v0.0.9/go.mod h1:o56AqVS90v5bpxhPnOK9La7AfNTOrMORiqTQrlRbdPQ= +github.com/marcboeker/go-duckdb/mapping v0.0.10 h1:b/y2W8/hNlD0Dwjq0mCqIlLXpjQMnWy0WqDV9b9lHQQ= +github.com/marcboeker/go-duckdb/mapping v0.0.10/go.mod h1:Ro6Tw6sGG50O8S0daZsA8TrQJz/DvGrzGvMD7Jihirw= +github.com/marcboeker/go-duckdb/v2 v2.3.2 h1:96zG2JPyIhCFjHdBjjSpOdhzJzehoGTdl7LskkuMUTs= +github.com/marcboeker/go-duckdb/v2 v2.3.2/go.mod h1:VeXz9ZM6klNvICHrXEUzaHSgNqBeTdyMxr4CICw/UaY= +github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= +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.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= +github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= +github.com/minio/minio-go/v7 v7.0.34/go.mod h1:nCrRzjoSUQh8hgKKtu3Y708OLvRLtuASMg2/nvmbarw= +github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= +github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/ncw/swift v1.0.52/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= +github.com/pborman/getopt v0.0.0-20180729010549-6fdd0a2c7117/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= +github.com/pierrec/lz4/v4 v4.1.8/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= +github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= +github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +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/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +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/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.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +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/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +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.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +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.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/xitongsys/parquet-go v1.5.1/go.mod h1:xUxwM8ELydxh4edHGegYq1pA8NnMKDx0K/GyB0o2bww= +github.com/xitongsys/parquet-go v1.6.2 h1:MhCaXii4eqceKPu9BwrjLqyK10oX9WF+xGhwvwbw7xM= +github.com/xitongsys/parquet-go v1.6.2/go.mod h1:IulAQyalCm0rPiZVNnCgm/PCL64X2tdSVGMQ/UeKqWA= +github.com/xitongsys/parquet-go-source v0.0.0-20190524061010-2b72cbee77d5/go.mod h1:xxCx7Wpym/3QCo6JhujJX51dzSXrwmb0oH6FQb39SEA= +github.com/xitongsys/parquet-go-source v0.0.0-20200817004010-026bad9b25d0/go.mod h1:HYhIKsdns7xz80OgkbgJYrtQY7FjHWHKH6cvN7+czGE= +github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b h1:zbb5qM/t3N+O33Vp5sFyG6yIcWZV1q7rfEjJM8UsRBQ= +github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b/go.mod h1:2ActxmJ4q17Cdruar9nKEkzKSOL1Ol03737Bkz10rTY= +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.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= +github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= +github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= +github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= +go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0= +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.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +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/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +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.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= +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.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= +gocloud.dev v0.26.0/go.mod h1:mkUgejbnbLotorqDyvedJO20XcZNTynmSeVSQS9btVg= +golang.org/x/crypto v0.0.0-20180723164146-c126467f60eb/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +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-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/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-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-20211115234514-b4de73f9ece8/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220511200225-c6db032c6c88/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM= +golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY= +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-20250718183923-645b1fa84792 h1:R9PFI6EUdfVKgwKjZef7QIwGcBKu86OEFpJ9nUEP2l4= +golang.org/x/exp v0.0.0-20250718183923-645b1fa84792/go.mod h1:A+z0yzpGtvnG90cToK5n2tu8UJVP2XUATh+r+sfOOOc= +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/lint v0.0.0-20210508222113-6edffad5e616/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.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg= +golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ= +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-20191112182307-2180aed22343/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-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +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-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211020060615-d418f374d309/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220401154927-543a649e0bdd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +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.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +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.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +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-20210220032951-036812b2e83c/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.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= +golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +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-20191112214154-59a1497f0cea/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-20200828194041-157a740278f4/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-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/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-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/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-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220204135822-1c1b9b1eba6a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220330033206-e17cdc41300f/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-20220704084225-05e143d24a9e/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.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA= +golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +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/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +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.5/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.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4= +golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU= +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/time v0.0.0-20211116232009-f0f3c7e86c11/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220224211638-0e9765cccd65/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-20190422233926-fe54fb35175b/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-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-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-20200828161849-5deb26317202/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20200915173823-2db8f0ff891c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20200918232735-d647fc253266/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +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.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0= +golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw= +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= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +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.31.0/go.mod h1:CL+9IBCa2WWU6gRuBWaKqGWLFFwbEUXkfeMkHLQWYWo= +google.golang.org/api v0.32.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +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.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.46.0/go.mod h1:ceL4oozhkAiTID8XMmJBsIxID/9wMXJVVFXPg4ylg3I= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.58.0/go.mod h1:cAbP2FsxoGVNwtgNAmmn3y5G1TWAiVYRmg4yku3lv+E= +google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.64.0/go.mod h1:931CdxA8Rm4t6zqTFGSsgwbAEZ2+GMYurbndwSimebM= +google.golang.org/api v0.66.0/go.mod h1:I1dmXYpX7HGwz/ejRxwQp2qj5bFAz93HiCU1C1oYd9M= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.68.0/go.mod h1:sOM8pTpwgflXRhz+oC8H2Dr+UcbMqkPPWNJo88Q7TH8= +google.golang.org/api v0.69.0/go.mod h1:boanBiw+h5c3s+tBPgEzLDRHfFLWV0qXxRHz3ws7C80= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= +google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +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/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-20200513103714-09dca8ec2884/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-20200831141814-d751682dd103/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-20200914193844-75d14daec038/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200921151605-7abf4a1a14d5/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-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210429181445-86c259c2b4ab/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210517163617-5e0236093d7a/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210921142501-181ce0d877f6/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211018162055-cf77aa76bad2/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211223182754-3ac035c7e7cb/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220111164026-67b88f271998/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220114231437-d2e6a121cae0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220201184016-50beb8ab5c44/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220204002441-d6cc3cc0770e/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220211171837-173942840c17/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220216160803-4663080d8bc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220401170504-314d38edb7de/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +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.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +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.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +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.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +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-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= +gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= +gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q= +gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mNfM5bm88whjWx4= +gopkg.in/jcmturner/gokrb5.v7 v7.3.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= +gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8= +gopkg.in/linkedin/goavro.v1 v1.0.5 h1:BJa69CDh0awSsLUmZ9+BowBdokpduDZSM9Zk8oKHfN4= +gopkg.in/linkedin/goavro.v1 v1.0.5/go.mod h1:Aw5GdAbizjOEl0kAMHV9iHmA8reZzW/OKuJAl4Hb9F0= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/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/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= +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= +nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= +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/src/syncer-amplitude/syncer.go b/src/syncer-amplitude/lib/syncer.go similarity index 90% rename from src/syncer-amplitude/syncer.go rename to src/syncer-amplitude/lib/syncer.go index eabea9b..936d19d 100644 --- a/src/syncer-amplitude/syncer.go +++ b/src/syncer-amplitude/lib/syncer.go @@ -1,4 +1,4 @@ -package main +package amplitude import ( "strings" @@ -23,10 +23,7 @@ type Syncer struct { DuckdbClient *common.DuckdbClient } -func NewSyncer(config *Config) *Syncer { - storageS3 := common.NewStorageS3(config.CommonConfig) - duckdbClient := common.NewDuckdbClient(config.CommonConfig, common.SYNCER_DUCKDB_BOOT_QUERIES) - +func NewSyncer(config *Config, storageS3 *common.StorageS3, duckdbClient *common.DuckdbClient) *Syncer { return &Syncer{ Config: config, Amplitude: NewAmplitude(config), @@ -72,12 +69,15 @@ func (syncer *Syncer) Sync() { jsonQueueWriter.Close() }() - // Read from cappedBuffer and write to Iceberg + syncer.WriteToIceberg(icebergTable, cursorValue, cappedBuffer) + + common.SendAnonymousAnalytics(syncer.Config.CommonConfig, "syncer-amplitude-finish", syncer.name()) +} + +func (syncer *Syncer) WriteToIceberg(icebergTable *common.IcebergTable, cursorValue common.CursorValue, cappedBuffer *common.CappedBuffer) { icebergSchemaColumns := EventsIcebergSchemaColumns(syncer.Config.CommonConfig) icebergTableWriter := common.NewIcebergTableWriter(syncer.Config.CommonConfig, syncer.StorageS3, syncer.DuckdbClient, icebergTable, icebergSchemaColumns, COMPRESSION_FACTOR) icebergTableWriter.AppendFromJsonCappedBuffer(cursorValue, cappedBuffer) - - common.SendAnonymousAnalytics(syncer.Config.CommonConfig, "syncer-amplitude-finish", syncer.name()) } func (syncer *Syncer) name() string { diff --git a/src/syncer-amplitude/main.go b/src/syncer-amplitude/main.go index 175e944..9b54235 100644 --- a/src/syncer-amplitude/main.go +++ b/src/syncer-amplitude/main.go @@ -2,12 +2,19 @@ package main import ( "github.com/BemiHQ/BemiDB/src/common" + "github.com/BemiHQ/BemiDB/src/syncer-amplitude/lib" ) +func init() { + amplitude.RegisterFlags() +} + func main() { - config := LoadConfig() + config := amplitude.LoadConfig() defer common.HandleUnexpectedPanic(config.CommonConfig) - syncer := NewSyncer(config) + storageS3 := common.NewStorageS3(config.CommonConfig) + duckdbClient := common.NewDuckdbClient(config.CommonConfig, common.SYNCER_DUCKDB_BOOT_QUERIES) + syncer := amplitude.NewSyncer(config, storageS3, duckdbClient) syncer.Sync() } diff --git a/src/syncer-attio/go.mod b/src/syncer-attio/go.mod index eeef2a6..fcd7ff5 100644 --- a/src/syncer-attio/go.mod +++ b/src/syncer-attio/go.mod @@ -2,10 +2,15 @@ module github.com/BemiHQ/BemiDB/src/syncer-attio go 1.24.4 -require github.com/BemiHQ/BemiDB/src/common v0.0.0-00010101000000-000000000000 +require ( + github.com/BemiHQ/BemiDB/src/common v0.0.0-00010101000000-000000000000 + github.com/BemiHQ/BemiDB/src/syncer-attio/lib v0.0.0-00010101000000-000000000000 +) replace github.com/BemiHQ/BemiDB/src/common => ../common +replace github.com/BemiHQ/BemiDB/src/syncer-attio/lib => ./lib + require ( github.com/apache/arrow-go/v18 v18.4.0 // indirect github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 // indirect diff --git a/src/syncer-attio/attio.go b/src/syncer-attio/lib/attio.go similarity index 96% rename from src/syncer-attio/attio.go rename to src/syncer-attio/lib/attio.go index 898f1ec..e6345be 100644 --- a/src/syncer-attio/attio.go +++ b/src/syncer-attio/lib/attio.go @@ -1,4 +1,4 @@ -package main +package attio import ( "encoding/json" @@ -98,9 +98,9 @@ func (attio *Attio) Load(object string, jsonQueueWriter *common.JsonQueueWriter) } } case ATTIO_OBJECT_PEOPLE: - for _, rawDeal := range response.Data { + for _, rawPerson := range response.Data { var person RecordPerson - err = json.Unmarshal(rawDeal, &person) + err = json.Unmarshal(rawPerson, &person) if err != nil { return err } diff --git a/src/syncer-attio/config.go b/src/syncer-attio/lib/config.go similarity index 97% rename from src/syncer-attio/config.go rename to src/syncer-attio/lib/config.go index bf4cc3e..c2d6385 100644 --- a/src/syncer-attio/config.go +++ b/src/syncer-attio/lib/config.go @@ -1,4 +1,4 @@ -package main +package attio import ( "flag" @@ -22,11 +22,7 @@ type Config struct { var _config Config -func init() { - registerFlags() -} - -func registerFlags() { +func RegisterFlags() { _config.CommonConfig = &common.CommonConfig{} flag.StringVar(&_config.CommonConfig.LogLevel, "log-level", os.Getenv(common.ENV_LOG_LEVEL), `Log level: "ERROR", "WARN", "INFO", "DEBUG", "TRACE". Default: "`+common.DEFAULT_LOG_LEVEL+`"`) @@ -42,6 +38,11 @@ func registerFlags() { flag.StringVar(&_config.ApiAccessToken, "api-access-token", os.Getenv(ENV_API_ACCESS_TOKEN), "Attio API Key") } +func LoadConfig() *Config { + parseFlags() + return &_config +} + func parseFlags() { flag.Parse() @@ -76,8 +77,3 @@ func parseFlags() { panic("Attio API key is required") } } - -func LoadConfig() *Config { - parseFlags() - return &_config -} diff --git a/src/syncer-attio/lib/go.mod b/src/syncer-attio/lib/go.mod new file mode 100644 index 0000000..f4159f1 --- /dev/null +++ b/src/syncer-attio/lib/go.mod @@ -0,0 +1,64 @@ +module github.com/BemiHQ/BemiDB/src/syncer-attio/lib + +go 1.24.4 + +require github.com/BemiHQ/BemiDB/src/common v0.0.0-00010101000000-000000000000 + +replace github.com/BemiHQ/BemiDB/src/common => ../../common + +require ( + github.com/apache/arrow-go/v18 v18.4.0 // indirect + github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 // indirect + github.com/apache/thrift v0.22.0 // indirect + github.com/aws/aws-sdk-go-v2 v1.37.0 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 // indirect + github.com/aws/aws-sdk-go-v2/config v1.30.1 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.18.1 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0 // indirect + github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.26.0 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.35.0 // indirect + github.com/aws/smithy-go v1.22.5 // indirect + github.com/duckdb/duckdb-go-bindings v0.1.16 // indirect + github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11 // indirect + github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11 // indirect + github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11 // indirect + github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11 // indirect + github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11 // indirect + github.com/go-viper/mapstructure/v2 v2.3.0 // indirect + github.com/goccy/go-json v0.10.5 // indirect + github.com/golang/snappy v1.0.0 // indirect + github.com/google/flatbuffers v25.2.10+incompatible // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect + github.com/jackc/pgx/v5 v5.7.5 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.11 // indirect + github.com/linkedin/goavro v2.1.0+incompatible // indirect + github.com/marcboeker/go-duckdb/arrowmapping v0.0.9 // indirect + github.com/marcboeker/go-duckdb/mapping v0.0.10 // indirect + github.com/marcboeker/go-duckdb/v2 v2.3.2 // indirect + github.com/pierrec/lz4/v4 v4.1.22 // indirect + github.com/xitongsys/parquet-go v1.6.2 // indirect + github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b // indirect + github.com/zeebo/xxh3 v1.0.2 // indirect + golang.org/x/crypto v0.37.0 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.25.0 // indirect + golang.org/x/sync v0.15.0 // indirect + golang.org/x/sys v0.33.0 // indirect + golang.org/x/text v0.26.0 // indirect + golang.org/x/tools v0.34.0 // indirect + golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect +) diff --git a/src/syncer-attio/lib/go.sum b/src/syncer-attio/lib/go.sum new file mode 100644 index 0000000..74c3ead --- /dev/null +++ b/src/syncer-attio/lib/go.sum @@ -0,0 +1,1160 @@ +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.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.66.0/go.mod h1:dgqGAjKCDxyhGTtC9dAREQGUJpkceNm1yt590Qno0Ko= +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.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.82.0/go.mod h1:vlKccHJGuFBFufnAnuB08dfEH9Y3H7dzDzRECFdC2TA= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= +cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +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 v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= +cloud.google.com/go/compute v1.2.0/go.mod h1:xlogom/6gr8RJGBe7nT2eGsQYAFUbbv8dbC29qE3Xmw= +cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= +cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= +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/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= +cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= +cloud.google.com/go/iam v0.1.1/go.mod h1:CKqrcnI/suGpybEHxZ7BMehL0oA4LpdyJdUlTl9jVMw= +cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= +cloud.google.com/go/kms v1.1.0/go.mod h1:WdbppnCDMDpOvoYBMn1+gNmOeEoZYqAv+HeuKARGCXI= +cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= +cloud.google.com/go/monitoring v1.1.0/go.mod h1:L81pzz7HKn14QCMaCs6NTQkdBnE87TElyanS95vIcl4= +cloud.google.com/go/monitoring v1.4.0/go.mod h1:y6xnxfwI3hTFWOdkOaD7nfJVlwuC3/mS/5kvtT131p4= +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/pubsub v1.19.0/go.mod h1:/O9kmSe9bb9KRnIAWkzmqhPjHo6LtzGOBYd/kr06XSs= +cloud.google.com/go/secretmanager v1.3.0/go.mod h1:+oLTkouyiYiabAQNugCeTS3PAArGiMJuBqvJnJsyH+U= +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.12.0/go.mod h1:fFLk2dp2oAhDz8QFKwqrjdJvxSp/W2g7nillojlL5Ho= +cloud.google.com/go/storage v1.21.0/go.mod h1:XmRlxkgPjlBONznT2dDUU/5XlpU2OjMnKuqnZI01LAA= +cloud.google.com/go/trace v1.0.0/go.mod h1:4iErSByzxkyHWzzlAj63/Gmjz0NH1ASqhJguHpGcr6A= +cloud.google.com/go/trace v1.2.0/go.mod h1:Wc8y/uYyOhPy12KEnXG9XGrvfMz5F5SrYecQlbW1rwM= +contrib.go.opencensus.io/exporter/aws v0.0.0-20200617204711-c478e41e60e9/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= +contrib.go.opencensus.io/exporter/stackdriver v0.13.10/go.mod h1:I5htMbyta491eUxufwwZPQdcKvvgzMB4O9ni41YnIM8= +contrib.go.opencensus.io/integrations/ocsql v0.1.7/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/Azure/azure-amqp-common-go/v3 v3.2.1/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= +github.com/Azure/azure-amqp-common-go/v3 v3.2.2/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= +github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k= +github.com/Azure/azure-sdk-for-go v51.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v59.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.0.0/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.0.0/go.mod h1:+6sju8gk8FRmSajX3Oz4G5Gm7P+mbqE9FVaXXFYTkCM= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U= +github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.0.0/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.0.0/go.mod h1:ceIuwmxDWptoW3eCqSXlnPsZFKh4X+R38dWPv7GS9Vs= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.0.0/go.mod h1:s1tW/At+xHqjNFvWU4G0c0Qv33KOhvbGNj0RCTQDV8s= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.2.0/go.mod h1:c+Lifp3EDEamAkPVzMooRNOK6CZjNSdEnf1A7jsI9u4= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.1.0/go.mod h1:7QJP7dr2wznCMeqIrhMgWGf7XpAQnVrJqDm9nvV3Cu4= +github.com/Azure/azure-service-bus-go v0.11.5/go.mod h1:MI6ge2CuQWBVq+ly456MY7XqNLJip5LO1iSFodbNLbU= +github.com/Azure/azure-storage-blob-go v0.14.0/go.mod h1:SMqIBi+SuiQH32bvyjngEewEeXoPfKMgWlBDaYf6fck= +github.com/Azure/go-amqp v0.16.0/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= +github.com/Azure/go-amqp v0.16.4/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= +github.com/Azure/go-autorest/autorest v0.11.19/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= +github.com/Azure/go-autorest/autorest v0.11.22/go.mod h1:BAWYUWGPEtKPzjVkp0Q6an0MJcJDsoh5Z1BFAEFs4Xs= +github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= +github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/adal v0.9.14/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/adal v0.9.17/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= +github.com/Azure/go-autorest/autorest/azure/auth v0.5.9/go.mod h1:hg3/1yw0Bq87O3KvvnJoAh34/0zbP7SFizX/qN5JvjU= +github.com/Azure/go-autorest/autorest/azure/cli v0.4.2/go.mod h1:7qkJkT+j6b+hIpzMOwPChJhTqS8VbsqqgULzMNRugoM= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= +github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= +github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= +github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= +github.com/AzureAD/microsoft-authentication-library-for-go v0.4.0/go.mod h1:Vt9sXTKwMyGcOxSmLDMnGPgqsUg7m8pe215qMLrDXw4= +github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/GoogleCloudPlatform/cloudsql-proxy v1.29.0/go.mod h1:spvB9eLJH9dutlbPSRmHvSXXHOwGRyeXh1jVdquA2G8= +github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= +github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apache/arrow-go/v18 v18.4.0 h1:/RvkGqH517iY8bZKc4FD5/kkdwXJGjxf28JIXbJ/oB0= +github.com/apache/arrow-go/v18 v18.4.0/go.mod h1:Aawvwhj8x2jURIzD9Moy72cF0FyJXOpkYpdmGRHcw14= +github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 h1:byKBBF2CKWBjjA4J1ZL2JXttJULvWSl50LegTyRZ728= +github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516/go.mod h1:QNYViu/X0HXDHw7m3KXzWSVXIbfUvJqBFe6Gj8/pYA0= +github.com/apache/thrift v0.0.0-20181112125854-24918abba929/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.14.2/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.22.0 h1:r7mTJdj51TMDe6RtcmNdQxgn9XcyfGDOzegMDRg47uc= +github.com/apache/thrift v0.22.0/go.mod h1:1e7J/O1Ae6ZQMTYdy9xa3w9k+XHWPfRvdPyJeynQ+/g= +github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= +github.com/aws/aws-sdk-go v1.30.19/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= +github.com/aws/aws-sdk-go v1.37.0/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= +github.com/aws/aws-sdk-go v1.43.31 h1:yJZIr8nMV1hXjAvvOLUFqZRJcHV7udPQBfhJqawDzI0= +github.com/aws/aws-sdk-go v1.43.31/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= +github.com/aws/aws-sdk-go-v2 v1.16.2/go.mod h1:ytwTPBG6fXTZLxxeeCCWj2/EMYp/xDUgX+OET6TLNNU= +github.com/aws/aws-sdk-go-v2 v1.23.0/go.mod h1:i1XDttT4rnf6vxc9AuskLc6s7XBee8rlLilKlc03uAA= +github.com/aws/aws-sdk-go-v2 v1.37.0 h1:YtCOESR/pN4j5oA7cVHSfOwIcuh/KwHC4DOSXFbv5F0= +github.com/aws/aws-sdk-go-v2 v1.37.0/go.mod h1:9Q0OoGQoboYIAJyslFyF1f5K1Ryddop8gqMhWx/n4Wg= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.1/go.mod h1:n8Bs1ElDD2wJ9kCRTczA83gYbBmjSwZp3umc6zF4EeM= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.1/go.mod h1:t8PYl/6LzdAqsU4/9tz28V/kU+asFePvpOMkdul0gEQ= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 h1:6GMWV6CNpA/6fbFHnoAjrv4+LGfyTqZz2LtCHnspgDg= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0/go.mod h1:/mXlTIVG9jbxkqDnr5UQNQxW1HRYxeGklkM9vAFeabg= +github.com/aws/aws-sdk-go-v2/config v1.15.3/go.mod h1:9YL3v07Xc/ohTsxFXzan9ZpFpdTOFl4X65BAKYaz8jg= +github.com/aws/aws-sdk-go-v2/config v1.25.3/go.mod h1:tAByZy03nH5jcq0vZmkcVoo6tRzRHEwSFx3QW4NmDw8= +github.com/aws/aws-sdk-go-v2/config v1.30.1 h1:sHL8g/+9tcZATeV2tEkEfxZeaNokDtKsSjGMGHD49qA= +github.com/aws/aws-sdk-go-v2/config v1.30.1/go.mod h1:wkibEyFfxXRyTSzRU4bbF5IUsSXyE4xQ4ZjkGmi5tFo= +github.com/aws/aws-sdk-go-v2/credentials v1.11.2/go.mod h1:j8YsY9TXTm31k4eFhspiQicfXPLZ0gYXA50i4gxPE8g= +github.com/aws/aws-sdk-go-v2/credentials v1.16.2/go.mod h1:sDdvGhXrSVT5yzBDR7qXz+rhbpiMpUYfF3vJ01QSdrc= +github.com/aws/aws-sdk-go-v2/credentials v1.18.1 h1:E55xvOqlX7CvB66Z7rSM9usCrFU1ryUIUHqiXsEzVoE= +github.com/aws/aws-sdk-go-v2/credentials v1.18.1/go.mod h1:iobSQfR5MkvILxssGOvi/P1jjOhrRzfTiCPCzku0vx4= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.3/go.mod h1:uk1vhHHERfSVCUnqSqz8O48LBYDSC+k6brng09jcMOk= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.4/go.mod h1:t4i+yGHMCcUNIX1x7YVYa6bH/Do7civ5I6cG/6PMfyA= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0 h1:9sBTeKQwAvmJUWKIACIoiFSnxxl+sS++YDfr17/ngq0= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0/go.mod h1:LW9/PxQD1SYFC7pnWcgqPhoyZprhjEdg5hBK6qYPLW8= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.3/go.mod h1:0dHuD2HZZSiwfJSy1FO5bX1hQ1TxVV1QXXjpn3XUE44= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.14.0/go.mod h1:UcgIwJ9KHquYxs6Q5skC9qXjhYMK+JASDYcXQ4X7JZE= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1 h1:aAjA/1JZ1xH/F9XvxJu9cXZyp7BqVXtHpztyZ6p799E= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1/go.mod h1:ia9HASsPba/7o84sp6iE4wZPdNTJ0oicBe5sWQQk+Ys= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.9/go.mod h1:AnVH5pvai0pAF4lXRq0bmhbes1u9R8wTE+g+183bZNM= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.3/go.mod h1:7sGSz1JCKHWWBHq98m6sMtWQikmYPpxjqOydDemiVoM= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0 h1:H2iZoqW/v2Jnrh1FnU725Bq6KJ0k2uP63yH+DcY+HUI= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0/go.mod h1:L0FqLbwMXHvNC/7crWV1iIxUlOKYZUE8KuTIA+TozAI= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.3/go.mod h1:ssOhaLpRlh88H3UmEcsBoVKq309quMvm3Ds8e9d4eJM= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.3/go.mod h1:ify42Rb7nKeDDPkFjKn7q1bPscVPu/+gmHH8d2c+anU= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0 h1:EDped/rNzAhFPhVY0sDGbtD16OKqksfA8OjF/kLEgw8= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0/go.mod h1:uUI335jvzpZRPpjYx6ODc/wg1qH+NnoSTK/FwVeK0C0= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.10/go.mod h1:8DcYQcz0+ZJaSxANlHIsbbi6S+zMwjwdDqwW3r9AzaE= +github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.3/go.mod h1:5yzAuE9i2RkVAttBl8yxZgQr5OCq4D5yDnG7j9x2L0U= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0 h1:iLvW/zOkHGU3BDU5thWnj+UZ9pjhuVhv1loLj7yVtBw= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0/go.mod h1:Fn3gvhdF1x5Rs9nUoCy/fJT1ms8f8dO7RqM9lJHuazQ= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.1/go.mod h1:GeUru+8VzrTXV/83XyMJ80KpH8xO89VPoUileyNQ+tc= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1/go.mod h1:l9ymW25HOqymeU2m1gbUQ3rUIsTwKs8gYHXkqDQUhiI= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 h1:6+lZi2JeGKtCraAj1rpoZfKqnQ9SptseRZioejfUOLM= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0/go.mod h1:eb3gfbVIxIoGgJsi9pGne19dhCBpK6opTYpQqAmdy44= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.3/go.mod h1:Seb8KNmD6kVTjwRjVEgOT5hPin6sq+v4C2ycJQDwuH8= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.3/go.mod h1:R+/S1O4TYpcktbVwddeOYg+uwUfLhADP2S/x4QwsCTM= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0 h1:qGyLBQPphYzUf+IIlb5tHnvg1U2Vc5hXPcP7oRSQfy0= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0/go.mod h1:g+dzKSLXiR/8ATkPXmLhPOI6rDdjLP3tngeo3FvDcIw= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.3/go.mod h1:wlY6SVjuwvh3TVRpTqdy4I1JpBFLX4UGeKZdWntaocw= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.3/go.mod h1:Owv1I59vaghv1Ax8zz8ELY8DN7/Y0rGS+WWAmjgi950= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0 h1:eRhU3Sh8dGbaniI6B+I48XJMrTPRkK4DKo+vqIxziOU= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0/go.mod h1:paNLV18DZ6FnWE/bd06RIKPDIFpjuvCkGKWTG/GDBeM= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.3/go.mod h1:Bm/v2IaN6rZ+Op7zX+bOUMdL4fsrYZiD0dsjLhNKwZc= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.3/go.mod h1:KZgs2ny8HsxRIRbDwgvJcHHBZPOzQr/+NtGwnP+w2ec= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0 h1:6jusT+XCcvnD+Elxvm7bUf5sCMTpZEp3AKjYQ4tWJSo= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0/go.mod h1:LimGpdIF/sTBdgqwOEkrArXLCoTamK/9L9x8IKBFTIc= +github.com/aws/aws-sdk-go-v2/service/kms v1.16.3/go.mod h1:QuiHPBqlOFCi4LqdSskYYAWpQlx3PKmohy+rE2F+o5g= +github.com/aws/aws-sdk-go-v2/service/s3 v1.26.3/go.mod h1:g1qvDuRsJY+XghsV6zg00Z4KJ7DtFFCx8fJD2a491Ak= +github.com/aws/aws-sdk-go-v2/service/s3 v1.43.0/go.mod h1:NXRKkiRF+erX2hnybnVU660cYT5/KChRD4iUgJ97cI8= +github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0 h1:gAV4NEp4A+JOrIdoXkAeyy6IOo7+X2s/jRuaHKYiMaU= +github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0/go.mod h1:JIQwK8sZ5MuKGm5rrFwp9MHUcyYEsQNpVixuPDlnwaU= +github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.15.4/go.mod h1:PJc8s+lxyU8rrre0/4a0pn2wgwiDvOEzoOjcJUBr67o= +github.com/aws/aws-sdk-go-v2/service/sns v1.17.4/go.mod h1:kElt+uCcXxcqFyc+bQqZPFD9DME/eC6oHBXvFzQ9Bcw= +github.com/aws/aws-sdk-go-v2/service/sqs v1.18.3/go.mod h1:skmQo0UPvsjsuYYSYMVmrPc1HWCbHUJyrCEp+ZaLzqM= +github.com/aws/aws-sdk-go-v2/service/ssm v1.24.1/go.mod h1:NR/xoKjdbRJ+qx0pMR4mI+N/H1I1ynHwXnO6FowXJc0= +github.com/aws/aws-sdk-go-v2/service/sso v1.11.3/go.mod h1:7UQ/e69kU7LDPtY40OyoHYgRmgfGM4mgsLYtcObdveU= +github.com/aws/aws-sdk-go-v2/service/sso v1.17.2/go.mod h1:/pE21vno3q1h4bbhUOEi+6Zu/aT26UK2WKkDXd+TssQ= +github.com/aws/aws-sdk-go-v2/service/sso v1.26.0 h1:cuFWHH87GP1NBGXXfMicUbE7Oty5KpPxN6w4JpmuxYc= +github.com/aws/aws-sdk-go-v2/service/sso v1.26.0/go.mod h1:aJBemdlbCKyOXEXdXBqS7E+8S9XTDcOTaoOjtng54hA= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.20.0/go.mod h1:dWqm5G767qwKPuayKfzm4rjzFmVjiBFbOJrpSPnAMDs= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0 h1:t2va+wewPOYIqC6XyJ4MGjiGKkczMAPsgq5W4FtL9ME= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0/go.mod h1:ExCTcqYqN0hYYRsDlBVU8+68grqlWdgX9/nZJwQW4aY= +github.com/aws/aws-sdk-go-v2/service/sts v1.16.3/go.mod h1:bfBj0iVmsUyUg4weDB4NxktD9rDGeKSVWnjTnwbx9b8= +github.com/aws/aws-sdk-go-v2/service/sts v1.25.3/go.mod h1:4EqRHDCKP78hq3zOnmFXu5k0j4bXbRFfCh/zQ6KnEfQ= +github.com/aws/aws-sdk-go-v2/service/sts v1.35.0 h1:FD9agdG4CeOGS3ORLByJk56YIXDS7mxFpmZyCtpqExc= +github.com/aws/aws-sdk-go-v2/service/sts v1.35.0/go.mod h1:NDzDPbBF1xtSTZUMuZx0w3hIfWzcL7X2AQ0Tr9becIQ= +github.com/aws/smithy-go v1.11.2/go.mod h1:3xHYmszWVx2c0kIwQeEVf9uSm4fYZt67FBJnwub1bgM= +github.com/aws/smithy-go v1.17.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= +github.com/aws/smithy-go v1.22.5 h1:P9ATCXPMb2mPjYBgueqJNCA5S9UfktsW0tTxi+a7eqw= +github.com/aws/smithy-go v1.22.5/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/bobg/gcsobj v0.1.2/go.mod h1:vS49EQ1A1Ib8FgrL58C8xXYZyOCR2TgzAdopy6/ipa8= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +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/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/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= +github.com/colinmarc/hdfs/v2 v2.1.1/go.mod h1:M3x+k8UKKmxtFu++uAZ0OtDU8jR3jnaZIAc6yK4Ue0c= +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/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU= +github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= +github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= +github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= +github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= +github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= +github.com/duckdb/duckdb-go-bindings v0.1.16 h1:XPCk9hzP06PoWIxDPVU3gAy0m1XmLaZHTzLggNx/U9k= +github.com/duckdb/duckdb-go-bindings v0.1.16/go.mod h1:pBnfviMzANT/9hi4bg+zW4ykRZZPCXlVuvBWEcZofkc= +github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11 h1:GXQkG4HmEbwPtqCSabJTp9wZQQ7Gqr3KveLNesQWQOs= +github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11/go.mod h1:Ezo7IbAfB8NP7CqPIN8XEHKUg5xdRRQhcPPlCXImXYA= +github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11 h1:ATJMSBIDA/YAm/6CKeBDRtGK1OOwqfTZbWg9Y5fAc9E= +github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11/go.mod h1:eS7m/mLnPQgVF4za1+xTyorKRBuK0/BA44Oy6DgrGXI= +github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11 h1:AjvnGst1avyOECYiykthyHR4DTYTaqNDPr5W/0t5j0k= +github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11/go.mod h1:1GOuk1PixiESxLaCGFhag+oFi7aP+9W8byymRAvunBk= +github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11 h1:j3B1biawuhtxe2Chkiqcwf1Kxe8VJc8lLVmjBIcJrkI= +github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11/go.mod h1:o7crKMpT2eOIi5/FY6HPqaXcvieeLSqdXXaXbruGX7w= +github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11 h1:xR3vRE8y+48U6xDNkUlOfbl7/OTA7FVcDXJ+5vETuHU= +github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11/go.mod h1:IlOhJdVKUJCAPj3QsDszUo8DVdvp1nBFp4TUJVdw99s= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +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/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= +github.com/gin-gonic/gin v1.7.3/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= +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-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +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-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= +github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-viper/mapstructure/v2 v2.3.0 h1:27XbWsHIqhbdR5TIC911OfYvgSaW93HM+dX7970Q7jk= +github.com/go-viper/mapstructure/v2 v2.3.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= +github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= +github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-jwt/jwt/v4 v4.4.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188/go.mod h1:vXjM/+wXQnTPR4KqTKDgJukSZ6amVRtWMPEjE6sQoK8= +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/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/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +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.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= +github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +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/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/flatbuffers v25.2.10+incompatible h1:F3vclr7C3HpB1k9mxCGRMXq6FdUalZ6H/pNX4FP1v0Q= +github.com/google/flatbuffers v25.2.10+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +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.6/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.8/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/go-replayers/grpcreplay v1.1.0/go.mod h1:qzAvJ8/wi57zq7gWqaE6AwLM6miiXUQwP1S+I9icmhk= +github.com/google/go-replayers/httpreplay v1.1.1/go.mod h1:gN9GeLIs7l6NUoVaSSnv2RiqK1NiwAmD0MrKeC9IIks= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+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/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +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-20200905233945-acf8798be1f7/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-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210506205249-923b5ab0fc1a/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.2.0/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.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/wire v0.5.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU= +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.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/hanwen/go-fuse v1.0.0/go.mod h1:unqXarDXqzAk0rt98O2tVndEPIpUgLD9+rwFisZH3Ok= +github.com/hanwen/go-fuse/v2 v2.1.0/go.mod h1:oRyA5eK+pvJyv5otpO/DgccS8y/RvYMaO00GgRLGryc= +github.com/hashicorp/go-uuid v0.0.0-20180228145832-27454136f036/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +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/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/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.11.0/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= +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/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.2.0/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-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/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.10.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.15.0/go.mod h1:D/zyOyXiaM1TmVWnOM18p0xdDtdakRBa0RsVGI3U3bw= +github.com/jackc/pgx/v5 v5.7.5 h1:JHGfMnQY+IEtGM63d+NGMjoRpysB2JBwDr5fsngwmJs= +github.com/jackc/pgx/v5 v5.7.5/go.mod h1:aruU7o91Tc2q2cFp5h4uP3f6ztExVpyVv88Xl/8Vl8M= +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.2.1 h1:gI8os0wpRXFd4FiAY2dWiqRK037tjj3t7rKFeO4X5iw= +github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= +github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/jcmturner/gofork v0.0.0-20180107083740-2aebee971930/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= +github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +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/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= +github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= +github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.13.1/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/klauspost/cpuid/v2 v2.2.11 h1:0OwqZRYI2rFrjS4kvkDnqJkKHdHaRnCm68/DY4OxRzU= +github.com/klauspost/cpuid/v2 v2.2.11/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= +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/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +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/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +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.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/linkedin/goavro v2.1.0+incompatible h1:DV2aUlj2xZiuxQyvag8Dy7zjY69ENjS66bWkSfdpddY= +github.com/linkedin/goavro v2.1.0+incompatible/go.mod h1:bBCwI2eGYpUI/4820s67MElg9tdeLbINjLjiM2xZFYM= +github.com/marcboeker/go-duckdb/arrowmapping v0.0.9 h1:xj+kFOqR2gH3Mcxx9LmAVHebSnCiPm303N+uxfkWVmY= +github.com/marcboeker/go-duckdb/arrowmapping v0.0.9/go.mod h1:o56AqVS90v5bpxhPnOK9La7AfNTOrMORiqTQrlRbdPQ= +github.com/marcboeker/go-duckdb/mapping v0.0.10 h1:b/y2W8/hNlD0Dwjq0mCqIlLXpjQMnWy0WqDV9b9lHQQ= +github.com/marcboeker/go-duckdb/mapping v0.0.10/go.mod h1:Ro6Tw6sGG50O8S0daZsA8TrQJz/DvGrzGvMD7Jihirw= +github.com/marcboeker/go-duckdb/v2 v2.3.2 h1:96zG2JPyIhCFjHdBjjSpOdhzJzehoGTdl7LskkuMUTs= +github.com/marcboeker/go-duckdb/v2 v2.3.2/go.mod h1:VeXz9ZM6klNvICHrXEUzaHSgNqBeTdyMxr4CICw/UaY= +github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= +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.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= +github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= +github.com/minio/minio-go/v7 v7.0.34/go.mod h1:nCrRzjoSUQh8hgKKtu3Y708OLvRLtuASMg2/nvmbarw= +github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= +github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/ncw/swift v1.0.52/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= +github.com/pborman/getopt v0.0.0-20180729010549-6fdd0a2c7117/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= +github.com/pierrec/lz4/v4 v4.1.8/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= +github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= +github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +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/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +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/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.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +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/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +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.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +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.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/xitongsys/parquet-go v1.5.1/go.mod h1:xUxwM8ELydxh4edHGegYq1pA8NnMKDx0K/GyB0o2bww= +github.com/xitongsys/parquet-go v1.6.2 h1:MhCaXii4eqceKPu9BwrjLqyK10oX9WF+xGhwvwbw7xM= +github.com/xitongsys/parquet-go v1.6.2/go.mod h1:IulAQyalCm0rPiZVNnCgm/PCL64X2tdSVGMQ/UeKqWA= +github.com/xitongsys/parquet-go-source v0.0.0-20190524061010-2b72cbee77d5/go.mod h1:xxCx7Wpym/3QCo6JhujJX51dzSXrwmb0oH6FQb39SEA= +github.com/xitongsys/parquet-go-source v0.0.0-20200817004010-026bad9b25d0/go.mod h1:HYhIKsdns7xz80OgkbgJYrtQY7FjHWHKH6cvN7+czGE= +github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b h1:zbb5qM/t3N+O33Vp5sFyG6yIcWZV1q7rfEjJM8UsRBQ= +github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b/go.mod h1:2ActxmJ4q17Cdruar9nKEkzKSOL1Ol03737Bkz10rTY= +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.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= +github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= +github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= +github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= +go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0= +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.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +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/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +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.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= +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.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= +gocloud.dev v0.26.0/go.mod h1:mkUgejbnbLotorqDyvedJO20XcZNTynmSeVSQS9btVg= +golang.org/x/crypto v0.0.0-20180723164146-c126467f60eb/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +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-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/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-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-20211115234514-b4de73f9ece8/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220511200225-c6db032c6c88/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= +golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= +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-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +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/lint v0.0.0-20210508222113-6edffad5e616/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.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w= +golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= +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-20191112182307-2180aed22343/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-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +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-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211020060615-d418f374d309/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220401154927-543a649e0bdd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +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.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +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.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +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-20210220032951-036812b2e83c/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.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= +golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +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-20191112214154-59a1497f0cea/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-20200828194041-157a740278f4/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-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/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-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/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-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220204135822-1c1b9b1eba6a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220330033206-e17cdc41300f/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-20220704084225-05e143d24a9e/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.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= +golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +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/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +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.5/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.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= +golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= +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/time v0.0.0-20211116232009-f0f3c7e86c11/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220224211638-0e9765cccd65/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-20190422233926-fe54fb35175b/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-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-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-20200828161849-5deb26317202/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20200915173823-2db8f0ff891c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20200918232735-d647fc253266/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +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.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo= +golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg= +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= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +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.31.0/go.mod h1:CL+9IBCa2WWU6gRuBWaKqGWLFFwbEUXkfeMkHLQWYWo= +google.golang.org/api v0.32.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +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.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.46.0/go.mod h1:ceL4oozhkAiTID8XMmJBsIxID/9wMXJVVFXPg4ylg3I= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.58.0/go.mod h1:cAbP2FsxoGVNwtgNAmmn3y5G1TWAiVYRmg4yku3lv+E= +google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.64.0/go.mod h1:931CdxA8Rm4t6zqTFGSsgwbAEZ2+GMYurbndwSimebM= +google.golang.org/api v0.66.0/go.mod h1:I1dmXYpX7HGwz/ejRxwQp2qj5bFAz93HiCU1C1oYd9M= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.68.0/go.mod h1:sOM8pTpwgflXRhz+oC8H2Dr+UcbMqkPPWNJo88Q7TH8= +google.golang.org/api v0.69.0/go.mod h1:boanBiw+h5c3s+tBPgEzLDRHfFLWV0qXxRHz3ws7C80= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= +google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +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/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-20200513103714-09dca8ec2884/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-20200831141814-d751682dd103/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-20200914193844-75d14daec038/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200921151605-7abf4a1a14d5/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-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210429181445-86c259c2b4ab/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210517163617-5e0236093d7a/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210921142501-181ce0d877f6/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211018162055-cf77aa76bad2/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211223182754-3ac035c7e7cb/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220111164026-67b88f271998/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220114231437-d2e6a121cae0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220201184016-50beb8ab5c44/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220204002441-d6cc3cc0770e/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220211171837-173942840c17/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220216160803-4663080d8bc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220401170504-314d38edb7de/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +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.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +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.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +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.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +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-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= +gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= +gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q= +gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mNfM5bm88whjWx4= +gopkg.in/jcmturner/gokrb5.v7 v7.3.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= +gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8= +gopkg.in/linkedin/goavro.v1 v1.0.5 h1:BJa69CDh0awSsLUmZ9+BowBdokpduDZSM9Zk8oKHfN4= +gopkg.in/linkedin/goavro.v1 v1.0.5/go.mod h1:Aw5GdAbizjOEl0kAMHV9iHmA8reZzW/OKuJAl4Hb9F0= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/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/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= +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= +nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= +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/src/syncer-attio/parser.go b/src/syncer-attio/lib/parser.go similarity index 99% rename from src/syncer-attio/parser.go rename to src/syncer-attio/lib/parser.go index f20971e..4df57de 100644 --- a/src/syncer-attio/parser.go +++ b/src/syncer-attio/lib/parser.go @@ -1,4 +1,4 @@ -package main +package attio import ( "strings" diff --git a/src/syncer-attio/record_company.go b/src/syncer-attio/lib/record_company.go similarity index 99% rename from src/syncer-attio/record_company.go rename to src/syncer-attio/lib/record_company.go index 0024c99..5528611 100644 --- a/src/syncer-attio/record_company.go +++ b/src/syncer-attio/lib/record_company.go @@ -1,4 +1,4 @@ -package main +package attio import ( "github.com/BemiHQ/BemiDB/src/common" diff --git a/src/syncer-attio/record_deal.go b/src/syncer-attio/lib/record_deal.go similarity index 99% rename from src/syncer-attio/record_deal.go rename to src/syncer-attio/lib/record_deal.go index 2f793de..e959e15 100644 --- a/src/syncer-attio/record_deal.go +++ b/src/syncer-attio/lib/record_deal.go @@ -1,4 +1,4 @@ -package main +package attio import ( "github.com/BemiHQ/BemiDB/src/common" diff --git a/src/syncer-attio/record_person.go b/src/syncer-attio/lib/record_person.go similarity index 99% rename from src/syncer-attio/record_person.go rename to src/syncer-attio/lib/record_person.go index b6640b2..a67fbde 100644 --- a/src/syncer-attio/record_person.go +++ b/src/syncer-attio/lib/record_person.go @@ -1,4 +1,4 @@ -package main +package attio import ( "github.com/BemiHQ/BemiDB/src/common" diff --git a/src/syncer-attio/lib/syncer.go b/src/syncer-attio/lib/syncer.go new file mode 100644 index 0000000..70c1ccf --- /dev/null +++ b/src/syncer-attio/lib/syncer.go @@ -0,0 +1,76 @@ +package attio + +import ( + "github.com/BemiHQ/BemiDB/src/common" +) + +const ( + COMPRESSION_FACTOR = 2 // 1 GB uncompressed data x 2 = ~90MB compressed data +) + +type Syncer struct { + Config *Config + Attio *Attio + StorageS3 *common.StorageS3 + DuckdbClient *common.DuckdbClient +} + +func NewSyncer(config *Config, storageS3 *common.StorageS3, duckdbClient *common.DuckdbClient) *Syncer { + return &Syncer{ + Config: config, + Attio: NewAttio(config), + StorageS3: storageS3, + DuckdbClient: duckdbClient, + } +} + +func (syncer *Syncer) Sync() { + common.SendAnonymousAnalytics(syncer.Config.CommonConfig, "syncer-attio-start", syncer.name()) + + for _, object := range []string{ATTIO_OBJECT_COMPANIES, ATTIO_OBJECT_DEALS, ATTIO_OBJECT_PEOPLE} { + cappedBuffer := common.NewCappedBuffer(syncer.Config.CommonConfig, common.DEFAULT_CAPPED_BUFFER_SIZE) + jsonQueueWriter := common.NewJsonQueueWriter(cappedBuffer) + + // Copy from Attio to cappedBuffer in a separate goroutine in parallel + go func() { + err := syncer.Attio.Load(object, jsonQueueWriter) + common.PanicIfError(syncer.Config.CommonConfig, err) + + common.LogInfo(syncer.Config.CommonConfig, "Finished exporting data from Attio.") + jsonQueueWriter.Close() + }() + + syncer.WriteToIceberg(object, cappedBuffer) + + common.SendAnonymousAnalytics(syncer.Config.CommonConfig, "syncer-attio-finish", syncer.name()) + } +} + +func (syncer *Syncer) WriteToIceberg(object string, cappedBuffer *common.CappedBuffer) { + icebergSchemaTable := common.IcebergSchemaTable{Schema: syncer.Config.DestinationSchemaName, Table: object} + icebergTable := common.NewIcebergTable(syncer.Config.CommonConfig, syncer.StorageS3, syncer.DuckdbClient, icebergSchemaTable) + icebergTable.ReplaceWith(func(syncingIcebergTable *common.IcebergTable) { + var icebergSchemaColumns []*common.IcebergSchemaColumn + + switch object { + case ATTIO_OBJECT_COMPANIES: + icebergSchemaColumns = CompaniesIcebergSchemaColumns(syncer.Config.CommonConfig) + case ATTIO_OBJECT_DEALS: + icebergSchemaColumns = DealsIcebergSchemaColumns(syncer.Config.CommonConfig) + case ATTIO_OBJECT_PEOPLE: + icebergSchemaColumns = PeopleIcebergSchemaColumns(syncer.Config.CommonConfig) + default: + common.Panic(syncer.Config.CommonConfig, "Unknown object: "+object) + } + + // Read from cappedBuffer and write to Iceberg + icebergTableWriter := common.NewIcebergTableWriter(syncer.Config.CommonConfig, syncer.StorageS3, syncer.DuckdbClient, syncingIcebergTable, icebergSchemaColumns, 1) + icebergTableWriter.InsertFromJsonCappedBuffer(cappedBuffer) + }) + + common.SendAnonymousAnalytics(syncer.Config.CommonConfig, "syncer-attio-finish", syncer.name()) +} + +func (syncer *Syncer) name() string { + return syncer.Config.ApiAccessToken[:5] + "..." +} diff --git a/src/syncer-attio/main.go b/src/syncer-attio/main.go index 175e944..aae97b4 100644 --- a/src/syncer-attio/main.go +++ b/src/syncer-attio/main.go @@ -2,12 +2,19 @@ package main import ( "github.com/BemiHQ/BemiDB/src/common" + "github.com/BemiHQ/BemiDB/src/syncer-attio/lib" ) +func init() { + attio.RegisterFlags() +} + func main() { - config := LoadConfig() + config := attio.LoadConfig() defer common.HandleUnexpectedPanic(config.CommonConfig) - syncer := NewSyncer(config) + storageS3 := common.NewStorageS3(config.CommonConfig) + duckdbClient := common.NewDuckdbClient(config.CommonConfig, common.SYNCER_DUCKDB_BOOT_QUERIES) + syncer := attio.NewSyncer(config, storageS3, duckdbClient) syncer.Sync() } diff --git a/src/syncer-attio/syncer.go b/src/syncer-attio/syncer.go deleted file mode 100644 index 033a2b5..0000000 --- a/src/syncer-attio/syncer.go +++ /dev/null @@ -1,73 +0,0 @@ -package main - -import ( - "github.com/BemiHQ/BemiDB/src/common" -) - -const ( - COMPRESSION_FACTOR = 2 // 1 GB uncompressed data x 2 = ~90MB compressed data -) - -type Syncer struct { - Config *Config - Attio *Attio - StorageS3 *common.StorageS3 - DuckdbClient *common.DuckdbClient -} - -func NewSyncer(config *Config) *Syncer { - storageS3 := common.NewStorageS3(config.CommonConfig) - duckdbClient := common.NewDuckdbClient(config.CommonConfig, common.SYNCER_DUCKDB_BOOT_QUERIES) - - return &Syncer{ - Config: config, - Attio: NewAttio(config), - StorageS3: storageS3, - DuckdbClient: duckdbClient, - } -} - -func (syncer *Syncer) Sync() { - common.SendAnonymousAnalytics(syncer.Config.CommonConfig, "syncer-attio-start", syncer.name()) - - for _, object := range []string{ATTIO_OBJECT_COMPANIES, ATTIO_OBJECT_DEALS, ATTIO_OBJECT_PEOPLE} { - cappedBuffer := common.NewCappedBuffer(syncer.Config.CommonConfig, common.DEFAULT_CAPPED_BUFFER_SIZE) - jsonQueueWriter := common.NewJsonQueueWriter(cappedBuffer) - - // Copy from Attio to cappedBuffer in a separate goroutine in parallel - go func() { - err := syncer.Attio.Load(object, jsonQueueWriter) - common.PanicIfError(syncer.Config.CommonConfig, err) - - common.LogInfo(syncer.Config.CommonConfig, "Finished exporting data from Attio.") - jsonQueueWriter.Close() - }() - - icebergSchemaTable := common.IcebergSchemaTable{Schema: syncer.Config.DestinationSchemaName, Table: object} - icebergTable := common.NewIcebergTable(syncer.Config.CommonConfig, syncer.StorageS3, syncer.DuckdbClient, icebergSchemaTable) - icebergTable.ReplaceWith(func(syncingIcebergTable *common.IcebergTable) { - var icebergSchemaColumns []*common.IcebergSchemaColumn - - switch object { - case ATTIO_OBJECT_COMPANIES: - icebergSchemaColumns = CompaniesIcebergSchemaColumns(syncer.Config.CommonConfig) - case ATTIO_OBJECT_DEALS: - icebergSchemaColumns = DealsIcebergSchemaColumns(syncer.Config.CommonConfig) - case ATTIO_OBJECT_PEOPLE: - icebergSchemaColumns = PeopleIcebergSchemaColumns(syncer.Config.CommonConfig) - default: - common.Panic(syncer.Config.CommonConfig, "Unknown object: "+object) - } - - // Read from cappedBuffer and write to Iceberg - icebergTableWriter := common.NewIcebergTableWriter(syncer.Config.CommonConfig, syncer.StorageS3, syncer.DuckdbClient, syncingIcebergTable, icebergSchemaColumns, 1) - icebergTableWriter.InsertFromJsonCappedBuffer(cappedBuffer) - }) - - common.SendAnonymousAnalytics(syncer.Config.CommonConfig, "syncer-attio-finish", syncer.name()) - } -} - -func (syncer *Syncer) name() string { - return syncer.Config.ApiAccessToken[:5] + "..." -} diff --git a/src/syncer-postgres/go.mod b/src/syncer-postgres/go.mod index 73a68f4..95ecdb2 100644 --- a/src/syncer-postgres/go.mod +++ b/src/syncer-postgres/go.mod @@ -4,11 +4,13 @@ go 1.24.4 require ( github.com/BemiHQ/BemiDB/src/common v0.0.0-00010101000000-000000000000 - github.com/nats-io/nats.go v1.43.0 + github.com/BemiHQ/BemiDB/src/syncer-postgres/lib v0.0.0-00010101000000-000000000000 ) replace github.com/BemiHQ/BemiDB/src/common => ../common +replace github.com/BemiHQ/BemiDB/src/syncer-postgres/lib => ./lib + require ( github.com/apache/arrow-go/v18 v18.4.0 // indirect github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 // indirect @@ -52,6 +54,7 @@ require ( github.com/marcboeker/go-duckdb/arrowmapping v0.0.9 // indirect github.com/marcboeker/go-duckdb/mapping v0.0.10 // indirect github.com/marcboeker/go-duckdb/v2 v2.3.2 // indirect + github.com/nats-io/nats.go v1.43.0 // indirect github.com/nats-io/nkeys v0.4.11 // indirect github.com/nats-io/nuid v1.0.1 // indirect github.com/pierrec/lz4/v4 v4.1.22 // indirect diff --git a/src/syncer-postgres/config.go b/src/syncer-postgres/lib/config.go similarity index 99% rename from src/syncer-postgres/config.go rename to src/syncer-postgres/lib/config.go index 9144fc6..916a92b 100644 --- a/src/syncer-postgres/config.go +++ b/src/syncer-postgres/lib/config.go @@ -1,4 +1,4 @@ -package main +package postgres import ( "flag" @@ -68,11 +68,7 @@ type configParseValues struct { var _config Config var _configParseValues configParseValues -func init() { - registerFlags() -} - -func registerFlags() { +func RegisterFlags() { _config.CommonConfig = &common.CommonConfig{} flag.StringVar(&_config.CommonConfig.LogLevel, "log-level", os.Getenv(common.ENV_LOG_LEVEL), `Log level: "ERROR", "WARN", "INFO", "DEBUG", "TRACE". Default: "`+common.DEFAULT_LOG_LEVEL+`"`) @@ -103,6 +99,11 @@ func registerFlags() { } } +func LoadConfig() *Config { + parseFlags() + return &_config +} + func parseFlags() { flag.Parse() @@ -191,8 +192,3 @@ func parseFlags() { panic("Source PostgreSQL database URL is required") } } - -func LoadConfig() *Config { - parseFlags() - return &_config -} diff --git a/src/syncer-postgres/debezium.go b/src/syncer-postgres/lib/debezium.go similarity index 97% rename from src/syncer-postgres/debezium.go rename to src/syncer-postgres/lib/debezium.go index 51be277..5daede8 100644 --- a/src/syncer-postgres/debezium.go +++ b/src/syncer-postgres/lib/debezium.go @@ -1,4 +1,4 @@ -package main +package postgres type DebeziumData struct { Operation string `json:"op"` diff --git a/src/syncer-postgres/lib/go.mod b/src/syncer-postgres/lib/go.mod new file mode 100644 index 0000000..91f0960 --- /dev/null +++ b/src/syncer-postgres/lib/go.mod @@ -0,0 +1,69 @@ +module github.com/BemiHQ/BemiDB/src/syncer-postgres/lib + +go 1.24.4 + +require ( + github.com/BemiHQ/BemiDB/src/common v0.0.0-00010101000000-000000000000 + github.com/nats-io/nats.go v1.43.0 +) + +replace github.com/BemiHQ/BemiDB/src/common => ../../common + +require ( + github.com/apache/arrow-go/v18 v18.4.0 // indirect + github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 // indirect + github.com/apache/thrift v0.22.0 // indirect + github.com/aws/aws-sdk-go-v2 v1.37.0 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 // indirect + github.com/aws/aws-sdk-go-v2/config v1.30.1 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.18.1 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0 // indirect + github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.26.0 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.35.0 // indirect + github.com/aws/smithy-go v1.22.5 // indirect + github.com/duckdb/duckdb-go-bindings v0.1.16 // indirect + github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11 // indirect + github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11 // indirect + github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11 // indirect + github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11 // indirect + github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11 // indirect + github.com/go-viper/mapstructure/v2 v2.3.0 // indirect + github.com/goccy/go-json v0.10.5 // indirect + github.com/golang/snappy v1.0.0 // indirect + github.com/google/flatbuffers v25.2.10+incompatible // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect + github.com/jackc/pgx/v5 v5.7.5 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.11 // indirect + github.com/linkedin/goavro v2.1.0+incompatible // indirect + github.com/marcboeker/go-duckdb/arrowmapping v0.0.9 // indirect + github.com/marcboeker/go-duckdb/mapping v0.0.10 // indirect + github.com/marcboeker/go-duckdb/v2 v2.3.2 // indirect + github.com/nats-io/nkeys v0.4.11 // indirect + github.com/nats-io/nuid v1.0.1 // indirect + github.com/pierrec/lz4/v4 v4.1.22 // indirect + github.com/xitongsys/parquet-go v1.6.2 // indirect + github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b // indirect + github.com/zeebo/xxh3 v1.0.2 // indirect + golang.org/x/crypto v0.40.0 // indirect + golang.org/x/exp v0.0.0-20250718183923-645b1fa84792 // indirect + golang.org/x/mod v0.26.0 // indirect + golang.org/x/sync v0.16.0 // indirect + golang.org/x/sys v0.34.0 // indirect + golang.org/x/text v0.27.0 // indirect + golang.org/x/tools v0.35.0 // indirect + golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect +) diff --git a/src/syncer-postgres/lib/go.sum b/src/syncer-postgres/lib/go.sum new file mode 100644 index 0000000..d27554a --- /dev/null +++ b/src/syncer-postgres/lib/go.sum @@ -0,0 +1,1166 @@ +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.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.66.0/go.mod h1:dgqGAjKCDxyhGTtC9dAREQGUJpkceNm1yt590Qno0Ko= +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.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.82.0/go.mod h1:vlKccHJGuFBFufnAnuB08dfEH9Y3H7dzDzRECFdC2TA= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= +cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +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 v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= +cloud.google.com/go/compute v1.2.0/go.mod h1:xlogom/6gr8RJGBe7nT2eGsQYAFUbbv8dbC29qE3Xmw= +cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= +cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= +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/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= +cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= +cloud.google.com/go/iam v0.1.1/go.mod h1:CKqrcnI/suGpybEHxZ7BMehL0oA4LpdyJdUlTl9jVMw= +cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= +cloud.google.com/go/kms v1.1.0/go.mod h1:WdbppnCDMDpOvoYBMn1+gNmOeEoZYqAv+HeuKARGCXI= +cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= +cloud.google.com/go/monitoring v1.1.0/go.mod h1:L81pzz7HKn14QCMaCs6NTQkdBnE87TElyanS95vIcl4= +cloud.google.com/go/monitoring v1.4.0/go.mod h1:y6xnxfwI3hTFWOdkOaD7nfJVlwuC3/mS/5kvtT131p4= +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/pubsub v1.19.0/go.mod h1:/O9kmSe9bb9KRnIAWkzmqhPjHo6LtzGOBYd/kr06XSs= +cloud.google.com/go/secretmanager v1.3.0/go.mod h1:+oLTkouyiYiabAQNugCeTS3PAArGiMJuBqvJnJsyH+U= +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.12.0/go.mod h1:fFLk2dp2oAhDz8QFKwqrjdJvxSp/W2g7nillojlL5Ho= +cloud.google.com/go/storage v1.21.0/go.mod h1:XmRlxkgPjlBONznT2dDUU/5XlpU2OjMnKuqnZI01LAA= +cloud.google.com/go/trace v1.0.0/go.mod h1:4iErSByzxkyHWzzlAj63/Gmjz0NH1ASqhJguHpGcr6A= +cloud.google.com/go/trace v1.2.0/go.mod h1:Wc8y/uYyOhPy12KEnXG9XGrvfMz5F5SrYecQlbW1rwM= +contrib.go.opencensus.io/exporter/aws v0.0.0-20200617204711-c478e41e60e9/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= +contrib.go.opencensus.io/exporter/stackdriver v0.13.10/go.mod h1:I5htMbyta491eUxufwwZPQdcKvvgzMB4O9ni41YnIM8= +contrib.go.opencensus.io/integrations/ocsql v0.1.7/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/Azure/azure-amqp-common-go/v3 v3.2.1/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= +github.com/Azure/azure-amqp-common-go/v3 v3.2.2/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= +github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k= +github.com/Azure/azure-sdk-for-go v51.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v59.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.0.0/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.0.0/go.mod h1:+6sju8gk8FRmSajX3Oz4G5Gm7P+mbqE9FVaXXFYTkCM= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U= +github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.0.0/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.0.0/go.mod h1:ceIuwmxDWptoW3eCqSXlnPsZFKh4X+R38dWPv7GS9Vs= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.0.0/go.mod h1:s1tW/At+xHqjNFvWU4G0c0Qv33KOhvbGNj0RCTQDV8s= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.2.0/go.mod h1:c+Lifp3EDEamAkPVzMooRNOK6CZjNSdEnf1A7jsI9u4= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.1.0/go.mod h1:7QJP7dr2wznCMeqIrhMgWGf7XpAQnVrJqDm9nvV3Cu4= +github.com/Azure/azure-service-bus-go v0.11.5/go.mod h1:MI6ge2CuQWBVq+ly456MY7XqNLJip5LO1iSFodbNLbU= +github.com/Azure/azure-storage-blob-go v0.14.0/go.mod h1:SMqIBi+SuiQH32bvyjngEewEeXoPfKMgWlBDaYf6fck= +github.com/Azure/go-amqp v0.16.0/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= +github.com/Azure/go-amqp v0.16.4/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= +github.com/Azure/go-autorest/autorest v0.11.19/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= +github.com/Azure/go-autorest/autorest v0.11.22/go.mod h1:BAWYUWGPEtKPzjVkp0Q6an0MJcJDsoh5Z1BFAEFs4Xs= +github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= +github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/adal v0.9.14/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/adal v0.9.17/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= +github.com/Azure/go-autorest/autorest/azure/auth v0.5.9/go.mod h1:hg3/1yw0Bq87O3KvvnJoAh34/0zbP7SFizX/qN5JvjU= +github.com/Azure/go-autorest/autorest/azure/cli v0.4.2/go.mod h1:7qkJkT+j6b+hIpzMOwPChJhTqS8VbsqqgULzMNRugoM= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= +github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= +github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= +github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= +github.com/AzureAD/microsoft-authentication-library-for-go v0.4.0/go.mod h1:Vt9sXTKwMyGcOxSmLDMnGPgqsUg7m8pe215qMLrDXw4= +github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/GoogleCloudPlatform/cloudsql-proxy v1.29.0/go.mod h1:spvB9eLJH9dutlbPSRmHvSXXHOwGRyeXh1jVdquA2G8= +github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= +github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apache/arrow-go/v18 v18.4.0 h1:/RvkGqH517iY8bZKc4FD5/kkdwXJGjxf28JIXbJ/oB0= +github.com/apache/arrow-go/v18 v18.4.0/go.mod h1:Aawvwhj8x2jURIzD9Moy72cF0FyJXOpkYpdmGRHcw14= +github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 h1:byKBBF2CKWBjjA4J1ZL2JXttJULvWSl50LegTyRZ728= +github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516/go.mod h1:QNYViu/X0HXDHw7m3KXzWSVXIbfUvJqBFe6Gj8/pYA0= +github.com/apache/thrift v0.0.0-20181112125854-24918abba929/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.14.2/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.22.0 h1:r7mTJdj51TMDe6RtcmNdQxgn9XcyfGDOzegMDRg47uc= +github.com/apache/thrift v0.22.0/go.mod h1:1e7J/O1Ae6ZQMTYdy9xa3w9k+XHWPfRvdPyJeynQ+/g= +github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= +github.com/aws/aws-sdk-go v1.30.19/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= +github.com/aws/aws-sdk-go v1.37.0/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= +github.com/aws/aws-sdk-go v1.43.31 h1:yJZIr8nMV1hXjAvvOLUFqZRJcHV7udPQBfhJqawDzI0= +github.com/aws/aws-sdk-go v1.43.31/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= +github.com/aws/aws-sdk-go-v2 v1.16.2/go.mod h1:ytwTPBG6fXTZLxxeeCCWj2/EMYp/xDUgX+OET6TLNNU= +github.com/aws/aws-sdk-go-v2 v1.23.0/go.mod h1:i1XDttT4rnf6vxc9AuskLc6s7XBee8rlLilKlc03uAA= +github.com/aws/aws-sdk-go-v2 v1.37.0 h1:YtCOESR/pN4j5oA7cVHSfOwIcuh/KwHC4DOSXFbv5F0= +github.com/aws/aws-sdk-go-v2 v1.37.0/go.mod h1:9Q0OoGQoboYIAJyslFyF1f5K1Ryddop8gqMhWx/n4Wg= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.1/go.mod h1:n8Bs1ElDD2wJ9kCRTczA83gYbBmjSwZp3umc6zF4EeM= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.1/go.mod h1:t8PYl/6LzdAqsU4/9tz28V/kU+asFePvpOMkdul0gEQ= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 h1:6GMWV6CNpA/6fbFHnoAjrv4+LGfyTqZz2LtCHnspgDg= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0/go.mod h1:/mXlTIVG9jbxkqDnr5UQNQxW1HRYxeGklkM9vAFeabg= +github.com/aws/aws-sdk-go-v2/config v1.15.3/go.mod h1:9YL3v07Xc/ohTsxFXzan9ZpFpdTOFl4X65BAKYaz8jg= +github.com/aws/aws-sdk-go-v2/config v1.25.3/go.mod h1:tAByZy03nH5jcq0vZmkcVoo6tRzRHEwSFx3QW4NmDw8= +github.com/aws/aws-sdk-go-v2/config v1.30.1 h1:sHL8g/+9tcZATeV2tEkEfxZeaNokDtKsSjGMGHD49qA= +github.com/aws/aws-sdk-go-v2/config v1.30.1/go.mod h1:wkibEyFfxXRyTSzRU4bbF5IUsSXyE4xQ4ZjkGmi5tFo= +github.com/aws/aws-sdk-go-v2/credentials v1.11.2/go.mod h1:j8YsY9TXTm31k4eFhspiQicfXPLZ0gYXA50i4gxPE8g= +github.com/aws/aws-sdk-go-v2/credentials v1.16.2/go.mod h1:sDdvGhXrSVT5yzBDR7qXz+rhbpiMpUYfF3vJ01QSdrc= +github.com/aws/aws-sdk-go-v2/credentials v1.18.1 h1:E55xvOqlX7CvB66Z7rSM9usCrFU1ryUIUHqiXsEzVoE= +github.com/aws/aws-sdk-go-v2/credentials v1.18.1/go.mod h1:iobSQfR5MkvILxssGOvi/P1jjOhrRzfTiCPCzku0vx4= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.3/go.mod h1:uk1vhHHERfSVCUnqSqz8O48LBYDSC+k6brng09jcMOk= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.4/go.mod h1:t4i+yGHMCcUNIX1x7YVYa6bH/Do7civ5I6cG/6PMfyA= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0 h1:9sBTeKQwAvmJUWKIACIoiFSnxxl+sS++YDfr17/ngq0= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0/go.mod h1:LW9/PxQD1SYFC7pnWcgqPhoyZprhjEdg5hBK6qYPLW8= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.3/go.mod h1:0dHuD2HZZSiwfJSy1FO5bX1hQ1TxVV1QXXjpn3XUE44= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.14.0/go.mod h1:UcgIwJ9KHquYxs6Q5skC9qXjhYMK+JASDYcXQ4X7JZE= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1 h1:aAjA/1JZ1xH/F9XvxJu9cXZyp7BqVXtHpztyZ6p799E= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1/go.mod h1:ia9HASsPba/7o84sp6iE4wZPdNTJ0oicBe5sWQQk+Ys= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.9/go.mod h1:AnVH5pvai0pAF4lXRq0bmhbes1u9R8wTE+g+183bZNM= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.3/go.mod h1:7sGSz1JCKHWWBHq98m6sMtWQikmYPpxjqOydDemiVoM= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0 h1:H2iZoqW/v2Jnrh1FnU725Bq6KJ0k2uP63yH+DcY+HUI= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0/go.mod h1:L0FqLbwMXHvNC/7crWV1iIxUlOKYZUE8KuTIA+TozAI= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.3/go.mod h1:ssOhaLpRlh88H3UmEcsBoVKq309quMvm3Ds8e9d4eJM= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.3/go.mod h1:ify42Rb7nKeDDPkFjKn7q1bPscVPu/+gmHH8d2c+anU= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0 h1:EDped/rNzAhFPhVY0sDGbtD16OKqksfA8OjF/kLEgw8= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0/go.mod h1:uUI335jvzpZRPpjYx6ODc/wg1qH+NnoSTK/FwVeK0C0= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.10/go.mod h1:8DcYQcz0+ZJaSxANlHIsbbi6S+zMwjwdDqwW3r9AzaE= +github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.3/go.mod h1:5yzAuE9i2RkVAttBl8yxZgQr5OCq4D5yDnG7j9x2L0U= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0 h1:iLvW/zOkHGU3BDU5thWnj+UZ9pjhuVhv1loLj7yVtBw= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0/go.mod h1:Fn3gvhdF1x5Rs9nUoCy/fJT1ms8f8dO7RqM9lJHuazQ= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.1/go.mod h1:GeUru+8VzrTXV/83XyMJ80KpH8xO89VPoUileyNQ+tc= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1/go.mod h1:l9ymW25HOqymeU2m1gbUQ3rUIsTwKs8gYHXkqDQUhiI= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 h1:6+lZi2JeGKtCraAj1rpoZfKqnQ9SptseRZioejfUOLM= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0/go.mod h1:eb3gfbVIxIoGgJsi9pGne19dhCBpK6opTYpQqAmdy44= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.3/go.mod h1:Seb8KNmD6kVTjwRjVEgOT5hPin6sq+v4C2ycJQDwuH8= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.3/go.mod h1:R+/S1O4TYpcktbVwddeOYg+uwUfLhADP2S/x4QwsCTM= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0 h1:qGyLBQPphYzUf+IIlb5tHnvg1U2Vc5hXPcP7oRSQfy0= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0/go.mod h1:g+dzKSLXiR/8ATkPXmLhPOI6rDdjLP3tngeo3FvDcIw= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.3/go.mod h1:wlY6SVjuwvh3TVRpTqdy4I1JpBFLX4UGeKZdWntaocw= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.3/go.mod h1:Owv1I59vaghv1Ax8zz8ELY8DN7/Y0rGS+WWAmjgi950= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0 h1:eRhU3Sh8dGbaniI6B+I48XJMrTPRkK4DKo+vqIxziOU= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0/go.mod h1:paNLV18DZ6FnWE/bd06RIKPDIFpjuvCkGKWTG/GDBeM= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.3/go.mod h1:Bm/v2IaN6rZ+Op7zX+bOUMdL4fsrYZiD0dsjLhNKwZc= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.3/go.mod h1:KZgs2ny8HsxRIRbDwgvJcHHBZPOzQr/+NtGwnP+w2ec= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0 h1:6jusT+XCcvnD+Elxvm7bUf5sCMTpZEp3AKjYQ4tWJSo= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0/go.mod h1:LimGpdIF/sTBdgqwOEkrArXLCoTamK/9L9x8IKBFTIc= +github.com/aws/aws-sdk-go-v2/service/kms v1.16.3/go.mod h1:QuiHPBqlOFCi4LqdSskYYAWpQlx3PKmohy+rE2F+o5g= +github.com/aws/aws-sdk-go-v2/service/s3 v1.26.3/go.mod h1:g1qvDuRsJY+XghsV6zg00Z4KJ7DtFFCx8fJD2a491Ak= +github.com/aws/aws-sdk-go-v2/service/s3 v1.43.0/go.mod h1:NXRKkiRF+erX2hnybnVU660cYT5/KChRD4iUgJ97cI8= +github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0 h1:gAV4NEp4A+JOrIdoXkAeyy6IOo7+X2s/jRuaHKYiMaU= +github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0/go.mod h1:JIQwK8sZ5MuKGm5rrFwp9MHUcyYEsQNpVixuPDlnwaU= +github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.15.4/go.mod h1:PJc8s+lxyU8rrre0/4a0pn2wgwiDvOEzoOjcJUBr67o= +github.com/aws/aws-sdk-go-v2/service/sns v1.17.4/go.mod h1:kElt+uCcXxcqFyc+bQqZPFD9DME/eC6oHBXvFzQ9Bcw= +github.com/aws/aws-sdk-go-v2/service/sqs v1.18.3/go.mod h1:skmQo0UPvsjsuYYSYMVmrPc1HWCbHUJyrCEp+ZaLzqM= +github.com/aws/aws-sdk-go-v2/service/ssm v1.24.1/go.mod h1:NR/xoKjdbRJ+qx0pMR4mI+N/H1I1ynHwXnO6FowXJc0= +github.com/aws/aws-sdk-go-v2/service/sso v1.11.3/go.mod h1:7UQ/e69kU7LDPtY40OyoHYgRmgfGM4mgsLYtcObdveU= +github.com/aws/aws-sdk-go-v2/service/sso v1.17.2/go.mod h1:/pE21vno3q1h4bbhUOEi+6Zu/aT26UK2WKkDXd+TssQ= +github.com/aws/aws-sdk-go-v2/service/sso v1.26.0 h1:cuFWHH87GP1NBGXXfMicUbE7Oty5KpPxN6w4JpmuxYc= +github.com/aws/aws-sdk-go-v2/service/sso v1.26.0/go.mod h1:aJBemdlbCKyOXEXdXBqS7E+8S9XTDcOTaoOjtng54hA= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.20.0/go.mod h1:dWqm5G767qwKPuayKfzm4rjzFmVjiBFbOJrpSPnAMDs= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0 h1:t2va+wewPOYIqC6XyJ4MGjiGKkczMAPsgq5W4FtL9ME= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0/go.mod h1:ExCTcqYqN0hYYRsDlBVU8+68grqlWdgX9/nZJwQW4aY= +github.com/aws/aws-sdk-go-v2/service/sts v1.16.3/go.mod h1:bfBj0iVmsUyUg4weDB4NxktD9rDGeKSVWnjTnwbx9b8= +github.com/aws/aws-sdk-go-v2/service/sts v1.25.3/go.mod h1:4EqRHDCKP78hq3zOnmFXu5k0j4bXbRFfCh/zQ6KnEfQ= +github.com/aws/aws-sdk-go-v2/service/sts v1.35.0 h1:FD9agdG4CeOGS3ORLByJk56YIXDS7mxFpmZyCtpqExc= +github.com/aws/aws-sdk-go-v2/service/sts v1.35.0/go.mod h1:NDzDPbBF1xtSTZUMuZx0w3hIfWzcL7X2AQ0Tr9becIQ= +github.com/aws/smithy-go v1.11.2/go.mod h1:3xHYmszWVx2c0kIwQeEVf9uSm4fYZt67FBJnwub1bgM= +github.com/aws/smithy-go v1.17.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= +github.com/aws/smithy-go v1.22.5 h1:P9ATCXPMb2mPjYBgueqJNCA5S9UfktsW0tTxi+a7eqw= +github.com/aws/smithy-go v1.22.5/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/bobg/gcsobj v0.1.2/go.mod h1:vS49EQ1A1Ib8FgrL58C8xXYZyOCR2TgzAdopy6/ipa8= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +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/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/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= +github.com/colinmarc/hdfs/v2 v2.1.1/go.mod h1:M3x+k8UKKmxtFu++uAZ0OtDU8jR3jnaZIAc6yK4Ue0c= +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/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU= +github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= +github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= +github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= +github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= +github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= +github.com/duckdb/duckdb-go-bindings v0.1.16 h1:XPCk9hzP06PoWIxDPVU3gAy0m1XmLaZHTzLggNx/U9k= +github.com/duckdb/duckdb-go-bindings v0.1.16/go.mod h1:pBnfviMzANT/9hi4bg+zW4ykRZZPCXlVuvBWEcZofkc= +github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11 h1:GXQkG4HmEbwPtqCSabJTp9wZQQ7Gqr3KveLNesQWQOs= +github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11/go.mod h1:Ezo7IbAfB8NP7CqPIN8XEHKUg5xdRRQhcPPlCXImXYA= +github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11 h1:ATJMSBIDA/YAm/6CKeBDRtGK1OOwqfTZbWg9Y5fAc9E= +github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11/go.mod h1:eS7m/mLnPQgVF4za1+xTyorKRBuK0/BA44Oy6DgrGXI= +github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11 h1:AjvnGst1avyOECYiykthyHR4DTYTaqNDPr5W/0t5j0k= +github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11/go.mod h1:1GOuk1PixiESxLaCGFhag+oFi7aP+9W8byymRAvunBk= +github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11 h1:j3B1biawuhtxe2Chkiqcwf1Kxe8VJc8lLVmjBIcJrkI= +github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11/go.mod h1:o7crKMpT2eOIi5/FY6HPqaXcvieeLSqdXXaXbruGX7w= +github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11 h1:xR3vRE8y+48U6xDNkUlOfbl7/OTA7FVcDXJ+5vETuHU= +github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11/go.mod h1:IlOhJdVKUJCAPj3QsDszUo8DVdvp1nBFp4TUJVdw99s= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +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/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= +github.com/gin-gonic/gin v1.7.3/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= +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-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +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-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= +github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-viper/mapstructure/v2 v2.3.0 h1:27XbWsHIqhbdR5TIC911OfYvgSaW93HM+dX7970Q7jk= +github.com/go-viper/mapstructure/v2 v2.3.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= +github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= +github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-jwt/jwt/v4 v4.4.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188/go.mod h1:vXjM/+wXQnTPR4KqTKDgJukSZ6amVRtWMPEjE6sQoK8= +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/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/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +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.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= +github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +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/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/flatbuffers v25.2.10+incompatible h1:F3vclr7C3HpB1k9mxCGRMXq6FdUalZ6H/pNX4FP1v0Q= +github.com/google/flatbuffers v25.2.10+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +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.6/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.8/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/go-replayers/grpcreplay v1.1.0/go.mod h1:qzAvJ8/wi57zq7gWqaE6AwLM6miiXUQwP1S+I9icmhk= +github.com/google/go-replayers/httpreplay v1.1.1/go.mod h1:gN9GeLIs7l6NUoVaSSnv2RiqK1NiwAmD0MrKeC9IIks= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+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/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +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-20200905233945-acf8798be1f7/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-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210506205249-923b5ab0fc1a/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.2.0/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.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/wire v0.5.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU= +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.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/hanwen/go-fuse v1.0.0/go.mod h1:unqXarDXqzAk0rt98O2tVndEPIpUgLD9+rwFisZH3Ok= +github.com/hanwen/go-fuse/v2 v2.1.0/go.mod h1:oRyA5eK+pvJyv5otpO/DgccS8y/RvYMaO00GgRLGryc= +github.com/hashicorp/go-uuid v0.0.0-20180228145832-27454136f036/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +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/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/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.11.0/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= +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/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.2.0/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-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/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.10.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.15.0/go.mod h1:D/zyOyXiaM1TmVWnOM18p0xdDtdakRBa0RsVGI3U3bw= +github.com/jackc/pgx/v5 v5.7.5 h1:JHGfMnQY+IEtGM63d+NGMjoRpysB2JBwDr5fsngwmJs= +github.com/jackc/pgx/v5 v5.7.5/go.mod h1:aruU7o91Tc2q2cFp5h4uP3f6ztExVpyVv88Xl/8Vl8M= +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.2.1 h1:gI8os0wpRXFd4FiAY2dWiqRK037tjj3t7rKFeO4X5iw= +github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= +github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/jcmturner/gofork v0.0.0-20180107083740-2aebee971930/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= +github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +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/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= +github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= +github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.13.1/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/klauspost/cpuid/v2 v2.2.11 h1:0OwqZRYI2rFrjS4kvkDnqJkKHdHaRnCm68/DY4OxRzU= +github.com/klauspost/cpuid/v2 v2.2.11/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= +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/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +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/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +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.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/linkedin/goavro v2.1.0+incompatible h1:DV2aUlj2xZiuxQyvag8Dy7zjY69ENjS66bWkSfdpddY= +github.com/linkedin/goavro v2.1.0+incompatible/go.mod h1:bBCwI2eGYpUI/4820s67MElg9tdeLbINjLjiM2xZFYM= +github.com/marcboeker/go-duckdb/arrowmapping v0.0.9 h1:xj+kFOqR2gH3Mcxx9LmAVHebSnCiPm303N+uxfkWVmY= +github.com/marcboeker/go-duckdb/arrowmapping v0.0.9/go.mod h1:o56AqVS90v5bpxhPnOK9La7AfNTOrMORiqTQrlRbdPQ= +github.com/marcboeker/go-duckdb/mapping v0.0.10 h1:b/y2W8/hNlD0Dwjq0mCqIlLXpjQMnWy0WqDV9b9lHQQ= +github.com/marcboeker/go-duckdb/mapping v0.0.10/go.mod h1:Ro6Tw6sGG50O8S0daZsA8TrQJz/DvGrzGvMD7Jihirw= +github.com/marcboeker/go-duckdb/v2 v2.3.2 h1:96zG2JPyIhCFjHdBjjSpOdhzJzehoGTdl7LskkuMUTs= +github.com/marcboeker/go-duckdb/v2 v2.3.2/go.mod h1:VeXz9ZM6klNvICHrXEUzaHSgNqBeTdyMxr4CICw/UaY= +github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= +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.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= +github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= +github.com/minio/minio-go/v7 v7.0.34/go.mod h1:nCrRzjoSUQh8hgKKtu3Y708OLvRLtuASMg2/nvmbarw= +github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= +github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/nats-io/nats.go v1.43.0 h1:uRFZ2FEoRvP64+UUhaTokyS18XBCR/xM2vQZKO4i8ug= +github.com/nats-io/nats.go v1.43.0/go.mod h1:iRWIPokVIFbVijxuMQq4y9ttaBTMe0SFdlZfMDd+33g= +github.com/nats-io/nkeys v0.4.11 h1:q44qGV008kYd9W1b1nEBkNzvnWxtRSQ7A8BoqRrcfa0= +github.com/nats-io/nkeys v0.4.11/go.mod h1:szDimtgmfOi9n25JpfIdGw12tZFYXqhGxjhVxsatHVE= +github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/ncw/swift v1.0.52/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= +github.com/pborman/getopt v0.0.0-20180729010549-6fdd0a2c7117/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= +github.com/pierrec/lz4/v4 v4.1.8/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= +github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= +github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +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/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +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/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.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +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/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +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.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +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.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/xitongsys/parquet-go v1.5.1/go.mod h1:xUxwM8ELydxh4edHGegYq1pA8NnMKDx0K/GyB0o2bww= +github.com/xitongsys/parquet-go v1.6.2 h1:MhCaXii4eqceKPu9BwrjLqyK10oX9WF+xGhwvwbw7xM= +github.com/xitongsys/parquet-go v1.6.2/go.mod h1:IulAQyalCm0rPiZVNnCgm/PCL64X2tdSVGMQ/UeKqWA= +github.com/xitongsys/parquet-go-source v0.0.0-20190524061010-2b72cbee77d5/go.mod h1:xxCx7Wpym/3QCo6JhujJX51dzSXrwmb0oH6FQb39SEA= +github.com/xitongsys/parquet-go-source v0.0.0-20200817004010-026bad9b25d0/go.mod h1:HYhIKsdns7xz80OgkbgJYrtQY7FjHWHKH6cvN7+czGE= +github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b h1:zbb5qM/t3N+O33Vp5sFyG6yIcWZV1q7rfEjJM8UsRBQ= +github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b/go.mod h1:2ActxmJ4q17Cdruar9nKEkzKSOL1Ol03737Bkz10rTY= +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.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= +github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= +github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= +github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= +go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0= +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.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +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/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +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.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= +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.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= +gocloud.dev v0.26.0/go.mod h1:mkUgejbnbLotorqDyvedJO20XcZNTynmSeVSQS9btVg= +golang.org/x/crypto v0.0.0-20180723164146-c126467f60eb/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +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-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/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-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-20211115234514-b4de73f9ece8/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220511200225-c6db032c6c88/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM= +golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY= +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-20250718183923-645b1fa84792 h1:R9PFI6EUdfVKgwKjZef7QIwGcBKu86OEFpJ9nUEP2l4= +golang.org/x/exp v0.0.0-20250718183923-645b1fa84792/go.mod h1:A+z0yzpGtvnG90cToK5n2tu8UJVP2XUATh+r+sfOOOc= +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/lint v0.0.0-20210508222113-6edffad5e616/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.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg= +golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ= +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-20191112182307-2180aed22343/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-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +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-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211020060615-d418f374d309/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220401154927-543a649e0bdd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +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.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +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.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +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-20210220032951-036812b2e83c/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.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= +golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +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-20191112214154-59a1497f0cea/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-20200828194041-157a740278f4/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-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/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-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/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-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220204135822-1c1b9b1eba6a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220330033206-e17cdc41300f/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-20220704084225-05e143d24a9e/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.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA= +golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +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/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +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.5/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.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4= +golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU= +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/time v0.0.0-20211116232009-f0f3c7e86c11/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220224211638-0e9765cccd65/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-20190422233926-fe54fb35175b/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-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-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-20200828161849-5deb26317202/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20200915173823-2db8f0ff891c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20200918232735-d647fc253266/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +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.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0= +golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw= +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= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +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.31.0/go.mod h1:CL+9IBCa2WWU6gRuBWaKqGWLFFwbEUXkfeMkHLQWYWo= +google.golang.org/api v0.32.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +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.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.46.0/go.mod h1:ceL4oozhkAiTID8XMmJBsIxID/9wMXJVVFXPg4ylg3I= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.58.0/go.mod h1:cAbP2FsxoGVNwtgNAmmn3y5G1TWAiVYRmg4yku3lv+E= +google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.64.0/go.mod h1:931CdxA8Rm4t6zqTFGSsgwbAEZ2+GMYurbndwSimebM= +google.golang.org/api v0.66.0/go.mod h1:I1dmXYpX7HGwz/ejRxwQp2qj5bFAz93HiCU1C1oYd9M= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.68.0/go.mod h1:sOM8pTpwgflXRhz+oC8H2Dr+UcbMqkPPWNJo88Q7TH8= +google.golang.org/api v0.69.0/go.mod h1:boanBiw+h5c3s+tBPgEzLDRHfFLWV0qXxRHz3ws7C80= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= +google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +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/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-20200513103714-09dca8ec2884/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-20200831141814-d751682dd103/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-20200914193844-75d14daec038/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200921151605-7abf4a1a14d5/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-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210429181445-86c259c2b4ab/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210517163617-5e0236093d7a/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210921142501-181ce0d877f6/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211018162055-cf77aa76bad2/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211223182754-3ac035c7e7cb/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220111164026-67b88f271998/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220114231437-d2e6a121cae0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220201184016-50beb8ab5c44/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220204002441-d6cc3cc0770e/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220211171837-173942840c17/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220216160803-4663080d8bc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220401170504-314d38edb7de/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +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.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +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.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +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.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +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-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= +gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= +gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q= +gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mNfM5bm88whjWx4= +gopkg.in/jcmturner/gokrb5.v7 v7.3.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= +gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8= +gopkg.in/linkedin/goavro.v1 v1.0.5 h1:BJa69CDh0awSsLUmZ9+BowBdokpduDZSM9Zk8oKHfN4= +gopkg.in/linkedin/goavro.v1 v1.0.5/go.mod h1:Aw5GdAbizjOEl0kAMHV9iHmA8reZzW/OKuJAl4Hb9F0= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/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/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= +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= +nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= +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/src/syncer-postgres/init_test.go b/src/syncer-postgres/lib/init_test.go similarity index 60% rename from src/syncer-postgres/init_test.go rename to src/syncer-postgres/lib/init_test.go index cbe2326..acb8862 100644 --- a/src/syncer-postgres/init_test.go +++ b/src/syncer-postgres/lib/init_test.go @@ -1,4 +1,4 @@ -package main +package postgres import ( "encoding/csv" @@ -392,413 +392,6 @@ var CSV_ROWS_PARTITIONED_TABLE1 = [][]string{{"2024-01-01 01:02:03.123456"}} var CSV_ROWS_PARTITIONED_TABLE2 = [][]string{{"2024-02-12 11:12:13"}} var CSV_ROWS_PARTITIONED_TABLE3 = [][]string{{"2024-03-30 23:59:59"}} -var JSON_ROWS_TEST_TABLE = []string{ - `{ - "before":null, - "after":{ - "id":1, - "bit_column":true, - "bool_column":true, - "bpchar_column":"bpchar ", - "varchar_column":"varchar", - "text_column":"text", - "int2_column":32767, - "int4_column":2147483647, - "int8_column":9223372036854775807, - "hugeint_column":1.0E19, - "xid_column":4294967295, - "xid8_column":1.8446744073709552E19, - "float4_column":3.14, - "float8_column":3.141592653589793, - "numeric_column":12345.67, - "numeric_column_without_precision":12345.67, - "date_column":19723, - "time_column":43200123456, - "timemscolumn":43200123, - "timetz_column":"17:00:00.123456Z", - "timetz_ms_column":"17:00:00.123Z", - "timestamp_column":1704110400123456, - "timestamp_ms_column":1704110400123, - "timestamptz_column":"2024-01-01T17:00:00.123456Z", - "timestamptz_ms_column":"2024-01-01T17:00:00.123Z", - "uuid_column":"58a7c845-af77-44b2-8664-7ca613d92f04", - "bytea_column":"48656c6c6f", - "interval_column":2806201000001, - "point_column":{ - "x":37.347301483154, - "y":45.002101898193, - "wkb":"AQEAAADW//9fdKxCQM3//99EgEZA", - "srid":null - }, - "inet_column":"192.168.0.1", - "json_column":"{\"key\": \"value\"}", - "jsonb_column":"{\"key\": \"value\", \"nestedKey\": { \"key\": \"value\" }}", - "tsvector_column":"'sampl':1 'text':2 'tsvector':4", - "xml_column":"text", - "pg_snapshot_column":"1896:1896:", - "array_text_column":[ - "one", - "two", - "three" - ], - "array_int_column":[ - 1, - 2, - 3 - ], - "array_jsonb_column":[ - "{\"key\": \"value1\"}", - "{\"key\": \"value2\"}" - ], - "array_ltree_column":[ - "a.b", - "c.d" - ], - "user_defined_column":"28546f726f6e746f29" - }, - "source":{ - "version":"3.1.3.Final", - "connector":"postgresql", - "name":"prefix", - "ts_ms":1750942485790, - "snapshot":"first_in_data_collection", - "db":"tpch", - "sequence":"[null,\"98162912\"]", - "ts_us":1750942485790370, - "ts_ns":1750942485790370000, - "schema":"public", - "table":"test_table", - "txId":2352, - "lsn":98162912, - "xmin":null - }, - "transaction":null, - "op":"c", - "ts_ms":1750942485897, - "ts_us":1750942485897437, - "ts_ns":1750942485897437000 - }`, - `{ - "before":null, - "after":{ - "id":2, - "bit_column":null, - "bool_column":false, - "bpchar_column":"TEST", - "varchar_column":null, - "text_column":"", - "int2_column":-32767, - "int4_column":null, - "int8_column":-9223372036854775807, - "hugeint_column":null, - "xid_column":null, - "xid8_column":null, - "float4_column":"NaN", - "float8_column":-3.141592653589793, - "numeric_column":-12345.0, - "numeric_column_without_precision":null, - "date_column":6594769, - "time_column":43200123000, - "timemscolumn":null, - "timetz_column":"07:00:00.123Z", - "timetz_ms_column":"07:00:00.1Z", - "timestamp_column":1704110400000000, - "timestamp_ms_column":null, - "timestamptz_column":"2024-01-01T06:30:00.000123Z", - "timestamptz_ms_column":"2024-01-01T07:00:00.120Z", - "uuid_column":null, - "bytea_column":null, - "interval_column":null, - "point_column":null, - "inet_column":null, - "json_column":null, - "jsonb_column":"{}", - "tsvector_column":null, - "xml_column":null, - "pg_snapshot_column":null, - "array_text_column":null, - "array_int_column":[], - "array_jsonb_column":null, - "array_ltree_column":null, - "user_defined_column":null - }, - "source":{ - "version":"3.1.3.Final", - "connector":"postgresql", - "name":"prefix", - "ts_ms":1750942485790, - "snapshot":"last", - "db":"tpch", - "sequence":"[null,\"98162912\"]", - "ts_us":1750942485790370, - "ts_ns":1750942485790370000, - "schema":"public", - "table":"test_table", - "txId":2352, - "lsn":98162912, - "xmin":null - }, - "transaction":null, - "op":"c", - "ts_ms":1750942485898, - "ts_us":1750942485898829, - "ts_ns":1750942485898829000 - }`, - `{ - "before":{ - "id":2, - "bit_column":null, - "bool_column":false, - "bpchar_column":"TEST", - "varchar_column":null, - "text_column":"", - "int2_column":-32767, - "int4_column":null, - "int8_column":-9223372036854775807, - "hugeint_column":null, - "xid_column":null, - "xid8_column":null, - "float4_column":"NaN", - "float8_column":-3.141592653589793, - "numeric_column":-12345.0, - "numeric_column_without_precision":null, - "date_column":6594769, - "time_column":43200123000, - "timemscolumn":null, - "timetz_column":"07:00:00.123Z", - "timetz_ms_column":"07:00:00.1Z", - "timestamp_column":1704110400000000, - "timestamp_ms_column":null, - "timestamptz_column":"2024-01-01T06:30:00.000123Z", - "timestamptz_ms_column":"2024-01-01T07:00:00.120Z", - "uuid_column":null, - "bytea_column":null, - "interval_column":null, - "point_column":null, - "inet_column":null, - "json_column":null, - "jsonb_column":"{}", - "tsvector_column":null, - "xml_column":null, - "pg_snapshot_column":null, - "array_text_column":null, - "array_int_column":[], - "array_jsonb_column":null, - "array_ltree_column":null, - "user_defined_column":null - - }, - "after":{ - "id":2, - "bit_column":null, - "bool_column":false, - "bpchar_column":" ", - "varchar_column":null, - "text_column":"", - "int2_column":-32767, - "int4_column":null, - "int8_column":-9223372036854775807, - "hugeint_column":null, - "xid_column":null, - "xid8_column":null, - "float4_column":"NaN", - "float8_column":-3.141592653589793, - "numeric_column":-12345.0, - "numeric_column_without_precision":null, - "date_column":6594769, - "time_column":43200123000, - "timemscolumn":null, - "timetz_column":"07:00:00.123Z", - "timetz_ms_column":"07:00:00.1Z", - "timestamp_column":1704110400000000, - "timestamp_ms_column":null, - "timestamptz_column":"2024-01-01T06:30:00.000123Z", - "timestamptz_ms_column":"2024-01-01T07:00:00.120Z", - "uuid_column":null, - "bytea_column":null, - "interval_column":null, - "point_column":null, - "inet_column":null, - "json_column":null, - "jsonb_column":"{}", - "tsvector_column":null, - "xml_column":null, - "pg_snapshot_column":null, - "array_text_column":null, - "array_int_column":[ - - ], - "array_jsonb_column":null, - "array_ltree_column":null, - "user_defined_column":null - }, - "source":{ - "version":"3.1.3.Final", - "connector":"postgresql", - "name":"prefix", - "ts_ms":1750942485790, - "snapshot":"last", - "db":"tpch", - "sequence":"[null,\"98162912\"]", - "ts_us":1750942485790370, - "ts_ns":1750942485790370000, - "schema":"public", - "table":"test_table", - "txId":2352, - "lsn":98162912, - "xmin":null - }, - "transaction":null, - "op":"u", - "ts_ms":1750942485898, - "ts_us":1750942485898829, - "ts_ns":1750942485898829000 - }`, -} -var JSON_ROWS_PARTITIONED_TABLE1 = []string{ - `{ - "before":null, - "after":{ - "timestamp_column":1704070923123456 - }, - "source":{ - "version":"3.1.3.Final", - "connector":"postgresql", - "name":"prefix", - "ts_ms":1750942485790, - "snapshot":"last_in_data_collection", - "db":"tpch", - "sequence":"[null,\"98162912\"]", - "ts_us":1750942485790370, - "ts_ns":1750942485790370000, - "schema":"public", - "table":"partitioned_table1", - "txId":2352, - "lsn":98162912, - "xmin":null - }, - "transaction":null, - "op":"c", - "ts_ms":1750942485881, - "ts_us":1750942485881498, - "ts_ns":1750942485881498000 - }`, -} -var JSON_ROWS_PARTITIONED_TABLE2 = []string{ - `{ - "before":null, - "after":{ - "timestamp_column":1707736333000000 - }, - "source":{ - "version":"3.1.3.Final", - "connector":"postgresql", - "name":"prefix", - "ts_ms":1750942485790, - "snapshot":"last_in_data_collection", - "db":"tpch", - "sequence":"[null,\"98162912\"]", - "ts_us":1750942485790370, - "ts_ns":1750942485790370000, - "schema":"public", - "table":"partitioned_table2", - "txId":2352, - "lsn":98162912, - "xmin":null - }, - "transaction":null, - "op":"c", - "ts_ms":1750942485882, - "ts_us":1750942485882849, - "ts_ns":1750942485882849000 - }`, -} -var JSON_ROWS_PARTITIONED_TABLE3 = []string{ - `{ - "before":null, - "after":{ - "timestamp_column":1711843199000000 - }, - "source":{ - "version":"3.1.3.Final", - "connector":"postgresql", - "name":"prefix", - "ts_ms":1750942485790, - "snapshot":"last_in_data_collection", - "db":"tpch", - "sequence":"[null,\"98162912\"]", - "ts_us":1750942485790370, - "ts_ns":1750942485790370000, - "schema":"public", - "table":"partitioned_table3", - "txId":2352, - "lsn":98162912, - "xmin":null - }, - "transaction":null, - "op":"c", - "ts_ms":1750942485884, - "ts_us":1750942485884078, - "ts_ns":1750942485884078000 - }`, -} -var JSON_ROWS_EMPTY_TABLE = []string{ - `{ - "before":null, - "after":{ - "id":1 - }, - "source":{ - "version":"3.1.3.Final", - "connector":"postgresql", - "name":"prefix", - "ts_ms":1750942485790, - "snapshot":"last_in_data_collection", - "db":"tpch", - "sequence":"[null,\"98162912\"]", - "ts_us":1750942485790370, - "ts_ns":1750942485790370000, - "schema":"test", - "table":"empty_table", - "txId":2352, - "lsn":98162912, - "xmin":null - }, - "transaction":null, - "op":"c", - "ts_ms":1750942485884, - "ts_us":1750942485884078, - "ts_ns":1750942485884078000 - }`, - `{ - "before":{ - "id":1 - }, - "after":null, - "source":{ - "version":"3.1.3.Final", - "connector":"postgresql", - "name":"prefix", - "ts_ms":1750942485790, - "snapshot":"last_in_data_collection", - "db":"tpch", - "sequence":"[null,\"98162912\"]", - "ts_us":1750942485790370, - "ts_ns":1750942485790370000, - "schema":"test", - "table":"empty_table", - "txId":2352, - "lsn":98162912, - "xmin":null - }, - "transaction":null, - "op":"d", - "ts_ms":1750942485884, - "ts_us":1750942485884078, - "ts_ns":1750942485884078000 - }`, -} - func init() { config := loadTestConfig() @@ -838,23 +431,19 @@ func init() { createTestTableViaFullRefresh(syncer, PgSchemaTable{Schema: "public", Table: "partitioned_table2"}, PG_SCHEMA_COLUMNS_PARTITIONED_TABLE, CSV_ROWS_PARTITIONED_TABLE2) createTestTableViaFullRefresh(syncer, PgSchemaTable{Schema: "public", Table: "partitioned_table3"}, PG_SCHEMA_COLUMNS_PARTITIONED_TABLE, CSV_ROWS_PARTITIONED_TABLE3) createTestTableViaFullRefresh(syncer, PgSchemaTable{Schema: "test", Table: "empty_table"}, PG_SCHEMA_COLUMNS_EMPTY_TABLE, [][]string{}) - case SyncModeCDC: - panic("CDC is not supported") } } func loadTestConfig() *Config { setTestArgs([]string{}) - _config.DatabaseUrl = "postgres://test:test@localhost:5432/dummy" - return LoadConfig() } func setTestArgs(args []string) { os.Args = append([]string{"cmd"}, args...) flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ExitOnError) - registerFlags() + RegisterFlags() } func createTestTableViaFullRefresh(syncer *SyncerFullRefresh, pgSchemaTable PgSchemaTable, pgSchemaColumns []PgSchemaColumn, rows [][]string) { diff --git a/src/syncer-postgres/nats.go b/src/syncer-postgres/lib/nats.go similarity index 97% rename from src/syncer-postgres/nats.go rename to src/syncer-postgres/lib/nats.go index 4e0e9f2..cf97889 100644 --- a/src/syncer-postgres/nats.go +++ b/src/syncer-postgres/lib/nats.go @@ -1,4 +1,4 @@ -package main +package postgres import ( "context" diff --git a/src/syncer-postgres/pg_schema_column.go b/src/syncer-postgres/lib/pg_schema_column.go similarity index 99% rename from src/syncer-postgres/pg_schema_column.go rename to src/syncer-postgres/lib/pg_schema_column.go index d8ab70e..e16bd95 100644 --- a/src/syncer-postgres/pg_schema_column.go +++ b/src/syncer-postgres/lib/pg_schema_column.go @@ -1,4 +1,4 @@ -package main +package postgres import ( "strings" diff --git a/src/syncer-postgres/pg_schema_table.go b/src/syncer-postgres/lib/pg_schema_table.go similarity index 98% rename from src/syncer-postgres/pg_schema_table.go rename to src/syncer-postgres/lib/pg_schema_table.go index 534d8d7..951caf8 100644 --- a/src/syncer-postgres/pg_schema_table.go +++ b/src/syncer-postgres/lib/pg_schema_table.go @@ -1,4 +1,4 @@ -package main +package postgres import ( "fmt" diff --git a/src/syncer-postgres/postgres.go b/src/syncer-postgres/lib/postgres.go similarity index 99% rename from src/syncer-postgres/postgres.go rename to src/syncer-postgres/lib/postgres.go index 5852856..fbfacec 100644 --- a/src/syncer-postgres/postgres.go +++ b/src/syncer-postgres/lib/postgres.go @@ -1,4 +1,4 @@ -package main +package postgres import ( "context" diff --git a/src/syncer-postgres/syncer.go b/src/syncer-postgres/lib/syncer.go similarity index 99% rename from src/syncer-postgres/syncer.go rename to src/syncer-postgres/lib/syncer.go index f696c08..9def78b 100644 --- a/src/syncer-postgres/syncer.go +++ b/src/syncer-postgres/lib/syncer.go @@ -1,4 +1,4 @@ -package main +package postgres import ( "net/url" diff --git a/src/syncer-postgres/syncer_full_refresh.go b/src/syncer-postgres/lib/syncer_full_refresh.go similarity index 99% rename from src/syncer-postgres/syncer_full_refresh.go rename to src/syncer-postgres/lib/syncer_full_refresh.go index c9e9505..2c505af 100644 --- a/src/syncer-postgres/syncer_full_refresh.go +++ b/src/syncer-postgres/lib/syncer_full_refresh.go @@ -1,4 +1,4 @@ -package main +package postgres import ( "github.com/BemiHQ/BemiDB/src/common" diff --git a/src/syncer-postgres/syncer_utils.go b/src/syncer-postgres/lib/syncer_utils.go similarity index 98% rename from src/syncer-postgres/syncer_utils.go rename to src/syncer-postgres/lib/syncer_utils.go index c2b4a21..fc31827 100644 --- a/src/syncer-postgres/syncer_utils.go +++ b/src/syncer-postgres/lib/syncer_utils.go @@ -1,4 +1,4 @@ -package main +package postgres import ( "github.com/BemiHQ/BemiDB/src/common" diff --git a/src/syncer-postgres/main.go b/src/syncer-postgres/main.go index 175e944..b5239ea 100644 --- a/src/syncer-postgres/main.go +++ b/src/syncer-postgres/main.go @@ -2,12 +2,17 @@ package main import ( "github.com/BemiHQ/BemiDB/src/common" + "github.com/BemiHQ/BemiDB/src/syncer-postgres/lib" ) +func init() { + postgres.RegisterFlags() +} + func main() { - config := LoadConfig() + config := postgres.LoadConfig() defer common.HandleUnexpectedPanic(config.CommonConfig) - syncer := NewSyncer(config) + syncer := postgres.NewSyncer(config) syncer.Sync() } From db77d66beef7113d25ce11fa9aabc4886e0bf862 Mon Sep 17 00:00:00 2001 From: exAspArk Date: Fri, 19 Sep 2025 13:45:46 -0400 Subject: [PATCH 16/24] Add support for [column] ? 'key' operator, fix Attio pagination --- README.md | 1 + src/common/iceberg_table_writer.go | 4 ++-- src/server/parser_a_expr.go | 14 ++++++++++++++ src/server/query_handler_test.go | 5 +++++ src/server/query_remapper.go | 2 +- src/server/query_remapper_expression.go | 7 +++++-- src/syncer-attio/lib/attio.go | 14 ++++++++------ 7 files changed, 36 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index d316897..5b89dca 100644 --- a/README.md +++ b/README.md @@ -316,6 +316,7 @@ SELECT * FROM [TABLE] WHERE [JSON_COLUMN]->>'[JSON_KEY]' = '[JSON_VALUE]'; - [x] TablePlus - [x] DBeaver - [x] pgAdmin + - [x] Grafana - [ ] Jupyter notebooks ([#27](https://github.com/BemiHQ/BemiDB/issues/27)) - [x] Data syncing from other sources - [x] Amplitude (incremental) diff --git a/src/common/iceberg_table_writer.go b/src/common/iceberg_table_writer.go index 394edc9..c56ddac 100644 --- a/src/common/iceberg_table_writer.go +++ b/src/common/iceberg_table_writer.go @@ -675,7 +675,7 @@ func (writer *IcebergTableWriter) jsonToDuckdbRowValues(rowValues map[string]int } tableColumnNames := make([]string, len(writer.IcebergSchemaColumns)) for i, icebergSchemaColumn := range writer.IcebergSchemaColumns { - tableColumnNames[i] = strings.ToLower(icebergSchemaColumn.ColumnName) // Debezium JSON keys are lowercase + tableColumnNames[i] = icebergSchemaColumn.ColumnName } if len(rowColumnNames) != len(tableColumnNames) { Panic(writer.Config, "Row column names count doesn't match table column names count: "+strings.Join(rowColumnNames, ", ")+" (row) vs "+strings.Join(tableColumnNames, ", ")+" (table)") @@ -691,7 +691,7 @@ func (writer *IcebergTableWriter) jsonToDuckdbRowValues(rowValues map[string]int // Convert row values to DuckDB values duckdbRowValues := make([]driver.Value, len(writer.IcebergSchemaColumns)) for i, icebergSchemaColumn := range writer.IcebergSchemaColumns { - columnName := strings.ToLower(icebergSchemaColumn.ColumnName) // Debezium JSON keys are lowercase + columnName := icebergSchemaColumn.ColumnName value := rowValues[columnName] duckdbRowValues[i] = icebergSchemaColumn.DuckdbValueFromJson(value) } diff --git a/src/server/parser_a_expr.go b/src/server/parser_a_expr.go index 6ac2204..fc23284 100644 --- a/src/server/parser_a_expr.go +++ b/src/server/parser_a_expr.go @@ -62,6 +62,20 @@ func (parser *ParserAExpr) RemappedJsonExtract(node *pgQuery.Node) *pgQuery.Node ) } +// [column] ? 'key' -> json_exists([column], 'key') +func (parser *ParserAExpr) RemappedJsonExists(node *pgQuery.Node) *pgQuery.Node { + aExpr := parser.AExpr(node) + if aExpr == nil || parser.OperatorName(aExpr) != "?" { + return node + } + + return pgQuery.MakeFuncCallNode( + []*pgQuery.Node{pgQuery.MakeStrNode("json_exists")}, + []*pgQuery.Node{aExpr.Lexpr, aExpr.Rexpr}, + 0, + ) +} + func (parser *ParserAExpr) OperatorName(aExpr *pgQuery.A_Expr) string { if aExpr.Kind != pgQuery.A_Expr_Kind_AEXPR_OP || len(aExpr.Name) != 1 { return "" diff --git a/src/server/query_handler_test.go b/src/server/query_handler_test.go index 887250a..534a331 100644 --- a/src/server/query_handler_test.go +++ b/src/server/query_handler_test.go @@ -931,6 +931,11 @@ func TestHandleQuery(t *testing.T) { "types": {uint32ToString(pgtype.TextOID)}, "values": {"value"}, }, + "SELECT json_column ? 'key' AS exists FROM postgres.test_table WHERE id = 1": { + "description": {"exists"}, + "types": {uint32ToString(pgtype.BoolOID)}, + "values": {"t"}, + }, "SELECT jsonb_column FROM postgres.test_table WHERE bool_column = FALSE": { "description": {"jsonb_column"}, "types": {uint32ToString(pgtype.TextOID)}, diff --git a/src/server/query_remapper.go b/src/server/query_remapper.go index 4143fcf..8543158 100644 --- a/src/server/query_remapper.go +++ b/src/server/query_remapper.go @@ -372,7 +372,7 @@ func (remapper *QueryRemapper) remappedExpressions(node *pgQuery.Node, remappedC remapper.remapSelectStatement(subSelect, permissions, indentLevel+1) // recursion } - // Comparison + // Operator: =, ?, etc. aExpr := node.GetAExpr() if aExpr != nil { node = remapper.remapperExpression.RemappedExpression(node) diff --git a/src/server/query_remapper_expression.go b/src/server/query_remapper_expression.go index c7bede5..1f80684 100644 --- a/src/server/query_remapper_expression.go +++ b/src/server/query_remapper_expression.go @@ -25,7 +25,7 @@ func NewQueryRemapperExpression(config *Config) *QueryRemapperExpression { func (remapper *QueryRemapperExpression) RemappedExpression(node *pgQuery.Node) *pgQuery.Node { node = remapper.remappedTypeCast(node) - node = remapper.remappedArithmeticExpression(node) + node = remapper.remappedOperatorExpression(node) node = remapper.remappedCollateClause(node) node = remapper.remappedNullColumnExpression(node) remapper.remapColumnReference(node) @@ -80,7 +80,7 @@ func (remapper *QueryRemapperExpression) remappedTypeCast(node *pgQuery.Node) *p return node } -func (remapper *QueryRemapperExpression) remappedArithmeticExpression(node *pgQuery.Node) *pgQuery.Node { +func (remapper *QueryRemapperExpression) remappedOperatorExpression(node *pgQuery.Node) *pgQuery.Node { aExpr := remapper.parserAExpr.AExpr(node) if aExpr == nil { return node @@ -98,6 +98,9 @@ func (remapper *QueryRemapperExpression) remappedArithmeticExpression(node *pgQu // [column]->'value' -> json_extract([column], 'value') node = remapper.parserAExpr.RemappedJsonExtract(node) + // [column] ? 'key' -> json_exists([column], 'key') + node = remapper.parserAExpr.RemappedJsonExists(node) + return node } diff --git a/src/syncer-attio/lib/attio.go b/src/syncer-attio/lib/attio.go index e6345be..58b6dbb 100644 --- a/src/syncer-attio/lib/attio.go +++ b/src/syncer-attio/lib/attio.go @@ -1,6 +1,7 @@ package attio import ( + "bytes" "encoding/json" "fmt" "io" @@ -40,23 +41,24 @@ type ListRecordsResponse struct { func (attio *Attio) Load(object string, jsonQueueWriter *common.JsonQueueWriter) error { offset := 0 for { - req, err := http.NewRequest("POST", ATTIO_API_URL+"/objects/"+object+"/records/query", nil) + jsonBody, err := json.Marshal(map[string]interface{}{"limit": ATTIO_API_LIMIT, "offset": offset}) + if err != nil { + return err + } + req, err := http.NewRequest("POST", ATTIO_API_URL+"/objects/"+object+"/records/query", bytes.NewBuffer(jsonBody)) if err != nil { return err } - q := req.URL.Query() - q.Add("limit", common.IntToString(ATTIO_API_LIMIT)) - q.Add("offset", common.IntToString(offset)) - req.URL.RawQuery = q.Encode() - req.Header.Set("Authorization", "Bearer "+attio.Config.ApiAccessToken) req.Header.Set("Content-Type", "application/json") + common.LogInfo(attio.Config.CommonConfig, "Sending request to Attio:", req.URL.String(), "with body:", string(jsonBody)) resp, err := attio.HttpClient.Do(req) if err != nil { return err } + common.LogDebug(attio.Config.CommonConfig, "Received response from Attio:", resp.Status) if resp.StatusCode != http.StatusOK { body, _ := io.ReadAll(resp.Body) resp.Body.Close() From ca8c113f025d13b574ee93c9be76a799df40057b Mon Sep 17 00:00:00 2001 From: exAspArk Date: Fri, 19 Sep 2025 13:59:02 -0400 Subject: [PATCH 17/24] Add support for jsonb_array_length(), jsonb_pretty(), to_char() --- src/common/common_config.go | 2 +- src/server/query_handler_test.go | 15 +++++++++++++++ src/server/query_remapper_function.go | 14 ++++++++++++++ src/server/response_handler.go | 2 +- 4 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/common/common_config.go b/src/common/common_config.go index b909e82..a0abc39 100644 --- a/src/common/common_config.go +++ b/src/common/common_config.go @@ -1,7 +1,7 @@ package common const ( - VERSION = "1.4.0" + VERSION = "1.5.0" ENV_LOG_LEVEL = "BEMIDB_LOG_LEVEL" ENV_DISABLE_ANONYMOUS_ANALYTICS = "BEMIDB_DISABLE_ANONYMOUS_ANALYTICS" diff --git a/src/server/query_handler_test.go b/src/server/query_handler_test.go index 534a331..8d61bc8 100644 --- a/src/server/query_handler_test.go +++ b/src/server/query_handler_test.go @@ -188,6 +188,21 @@ func TestHandleQuery(t *testing.T) { "types": {uint32ToString(pgtype.Int4OID)}, "values": {""}, }, + "SELECT jsonb_array_length('[1, 2, 3]'::jsonb)": { + "description": {"jsonb_array_length"}, + "types": {uint32ToString(pgtype.XID8OID)}, + "values": {"3"}, + }, + "SELECT jsonb_pretty('{\"key\": \"value\"}'::JSONB)": { + "description": {"jsonb_pretty"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"{\n \"key\": \"value\"\n}"}, + }, + "SELECT TO_CHAR('2024-01-15 14:30:00'::timestamp, 'YYYY-MM-DD')": { + "description": {"to_char"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"2024-01-15"}, + }, }) }) diff --git a/src/server/query_remapper_function.go b/src/server/query_remapper_function.go index f5b977d..c453b68 100644 --- a/src/server/query_remapper_function.go +++ b/src/server/query_remapper_function.go @@ -41,6 +41,8 @@ func CreatePgCatalogMacroQueries(config *Config) []string { ELSE json_extract_path_text(from_json, path_elems)::varchar END`, `CREATE MACRO jsonb_object_agg(key, value) AS to_json(map(array_agg(key), array_agg(value)))`, + `CREATE MACRO jsonb_array_length(json) AS json_array_length(json)`, + `CREATE MACRO jsonb_pretty(json) AS json_pretty(json)`, `CREATE MACRO json_build_object(k1, v1) AS json_object(k1, v1), (k1, v1, k2, v2) AS json_object(k1, v1, k2, v2), (k1, v1, k2, v2, k3, v3) AS json_object(k1, v1, k2, v2, k3, v3), @@ -50,6 +52,18 @@ func CreatePgCatalogMacroQueries(config *Config) []string { WHEN 1 THEN len(arr) ELSE NULL END`, + `CREATE MACRO to_char(timestamp, text) AS + CASE text + WHEN 'YYYY-MM-DD' THEN strftime(timestamp, '%Y-%m-%d') + WHEN 'YYYY-MM-DD HH24:MI:SS' THEN strftime(timestamp, '%Y-%m-%d %H:%M:%S') + WHEN 'MM/DD/YYYY' THEN strftime(timestamp, '%m/%d/%Y') + WHEN 'DD-MON-YYYY' THEN strftime(timestamp, '%d-%b-%Y') + WHEN 'HH24:MI:SS' THEN strftime(timestamp, '%H:%M:%S') + WHEN 'YYYY' THEN strftime(timestamp, '%Y') + WHEN 'MM' THEN strftime(timestamp, '%m') + WHEN 'DD' THEN strftime(timestamp, '%d') + ELSE strftime(timestamp, text) + END`, // Table functions "CREATE MACRO pg_is_in_recovery() AS TABLE SELECT false AS pg_is_in_recovery", diff --git a/src/server/response_handler.go b/src/server/response_handler.go index 941833d..74717c2 100644 --- a/src/server/response_handler.go +++ b/src/server/response_handler.go @@ -120,7 +120,7 @@ func (responseHandler *ResponseHandler) RowValuePointer(col *sql.ColumnType) int return new(sql.NullInt32) case "int64", "*big.Int": return new(sql.NullInt64) - case "float64", "float32": + case "uint64", "float64", "float32": return new(sql.NullFloat64) case "string": // return a *sql.NullString so Scan writes into the right type From 8b959bc27157c528c7950559ea18b505ed71b885 Mon Sep 17 00:00:00 2001 From: exAspArk Date: Sat, 20 Sep 2025 15:16:01 -0400 Subject: [PATCH 18/24] Log the number of currently active connections --- src/common/duckdb_client.go | 14 +++++++------- src/common/iceberg_table_writer.go | 5 +---- src/server/main.go | 8 ++++++-- src/syncer-postgres/lib/debezium.go | 1 + 4 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/common/duckdb_client.go b/src/common/duckdb_client.go index a958e65..82ba503 100644 --- a/src/common/duckdb_client.go +++ b/src/common/duckdb_client.go @@ -67,12 +67,12 @@ func NewDuckdbClient(config *CommonConfig, bootQueries ...[]string) *DuckdbClien } func (client *DuckdbClient) QueryContext(ctx context.Context, query string) (*sql.Rows, error) { - LogDebug(client.Config, "Querying DuckDBClient:", query) + LogDebug(client.Config, "Querying DuckDB:", query) return client.Db.QueryContext(ctx, query) } func (client *DuckdbClient) QueryRowContext(ctx context.Context, query string, args ...map[string]string) *sql.Row { - LogDebug(client.Config, "Querying DuckDBClient:", query) + LogDebug(client.Config, "Querying DuckDB row:", query) if len(args) == 0 { return client.Db.QueryRowContext(ctx, query) } @@ -80,12 +80,12 @@ func (client *DuckdbClient) QueryRowContext(ctx context.Context, query string, a } func (client *DuckdbClient) PrepareContext(ctx context.Context, query string) (*sql.Stmt, error) { - LogDebug(client.Config, "Preparing DuckDBClient statement:", query) + LogDebug(client.Config, "Preparing DuckDB statement:", query) return client.Db.PrepareContext(ctx, query) } func (client *DuckdbClient) ExecContext(ctx context.Context, query string, args ...map[string]string) (sql.Result, error) { - LogDebug(client.Config, "Querying DuckDBClient:", query) + LogDebug(client.Config, "Executing DuckDB:", query) if len(args) == 0 { return client.Db.ExecContext(ctx, query) } @@ -95,13 +95,13 @@ func (client *DuckdbClient) ExecContext(ctx context.Context, query string, args func (client *DuckdbClient) ExecTransactionContext(ctx context.Context, queries []string, args ...[]map[string]string) error { tx, err := client.Db.Begin() - LogDebug(client.Config, "Querying DuckDBClient: BEGIN") + LogDebug(client.Config, "Executing DuckDB: BEGIN") if err != nil { return err } for i, query := range queries { - LogDebug(client.Config, "Querying DuckDBClient:", query) + LogDebug(client.Config, "Executing DuckDB in transaction:", query) var err error if len(args) == 0 { _, err = tx.ExecContext(ctx, query) @@ -114,7 +114,7 @@ func (client *DuckdbClient) ExecTransactionContext(ctx context.Context, queries } } - LogDebug(client.Config, "Querying DuckDBClient: COMMIT") + LogDebug(client.Config, "Executing DuckDB: COMMIT") return tx.Commit() } diff --git a/src/common/iceberg_table_writer.go b/src/common/iceberg_table_writer.go index c56ddac..0f5f534 100644 --- a/src/common/iceberg_table_writer.go +++ b/src/common/iceberg_table_writer.go @@ -129,9 +129,6 @@ func (writer *IcebergTableWriter) UniqueIndexColumnNames() []string { uniqueIndexColumnNames = append(uniqueIndexColumnNames, icebergSchemaColumn.ColumnName) } } - if len(uniqueIndexColumnNames) == 0 { - Panic(writer.Config, "Cannot update Iceberg table without unique index columns: "+writer.IcebergTable.String()) - } return uniqueIndexColumnNames } @@ -597,7 +594,7 @@ func (writer *IcebergTableWriter) deleteObject(key string) { fileName = strings.Split(key, "/metadata/")[1] } - LogInfo(writer.Config, "Deleting object:", fileName) + LogDebug(writer.Config, "Deleting object:", fileName) writer.StorageS3.S3Client.DeleteObject(key) } diff --git a/src/server/main.go b/src/server/main.go index e181d7b..8167fbf 100644 --- a/src/server/main.go +++ b/src/server/main.go @@ -5,6 +5,7 @@ import ( "net/http" _ "net/http/pprof" "slices" + "sync/atomic" "github.com/BemiHQ/BemiDB/src/common" ) @@ -33,15 +34,18 @@ func main() { queryHandler := NewQueryHandler(config, duckdbClient) + var connectionCount int64 = 0 for { conn := AcceptConnection(config, tcpListener) - common.LogInfo(config.CommonConfig, "BemiDB: Accepted connection from", conn.RemoteAddr()) + atomic.AddInt64(&connectionCount, 1) + common.LogInfo(config.CommonConfig, "BemiDB: Accepted", common.Int64ToString(atomic.LoadInt64(&connectionCount))+"th", "connection from", conn.RemoteAddr()) server := NewPostgresServer(config, &conn) go func() { server.Run(queryHandler) defer server.Close() - common.LogInfo(config.CommonConfig, "BemiDB: Closed connection from", conn.RemoteAddr()) + common.LogInfo(config.CommonConfig, "BemiDB: Closed", common.Int64ToString(atomic.LoadInt64(&connectionCount))+"th", "connection from", conn.RemoteAddr()) + atomic.AddInt64(&connectionCount, -1) }() } } diff --git a/src/syncer-postgres/lib/debezium.go b/src/syncer-postgres/lib/debezium.go index 5daede8..41f0962 100644 --- a/src/syncer-postgres/lib/debezium.go +++ b/src/syncer-postgres/lib/debezium.go @@ -18,6 +18,7 @@ type DebeziumRowSource struct { Schema string `json:"schema"` Table string `json:"table"` CommittedAtNs int64 `json:"ts_ns"` + Position int64 `json:"lsn"` } type DebeziumRowData struct { From b5adc12afc8ced5be52b2e4b7d2a8296db70c66e Mon Sep 17 00:00:00 2001 From: exAspArk Date: Tue, 23 Sep 2025 17:55:38 -0400 Subject: [PATCH 19/24] Release v1.6.0 --- scripts/catalog.sql | 6 +- src/common/common_config.go | 2 +- src/common/iceberg_catalog.go | 47 +- src/common/iceberg_schema_column.go | 162 +++-- src/common/iceberg_table.go | 4 +- src/common/iceberg_table_writer.go | 4 +- src/common/storage_s3.go | 60 -- src/common/storage_utils.go | 6 +- src/server/iceberg_reader.go | 10 +- src/server/parser_function.go | 2 + src/server/parser_table.go | 15 + src/server/pg_constants.go | 8 +- src/server/postgres_server.go | 8 +- src/server/query_handler.go | 8 +- src/server/query_handler_test.go | 31 +- src/server/query_remapper.go | 14 +- src/server/query_remapper_expression.go | 2 + src/server/query_remapper_function.go | 4 + src/server/query_remapper_table.go | 654 +++++++++++++++----- src/syncer-amplitude/lib/event.go | 16 +- src/syncer-postgres/lib/init_test.go | 2 + src/syncer-postgres/lib/pg_schema_column.go | 43 +- src/syncer-postgres/lib/syncer.go | 2 + 23 files changed, 784 insertions(+), 326 deletions(-) diff --git a/scripts/catalog.sql b/scripts/catalog.sql index 2c4219f..409e14e 100644 --- a/scripts/catalog.sql +++ b/scripts/catalog.sql @@ -1,12 +1,12 @@ CREATE TABLE IF NOT EXISTS iceberg_tables ( - catalog_name VARCHAR(255) NOT NULL, table_namespace VARCHAR(255) NOT NULL, table_name VARCHAR(255) NOT NULL, metadata_location VARCHAR(1000), - previous_metadata_location VARCHAR(1000), - PRIMARY KEY (catalog_name, table_namespace, table_name) + columns JSONB ); +CREATE UNIQUE INDEX IF NOT EXISTS idx_tables ON iceberg_tables (table_namespace, table_name); + CREATE TABLE IF NOT EXISTS iceberg_materialized_views ( schema_name VARCHAR(255) NOT NULL, table_name VARCHAR(255) NOT NULL, diff --git a/src/common/common_config.go b/src/common/common_config.go index a0abc39..2ca391c 100644 --- a/src/common/common_config.go +++ b/src/common/common_config.go @@ -1,7 +1,7 @@ package common const ( - VERSION = "1.5.0" + VERSION = "1.6.0" ENV_LOG_LEVEL = "BEMIDB_LOG_LEVEL" ENV_DISABLE_ANONYMOUS_ANALYTICS = "BEMIDB_DISABLE_ANONYMOUS_ANALYTICS" diff --git a/src/common/iceberg_catalog.go b/src/common/iceberg_catalog.go index ff2f2e3..44dd5d2 100644 --- a/src/common/iceberg_catalog.go +++ b/src/common/iceberg_catalog.go @@ -2,6 +2,7 @@ package common import ( "context" + "encoding/json" "fmt" "strings" ) @@ -9,10 +10,10 @@ import ( const ( TEMP_TABLE_SUFFIX_SYNCING = "-bemidb-syncing" TEMP_TABLE_SUFFIX_DELETING = "-bemidb-deleting" - - CATALOG_NAME_PLACEHOLDER = "postgres" // Trino legacy, to delete ) +// --------------------------------------------------------------------------------------------------------------------- + type IcebergSchemaTable struct { Schema string Table string @@ -26,6 +27,8 @@ func (schemaTable IcebergSchemaTable) String() string { return fmt.Sprintf(`"%s"."%s"`, schemaTable.Schema, schemaTable.Table) } +// --------------------------------------------------------------------------------------------------------------------- + type IcebergMaterializedView struct { Schema string Table string @@ -39,6 +42,8 @@ func (view IcebergMaterializedView) ToIcebergSchemaTable() IcebergSchemaTable { } } +// --------------------------------------------------------------------------------------------------------------------- + type IcebergCatalog struct { Config *CommonConfig } @@ -170,6 +175,29 @@ func (catalog *IcebergCatalog) SchemaTableNames(schemaName string) Set[string] { return tableNames } +func (catalog *IcebergCatalog) TableColumns(icebergSchemaTable IcebergSchemaTable) ([]CatalogTableColumn, error) { + pgClient := catalog.newPostgresClient() + defer pgClient.Close() + + var columnsJson []byte + err := pgClient.QueryRow( + context.Background(), + "SELECT columns FROM iceberg_tables WHERE table_namespace=$1 AND table_name=$2", + icebergSchemaTable.Schema, icebergSchemaTable.Table, + ).Scan(&columnsJson) + if err != nil { + return nil, err + } + + var catalogTableColumns []CatalogTableColumn + err = json.Unmarshal(columnsJson, &catalogTableColumns) + if err != nil { + return nil, err + } + + return catalogTableColumns, nil +} + func (catalog *IcebergCatalog) TableS3Path(icebergTableName IcebergSchemaTable) string { metadataFileS3Path := catalog.MetadataFileS3Path(icebergTableName) if metadataFileS3Path == "" { @@ -181,17 +209,24 @@ func (catalog *IcebergCatalog) TableS3Path(icebergTableName IcebergSchemaTable) // Write --------------------------------------------------------------------------------------------------------------- -func (catalog *IcebergCatalog) CreateTable(icebergSchemaTable IcebergSchemaTable, metadataLocation string) { +func (catalog *IcebergCatalog) CreateTable(icebergSchemaTable IcebergSchemaTable, metadataLocation string, icebergSchemaColumns []*IcebergSchemaColumn) { pgClient := catalog.newPostgresClient() defer pgClient.Close() - _, err := pgClient.Exec( + catalogTableColumns := make([]CatalogTableColumn, len(icebergSchemaColumns)) + for i, icebergSchemaColumn := range icebergSchemaColumns { + catalogTableColumns[i] = icebergSchemaColumn.CatalogTableColumn() + } + columnsJson, err := json.Marshal(catalogTableColumns) + PanicIfError(catalog.Config, err) + + _, err = pgClient.Exec( context.Background(), - "INSERT INTO iceberg_tables (catalog_name, table_namespace, table_name, metadata_location) VALUES ($1, $2, $3, $4)", - CATALOG_NAME_PLACEHOLDER, + "INSERT INTO iceberg_tables (table_namespace, table_name, metadata_location, columns) VALUES ($1, $2, $3, $4)", icebergSchemaTable.Schema, icebergSchemaTable.Table, metadataLocation, + columnsJson, ) PanicIfError(catalog.Config, err) } diff --git a/src/common/iceberg_schema_column.go b/src/common/iceberg_schema_column.go index cd02ecd..f8f6381 100644 --- a/src/common/iceberg_schema_column.go +++ b/src/common/iceberg_schema_column.go @@ -14,6 +14,7 @@ import ( ) type IcebergColumnType string +type IcebergLogicalColumnType string const ( IcebergColumnTypeBoolean IcebergColumnType = "boolean" @@ -29,50 +30,81 @@ const ( IcebergColumnTypeTimestamp IcebergColumnType = "timestamp" IcebergColumnTypeBinary IcebergColumnType = "binary" + IcebergLogicalColumnTypeInterval IcebergLogicalColumnType = "interval" + IcebergLogicalColumnTypeBpchar IcebergLogicalColumnType = "bpchar" + IcebergLogicalColumnTypePoint IcebergLogicalColumnType = "point" + IcebergLogicalColumnTypeJson IcebergLogicalColumnType = "json" + IcebergLogicalColumnTypeUserDefined IcebergLogicalColumnType = "user_defined" + BEMIDB_NULL_STRING = "BEMIDB_NULL" PARQUET_NAN = 0 // DuckDB crashes on NaN, libc++abi: terminating due to uncaught exception of type duckdb::InvalidConfigurationException: {"exception_type":"Invalid Configuration","exception_message":"Column float4_column lower bound deserialization failed: Failed to deserialize blob '' of size 0, attempting to produce value of type 'FLOAT'"} PARQUET_MAX_DECIMAL_PRECISION = 38 PARQUET_FALLBACK_DECIMAL_SCALE = 6 PARQUET_NESTED_FIELD_ID_PREFIX = 1000 - - PG_USER_DEFINED_PRIMITIVE_TYPE = "USER_DEFINED" ) -type IcebergSchemaColumn struct { - Config *CommonConfig - ColumnName string - ColumnType IcebergColumnType - Position int - NumericPrecision int - NumericScale int - DatetimePrecision int - IsList bool - IsRequired bool - IsPartOfUniqueIndex bool - PgPrimitiveColumnType string +type CatalogTableColumn struct { + Name string `json:"name"` + Type string `json:"type"` + Position int `json:"position"` + List bool `json:"list"` + Required bool `json:"required"` +} + +func (tableColumn CatalogTableColumn) ToSql() string { + sql := fmt.Sprintf(`"%s" %s`, tableColumn.Name, tableColumn.Type) + + if tableColumn.List { + sql += "[]" + } + + if tableColumn.Required { + sql += " NOT NULL" + } + + return sql } -type ParquetSchemaField struct { - FieldId string - Name string - Type string - ConvertedType string - RepetitionType string - Scale string - Precision string - Length string - NestedType string - NestedConvertedType string - NestedRepetitionType string - NestedFieldId string +func (tableColumn CatalogTableColumn) ToMetadataFieldMap() map[string]interface{} { + primitiveType := tableColumn.Type + if primitiveType == "json" { + primitiveType = "string" + } + + result := map[string]interface{}{ + "id": tableColumn.Position, + "name": tableColumn.Name, + "type": primitiveType, + "required": tableColumn.Required, + } + + if tableColumn.List { + result["type"] = map[string]interface{}{ + "type": "list", + "element": primitiveType, + "element-id": PARQUET_NESTED_FIELD_ID_PREFIX + tableColumn.Position, + "element-required": false, + } + } + + return result } -type IcebergSchemaField struct { - Id int `json:"id"` - Name string `json:"name"` - Type interface{} `json:"type"` - Required bool `json:"required"` +// --------------------------------------------------------------------------------------------------------------------- + +type IcebergSchemaColumn struct { + Config *CommonConfig + ColumnName string + ColumnType IcebergColumnType + LogicalColumnType IcebergLogicalColumnType + Position int + NumericPrecision int + NumericScale int + DatetimePrecision int + IsList bool + IsRequired bool + IsPartOfUniqueIndex bool } func (col *IcebergSchemaColumn) NormalizedColumnName() string { @@ -97,51 +129,47 @@ func (col *IcebergSchemaColumn) NormalizedScale() int { return col.NumericScale } -func (col *IcebergSchemaColumn) IcebergSchemaFieldMap() IcebergSchemaField { - icebergSchemaField := IcebergSchemaField{ - Id: col.Position, - Name: col.NormalizedColumnName(), +func (col *IcebergSchemaColumn) CatalogTableColumn() CatalogTableColumn { + catalogTableColumn := CatalogTableColumn{ + Name: col.NormalizedColumnName(), + Position: col.Position, + Required: col.IsRequired, + List: col.IsList, } switch col.ColumnType { case IcebergColumnTypeBoolean: - icebergSchemaField.Type = "boolean" + catalogTableColumn.Type = "boolean" case IcebergColumnTypeString: - icebergSchemaField.Type = "string" + switch col.LogicalColumnType { + case IcebergLogicalColumnTypeJson: + catalogTableColumn.Type = "json" + default: + catalogTableColumn.Type = "string" + } case IcebergColumnTypeInteger: - icebergSchemaField.Type = "int" + catalogTableColumn.Type = "int" case IcebergColumnTypeDecimal: - icebergSchemaField.Type = "decimal(" + IntToString(col.NormalizedPrecision()) + ", " + IntToString(col.NormalizedScale()) + ")" + catalogTableColumn.Type = "decimal(" + IntToString(col.NormalizedPrecision()) + ", " + IntToString(col.NormalizedScale()) + ")" case IcebergColumnTypeLong: - icebergSchemaField.Type = "long" + catalogTableColumn.Type = "long" case IcebergColumnTypeFloat: - icebergSchemaField.Type = "float" + catalogTableColumn.Type = "float" case IcebergColumnTypeDouble: - icebergSchemaField.Type = "double" + catalogTableColumn.Type = "double" case IcebergColumnTypeDate: - icebergSchemaField.Type = "date" + catalogTableColumn.Type = "date" case IcebergColumnTypeTime, IcebergColumnTypeTimeTz: - icebergSchemaField.Type = "time" + catalogTableColumn.Type = "time" case IcebergColumnTypeTimestamp: - icebergSchemaField.Type = "timestamp" + catalogTableColumn.Type = "timestamp" case IcebergColumnTypeBinary: - icebergSchemaField.Type = "binary" + catalogTableColumn.Type = "binary" default: panic("Unsupported column type: " + string(col.ColumnType)) } - icebergSchemaField.Required = col.IsRequired - - if col.IsList { - icebergSchemaField.Type = map[string]interface{}{ - "type": "list", - "element": icebergSchemaField.Type, - "element-id": PARQUET_NESTED_FIELD_ID_PREFIX + col.Position, - "element-required": false, - } - } - - return icebergSchemaField + return catalogTableColumn } func (col *IcebergSchemaColumn) DuckdbType() string { @@ -250,8 +278,8 @@ func (col *IcebergSchemaColumn) duckdbPrimitiveValueFromCsv(value string) interf } return valueFloat case IcebergColumnTypeDecimal: - switch col.PgPrimitiveColumnType { - case "interval": + switch col.LogicalColumnType { + case IcebergLogicalColumnTypeInterval: microseconds := 0 parts := strings.Split(value, " ") @@ -341,13 +369,13 @@ func (col *IcebergSchemaColumn) duckdbPrimitiveValueFromJson(value any) interfac return value } case IcebergColumnTypeString: - switch col.PgPrimitiveColumnType { - case "bpchar": + switch col.LogicalColumnType { + case IcebergLogicalColumnTypeBpchar: return strings.TrimRight(value.(string), " ") - case "point": + case IcebergLogicalColumnTypePoint: valueMap := value.(map[string]interface{}) return "(" + Float64ToString(valueMap["x"].(float64)) + "," + Float64ToString(valueMap["y"].(float64)) + ")" - case PG_USER_DEFINED_PRIMITIVE_TYPE: + case IcebergLogicalColumnTypeUserDefined: valueString := value.(string) valueDecodedHex, err := HexToString(valueString) if err == nil { @@ -378,6 +406,8 @@ func (col *IcebergSchemaColumn) duckdbPrimitiveValueFromJson(value any) interfac case reflect.Float64: days := value.(float64) return time.Unix(0, 0).UTC().AddDate(0, 0, int(days)) + default: + Panic(col.Config, fmt.Sprintf("Unsupported value: %v for column type: %s", value, col.ColumnType)) } case IcebergColumnTypeTime: var nanoseconds int64 @@ -426,6 +456,8 @@ func (col *IcebergSchemaColumn) duckdbPrimitiveValueFromJson(value any) interfac } milliseconds := int64(valueFloat) return epoch.Add(time.Duration(milliseconds) * time.Millisecond) + default: + Panic(col.Config, fmt.Sprintf("Unsupported value: %v for column type: %s", value, col.ColumnType)) } } diff --git a/src/common/iceberg_table.go b/src/common/iceberg_table.go index 000498a..7c78c09 100644 --- a/src/common/iceberg_table.go +++ b/src/common/iceberg_table.go @@ -38,9 +38,9 @@ func (table *IcebergTable) MetadataFileS3Path() string { return table.IcebergCatalog.MetadataFileS3Path(table.IcebergSchemaTable) } -func (table *IcebergTable) Create(tableS3Path string) { +func (table *IcebergTable) Create(tableS3Path string, icebergSchemaColumns []*IcebergSchemaColumn) { LogInfo(table.Config, "Creating Iceberg table:", table.IcebergSchemaTable.Table) - table.IcebergCatalog.CreateTable(table.IcebergSchemaTable, tableS3Path+"/metadata/"+ICEBERG_METADATA_INITIAL_FILE_NAME) + table.IcebergCatalog.CreateTable(table.IcebergSchemaTable, tableS3Path+"/metadata/"+ICEBERG_METADATA_INITIAL_FILE_NAME, icebergSchemaColumns) } func (table *IcebergTable) ReplaceWith(callbackFunc func(syncingIcebergTable *IcebergTable)) { diff --git a/src/common/iceberg_table_writer.go b/src/common/iceberg_table_writer.go index 0f5f534..cd8c9db 100644 --- a/src/common/iceberg_table_writer.go +++ b/src/common/iceberg_table_writer.go @@ -162,7 +162,7 @@ func (writer *IcebergTableWriter) InsertFromQuery(query string) error { LogInfo(writer.Config, "Written", parquetFile.RecordCount, "records in Parquet file #"+IntToString(len(parquetFilesSortedAsc)), "("+writer.formattedParquetFileSize(parquetFile.Size)+")") // Create as table - writer.IcebergTable.Create(tableS3Path) + writer.IcebergTable.Create(tableS3Path, icebergSchemaColumns) return nil } @@ -213,7 +213,7 @@ func (writer *IcebergTableWriter) insertRows(loadRowsToDuckdbTableFunc func(duck // Create table if len(parquetFilesSortedAsc) == 1 { - writer.IcebergTable.Create(tableS3Path) + writer.IcebergTable.Create(tableS3Path, writer.IcebergSchemaColumns) } // Delete old files diff --git a/src/common/storage_s3.go b/src/common/storage_s3.go index 717feeb..1d6085c 100644 --- a/src/common/storage_s3.go +++ b/src/common/storage_s3.go @@ -2,11 +2,9 @@ package common import ( "context" - "encoding/json" "fmt" "io" "os" - "reflect" "strings" "time" @@ -72,27 +70,6 @@ type MetadataFile struct { Key string } -type IcebergTableField struct { - Name string - Type string - Required bool - IsList bool -} - -func (tableField IcebergTableField) ToSql() string { - sql := fmt.Sprintf(`"%s" %s`, tableField.Name, tableField.Type) - - if tableField.IsList { - sql += "[]" - } - - if tableField.Required { - sql += " NOT NULL" - } - - return sql -} - func NewStorageS3(Config *CommonConfig) *StorageS3 { return &StorageS3{ S3Client: NewS3Client(Config), @@ -190,11 +167,6 @@ func (storage *StorageS3) DeleteTableFiles(tableS3Path string) { // Read ---------------------------------------------------------------------------------------------------------------- -func (storage *StorageS3) IcebergTableFields(metadataS3Path string) ([]IcebergTableField, error) { - metadataContent := storage.readObjectContent(metadataS3Path) - return storage.parseIcebergTableFields(metadataContent) -} - func (storage *StorageS3) LastManifestListFile(metadataS3Path string) ManifestListFile { metadataContent := storage.readObjectContent(metadataS3Path) return storage.StorageUtils.ParseLastManifestListFile(storage.S3Client.BucketS3Prefix(), metadataContent) @@ -273,35 +245,3 @@ func (storage *StorageS3) deleteNestedObjects(prefixS3Key string) { LogDebug(storage.Config, "No objects to delete.") } } - -func (storage *StorageS3) parseIcebergTableFields(metadataContent []byte) ([]IcebergTableField, error) { - var metadataJson MetadataJson - err := json.Unmarshal(metadataContent, &metadataJson) - if err != nil { - return nil, err - } - - var icebergTableFields []IcebergTableField - schema := metadataJson.Schemas[len(metadataJson.Schemas)-1] // Get the last schema - if schema.Fields != nil { - for _, field := range schema.Fields { - icebergTableField := IcebergTableField{ - Name: field.Name, - } - - if reflect.TypeOf(field.Type).Kind() == reflect.String { - icebergTableField.Type = field.Type.(string) - icebergTableField.Required = field.Required - } else { - listType := field.Type.(map[string]interface{}) - icebergTableField.Type = listType["element"].(string) - icebergTableField.Required = listType["element-required"].(bool) - icebergTableField.IsList = true - } - - icebergTableFields = append(icebergTableFields, icebergTableField) - } - } - - return icebergTableFields, nil -} diff --git a/src/common/storage_utils.go b/src/common/storage_utils.go index 75aff4b..cd9eb2a 100644 --- a/src/common/storage_utils.go +++ b/src/common/storage_utils.go @@ -384,9 +384,9 @@ func (utils *StorageUtils) WriteMetadataFile(s3TablePath string, filePath string } } - icebergSchemaFields := make([]interface{}, len(icebergSchemaColumns)) + catalogTableColumns := make([]interface{}, len(icebergSchemaColumns)) for i, icebergSchemaColumn := range icebergSchemaColumns { - icebergSchemaFields[i] = icebergSchemaColumn.IcebergSchemaFieldMap() + catalogTableColumns[i] = icebergSchemaColumn.CatalogTableColumn().ToMetadataFieldMap() } snapshots := make([]map[string]interface{}, len(manifestListFilesSortedAsc)) @@ -444,7 +444,7 @@ func (utils *StorageUtils) WriteMetadataFile(s3TablePath string, filePath string map[string]interface{}{ "type": "struct", "schema-id": 0, - "fields": icebergSchemaFields, + "fields": catalogTableColumns, "identifier-field-ids": []interface{}{}, }, }, diff --git a/src/server/iceberg_reader.go b/src/server/iceberg_reader.go index c59aabd..563d55a 100644 --- a/src/server/iceberg_reader.go +++ b/src/server/iceberg_reader.go @@ -6,14 +6,12 @@ import ( type IcebergReader struct { Config *Config - StorageS3 *common.StorageS3 IcebergCatalog *common.IcebergCatalog } -func NewIcebergReader(config *Config, storageS3 *common.StorageS3, icebergCatalog *common.IcebergCatalog) *IcebergReader { +func NewIcebergReader(config *Config, icebergCatalog *common.IcebergCatalog) *IcebergReader { return &IcebergReader{ Config: config, - StorageS3: storageS3, IcebergCatalog: icebergCatalog, } } @@ -30,10 +28,8 @@ func (reader *IcebergReader) MaterializedView(icebergSchemaTable common.IcebergS return reader.IcebergCatalog.MaterializedView(icebergSchemaTable) } -func (reader *IcebergReader) TableFields(icebergSchemaTable common.IcebergSchemaTable) (icebergTableFields []common.IcebergTableField, err error) { - metadataPath := reader.MetadataFileS3Path(icebergSchemaTable) - common.LogDebug(reader.Config.CommonConfig, "Reading Iceberg table "+icebergSchemaTable.String()+" fields from "+metadataPath+" ...") - return reader.StorageS3.IcebergTableFields(metadataPath) +func (reader *IcebergReader) TableColumns(icebergSchemaTable common.IcebergSchemaTable) (catalogTableColumns []common.CatalogTableColumn, err error) { + return reader.IcebergCatalog.TableColumns(icebergSchemaTable) } func (reader *IcebergReader) MetadataFileS3Path(icebergSchemaTable common.IcebergSchemaTable) string { diff --git a/src/server/parser_function.go b/src/server/parser_function.go index d9ea9d3..2b74353 100644 --- a/src/server/parser_function.go +++ b/src/server/parser_function.go @@ -59,6 +59,8 @@ func (parser *ParserFunction) RemapSchemaToMain(functionCall *pgQuery.FuncCall) functionCall.Funcname = append([]*pgQuery.Node{pgQuery.MakeStrNode(DUCKDB_SCHEMA_MAIN)}, functionCall.Funcname...) case 2: functionCall.Funcname[0] = pgQuery.MakeStrNode(DUCKDB_SCHEMA_MAIN) + default: + common.Panic(parser.config.CommonConfig, "Unexpected function name length: "+common.IntToString(len(functionCall.Funcname))) } } diff --git a/src/server/parser_table.go b/src/server/parser_table.go index 2af9f87..80e5a30 100644 --- a/src/server/parser_table.go +++ b/src/server/parser_table.go @@ -129,6 +129,21 @@ func (parser *ParserTable) TableFunctionCalls(rangeFunction *pgQuery.RangeFuncti return functionCalls } +func (parser *ParserTable) Alias(rangeFunction *pgQuery.RangeFunction) string { + if rangeFunction.GetAlias() != nil { + return rangeFunction.GetAlias().Aliasname + } + + return "" +} + +func (parser *ParserTable) SetAlias(rangeFunction *pgQuery.RangeFunction, alias string, columnName string) { + rangeFunction.Alias = &pgQuery.Alias{ + Aliasname: alias, + Colnames: []*pgQuery.Node{pgQuery.MakeStrNode(columnName)}, + } +} + func (parser *ParserTable) SetAliasIfNotExists(rangeFunction *pgQuery.RangeFunction, alias string) { if rangeFunction.GetAlias() != nil { return diff --git a/src/server/pg_constants.go b/src/server/pg_constants.go index 8ed8c74..58f1ab2 100644 --- a/src/server/pg_constants.go +++ b/src/server/pg_constants.go @@ -9,9 +9,11 @@ const ( PG_SCHEMA_PG_CATALOG = "pg_catalog" PG_SCHEMA_PUBLIC = "public" - PG_FUNCTION_FORMAT = "format" - PG_FUNCTION_ENCODE = "encode" - PG_FUNCTION_JSONB_AGG = "jsonb_agg" + PG_FUNCTION_FORMAT = "format" + PG_FUNCTION_ENCODE = "encode" + PG_FUNCTION_JSONB_AGG = "jsonb_agg" + PG_FUNCTION_JSON_ARRAY_ELEMENTS = "json_array_elements" + PG_FUNCTION_JSONB_ARRAY_ELEMENTS = "jsonb_array_elements" PG_TABLE_PG_MATVIEWS = "pg_matviews" PG_TABLE_PG_CLASS = "pg_class" diff --git a/src/server/postgres_server.go b/src/server/postgres_server.go index fba0e6e..9a25f5c 100644 --- a/src/server/postgres_server.go +++ b/src/server/postgres_server.go @@ -2,6 +2,7 @@ package main import ( "errors" + "fmt" "net" "github.com/jackc/pgx/v5/pgproto3" @@ -74,7 +75,7 @@ func (server *PostgresServer) Run(queryHandler *QueryHandler) { case *pgproto3.Query: server.handleSimpleQuery(queryHandler, message) case *pgproto3.Parse: - err = server.handleExtendedQuery(queryHandler, message) + err = server.handleExtendedQuery(queryHandler, message) // recursion if err != nil { return // Terminate connection } @@ -170,6 +171,11 @@ func (server *PostgresServer) handleExtendedQuery(queryHandler *QueryHandler, pa } // Otherwise, wait for Bind/Describe/Execute/Sync. // For example, psycopg sends Parse->[extra Sync]->Bind->Describe->Execute->Sync + case *pgproto3.Parse: + server.handleExtendedQuery(queryHandler, message) // self-recursion + return nil + default: + return fmt.Errorf("received unexpected message type from client: %T", message) } } } diff --git a/src/server/query_handler.go b/src/server/query_handler.go index 4728008..3856840 100644 --- a/src/server/query_handler.go +++ b/src/server/query_handler.go @@ -48,7 +48,7 @@ type PreparedStatement struct { func NewQueryHandler(config *Config, serverDuckdbClient *common.DuckdbClient) *QueryHandler { storageS3 := common.NewStorageS3(config.CommonConfig) icebergCatalog := common.NewIcebergCatalog(config.CommonConfig) - icebergReader := NewIcebergReader(config, storageS3, icebergCatalog) + icebergReader := NewIcebergReader(config, icebergCatalog) icebergWriter := NewIcebergWriter(config, storageS3, serverDuckdbClient, icebergCatalog) queryHandler := &QueryHandler{ @@ -193,6 +193,8 @@ func (queryHandler *QueryHandler) HandleDescribeQuery(message *pgproto3.Describe if message.Name != preparedStatement.Portal { return nil, nil, fmt.Errorf("portal mismatch, %s instead of %s: %s", message.Name, preparedStatement.Portal, preparedStatement.OriginalQuery) } + default: + return nil, nil, fmt.Errorf("unsupported describe object type: %c. Original query: %s", message.ObjectType, preparedStatement.OriginalQuery) } preparedStatement.Described = true @@ -277,12 +279,16 @@ func (queryHandler *QueryHandler) rowsToDataMessages(rows *sql.Rows, originalQue commandTag = "DISCARD ALL" case strings.HasPrefix(upperOriginalQueryStatement, "BEGIN"): commandTag = "BEGIN" + case strings.HasPrefix(upperOriginalQueryStatement, "COMMIT"): + commandTag = "COMMIT" case strings.HasPrefix(upperOriginalQueryStatement, "CREATE MATERIALIZED VIEW "): commandTag = "CREATE MATERIALIZED VIEW" case strings.HasPrefix(upperOriginalQueryStatement, "DROP MATERIALIZED VIEW "): commandTag = "DROP MATERIALIZED VIEW" case strings.HasPrefix(upperOriginalQueryStatement, "REFRESH MATERIALIZED VIEW "): commandTag = "REFRESH MATERIALIZED VIEW" + default: + // Fallback to SELECT from FALLBACK_SQL_QUERY } messages = append(messages, &pgproto3.CommandComplete{CommandTag: []byte(commandTag)}) diff --git a/src/server/query_handler_test.go b/src/server/query_handler_test.go index 8d61bc8..ad4a864 100644 --- a/src/server/query_handler_test.go +++ b/src/server/query_handler_test.go @@ -198,6 +198,21 @@ func TestHandleQuery(t *testing.T) { "types": {uint32ToString(pgtype.TextOID)}, "values": {"{\n \"key\": \"value\"\n}"}, }, + "SELECT json_array_elements('[{\"key\": \"value1\"}]')": { + "description": {"json_array_elements"}, + "types": {uint32ToString(pgtype.JSONOID)}, + "values": {"{\"key\":\"value1\"}"}, + }, + "SELECT value FROM json_array_elements('[{\"key\": \"value1\"}]')": { + "description": {"value"}, + "types": {uint32ToString(pgtype.JSONOID)}, + "values": {"{\"key\":\"value1\"}"}, + }, + "SELECT foo FROM jsonb_array_elements('[{\"key\": \"value1\"}]') AS foo": { + "description": {"foo"}, + "types": {uint32ToString(pgtype.JSONOID)}, + "values": {"{\"key\":\"value1\"}"}, + }, "SELECT TO_CHAR('2024-01-15 14:30:00'::timestamp, 'YYYY-MM-DD')": { "description": {"to_char"}, "types": {uint32ToString(pgtype.TextOID)}, @@ -380,6 +395,11 @@ func TestHandleQuery(t *testing.T) { "types": {uint32ToString(pgtype.TextOID)}, "values": {"user"}, }, + "SELECT oid FROM pg_type WHERE typname = 'text'": { + "description": {"oid"}, + "types": {uint32ToString(pgtype.OIDOID)}, + "values": {"25"}, + }, }) }) @@ -549,12 +569,12 @@ func TestHandleQuery(t *testing.T) { "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'json_column'": { "description": {"udt_name"}, "types": {uint32ToString(pgtype.TextOID)}, - "values": {"text"}, + "values": {"json"}, }, "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'jsonb_column'": { "description": {"udt_name"}, "types": {uint32ToString(pgtype.TextOID)}, - "values": {"text"}, + "values": {"json"}, }, "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'tsvector_column'": { "description": {"udt_name"}, @@ -584,7 +604,7 @@ func TestHandleQuery(t *testing.T) { "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'array_jsonb_column'": { "description": {"udt_name"}, "types": {uint32ToString(pgtype.TextOID)}, - "values": {"_text"}, + "values": {"_json"}, }, "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'array_ltree_column'": { "description": {"udt_name"}, @@ -1176,6 +1196,11 @@ func TestHandleQuery(t *testing.T) { "types": {uint32ToString(pgtype.TextOID)}, "values": {}, }, + "SELECT relname FROM pg_catalog.pg_namespace, pg_catalog.pg_class LEFT JOIN pg_catalog.pg_description d ON (d.classoid = 'pg_class'::regclass) WHERE relname = 'test_table' AND nspname = 'postgres'": { + "description": {"relname"}, + "types": {uint32ToString(pgtype.TextOID)}, + "values": {"test_table"}, + }, }) }) diff --git a/src/server/query_remapper.go b/src/server/query_remapper.go index 8543158..18b0999 100644 --- a/src/server/query_remapper.go +++ b/src/server/query_remapper.go @@ -34,7 +34,6 @@ var KNOWN_SET_STATEMENTS = common.NewSet[string]().AddAll([]string{ var NOOP_QUERY_TREE, _ = pgQuery.Parse("SET TimeZone = 'UTC'") type QueryRemapper struct { - parserTypeCast *ParserTypeCast remapperTable *QueryRemapperTable remapperExpression *QueryRemapperExpression remapperFunction *QueryRemapperFunction @@ -47,7 +46,6 @@ type QueryRemapper struct { func NewQueryRemapper(config *Config, icebergReader *IcebergReader, icebergWriter *IcebergWriter, serverDuckdbClient *common.DuckdbClient) *QueryRemapper { return &QueryRemapper{ - parserTypeCast: NewParserTypeCast(config), remapperTable: NewQueryRemapperTable(config, icebergReader, serverDuckdbClient), remapperExpression: NewQueryRemapperExpression(config), remapperFunction: NewQueryRemapperFunction(config, icebergReader), @@ -219,11 +217,6 @@ func (remapper *QueryRemapper) remapSelectStatement(selectStatement *pgQuery.Sel remapper.remapSelectStatement(rightSelectStatement, permissions, indentLevel+1) // self-recursion } - // JOIN - if len(selectStatement.FromClause) > 0 && selectStatement.FromClause[0].GetJoinExpr() != nil { - selectStatement.FromClause[0] = remapper.remapJoinExpressions(selectStatement, selectStatement.FromClause[0], remappedColumnRefs, permissions, indentLevel+1) // recursion - } - // WHERE if selectStatement.WhereClause != nil { remapper.traceTreeTraversal("WHERE statements", indentLevel) @@ -245,9 +238,14 @@ func (remapper *QueryRemapper) remapSelectStatement(selectStatement *pgQuery.Sel } } - // FROM if len(selectStatement.FromClause) > 0 { for i, fromNode := range selectStatement.FromClause { + // JOIN + if fromNode.GetJoinExpr() != nil { + selectStatement.FromClause[i] = remapper.remapJoinExpressions(selectStatement, fromNode, remappedColumnRefs, permissions, indentLevel+1) // recursion + } + + // FROM if fromNode.GetRangeVar() != nil { // FROM [TABLE] remapper.traceTreeTraversal("FROM table", indentLevel) diff --git a/src/server/query_remapper_expression.go b/src/server/query_remapper_expression.go index 1f80684..a5815b2 100644 --- a/src/server/query_remapper_expression.go +++ b/src/server/query_remapper_expression.go @@ -75,6 +75,8 @@ func (remapper *QueryRemapperExpression) remappedTypeCast(node *pgQuery.Node) *p return node } remapper.parserTypeCast.SetTypeCastArg(typeCast, nestedTypeCast.Arg) + default: + // Allow other type casts as-is (regtype, etc.) } return node diff --git a/src/server/query_remapper_function.go b/src/server/query_remapper_function.go index c453b68..3bf962b 100644 --- a/src/server/query_remapper_function.go +++ b/src/server/query_remapper_function.go @@ -43,6 +43,8 @@ func CreatePgCatalogMacroQueries(config *Config) []string { `CREATE MACRO jsonb_object_agg(key, value) AS to_json(map(array_agg(key), array_agg(value)))`, `CREATE MACRO jsonb_array_length(json) AS json_array_length(json)`, `CREATE MACRO jsonb_pretty(json) AS json_pretty(json)`, + `CREATE MACRO json_array_elements(json) AS unnest(json_extract(json, '$[*]'))`, + `CREATE MACRO jsonb_array_elements(json) AS unnest(json_extract(json, '$[*]'))`, `CREATE MACRO json_build_object(k1, v1) AS json_object(k1, v1), (k1, v1, k2, v2) AS json_object(k1, v1, k2, v2), (k1, v1, k2, v2, k3, v3) AS json_object(k1, v1, k2, v2, k3, v3), @@ -67,6 +69,8 @@ func CreatePgCatalogMacroQueries(config *Config) []string { // Table functions "CREATE MACRO pg_is_in_recovery() AS TABLE SELECT false AS pg_is_in_recovery", + `CREATE MACRO json_array_elements(json) AS TABLE SELECT unnest(json_extract(json, '$[*]'))`, + `CREATE MACRO jsonb_array_elements(json) AS TABLE SELECT unnest(json_extract(json, '$[*]'))`, `CREATE MACRO pg_show_all_settings() AS TABLE SELECT name, value AS setting, diff --git a/src/server/query_remapper_table.go b/src/server/query_remapper_table.go index ce7ba7e..e1a24bd 100644 --- a/src/server/query_remapper_table.go +++ b/src/server/query_remapper_table.go @@ -12,141 +12,6 @@ import ( var PG_CATALOG_TABLE_NAMES = common.Set[string]{} -func CreatePgCatalogTableQueries(config *Config) []string { - result := []string{ - // Static empty tables - "CREATE TABLE pg_inherits(inhrelid oid, inhparent oid, inhseqno int4, inhdetachpending bool)", - "CREATE TABLE pg_shdescription(objoid oid, classoid oid, description text)", - "CREATE TABLE pg_statio_user_tables(relid oid, schemaname text, relname text, heap_blks_read int8, heap_blks_hit int8, idx_blks_read int8, idx_blks_hit int8, toast_blks_read int8, toast_blks_hit int8, tidx_blks_read int8, tidx_blks_hit int8)", - "CREATE TABLE pg_replication_slots(slot_name text, plugin text, slot_type text, datoid oid, database text, temporary bool, active bool, active_pid int4, xmin int8, catalog_xmin int8, restart_lsn text, confirmed_flush_lsn text, wal_status text, safe_wal_size int8, two_phase bool, conflicting bool)", - "CREATE TABLE pg_stat_gssapi(pid int4, gss_authenticated bool, principal text, encrypted bool, credentials_delegated bool)", - "CREATE TABLE pg_auth_members(oid text, roleid oid, member oid, grantor oid, admin_option bool, inherit_option bool, set_option bool)", - "CREATE TABLE pg_stat_activity(datid oid, datname text, pid int4, usesysid oid, usename text, application_name text, client_addr inet, client_hostname text, client_port int4, backend_start timestamp, xact_start timestamp, query_start timestamp, state_change timestamp, wait_event_type text, wait_event text, state text, backend_xid int8, backend_xmin int8, query text, backend_type text)", - "CREATE TABLE pg_views(schemaname text, viewname text, viewowner text, definition text)", - "CREATE TABLE pg_matviews(schemaname text, matviewname text, matviewowner text, tablespace text, hasindexes bool, ispopulated bool, definition text)", - "CREATE TABLE pg_opclass(oid oid, opcmethod oid, opcname text, opcnamespace oid, opcowner oid, opcfamily oid, opcintype oid, opcdefault bool, opckeytype oid)", - "CREATE TABLE pg_policy(oid oid, polname text, polrelid oid, polcmd text, polpermissive bool, polroles oid, polqual text, polwithcheck text)", - "CREATE TABLE pg_statistic_ext(oid oid, stxrelid oid, stxname text, stxnamespace oid, stxowner oid, stxstattarget int4, stxkeys oid, stxkind text, stxexprs text)", - "CREATE TABLE pg_publication(oid oid, pubname text, pubowner oid, puballtables bool, pubinsert bool, pubupdate bool, pubdelete bool, pubtruncate bool, pubviaroot bool)", - "CREATE TABLE pg_publication_rel(oid oid, prpubid oid, prrelid oid, prqual text, prattrs text)", - "CREATE TABLE pg_publication_namespace(oid oid, pnpubid oid, pnnspid oid)", - "CREATE TABLE pg_rewrite(oid oid, rulename text, ev_class oid, ev_type char, ev_enabled char, is_instead bool, ev_qual text, ev_action text)", - - // Dynamic tables - // DuckDB doesn't handle dynamic view replacement properly - "CREATE TABLE pg_stat_user_tables(relid oid, schemaname text, relname text, seq_scan int8, last_seq_scan timestamp, seq_tup_read int8, idx_scan int8, last_idx_scan timestamp, idx_tup_fetch int8, n_tup_ins int8, n_tup_upd int8, n_tup_del int8, n_tup_hot_upd int8, n_tup_newpage_upd int8, n_live_tup int8, n_dead_tup int8, n_mod_since_analyze int8, n_ins_since_vacuum int8, last_vacuum timestamp, last_autovacuum timestamp, last_analyze timestamp, last_autoanalyze timestamp, vacuum_count int8, autovacuum_count int8, analyze_count int8, autoanalyze_count int8)", - - // Static views - "CREATE VIEW pg_shadow AS SELECT '" + config.User + "' AS usename, '10'::oid AS usesysid, FALSE AS usecreatedb, FALSE AS usesuper, TRUE AS userepl, FALSE AS usebypassrls, '" + config.EncryptedPassword + "' AS passwd, NULL::timestamp AS valuntil, NULL::text[] AS useconfig", - "CREATE VIEW pg_roles AS SELECT '10'::oid AS oid, '" + config.User + "' AS rolname, TRUE AS rolsuper, TRUE AS rolinherit, TRUE AS rolcreaterole, TRUE AS rolcreatedb, TRUE AS rolcanlogin, FALSE AS rolreplication, -1 AS rolconnlimit, NULL::text AS rolpassword, NULL::timestamp AS rolvaliduntil, FALSE AS rolbypassrls, NULL::text[] AS rolconfig", - "CREATE VIEW pg_extension AS SELECT '13823'::oid AS oid, 'plpgsql' AS extname, '10'::oid AS extowner, '11'::oid AS extnamespace, FALSE AS extrelocatable, '1.0'::text AS extversion, NULL::text[] AS extconfig, NULL::text[] AS extcondition", - "CREATE VIEW pg_database AS SELECT '16388'::oid AS oid, '" + config.Database + "' AS datname, '10'::oid AS datdba, '6'::int4 AS encoding, 'c' AS datlocprovider, FALSE AS datistemplate, TRUE AS datallowconn, '-1'::int4 AS datconnlimit, '722'::int8 AS datfrozenxid, '1'::int4 AS datminmxid, '1663'::oid AS dattablespace, 'en_US.UTF-8' AS datcollate, 'en_US.UTF-8' AS datctype, 'en_US.UTF-8' AS datlocale, NULL::text AS daticurules, NULL::text AS datcollversion, NULL::text[] AS datacl", - "CREATE VIEW pg_user AS SELECT '" + config.User + "' AS usename, '10'::oid AS usesysid, TRUE AS usecreatedb, TRUE AS usesuper, TRUE AS userepl, TRUE AS usebypassrls, '' AS passwd, NULL::timestamp AS valuntil, NULL::text[] AS useconfig", - "CREATE VIEW pg_collation AS SELECT '100'::oid AS oid, 'default' AS collname, '11'::oid AS collnamespace, '10'::oid AS collowner, 'd' AS collprovider, TRUE AS collisdeterministic, '-1'::int4 AS collencoding, NULL::text AS collcollate, NULL::text AS collctype, NULL::text AS colliculocale, NULL::text AS collicurules, NULL::text AS collversion", - "CREATE VIEW user AS SELECT '" + config.User + "' AS user", - - // Dynamic views - // DuckDB does not support indnullsnotdistinct column - "CREATE VIEW pg_index AS SELECT *, FALSE AS indnullsnotdistinct FROM pg_catalog.pg_index", - // Hide DuckDB's system and duplicate schemas - "CREATE VIEW pg_namespace AS SELECT * FROM pg_catalog.pg_namespace WHERE oid >= (SELECT oid FROM pg_catalog.pg_namespace WHERE nspname = '" + PG_SCHEMA_PUBLIC + "')", - // DuckDB does not support relforcerowsecurity column - `CREATE VIEW pg_class AS SELECT - oid, - relname, - relnamespace, - reltype, - reloftype, - relowner, - relam, - relfilenode, - reltablespace, - relpages, - reltuples, - relallvisible, - reltoastrelid, - relhasindex, - relisshared, - relpersistence, - CASE relkind - WHEN 'v' THEN - CASE relnamespace >= (SELECT oid FROM pg_catalog.pg_namespace WHERE nspname = '` + PG_SCHEMA_PUBLIC + `') - WHEN TRUE THEN - 'm' - ELSE - 'v' - END - ELSE - relkind - END AS relkind, - FALSE AS relforcerowsecurity - FROM pg_catalog.pg_class`, - } - PG_CATALOG_TABLE_NAMES = extractTableNames(result) - return result -} - -func CreateInformationSchemaTableQueries(config *Config) []string { - result := []string{ - // Dynamic views - // DuckDB does not support udt_catalog, udt_schema, udt_name - `CREATE VIEW ` + PG_TABLE_COLUMNS + ` AS - SELECT - table_catalog, table_schema, table_name, column_name, ordinal_position, column_default, is_nullable, data_type, character_maximum_length, character_octet_length, numeric_precision, numeric_precision_radix, numeric_scale, datetime_precision, interval_type, interval_precision, character_set_catalog, character_set_schema, character_set_name, collation_catalog, collation_schema, collation_name, domain_catalog, domain_schema, domain_name, - '` + config.Database + `' AS udt_catalog, - 'pg_catalog' AS udt_schema, - CASE data_type - WHEN 'BIGINT' THEN 'int8' - WHEN 'BIGINT[]' THEN '_int8' - WHEN 'BLOB' THEN 'bytea' - WHEN 'BLOB[]' THEN '_bytea' - WHEN 'BOOLEAN' THEN 'bool' - WHEN 'BOOLEAN[]' THEN '_bool' - WHEN 'DATE' THEN 'date' - WHEN 'DATE[]' THEN '_date' - WHEN 'FLOAT' THEN 'float4' - WHEN 'FLOAT[]' THEN '_float4' - WHEN 'DOUBLE' THEN 'float8' - WHEN 'DOUBLE[]' THEN '_float8' - WHEN 'DECIMAL' THEN 'numeric' - WHEN 'DECIMAL[]' THEN '_numeric' - WHEN 'INTEGER' THEN 'int4' - WHEN 'INTEGER[]' THEN '_int4' - WHEN 'VARCHAR' THEN 'text' - WHEN 'VARCHAR[]' THEN '_text' - WHEN 'TIME' THEN 'time' - WHEN 'TIME[]' THEN '_time' - WHEN 'TIMESTAMP' THEN 'timestamp' - WHEN 'TIMESTAMP[]' THEN '_timestamp' - WHEN 'UUID' THEN 'uuid' - WHEN 'UUID[]' THEN '_uuid' - ELSE - CASE - WHEN starts_with(data_type, 'DECIMAL') THEN 'numeric' - ELSE 'unknown' - END - END AS udt_name, - scope_catalog, scope_schema, scope_name, maximum_cardinality, dtd_identifier, is_self_referencing, is_identity, identity_generation, identity_start, identity_increment, identity_maximum, identity_minimum, identity_cycle, is_generated, generation_expression, is_updatable - FROM information_schema.columns`, - `CREATE VIEW ` + PG_TABLE_TABLES + ` AS SELECT - table_catalog, - table_schema, - table_name, - table_type, - self_referencing_column_name, - reference_generation, - user_defined_type_catalog, - user_defined_type_schema, - user_defined_type_name, - is_insertable_into, - is_typed, - commit_action - FROM information_schema.tables - WHERE table_type != 'VIEW' AND table_schema != 'main'`, - } - return result -} - type QueryRemapperTable struct { parserTable *ParserTable parserFunction *ParserFunction @@ -248,6 +113,17 @@ func (remapper *QueryRemapperTable) RemapTable(node *pgQuery.Node, permissions * func (remapper *QueryRemapperTable) RemapTableFunctionCall(rangeFunction *pgQuery.RangeFunction) { schemaFunction := remapper.parserTable.TopLevelSchemaFunction(rangeFunction) if schemaFunction != nil { + // SELECT value FROM jsonb_array_elements(...) value -> SELECT value FROM unnest(json_extract(..., '$[*]')) unnest(value) + if (schemaFunction.Schema == PG_SCHEMA_PG_CATALOG || schemaFunction.Schema == "") && + (schemaFunction.Function == PG_FUNCTION_JSON_ARRAY_ELEMENTS || schemaFunction.Function == PG_FUNCTION_JSONB_ARRAY_ELEMENTS) { + alias := remapper.parserTable.Alias(rangeFunction) + if alias == "" { + remapper.parserTable.SetAlias(rangeFunction, "unnest", "value") + } else { + remapper.parserTable.SetAlias(rangeFunction, "unnest", alias) + } + } + remapper.parserTable.SetAliasIfNotExists(rangeFunction, schemaFunction.Function) } @@ -278,12 +154,12 @@ func (remapper *QueryRemapperTable) reloadIcebergPersistentTables() { // CREATE TABLE IF NOT EXISTS for _, icebergSchemaTable := range newIcebergSchemaTables.Values() { if !previousIcebergSchemaTables.Contains(icebergSchemaTable) { - icebergTableFields, err := remapper.icebergReader.TableFields(icebergSchemaTable) + catalogTableColumns, err := remapper.icebergReader.TableColumns(icebergSchemaTable) common.PanicIfError(remapper.config.CommonConfig, err) var sqlColumns []string - for _, icebergTableField := range icebergTableFields { - sqlColumns = append(sqlColumns, icebergTableField.ToSql()) + for _, catalogTableColumn := range catalogTableColumns { + sqlColumns = append(sqlColumns, catalogTableColumn.ToSql()) } _, err = remapper.ServerDuckdbClient.ExecContext(ctx, "CREATE SCHEMA IF NOT EXISTS "+icebergSchemaTable.Schema) @@ -395,3 +271,505 @@ func extractTableNames(tables []string) common.Set[string] { return names } + +func CreatePgCatalogTableQueries(config *Config) []string { + result := []string{ + // Static empty tables + "CREATE TABLE pg_inherits(inhrelid oid, inhparent oid, inhseqno int4, inhdetachpending bool)", + "CREATE TABLE pg_shdescription(objoid oid, classoid oid, description text)", + "CREATE TABLE pg_statio_user_tables(relid oid, schemaname text, relname text, heap_blks_read int8, heap_blks_hit int8, idx_blks_read int8, idx_blks_hit int8, toast_blks_read int8, toast_blks_hit int8, tidx_blks_read int8, tidx_blks_hit int8)", + "CREATE TABLE pg_replication_slots(slot_name text, plugin text, slot_type text, datoid oid, database text, temporary bool, active bool, active_pid int4, xmin int8, catalog_xmin int8, restart_lsn text, confirmed_flush_lsn text, wal_status text, safe_wal_size int8, two_phase bool, conflicting bool)", + "CREATE TABLE pg_stat_gssapi(pid int4, gss_authenticated bool, principal text, encrypted bool, credentials_delegated bool)", + "CREATE TABLE pg_auth_members(oid text, roleid oid, member oid, grantor oid, admin_option bool, inherit_option bool, set_option bool)", + "CREATE TABLE pg_stat_activity(datid oid, datname text, pid int4, usesysid oid, usename text, application_name text, client_addr inet, client_hostname text, client_port int4, backend_start timestamp, xact_start timestamp, query_start timestamp, state_change timestamp, wait_event_type text, wait_event text, state text, backend_xid int8, backend_xmin int8, query text, backend_type text)", + "CREATE TABLE pg_views(schemaname text, viewname text, viewowner text, definition text)", + "CREATE TABLE pg_matviews(schemaname text, matviewname text, matviewowner text, tablespace text, hasindexes bool, ispopulated bool, definition text)", + "CREATE TABLE pg_opclass(oid oid, opcmethod oid, opcname text, opcnamespace oid, opcowner oid, opcfamily oid, opcintype oid, opcdefault bool, opckeytype oid)", + "CREATE TABLE pg_policy(oid oid, polname text, polrelid oid, polcmd text, polpermissive bool, polroles oid, polqual text, polwithcheck text)", + "CREATE TABLE pg_statistic_ext(oid oid, stxrelid oid, stxname text, stxnamespace oid, stxowner oid, stxstattarget int4, stxkeys oid, stxkind text, stxexprs text)", + "CREATE TABLE pg_publication(oid oid, pubname text, pubowner oid, puballtables bool, pubinsert bool, pubupdate bool, pubdelete bool, pubtruncate bool, pubviaroot bool)", + "CREATE TABLE pg_publication_rel(oid oid, prpubid oid, prrelid oid, prqual text, prattrs text)", + "CREATE TABLE pg_publication_namespace(oid oid, pnpubid oid, pnnspid oid)", + "CREATE TABLE pg_rewrite(oid oid, rulename text, ev_class oid, ev_type char, ev_enabled char, is_instead bool, ev_qual text, ev_action text)", + + // Dynamic tables + // DuckDB doesn't handle dynamic view replacement properly + "CREATE TABLE pg_stat_user_tables(relid oid, schemaname text, relname text, seq_scan int8, last_seq_scan timestamp, seq_tup_read int8, idx_scan int8, last_idx_scan timestamp, idx_tup_fetch int8, n_tup_ins int8, n_tup_upd int8, n_tup_del int8, n_tup_hot_upd int8, n_tup_newpage_upd int8, n_live_tup int8, n_dead_tup int8, n_mod_since_analyze int8, n_ins_since_vacuum int8, last_vacuum timestamp, last_autovacuum timestamp, last_analyze timestamp, last_autoanalyze timestamp, vacuum_count int8, autovacuum_count int8, analyze_count int8, autoanalyze_count int8)", + + // Static views + "CREATE VIEW pg_shadow AS SELECT '" + config.User + "' AS usename, '10'::oid AS usesysid, FALSE AS usecreatedb, FALSE AS usesuper, TRUE AS userepl, FALSE AS usebypassrls, '" + config.EncryptedPassword + "' AS passwd, NULL::timestamp AS valuntil, NULL::text[] AS useconfig", + "CREATE VIEW pg_roles AS SELECT '10'::oid AS oid, '" + config.User + "' AS rolname, TRUE AS rolsuper, TRUE AS rolinherit, TRUE AS rolcreaterole, TRUE AS rolcreatedb, TRUE AS rolcanlogin, FALSE AS rolreplication, -1 AS rolconnlimit, NULL::text AS rolpassword, NULL::timestamp AS rolvaliduntil, FALSE AS rolbypassrls, NULL::text[] AS rolconfig", + "CREATE VIEW pg_extension AS SELECT '13823'::oid AS oid, 'plpgsql' AS extname, '10'::oid AS extowner, '11'::oid AS extnamespace, FALSE AS extrelocatable, '1.0'::text AS extversion, NULL::text[] AS extconfig, NULL::text[] AS extcondition", + "CREATE VIEW pg_database AS SELECT '16388'::oid AS oid, '" + config.Database + "' AS datname, '10'::oid AS datdba, '6'::int4 AS encoding, 'c' AS datlocprovider, FALSE AS datistemplate, TRUE AS datallowconn, '-1'::int4 AS datconnlimit, '722'::int8 AS datfrozenxid, '1'::int4 AS datminmxid, '1663'::oid AS dattablespace, 'en_US.UTF-8' AS datcollate, 'en_US.UTF-8' AS datctype, 'en_US.UTF-8' AS datlocale, NULL::text AS daticurules, NULL::text AS datcollversion, NULL::text[] AS datacl", + "CREATE VIEW pg_user AS SELECT '" + config.User + "' AS usename, '10'::oid AS usesysid, TRUE AS usecreatedb, TRUE AS usesuper, TRUE AS userepl, TRUE AS usebypassrls, '' AS passwd, NULL::timestamp AS valuntil, NULL::text[] AS useconfig", + "CREATE VIEW pg_collation AS SELECT '100'::oid AS oid, 'default' AS collname, '11'::oid AS collnamespace, '10'::oid AS collowner, 'd' AS collprovider, TRUE AS collisdeterministic, '-1'::int4 AS collencoding, NULL::text AS collcollate, NULL::text AS collctype, NULL::text AS colliculocale, NULL::text AS collicurules, NULL::text AS collversion", + "CREATE VIEW user AS SELECT '" + config.User + "' AS user", + + // Dynamic views + // DuckDB does not support indnullsnotdistinct column + "CREATE VIEW pg_index AS SELECT *, FALSE AS indnullsnotdistinct FROM pg_catalog.pg_index", + // Hide DuckDB's system and duplicate schemas + "CREATE VIEW pg_namespace AS SELECT * FROM pg_catalog.pg_namespace WHERE oid >= (SELECT oid FROM pg_catalog.pg_namespace WHERE nspname = '" + PG_SCHEMA_PUBLIC + "')", + // DuckDB does not support relforcerowsecurity column + `CREATE VIEW pg_class AS SELECT + oid, + relname, + relnamespace, + reltype, + reloftype, + relowner, + relam, + relfilenode, + reltablespace, + relpages, + reltuples, + relallvisible, + reltoastrelid, + relhasindex, + relisshared, + relpersistence, + CASE relkind + WHEN 'v' THEN + CASE relnamespace >= (SELECT oid FROM pg_catalog.pg_namespace WHERE nspname = '` + PG_SCHEMA_PUBLIC + `') + WHEN TRUE THEN + 'm' + ELSE + 'v' + END + ELSE + relkind + END AS relkind, + FALSE AS relforcerowsecurity + FROM pg_catalog.pg_class`, + `CREATE VIEW pg_type AS + SELECT * FROM pg_catalog.pg_type + UNION ALL + SELECT 18, 'char', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, 1, true, 'b', 'Z', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 19, 'name', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, 64, false, 'b', 'S', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 22, 'int2vector', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 24, 'regproc', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, 4, true, 'b', 'N', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 25, 'text', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'S', true, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 26, 'oid', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, 4, true, 'b', 'N', true, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 27, 'tid', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, 6, false, 'b', 'U', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 28, 'xid', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, 4, true, 'b', 'U', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 29, 'cid', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, 4, true, 'b', 'U', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 30, 'oidvector', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 32, 'pg_ddl_command', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, 8, true, 'p', 'P', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 71, 'pg_type', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'c', 'C', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 75, 'pg_attribute', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'c', 'C', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 81, 'pg_proc', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'c', 'C', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 83, 'pg_class', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'c', 'C', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 114, 'json', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'U', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 142, 'xml', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'U', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 143, '_xml', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 194, 'pg_node_tree', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'Z', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 199, '_json', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 210, '_pg_type', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 269, 'table_am_handler', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, 4, true, 'p', 'P', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 270, '_pg_attribute', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 271, '_xid8', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 272, '_pg_proc', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 273, '_pg_class', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 325, 'index_am_handler', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, 4, true, 'p', 'P', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 600, 'point', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, 16, false, 'b', 'G', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 601, 'lseg', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, 32, false, 'b', 'G', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 602, 'path', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'G', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 603, 'box', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, 32, false, 'b', 'G', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 604, 'polygon', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'G', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 628, 'line', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, 24, false, 'b', 'G', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 629, '_line', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 650, 'cidr', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'I', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 651, '_cidr', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 705, 'unknown', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -2, false, 'p', 'X', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 718, 'circle', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, 24, false, 'b', 'G', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 719, '_circle', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 774, 'macaddr8', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, 8, false, 'b', 'U', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 775, '_macaddr8', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 790, 'money', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, 8, true, 'b', 'N', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 791, '_money', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 829, 'macaddr', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, 6, false, 'b', 'U', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 869, 'inet', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'I', true, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 1000, '_bool', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 1001, '_bytea', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 1002, '_char', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 1003, '_name', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 1005, '_int2', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 1006, '_int2vector', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 1007, '_int4', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 1008, '_regproc', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 1009, '_text', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 1010, '_tid', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 1011, '_xid', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 1012, '_cid', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 1013, '_oidvector', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 1014, '_bpchar', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 1015, '_varchar', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 1016, '_int8', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 1017, '_point', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 1018, '_lseg', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 1019, '_path', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 1020, '_box', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 1021, '_float4', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 1022, '_float8', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 1027, '_polygon', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 1028, '_oid', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 1033, 'aclitem', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, 16, false, 'b', 'U', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 1034, '_aclitem', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 1040, '_macaddr', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 1041, '_inet', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 1042, 'bpchar', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'S', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 1115, '_timestamp', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 1182, '_date', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 1183, '_time', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 1185, '_timestamptz', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 1187, '_interval', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 1231, '_numeric', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 1248, 'pg_database', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'c', 'C', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 1263, '_cstring', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 1270, '_timetz', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 1561, '_bit', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 1562, 'varbit', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'V', true, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 1563, '_varbit', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 1790, 'refcursor', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'U', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 2201, '_refcursor', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 2202, 'regprocedure', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, 4, true, 'b', 'N', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 2203, 'regoper', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, 4, true, 'b', 'N', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 2204, 'regoperator', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, 4, true, 'b', 'N', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 2205, 'regclass', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, 4, true, 'b', 'N', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 2206, 'regtype', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, 4, true, 'b', 'N', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 2207, '_regprocedure', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 2208, '_regoper', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 2209, '_regoperator', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 2210, '_regclass', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 2211, '_regtype', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 2249, 'record', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'p', 'P', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 2275, 'cstring', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -2, false, 'p', 'P', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 2276, 'any', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, 4, true, 'p', 'P', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 2277, 'anyarray', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'p', 'P', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 2278, 'void', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, 4, true, 'p', 'P', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 2279, 'trigger', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, 4, true, 'p', 'P', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 2280, 'language_handler', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, 4, true, 'p', 'P', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 2281, 'internal', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, 8, true, 'p', 'P', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 2283, 'anyelement', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, 4, true, 'p', 'P', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 2287, '_record', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'p', 'P', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 2776, 'anynonarray', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, 4, true, 'p', 'P', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 2842, 'pg_authid', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'c', 'C', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 2843, 'pg_auth_members', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'c', 'C', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 2949, '_txid_snapshot', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 2951, '_uuid', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 2970, 'txid_snapshot', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'U', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 3115, 'fdw_handler', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, 4, true, 'p', 'P', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 3220, 'pg_lsn', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, 8, true, 'b', 'U', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 3221, '_pg_lsn', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 3310, 'tsm_handler', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, 4, true, 'p', 'P', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 3361, 'pg_ndistinct', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'Z', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 3402, 'pg_dependencies', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'Z', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 3500, 'anyenum', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, 4, true, 'p', 'P', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 3614, 'tsvector', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'U', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 3615, 'tsquery', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'U', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 3642, 'gtsvector', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'U', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 3643, '_tsvector', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 3644, '_gtsvector', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 3645, '_tsquery', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 3734, 'regconfig', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, 4, true, 'b', 'N', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 3735, '_regconfig', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 3769, 'regdictionary', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, 4, true, 'b', 'N', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 3770, '_regdictionary', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 3802, 'jsonb', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'U', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 3807, '_jsonb', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 3831, 'anyrange', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'p', 'P', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 3838, 'event_trigger', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, 4, true, 'p', 'P', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 3904, 'int4range', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'r', 'R', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 3905, '_int4range', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 3906, 'numrange', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'r', 'R', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 3907, '_numrange', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 3908, 'tsrange', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'r', 'R', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 3909, '_tsrange', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 3910, 'tstzrange', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'r', 'R', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 3911, '_tstzrange', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 3912, 'daterange', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'r', 'R', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 3913, '_daterange', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 3926, 'int8range', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'r', 'R', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 3927, '_int8range', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 4066, 'pg_shseclabel', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'c', 'C', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 4072, 'jsonpath', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'U', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 4073, '_jsonpath', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 4089, 'regnamespace', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, 4, true, 'b', 'N', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 4090, '_regnamespace', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 4096, 'regrole', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, 4, true, 'b', 'N', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 4097, '_regrole', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 4191, 'regcollation', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, 4, true, 'b', 'N', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 4192, '_regcollation', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 4451, 'int4multirange', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'm', 'R', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 4532, 'nummultirange', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'm', 'R', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 4533, 'tsmultirange', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'm', 'R', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 4534, 'tstzmultirange', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'm', 'R', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 4535, 'datemultirange', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'm', 'R', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 4536, 'int8multirange', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'm', 'R', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 4537, 'anymultirange', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'p', 'P', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 4538, 'anycompatiblemultirange', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'p', 'P', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 4600, 'pg_brin_bloom_summary', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'Z', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 4601, 'pg_brin_minmax_multi_summary', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'Z', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 5017, 'pg_mcv_list', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'Z', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 5038, 'pg_snapshot', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'U', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 5039, '_pg_snapshot', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 5069, 'xid8', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, 8, true, 'b', 'U', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 5077, 'anycompatible', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, 4, true, 'p', 'P', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 5078, 'anycompatiblearray', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'p', 'P', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 5079, 'anycompatiblenonarray', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, 4, true, 'p', 'P', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 5080, 'anycompatiblerange', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'p', 'P', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 6101, 'pg_subscription', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'c', 'C', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 6150, '_int4multirange', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 6151, '_nummultirange', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 6152, '_tsmultirange', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 6153, '_tstzmultirange', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 6155, '_datemultirange', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + UNION ALL + SELECT 6157, '_int8multirange', (SELECT typnamespace FROM pg_catalog.pg_type WHERE typname = 'bool'), 0, -1, false, 'b', 'A', false, true, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd', 'p', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + `, + } + PG_CATALOG_TABLE_NAMES = extractTableNames(result) + return result +} + +func CreateInformationSchemaTableQueries(config *Config) []string { + result := []string{ + // Dynamic views + // DuckDB does not support udt_catalog, udt_schema, udt_name + `CREATE VIEW ` + PG_TABLE_COLUMNS + ` AS + SELECT + table_catalog, table_schema, table_name, column_name, ordinal_position, column_default, is_nullable, data_type, character_maximum_length, character_octet_length, numeric_precision, numeric_precision_radix, numeric_scale, datetime_precision, interval_type, interval_precision, character_set_catalog, character_set_schema, character_set_name, collation_catalog, collation_schema, collation_name, domain_catalog, domain_schema, domain_name, + '` + config.Database + `' AS udt_catalog, + 'pg_catalog' AS udt_schema, + CASE data_type + WHEN 'BIGINT' THEN 'int8' + WHEN 'BIGINT[]' THEN '_int8' + WHEN 'BLOB' THEN 'bytea' + WHEN 'BLOB[]' THEN '_bytea' + WHEN 'BOOLEAN' THEN 'bool' + WHEN 'BOOLEAN[]' THEN '_bool' + WHEN 'DATE' THEN 'date' + WHEN 'DATE[]' THEN '_date' + WHEN 'FLOAT' THEN 'float4' + WHEN 'FLOAT[]' THEN '_float4' + WHEN 'DOUBLE' THEN 'float8' + WHEN 'DOUBLE[]' THEN '_float8' + WHEN 'DECIMAL' THEN 'numeric' + WHEN 'DECIMAL[]' THEN '_numeric' + WHEN 'INTEGER' THEN 'int4' + WHEN 'INTEGER[]' THEN '_int4' + WHEN 'VARCHAR' THEN 'text' + WHEN 'VARCHAR[]' THEN '_text' + WHEN 'TIME' THEN 'time' + WHEN 'TIME[]' THEN '_time' + WHEN 'TIMESTAMP' THEN 'timestamp' + WHEN 'TIMESTAMP[]' THEN '_timestamp' + WHEN 'UUID' THEN 'uuid' + WHEN 'UUID[]' THEN '_uuid' + WHEN 'JSON' THEN 'json' + WHEN 'JSON[]' THEN '_json' + ELSE + CASE + WHEN starts_with(data_type, 'DECIMAL') THEN 'numeric' + ELSE 'unknown' + END + END AS udt_name, + scope_catalog, scope_schema, scope_name, maximum_cardinality, dtd_identifier, is_self_referencing, is_identity, identity_generation, identity_start, identity_increment, identity_maximum, identity_minimum, identity_cycle, is_generated, generation_expression, is_updatable + FROM information_schema.columns`, + `CREATE VIEW ` + PG_TABLE_TABLES + ` AS SELECT + table_catalog, + table_schema, + table_name, + table_type, + self_referencing_column_name, + reference_generation, + user_defined_type_catalog, + user_defined_type_schema, + user_defined_type_name, + is_insertable_into, + is_typed, + commit_action + FROM information_schema.tables + WHERE table_type != 'VIEW' AND table_schema != 'main'`, + } + return result +} diff --git a/src/syncer-amplitude/lib/event.go b/src/syncer-amplitude/lib/event.go index 42e821f..d169a80 100644 --- a/src/syncer-amplitude/lib/event.go +++ b/src/syncer-amplitude/lib/event.go @@ -49,7 +49,7 @@ type Event struct { OSVersion string `json:"os_version"` PartnerID string `json:"partner_id"` Paying string `json:"paying"` - Plan interface{} `json:"plan"` + Plan map[string]interface{} `json:"plan"` Platform string `json:"platform"` ProcessedTime string `json:"processed_time"` Region string `json:"region"` @@ -139,7 +139,7 @@ func EventsIcebergSchemaColumns(config *common.CommonConfig) []*common.IcebergSc {Config: config, ColumnName: "client_event_time", ColumnType: common.IcebergColumnTypeTimestamp, Position: 7}, {Config: config, ColumnName: "client_upload_time", ColumnType: common.IcebergColumnTypeTimestamp, Position: 8}, {Config: config, ColumnName: "country", ColumnType: common.IcebergColumnTypeString, Position: 9}, - {Config: config, ColumnName: "data", ColumnType: common.IcebergColumnTypeString, Position: 10}, + {Config: config, ColumnName: "data", ColumnType: common.IcebergColumnTypeString, Position: 10, LogicalColumnType: common.IcebergLogicalColumnTypeJson}, {Config: config, ColumnName: "data_type", ColumnType: common.IcebergColumnTypeString, Position: 11}, {Config: config, ColumnName: "device_brand", ColumnType: common.IcebergColumnTypeString, Position: 12}, {Config: config, ColumnName: "device_carrier", ColumnType: common.IcebergColumnTypeString, Position: 13}, @@ -150,12 +150,12 @@ func EventsIcebergSchemaColumns(config *common.CommonConfig) []*common.IcebergSc {Config: config, ColumnName: "device_type", ColumnType: common.IcebergColumnTypeString, Position: 18}, {Config: config, ColumnName: "dma", ColumnType: common.IcebergColumnTypeString, Position: 19}, {Config: config, ColumnName: "event_id", ColumnType: common.IcebergColumnTypeInteger, Position: 20}, - {Config: config, ColumnName: "event_properties", ColumnType: common.IcebergColumnTypeString, Position: 21}, + {Config: config, ColumnName: "event_properties", ColumnType: common.IcebergColumnTypeString, Position: 21, LogicalColumnType: common.IcebergLogicalColumnTypeJson}, {Config: config, ColumnName: "event_time", ColumnType: common.IcebergColumnTypeTimestamp, Position: 22}, {Config: config, ColumnName: "event_type", ColumnType: common.IcebergColumnTypeString, Position: 23}, - {Config: config, ColumnName: "global_user_properties", ColumnType: common.IcebergColumnTypeString, Position: 24}, - {Config: config, ColumnName: "group_properties", ColumnType: common.IcebergColumnTypeString, Position: 25}, - {Config: config, ColumnName: "groups", ColumnType: common.IcebergColumnTypeString, Position: 26}, + {Config: config, ColumnName: "global_user_properties", ColumnType: common.IcebergColumnTypeString, Position: 24, LogicalColumnType: common.IcebergLogicalColumnTypeJson}, + {Config: config, ColumnName: "group_properties", ColumnType: common.IcebergColumnTypeString, Position: 25, LogicalColumnType: common.IcebergLogicalColumnTypeJson}, + {Config: config, ColumnName: "groups", ColumnType: common.IcebergColumnTypeString, Position: 26, LogicalColumnType: common.IcebergLogicalColumnTypeJson}, {Config: config, ColumnName: "idfa", ColumnType: common.IcebergColumnTypeString, Position: 27}, {Config: config, ColumnName: "insert_id", ColumnType: common.IcebergColumnTypeString, Position: 28}, {Config: config, ColumnName: "insert_key", ColumnType: common.IcebergColumnTypeString, Position: 29}, @@ -169,7 +169,7 @@ func EventsIcebergSchemaColumns(config *common.CommonConfig) []*common.IcebergSc {Config: config, ColumnName: "os_version", ColumnType: common.IcebergColumnTypeString, Position: 37}, {Config: config, ColumnName: "partner_id", ColumnType: common.IcebergColumnTypeString, Position: 38}, {Config: config, ColumnName: "paying", ColumnType: common.IcebergColumnTypeBoolean, Position: 39}, - {Config: config, ColumnName: "plan", ColumnType: common.IcebergColumnTypeString, Position: 40}, + {Config: config, ColumnName: "plan", ColumnType: common.IcebergColumnTypeString, Position: 40, LogicalColumnType: common.IcebergLogicalColumnTypeJson}, {Config: config, ColumnName: "platform", ColumnType: common.IcebergColumnTypeString, Position: 41}, {Config: config, ColumnName: "processed_time", ColumnType: common.IcebergColumnTypeTimestamp, Position: 42}, {Config: config, ColumnName: "region", ColumnType: common.IcebergColumnTypeString, Position: 43}, @@ -182,7 +182,7 @@ func EventsIcebergSchemaColumns(config *common.CommonConfig) []*common.IcebergSc {Config: config, ColumnName: "start_version", ColumnType: common.IcebergColumnTypeString, Position: 50}, {Config: config, ColumnName: "user_creation_time", ColumnType: common.IcebergColumnTypeTimestamp, Position: 51}, {Config: config, ColumnName: "user_id", ColumnType: common.IcebergColumnTypeString, Position: 52}, - {Config: config, ColumnName: "user_properties", ColumnType: common.IcebergColumnTypeString, Position: 53}, + {Config: config, ColumnName: "user_properties", ColumnType: common.IcebergColumnTypeString, Position: 53, LogicalColumnType: common.IcebergLogicalColumnTypeJson}, {Config: config, ColumnName: "uuid", ColumnType: common.IcebergColumnTypeString, Position: 54}, {Config: config, ColumnName: "version_name", ColumnType: common.IcebergColumnTypeString, Position: 55}, } diff --git a/src/syncer-postgres/lib/init_test.go b/src/syncer-postgres/lib/init_test.go index acb8862..f85cb53 100644 --- a/src/syncer-postgres/lib/init_test.go +++ b/src/syncer-postgres/lib/init_test.go @@ -431,6 +431,8 @@ func init() { createTestTableViaFullRefresh(syncer, PgSchemaTable{Schema: "public", Table: "partitioned_table2"}, PG_SCHEMA_COLUMNS_PARTITIONED_TABLE, CSV_ROWS_PARTITIONED_TABLE2) createTestTableViaFullRefresh(syncer, PgSchemaTable{Schema: "public", Table: "partitioned_table3"}, PG_SCHEMA_COLUMNS_PARTITIONED_TABLE, CSV_ROWS_PARTITIONED_TABLE3) createTestTableViaFullRefresh(syncer, PgSchemaTable{Schema: "test", Table: "empty_table"}, PG_SCHEMA_COLUMNS_EMPTY_TABLE, [][]string{}) + default: + common.Panic(config.CommonConfig, "Unsupported sync mode: "+string(config.SyncMode)) } } diff --git a/src/syncer-postgres/lib/pg_schema_column.go b/src/syncer-postgres/lib/pg_schema_column.go index e16bd95..9b80abf 100644 --- a/src/syncer-postgres/lib/pg_schema_column.go +++ b/src/syncer-postgres/lib/pg_schema_column.go @@ -32,28 +32,32 @@ func NewPgSchemaColumn(config *Config) *PgSchemaColumn { } func (pgSchemaColumn *PgSchemaColumn) ToIcebergSchemaColumn() *common.IcebergSchemaColumn { + pgPrimitiveColumnType := strings.TrimLeft(pgSchemaColumn.UdtName, "_") + icebergSchemaColumn := &common.IcebergSchemaColumn{ - Config: pgSchemaColumn.Config.CommonConfig, - ColumnName: pgSchemaColumn.ColumnName, - Position: common.StringToInt(pgSchemaColumn.OrdinalPosition), - NumericPrecision: common.StringToInt(pgSchemaColumn.NumericPrecision), - NumericScale: common.StringToInt(pgSchemaColumn.NumericScale), - IsList: pgSchemaColumn.DataType == PG_DATA_TYPE_ARRAY, - IsRequired: pgSchemaColumn.IsNullable != PG_TRUE, - IsPartOfUniqueIndex: pgSchemaColumn.IsPartOfUniqueIndex, - DatetimePrecision: common.StringToInt(pgSchemaColumn.DatetimePrecision), - PgPrimitiveColumnType: strings.TrimLeft(pgSchemaColumn.UdtName, "_"), + Config: pgSchemaColumn.Config.CommonConfig, + ColumnName: pgSchemaColumn.ColumnName, + Position: common.StringToInt(pgSchemaColumn.OrdinalPosition), + NumericPrecision: common.StringToInt(pgSchemaColumn.NumericPrecision), + NumericScale: common.StringToInt(pgSchemaColumn.NumericScale), + IsList: pgSchemaColumn.DataType == PG_DATA_TYPE_ARRAY, + IsRequired: pgSchemaColumn.IsNullable != PG_TRUE, + IsPartOfUniqueIndex: pgSchemaColumn.IsPartOfUniqueIndex, + DatetimePrecision: common.StringToInt(pgSchemaColumn.DatetimePrecision), } - switch icebergSchemaColumn.PgPrimitiveColumnType { + switch pgPrimitiveColumnType { case "bool": icebergSchemaColumn.ColumnType = common.IcebergColumnTypeBoolean case "bit", "int2", "int4": icebergSchemaColumn.ColumnType = common.IcebergColumnTypeInteger case "xid": icebergSchemaColumn.ColumnType = common.IcebergColumnTypeLong - case "int8", "xid8", "interval": + case "int8", "xid8": + icebergSchemaColumn.ColumnType = common.IcebergColumnTypeDecimal + case "interval": icebergSchemaColumn.ColumnType = common.IcebergColumnTypeDecimal + icebergSchemaColumn.LogicalColumnType = common.IcebergLogicalColumnTypeInterval case "float4": icebergSchemaColumn.ColumnType = common.IcebergColumnTypeFloat case "float8": @@ -68,8 +72,17 @@ func (pgSchemaColumn *PgSchemaColumn) ToIcebergSchemaColumn() *common.IcebergSch icebergSchemaColumn.ColumnType = common.IcebergColumnTypeTimeTz case "timestamp", "timestamptz": icebergSchemaColumn.ColumnType = common.IcebergColumnTypeTimestamp - case "varchar", "char", "text", "jsonb", "json", "bpchar", "uuid", - "point", "line", "lseg", "box", "path", "polygon", "circle", + case "jsonb", "json": + icebergSchemaColumn.ColumnType = common.IcebergColumnTypeString + icebergSchemaColumn.LogicalColumnType = common.IcebergLogicalColumnTypeJson + case "bpchar": + icebergSchemaColumn.ColumnType = common.IcebergColumnTypeString + icebergSchemaColumn.LogicalColumnType = common.IcebergLogicalColumnTypeBpchar + case "point": + icebergSchemaColumn.ColumnType = common.IcebergColumnTypeString + icebergSchemaColumn.LogicalColumnType = common.IcebergLogicalColumnTypePoint + case "varchar", "char", "text", "uuid", + "line", "lseg", "box", "path", "polygon", "circle", "cidr", "inet", "macaddr", "macaddr8", "ltree", "tsvector", "xml", "pg_snapshot": icebergSchemaColumn.ColumnType = common.IcebergColumnTypeString @@ -78,8 +91,8 @@ func (pgSchemaColumn *PgSchemaColumn) ToIcebergSchemaColumn() *common.IcebergSch default: // User-defined types -> VARCHAR if pgSchemaColumn.Namespace != PG_SCHEMA_PG_CATALOG { - icebergSchemaColumn.PgPrimitiveColumnType = common.PG_USER_DEFINED_PRIMITIVE_TYPE icebergSchemaColumn.ColumnType = common.IcebergColumnTypeString + icebergSchemaColumn.LogicalColumnType = common.IcebergLogicalColumnTypeUserDefined } else { panic("Unsupported PostgreSQL type: " + pgSchemaColumn.UdtName) } diff --git a/src/syncer-postgres/lib/syncer.go b/src/syncer-postgres/lib/syncer.go index 9def78b..1b507da 100644 --- a/src/syncer-postgres/lib/syncer.go +++ b/src/syncer-postgres/lib/syncer.go @@ -43,6 +43,8 @@ func (syncer *Syncer) Sync() { case SyncModeFullRefresh: common.LogInfo(syncer.Config.CommonConfig, "Starting full-refresh sync...") NewSyncerFullRefresh(syncer.Config, syncer.Utils, syncer.StorageS3, syncer.DuckdbClient).Sync(postgres, pgSchemaTables) + default: + common.Panic(syncer.Config.CommonConfig, "Unsupported sync mode: "+string(syncer.Config.SyncMode)) } common.SendAnonymousAnalytics(syncer.Config.CommonConfig, "syncer-postgres-finish", syncer.name()) From 9abbc6dff75466e293f57f77806054a7f7084e28 Mon Sep 17 00:00:00 2001 From: exAspArk Date: Tue, 23 Sep 2025 21:34:46 -0400 Subject: [PATCH 20/24] Truncate decimals that can't fit into Parquet --- src/common/iceberg_schema_column.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/common/iceberg_schema_column.go b/src/common/iceberg_schema_column.go index f8f6381..4e2f0d9 100644 --- a/src/common/iceberg_schema_column.go +++ b/src/common/iceberg_schema_column.go @@ -480,6 +480,12 @@ func (col *IcebergSchemaColumn) duckdbDecimal(value string) duckdb.Decimal { } } decimalValue := new(big.Int) + + if len(integerPart)+len(fractionalPart) > PARQUET_MAX_DECIMAL_PRECISION { + integerPart = strings.Repeat("9", PARQUET_MAX_DECIMAL_PRECISION-len(fractionalPart)) + LogWarn(col.Config, "Truncating decimal value", value, "to", integerPart+"."+fractionalPart, "in column", col.ColumnName, "to fit precision", IntToString(PARQUET_MAX_DECIMAL_PRECISION)) + } + decimalValue.SetString(integerPart+fractionalPart, 10) return duckdb.Decimal{ From a56c8ce17bea9ecd30e15479e222d68f94eb4ad3 Mon Sep 17 00:00:00 2001 From: exAspArk Date: Fri, 10 Oct 2025 11:04:32 -0400 Subject: [PATCH 21/24] Release v1.7.0 --- README.md | 1 + src/common/common_config.go | 2 +- src/server/parser_function.go | 2 +- src/server/parser_table.go | 6 +++++- src/server/postgres_server.go | 6 ++++++ src/server/query_handler_test.go | 10 ++++++++++ src/server/query_remapper.go | 6 ++++++ src/server/query_remapper_function.go | 1 + 8 files changed, 31 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 5b89dca..401f3a3 100644 --- a/README.md +++ b/README.md @@ -317,6 +317,7 @@ SELECT * FROM [TABLE] WHERE [JSON_COLUMN]->>'[JSON_KEY]' = '[JSON_VALUE]'; - [x] DBeaver - [x] pgAdmin - [x] Grafana + - [x] Retool - [ ] Jupyter notebooks ([#27](https://github.com/BemiHQ/BemiDB/issues/27)) - [x] Data syncing from other sources - [x] Amplitude (incremental) diff --git a/src/common/common_config.go b/src/common/common_config.go index 2ca391c..70a9a4b 100644 --- a/src/common/common_config.go +++ b/src/common/common_config.go @@ -1,7 +1,7 @@ package common const ( - VERSION = "1.6.0" + VERSION = "1.7.0" ENV_LOG_LEVEL = "BEMIDB_LOG_LEVEL" ENV_DISABLE_ANONYMOUS_ANALYTICS = "BEMIDB_DISABLE_ANONYMOUS_ANALYTICS" diff --git a/src/server/parser_function.go b/src/server/parser_function.go index 2b74353..feeba6c 100644 --- a/src/server/parser_function.go +++ b/src/server/parser_function.go @@ -31,7 +31,7 @@ func (parser *ParserFunction) FirstArgumentToString(functionCall *pgQuery.FuncCa // n from (FUNCTION()).n func (parser *ParserFunction) IndirectionName(targetNode *pgQuery.Node) string { indirection := targetNode.GetResTarget().Val.GetAIndirection() - if indirection != nil { + if indirection != nil && len(indirection.Indirection) == 1 && indirection.Indirection[0].GetString_() != nil { return indirection.Indirection[0].GetString_().Sval } diff --git a/src/server/parser_table.go b/src/server/parser_table.go index 80e5a30..a5256a7 100644 --- a/src/server/parser_table.go +++ b/src/server/parser_table.go @@ -55,7 +55,11 @@ func (parser *ParserTable) MakeIcebergTableNode(queryToIcebergTable QueryToIcebe if permissions == nil { query = "SELECT * FROM iceberg_scan('" + queryToIcebergTable.IcebergTablePath + "')" } else if columnNames, allowed := (*permissions)[queryToIcebergTable.QuerySchemaTable.ToIcebergSchemaTable().ToArg()]; allowed { - query = "SELECT " + strings.Join(columnNames, ", ") + " FROM iceberg_scan('" + queryToIcebergTable.IcebergTablePath + "')" + quotedColumnNames := make([]string, len(columnNames)) + for i, columnName := range columnNames { + quotedColumnNames[i] = "\"" + columnName + "\"" + } + query = "SELECT " + strings.Join(quotedColumnNames, ", ") + " FROM iceberg_scan('" + queryToIcebergTable.IcebergTablePath + "')" } else { query = "SELECT NULL WHERE FALSE" } diff --git a/src/server/postgres_server.go b/src/server/postgres_server.go index 9a25f5c..ffc8fea 100644 --- a/src/server/postgres_server.go +++ b/src/server/postgres_server.go @@ -174,7 +174,13 @@ func (server *PostgresServer) handleExtendedQuery(queryHandler *QueryHandler, pa case *pgproto3.Parse: server.handleExtendedQuery(queryHandler, message) // self-recursion return nil + case *pgproto3.Flush: + // Ignore Flush messages, as we are sending responses immediately. + case *pgproto3.Close: + common.LogDebug(server.config.CommonConfig, "Closing prepared statement", message.Name) + server.writeMessages(&pgproto3.CloseComplete{}) default: + common.LogError(server.config.CommonConfig, fmt.Sprintf("Received unexpected message type from client: %T", message)) return fmt.Errorf("received unexpected message type from client: %T", message) } } diff --git a/src/server/query_handler_test.go b/src/server/query_handler_test.go index ad4a864..e7573e4 100644 --- a/src/server/query_handler_test.go +++ b/src/server/query_handler_test.go @@ -83,6 +83,11 @@ func TestHandleQuery(t *testing.T) { "types": {uint32ToString(pgtype.Int4OID)}, "values": {"0"}, }, + "SELECT pg_cancel_backend(12345) AS pg_cancel_backend": { + "description": {"pg_cancel_backend"}, + "types": {uint32ToString(pgtype.BoolOID)}, + "values": {"t"}, + }, "SELECT * from pg_is_in_recovery()": { "description": {"pg_is_in_recovery"}, "types": {uint32ToString(pgtype.BoolOID)}, @@ -400,6 +405,11 @@ func TestHandleQuery(t *testing.T) { "types": {uint32ToString(pgtype.OIDOID)}, "values": {"25"}, }, + "SELECT DISTINCT ON(typlen) oid FROM pg_type ORDER BY oid LIMIT 1": { + "description": {"oid"}, + "types": {uint32ToString(pgtype.OIDOID)}, + "values": {"16"}, + }, }) }) diff --git a/src/server/query_remapper.go b/src/server/query_remapper.go index 18b0999..094afdc 100644 --- a/src/server/query_remapper.go +++ b/src/server/query_remapper.go @@ -509,6 +509,12 @@ func (remapper *QueryRemapper) remapSelect(selectStatement *pgQuery.SelectStmt, } } + // DISTINCT ON (column) + distinctClauses := selectStatement.GetDistinctClause() + for i, distinctNode := range distinctClauses { + distinctClauses[i] = remapper.remappedExpressions(distinctNode, remappedColumnRefs, permissions, indentLevel) // recursion + } + return remappedColumnRefs } diff --git a/src/server/query_remapper_function.go b/src/server/query_remapper_function.go index 3bf962b..5106df4 100644 --- a/src/server/query_remapper_function.go +++ b/src/server/query_remapper_function.go @@ -17,6 +17,7 @@ func CreatePgCatalogMacroQueries(config *Config) []string { "CREATE MACRO aclexplode(aclitem_array) AS json(aclitem_array)", "CREATE MACRO current_setting(setting_name) AS '', (setting_name, missing_ok) AS ''", "CREATE MACRO pg_backend_pid() AS 0", + "CREATE MACRO pg_cancel_backend(pid) AS true", "CREATE MACRO pg_encoding_to_char(encoding_int) AS 'UTF8'", "CREATE MACRO pg_get_expr(pg_node_tree, relation_oid) AS pg_catalog.pg_get_expr(pg_node_tree, relation_oid), (pg_node_tree, relation_oid, pretty_bool) AS pg_catalog.pg_get_expr(pg_node_tree, relation_oid)", "CREATE MACRO pg_get_function_identity_arguments(func_oid) AS ''", From 423887ce98a4adeb85570aadf1cf34295743ee18 Mon Sep 17 00:00:00 2001 From: Jim Castillo Date: Mon, 3 Nov 2025 21:26:14 -0800 Subject: [PATCH 22/24] fix: improve COALESCE handling and jsonb_array_length compatibility This commit addresses two issues with PostgreSQL compatibility: 1. COALESCE expression handling: - Recursively process all expressions in COALESCE arguments - Handles nested function calls within COALESCE (e.g., jsonb_array_length) - Previously only processed SubLink nodes, now handles all expression types 2. jsonb_array_length return type: - Cast result to INTEGER to match PostgreSQL's int4 return type (OID 23) - PostgreSQL's jsonb_array_length() returns INTEGER, not BIGINT or UBIGINT - Updated test expectations from XID8OID (5069) to Int4OID (23) Tests added: - COALESCE with JSONB types - jsonb_array_length with COALESCE expressions --- src/server/query_handler_test.go | 12 +++++++++++- src/server/query_remapper.go | 8 +++----- src/server/query_remapper_function.go | 2 +- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/server/query_handler_test.go b/src/server/query_handler_test.go index e7573e4..b62af06 100644 --- a/src/server/query_handler_test.go +++ b/src/server/query_handler_test.go @@ -195,7 +195,7 @@ func TestHandleQuery(t *testing.T) { }, "SELECT jsonb_array_length('[1, 2, 3]'::jsonb)": { "description": {"jsonb_array_length"}, - "types": {uint32ToString(pgtype.XID8OID)}, + "types": {uint32ToString(pgtype.Int4OID)}, "values": {"3"}, }, "SELECT jsonb_pretty('{\"key\": \"value\"}'::JSONB)": { @@ -258,6 +258,16 @@ func TestHandleQuery(t *testing.T) { "types": {uint32ToString(pgtype.TextOID)}, "values": {"bemidb"}, }, + "SELECT COALESCE(NULL, '[]'::jsonb) AS json_value": { + "description": {"json_value"}, + "types": {uint32ToString(pgtype.JSONOID)}, + "values": {"[]"}, + }, + "SELECT jsonb_array_length(COALESCE('[]'::jsonb, '{}'::jsonb)) AS length": { + "description": {"length"}, + "types": {uint32ToString(pgtype.Int4OID)}, + "values": {"0"}, + }, "SELECT * FROM pg_catalog.pg_stat_gssapi": { "description": {"pid", "gss_authenticated", "principal", "encrypted", "credentials_delegated"}, "types": {uint32ToString(pgtype.Int4OID), uint32ToString(pgtype.BoolOID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.BoolOID), uint32ToString(pgtype.BoolOID)}, diff --git a/src/server/query_remapper.go b/src/server/query_remapper.go index 094afdc..de14da9 100644 --- a/src/server/query_remapper.go +++ b/src/server/query_remapper.go @@ -354,11 +354,9 @@ func (remapper *QueryRemapper) remappedExpressions(node *pgQuery.Node, remappedC // COALESCE(value1, value2, ...) coalesceExpr := node.GetCoalesceExpr() if coalesceExpr != nil { - for _, arg := range coalesceExpr.Args { - if arg.GetSubLink() != nil { - // Nested SELECT - subSelect := arg.GetSubLink().Subselect.GetSelectStmt() - remapper.remapSelectStatement(subSelect, permissions, indentLevel+1) // recursion + for i, arg := range coalesceExpr.Args { + if arg != nil { + coalesceExpr.Args[i] = remapper.remappedExpressions(arg, remappedColumnRefs, permissions, indentLevel+1) // self-recursion } } } diff --git a/src/server/query_remapper_function.go b/src/server/query_remapper_function.go index 5106df4..fd5a181 100644 --- a/src/server/query_remapper_function.go +++ b/src/server/query_remapper_function.go @@ -42,7 +42,7 @@ func CreatePgCatalogMacroQueries(config *Config) []string { ELSE json_extract_path_text(from_json, path_elems)::varchar END`, `CREATE MACRO jsonb_object_agg(key, value) AS to_json(map(array_agg(key), array_agg(value)))`, - `CREATE MACRO jsonb_array_length(json) AS json_array_length(json)`, + `CREATE MACRO jsonb_array_length(json) AS CAST(json_array_length(json) AS INTEGER)`, `CREATE MACRO jsonb_pretty(json) AS json_pretty(json)`, `CREATE MACRO json_array_elements(json) AS unnest(json_extract(json, '$[*]'))`, `CREATE MACRO jsonb_array_elements(json) AS unnest(json_extract(json, '$[*]'))`, From 67ab31161777b534a291ef6e9e3edcd373d06009 Mon Sep 17 00:00:00 2001 From: exAspArk Date: Wed, 7 Jan 2026 12:40:09 -0500 Subject: [PATCH 23/24] Release v1.8.0 --- Dockerfile | 7 + Makefile | 2 + README.md | 151 ++- docker/bin/run.sh | 13 + src/common/common_config.go | 2 +- src/common/duckdb_client.go | 67 +- src/common/iceberg_schema_column.go | 7 + src/common/iceberg_table.go | 8 +- src/common/iceberg_table_writer.go | 30 +- src/server/main.go | 3 + src/server/postgres_server.go | 21 +- src/server/query_handler.go | 34 +- src/server/query_handler_test.go | 4 +- src/server/query_remapper_table.go | 75 +- src/server/response_handler.go | 2 +- src/syncer-amplitude/lib/amplitude.go | 2 +- .../lib/{event.go => record_event.go} | 4 +- src/syncer-attio/lib/syncer.go | 10 +- src/syncer-dialpad/go.mod | 72 + src/syncer-dialpad/go.sum | 1166 +++++++++++++++++ src/syncer-dialpad/lib/config.go | 116 ++ src/syncer-dialpad/lib/go.mod | 69 + src/syncer-dialpad/lib/go.sum | 1166 +++++++++++++++++ src/syncer-dialpad/lib/nats.go | 37 + src/syncer-dialpad/lib/record_sms_message.go | 124 ++ src/syncer-dialpad/lib/syncer.go | 113 ++ src/syncer-dialpad/main.go | 20 + 27 files changed, 3202 insertions(+), 123 deletions(-) rename src/syncer-amplitude/lib/{event.go => record_event.go} (99%) create mode 100644 src/syncer-dialpad/go.mod create mode 100644 src/syncer-dialpad/go.sum create mode 100644 src/syncer-dialpad/lib/config.go create mode 100644 src/syncer-dialpad/lib/go.mod create mode 100644 src/syncer-dialpad/lib/go.sum create mode 100644 src/syncer-dialpad/lib/nats.go create mode 100644 src/syncer-dialpad/lib/record_sms_message.go create mode 100644 src/syncer-dialpad/lib/syncer.go create mode 100644 src/syncer-dialpad/main.go diff --git a/Dockerfile b/Dockerfile index 93cd6e8..bf14084 100644 --- a/Dockerfile +++ b/Dockerfile @@ -49,6 +49,10 @@ COPY --chown=app:app src/syncer-attio/lib/go.mod src/syncer-attio/lib/go.sum /ap COPY --chown=app:app src/syncer-attio/go.mod src/syncer-attio/go.sum /app/src/syncer-attio/ RUN cd /app/src/syncer-attio && go mod download +COPY --chown=app:app src/syncer-dialpad/lib/go.mod src/syncer-dialpad/lib/go.sum /app/src/syncer-dialpad/lib/ +COPY --chown=app:app src/syncer-dialpad/go.mod src/syncer-dialpad/go.sum /app/src/syncer-dialpad/ +RUN cd /app/src/syncer-dialpad && go mod download + COPY --chown=app:app src/server/go.mod src/server/go.sum /app/src/server/ RUN cd /app/src/server && go mod download @@ -56,12 +60,14 @@ COPY --chown=app:app src/common /app/src/common COPY --chown=app:app src/syncer-postgres /app/src/syncer-postgres COPY --chown=app:app src/syncer-amplitude /app/src/syncer-amplitude COPY --chown=app:app src/syncer-attio /app/src/syncer-attio +COPY --chown=app:app src/syncer-dialpad /app/src/syncer-dialpad COPY --chown=app:app src/server /app/src/server RUN ARCH=$(dpkg --print-architecture) \ && cd /app/src/syncer-postgres && CGO_ENABLED=1 GOOS=linux GOARCH=$ARCH go build -o /app/bin/syncer-postgres \ && cd /app/src/syncer-amplitude && CGO_ENABLED=1 GOOS=linux GOARCH=$ARCH go build -o /app/bin/syncer-amplitude \ && cd /app/src/syncer-attio && CGO_ENABLED=1 GOOS=linux GOARCH=$ARCH go build -o /app/bin/syncer-attio \ + && cd /app/src/syncer-dialpad && CGO_ENABLED=1 GOOS=linux GOARCH=$ARCH go build -o /app/bin/syncer-dialpad \ && cd /app/src/server && CGO_ENABLED=1 GOOS=linux GOARCH=$ARCH go build -o /app/bin/server # Prepare final image ############################################################################## @@ -72,6 +78,7 @@ COPY --chown=app:app --from=compile \ /app/bin/syncer-postgres \ /app/bin/syncer-amplitude \ /app/bin/syncer-attio \ + /app/bin/syncer-dialpad \ /app/bin/server \ /app/bin/ COPY --chown=app:app docker/bin /app/bin/ diff --git a/Makefile b/Makefile index 65fd3b1..8591ba5 100644 --- a/Makefile +++ b/Makefile @@ -6,6 +6,7 @@ install: cd ../syncer-postgres && go mod tidy && cd ../lib && go mod tidy && \ cd ../../syncer-amplitude && go mod tidy && cd ./lib && go mod tidy && \ cd ../../syncer-attio && go mod tidy && cd ./lib && go mod tidy && \ + cd ../../syncer-dialpad && go mod tidy && cd ./lib && go mod tidy && \ cd ../../server && go mod tidy" lint: @@ -13,6 +14,7 @@ lint: cd ../syncer-postgres && go fmt && deadcode . && staticcheck . && cd ./lib && go fmt && staticcheck . && \ cd ../../syncer-amplitude && go fmt && deadcode . && staticcheck . && cd ./lib && go fmt && staticcheck . && \ cd ../../syncer-attio && go fmt && deadcode . && staticcheck . && cd ./lib && go fmt && staticcheck . && \ + cd ../../syncer-dialpad && go fmt && deadcode . && staticcheck . && cd ./lib && go fmt && staticcheck . && \ cd ../../server && go fmt && deadcode . && staticcheck ." build: diff --git a/README.md b/README.md index 401f3a3..84ee054 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,11 @@ BemiDB is an open-source Snowflake and Fivetran alternative bundled together. It - [Use cases](#use-cases) - [Quickstart](#quickstart) - [Usage](#usage) + - [Syncing from Amplitude](#syncing-from-amplitude) + - [Syncing from Attio](#syncing-from-attio) + - [Syncing from Dialpad](#syncing-from-dialpad) + - [Syncing from Postgres](#syncing-from-postgres) + - [Customizing S3 endpoint](#customizing-s3-endpoint) - [Configuration](#configuration) - [Architecture](#architecture) - [Benchmark](#benchmark) @@ -118,50 +123,124 @@ psql postgres://localhost:54321/bemidb -c "SELECT COUNT(*) FROM postgres.[table_ ## Usage -#### Syncing from Postgres +#### Syncing from Amplitude -By default, BemiDB syncs all tables from the Postgres database. To include and sync only specific tables from your Postgres database: +1. Create an [Amplitude API key](https://docs.gettelio.com/integrations/amplitude) +2. Run the syncer: ```sh docker run \ - -e SOURCE_POSTGRES_DATABASE_URL=postgres://user:password@host.docker.internal:5432/source \ - -e SOURCE_POSTGRES_INCLUDE_TABLES=public.table1,public.table2 \ # A comma-separated list of tables to include - -e DESTINATION_SCHEMA_NAME=postgres \ + -e SOURCE_AMPLITUDE_API_KEY=[...] \ + -e SOURCE_AMPLITUDE_SECRET_KEY=[...] \ + -e SOURCE_AMPLITUDE_START_DATE=2025-01-01 \ + -e DESTINATION_SCHEMA_NAME=amplitude \ -e AWS_REGION -e AWS_S3_BUCKET -e AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY -e CATALOG_DATABASE_URL \ - ghcr.io/bemihq/bemidb:latest syncer-postgres + ghcr.io/bemihq/bemidb:latest syncer-amplitude ``` -To exclude specific tables during the sync: +#### Syncing from Attio + +1. Create an [Attio API access token](https://docs.gettelio.com/integrations/attio) +2. Run the syncer: ```sh docker run \ - -e SOURCE_POSTGRES_DATABASE_URL=postgres://user:password@host.docker.internal:5432/source \ - -e SOURCE_POSTGRES_EXCLUDE_TABLES=public.audit_log,public.cache \ # A comma-separated list of tables to exclude - -e DESTINATION_SCHEMA_NAME=postgres \ + -e SOURCE_ATTIO_API_ACCESS_TOKEN=[...] \ + -e DESTINATION_SCHEMA_NAME=attio \ -e AWS_REGION -e AWS_S3_BUCKET -e AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY -e CATALOG_DATABASE_URL \ - ghcr.io/bemihq/bemidb:latest syncer-postgres + ghcr.io/bemihq/bemidb:latest syncer-attio ``` -#### Syncing from Amplitude +#### Syncing from Dialpad + +1. Create a [Dialpad API key](https://docs.gettelio.com/integrations/dialpad) +2. Create a webhook endpoint: + +```sh +curl -X POST "https://dialpad.com/api/v2/webhooks" \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer [DIALPAD_API_KEY]" \ + -d '{ + "hook_url": "https://[YOUR_DOMAIN]/[YOUR_WEBHOOK_ENDPOINT]", + "secret": "[YOUR_WEBHOOK_SECRET]" + }' +``` + +3. Subscribe to SMS events for the created webhook: + +```sh +curl -X POST "https://dialpad.com/api/v2/subscriptions/sms" \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer [DIALPAD_API_KEY]" \ + -d '{ + "direction": "all", + "enabled": true, + "endpoint_id": "[WEBHOOK_ID]", + "include_internal": false, + "status": false + }' +``` + +4. Write a small service to receive Dialpad webhook events and publish them to NATS JetStream. + +

+See example code in Node.js + +```ts +import express from 'express'; +import bodyParser from 'body-parser'; +import { jwtVerify } from 'jose'; +import { connect, JSONCodec } from 'nats'; + +const app = express(); +app.use(bodyParser.json()); +app.post('/dialpad-webhook', async (req, res) => { + const { payload } = await jwtVerify(request.body, new TextEncoder().encode('[YOUR_WEBHOOK_SECRET]'), { algorithms: ['HS256'] }); + const jsonCodec = JSONCodec(); + const natsConnection = await connect({ servers: "nats://host.docker.internal:4222" }); + const jetstreamManager = await natsConnection.jetstreamManager(); + await jetstreamManager.streams.add({ name: 'bemidb', subjects: ['bemidb.dialpad'] }); + await jetstreamManager.jetstream().publish('bemidb.dialpad', jsonCodec.encode(payload)); +}); +app.listen(3000, () => console.log('Server is running on port 3000')); +``` +
+ +5. Run the syncer: ```sh docker run \ - -e SOURCE_AMPLITUDE_API_KEY=[...] \ - -e SOURCE_AMPLITUDE_SECRET_KEY=[...] \ - -e SOURCE_AMPLITUDE_START_DATE=2025-01-01 \ - -e DESTINATION_SCHEMA_NAME=amplitude \ + -e NATS_URL=nats://host.docker.internal:4222 \ + -e NATS_JETSTREAM_STREAM=bemidb \ + -e NATS_JETSTREAM_SUBJECT=bemidb.dialpad \ + -e NATS_JETSTREAM_CONSUMER_NAME=bemidb-dialpad \ + -e DESTINATION_SCHEMA_NAME=dialpad \ -e AWS_REGION -e AWS_S3_BUCKET -e AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY -e CATALOG_DATABASE_URL \ - ghcr.io/bemihq/bemidb:latest syncer-amplitude + ghcr.io/bemihq/bemidb:latest syncer-dialpad ``` -#### Syncing from Attio +#### Syncing from Postgres + +By default, BemiDB syncs all tables from the Postgres database. To include and sync only specific tables from your Postgres database: ```sh docker run \ - -e SOURCE_ATTIO_API_ACCESS_TOKEN=[...] \ - -e DESTINATION_SCHEMA_NAME=attio \ + -e SOURCE_POSTGRES_DATABASE_URL=postgres://user:password@host.docker.internal:5432/source \ + -e SOURCE_POSTGRES_INCLUDE_TABLES=public.table1,public.table2 \ # A comma-separated list of tables to include + -e DESTINATION_SCHEMA_NAME=postgres \ -e AWS_REGION -e AWS_S3_BUCKET -e AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY -e CATALOG_DATABASE_URL \ - ghcr.io/bemihq/bemidb:latest syncer-attio + ghcr.io/bemihq/bemidb:latest syncer-postgres +``` + +To exclude specific tables during the sync: + +```sh +docker run \ + -e SOURCE_POSTGRES_DATABASE_URL=postgres://user:password@host.docker.internal:5432/source \ + -e SOURCE_POSTGRES_EXCLUDE_TABLES=public.audit_log,public.cache \ # A comma-separated list of tables to exclude + -e DESTINATION_SCHEMA_NAME=postgres \ + -e AWS_REGION -e AWS_S3_BUCKET -e AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY -e CATALOG_DATABASE_URL \ + ghcr.io/bemihq/bemidb:latest syncer-postgres ``` #### Customizing S3 endpoint @@ -195,15 +274,6 @@ export AWS_S3_ENDPOINT=http://localhost:9000 ## Configuration -#### `syncer-postgres` command options - -| Environment variable | Default value | Description | -|-------------------------------------|---------------|----------------------------------------------------------------------| -| `DESTINATION_SCHEMA_NAME` | Required | Schema name in BemiDB to sync data to. | -| `SOURCE_POSTGRES_DATABASE_URL` | Required | Postgres database URL to sync data from. | -| `SOURCE_POSTGRES_INCLUDE_TABLES` | | List of tables to include in sync. Comma-separated `schema.table`. | -| `SOURCE_POSTGRES_EXCLUDE_TABLES` | | List of tables to exclude from sync. Comma-separated `schema.table`. | - #### `syncer-amplitude` command options | Environment variable | Default value | Description | @@ -220,6 +290,26 @@ export AWS_S3_ENDPOINT=http://localhost:9000 | `DESTINATION_SCHEMA_NAME` | Required | Schema name in BemiDB to sync data to. | | `SOURCE_ATTIO_API_ACCESS_TOKEN` | Required | Attio API access token for authentication. | +#### `syncer-dialpad` command options + +| Environment variable | Default value | Description | +|--------------------------------|---------------|----------------------------------------------------------------| +| `DESTINATION_SCHEMA_NAME` | Required | Schema name in BemiDB to sync data to. | +| `NATS_URL` | Required | NATS server URL for connecting to receive Dialpad SMS records. | +| `NATS_JETSTREAM_STREAM` | Required | NATS JetStream stream name. | +| `NATS_JETSTREAM_SUBJECT` | Required | NATS JetStream subject name. | +| `NATS_JETSTREAM_CONSUMER_NAME` | Required | NATS JetStream consumer name. | +| `NATS_FETCH_TIMEOUT_SECONDS` | `30` | Timeout in seconds for fetching messages from NATS. | + +#### `syncer-postgres` command options + +| Environment variable | Default value | Description | +|-------------------------------------|---------------|----------------------------------------------------------------------| +| `DESTINATION_SCHEMA_NAME` | Required | Schema name in BemiDB to sync data to. | +| `SOURCE_POSTGRES_DATABASE_URL` | Required | Postgres database URL to sync data from. | +| `SOURCE_POSTGRES_INCLUDE_TABLES` | | List of tables to include in sync. Comma-separated `schema.table`. | +| `SOURCE_POSTGRES_EXCLUDE_TABLES` | | List of tables to exclude from sync. Comma-separated `schema.table`. | + #### `server` command options | Environment variable | Default value | Description | @@ -323,6 +413,7 @@ SELECT * FROM [TABLE] WHERE [JSON_COLUMN]->>'[JSON_KEY]' = '[JSON_VALUE]'; - [x] Amplitude (incremental) - [x] Attio CRM (full-refresh) - [x] Postgres (full-refresh) + - [x] Dialpad (real-time) - [ ] HubSpot - [ ] Stripe - [ ] Google Sheets diff --git a/docker/bin/run.sh b/docker/bin/run.sh index e5ec4e5..7afeac6 100755 --- a/docker/bin/run.sh +++ b/docker/bin/run.sh @@ -37,6 +37,19 @@ case "${1:-}" in ./bin/syncer-attio 2>&1 | sed 's/^/[Syncer] /' echo "Syncer for Attio finished." ;; + syncer-dialpad) + : "${NATS_URL:?Environment variable NATS_URL must be set}" + : "${NATS_JETSTREAM_STREAM:?Environment variable NATS_JETSTREAM_STREAM must be set}" + : "${NATS_JETSTREAM_SUBJECT:?Environment variable NATS_JETSTREAM_SUBJECT must be set}" + : "${NATS_JETSTREAM_CONSUMER_NAME:?Environment variable NATS_JETSTREAM_CONSUMER_NAME must be set}" + : "${DESTINATION_SCHEMA_NAME:?Environment variable DESTINATION_SCHEMA_NAME must be set}" + + psql $CATALOG_DATABASE_URL -f /app/scripts/catalog.sql + + echo "Starting Syncer for Dialpad..." + ./bin/syncer-dialpad 2>&1 | sed 's/^/[Syncer] /' + echo "Syncer for Dialpad finished." + ;; server) : "${AWS_REGION:?Environment variable AWS_REGION must be set}" : "${AWS_S3_BUCKET:?Environment variable AWS_S3_BUCKET must be set}" diff --git a/src/common/common_config.go b/src/common/common_config.go index 70a9a4b..c7811fa 100644 --- a/src/common/common_config.go +++ b/src/common/common_config.go @@ -1,7 +1,7 @@ package common const ( - VERSION = "1.7.0" + VERSION = "1.8.0" ENV_LOG_LEVEL = "BEMIDB_LOG_LEVEL" ENV_DISABLE_ANONYMOUS_ANALYTICS = "BEMIDB_DISABLE_ANONYMOUS_ANALYTICS" diff --git a/src/common/duckdb_client.go b/src/common/duckdb_client.go index 82ba503..6fb719a 100644 --- a/src/common/duckdb_client.go +++ b/src/common/duckdb_client.go @@ -14,9 +14,10 @@ var SYNCER_DUCKDB_BOOT_QUERIES = []string{ } type DuckdbClient struct { - Config *CommonConfig - Db *sql.DB - Connector *duckdb.Connector + Config *CommonConfig + Db *sql.DB + Connector *duckdb.Connector + BootQueries []string } func NewDuckdbClient(config *CommonConfig, bootQueries ...[]string) *DuckdbClient { @@ -24,7 +25,6 @@ func NewDuckdbClient(config *CommonConfig, bootQueries ...[]string) *DuckdbClien connector, err := duckdb.NewConnector("", nil) PanicIfError(config, err) db := sql.OpenDB(connector) - PanicIfError(config, err) client := &DuckdbClient{ Config: config, @@ -32,34 +32,28 @@ func NewDuckdbClient(config *CommonConfig, bootQueries ...[]string) *DuckdbClien Connector: connector, } - queries := []string{ + client.BootQueries = []string{ "SET timezone='UTC'", } if bootQueries != nil { - queries = append(queries, bootQueries[0]...) - } - for _, query := range queries { - _, err := client.ExecContext(ctx, query) - PanicIfError(config, err) + client.BootQueries = append(client.BootQueries, bootQueries[0]...) } - - client.setExplicitAwsCredentials(ctx) - + client.BootQueries = append( + client.BootQueries, + "CREATE OR REPLACE SECRET aws_s3_secret (TYPE S3, KEY_ID '"+config.Aws.AccessKeyId+"', SECRET '"+config.Aws.SecretAccessKey+"', REGION '"+config.Aws.Region+"', ENDPOINT '"+config.Aws.S3Endpoint+"', SCOPE 's3://"+config.Aws.S3Bucket+"')", + ) if IsLocalHost(config.Aws.S3Endpoint) { - _, err = client.ExecContext(ctx, "SET s3_use_ssl=false") - PanicIfError(config, err) + client.BootQueries = append(client.BootQueries, "SET s3_use_ssl=false") } - if config.Aws.S3Endpoint != DEFAULT_AWS_S3_ENDPOINT { - // Use endpoint/bucket/key (path, deprecated on AWS) instead of bucket.endpoint/key (vhost) - _, err = client.ExecContext(ctx, "SET s3_url_style='path'") - PanicIfError(config, err) + client.BootQueries = append(client.BootQueries, "SET s3_url_style='path'") // Use endpoint/bucket/key (path, deprecated on AWS) instead of bucket.endpoint/key (vhost) } - if config.LogLevel == LOG_LEVEL_TRACE { - _, err = client.ExecContext(ctx, "PRAGMA enable_logging('HTTP')") - PanicIfError(config, err) - _, err = client.ExecContext(ctx, "SET logging_storage = 'stdout'") + client.BootQueries = append(client.BootQueries, "PRAGMA enable_logging('HTTP')", "SET logging_storage = 'stdout'") + } + + for _, query := range client.BootQueries { + _, err := client.ExecContext(ctx, query) PanicIfError(config, err) } @@ -130,17 +124,22 @@ func (client *DuckdbClient) Close() { client.Db.Close() } -func (client *DuckdbClient) setExplicitAwsCredentials(ctx context.Context) { - config := client.Config - query := "CREATE OR REPLACE SECRET aws_s3_secret (TYPE S3, KEY_ID '$accessKeyId', SECRET '$secretAccessKey', REGION '$region', ENDPOINT '$endpoint', SCOPE '$s3Bucket')" - _, err := client.ExecContext(ctx, query, map[string]string{ - "accessKeyId": config.Aws.AccessKeyId, - "secretAccessKey": config.Aws.SecretAccessKey, - "region": config.Aws.Region, - "endpoint": config.Aws.S3Endpoint, - "s3Bucket": "s3://" + config.Aws.S3Bucket, - }) - PanicIfError(config, err) +func (client *DuckdbClient) RecreateDb() { + ctx := context.Background() + + client.Db.Close() + + connector, err := duckdb.NewConnector("", nil) + PanicIfError(client.Config, err) + db := sql.OpenDB(connector) + client.Db = db + client.Connector = connector + + for _, query := range client.BootQueries { + _, err := client.Db.ExecContext(ctx, query) + PanicIfError(client.Config, err) + } + } func replaceNamedStringArgs(query string, args map[string]string) string { diff --git a/src/common/iceberg_schema_column.go b/src/common/iceberg_schema_column.go index 4e2f0d9..63969f9 100644 --- a/src/common/iceberg_schema_column.go +++ b/src/common/iceberg_schema_column.go @@ -42,6 +42,9 @@ const ( PARQUET_MAX_DECIMAL_PRECISION = 38 PARQUET_FALLBACK_DECIMAL_SCALE = 6 PARQUET_NESTED_FIELD_ID_PREFIX = 1000 + + EMBEDDING_COLUMN_NAME = "_bemi_embedding" + EMBEDDING_COLUMN_LENGTH = "1536" ) type CatalogTableColumn struct { @@ -53,6 +56,10 @@ type CatalogTableColumn struct { } func (tableColumn CatalogTableColumn) ToSql() string { + if tableColumn.Name == EMBEDDING_COLUMN_NAME { + return `"` + EMBEDDING_COLUMN_NAME + `" ` + `FLOAT[` + EMBEDDING_COLUMN_LENGTH + `]` + } + sql := fmt.Sprintf(`"%s" %s`, tableColumn.Name, tableColumn.Type) if tableColumn.List { diff --git a/src/common/iceberg_table.go b/src/common/iceberg_table.go index 7c78c09..838e118 100644 --- a/src/common/iceberg_table.go +++ b/src/common/iceberg_table.go @@ -15,9 +15,9 @@ type IcebergTable struct { } type CursorValue struct { - ColumnName string - StringValue string - OverrideRows bool // Override rows that have the same value as this cursor value (if new rows are added with the same value, they will be included in the next sync) + ColumnName string + StringValue string + OverrideAppendedRows bool // Override rows that have the same value as this cursor value (if new rows are added with the same value, they will be included in the next sync) } func NewIcebergTable(config *CommonConfig, storageS3 *StorageS3, duckdbClient *DuckdbClient, icebergSchemaTable IcebergSchemaTable) *IcebergTable { @@ -103,7 +103,7 @@ func (table *IcebergTable) LastCursorValue(columnName string) CursorValue { row := table.DuckdbClient.QueryRowContext( context.Background(), - `SELECT CAST(max("`+columnName+`") AS VARCHAR) FROM iceberg_scan('`+metadataFileS3Path+`')`, + `SELECT COALESCE(CAST(max("`+columnName+`") AS VARCHAR), '') FROM iceberg_scan('`+metadataFileS3Path+`')`, ) if row == nil { return CursorValue{ColumnName: columnName} diff --git a/src/common/iceberg_table_writer.go b/src/common/iceberg_table_writer.go index cd8c9db..493fa24 100644 --- a/src/common/iceberg_table_writer.go +++ b/src/common/iceberg_table_writer.go @@ -217,9 +217,7 @@ func (writer *IcebergTableWriter) insertRows(loadRowsToDuckdbTableFunc func(duck } // Delete old files - for _, key := range objectsToDeleteKeys { - writer.deleteObject(key) - } + writer.deleteObjects(objectsToDeleteKeys) objectsToDeleteKeys = []string{} if reachedEnd { @@ -269,6 +267,8 @@ func (writer *IcebergTableWriter) appendRows(metadataFileS3Path string, cursorVa } else { break // no more rows to append } + } else if loadedRowCount == 1 && cursorValue.OverrideAppendedRows && cursorValue.StringValue != "" && newParquetFileCount == 0 { + return // exit if there is a single row to append with OverrideAppendedRows (to avoid overriding the pulled cursor value) } // Create parquet @@ -296,9 +296,7 @@ func (writer *IcebergTableWriter) appendRows(metadataFileS3Path string, cursorVa writer.StorageS3.CreateMetadata(metadataS3Path, writer.IcebergSchemaColumns, []ManifestListFile{manifestListFile}) // Delete old files - for _, key := range objectsToDeleteKeys { - writer.deleteObject(key) - } + writer.deleteObjects(objectsToDeleteKeys) } func (writer *IcebergTableWriter) updateRows(metadataFileS3Path string, uniqueIndexColumnNames []string, loadRowsToDuckdbTableFunc func(duckdbTableName string, loadedSize int64) (loadedRowCount int64, reachedEnd bool)) { @@ -372,9 +370,7 @@ func (writer *IcebergTableWriter) updateRows(metadataFileS3Path string, uniqueIn writer.StorageS3.CreateMetadata(metadataS3Path, writer.IcebergSchemaColumns, []ManifestListFile{manifestListFile}) // Delete old files - for _, key := range objectsToDeleteKeys { - writer.deleteObject(key) - } + writer.deleteObjects(objectsToDeleteKeys) } func (writer *IcebergTableWriter) deleteRows(metadataFileS3Path string, uniqueIndexColumnNames []string, loadRowsToDuckdbTableFunc func(duckdbTableName string, loadedSize int64) (loadedRowCount int64, reachedEnd bool)) { @@ -446,9 +442,7 @@ func (writer *IcebergTableWriter) deleteRows(metadataFileS3Path string, uniqueIn writer.StorageS3.CreateMetadata(metadataS3Path, writer.IcebergSchemaColumns, []ManifestListFile{manifestListFile}) // Delete old files - for _, key := range objectsToDeleteKeys { - writer.deleteObject(key) - } + writer.deleteObjects(objectsToDeleteKeys) } // DuckDB -------------------------------------------------------------------------------------------------------------- @@ -481,12 +475,12 @@ func (writer *IcebergTableWriter) hasOverlappingRowsInParquet(duckdbTableName st func (writer *IcebergTableWriter) insertToDuckdbTableFromParquet(duckdbTableName string, parquetFileS3Path string, cursorValue CursorValue) int64 { sql := "INSERT INTO " + duckdbTableName + " SELECT * FROM read_parquet('" + parquetFileS3Path + "')" - if cursorValue.OverrideRows { + if cursorValue.OverrideAppendedRows { // Exclude rows with the cursor value sql += ` WHERE "` + cursorValue.ColumnName + `" != '` + cursorValue.StringValue + `'` - LogInfo(writer.Config, "Replacing last existing Parquet file excluding cursor value:", strings.Split(parquetFileS3Path, "/data/")[1]) + LogDebug(writer.Config, "Replacing last existing Parquet file excluding cursor value:", strings.Split(parquetFileS3Path, "/data/")[1]) } else { - LogInfo(writer.Config, "Replacing last existing Parquet file:", strings.Split(parquetFileS3Path, "/data/")[1]) + LogDebug(writer.Config, "Replacing last existing Parquet file:", strings.Split(parquetFileS3Path, "/data/")[1]) } result, err := writer.DuckdbClient.ExecContext(context.Background(), sql) @@ -586,6 +580,12 @@ func (writer *IcebergTableWriter) deleteTempDuckdbTable(duckdbTableName string) PanicIfError(writer.Config, err) } +func (writer *IcebergTableWriter) deleteObjects(keys []string) { + for _, key := range keys { + writer.deleteObject(key) + } +} + func (writer *IcebergTableWriter) deleteObject(key string) { var fileName string if strings.Contains(key, "/data/") { diff --git a/src/server/main.go b/src/server/main.go index 8167fbf..c5d1180 100644 --- a/src/server/main.go +++ b/src/server/main.go @@ -56,6 +56,9 @@ func duckdbBootQueris(config *Config) []string { // Set up Iceberg "INSTALL iceberg", "LOAD iceberg", + // Set up vector similarity search + "INSTALL vss", + "LOAD vss", // Set up schemas "SELECT oid FROM pg_catalog.pg_namespace", diff --git a/src/server/postgres_server.go b/src/server/postgres_server.go index ffc8fea..fdae1b3 100644 --- a/src/server/postgres_server.go +++ b/src/server/postgres_server.go @@ -4,6 +4,8 @@ import ( "errors" "fmt" "net" + "strings" + "time" "github.com/jackc/pgx/v5/pgproto3" @@ -16,6 +18,8 @@ const ( PG_TX_STATUS_IDLE = 'I' SYSTEM_AUTH_USER = "bemidb" + + RETRY_SIMPLE_QUERY_TIMEOUT = 5 * time.Second ) type PostgresServer struct { @@ -97,13 +101,26 @@ func (server *PostgresServer) handleSimpleQuery(queryHandler *QueryHandler, quer common.LogDebug(server.config.CommonConfig, "Received query:", queryMessage.String) messages, err := queryHandler.HandleSimpleQuery(queryMessage.String) if err != nil { - server.writeError(err) - return + if server.isS3NotFoundError(err) { + common.LogDebug(server.config.CommonConfig, "Retrying query due to resynced table") + time.Sleep(RETRY_SIMPLE_QUERY_TIMEOUT) + messages, err = queryHandler.HandleSimpleQuery(queryMessage.String) + } + if err != nil { + server.writeError(err) + return + } } messages = append(messages, &pgproto3.ReadyForQuery{TxStatus: PG_TX_STATUS_IDLE}) server.writeMessages(messages...) } +func (server *PostgresServer) isS3NotFoundError(err error) bool { + return strings.Contains(err.Error(), "v1.metadata.json\": 404 (Not Found)") || + strings.Contains(err.Error(), ".parquet' (HTTP 404)") || + strings.Contains(err.Error(), ".avro' (HTTP 404)") +} + func (server *PostgresServer) handleExtendedQuery(queryHandler *QueryHandler, parseMessage *pgproto3.Parse) error { common.LogDebug(server.config.CommonConfig, "Parsing query", parseMessage.Query) messages, preparedStatement, err := queryHandler.HandleParseQuery(parseMessage) diff --git a/src/server/query_handler.go b/src/server/query_handler.go index 3856840..df64f0d 100644 --- a/src/server/query_handler.go +++ b/src/server/query_handler.go @@ -6,6 +6,7 @@ import ( "encoding/binary" "fmt" "strings" + "time" "github.com/google/uuid" "github.com/jackc/pgx/v5/pgproto3" @@ -15,7 +16,8 @@ import ( ) const ( - FALLBACK_SQL_QUERY = "SELECT 1" + FALLBACK_SQL_QUERY = "SELECT 1" + PREPARE_STATEMENT_TIMEOUT = 30 * time.Second ) type QueryHandler struct { @@ -110,7 +112,6 @@ func (queryHandler *QueryHandler) HandleSimpleQuery(originalQuery string) ([]pgp } func (queryHandler *QueryHandler) HandleParseQuery(message *pgproto3.Parse) ([]pgproto3.Message, *PreparedStatement, error) { - ctx := context.Background() originalQuery := string(message.Query) queryStatements, _, err := queryHandler.QueryRemapper.ParseAndRemapQuery(originalQuery) if err != nil { @@ -131,7 +132,7 @@ func (queryHandler *QueryHandler) HandleParseQuery(message *pgproto3.Parse) ([]p query := queryStatements[0] preparedStatement.Query = query - statement, err := queryHandler.ServerDuckdbClient.PrepareContext(ctx, query) + statement, err := queryHandler.prepareContextWithTimeout(query) preparedStatement.Statement = statement if err != nil { return nil, nil, err @@ -140,6 +141,33 @@ func (queryHandler *QueryHandler) HandleParseQuery(message *pgproto3.Parse) ([]p return []pgproto3.Message{&pgproto3.ParseComplete{}}, preparedStatement, nil } +func (queryHandler *QueryHandler) prepareContextWithTimeout(query string) (*sql.Stmt, error) { + ctx := context.Background() + timeoutCtx, cancel := context.WithTimeout(ctx, PREPARE_STATEMENT_TIMEOUT) + defer cancel() + + type result struct { + statement *sql.Stmt + err error + } + resultChan := make(chan result, 1) + + go func() { + statement, err := queryHandler.ServerDuckdbClient.PrepareContext(timeoutCtx, query) + resultChan <- result{statement, err} + }() + + select { + case res := <-resultChan: + return res.statement, res.err + case <-timeoutCtx.Done(): + common.LogWarn(queryHandler.Config.CommonConfig, "PrepareContext timed out, recreating DuckDB connection") + queryHandler.ServerDuckdbClient.RecreateDb() + queryHandler.QueryRemapper.remapperTable.Reset() + return queryHandler.ServerDuckdbClient.PrepareContext(ctx, query) + } +} + func (queryHandler *QueryHandler) HandleBindQuery(message *pgproto3.Bind, preparedStatement *PreparedStatement) ([]pgproto3.Message, *PreparedStatement, error) { if message.PreparedStatement != preparedStatement.Name { return nil, nil, fmt.Errorf("prepared statement mismatch, %s instead of %s: %s", message.PreparedStatement, preparedStatement.Name, preparedStatement.OriginalQuery) diff --git a/src/server/query_handler_test.go b/src/server/query_handler_test.go index b62af06..140a0f7 100644 --- a/src/server/query_handler_test.go +++ b/src/server/query_handler_test.go @@ -324,7 +324,7 @@ func TestHandleQuery(t *testing.T) { "SELECT rel.oid FROM pg_class rel LEFT JOIN pg_extension ON rel.oid = pg_extension.oid ORDER BY rel.oid LIMIT 1;": { "description": {"oid"}, "types": {uint32ToString(pgtype.OIDOID)}, - "values": {"1978"}, + "values": {"1988"}, }, "SELECT pg_total_relation_size(relid) AS total_size FROM pg_catalog.pg_statio_user_tables WHERE schemaname = 'postgres'": { "description": {"total_size"}, @@ -1320,7 +1320,7 @@ func TestHandleQuery(t *testing.T) { "types": {uint32ToString(pgtype.BoolOID)}, "values": {"f"}, }, - "SELECT CASE WHEN nsp.nspname = ANY('{information_schema}') THEN false ELSE true END AS db_support FROM pg_catalog.pg_namespace nsp WHERE nsp.oid = 1980::OID;": { + "SELECT CASE WHEN nsp.nspname = ANY('{information_schema}') THEN false ELSE true END AS db_support FROM pg_catalog.pg_namespace nsp LIMIT 1": { "description": {"db_support"}, "types": {uint32ToString(pgtype.BoolOID)}, "values": {"t"}, diff --git a/src/server/query_remapper_table.go b/src/server/query_remapper_table.go index e1a24bd..5d675c1 100644 --- a/src/server/query_remapper_table.go +++ b/src/server/query_remapper_table.go @@ -13,15 +13,18 @@ import ( var PG_CATALOG_TABLE_NAMES = common.Set[string]{} type QueryRemapperTable struct { - parserTable *ParserTable - parserFunction *ParserFunction - remapperFunction *QueryRemapperFunction + parserTable *ParserTable + parserFunction *ParserFunction + remapperFunction *QueryRemapperFunction + icebergReader *IcebergReader + config *Config + ServerDuckdbClient *common.DuckdbClient // nilable + + // Runtime loaded IcebergPersistentSchemaTables common.Set[common.IcebergSchemaTable] IcebergMaterlizedSchemaTables common.Set[common.IcebergSchemaTable] + IcebergEmbeddingSchemaTables common.Set[common.IcebergSchemaTable] IcebergMaterializedViews []common.IcebergMaterializedView - icebergReader *IcebergReader - ServerDuckdbClient *common.DuckdbClient // nilable - config *Config } func NewQueryRemapperTable(config *Config, icebergReader *IcebergReader, serverDuckdbClient *common.DuckdbClient) *QueryRemapperTable { @@ -33,7 +36,7 @@ func NewQueryRemapperTable(config *Config, icebergReader *IcebergReader, serverD ServerDuckdbClient: serverDuckdbClient, config: config, } - remapper.reloadIcebergTables() + remapper.Reset() return remapper } @@ -90,10 +93,6 @@ func (remapper *QueryRemapperTable) RemapTable(node *pgQuery.Node, permissions * return node } - // public.table -> (SELECT * FROM iceberg_scan('path')) table - // schema.table -> (SELECT * FROM iceberg_scan('path')) schema_table - // public.table -> (SELECT permitted, columns FROM iceberg_scan('path')) table - // public.table -> (SELECT NULL WHERE FALSE) table schemaTable := qSchemaTable.ToIcebergSchemaTable() if !remapper.IcebergPersistentSchemaTables.Contains(schemaTable) && !remapper.IcebergMaterlizedSchemaTables.Contains(schemaTable) { // Reload Iceberg tables if not found remapper.reloadIcebergTables() @@ -101,8 +100,17 @@ func (remapper *QueryRemapperTable) RemapTable(node *pgQuery.Node, permissions * return node // Let it return "Catalog Error: Table with name _ does not exist!" } } - icebergPath := remapper.icebergReader.MetadataFileS3Path(schemaTable) // iceberg/schema/table/metadata/v1.metadata.json + // public.table_with_embedding -> return as is + if remapper.IcebergEmbeddingSchemaTables.Contains(schemaTable) { + return node + } + + // public.table -> (SELECT * FROM iceberg_scan('path')) table + // schema.table -> (SELECT * FROM iceberg_scan('path')) schema_table + // public.table -> (SELECT permitted, columns FROM iceberg_scan('path')) table + // public.table -> (SELECT NULL WHERE FALSE) table + icebergPath := remapper.icebergReader.MetadataFileS3Path(schemaTable) // iceberg/schema/table/metadata/v1.metadata.json return parser.MakeIcebergTableNode(QueryToIcebergTable{ QuerySchemaTable: qSchemaTable, IcebergTablePath: icebergPath, @@ -133,6 +141,15 @@ func (remapper *QueryRemapperTable) RemapTableFunctionCall(rangeFunction *pgQuer } } +func (remapper *QueryRemapperTable) Reset() { + remapper.IcebergPersistentSchemaTables = common.NewSet[common.IcebergSchemaTable]() + remapper.IcebergMaterlizedSchemaTables = common.NewSet[common.IcebergSchemaTable]() + remapper.IcebergEmbeddingSchemaTables = common.NewSet[common.IcebergSchemaTable]() + remapper.IcebergMaterializedViews = []common.IcebergMaterializedView{} + + remapper.reloadIcebergTables() +} + func (remapper *QueryRemapperTable) reloadIcebergTables() { remapper.reloadIcebergMaterializedViews() remapper.reloadIcebergPersistentTables() @@ -151,28 +168,45 @@ func (remapper *QueryRemapperTable) reloadIcebergPersistentTables() { remapper.IcebergPersistentSchemaTables = newIcebergSchemaTables ctx := context.Background() - // CREATE TABLE IF NOT EXISTS + // CREATE TABLE for _, icebergSchemaTable := range newIcebergSchemaTables.Values() { if !previousIcebergSchemaTables.Contains(icebergSchemaTable) { catalogTableColumns, err := remapper.icebergReader.TableColumns(icebergSchemaTable) common.PanicIfError(remapper.config.CommonConfig, err) var sqlColumns []string + hasEmbeddingColumn := false for _, catalogTableColumn := range catalogTableColumns { sqlColumns = append(sqlColumns, catalogTableColumn.ToSql()) + if catalogTableColumn.Name == common.EMBEDDING_COLUMN_NAME { + hasEmbeddingColumn = true + } } + // Create schema and table _, err = remapper.ServerDuckdbClient.ExecContext(ctx, "CREATE SCHEMA IF NOT EXISTS "+icebergSchemaTable.Schema) common.PanicIfError(remapper.config.CommonConfig, err) - _, err = remapper.ServerDuckdbClient.ExecContext(ctx, "CREATE TABLE IF NOT EXISTS "+icebergSchemaTable.String()+" ("+strings.Join(sqlColumns, ", ")+")") + _, err = remapper.ServerDuckdbClient.ExecContext(ctx, "CREATE TABLE "+icebergSchemaTable.String()+" ("+strings.Join(sqlColumns, ", ")+")") common.PanicIfError(remapper.config.CommonConfig, err) + + // Reload embedding table data and create a cosine index + if hasEmbeddingColumn { + icebergPath := remapper.icebergReader.MetadataFileS3Path(icebergSchemaTable) + _, err = remapper.ServerDuckdbClient.ExecContext(ctx, "INSERT INTO "+icebergSchemaTable.String()+" SELECT * FROM iceberg_scan('"+icebergPath+"')") + common.PanicIfError(remapper.config.CommonConfig, err) + + _, err = remapper.ServerDuckdbClient.ExecContext(ctx, "CREATE INDEX "+icebergSchemaTable.Table+"_embedding ON "+icebergSchemaTable.String()+" USING HNSW ("+common.EMBEDDING_COLUMN_NAME+") WITH (metric='cosine')") + common.PanicIfError(remapper.config.CommonConfig, err) + remapper.IcebergEmbeddingSchemaTables.Add(icebergSchemaTable) + } } } - // DROP TABLE IF EXISTS + // DROP TABLE for _, icebergSchemaTable := range previousIcebergSchemaTables.Values() { if !newIcebergSchemaTables.Contains(icebergSchemaTable) { - _, err = remapper.ServerDuckdbClient.ExecContext(ctx, "DROP TABLE IF EXISTS "+icebergSchemaTable.String()) + _, err = remapper.ServerDuckdbClient.ExecContext(ctx, "DROP TABLE "+icebergSchemaTable.String()) common.PanicIfError(remapper.config.CommonConfig, err) + remapper.IcebergEmbeddingSchemaTables.Remove(icebergSchemaTable) } } } @@ -191,21 +225,21 @@ func (remapper *QueryRemapperTable) reloadIcebergMaterializedViews() { remapper.IcebergMaterlizedSchemaTables = newMaterializedSchemaTables ctx := context.Background() - // CREATE VIEW IF NOT EXISTS + // CREATE VIEW for _, icebergSchemaTable := range remapper.IcebergMaterlizedSchemaTables.Values() { if !previousIcebergSchemaTables.Contains(icebergSchemaTable) { _, err = remapper.ServerDuckdbClient.ExecContext(ctx, "CREATE SCHEMA IF NOT EXISTS "+icebergSchemaTable.Schema) common.PanicIfError(remapper.config.CommonConfig, err) - _, err = remapper.ServerDuckdbClient.ExecContext(ctx, "CREATE VIEW IF NOT EXISTS "+icebergSchemaTable.String()+" AS SELECT 1") + _, err = remapper.ServerDuckdbClient.ExecContext(ctx, "CREATE VIEW "+icebergSchemaTable.String()+" AS SELECT 1") common.PanicIfError(remapper.config.CommonConfig, err) _, err = remapper.ServerDuckdbClient.ExecContext(ctx, "INSERT INTO pg_matviews VALUES ('"+icebergSchemaTable.Schema+"', '"+icebergSchemaTable.Table+"', '"+remapper.config.User+"', NULL, FALSE, TRUE, '')") common.PanicIfError(remapper.config.CommonConfig, err) } } - // DROP VIEW IF EXISTS + // DROP VIEW for _, icebergSchemaTable := range previousIcebergSchemaTables.Values() { if !newMaterializedSchemaTables.Contains(icebergSchemaTable) { - _, err = remapper.ServerDuckdbClient.ExecContext(ctx, "DROP VIEW IF EXISTS "+icebergSchemaTable.String()) + _, err = remapper.ServerDuckdbClient.ExecContext(ctx, "DROP VIEW "+icebergSchemaTable.String()) common.PanicIfError(remapper.config.CommonConfig, err) _, err = remapper.ServerDuckdbClient.ExecContext(ctx, "DELETE FROM pg_matviews WHERE schemaname = '"+icebergSchemaTable.Schema+"' AND matviewname = '"+icebergSchemaTable.Table+"'") common.PanicIfError(remapper.config.CommonConfig, err) @@ -731,6 +765,7 @@ func CreateInformationSchemaTableQueries(config *Config) []string { WHEN 'DATE[]' THEN '_date' WHEN 'FLOAT' THEN 'float4' WHEN 'FLOAT[]' THEN '_float4' + WHEN 'FLOAT[` + common.EMBEDDING_COLUMN_LENGTH + `]' THEN '_float4' WHEN 'DOUBLE' THEN 'float8' WHEN 'DOUBLE[]' THEN '_float8' WHEN 'DECIMAL' THEN 'numeric' diff --git a/src/server/response_handler.go b/src/server/response_handler.go index 74717c2..3e7ebdb 100644 --- a/src/server/response_handler.go +++ b/src/server/response_handler.go @@ -60,7 +60,7 @@ func (responseHandler *ResponseHandler) ColumnDescriptionTypeOid(col *sql.Column return pgtype.NumericArrayOID case "FLOAT": return pgtype.Float4OID - case "FLOAT[]": + case "FLOAT[]", "FLOAT[" + common.EMBEDDING_COLUMN_LENGTH + "]": return pgtype.Float4ArrayOID case "DOUBLE": return pgtype.Float8OID diff --git a/src/syncer-amplitude/lib/amplitude.go b/src/syncer-amplitude/lib/amplitude.go index 8efce64..4406c4d 100644 --- a/src/syncer-amplitude/lib/amplitude.go +++ b/src/syncer-amplitude/lib/amplitude.go @@ -83,7 +83,7 @@ func (amplitude *Amplitude) Export(jsonQueueWriter *common.JsonQueueWriter, star decoder := json.NewDecoder(gzipReader) for { - var event Event + var event RecordEvent err := decoder.Decode(&event) if err != nil { if err == io.EOF { diff --git a/src/syncer-amplitude/lib/event.go b/src/syncer-amplitude/lib/record_event.go similarity index 99% rename from src/syncer-amplitude/lib/event.go rename to src/syncer-amplitude/lib/record_event.go index d169a80..6103788 100644 --- a/src/syncer-amplitude/lib/event.go +++ b/src/syncer-amplitude/lib/record_event.go @@ -9,7 +9,7 @@ const ( ) // https://amplitude.com/docs/apis/analytics/export -type Event struct { +type RecordEvent struct { Adid string `json:"adid"` AmplitudeAttributionIDs string `json:"amplitude_attribution_ids"` AmplitudeEventType string `json:"amplitude_event_type"` @@ -68,7 +68,7 @@ type Event struct { } // Normalize $insert_id -> insert_id, $insert_key -> insert_key, $schema -> schema -func (event *Event) ToMap() map[string]interface{} { +func (event *RecordEvent) ToMap() map[string]interface{} { result := make(map[string]interface{}) result["adid"] = event.Adid result["amplitude_attribution_ids"] = event.AmplitudeAttributionIDs diff --git a/src/syncer-attio/lib/syncer.go b/src/syncer-attio/lib/syncer.go index 70c1ccf..814def9 100644 --- a/src/syncer-attio/lib/syncer.go +++ b/src/syncer-attio/lib/syncer.go @@ -4,10 +4,6 @@ import ( "github.com/BemiHQ/BemiDB/src/common" ) -const ( - COMPRESSION_FACTOR = 2 // 1 GB uncompressed data x 2 = ~90MB compressed data -) - type Syncer struct { Config *Config Attio *Attio @@ -41,9 +37,9 @@ func (syncer *Syncer) Sync() { }() syncer.WriteToIceberg(object, cappedBuffer) - - common.SendAnonymousAnalytics(syncer.Config.CommonConfig, "syncer-attio-finish", syncer.name()) } + + common.SendAnonymousAnalytics(syncer.Config.CommonConfig, "syncer-attio-finish", syncer.name()) } func (syncer *Syncer) WriteToIceberg(object string, cappedBuffer *common.CappedBuffer) { @@ -67,8 +63,6 @@ func (syncer *Syncer) WriteToIceberg(object string, cappedBuffer *common.CappedB icebergTableWriter := common.NewIcebergTableWriter(syncer.Config.CommonConfig, syncer.StorageS3, syncer.DuckdbClient, syncingIcebergTable, icebergSchemaColumns, 1) icebergTableWriter.InsertFromJsonCappedBuffer(cappedBuffer) }) - - common.SendAnonymousAnalytics(syncer.Config.CommonConfig, "syncer-attio-finish", syncer.name()) } func (syncer *Syncer) name() string { diff --git a/src/syncer-dialpad/go.mod b/src/syncer-dialpad/go.mod new file mode 100644 index 0000000..6817158 --- /dev/null +++ b/src/syncer-dialpad/go.mod @@ -0,0 +1,72 @@ +module github.com/BemiHQ/BemiDB/src/syncer-dialpad + +go 1.24.4 + +require ( + github.com/BemiHQ/BemiDB/src/common v0.0.0-00010101000000-000000000000 + github.com/BemiHQ/BemiDB/src/syncer-dialpad/lib v0.0.0-00010101000000-000000000000 +) + +replace github.com/BemiHQ/BemiDB/src/common => ../common + +replace github.com/BemiHQ/BemiDB/src/syncer-dialpad/lib => ./lib + +require ( + github.com/apache/arrow-go/v18 v18.4.0 // indirect + github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 // indirect + github.com/apache/thrift v0.22.0 // indirect + github.com/aws/aws-sdk-go-v2 v1.37.0 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 // indirect + github.com/aws/aws-sdk-go-v2/config v1.30.1 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.18.1 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0 // indirect + github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.26.0 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.35.0 // indirect + github.com/aws/smithy-go v1.22.5 // indirect + github.com/duckdb/duckdb-go-bindings v0.1.16 // indirect + github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11 // indirect + github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11 // indirect + github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11 // indirect + github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11 // indirect + github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11 // indirect + github.com/go-viper/mapstructure/v2 v2.3.0 // indirect + github.com/goccy/go-json v0.10.5 // indirect + github.com/golang/snappy v1.0.0 // indirect + github.com/google/flatbuffers v25.2.10+incompatible // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect + github.com/jackc/pgx/v5 v5.7.5 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.11 // indirect + github.com/linkedin/goavro v2.1.0+incompatible // indirect + github.com/marcboeker/go-duckdb/arrowmapping v0.0.9 // indirect + github.com/marcboeker/go-duckdb/mapping v0.0.10 // indirect + github.com/marcboeker/go-duckdb/v2 v2.3.2 // indirect + github.com/nats-io/nats.go v1.47.0 // indirect + github.com/nats-io/nkeys v0.4.11 // indirect + github.com/nats-io/nuid v1.0.1 // indirect + github.com/pierrec/lz4/v4 v4.1.22 // indirect + github.com/xitongsys/parquet-go v1.6.2 // indirect + github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b // indirect + github.com/zeebo/xxh3 v1.0.2 // indirect + golang.org/x/crypto v0.37.0 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.25.0 // indirect + golang.org/x/sync v0.15.0 // indirect + golang.org/x/sys v0.33.0 // indirect + golang.org/x/text v0.26.0 // indirect + golang.org/x/tools v0.34.0 // indirect + golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect +) diff --git a/src/syncer-dialpad/go.sum b/src/syncer-dialpad/go.sum new file mode 100644 index 0000000..eedb340 --- /dev/null +++ b/src/syncer-dialpad/go.sum @@ -0,0 +1,1166 @@ +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.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.66.0/go.mod h1:dgqGAjKCDxyhGTtC9dAREQGUJpkceNm1yt590Qno0Ko= +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.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.82.0/go.mod h1:vlKccHJGuFBFufnAnuB08dfEH9Y3H7dzDzRECFdC2TA= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= +cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +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 v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= +cloud.google.com/go/compute v1.2.0/go.mod h1:xlogom/6gr8RJGBe7nT2eGsQYAFUbbv8dbC29qE3Xmw= +cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= +cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= +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/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= +cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= +cloud.google.com/go/iam v0.1.1/go.mod h1:CKqrcnI/suGpybEHxZ7BMehL0oA4LpdyJdUlTl9jVMw= +cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= +cloud.google.com/go/kms v1.1.0/go.mod h1:WdbppnCDMDpOvoYBMn1+gNmOeEoZYqAv+HeuKARGCXI= +cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= +cloud.google.com/go/monitoring v1.1.0/go.mod h1:L81pzz7HKn14QCMaCs6NTQkdBnE87TElyanS95vIcl4= +cloud.google.com/go/monitoring v1.4.0/go.mod h1:y6xnxfwI3hTFWOdkOaD7nfJVlwuC3/mS/5kvtT131p4= +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/pubsub v1.19.0/go.mod h1:/O9kmSe9bb9KRnIAWkzmqhPjHo6LtzGOBYd/kr06XSs= +cloud.google.com/go/secretmanager v1.3.0/go.mod h1:+oLTkouyiYiabAQNugCeTS3PAArGiMJuBqvJnJsyH+U= +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.12.0/go.mod h1:fFLk2dp2oAhDz8QFKwqrjdJvxSp/W2g7nillojlL5Ho= +cloud.google.com/go/storage v1.21.0/go.mod h1:XmRlxkgPjlBONznT2dDUU/5XlpU2OjMnKuqnZI01LAA= +cloud.google.com/go/trace v1.0.0/go.mod h1:4iErSByzxkyHWzzlAj63/Gmjz0NH1ASqhJguHpGcr6A= +cloud.google.com/go/trace v1.2.0/go.mod h1:Wc8y/uYyOhPy12KEnXG9XGrvfMz5F5SrYecQlbW1rwM= +contrib.go.opencensus.io/exporter/aws v0.0.0-20200617204711-c478e41e60e9/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= +contrib.go.opencensus.io/exporter/stackdriver v0.13.10/go.mod h1:I5htMbyta491eUxufwwZPQdcKvvgzMB4O9ni41YnIM8= +contrib.go.opencensus.io/integrations/ocsql v0.1.7/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/Azure/azure-amqp-common-go/v3 v3.2.1/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= +github.com/Azure/azure-amqp-common-go/v3 v3.2.2/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= +github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k= +github.com/Azure/azure-sdk-for-go v51.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v59.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.0.0/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.0.0/go.mod h1:+6sju8gk8FRmSajX3Oz4G5Gm7P+mbqE9FVaXXFYTkCM= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U= +github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.0.0/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.0.0/go.mod h1:ceIuwmxDWptoW3eCqSXlnPsZFKh4X+R38dWPv7GS9Vs= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.0.0/go.mod h1:s1tW/At+xHqjNFvWU4G0c0Qv33KOhvbGNj0RCTQDV8s= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.2.0/go.mod h1:c+Lifp3EDEamAkPVzMooRNOK6CZjNSdEnf1A7jsI9u4= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.1.0/go.mod h1:7QJP7dr2wznCMeqIrhMgWGf7XpAQnVrJqDm9nvV3Cu4= +github.com/Azure/azure-service-bus-go v0.11.5/go.mod h1:MI6ge2CuQWBVq+ly456MY7XqNLJip5LO1iSFodbNLbU= +github.com/Azure/azure-storage-blob-go v0.14.0/go.mod h1:SMqIBi+SuiQH32bvyjngEewEeXoPfKMgWlBDaYf6fck= +github.com/Azure/go-amqp v0.16.0/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= +github.com/Azure/go-amqp v0.16.4/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= +github.com/Azure/go-autorest/autorest v0.11.19/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= +github.com/Azure/go-autorest/autorest v0.11.22/go.mod h1:BAWYUWGPEtKPzjVkp0Q6an0MJcJDsoh5Z1BFAEFs4Xs= +github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= +github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/adal v0.9.14/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/adal v0.9.17/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= +github.com/Azure/go-autorest/autorest/azure/auth v0.5.9/go.mod h1:hg3/1yw0Bq87O3KvvnJoAh34/0zbP7SFizX/qN5JvjU= +github.com/Azure/go-autorest/autorest/azure/cli v0.4.2/go.mod h1:7qkJkT+j6b+hIpzMOwPChJhTqS8VbsqqgULzMNRugoM= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= +github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= +github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= +github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= +github.com/AzureAD/microsoft-authentication-library-for-go v0.4.0/go.mod h1:Vt9sXTKwMyGcOxSmLDMnGPgqsUg7m8pe215qMLrDXw4= +github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/GoogleCloudPlatform/cloudsql-proxy v1.29.0/go.mod h1:spvB9eLJH9dutlbPSRmHvSXXHOwGRyeXh1jVdquA2G8= +github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= +github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apache/arrow-go/v18 v18.4.0 h1:/RvkGqH517iY8bZKc4FD5/kkdwXJGjxf28JIXbJ/oB0= +github.com/apache/arrow-go/v18 v18.4.0/go.mod h1:Aawvwhj8x2jURIzD9Moy72cF0FyJXOpkYpdmGRHcw14= +github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 h1:byKBBF2CKWBjjA4J1ZL2JXttJULvWSl50LegTyRZ728= +github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516/go.mod h1:QNYViu/X0HXDHw7m3KXzWSVXIbfUvJqBFe6Gj8/pYA0= +github.com/apache/thrift v0.0.0-20181112125854-24918abba929/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.14.2/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.22.0 h1:r7mTJdj51TMDe6RtcmNdQxgn9XcyfGDOzegMDRg47uc= +github.com/apache/thrift v0.22.0/go.mod h1:1e7J/O1Ae6ZQMTYdy9xa3w9k+XHWPfRvdPyJeynQ+/g= +github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= +github.com/aws/aws-sdk-go v1.30.19/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= +github.com/aws/aws-sdk-go v1.37.0/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= +github.com/aws/aws-sdk-go v1.43.31 h1:yJZIr8nMV1hXjAvvOLUFqZRJcHV7udPQBfhJqawDzI0= +github.com/aws/aws-sdk-go v1.43.31/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= +github.com/aws/aws-sdk-go-v2 v1.16.2/go.mod h1:ytwTPBG6fXTZLxxeeCCWj2/EMYp/xDUgX+OET6TLNNU= +github.com/aws/aws-sdk-go-v2 v1.23.0/go.mod h1:i1XDttT4rnf6vxc9AuskLc6s7XBee8rlLilKlc03uAA= +github.com/aws/aws-sdk-go-v2 v1.37.0 h1:YtCOESR/pN4j5oA7cVHSfOwIcuh/KwHC4DOSXFbv5F0= +github.com/aws/aws-sdk-go-v2 v1.37.0/go.mod h1:9Q0OoGQoboYIAJyslFyF1f5K1Ryddop8gqMhWx/n4Wg= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.1/go.mod h1:n8Bs1ElDD2wJ9kCRTczA83gYbBmjSwZp3umc6zF4EeM= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.1/go.mod h1:t8PYl/6LzdAqsU4/9tz28V/kU+asFePvpOMkdul0gEQ= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 h1:6GMWV6CNpA/6fbFHnoAjrv4+LGfyTqZz2LtCHnspgDg= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0/go.mod h1:/mXlTIVG9jbxkqDnr5UQNQxW1HRYxeGklkM9vAFeabg= +github.com/aws/aws-sdk-go-v2/config v1.15.3/go.mod h1:9YL3v07Xc/ohTsxFXzan9ZpFpdTOFl4X65BAKYaz8jg= +github.com/aws/aws-sdk-go-v2/config v1.25.3/go.mod h1:tAByZy03nH5jcq0vZmkcVoo6tRzRHEwSFx3QW4NmDw8= +github.com/aws/aws-sdk-go-v2/config v1.30.1 h1:sHL8g/+9tcZATeV2tEkEfxZeaNokDtKsSjGMGHD49qA= +github.com/aws/aws-sdk-go-v2/config v1.30.1/go.mod h1:wkibEyFfxXRyTSzRU4bbF5IUsSXyE4xQ4ZjkGmi5tFo= +github.com/aws/aws-sdk-go-v2/credentials v1.11.2/go.mod h1:j8YsY9TXTm31k4eFhspiQicfXPLZ0gYXA50i4gxPE8g= +github.com/aws/aws-sdk-go-v2/credentials v1.16.2/go.mod h1:sDdvGhXrSVT5yzBDR7qXz+rhbpiMpUYfF3vJ01QSdrc= +github.com/aws/aws-sdk-go-v2/credentials v1.18.1 h1:E55xvOqlX7CvB66Z7rSM9usCrFU1ryUIUHqiXsEzVoE= +github.com/aws/aws-sdk-go-v2/credentials v1.18.1/go.mod h1:iobSQfR5MkvILxssGOvi/P1jjOhrRzfTiCPCzku0vx4= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.3/go.mod h1:uk1vhHHERfSVCUnqSqz8O48LBYDSC+k6brng09jcMOk= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.4/go.mod h1:t4i+yGHMCcUNIX1x7YVYa6bH/Do7civ5I6cG/6PMfyA= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0 h1:9sBTeKQwAvmJUWKIACIoiFSnxxl+sS++YDfr17/ngq0= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0/go.mod h1:LW9/PxQD1SYFC7pnWcgqPhoyZprhjEdg5hBK6qYPLW8= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.3/go.mod h1:0dHuD2HZZSiwfJSy1FO5bX1hQ1TxVV1QXXjpn3XUE44= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.14.0/go.mod h1:UcgIwJ9KHquYxs6Q5skC9qXjhYMK+JASDYcXQ4X7JZE= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1 h1:aAjA/1JZ1xH/F9XvxJu9cXZyp7BqVXtHpztyZ6p799E= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1/go.mod h1:ia9HASsPba/7o84sp6iE4wZPdNTJ0oicBe5sWQQk+Ys= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.9/go.mod h1:AnVH5pvai0pAF4lXRq0bmhbes1u9R8wTE+g+183bZNM= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.3/go.mod h1:7sGSz1JCKHWWBHq98m6sMtWQikmYPpxjqOydDemiVoM= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0 h1:H2iZoqW/v2Jnrh1FnU725Bq6KJ0k2uP63yH+DcY+HUI= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0/go.mod h1:L0FqLbwMXHvNC/7crWV1iIxUlOKYZUE8KuTIA+TozAI= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.3/go.mod h1:ssOhaLpRlh88H3UmEcsBoVKq309quMvm3Ds8e9d4eJM= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.3/go.mod h1:ify42Rb7nKeDDPkFjKn7q1bPscVPu/+gmHH8d2c+anU= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0 h1:EDped/rNzAhFPhVY0sDGbtD16OKqksfA8OjF/kLEgw8= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0/go.mod h1:uUI335jvzpZRPpjYx6ODc/wg1qH+NnoSTK/FwVeK0C0= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.10/go.mod h1:8DcYQcz0+ZJaSxANlHIsbbi6S+zMwjwdDqwW3r9AzaE= +github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.3/go.mod h1:5yzAuE9i2RkVAttBl8yxZgQr5OCq4D5yDnG7j9x2L0U= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0 h1:iLvW/zOkHGU3BDU5thWnj+UZ9pjhuVhv1loLj7yVtBw= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0/go.mod h1:Fn3gvhdF1x5Rs9nUoCy/fJT1ms8f8dO7RqM9lJHuazQ= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.1/go.mod h1:GeUru+8VzrTXV/83XyMJ80KpH8xO89VPoUileyNQ+tc= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1/go.mod h1:l9ymW25HOqymeU2m1gbUQ3rUIsTwKs8gYHXkqDQUhiI= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 h1:6+lZi2JeGKtCraAj1rpoZfKqnQ9SptseRZioejfUOLM= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0/go.mod h1:eb3gfbVIxIoGgJsi9pGne19dhCBpK6opTYpQqAmdy44= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.3/go.mod h1:Seb8KNmD6kVTjwRjVEgOT5hPin6sq+v4C2ycJQDwuH8= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.3/go.mod h1:R+/S1O4TYpcktbVwddeOYg+uwUfLhADP2S/x4QwsCTM= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0 h1:qGyLBQPphYzUf+IIlb5tHnvg1U2Vc5hXPcP7oRSQfy0= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0/go.mod h1:g+dzKSLXiR/8ATkPXmLhPOI6rDdjLP3tngeo3FvDcIw= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.3/go.mod h1:wlY6SVjuwvh3TVRpTqdy4I1JpBFLX4UGeKZdWntaocw= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.3/go.mod h1:Owv1I59vaghv1Ax8zz8ELY8DN7/Y0rGS+WWAmjgi950= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0 h1:eRhU3Sh8dGbaniI6B+I48XJMrTPRkK4DKo+vqIxziOU= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0/go.mod h1:paNLV18DZ6FnWE/bd06RIKPDIFpjuvCkGKWTG/GDBeM= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.3/go.mod h1:Bm/v2IaN6rZ+Op7zX+bOUMdL4fsrYZiD0dsjLhNKwZc= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.3/go.mod h1:KZgs2ny8HsxRIRbDwgvJcHHBZPOzQr/+NtGwnP+w2ec= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0 h1:6jusT+XCcvnD+Elxvm7bUf5sCMTpZEp3AKjYQ4tWJSo= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0/go.mod h1:LimGpdIF/sTBdgqwOEkrArXLCoTamK/9L9x8IKBFTIc= +github.com/aws/aws-sdk-go-v2/service/kms v1.16.3/go.mod h1:QuiHPBqlOFCi4LqdSskYYAWpQlx3PKmohy+rE2F+o5g= +github.com/aws/aws-sdk-go-v2/service/s3 v1.26.3/go.mod h1:g1qvDuRsJY+XghsV6zg00Z4KJ7DtFFCx8fJD2a491Ak= +github.com/aws/aws-sdk-go-v2/service/s3 v1.43.0/go.mod h1:NXRKkiRF+erX2hnybnVU660cYT5/KChRD4iUgJ97cI8= +github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0 h1:gAV4NEp4A+JOrIdoXkAeyy6IOo7+X2s/jRuaHKYiMaU= +github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0/go.mod h1:JIQwK8sZ5MuKGm5rrFwp9MHUcyYEsQNpVixuPDlnwaU= +github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.15.4/go.mod h1:PJc8s+lxyU8rrre0/4a0pn2wgwiDvOEzoOjcJUBr67o= +github.com/aws/aws-sdk-go-v2/service/sns v1.17.4/go.mod h1:kElt+uCcXxcqFyc+bQqZPFD9DME/eC6oHBXvFzQ9Bcw= +github.com/aws/aws-sdk-go-v2/service/sqs v1.18.3/go.mod h1:skmQo0UPvsjsuYYSYMVmrPc1HWCbHUJyrCEp+ZaLzqM= +github.com/aws/aws-sdk-go-v2/service/ssm v1.24.1/go.mod h1:NR/xoKjdbRJ+qx0pMR4mI+N/H1I1ynHwXnO6FowXJc0= +github.com/aws/aws-sdk-go-v2/service/sso v1.11.3/go.mod h1:7UQ/e69kU7LDPtY40OyoHYgRmgfGM4mgsLYtcObdveU= +github.com/aws/aws-sdk-go-v2/service/sso v1.17.2/go.mod h1:/pE21vno3q1h4bbhUOEi+6Zu/aT26UK2WKkDXd+TssQ= +github.com/aws/aws-sdk-go-v2/service/sso v1.26.0 h1:cuFWHH87GP1NBGXXfMicUbE7Oty5KpPxN6w4JpmuxYc= +github.com/aws/aws-sdk-go-v2/service/sso v1.26.0/go.mod h1:aJBemdlbCKyOXEXdXBqS7E+8S9XTDcOTaoOjtng54hA= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.20.0/go.mod h1:dWqm5G767qwKPuayKfzm4rjzFmVjiBFbOJrpSPnAMDs= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0 h1:t2va+wewPOYIqC6XyJ4MGjiGKkczMAPsgq5W4FtL9ME= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0/go.mod h1:ExCTcqYqN0hYYRsDlBVU8+68grqlWdgX9/nZJwQW4aY= +github.com/aws/aws-sdk-go-v2/service/sts v1.16.3/go.mod h1:bfBj0iVmsUyUg4weDB4NxktD9rDGeKSVWnjTnwbx9b8= +github.com/aws/aws-sdk-go-v2/service/sts v1.25.3/go.mod h1:4EqRHDCKP78hq3zOnmFXu5k0j4bXbRFfCh/zQ6KnEfQ= +github.com/aws/aws-sdk-go-v2/service/sts v1.35.0 h1:FD9agdG4CeOGS3ORLByJk56YIXDS7mxFpmZyCtpqExc= +github.com/aws/aws-sdk-go-v2/service/sts v1.35.0/go.mod h1:NDzDPbBF1xtSTZUMuZx0w3hIfWzcL7X2AQ0Tr9becIQ= +github.com/aws/smithy-go v1.11.2/go.mod h1:3xHYmszWVx2c0kIwQeEVf9uSm4fYZt67FBJnwub1bgM= +github.com/aws/smithy-go v1.17.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= +github.com/aws/smithy-go v1.22.5 h1:P9ATCXPMb2mPjYBgueqJNCA5S9UfktsW0tTxi+a7eqw= +github.com/aws/smithy-go v1.22.5/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/bobg/gcsobj v0.1.2/go.mod h1:vS49EQ1A1Ib8FgrL58C8xXYZyOCR2TgzAdopy6/ipa8= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +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/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/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= +github.com/colinmarc/hdfs/v2 v2.1.1/go.mod h1:M3x+k8UKKmxtFu++uAZ0OtDU8jR3jnaZIAc6yK4Ue0c= +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/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU= +github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= +github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= +github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= +github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= +github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= +github.com/duckdb/duckdb-go-bindings v0.1.16 h1:XPCk9hzP06PoWIxDPVU3gAy0m1XmLaZHTzLggNx/U9k= +github.com/duckdb/duckdb-go-bindings v0.1.16/go.mod h1:pBnfviMzANT/9hi4bg+zW4ykRZZPCXlVuvBWEcZofkc= +github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11 h1:GXQkG4HmEbwPtqCSabJTp9wZQQ7Gqr3KveLNesQWQOs= +github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11/go.mod h1:Ezo7IbAfB8NP7CqPIN8XEHKUg5xdRRQhcPPlCXImXYA= +github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11 h1:ATJMSBIDA/YAm/6CKeBDRtGK1OOwqfTZbWg9Y5fAc9E= +github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11/go.mod h1:eS7m/mLnPQgVF4za1+xTyorKRBuK0/BA44Oy6DgrGXI= +github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11 h1:AjvnGst1avyOECYiykthyHR4DTYTaqNDPr5W/0t5j0k= +github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11/go.mod h1:1GOuk1PixiESxLaCGFhag+oFi7aP+9W8byymRAvunBk= +github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11 h1:j3B1biawuhtxe2Chkiqcwf1Kxe8VJc8lLVmjBIcJrkI= +github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11/go.mod h1:o7crKMpT2eOIi5/FY6HPqaXcvieeLSqdXXaXbruGX7w= +github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11 h1:xR3vRE8y+48U6xDNkUlOfbl7/OTA7FVcDXJ+5vETuHU= +github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11/go.mod h1:IlOhJdVKUJCAPj3QsDszUo8DVdvp1nBFp4TUJVdw99s= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +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/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= +github.com/gin-gonic/gin v1.7.3/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= +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-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +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-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= +github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-viper/mapstructure/v2 v2.3.0 h1:27XbWsHIqhbdR5TIC911OfYvgSaW93HM+dX7970Q7jk= +github.com/go-viper/mapstructure/v2 v2.3.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= +github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= +github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-jwt/jwt/v4 v4.4.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188/go.mod h1:vXjM/+wXQnTPR4KqTKDgJukSZ6amVRtWMPEjE6sQoK8= +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/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/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +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.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= +github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +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/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/flatbuffers v25.2.10+incompatible h1:F3vclr7C3HpB1k9mxCGRMXq6FdUalZ6H/pNX4FP1v0Q= +github.com/google/flatbuffers v25.2.10+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +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.6/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.8/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/go-replayers/grpcreplay v1.1.0/go.mod h1:qzAvJ8/wi57zq7gWqaE6AwLM6miiXUQwP1S+I9icmhk= +github.com/google/go-replayers/httpreplay v1.1.1/go.mod h1:gN9GeLIs7l6NUoVaSSnv2RiqK1NiwAmD0MrKeC9IIks= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+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/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +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-20200905233945-acf8798be1f7/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-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210506205249-923b5ab0fc1a/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.2.0/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.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/wire v0.5.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU= +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.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/hanwen/go-fuse v1.0.0/go.mod h1:unqXarDXqzAk0rt98O2tVndEPIpUgLD9+rwFisZH3Ok= +github.com/hanwen/go-fuse/v2 v2.1.0/go.mod h1:oRyA5eK+pvJyv5otpO/DgccS8y/RvYMaO00GgRLGryc= +github.com/hashicorp/go-uuid v0.0.0-20180228145832-27454136f036/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +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/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/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.11.0/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= +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/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.2.0/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-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/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.10.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.15.0/go.mod h1:D/zyOyXiaM1TmVWnOM18p0xdDtdakRBa0RsVGI3U3bw= +github.com/jackc/pgx/v5 v5.7.5 h1:JHGfMnQY+IEtGM63d+NGMjoRpysB2JBwDr5fsngwmJs= +github.com/jackc/pgx/v5 v5.7.5/go.mod h1:aruU7o91Tc2q2cFp5h4uP3f6ztExVpyVv88Xl/8Vl8M= +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.2.1 h1:gI8os0wpRXFd4FiAY2dWiqRK037tjj3t7rKFeO4X5iw= +github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= +github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/jcmturner/gofork v0.0.0-20180107083740-2aebee971930/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= +github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +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/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= +github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= +github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.13.1/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/klauspost/cpuid/v2 v2.2.11 h1:0OwqZRYI2rFrjS4kvkDnqJkKHdHaRnCm68/DY4OxRzU= +github.com/klauspost/cpuid/v2 v2.2.11/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= +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/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +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/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +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.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/linkedin/goavro v2.1.0+incompatible h1:DV2aUlj2xZiuxQyvag8Dy7zjY69ENjS66bWkSfdpddY= +github.com/linkedin/goavro v2.1.0+incompatible/go.mod h1:bBCwI2eGYpUI/4820s67MElg9tdeLbINjLjiM2xZFYM= +github.com/marcboeker/go-duckdb/arrowmapping v0.0.9 h1:xj+kFOqR2gH3Mcxx9LmAVHebSnCiPm303N+uxfkWVmY= +github.com/marcboeker/go-duckdb/arrowmapping v0.0.9/go.mod h1:o56AqVS90v5bpxhPnOK9La7AfNTOrMORiqTQrlRbdPQ= +github.com/marcboeker/go-duckdb/mapping v0.0.10 h1:b/y2W8/hNlD0Dwjq0mCqIlLXpjQMnWy0WqDV9b9lHQQ= +github.com/marcboeker/go-duckdb/mapping v0.0.10/go.mod h1:Ro6Tw6sGG50O8S0daZsA8TrQJz/DvGrzGvMD7Jihirw= +github.com/marcboeker/go-duckdb/v2 v2.3.2 h1:96zG2JPyIhCFjHdBjjSpOdhzJzehoGTdl7LskkuMUTs= +github.com/marcboeker/go-duckdb/v2 v2.3.2/go.mod h1:VeXz9ZM6klNvICHrXEUzaHSgNqBeTdyMxr4CICw/UaY= +github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= +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.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= +github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= +github.com/minio/minio-go/v7 v7.0.34/go.mod h1:nCrRzjoSUQh8hgKKtu3Y708OLvRLtuASMg2/nvmbarw= +github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= +github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/nats-io/nats.go v1.47.0 h1:YQdADw6J/UfGUd2Oy6tn4Hq6YHxCaJrVKayxxFqYrgM= +github.com/nats-io/nats.go v1.47.0/go.mod h1:iRWIPokVIFbVijxuMQq4y9ttaBTMe0SFdlZfMDd+33g= +github.com/nats-io/nkeys v0.4.11 h1:q44qGV008kYd9W1b1nEBkNzvnWxtRSQ7A8BoqRrcfa0= +github.com/nats-io/nkeys v0.4.11/go.mod h1:szDimtgmfOi9n25JpfIdGw12tZFYXqhGxjhVxsatHVE= +github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/ncw/swift v1.0.52/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= +github.com/pborman/getopt v0.0.0-20180729010549-6fdd0a2c7117/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= +github.com/pierrec/lz4/v4 v4.1.8/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= +github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= +github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +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/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +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/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.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +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/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +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.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +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.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/xitongsys/parquet-go v1.5.1/go.mod h1:xUxwM8ELydxh4edHGegYq1pA8NnMKDx0K/GyB0o2bww= +github.com/xitongsys/parquet-go v1.6.2 h1:MhCaXii4eqceKPu9BwrjLqyK10oX9WF+xGhwvwbw7xM= +github.com/xitongsys/parquet-go v1.6.2/go.mod h1:IulAQyalCm0rPiZVNnCgm/PCL64X2tdSVGMQ/UeKqWA= +github.com/xitongsys/parquet-go-source v0.0.0-20190524061010-2b72cbee77d5/go.mod h1:xxCx7Wpym/3QCo6JhujJX51dzSXrwmb0oH6FQb39SEA= +github.com/xitongsys/parquet-go-source v0.0.0-20200817004010-026bad9b25d0/go.mod h1:HYhIKsdns7xz80OgkbgJYrtQY7FjHWHKH6cvN7+czGE= +github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b h1:zbb5qM/t3N+O33Vp5sFyG6yIcWZV1q7rfEjJM8UsRBQ= +github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b/go.mod h1:2ActxmJ4q17Cdruar9nKEkzKSOL1Ol03737Bkz10rTY= +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.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= +github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= +github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= +github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= +go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0= +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.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +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/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +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.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= +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.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= +gocloud.dev v0.26.0/go.mod h1:mkUgejbnbLotorqDyvedJO20XcZNTynmSeVSQS9btVg= +golang.org/x/crypto v0.0.0-20180723164146-c126467f60eb/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +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-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/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-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-20211115234514-b4de73f9ece8/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220511200225-c6db032c6c88/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= +golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= +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-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +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/lint v0.0.0-20210508222113-6edffad5e616/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.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w= +golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= +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-20191112182307-2180aed22343/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-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +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-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211020060615-d418f374d309/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220401154927-543a649e0bdd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +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.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +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.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +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-20210220032951-036812b2e83c/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.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= +golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +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-20191112214154-59a1497f0cea/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-20200828194041-157a740278f4/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-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/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-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/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-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220204135822-1c1b9b1eba6a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220330033206-e17cdc41300f/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-20220704084225-05e143d24a9e/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.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= +golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +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/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +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.5/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.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= +golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= +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/time v0.0.0-20211116232009-f0f3c7e86c11/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220224211638-0e9765cccd65/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-20190422233926-fe54fb35175b/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-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-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-20200828161849-5deb26317202/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20200915173823-2db8f0ff891c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20200918232735-d647fc253266/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +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.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo= +golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg= +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= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +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.31.0/go.mod h1:CL+9IBCa2WWU6gRuBWaKqGWLFFwbEUXkfeMkHLQWYWo= +google.golang.org/api v0.32.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +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.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.46.0/go.mod h1:ceL4oozhkAiTID8XMmJBsIxID/9wMXJVVFXPg4ylg3I= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.58.0/go.mod h1:cAbP2FsxoGVNwtgNAmmn3y5G1TWAiVYRmg4yku3lv+E= +google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.64.0/go.mod h1:931CdxA8Rm4t6zqTFGSsgwbAEZ2+GMYurbndwSimebM= +google.golang.org/api v0.66.0/go.mod h1:I1dmXYpX7HGwz/ejRxwQp2qj5bFAz93HiCU1C1oYd9M= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.68.0/go.mod h1:sOM8pTpwgflXRhz+oC8H2Dr+UcbMqkPPWNJo88Q7TH8= +google.golang.org/api v0.69.0/go.mod h1:boanBiw+h5c3s+tBPgEzLDRHfFLWV0qXxRHz3ws7C80= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= +google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +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/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-20200513103714-09dca8ec2884/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-20200831141814-d751682dd103/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-20200914193844-75d14daec038/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200921151605-7abf4a1a14d5/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-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210429181445-86c259c2b4ab/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210517163617-5e0236093d7a/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210921142501-181ce0d877f6/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211018162055-cf77aa76bad2/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211223182754-3ac035c7e7cb/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220111164026-67b88f271998/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220114231437-d2e6a121cae0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220201184016-50beb8ab5c44/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220204002441-d6cc3cc0770e/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220211171837-173942840c17/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220216160803-4663080d8bc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220401170504-314d38edb7de/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +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.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +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.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +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.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +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-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= +gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= +gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q= +gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mNfM5bm88whjWx4= +gopkg.in/jcmturner/gokrb5.v7 v7.3.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= +gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8= +gopkg.in/linkedin/goavro.v1 v1.0.5 h1:BJa69CDh0awSsLUmZ9+BowBdokpduDZSM9Zk8oKHfN4= +gopkg.in/linkedin/goavro.v1 v1.0.5/go.mod h1:Aw5GdAbizjOEl0kAMHV9iHmA8reZzW/OKuJAl4Hb9F0= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/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/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= +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= +nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= +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/src/syncer-dialpad/lib/config.go b/src/syncer-dialpad/lib/config.go new file mode 100644 index 0000000..6adc7f3 --- /dev/null +++ b/src/syncer-dialpad/lib/config.go @@ -0,0 +1,116 @@ +package dialpad + +import ( + "flag" + "os" + "slices" + "strings" + + "github.com/BemiHQ/BemiDB/src/common" +) + +const ( + ENV_DESTINATION_SCHEMA_NAME = "DESTINATION_SCHEMA_NAME" + + ENV_NATS_URL = "NATS_URL" + ENV_NATS_STREAM = "NATS_JETSTREAM_STREAM" + ENV_NATS_SUBJECT = "NATS_JETSTREAM_SUBJECT" + ENV_NATS_CONSUMER_NAME = "NATS_JETSTREAM_CONSUMER_NAME" + ENV_NATS_FETCH_TIMEOUT_SECONDS = "NATS_FETCH_TIMEOUT_SECONDS" + + DEFAULT_NATS_FETCH_TIMEOUT_SECONDS = 30 +) + +type NatsConfig struct { + Url string + Stream string + Subject string + ConsumerName string + FetchTimeoutSeconds int +} + +type Config struct { + CommonConfig *common.CommonConfig + DestinationSchemaName string + Nats NatsConfig +} + +var _config Config + +func RegisterFlags() { + _config.CommonConfig = &common.CommonConfig{} + + flag.StringVar(&_config.CommonConfig.LogLevel, "log-level", os.Getenv(common.ENV_LOG_LEVEL), `Log level: "ERROR", "WARN", "INFO", "DEBUG", "TRACE". Default: "`+common.DEFAULT_LOG_LEVEL+`"`) + flag.StringVar(&_config.CommonConfig.CatalogDatabaseUrl, "catalog-database-url", os.Getenv(common.ENV_CATALOG_DATABASE_URL), "Catalog database URL") + flag.StringVar(&_config.CommonConfig.Aws.Region, "aws-region", os.Getenv(common.ENV_AWS_REGION), "AWS region") + flag.StringVar(&_config.CommonConfig.Aws.S3Endpoint, "aws-s3-endpoint", os.Getenv(common.ENV_AWS_S3_ENDPOINT), "AWS S3 endpoint. Default: \""+common.DEFAULT_AWS_S3_ENDPOINT+`"`) + flag.StringVar(&_config.CommonConfig.Aws.S3Bucket, "aws-s3-bucket", os.Getenv(common.ENV_AWS_S3_BUCKET), "AWS S3 bucket name") + flag.StringVar(&_config.CommonConfig.Aws.AccessKeyId, "aws-access-key-id", os.Getenv(common.ENV_AWS_ACCESS_KEY_ID), "AWS access key ID") + flag.StringVar(&_config.CommonConfig.Aws.SecretAccessKey, "aws-secret-access-key", os.Getenv(common.ENV_AWS_SECRET_ACCESS_KEY), "AWS secret access key") + flag.BoolVar(&_config.CommonConfig.DisableAnonymousAnalytics, "disable-anonymous-analytics", os.Getenv(common.ENV_DISABLE_ANONYMOUS_ANALYTICS) == "true", "Disable anonymous analytics collection") + + flag.StringVar(&_config.DestinationSchemaName, "destination-schema-name", os.Getenv(ENV_DESTINATION_SCHEMA_NAME), "Destination schema name to store the synced data") + + flag.StringVar(&_config.Nats.Url, "nats-url", os.Getenv(ENV_NATS_URL), "NATS URL") + flag.StringVar(&_config.Nats.Stream, "nats-stream", os.Getenv(ENV_NATS_STREAM), "NATS stream to read from") + flag.StringVar(&_config.Nats.Subject, "nats-subject", os.Getenv(ENV_NATS_SUBJECT), "NATS subject to read from") + flag.StringVar(&_config.Nats.ConsumerName, "nats-consumer-name", os.Getenv(ENV_NATS_CONSUMER_NAME), "NATS consumer name for the JetStream consumer") + flag.IntVar(&_config.Nats.FetchTimeoutSeconds, "nats-fetch-timeout-seconds", DEFAULT_NATS_FETCH_TIMEOUT_SECONDS, "NATS fetch timeout in seconds") + fetchTimeoutSeconds := os.Getenv(ENV_NATS_FETCH_TIMEOUT_SECONDS) + if fetchTimeoutSeconds != "" { + _config.Nats.FetchTimeoutSeconds = common.StringToInt(fetchTimeoutSeconds) + } +} + +func LoadConfig() *Config { + parseFlags() + return &_config +} + +func parseFlags() { + flag.Parse() + + if _config.CommonConfig.LogLevel == "" { + _config.CommonConfig.LogLevel = common.DEFAULT_LOG_LEVEL + } else if !slices.Contains(common.LOG_LEVELS, _config.CommonConfig.LogLevel) { + panic("Invalid log level " + _config.CommonConfig.LogLevel + ". Must be one of " + strings.Join(common.LOG_LEVELS, ", ")) + } + if _config.CommonConfig.CatalogDatabaseUrl == "" { + panic("Catalog database URL is required") + } + if _config.CommonConfig.Aws.Region == "" { + panic("AWS region is required") + } + if _config.CommonConfig.Aws.S3Endpoint == "" { + _config.CommonConfig.Aws.S3Endpoint = common.DEFAULT_AWS_S3_ENDPOINT + } + if _config.CommonConfig.Aws.S3Bucket == "" { + panic("AWS S3 bucket name is required") + } + if _config.CommonConfig.Aws.AccessKeyId != "" && _config.CommonConfig.Aws.SecretAccessKey == "" { + panic("AWS secret access key is required") + } + if _config.CommonConfig.Aws.AccessKeyId == "" && _config.CommonConfig.Aws.SecretAccessKey != "" { + panic("AWS access key ID is required") + } + + if _config.DestinationSchemaName == "" { + panic("Destination schema name is required") + } + + if _config.Nats.Url == "" { + panic("NATS URL is required") + } + if _config.Nats.Stream == "" { + panic("NATS stream is required") + } + if _config.Nats.Subject == "" { + panic("NATS subject is required") + } + if _config.Nats.ConsumerName == "" { + panic("NATS consumer name is required") + } + if _config.Nats.FetchTimeoutSeconds <= 0 { + panic("NATS fetch timeout must be greater than 0") + } +} diff --git a/src/syncer-dialpad/lib/go.mod b/src/syncer-dialpad/lib/go.mod new file mode 100644 index 0000000..d510090 --- /dev/null +++ b/src/syncer-dialpad/lib/go.mod @@ -0,0 +1,69 @@ +module github.com/BemiHQ/BemiDB/src/syncer-dialpad/lib + +go 1.24.4 + +require ( + github.com/BemiHQ/BemiDB/src/common v0.0.0-00010101000000-000000000000 + github.com/nats-io/nats.go v1.47.0 +) + +replace github.com/BemiHQ/BemiDB/src/common => ../../common + +require ( + github.com/apache/arrow-go/v18 v18.4.0 // indirect + github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 // indirect + github.com/apache/thrift v0.22.0 // indirect + github.com/aws/aws-sdk-go-v2 v1.37.0 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 // indirect + github.com/aws/aws-sdk-go-v2/config v1.30.1 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.18.1 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0 // indirect + github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.26.0 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.35.0 // indirect + github.com/aws/smithy-go v1.22.5 // indirect + github.com/duckdb/duckdb-go-bindings v0.1.16 // indirect + github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11 // indirect + github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11 // indirect + github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11 // indirect + github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11 // indirect + github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11 // indirect + github.com/go-viper/mapstructure/v2 v2.3.0 // indirect + github.com/goccy/go-json v0.10.5 // indirect + github.com/golang/snappy v1.0.0 // indirect + github.com/google/flatbuffers v25.2.10+incompatible // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect + github.com/jackc/pgx/v5 v5.7.5 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.11 // indirect + github.com/linkedin/goavro v2.1.0+incompatible // indirect + github.com/marcboeker/go-duckdb/arrowmapping v0.0.9 // indirect + github.com/marcboeker/go-duckdb/mapping v0.0.10 // indirect + github.com/marcboeker/go-duckdb/v2 v2.3.2 // indirect + github.com/nats-io/nkeys v0.4.11 // indirect + github.com/nats-io/nuid v1.0.1 // indirect + github.com/pierrec/lz4/v4 v4.1.22 // indirect + github.com/xitongsys/parquet-go v1.6.2 // indirect + github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b // indirect + github.com/zeebo/xxh3 v1.0.2 // indirect + golang.org/x/crypto v0.37.0 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.25.0 // indirect + golang.org/x/sync v0.15.0 // indirect + golang.org/x/sys v0.33.0 // indirect + golang.org/x/text v0.26.0 // indirect + golang.org/x/tools v0.34.0 // indirect + golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect +) diff --git a/src/syncer-dialpad/lib/go.sum b/src/syncer-dialpad/lib/go.sum new file mode 100644 index 0000000..eedb340 --- /dev/null +++ b/src/syncer-dialpad/lib/go.sum @@ -0,0 +1,1166 @@ +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.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.66.0/go.mod h1:dgqGAjKCDxyhGTtC9dAREQGUJpkceNm1yt590Qno0Ko= +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.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.82.0/go.mod h1:vlKccHJGuFBFufnAnuB08dfEH9Y3H7dzDzRECFdC2TA= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= +cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +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 v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= +cloud.google.com/go/compute v1.2.0/go.mod h1:xlogom/6gr8RJGBe7nT2eGsQYAFUbbv8dbC29qE3Xmw= +cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= +cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= +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/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= +cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= +cloud.google.com/go/iam v0.1.1/go.mod h1:CKqrcnI/suGpybEHxZ7BMehL0oA4LpdyJdUlTl9jVMw= +cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= +cloud.google.com/go/kms v1.1.0/go.mod h1:WdbppnCDMDpOvoYBMn1+gNmOeEoZYqAv+HeuKARGCXI= +cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= +cloud.google.com/go/monitoring v1.1.0/go.mod h1:L81pzz7HKn14QCMaCs6NTQkdBnE87TElyanS95vIcl4= +cloud.google.com/go/monitoring v1.4.0/go.mod h1:y6xnxfwI3hTFWOdkOaD7nfJVlwuC3/mS/5kvtT131p4= +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/pubsub v1.19.0/go.mod h1:/O9kmSe9bb9KRnIAWkzmqhPjHo6LtzGOBYd/kr06XSs= +cloud.google.com/go/secretmanager v1.3.0/go.mod h1:+oLTkouyiYiabAQNugCeTS3PAArGiMJuBqvJnJsyH+U= +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.12.0/go.mod h1:fFLk2dp2oAhDz8QFKwqrjdJvxSp/W2g7nillojlL5Ho= +cloud.google.com/go/storage v1.21.0/go.mod h1:XmRlxkgPjlBONznT2dDUU/5XlpU2OjMnKuqnZI01LAA= +cloud.google.com/go/trace v1.0.0/go.mod h1:4iErSByzxkyHWzzlAj63/Gmjz0NH1ASqhJguHpGcr6A= +cloud.google.com/go/trace v1.2.0/go.mod h1:Wc8y/uYyOhPy12KEnXG9XGrvfMz5F5SrYecQlbW1rwM= +contrib.go.opencensus.io/exporter/aws v0.0.0-20200617204711-c478e41e60e9/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= +contrib.go.opencensus.io/exporter/stackdriver v0.13.10/go.mod h1:I5htMbyta491eUxufwwZPQdcKvvgzMB4O9ni41YnIM8= +contrib.go.opencensus.io/integrations/ocsql v0.1.7/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/Azure/azure-amqp-common-go/v3 v3.2.1/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= +github.com/Azure/azure-amqp-common-go/v3 v3.2.2/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= +github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k= +github.com/Azure/azure-sdk-for-go v51.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v59.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.0.0/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.0.0/go.mod h1:+6sju8gk8FRmSajX3Oz4G5Gm7P+mbqE9FVaXXFYTkCM= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U= +github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.0.0/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.0.0/go.mod h1:ceIuwmxDWptoW3eCqSXlnPsZFKh4X+R38dWPv7GS9Vs= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.0.0/go.mod h1:s1tW/At+xHqjNFvWU4G0c0Qv33KOhvbGNj0RCTQDV8s= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.2.0/go.mod h1:c+Lifp3EDEamAkPVzMooRNOK6CZjNSdEnf1A7jsI9u4= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.1.0/go.mod h1:7QJP7dr2wznCMeqIrhMgWGf7XpAQnVrJqDm9nvV3Cu4= +github.com/Azure/azure-service-bus-go v0.11.5/go.mod h1:MI6ge2CuQWBVq+ly456MY7XqNLJip5LO1iSFodbNLbU= +github.com/Azure/azure-storage-blob-go v0.14.0/go.mod h1:SMqIBi+SuiQH32bvyjngEewEeXoPfKMgWlBDaYf6fck= +github.com/Azure/go-amqp v0.16.0/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= +github.com/Azure/go-amqp v0.16.4/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= +github.com/Azure/go-autorest/autorest v0.11.19/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= +github.com/Azure/go-autorest/autorest v0.11.22/go.mod h1:BAWYUWGPEtKPzjVkp0Q6an0MJcJDsoh5Z1BFAEFs4Xs= +github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= +github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/adal v0.9.14/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/adal v0.9.17/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= +github.com/Azure/go-autorest/autorest/azure/auth v0.5.9/go.mod h1:hg3/1yw0Bq87O3KvvnJoAh34/0zbP7SFizX/qN5JvjU= +github.com/Azure/go-autorest/autorest/azure/cli v0.4.2/go.mod h1:7qkJkT+j6b+hIpzMOwPChJhTqS8VbsqqgULzMNRugoM= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= +github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= +github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= +github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= +github.com/AzureAD/microsoft-authentication-library-for-go v0.4.0/go.mod h1:Vt9sXTKwMyGcOxSmLDMnGPgqsUg7m8pe215qMLrDXw4= +github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/GoogleCloudPlatform/cloudsql-proxy v1.29.0/go.mod h1:spvB9eLJH9dutlbPSRmHvSXXHOwGRyeXh1jVdquA2G8= +github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= +github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apache/arrow-go/v18 v18.4.0 h1:/RvkGqH517iY8bZKc4FD5/kkdwXJGjxf28JIXbJ/oB0= +github.com/apache/arrow-go/v18 v18.4.0/go.mod h1:Aawvwhj8x2jURIzD9Moy72cF0FyJXOpkYpdmGRHcw14= +github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 h1:byKBBF2CKWBjjA4J1ZL2JXttJULvWSl50LegTyRZ728= +github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516/go.mod h1:QNYViu/X0HXDHw7m3KXzWSVXIbfUvJqBFe6Gj8/pYA0= +github.com/apache/thrift v0.0.0-20181112125854-24918abba929/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.14.2/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.22.0 h1:r7mTJdj51TMDe6RtcmNdQxgn9XcyfGDOzegMDRg47uc= +github.com/apache/thrift v0.22.0/go.mod h1:1e7J/O1Ae6ZQMTYdy9xa3w9k+XHWPfRvdPyJeynQ+/g= +github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= +github.com/aws/aws-sdk-go v1.30.19/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= +github.com/aws/aws-sdk-go v1.37.0/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= +github.com/aws/aws-sdk-go v1.43.31 h1:yJZIr8nMV1hXjAvvOLUFqZRJcHV7udPQBfhJqawDzI0= +github.com/aws/aws-sdk-go v1.43.31/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= +github.com/aws/aws-sdk-go-v2 v1.16.2/go.mod h1:ytwTPBG6fXTZLxxeeCCWj2/EMYp/xDUgX+OET6TLNNU= +github.com/aws/aws-sdk-go-v2 v1.23.0/go.mod h1:i1XDttT4rnf6vxc9AuskLc6s7XBee8rlLilKlc03uAA= +github.com/aws/aws-sdk-go-v2 v1.37.0 h1:YtCOESR/pN4j5oA7cVHSfOwIcuh/KwHC4DOSXFbv5F0= +github.com/aws/aws-sdk-go-v2 v1.37.0/go.mod h1:9Q0OoGQoboYIAJyslFyF1f5K1Ryddop8gqMhWx/n4Wg= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.1/go.mod h1:n8Bs1ElDD2wJ9kCRTczA83gYbBmjSwZp3umc6zF4EeM= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.1/go.mod h1:t8PYl/6LzdAqsU4/9tz28V/kU+asFePvpOMkdul0gEQ= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 h1:6GMWV6CNpA/6fbFHnoAjrv4+LGfyTqZz2LtCHnspgDg= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0/go.mod h1:/mXlTIVG9jbxkqDnr5UQNQxW1HRYxeGklkM9vAFeabg= +github.com/aws/aws-sdk-go-v2/config v1.15.3/go.mod h1:9YL3v07Xc/ohTsxFXzan9ZpFpdTOFl4X65BAKYaz8jg= +github.com/aws/aws-sdk-go-v2/config v1.25.3/go.mod h1:tAByZy03nH5jcq0vZmkcVoo6tRzRHEwSFx3QW4NmDw8= +github.com/aws/aws-sdk-go-v2/config v1.30.1 h1:sHL8g/+9tcZATeV2tEkEfxZeaNokDtKsSjGMGHD49qA= +github.com/aws/aws-sdk-go-v2/config v1.30.1/go.mod h1:wkibEyFfxXRyTSzRU4bbF5IUsSXyE4xQ4ZjkGmi5tFo= +github.com/aws/aws-sdk-go-v2/credentials v1.11.2/go.mod h1:j8YsY9TXTm31k4eFhspiQicfXPLZ0gYXA50i4gxPE8g= +github.com/aws/aws-sdk-go-v2/credentials v1.16.2/go.mod h1:sDdvGhXrSVT5yzBDR7qXz+rhbpiMpUYfF3vJ01QSdrc= +github.com/aws/aws-sdk-go-v2/credentials v1.18.1 h1:E55xvOqlX7CvB66Z7rSM9usCrFU1ryUIUHqiXsEzVoE= +github.com/aws/aws-sdk-go-v2/credentials v1.18.1/go.mod h1:iobSQfR5MkvILxssGOvi/P1jjOhrRzfTiCPCzku0vx4= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.3/go.mod h1:uk1vhHHERfSVCUnqSqz8O48LBYDSC+k6brng09jcMOk= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.4/go.mod h1:t4i+yGHMCcUNIX1x7YVYa6bH/Do7civ5I6cG/6PMfyA= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0 h1:9sBTeKQwAvmJUWKIACIoiFSnxxl+sS++YDfr17/ngq0= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0/go.mod h1:LW9/PxQD1SYFC7pnWcgqPhoyZprhjEdg5hBK6qYPLW8= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.3/go.mod h1:0dHuD2HZZSiwfJSy1FO5bX1hQ1TxVV1QXXjpn3XUE44= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.14.0/go.mod h1:UcgIwJ9KHquYxs6Q5skC9qXjhYMK+JASDYcXQ4X7JZE= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1 h1:aAjA/1JZ1xH/F9XvxJu9cXZyp7BqVXtHpztyZ6p799E= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1/go.mod h1:ia9HASsPba/7o84sp6iE4wZPdNTJ0oicBe5sWQQk+Ys= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.9/go.mod h1:AnVH5pvai0pAF4lXRq0bmhbes1u9R8wTE+g+183bZNM= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.3/go.mod h1:7sGSz1JCKHWWBHq98m6sMtWQikmYPpxjqOydDemiVoM= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0 h1:H2iZoqW/v2Jnrh1FnU725Bq6KJ0k2uP63yH+DcY+HUI= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0/go.mod h1:L0FqLbwMXHvNC/7crWV1iIxUlOKYZUE8KuTIA+TozAI= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.3/go.mod h1:ssOhaLpRlh88H3UmEcsBoVKq309quMvm3Ds8e9d4eJM= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.3/go.mod h1:ify42Rb7nKeDDPkFjKn7q1bPscVPu/+gmHH8d2c+anU= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0 h1:EDped/rNzAhFPhVY0sDGbtD16OKqksfA8OjF/kLEgw8= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0/go.mod h1:uUI335jvzpZRPpjYx6ODc/wg1qH+NnoSTK/FwVeK0C0= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.10/go.mod h1:8DcYQcz0+ZJaSxANlHIsbbi6S+zMwjwdDqwW3r9AzaE= +github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.3/go.mod h1:5yzAuE9i2RkVAttBl8yxZgQr5OCq4D5yDnG7j9x2L0U= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0 h1:iLvW/zOkHGU3BDU5thWnj+UZ9pjhuVhv1loLj7yVtBw= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0/go.mod h1:Fn3gvhdF1x5Rs9nUoCy/fJT1ms8f8dO7RqM9lJHuazQ= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.1/go.mod h1:GeUru+8VzrTXV/83XyMJ80KpH8xO89VPoUileyNQ+tc= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1/go.mod h1:l9ymW25HOqymeU2m1gbUQ3rUIsTwKs8gYHXkqDQUhiI= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 h1:6+lZi2JeGKtCraAj1rpoZfKqnQ9SptseRZioejfUOLM= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0/go.mod h1:eb3gfbVIxIoGgJsi9pGne19dhCBpK6opTYpQqAmdy44= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.3/go.mod h1:Seb8KNmD6kVTjwRjVEgOT5hPin6sq+v4C2ycJQDwuH8= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.3/go.mod h1:R+/S1O4TYpcktbVwddeOYg+uwUfLhADP2S/x4QwsCTM= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0 h1:qGyLBQPphYzUf+IIlb5tHnvg1U2Vc5hXPcP7oRSQfy0= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0/go.mod h1:g+dzKSLXiR/8ATkPXmLhPOI6rDdjLP3tngeo3FvDcIw= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.3/go.mod h1:wlY6SVjuwvh3TVRpTqdy4I1JpBFLX4UGeKZdWntaocw= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.3/go.mod h1:Owv1I59vaghv1Ax8zz8ELY8DN7/Y0rGS+WWAmjgi950= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0 h1:eRhU3Sh8dGbaniI6B+I48XJMrTPRkK4DKo+vqIxziOU= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0/go.mod h1:paNLV18DZ6FnWE/bd06RIKPDIFpjuvCkGKWTG/GDBeM= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.3/go.mod h1:Bm/v2IaN6rZ+Op7zX+bOUMdL4fsrYZiD0dsjLhNKwZc= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.3/go.mod h1:KZgs2ny8HsxRIRbDwgvJcHHBZPOzQr/+NtGwnP+w2ec= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0 h1:6jusT+XCcvnD+Elxvm7bUf5sCMTpZEp3AKjYQ4tWJSo= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0/go.mod h1:LimGpdIF/sTBdgqwOEkrArXLCoTamK/9L9x8IKBFTIc= +github.com/aws/aws-sdk-go-v2/service/kms v1.16.3/go.mod h1:QuiHPBqlOFCi4LqdSskYYAWpQlx3PKmohy+rE2F+o5g= +github.com/aws/aws-sdk-go-v2/service/s3 v1.26.3/go.mod h1:g1qvDuRsJY+XghsV6zg00Z4KJ7DtFFCx8fJD2a491Ak= +github.com/aws/aws-sdk-go-v2/service/s3 v1.43.0/go.mod h1:NXRKkiRF+erX2hnybnVU660cYT5/KChRD4iUgJ97cI8= +github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0 h1:gAV4NEp4A+JOrIdoXkAeyy6IOo7+X2s/jRuaHKYiMaU= +github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0/go.mod h1:JIQwK8sZ5MuKGm5rrFwp9MHUcyYEsQNpVixuPDlnwaU= +github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.15.4/go.mod h1:PJc8s+lxyU8rrre0/4a0pn2wgwiDvOEzoOjcJUBr67o= +github.com/aws/aws-sdk-go-v2/service/sns v1.17.4/go.mod h1:kElt+uCcXxcqFyc+bQqZPFD9DME/eC6oHBXvFzQ9Bcw= +github.com/aws/aws-sdk-go-v2/service/sqs v1.18.3/go.mod h1:skmQo0UPvsjsuYYSYMVmrPc1HWCbHUJyrCEp+ZaLzqM= +github.com/aws/aws-sdk-go-v2/service/ssm v1.24.1/go.mod h1:NR/xoKjdbRJ+qx0pMR4mI+N/H1I1ynHwXnO6FowXJc0= +github.com/aws/aws-sdk-go-v2/service/sso v1.11.3/go.mod h1:7UQ/e69kU7LDPtY40OyoHYgRmgfGM4mgsLYtcObdveU= +github.com/aws/aws-sdk-go-v2/service/sso v1.17.2/go.mod h1:/pE21vno3q1h4bbhUOEi+6Zu/aT26UK2WKkDXd+TssQ= +github.com/aws/aws-sdk-go-v2/service/sso v1.26.0 h1:cuFWHH87GP1NBGXXfMicUbE7Oty5KpPxN6w4JpmuxYc= +github.com/aws/aws-sdk-go-v2/service/sso v1.26.0/go.mod h1:aJBemdlbCKyOXEXdXBqS7E+8S9XTDcOTaoOjtng54hA= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.20.0/go.mod h1:dWqm5G767qwKPuayKfzm4rjzFmVjiBFbOJrpSPnAMDs= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0 h1:t2va+wewPOYIqC6XyJ4MGjiGKkczMAPsgq5W4FtL9ME= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0/go.mod h1:ExCTcqYqN0hYYRsDlBVU8+68grqlWdgX9/nZJwQW4aY= +github.com/aws/aws-sdk-go-v2/service/sts v1.16.3/go.mod h1:bfBj0iVmsUyUg4weDB4NxktD9rDGeKSVWnjTnwbx9b8= +github.com/aws/aws-sdk-go-v2/service/sts v1.25.3/go.mod h1:4EqRHDCKP78hq3zOnmFXu5k0j4bXbRFfCh/zQ6KnEfQ= +github.com/aws/aws-sdk-go-v2/service/sts v1.35.0 h1:FD9agdG4CeOGS3ORLByJk56YIXDS7mxFpmZyCtpqExc= +github.com/aws/aws-sdk-go-v2/service/sts v1.35.0/go.mod h1:NDzDPbBF1xtSTZUMuZx0w3hIfWzcL7X2AQ0Tr9becIQ= +github.com/aws/smithy-go v1.11.2/go.mod h1:3xHYmszWVx2c0kIwQeEVf9uSm4fYZt67FBJnwub1bgM= +github.com/aws/smithy-go v1.17.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= +github.com/aws/smithy-go v1.22.5 h1:P9ATCXPMb2mPjYBgueqJNCA5S9UfktsW0tTxi+a7eqw= +github.com/aws/smithy-go v1.22.5/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/bobg/gcsobj v0.1.2/go.mod h1:vS49EQ1A1Ib8FgrL58C8xXYZyOCR2TgzAdopy6/ipa8= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +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/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/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= +github.com/colinmarc/hdfs/v2 v2.1.1/go.mod h1:M3x+k8UKKmxtFu++uAZ0OtDU8jR3jnaZIAc6yK4Ue0c= +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/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU= +github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= +github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= +github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= +github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= +github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= +github.com/duckdb/duckdb-go-bindings v0.1.16 h1:XPCk9hzP06PoWIxDPVU3gAy0m1XmLaZHTzLggNx/U9k= +github.com/duckdb/duckdb-go-bindings v0.1.16/go.mod h1:pBnfviMzANT/9hi4bg+zW4ykRZZPCXlVuvBWEcZofkc= +github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11 h1:GXQkG4HmEbwPtqCSabJTp9wZQQ7Gqr3KveLNesQWQOs= +github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11/go.mod h1:Ezo7IbAfB8NP7CqPIN8XEHKUg5xdRRQhcPPlCXImXYA= +github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11 h1:ATJMSBIDA/YAm/6CKeBDRtGK1OOwqfTZbWg9Y5fAc9E= +github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11/go.mod h1:eS7m/mLnPQgVF4za1+xTyorKRBuK0/BA44Oy6DgrGXI= +github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11 h1:AjvnGst1avyOECYiykthyHR4DTYTaqNDPr5W/0t5j0k= +github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11/go.mod h1:1GOuk1PixiESxLaCGFhag+oFi7aP+9W8byymRAvunBk= +github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11 h1:j3B1biawuhtxe2Chkiqcwf1Kxe8VJc8lLVmjBIcJrkI= +github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11/go.mod h1:o7crKMpT2eOIi5/FY6HPqaXcvieeLSqdXXaXbruGX7w= +github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11 h1:xR3vRE8y+48U6xDNkUlOfbl7/OTA7FVcDXJ+5vETuHU= +github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11/go.mod h1:IlOhJdVKUJCAPj3QsDszUo8DVdvp1nBFp4TUJVdw99s= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +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/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= +github.com/gin-gonic/gin v1.7.3/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= +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-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +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-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= +github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-viper/mapstructure/v2 v2.3.0 h1:27XbWsHIqhbdR5TIC911OfYvgSaW93HM+dX7970Q7jk= +github.com/go-viper/mapstructure/v2 v2.3.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= +github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= +github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-jwt/jwt/v4 v4.4.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188/go.mod h1:vXjM/+wXQnTPR4KqTKDgJukSZ6amVRtWMPEjE6sQoK8= +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/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/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +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.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= +github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +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/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/flatbuffers v25.2.10+incompatible h1:F3vclr7C3HpB1k9mxCGRMXq6FdUalZ6H/pNX4FP1v0Q= +github.com/google/flatbuffers v25.2.10+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +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.6/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.8/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/go-replayers/grpcreplay v1.1.0/go.mod h1:qzAvJ8/wi57zq7gWqaE6AwLM6miiXUQwP1S+I9icmhk= +github.com/google/go-replayers/httpreplay v1.1.1/go.mod h1:gN9GeLIs7l6NUoVaSSnv2RiqK1NiwAmD0MrKeC9IIks= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+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/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +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-20200905233945-acf8798be1f7/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-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210506205249-923b5ab0fc1a/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.2.0/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.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/wire v0.5.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU= +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.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/hanwen/go-fuse v1.0.0/go.mod h1:unqXarDXqzAk0rt98O2tVndEPIpUgLD9+rwFisZH3Ok= +github.com/hanwen/go-fuse/v2 v2.1.0/go.mod h1:oRyA5eK+pvJyv5otpO/DgccS8y/RvYMaO00GgRLGryc= +github.com/hashicorp/go-uuid v0.0.0-20180228145832-27454136f036/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +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/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/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.11.0/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= +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/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.2.0/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-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/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.10.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.15.0/go.mod h1:D/zyOyXiaM1TmVWnOM18p0xdDtdakRBa0RsVGI3U3bw= +github.com/jackc/pgx/v5 v5.7.5 h1:JHGfMnQY+IEtGM63d+NGMjoRpysB2JBwDr5fsngwmJs= +github.com/jackc/pgx/v5 v5.7.5/go.mod h1:aruU7o91Tc2q2cFp5h4uP3f6ztExVpyVv88Xl/8Vl8M= +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.2.1 h1:gI8os0wpRXFd4FiAY2dWiqRK037tjj3t7rKFeO4X5iw= +github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= +github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/jcmturner/gofork v0.0.0-20180107083740-2aebee971930/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= +github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +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/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= +github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= +github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.13.1/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/klauspost/cpuid/v2 v2.2.11 h1:0OwqZRYI2rFrjS4kvkDnqJkKHdHaRnCm68/DY4OxRzU= +github.com/klauspost/cpuid/v2 v2.2.11/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= +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/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +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/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +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.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/linkedin/goavro v2.1.0+incompatible h1:DV2aUlj2xZiuxQyvag8Dy7zjY69ENjS66bWkSfdpddY= +github.com/linkedin/goavro v2.1.0+incompatible/go.mod h1:bBCwI2eGYpUI/4820s67MElg9tdeLbINjLjiM2xZFYM= +github.com/marcboeker/go-duckdb/arrowmapping v0.0.9 h1:xj+kFOqR2gH3Mcxx9LmAVHebSnCiPm303N+uxfkWVmY= +github.com/marcboeker/go-duckdb/arrowmapping v0.0.9/go.mod h1:o56AqVS90v5bpxhPnOK9La7AfNTOrMORiqTQrlRbdPQ= +github.com/marcboeker/go-duckdb/mapping v0.0.10 h1:b/y2W8/hNlD0Dwjq0mCqIlLXpjQMnWy0WqDV9b9lHQQ= +github.com/marcboeker/go-duckdb/mapping v0.0.10/go.mod h1:Ro6Tw6sGG50O8S0daZsA8TrQJz/DvGrzGvMD7Jihirw= +github.com/marcboeker/go-duckdb/v2 v2.3.2 h1:96zG2JPyIhCFjHdBjjSpOdhzJzehoGTdl7LskkuMUTs= +github.com/marcboeker/go-duckdb/v2 v2.3.2/go.mod h1:VeXz9ZM6klNvICHrXEUzaHSgNqBeTdyMxr4CICw/UaY= +github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= +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.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= +github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= +github.com/minio/minio-go/v7 v7.0.34/go.mod h1:nCrRzjoSUQh8hgKKtu3Y708OLvRLtuASMg2/nvmbarw= +github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= +github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/nats-io/nats.go v1.47.0 h1:YQdADw6J/UfGUd2Oy6tn4Hq6YHxCaJrVKayxxFqYrgM= +github.com/nats-io/nats.go v1.47.0/go.mod h1:iRWIPokVIFbVijxuMQq4y9ttaBTMe0SFdlZfMDd+33g= +github.com/nats-io/nkeys v0.4.11 h1:q44qGV008kYd9W1b1nEBkNzvnWxtRSQ7A8BoqRrcfa0= +github.com/nats-io/nkeys v0.4.11/go.mod h1:szDimtgmfOi9n25JpfIdGw12tZFYXqhGxjhVxsatHVE= +github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/ncw/swift v1.0.52/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= +github.com/pborman/getopt v0.0.0-20180729010549-6fdd0a2c7117/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= +github.com/pierrec/lz4/v4 v4.1.8/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= +github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= +github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +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/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +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/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.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +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/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +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.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +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.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/xitongsys/parquet-go v1.5.1/go.mod h1:xUxwM8ELydxh4edHGegYq1pA8NnMKDx0K/GyB0o2bww= +github.com/xitongsys/parquet-go v1.6.2 h1:MhCaXii4eqceKPu9BwrjLqyK10oX9WF+xGhwvwbw7xM= +github.com/xitongsys/parquet-go v1.6.2/go.mod h1:IulAQyalCm0rPiZVNnCgm/PCL64X2tdSVGMQ/UeKqWA= +github.com/xitongsys/parquet-go-source v0.0.0-20190524061010-2b72cbee77d5/go.mod h1:xxCx7Wpym/3QCo6JhujJX51dzSXrwmb0oH6FQb39SEA= +github.com/xitongsys/parquet-go-source v0.0.0-20200817004010-026bad9b25d0/go.mod h1:HYhIKsdns7xz80OgkbgJYrtQY7FjHWHKH6cvN7+czGE= +github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b h1:zbb5qM/t3N+O33Vp5sFyG6yIcWZV1q7rfEjJM8UsRBQ= +github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b/go.mod h1:2ActxmJ4q17Cdruar9nKEkzKSOL1Ol03737Bkz10rTY= +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.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= +github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= +github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= +github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= +go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0= +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.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +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/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +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.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= +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.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= +gocloud.dev v0.26.0/go.mod h1:mkUgejbnbLotorqDyvedJO20XcZNTynmSeVSQS9btVg= +golang.org/x/crypto v0.0.0-20180723164146-c126467f60eb/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +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-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/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-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-20211115234514-b4de73f9ece8/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220511200225-c6db032c6c88/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= +golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= +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-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +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/lint v0.0.0-20210508222113-6edffad5e616/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.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w= +golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= +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-20191112182307-2180aed22343/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-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +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-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211020060615-d418f374d309/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220401154927-543a649e0bdd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +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.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +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.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +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-20210220032951-036812b2e83c/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.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= +golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +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-20191112214154-59a1497f0cea/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-20200828194041-157a740278f4/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-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/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-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/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-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220204135822-1c1b9b1eba6a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220330033206-e17cdc41300f/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-20220704084225-05e143d24a9e/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.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= +golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +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/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +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.5/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.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= +golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= +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/time v0.0.0-20211116232009-f0f3c7e86c11/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220224211638-0e9765cccd65/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-20190422233926-fe54fb35175b/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-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-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-20200828161849-5deb26317202/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20200915173823-2db8f0ff891c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20200918232735-d647fc253266/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +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.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo= +golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg= +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= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +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.31.0/go.mod h1:CL+9IBCa2WWU6gRuBWaKqGWLFFwbEUXkfeMkHLQWYWo= +google.golang.org/api v0.32.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +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.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.46.0/go.mod h1:ceL4oozhkAiTID8XMmJBsIxID/9wMXJVVFXPg4ylg3I= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.58.0/go.mod h1:cAbP2FsxoGVNwtgNAmmn3y5G1TWAiVYRmg4yku3lv+E= +google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.64.0/go.mod h1:931CdxA8Rm4t6zqTFGSsgwbAEZ2+GMYurbndwSimebM= +google.golang.org/api v0.66.0/go.mod h1:I1dmXYpX7HGwz/ejRxwQp2qj5bFAz93HiCU1C1oYd9M= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.68.0/go.mod h1:sOM8pTpwgflXRhz+oC8H2Dr+UcbMqkPPWNJo88Q7TH8= +google.golang.org/api v0.69.0/go.mod h1:boanBiw+h5c3s+tBPgEzLDRHfFLWV0qXxRHz3ws7C80= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= +google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +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/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-20200513103714-09dca8ec2884/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-20200831141814-d751682dd103/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-20200914193844-75d14daec038/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200921151605-7abf4a1a14d5/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-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210429181445-86c259c2b4ab/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210517163617-5e0236093d7a/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210921142501-181ce0d877f6/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211018162055-cf77aa76bad2/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211223182754-3ac035c7e7cb/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220111164026-67b88f271998/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220114231437-d2e6a121cae0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220201184016-50beb8ab5c44/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220204002441-d6cc3cc0770e/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220211171837-173942840c17/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220216160803-4663080d8bc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220401170504-314d38edb7de/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +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.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +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.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +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.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +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-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= +gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= +gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q= +gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mNfM5bm88whjWx4= +gopkg.in/jcmturner/gokrb5.v7 v7.3.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= +gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8= +gopkg.in/linkedin/goavro.v1 v1.0.5 h1:BJa69CDh0awSsLUmZ9+BowBdokpduDZSM9Zk8oKHfN4= +gopkg.in/linkedin/goavro.v1 v1.0.5/go.mod h1:Aw5GdAbizjOEl0kAMHV9iHmA8reZzW/OKuJAl4Hb9F0= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/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/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= +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= +nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= +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/src/syncer-dialpad/lib/nats.go b/src/syncer-dialpad/lib/nats.go new file mode 100644 index 0000000..993a4d4 --- /dev/null +++ b/src/syncer-dialpad/lib/nats.go @@ -0,0 +1,37 @@ +package dialpad + +import ( + "context" + + nts "github.com/nats-io/nats.go" + js "github.com/nats-io/nats.go/jetstream" + + "github.com/BemiHQ/BemiDB/src/common" +) + +const () + +type Nats struct { + Config *Config +} + +func NewNats(config *Config) *Nats { + return &Nats{ + Config: config, + } +} + +func (nats *Nats) Stream(ctx context.Context) js.Stream { + jetstream := nats.newJetstream() + stream, err := jetstream.Stream(ctx, nats.Config.Nats.Stream) + common.PanicIfError(nats.Config.CommonConfig, err) + return stream +} + +func (nats *Nats) newJetstream() js.JetStream { + nc, err := nts.Connect(nats.Config.Nats.Url) + common.PanicIfError(nats.Config.CommonConfig, err) + jetstream, err := js.New(nc) + common.PanicIfError(nats.Config.CommonConfig, err) + return jetstream +} diff --git a/src/syncer-dialpad/lib/record_sms_message.go b/src/syncer-dialpad/lib/record_sms_message.go new file mode 100644 index 0000000..361abc1 --- /dev/null +++ b/src/syncer-dialpad/lib/record_sms_message.go @@ -0,0 +1,124 @@ +package dialpad + +import ( + "encoding/json" + + "github.com/BemiHQ/BemiDB/src/common" +) + +type RecordUser struct { + Id int64 `json:"id"` + Type string `json:"type"` + Email string `json:"email"` + Phone string `json:"phone"` + PhoneNumber string `json:"phone_number"` + Name string `json:"name"` + OfficeId int64 `json:"office_id"` +} + +func (record *RecordUser) ToMap() map[string]interface{} { + result := make(map[string]interface{}) + + result["id"] = record.Id + result["type"] = record.Type + result["name"] = record.Name + result["phone"] = record.Phone + result["phone_display"] = record.PhoneNumber + result["email"] = record.Email + result["office_id"] = record.OfficeId + + return result +} + +type RecordContact struct { + Id int64 `json:"id"` + Type string `json:"type"` + Email string `json:"email"` + Phone string `json:"phone"` + PhoneNumber string `json:"phone_number"` + Name string `json:"name"` +} + +func (record *RecordContact) ToMap() map[string]interface{} { + result := make(map[string]interface{}) + + result["id"] = record.Id + result["type"] = record.Type + result["name"] = record.Name + result["phone"] = record.Phone + result["phone_display"] = record.PhoneNumber + result["email"] = record.Email + + return result +} + +// --------------------------------------------------------------------------------------------------------------------- + +type RecordSmsMessage struct { + Id int64 `json:"id"` + CreatedDate int64 `json:"created_date"` + Direction string `json:"direction"` + EventTimestamp int64 `json:"event_timestamp"` + FromNumber string `json:"from_number"` + ToNumber []string `json:"to_number"` + Text string `json:"text"` + Mms bool `json:"mms"` + MmsUrl *string `json:"mms_url"` + IsInternal bool `json:"is_internal"` + MessageStatus string `json:"message_status"` + Contact RecordContact `json:"contact"` + Target RecordUser `json:"target"` + Admins []RecordUser `json:"admins"` +} + +func (record *RecordSmsMessage) ToMap() map[string]interface{} { + result := make(map[string]interface{}) + + result["id"] = record.Id + result["created_at"] = record.CreatedDate + result["emitted_at"] = record.EventTimestamp + result["direction"] = record.Direction + result["from"] = record.FromNumber + result["to"] = record.ToNumber + result["text"] = record.Text + result["message_status"] = record.MessageStatus + result["is_internal"] = record.IsInternal + result["mms"] = record.Mms + result["mms_url"] = record.MmsUrl + result["contact"] = ToJson(record.Contact.ToMap()) + result["target"] = ToJson(record.Target.ToMap()) + admins := []map[string]interface{}{} + for _, admin := range record.Admins { + admins = append(admins, admin.ToMap()) + } + result["admins"] = ToJson(admins) + + return result +} + +func SmsMessagesIcebergSchemaColumns(config *common.CommonConfig) []*common.IcebergSchemaColumn { + return []*common.IcebergSchemaColumn{ + {Config: config, ColumnName: "id", ColumnType: common.IcebergColumnTypeLong, Position: 1}, + {Config: config, ColumnName: "created_at", ColumnType: common.IcebergColumnTypeTimestamp, Position: 2, DatetimePrecision: 3}, + {Config: config, ColumnName: "emitted_at", ColumnType: common.IcebergColumnTypeTimestamp, Position: 3, DatetimePrecision: 3}, + {Config: config, ColumnName: "direction", ColumnType: common.IcebergColumnTypeString, Position: 4}, + {Config: config, ColumnName: "from", ColumnType: common.IcebergColumnTypeString, Position: 5}, + {Config: config, ColumnName: "to", ColumnType: common.IcebergColumnTypeString, Position: 6, IsList: true}, + {Config: config, ColumnName: "text", ColumnType: common.IcebergColumnTypeString, Position: 7}, + {Config: config, ColumnName: "message_status", ColumnType: common.IcebergColumnTypeString, Position: 8}, + {Config: config, ColumnName: "is_internal", ColumnType: common.IcebergColumnTypeBoolean, Position: 9}, + {Config: config, ColumnName: "mms", ColumnType: common.IcebergColumnTypeBoolean, Position: 10}, + {Config: config, ColumnName: "mms_url", ColumnType: common.IcebergColumnTypeString, Position: 11}, + {Config: config, ColumnName: "contact", ColumnType: common.IcebergColumnTypeString, Position: 12, LogicalColumnType: common.IcebergLogicalColumnTypeJson}, + {Config: config, ColumnName: "target", ColumnType: common.IcebergColumnTypeString, Position: 13, LogicalColumnType: common.IcebergLogicalColumnTypeJson}, + {Config: config, ColumnName: "admins", ColumnType: common.IcebergColumnTypeString, Position: 14, LogicalColumnType: common.IcebergLogicalColumnTypeJson}, + } +} + +func ToJson(data interface{}) string { + jsonData, err := json.Marshal(data) + if err != nil { + panic(err) + } + return string(jsonData) +} diff --git a/src/syncer-dialpad/lib/syncer.go b/src/syncer-dialpad/lib/syncer.go new file mode 100644 index 0000000..a775a77 --- /dev/null +++ b/src/syncer-dialpad/lib/syncer.go @@ -0,0 +1,113 @@ +package dialpad + +import ( + "context" + "encoding/json" + "time" + + js "github.com/nats-io/nats.go/jetstream" + + "github.com/BemiHQ/BemiDB/src/common" +) + +const ( + TABLE_SMS_MESSAGES = "sms_messages" + + NATS_TIMEOUT = 30 * time.Second + NATS_FETCH_BATCH_SIZE = 100 +) + +type Syncer struct { + Config *Config + StorageS3 *common.StorageS3 + DuckdbClient *common.DuckdbClient +} + +func NewSyncer(config *Config, storageS3 *common.StorageS3, duckdbClient *common.DuckdbClient) *Syncer { + return &Syncer{ + Config: config, + StorageS3: storageS3, + DuckdbClient: duckdbClient, + } +} + +func (syncer *Syncer) Sync() { + common.SendAnonymousAnalytics(syncer.Config.CommonConfig, "syncer-dialpad-start", syncer.name()) + + natsCtx, cancel := context.WithTimeout(context.Background(), NATS_TIMEOUT) + defer cancel() + natsConsumer := syncer.natsConsumer(natsCtx) + natsFetchTimeout := time.Duration(syncer.Config.Nats.FetchTimeoutSeconds) * time.Second + + icebergTable := common.NewIcebergTable(syncer.Config.CommonConfig, syncer.StorageS3, syncer.DuckdbClient, common.IcebergSchemaTable{ + Schema: syncer.Config.DestinationSchemaName, + Table: TABLE_SMS_MESSAGES, + }) + icebergSchemaColumns := SmsMessagesIcebergSchemaColumns(syncer.Config.CommonConfig) + + for { + // Fetch messages from NATS + common.LogInfo(syncer.Config.CommonConfig, "Fetching messages from NATS with", natsFetchTimeout, "timeout...") + messagesBatch, err := natsConsumer.Fetch(NATS_FETCH_BATCH_SIZE, js.FetchMaxWait(natsFetchTimeout)) + common.PanicIfError(syncer.Config.CommonConfig, err) + var messages []js.Msg + var messagesBytes [][]byte + for message := range messagesBatch.Messages() { + messages = append(messages, message) + messagesBytes = append(messagesBytes, message.Data()) + } + common.LogInfo(syncer.Config.CommonConfig, "Fetched", len(messagesBytes), "messages from NATS") + + // Write messages to Iceberg + syncer.WriteToIceberg(messagesBytes, icebergTable, icebergSchemaColumns) + + // Acknowledge messages + for _, message := range messages { + err := message.Ack() + common.PanicIfError(syncer.Config.CommonConfig, err) + } + } +} + +func (syncer *Syncer) WriteToIceberg(messagesBytes [][]byte, icebergTable *common.IcebergTable, icebergSchemaColumns []*common.IcebergSchemaColumn) { + cappedBuffer := common.NewCappedBuffer(syncer.Config.CommonConfig, common.DEFAULT_CAPPED_BUFFER_SIZE) + jsonQueueWriter := common.NewJsonQueueWriter(cappedBuffer) + for _, messageBytes := range messagesBytes { + common.LogDebug(syncer.Config.CommonConfig, string(messageBytes)) + + var smsMessage RecordSmsMessage + err := json.Unmarshal(messageBytes, &smsMessage) + common.PanicIfError(syncer.Config.CommonConfig, err) + + err = jsonQueueWriter.Write(smsMessage.ToMap()) + common.PanicIfError(syncer.Config.CommonConfig, err) + } + jsonQueueWriter.Close() + + icebergTableWriter := common.NewIcebergTableWriter(syncer.Config.CommonConfig, syncer.StorageS3, syncer.DuckdbClient, icebergTable, icebergSchemaColumns, 1) + icebergTableWriter.AppendFromJsonCappedBuffer(common.CursorValue{}, cappedBuffer) +} + +func (syncer *Syncer) natsConsumer(natsCtx context.Context) js.Consumer { + nats := NewNats(syncer.Config) + + natsStream := nats.Stream(natsCtx) + common.LogInfo(syncer.Config.CommonConfig, "Creating a consumer for subject:", syncer.Config.Nats.Subject) + + natsConsumer, err := natsStream.CreateOrUpdateConsumer(natsCtx, js.ConsumerConfig{ + Durable: syncer.Config.Nats.ConsumerName, + FilterSubject: syncer.Config.Nats.Subject, + MaxAckPending: -1, // Instead of default 1000 + AckPolicy: js.AckExplicitPolicy, // Default + DeliverPolicy: js.DeliverAllPolicy, // Default + AckWait: 30 * time.Second, // Default (30 seconds) + MaxDeliver: -1, // Default (re-deliver forever until acked) + }) + common.PanicIfError(syncer.Config.CommonConfig, err) + + return natsConsumer +} + +func (syncer *Syncer) name() string { + return "dialpad" +} diff --git a/src/syncer-dialpad/main.go b/src/syncer-dialpad/main.go new file mode 100644 index 0000000..f249333 --- /dev/null +++ b/src/syncer-dialpad/main.go @@ -0,0 +1,20 @@ +package main + +import ( + "github.com/BemiHQ/BemiDB/src/common" + "github.com/BemiHQ/BemiDB/src/syncer-dialpad/lib" +) + +func init() { + dialpad.RegisterFlags() +} + +func main() { + config := dialpad.LoadConfig() + defer common.HandleUnexpectedPanic(config.CommonConfig) + + storageS3 := common.NewStorageS3(config.CommonConfig) + duckdbClient := common.NewDuckdbClient(config.CommonConfig, common.SYNCER_DUCKDB_BOOT_QUERIES) + syncer := dialpad.NewSyncer(config, storageS3, duckdbClient) + syncer.Sync() +} From d6e4a15543fa37c2744020a046dc45723df30059 Mon Sep 17 00:00:00 2001 From: exAspArk Date: Sat, 3 Oct 2026 08:08:03 -0400 Subject: [PATCH 24/24] Release pgstack v2.0.0 --- .dockerignore | 16 + .env.sample | 16 - .github/workflows/build.yml | 21 - .github/workflows/image.yml | 115 + .gitignore | 17 +- CHANGELOG.md | 3 - CONTRIBUTING.md | 15 + Dockerfile | 108 +- Dockerfile.test | 77 - Makefile | 125 +- README.md | 506 ++--- SECURITY.md | 7 + assets/pgstack-logo.png | Bin 0 -> 218632 bytes benchmark/README.md | 55 - benchmark/data/create-indexes.ddl | 15 - benchmark/data/create-tables.ddl | 70 - benchmark/queries.sql | 694 ------ benchmark/query-templates/1.sql | 28 - benchmark/query-templates/10.sql | 38 - benchmark/query-templates/11.sql | 34 - benchmark/query-templates/12.sql | 35 - benchmark/query-templates/13.sql | 27 - benchmark/query-templates/14.sql | 20 - benchmark/query-templates/15.sql | 41 - benchmark/query-templates/16.sql | 37 - benchmark/query-templates/17.sql | 26 - benchmark/query-templates/18.sql | 39 - benchmark/query-templates/19.sql | 42 - benchmark/query-templates/2.sql | 50 - benchmark/query-templates/20.sql | 46 - benchmark/query-templates/21.sql | 46 - benchmark/query-templates/22.sql | 44 - benchmark/query-templates/3.sql | 29 - benchmark/query-templates/4.sql | 28 - benchmark/query-templates/5.sql | 31 - benchmark/query-templates/6.sql | 16 - benchmark/query-templates/7.sql | 46 - benchmark/query-templates/8.sql | 44 - benchmark/query-templates/9.sql | 39 - benchmark/scripts/generate-data.sh | 23 - benchmark/scripts/load-pg-data.sh | 21 - benchmark/scripts/measure-memory.sh | 26 - cdc/config.go | 218 ++ cdc/config_test.go | 91 + cdc/go.mod | 21 + cdc/go.sum | 42 + {src/common => cdc}/logger_utils.go | 25 +- cdc/main.go | 56 + cdc/nats.go | 200 ++ cdc/operation.go | 9 + cdc/replication.go | 876 +++++++ cdc/replication_test.go | 107 + cdc/search_snapshot.go | 140 ++ cdc/setup.go | 105 + cdc/transaction.go | 70 + cdc/typemap.go | 141 ++ cdc/typemap_test.go | 69 + devbox.json | 15 +- devbox.lock | 182 -- docker/bin-test/minio_configure.sh | 14 - docker/bin-test/minio_start.sh | 8 - docker/bin-test/postgres_configure.sh | 13 - docker/bin-test/postgres_start.sh | 11 - docker/bin-test/test.sh | 39 - docker/bin/run.sh | 68 - img/BemiDB.gif | Bin 4235165 -> 0 bytes img/architecture.png | Bin 98298 -> 0 bytes img/tpc-h_database_structure.png | Bin 351330 -> 0 bytes local-entrypoint.sh | 256 +++ local_config.py | 89 + pgstack.example.yaml | 9 + processor/config.go | 132 ++ processor/config_test.go | 22 + processor/deduplication.go | 218 ++ processor/deduplication_test.go | 91 + processor/duckdb.go | 130 ++ processor/duckdb_test.go | 46 + processor/embedding_client.go | 148 ++ processor/embedding_client_test.go | 50 + processor/go.mod | 45 + processor/go.sum | 414 ++++ processor/hot_parquet_compactor.go | 87 + processor/hot_parquet_compactor_test.go | 64 + processor/iceberg_metadata.go | 417 ++++ processor/iceberg_writer.go | 937 ++++++++ processor/iceberg_writer_test.go | 192 ++ processor/logger_utils.go | 54 + processor/main.go | 317 +++ processor/nats_consumer.go | 180 ++ processor/operation.go | 9 + processor/runtime_integration.go | 13 + processor/s3_client.go | 148 ++ processor/search_writer.go | 964 ++++++++ processor/search_writer_test.go | 320 +++ processor/stitcher.go | 243 ++ processor/stitcher_test.go | 242 ++ processor/storage_utils.go | 233 ++ scripts/build-docker.sh | 13 - scripts/catalog.sql | 16 - scripts/publish-docker.sh | 27 - scripts/test-data-types.sql | 190 -- scripts/test-partitioned-tables.sql | 19 - scripts/test-schemas.sql | 30 - server/authentication.go | 97 + server/authentication_test.go | 107 + server/client_error.go | 41 + server/client_error_test.go | 74 + server/config.go | 156 ++ server/duckdb_boot_test.go | 52 + server/duckdb_client.go | 210 ++ server/duckdb_client_test.go | 100 + server/embedding_client.go | 125 + server/embedding_client_test.go | 127 ++ server/error_utils.go | 43 + server/go.mod | 63 + server/go.sum | 166 ++ server/iceberg_reader.go | 196 ++ server/iceberg_schema_column.go | 27 + server/iceberg_schema_table.go | 14 + server/logger_utils.go | 51 + server/main.go | 89 + server/main_test.go | 197 ++ {src/server => server}/parser_a_expr.go | 41 +- {src/server => server}/parser_column_ref.go | 0 {src/server => server}/parser_function.go | 6 +- {src/server => server}/parser_select.go | 0 {src/server => server}/parser_show.go | 0 {src/server => server}/parser_table.go | 49 +- {src/server => server}/parser_type_cast.go | 40 +- {src/server => server}/parser_utils.go | 4 +- {src/server => server}/pg_constants.go | 10 +- {src/server => server}/postgres_server.go | 119 +- server/postgres_server_test.go | 37 + server/query_handler.go | 573 +++++ server/query_handler_test.go | 1025 +++++++++ server/query_log.go | 42 + server/query_log_test.go | 61 + {src/server => server}/query_remapper.go | 338 +-- .../query_remapper_expression.go | 6 + .../query_remapper_function.go | 44 +- server/query_remapper_search.go | 509 +++++ server/query_remapper_search_test.go | 262 +++ .../query_remapper_select.go | 0 {src/server => server}/query_remapper_show.go | 0 .../server => server}/query_remapper_table.go | 239 +- .../query_schema_table.go | 8 +- {src/server => server}/response_handler.go | 64 +- server/runtime_integration.go | 15 + server/runtime_integration_test.go | 26 + server/runtime_manager.go | 162 ++ server/s3_client.go | 87 + server/search_catalog.go | 33 + server/search_query_test.go | 496 ++++ {src/common => server}/set.go | 17 +- {src/server => server}/utils.go | 34 +- src/common/capped_buffer.go | 105 - src/common/capped_buffer_test.go | 320 --- src/common/common_config.go | 34 - src/common/duckdb_client.go | 154 -- src/common/duckdb_schema_column.go | 62 - src/common/error_utils.go | 82 - src/common/go.mod | 64 - src/common/go.sum | 1160 ---------- src/common/iceberg_catalog.go | 362 --- src/common/iceberg_schema_column.go | 503 ---- src/common/iceberg_table.go | 117 - src/common/iceberg_table_writer.go | 707 ------ src/common/json_queue.go | 80 - src/common/json_queue_test.go | 36 - src/common/postgres_client.go | 89 - src/common/s3_client.go | 128 -- src/common/storage_s3.go | 247 -- src/common/storage_utils.go | 898 -------- src/common/utils.go | 136 -- src/server/config.go | 111 - src/server/go.mod | 68 - src/server/go.sum | 1165 ---------- src/server/iceberg_reader.go | 37 - src/server/iceberg_writer.go | 86 - src/server/main.go | 88 - src/server/query_handler.go | 369 --- src/server/query_handler_test.go | 2016 ----------------- src/syncer-amplitude/go.mod | 69 - src/syncer-amplitude/go.sum | 1160 ---------- src/syncer-amplitude/lib/amplitude.go | 103 - src/syncer-amplitude/lib/config.go | 106 - src/syncer-amplitude/lib/go.mod | 64 - src/syncer-amplitude/lib/go.sum | 1160 ---------- src/syncer-amplitude/lib/record_event.go | 189 -- src/syncer-amplitude/lib/syncer.go | 85 - src/syncer-amplitude/main.go | 20 - src/syncer-attio/go.mod | 69 - src/syncer-attio/go.sum | 1160 ---------- src/syncer-attio/lib/attio.go | 126 -- src/syncer-attio/lib/config.go | 79 - src/syncer-attio/lib/go.mod | 64 - src/syncer-attio/lib/go.sum | 1160 ---------- src/syncer-attio/lib/parser.go | 193 -- src/syncer-attio/lib/record_company.go | 121 - src/syncer-attio/lib/record_deal.go | 49 - src/syncer-attio/lib/record_person.go | 112 - src/syncer-attio/lib/syncer.go | 70 - src/syncer-attio/main.go | 20 - src/syncer-dialpad/go.mod | 72 - src/syncer-dialpad/go.sum | 1166 ---------- src/syncer-dialpad/lib/config.go | 116 - src/syncer-dialpad/lib/go.mod | 69 - src/syncer-dialpad/lib/go.sum | 1166 ---------- src/syncer-dialpad/lib/nats.go | 37 - src/syncer-dialpad/lib/record_sms_message.go | 124 - src/syncer-dialpad/lib/syncer.go | 113 - src/syncer-dialpad/main.go | 20 - src/syncer-postgres/go.mod | 72 - src/syncer-postgres/go.sum | 1166 ---------- src/syncer-postgres/lib/config.go | 194 -- src/syncer-postgres/lib/debezium.go | 29 - src/syncer-postgres/lib/go.mod | 69 - src/syncer-postgres/lib/go.sum | 1166 ---------- src/syncer-postgres/lib/init_test.go | 471 ---- src/syncer-postgres/lib/nats.go | 37 - src/syncer-postgres/lib/pg_schema_column.go | 102 - src/syncer-postgres/lib/pg_schema_table.go | 35 - src/syncer-postgres/lib/postgres.go | 223 -- src/syncer-postgres/lib/syncer.go | 73 - .../lib/syncer_full_refresh.go | 72 - src/syncer-postgres/lib/syncer_utils.go | 47 - src/syncer-postgres/main.go | 18 - test_local_config.py | 137 ++ tests/smoke.sh | 102 + 229 files changed, 14560 insertions(+), 25622 deletions(-) create mode 100644 .dockerignore delete mode 100644 .env.sample delete mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/image.yml delete mode 100644 CHANGELOG.md create mode 100644 CONTRIBUTING.md delete mode 100644 Dockerfile.test create mode 100644 SECURITY.md create mode 100644 assets/pgstack-logo.png delete mode 100644 benchmark/README.md delete mode 100644 benchmark/data/create-indexes.ddl delete mode 100644 benchmark/data/create-tables.ddl delete mode 100644 benchmark/queries.sql delete mode 100644 benchmark/query-templates/1.sql delete mode 100644 benchmark/query-templates/10.sql delete mode 100644 benchmark/query-templates/11.sql delete mode 100644 benchmark/query-templates/12.sql delete mode 100644 benchmark/query-templates/13.sql delete mode 100644 benchmark/query-templates/14.sql delete mode 100644 benchmark/query-templates/15.sql delete mode 100644 benchmark/query-templates/16.sql delete mode 100644 benchmark/query-templates/17.sql delete mode 100644 benchmark/query-templates/18.sql delete mode 100644 benchmark/query-templates/19.sql delete mode 100644 benchmark/query-templates/2.sql delete mode 100644 benchmark/query-templates/20.sql delete mode 100644 benchmark/query-templates/21.sql delete mode 100644 benchmark/query-templates/22.sql delete mode 100644 benchmark/query-templates/3.sql delete mode 100644 benchmark/query-templates/4.sql delete mode 100644 benchmark/query-templates/5.sql delete mode 100644 benchmark/query-templates/6.sql delete mode 100644 benchmark/query-templates/7.sql delete mode 100644 benchmark/query-templates/8.sql delete mode 100644 benchmark/query-templates/9.sql delete mode 100755 benchmark/scripts/generate-data.sh delete mode 100755 benchmark/scripts/load-pg-data.sh delete mode 100755 benchmark/scripts/measure-memory.sh create mode 100644 cdc/config.go create mode 100644 cdc/config_test.go create mode 100644 cdc/go.mod create mode 100644 cdc/go.sum rename {src/common => cdc}/logger_utils.go (64%) create mode 100644 cdc/main.go create mode 100644 cdc/nats.go create mode 100644 cdc/operation.go create mode 100644 cdc/replication.go create mode 100644 cdc/replication_test.go create mode 100644 cdc/search_snapshot.go create mode 100644 cdc/setup.go create mode 100644 cdc/transaction.go create mode 100644 cdc/typemap.go create mode 100644 cdc/typemap_test.go delete mode 100644 devbox.lock delete mode 100755 docker/bin-test/minio_configure.sh delete mode 100755 docker/bin-test/minio_start.sh delete mode 100755 docker/bin-test/postgres_configure.sh delete mode 100755 docker/bin-test/postgres_start.sh delete mode 100755 docker/bin-test/test.sh delete mode 100755 docker/bin/run.sh delete mode 100644 img/BemiDB.gif delete mode 100644 img/architecture.png delete mode 100644 img/tpc-h_database_structure.png create mode 100755 local-entrypoint.sh create mode 100644 local_config.py create mode 100644 pgstack.example.yaml create mode 100644 processor/config.go create mode 100644 processor/config_test.go create mode 100644 processor/deduplication.go create mode 100644 processor/deduplication_test.go create mode 100644 processor/duckdb.go create mode 100644 processor/duckdb_test.go create mode 100644 processor/embedding_client.go create mode 100644 processor/embedding_client_test.go create mode 100644 processor/go.mod create mode 100644 processor/go.sum create mode 100644 processor/hot_parquet_compactor.go create mode 100644 processor/hot_parquet_compactor_test.go create mode 100644 processor/iceberg_metadata.go create mode 100644 processor/iceberg_writer.go create mode 100644 processor/iceberg_writer_test.go create mode 100644 processor/logger_utils.go create mode 100644 processor/main.go create mode 100644 processor/nats_consumer.go create mode 100644 processor/operation.go create mode 100644 processor/runtime_integration.go create mode 100644 processor/s3_client.go create mode 100644 processor/search_writer.go create mode 100644 processor/search_writer_test.go create mode 100644 processor/stitcher.go create mode 100644 processor/stitcher_test.go create mode 100644 processor/storage_utils.go delete mode 100755 scripts/build-docker.sh delete mode 100644 scripts/catalog.sql delete mode 100755 scripts/publish-docker.sh delete mode 100644 scripts/test-data-types.sql delete mode 100644 scripts/test-partitioned-tables.sql delete mode 100644 scripts/test-schemas.sql create mode 100644 server/authentication.go create mode 100644 server/authentication_test.go create mode 100644 server/client_error.go create mode 100644 server/client_error_test.go create mode 100644 server/config.go create mode 100644 server/duckdb_boot_test.go create mode 100644 server/duckdb_client.go create mode 100644 server/duckdb_client_test.go create mode 100644 server/embedding_client.go create mode 100644 server/embedding_client_test.go create mode 100644 server/error_utils.go create mode 100644 server/go.mod create mode 100644 server/go.sum create mode 100644 server/iceberg_reader.go create mode 100644 server/iceberg_schema_column.go create mode 100644 server/iceberg_schema_table.go create mode 100644 server/logger_utils.go create mode 100644 server/main.go create mode 100644 server/main_test.go rename {src/server => server}/parser_a_expr.go (79%) rename {src/server => server}/parser_column_ref.go (100%) rename {src/server => server}/parser_function.go (94%) rename {src/server => server}/parser_select.go (100%) rename {src/server => server}/parser_show.go (100%) rename {src/server => server}/parser_table.go (68%) rename {src/server => server}/parser_type_cast.go (81%) rename {src/server => server}/parser_utils.go (88%) rename {src/server => server}/pg_constants.go (93%) rename {src/server => server}/postgres_server.go (65%) create mode 100644 server/postgres_server_test.go create mode 100644 server/query_handler.go create mode 100644 server/query_handler_test.go create mode 100644 server/query_log.go create mode 100644 server/query_log_test.go rename {src/server => server}/query_remapper.go (61%) rename {src/server => server}/query_remapper_expression.go (96%) rename {src/server => server}/query_remapper_function.go (80%) create mode 100644 server/query_remapper_search.go create mode 100644 server/query_remapper_search_test.go rename {src/server => server}/query_remapper_select.go (100%) rename {src/server => server}/query_remapper_show.go (100%) rename {src/server => server}/query_remapper_table.go (89%) rename src/server/custom_types.go => server/query_schema_table.go (84%) rename {src/server => server}/response_handler.go (82%) create mode 100644 server/runtime_integration.go create mode 100644 server/runtime_integration_test.go create mode 100644 server/runtime_manager.go create mode 100644 server/s3_client.go create mode 100644 server/search_catalog.go create mode 100644 server/search_query_test.go rename {src/common => server}/set.go (69%) rename {src/server => server}/utils.go (77%) delete mode 100644 src/common/capped_buffer.go delete mode 100644 src/common/capped_buffer_test.go delete mode 100644 src/common/common_config.go delete mode 100644 src/common/duckdb_client.go delete mode 100644 src/common/duckdb_schema_column.go delete mode 100644 src/common/error_utils.go delete mode 100644 src/common/go.mod delete mode 100644 src/common/go.sum delete mode 100644 src/common/iceberg_catalog.go delete mode 100644 src/common/iceberg_schema_column.go delete mode 100644 src/common/iceberg_table.go delete mode 100644 src/common/iceberg_table_writer.go delete mode 100644 src/common/json_queue.go delete mode 100644 src/common/json_queue_test.go delete mode 100644 src/common/postgres_client.go delete mode 100644 src/common/s3_client.go delete mode 100644 src/common/storage_s3.go delete mode 100644 src/common/storage_utils.go delete mode 100644 src/common/utils.go delete mode 100644 src/server/config.go delete mode 100644 src/server/go.mod delete mode 100644 src/server/go.sum delete mode 100644 src/server/iceberg_reader.go delete mode 100644 src/server/iceberg_writer.go delete mode 100644 src/server/main.go delete mode 100644 src/server/query_handler.go delete mode 100644 src/server/query_handler_test.go delete mode 100644 src/syncer-amplitude/go.mod delete mode 100644 src/syncer-amplitude/go.sum delete mode 100644 src/syncer-amplitude/lib/amplitude.go delete mode 100644 src/syncer-amplitude/lib/config.go delete mode 100644 src/syncer-amplitude/lib/go.mod delete mode 100644 src/syncer-amplitude/lib/go.sum delete mode 100644 src/syncer-amplitude/lib/record_event.go delete mode 100644 src/syncer-amplitude/lib/syncer.go delete mode 100644 src/syncer-amplitude/main.go delete mode 100644 src/syncer-attio/go.mod delete mode 100644 src/syncer-attio/go.sum delete mode 100644 src/syncer-attio/lib/attio.go delete mode 100644 src/syncer-attio/lib/config.go delete mode 100644 src/syncer-attio/lib/go.mod delete mode 100644 src/syncer-attio/lib/go.sum delete mode 100644 src/syncer-attio/lib/parser.go delete mode 100644 src/syncer-attio/lib/record_company.go delete mode 100644 src/syncer-attio/lib/record_deal.go delete mode 100644 src/syncer-attio/lib/record_person.go delete mode 100644 src/syncer-attio/lib/syncer.go delete mode 100644 src/syncer-attio/main.go delete mode 100644 src/syncer-dialpad/go.mod delete mode 100644 src/syncer-dialpad/go.sum delete mode 100644 src/syncer-dialpad/lib/config.go delete mode 100644 src/syncer-dialpad/lib/go.mod delete mode 100644 src/syncer-dialpad/lib/go.sum delete mode 100644 src/syncer-dialpad/lib/nats.go delete mode 100644 src/syncer-dialpad/lib/record_sms_message.go delete mode 100644 src/syncer-dialpad/lib/syncer.go delete mode 100644 src/syncer-dialpad/main.go delete mode 100644 src/syncer-postgres/go.mod delete mode 100644 src/syncer-postgres/go.sum delete mode 100644 src/syncer-postgres/lib/config.go delete mode 100644 src/syncer-postgres/lib/debezium.go delete mode 100644 src/syncer-postgres/lib/go.mod delete mode 100644 src/syncer-postgres/lib/go.sum delete mode 100644 src/syncer-postgres/lib/init_test.go delete mode 100644 src/syncer-postgres/lib/nats.go delete mode 100644 src/syncer-postgres/lib/pg_schema_column.go delete mode 100644 src/syncer-postgres/lib/pg_schema_table.go delete mode 100644 src/syncer-postgres/lib/postgres.go delete mode 100644 src/syncer-postgres/lib/syncer.go delete mode 100644 src/syncer-postgres/lib/syncer_full_refresh.go delete mode 100644 src/syncer-postgres/lib/syncer_utils.go delete mode 100644 src/syncer-postgres/main.go create mode 100644 test_local_config.py create mode 100755 tests/smoke.sh diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..8f87eca --- /dev/null +++ b/.dockerignore @@ -0,0 +1,16 @@ +** +!cdc/ +!cdc/*.go +!cdc/go.mod +!cdc/go.sum +!processor/ +!processor/*.go +!processor/go.mod +!processor/go.sum +!server/ +!server/*.go +!server/go.mod +!server/go.sum +!local-entrypoint.sh +!Dockerfile +!local_config.py diff --git a/.env.sample b/.env.sample deleted file mode 100644 index 02c0630..0000000 --- a/.env.sample +++ /dev/null @@ -1,16 +0,0 @@ -AWS_REGION=us-west-1 -AWS_S3_BUCKET=[REPLACE_ME] -AWS_ACCESS_KEY_ID=[REPLACE_ME] -AWS_SECRET_ACCESS_KEY=[REPLACE_ME] - -CATALOG_DATABASE_URL=postgres://postgres:postgres@host.docker.internal:5432/catalog - -SOURCE_POSTGRES_DATABASE_URL=postgres://postgres:postgres@host.docker.internal:5432/source - -SOURCE_AMPLITUDE_API_KEY=[REPLACE_ME] -SOURCE_AMPLITUDE_SECRET_KEY=[REPLACE_ME] - -SOURCE_ATTIO_API_ACCESS_TOKEN=[REPLACE_ME] - -BEMIDB_LOG_LEVEL=INFO -BEMIDB_DISABLE_ANONYMOUS_ANALYTICS=true diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml deleted file mode 100644 index 15578e6..0000000 --- a/.github/workflows/build.yml +++ /dev/null @@ -1,21 +0,0 @@ -name: Build - -on: - push: - branches: ['**'] - pull_request: - branches: ['**'] - -jobs: - test: - name: Test - runs-on: ubuntu-latest - steps: - - name: Checkout Code - uses: actions/checkout@v4 - - - name: Build test container - run: docker build -t bemidb-test -f Dockerfile.test --build-arg PLATFORM=linux/amd64 . - - - name: Run tests - run: docker run --rm bemidb-test diff --git a/.github/workflows/image.yml b/.github/workflows/image.yml new file mode 100644 index 0000000..e7a5853 --- /dev/null +++ b/.github/workflows/image.yml @@ -0,0 +1,115 @@ +name: Test and release +on: + push: + branches: [main] + pull_request: + release: + types: [published] + workflow_dispatch: +permissions: + contents: read +concurrency: + group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event_name }} + cancel-in-progress: ${{ github.event_name != 'release' }} +jobs: + test: + runs-on: ubuntu-24.04 + timeout-minutes: 20 + strategy: + fail-fast: false + matrix: + module: [cdc, processor, server] + steps: + - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4 + with: + persist-credentials: false + - uses: actions/setup-go@40f1582b2485089dde7abd97c1529aa768e1baff # v5 + with: + go-version: '1.26' + cache-dependency-path: '${{ matrix.module }}/go.sum' + - run: go vet ./... && go test ./... + working-directory: ${{ matrix.module }} + config-checks: + runs-on: ubuntu-24.04 + timeout-minutes: 5 + steps: + - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4 + with: + persist-credentials: false + - run: sudo apt-get update && sudo apt-get install -y python3-yaml jq shellcheck + - run: /usr/bin/python3 -m unittest discover -p 'test_local_config.py' + - run: shellcheck local-entrypoint.sh tests/smoke.sh + container: + needs: [test, config-checks] + timeout-minutes: 45 + strategy: + fail-fast: false + matrix: + include: + - runner: ubuntu-24.04 + arch: amd64 + - runner: ubuntu-24.04-arm + arch: arm64 + runs-on: ${{ matrix.runner }} + steps: + - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4 + with: + persist-credentials: false + - uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3 + - uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6 + with: + context: . + load: true + tags: pgstack:test + cache-from: type=gha,scope=${{ matrix.arch }} + cache-to: type=gha,mode=max,scope=${{ matrix.arch }} + - run: bash tests/smoke.sh pgstack:test + publish: + if: github.event_name == 'release' + needs: container + runs-on: ubuntu-24.04 + timeout-minutes: 60 + permissions: + contents: read + packages: write + steps: + - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4 + with: + persist-credentials: false + - uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 # v3 + - uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3 + - uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051 # v5 + id: meta + with: + images: ghcr.io/pgstack-io/pgstack + flavor: latest=false + tags: | + type=ref,event=tag + type=semver,pattern={{version}} + type=raw,value=latest,enable=${{ !github.event.release.prerelease }} + - uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6 + with: + context: . + platforms: linux/amd64,linux/arm64 + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + provenance: mode=max + sbom: true + cache-from: | + type=gha,scope=amd64 + type=gha,scope=arm64 + - name: Verify anonymous image access + env: + IMAGE_TAG: ${{ github.event.release.tag_name }} + run: | + docker logout ghcr.io + if ! docker buildx imagetools inspect "ghcr.io/pgstack-io/pgstack:${IMAGE_TAG}"; then + echo "Set the GHCR package visibility to public, then verify an anonymous pull." >&2 + exit 1 + fi diff --git a/.gitignore b/.gitignore index 109ec6c..40d36a4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,7 @@ -/iceberg -/iceberg-test -/src/iceberg -/src/iceberg-test -.DS_Store -.vscode .env -/benchmark/tpch-kit -/benchmark/data/*.tbl -/build -bemidb -/src/__debug* +.env.* +!.env.example +.devbox/ +.DS_Store +*.log +__pycache__/ diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index 0a99310..0000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,3 +0,0 @@ -# Changelog - -Please see [Releases](https://github.com/BemiHQ/BemiDB/releases). diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..448fb05 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,15 @@ +# Contributing + +Bug reports and focused pull requests are welcome. Include a minimal reproduction, source Postgres version, PgStack version, and redacted logs. Never include database credentials, API keys, or customer data. + +The repository contains three Go modules: + +- `cdc`: Postgres logical replication and initial Search snapshots. +- `processor`: Audit storage and Search indexing. +- `server`: SQL compatibility, query execution, and authentication. + +Use `make test` and `make lint` with Devbox, then `make build` to check the complete local image. Add regression tests for behavior changes. Keep fixtures synthetic. Document public configuration changes in the README and preserve the simple local quickstart. + +BemiDB 1.x history remains available in Git. PgStack 2.x is a new runtime and configuration; do not assume compatibility with old deployment instructions or storage layouts. + +Contributions are provided under the repository's AGPL-3.0 license. diff --git a/Dockerfile b/Dockerfile index bf14084..d7b881d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,88 +1,60 @@ -ARG PLATFORM=linux/arm64 +FROM golang:1.26-bookworm AS go-builder -FROM --platform=$PLATFORM debian:12-slim AS base +WORKDIR /src -RUN apt-get update \ - && apt-get install -y --no-install-recommends \ - curl ca-certificates \ - postgresql-client \ - gcc g++ libc6-dev \ - && rm -rf /var/lib/apt/lists/* +COPY cdc/ ./cdc/ +COPY processor/ ./processor/ +COPY server/ ./server/ -RUN adduser --disabled-login app +RUN --mount=type=cache,target=/go/pkg/mod \ + --mount=type=cache,target=/root/.cache/go-build \ + cd cdc && CGO_ENABLED=1 go build -mod=readonly -trimpath -ldflags="-s -w" -o /out/cdc . && \ + cd ../processor && CGO_ENABLED=1 go build -mod=readonly -trimpath -ldflags="-s -w" -o /out/processor . && \ + cd ../server && CGO_ENABLED=1 go build -mod=readonly -trimpath -ldflags="-s -w" -o /out/server . -WORKDIR /app - -COPY --chown=app:app scripts/catalog.sql /app/scripts/ - -# Set up syncers and server ######################################################################## - -FROM base AS compile +################################################################################ -# Install Go +FROM nats:2.11.8 AS nats-server -ENV GOROOT /usr/local/go -ENV GOPATH /go -ENV PATH $GOPATH/bin:$GOROOT/bin:$PATH +################################################################################ -RUN \ - ARCH=$(dpkg --print-architecture) \ - && curl -L "https://go.dev/dl/go1.24.4.linux-$ARCH.tar.gz" -o go.tar.gz \ - && tar -C /usr/local -xzf go.tar.gz \ - && rm go.tar.gz \ - && mkdir -p "$GOPATH/src" "$GOPATH/bin" \ - && chmod -R 777 "$GOPATH" +FROM natsio/nats-box:0.19.7 AS nats-box -# Compile syncers and server +################################################################################ -COPY --chown=app:app src/common/go.mod src/common/go.sum /app/src/common/ +FROM rclone/rclone:1.74.2 AS rclone -COPY --chown=app:app src/syncer-postgres/lib/go.mod src/syncer-postgres/lib/go.sum /app/src/syncer-postgres/lib/ -COPY --chown=app:app src/syncer-postgres/go.mod src/syncer-postgres/go.sum /app/src/syncer-postgres/ -RUN cd /app/src/syncer-postgres && go mod download +################################################################################ -COPY --chown=app:app src/syncer-amplitude/lib/go.mod src/syncer-amplitude/lib/go.sum /app/src/syncer-amplitude/lib/ -COPY --chown=app:app src/syncer-amplitude/go.mod src/syncer-amplitude/go.sum /app/src/syncer-amplitude/ -RUN cd /app/src/syncer-amplitude && go mod download +FROM debian:bookworm-slim -COPY --chown=app:app src/syncer-attio/lib/go.mod src/syncer-attio/lib/go.sum /app/src/syncer-attio/lib/ -COPY --chown=app:app src/syncer-attio/go.mod src/syncer-attio/go.sum /app/src/syncer-attio/ -RUN cd /app/src/syncer-attio && go mod download +RUN apt-get update && \ + apt-get install -y --no-install-recommends ca-certificates libstdc++6 postgresql-client tini jq python3-yaml && \ + rm -rf /var/lib/apt/lists/* -COPY --chown=app:app src/syncer-dialpad/lib/go.mod src/syncer-dialpad/lib/go.sum /app/src/syncer-dialpad/lib/ -COPY --chown=app:app src/syncer-dialpad/go.mod src/syncer-dialpad/go.sum /app/src/syncer-dialpad/ -RUN cd /app/src/syncer-dialpad && go mod download +RUN useradd --create-home --uid 10001 app && \ + mkdir -p /app/bin /var/lib/pgstack && \ + chown -R app:app /app /var/lib/pgstack -COPY --chown=app:app src/server/go.mod src/server/go.sum /app/src/server/ -RUN cd /app/src/server && go mod download +COPY --from=nats-server /nats-server /usr/local/bin/nats-server +COPY --from=nats-box /usr/local/bin/nats /usr/local/bin/nats +COPY --from=rclone /usr/local/bin/rclone /usr/local/bin/rclone +COPY --from=go-builder /out/cdc /app/bin/cdc +COPY --from=go-builder /out/processor /app/bin/processor +COPY --from=go-builder /out/server /app/bin/server +COPY --chown=app:app local-entrypoint.sh /app/local-entrypoint.sh -COPY --chown=app:app src/common /app/src/common -COPY --chown=app:app src/syncer-postgres /app/src/syncer-postgres -COPY --chown=app:app src/syncer-amplitude /app/src/syncer-amplitude -COPY --chown=app:app src/syncer-attio /app/src/syncer-attio -COPY --chown=app:app src/syncer-dialpad /app/src/syncer-dialpad -COPY --chown=app:app src/server /app/src/server +COPY --chown=app:app local_config.py /app/local_config.py -RUN ARCH=$(dpkg --print-architecture) \ - && cd /app/src/syncer-postgres && CGO_ENABLED=1 GOOS=linux GOARCH=$ARCH go build -o /app/bin/syncer-postgres \ - && cd /app/src/syncer-amplitude && CGO_ENABLED=1 GOOS=linux GOARCH=$ARCH go build -o /app/bin/syncer-amplitude \ - && cd /app/src/syncer-attio && CGO_ENABLED=1 GOOS=linux GOARCH=$ARCH go build -o /app/bin/syncer-attio \ - && cd /app/src/syncer-dialpad && CGO_ENABLED=1 GOOS=linux GOARCH=$ARCH go build -o /app/bin/syncer-dialpad \ - && cd /app/src/server && CGO_ENABLED=1 GOOS=linux GOARCH=$ARCH go build -o /app/bin/server - -# Prepare final image ############################################################################## +USER app +WORKDIR /app -FROM base AS final +LABEL org.opencontainers.image.title="PgStack" \ + org.opencontainers.image.source="https://github.com/pgstack-io/pgstack" \ + org.opencontainers.image.licenses="AGPL-3.0" -COPY --chown=app:app --from=compile \ - /app/bin/syncer-postgres \ - /app/bin/syncer-amplitude \ - /app/bin/syncer-attio \ - /app/bin/syncer-dialpad \ - /app/bin/server \ - /app/bin/ -COPY --chown=app:app docker/bin /app/bin/ +ENV PGHOST=127.0.0.1 PGPORT=54321 PGDATABASE=pgstack PGUSER=pgstack -USER app +EXPOSE 54321 -ENTRYPOINT ["/app/bin/run.sh"] +ENTRYPOINT ["/usr/bin/tini", "-g", "--", "/app/local-entrypoint.sh"] diff --git a/Dockerfile.test b/Dockerfile.test deleted file mode 100644 index ce60406..0000000 --- a/Dockerfile.test +++ /dev/null @@ -1,77 +0,0 @@ -ARG PLATFORM=linux/arm64 - -FROM --platform=$PLATFORM debian:12-slim AS base - -RUN apt-get update \ - && apt-get install -y --no-install-recommends \ - curl ca-certificates \ - postgresql-client \ - gcc g++ libc6-dev \ - && rm -rf /var/lib/apt/lists/* - -RUN adduser --disabled-login app - -WORKDIR /app - -COPY --chown=app:app scripts/catalog.sql /app/scripts/ - -# Set up syncers and server ######################################################################## - -FROM base AS test - -# Install Go, MinIO, and PostgreSQL - -ENV GOROOT /usr/local/go -ENV GOPATH /go -ENV PATH $GOPATH/bin:$GOROOT/bin:$PATH - -RUN \ - ARCH=$(dpkg --print-architecture) \ - \ - && curl -L "https://go.dev/dl/go1.24.4.linux-$ARCH.tar.gz" -o go.tar.gz \ - && tar -C /usr/local -xzf go.tar.gz \ - && rm go.tar.gz \ - && mkdir -p "$GOPATH/src" "$GOPATH/bin" \ - && chmod -R 777 "$GOPATH" \ - \ - && curl -L "https://dl.min.io/server/minio/release/linux-$ARCH/minio" -o /usr/local/bin/minio \ - && chmod +x /usr/local/bin/minio \ - && mkdir -p /data/minio \ - && chown -R "app:app" /data/minio \ - && curl -L "https://dl.min.io/client/mc/release/linux-$ARCH/mc" -o /usr/local/bin/mc \ - && chmod +x /usr/local/bin/mc \ - \ - && apt-get update \ - && apt-get install -y --no-install-recommends gnupg \ - && curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor -o /etc/apt/trusted.gpg.d/postgresql.gpg \ - && echo "deb http://apt.postgresql.org/pub/repos/apt bookworm-pgdg main" > /etc/apt/sources.list.d/pgdg.list \ - && apt-get update \ - && apt-get install -y --no-install-recommends postgresql-16 \ - && mkdir -p /var/lib/postgresql/data \ - && chown -R app:app /var/lib/postgresql/data \ - && chmod 700 /var/lib/postgresql/data \ - && mkdir -p /var/run/postgresql \ - && chown -R app:app /var/run/postgresql - -# Prepare syncers and server - -COPY --chown=app:app src/common/go.mod src/common/go.sum /app/src/common/ - -COPY --chown=app:app src/syncer-postgres/lib/go.mod src/syncer-postgres/lib/go.sum /app/src/syncer-postgres/lib/ -RUN cd /app/src/syncer-postgres/lib && go mod download - -COPY --chown=app:app src/syncer-postgres/go.mod src/syncer-postgres/go.sum /app/src/syncer-postgres/ -RUN cd /app/src/syncer-postgres && go mod download - -COPY --chown=app:app src/server/go.mod src/server/go.sum /app/src/server/ -RUN cd /app/src/server && go mod download - -COPY --chown=app:app src/common /app/src/common -COPY --chown=app:app src/syncer-postgres /app/src/syncer-postgres -COPY --chown=app:app src/server /app/src/server - -COPY --chown=app:app docker/bin docker/bin-test /app/bin/ - -USER app - -ENTRYPOINT ["/app/bin/test.sh"] diff --git a/Makefile b/Makefile index 8591ba5..1432018 100644 --- a/Makefile +++ b/Makefile @@ -1,119 +1,18 @@ -sh: - devbox --env-file .env shell - -install: - devbox run "cd src/common && go mod tidy && \ - cd ../syncer-postgres && go mod tidy && cd ../lib && go mod tidy && \ - cd ../../syncer-amplitude && go mod tidy && cd ./lib && go mod tidy && \ - cd ../../syncer-attio && go mod tidy && cd ./lib && go mod tidy && \ - cd ../../syncer-dialpad && go mod tidy && cd ./lib && go mod tidy && \ - cd ../../server && go mod tidy" - -lint: - devbox run "cd src/common && go fmt && staticcheck . && \ - cd ../syncer-postgres && go fmt && deadcode . && staticcheck . && cd ./lib && go fmt && staticcheck . && \ - cd ../../syncer-amplitude && go fmt && deadcode . && staticcheck . && cd ./lib && go fmt && staticcheck . && \ - cd ../../syncer-attio && go fmt && deadcode . && staticcheck . && cd ./lib && go fmt && staticcheck . && \ - cd ../../syncer-dialpad && go fmt && deadcode . && staticcheck . && cd ./lib && go fmt && staticcheck . && \ - cd ../../server && go fmt && deadcode . && staticcheck ." +IMAGE ?= ghcr.io/pgstack-io/pgstack:local +.PHONY: build test lint build: - ./scripts/build-docker.sh - -publish: - ./scripts/publish-docker.sh - -server: - docker run -it --rm --env-file .env -p 54321:54321 ghcr.io/bemihq/bemidb:latest server - -syncer-postgres: - docker run -it --rm --env-file .env -e DESTINATION_SCHEMA_NAME=postgres ghcr.io/bemihq/bemidb:latest syncer-postgres - -local-build: - docker build --build-arg PLATFORM=linux/arm64 -t bemidb:local . - -local-server: local-build - docker run -it --rm --env-file .env -p 54321:54321 bemidb:local server - -local-syncer-postgres: local-build - docker run -it --rm --env-file .env -e DESTINATION_SCHEMA_NAME=postgres bemidb:local syncer-postgres - -local-syncer-amplitude: local-build - docker run -it --rm --env-file .env -e DESTINATION_SCHEMA_NAME=amplitude bemidb:local syncer-amplitude - -local-syncer-attio: local-build - docker run -it --rm --env-file .env -e DESTINATION_SCHEMA_NAME=attio bemidb:local syncer-attio - -local-sh: - docker run -it --rm --env-file .env bemidb:local bash - -test-build: - docker build --build-arg PLATFORM=linux/arm64 -t bemidb:test -f Dockerfile.test . - -test: build-test - docker run -it --rm bemidb:test - -test-function: - devbox run "cd src/server && go test ./... -run $(FUNC)" + docker build -t $(IMAGE) . -debug: - devbox run "cd src/server && dlv test github.com/BemiHQ/BemiDB" +test: + devbox run "cd cdc && go test ./... && cd ../processor && go test ./... && cd ../server && go test ./..." -console: - devbox run "cd src/server && gore" - -outdated: - devbox run "cd src/server && go list -u -m -f '{{if and .Update (not .Indirect)}}{{.}}{{end}}' all" - -.PHONY: benchmark -benchmark: - devbox run "time psql postgres://127.0.0.1:54321/bemidb < ./benchmark/queries.sql" - -pg-init: - devbox run initdb && \ - sed -i "s/#log_statement = 'none'/log_statement = 'all'/g" ./.devbox/virtenv/postgresql/data/postgresql.conf && \ - sed -i "s/#logging_collector = off/logging_collector = on/g" ./.devbox/virtenv/postgresql/data/postgresql.conf && \ - sed -i "s/#log_directory = 'log'/log_directory = 'log'/g" ./.devbox/virtenv/postgresql/data/postgresql.conf - -pg-up: - devbox services start postgresql - -pg-create: - devbox run "(dropdb tpch || true) && \ - createdb tpch && \ - ./benchmark/scripts/load-pg-data.sh" - -pg-index: - devbox run "psql postgres://127.0.0.1:5432/tpch -f ./benchmark/data/create-indexes.ddl" - -pg-benchmark: - devbox run "psql postgres://127.0.0.1:5432/tpch -c 'ANALYZE VERBOSE' && \ - time psql postgres://127.0.0.1:5432/tpch < ./benchmark/queries.sql" - -pg-down: - devbox services stop postgresql - -pg-logs: - tail -f .devbox/virtenv/postgresql/data/log/postgresql-*.log - -pg-sniff: - sudo tshark -i lo0 -f 'tcp port 5432' -d tcp.port==5432,pgsql -O pgsql - -tpch-install: - devbox run "cd benchmark && \ - rm -rf tpch-kit && \ - git clone https://github.com/gregrahn/tpch-kit.git && \ - cd tpch-kit/dbgen && \ - make MACHINE=$$MACHINE DATABASE=POSTGRESQL" - -tpch-generate: - devbox run "./benchmark/scripts/generate-data.sh" - -sniff: - sudo tshark -i lo0 -f 'tcp port 54321' -d tcp.port==54321,pgsql -O pgsql +lint: + devbox run "cd cdc && go vet ./... && cd ../processor && go vet ./... && cd ../server && go vet ./..." -measure-mem: - devbox run "./benchmark/scripts/measure-memory.sh" +.PHONY: test-config test-container +test-config: + python3 -m unittest discover -p 'test_local_config.py' -profile-mem: - devbox run "watch -n 1 go tool pprof -top http://localhost:6060/debug/pprof/heap" +test-container: + bash tests/smoke.sh "$(IMAGE)" diff --git a/README.md b/README.md index 84ee054..d39d9c3 100644 --- a/README.md +++ b/README.md @@ -1,433 +1,217 @@ -# BemiDB +# PgStack -BemiDB is an open-source Snowflake and Fivetran alternative bundled together. It seamlessly connects to different data sources, syncs data in a compressed columnar format to S3, and allows you to run complex queries using its Postgres-compatible analytical query engine. +**PgStack** is Postgres read replicas for Search and Audit. -![BemiDB](/img/BemiDB.gif) +- **Search**: a search-optimized replica for semantic, keyword, and hybrid retrieval. +- **Audit**: a history of row changes for automatic data change tracking. + +PgStack replicates your data while your existing Postgres remains the source of truth. Indexing and queries run outside your application database through a separate Postgres-compatible endpoint. + +Run with one Docker command, or use [PgStack Cloud](https://pgstack.io/) for managed production workloads. ## Contents - [Highlights](#highlights) -- [Use cases](#use-cases) +- [Use Cases](#use-cases) - [Quickstart](#quickstart) - [Usage](#usage) - - [Syncing from Amplitude](#syncing-from-amplitude) - - [Syncing from Attio](#syncing-from-attio) - - [Syncing from Dialpad](#syncing-from-dialpad) - - [Syncing from Postgres](#syncing-from-postgres) - - [Customizing S3 endpoint](#customizing-s3-endpoint) -- [Configuration](#configuration) + - [Audit](#audit) + - [Search](#search) + - [Configuration](#configuration) - [Architecture](#architecture) -- [Benchmark](#benchmark) -- [Data type mapping](#data-type-mapping) -- [Roadmap](#roadmap) +- [OSS vs Cloud](#oss-vs-cloud) - [License](#license) ## Highlights -- **Query Engine**: leverages a analytical query engine that is 2000x faster than regular Postgres. -- **Scalable Storage**: stores data in columnar format in object storage separated from compute. -- **Built-In Connectors**: automatically syncs data from different data sources. -- **Compressed Data**: uses an open table format with 4x data compression. -- **Easy Deployment**: packaged in a single Docker image with stateless processes. -- **Postgres Compatibility**: integrates with services and tools in the Postgres ecosystem. -- **Open-Source**: released under an OSI-approved license. +- **Specialized Replicas**: continuously synchronized, with Search and Audit isolated from OLTP workloads. +- **Easy Setup**: starts in a single container with your database URL. +- **Postgres Compatibility**: integrates with clients and tools in the Postgres ecosystem. +- **Open-Source**: released under the OSI-approved AGPL-3.0 license. -## Use cases +## Use Cases -- **Centralize data without complex pipelines**. No complex setup and no weird acronyms like CDC or ETL. -- **Integrate with Postgres tools and services**. Querying data with BI tools, notebooks, and ORMs. -- **Run complex analytical queries at high speed**. Without worrying about performance impact or indexing. -- **Continuously archive data from your database**. Offloading and querying historical data. +- **Search** + - **Product Search**: find relevant information across operational records and knowledge bases. + - **AI and RAG Retrieval**: retrieve current application data as context for AI agents and assistants. + - **Duplicate Detection**: surface related tickets, issues, and requests expressed in different words. + - **Find Similar**: discover related companies, people, jobs, articles, and other application records. +- **Audit** + - **Audit Trails and Compliance**: track record changes to support data audits and compliance reviews. + - **Troubleshooting**: investigate unexpected data issues and understand how your data changed. + - **Selective Data Recovery**: identify previous values to recover updated or deleted records. + - **Customer Activity Feeds**: turn data changes into activity feeds in your product. ## Quickstart -#### 1. Configure prerequisites for BemiDB: - - - Set up a Postgres database as a data catalog for files stored in object storage: +Use a development Postgres database and a superuser connection for automatic setup. Check logical replication with: ```sql -CREATE USER catalog_user LOGIN PASSWORD 'password'; -CREATE DATABASE catalog OWNER catalog_user; -``` - - - Create an S3 bucket and IAM user credentials with access to the bucket. - - -
-See AWS IAM policy example - -```json -{ - "Version": "2012-10-17", - "Statement": [ - { - "Sid": "VisualEditor0", - "Effect": "Allow", - "Action": [ - "s3:PutObject", - "s3:GetObject", - "s3:ListBucket", - "s3:DeleteObject" - ], - "Resource": [ - "arn:aws:s3:::[AWS_S3_BUCKET]", - "arn:aws:s3:::[AWS_S3_BUCKET]/*" - ] - } - ] -} +SHOW wal_level; ``` -
- - Export the environment variables: +If the result is not `logical`, enable it and restart Postgres: -```sh -# Configured catalog database URL (host.docker.internal allows connecting to localhost from a container) -export CATALOG_DATABASE_URL=postgres://catalog_user:password@host.docker.internal:5432/catalog - -# AWS S3 environment variables (data will be stored in s3://bemidb-bucket/iceberg/*) -export AWS_REGION=us-west-1 -export AWS_S3_BUCKET=bemidb-bucket -export AWS_ACCESS_KEY_ID=[...] -export AWS_SECRET_ACCESS_KEY=[...] -``` - -#### 2. Sync data from a source Postgres database: - -```sh -docker run \ - -e SOURCE_POSTGRES_DATABASE_URL=postgres://user:password@host.docker.internal:5432/source \ - -e DESTINATION_SCHEMA_NAME=postgres \ - -e AWS_REGION -e AWS_S3_BUCKET -e AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY -e CATALOG_DATABASE_URL \ - ghcr.io/bemihq/bemidb:latest syncer-postgres +```sql +ALTER SYSTEM SET wal_level = 'logical'; ``` -#### 3. Start the BemiDB database server: +Start PgStack with your database URL: ```sh -docker run \ +docker run --rm --name pgstack \ -p 54321:54321 \ - -e AWS_REGION -e AWS_S3_BUCKET -e AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY -e CATALOG_DATABASE_URL \ - ghcr.io/bemihq/bemidb:latest server + -e DATABASE_URL='postgres://postgres:postgres@host.docker.internal:5432/postgres' \ + ghcr.io/pgstack-io/pgstack:latest ``` -#### 4. Query BemiDB with with a Postgres client: +On Docker Desktop, `host.docker.internal` points to your computer. On Linux Docker Engine, add `--add-host=host.docker.internal:host-gateway` to make that name resolve to the host gateway. For a remote database, use its reachable hostname. URL-encode reserved characters in the source password. -```sh -# List all tables -psql postgres://localhost:54321/bemidb -c "SELECT table_schema, table_name FROM information_schema.tables" - -# Query a table -psql postgres://localhost:54321/bemidb -c "SELECT COUNT(*) FROM postgres.[table_name]" -``` +The image supports Linux amd64 and arm64, including Apple Silicon. `latest` tracks stable [releases](https://github.com/pgstack-io/pgstack/releases). ## Usage -#### Syncing from Amplitude +### Audit -1. Create an [Amplitude API key](https://docs.gettelio.com/integrations/amplitude) -2. Run the syncer: +Audit is enabled by default. It records changes made while PgStack is running. After changing a row in your source database, connect to the PgStack server running on port `54321` from another terminal on your host: ```sh -docker run \ - -e SOURCE_AMPLITUDE_API_KEY=[...] \ - -e SOURCE_AMPLITUDE_SECRET_KEY=[...] \ - -e SOURCE_AMPLITUDE_START_DATE=2025-01-01 \ - -e DESTINATION_SCHEMA_NAME=amplitude \ - -e AWS_REGION -e AWS_S3_BUCKET -e AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY -e CATALOG_DATABASE_URL \ - ghcr.io/bemihq/bemidb:latest syncer-amplitude +psql 'postgres://localhost:54321/pgstack' ``` -#### Syncing from Attio +Query `audit.changes`: -1. Create an [Attio API access token](https://docs.gettelio.com/integrations/attio) -2. Run the syncer: +```sql +-- Inspect changes to one table. +SELECT operation, before, after, committed_at +FROM audit.changes +WHERE schema = 'public' AND "table" = 'products' +ORDER BY committed_at DESC +LIMIT 50; -```sh -docker run \ - -e SOURCE_ATTIO_API_ACCESS_TOKEN=[...] \ - -e DESTINATION_SCHEMA_NAME=attio \ - -e AWS_REGION -e AWS_S3_BUCKET -e AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY -e CATALOG_DATABASE_URL \ - ghcr.io/bemihq/bemidb:latest syncer-attio +-- Filter on values captured in the changed row. +SELECT operation, after->>'name' AS name, committed_at +FROM audit.changes +WHERE after->>'name' ILIKE '%jacket%' +ORDER BY committed_at DESC; ``` -#### Syncing from Dialpad +### Search -1. Create a [Dialpad API key](https://docs.gettelio.com/integrations/dialpad) -2. Create a webhook endpoint: +Search works with tables that have primary keys. Save this as `pgstack.yaml`, changing the table and columns to match your database: -```sh -curl -X POST "https://dialpad.com/api/v2/webhooks" \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer [DIALPAD_API_KEY]" \ - -d '{ - "hook_url": "https://[YOUR_DOMAIN]/[YOUR_WEBHOOK_ENDPOINT]", - "secret": "[YOUR_WEBHOOK_SECRET]" - }' +```yaml +# Search only. Set audit.enabled to true to also capture change history. +audit: + enabled: false +search: + enabled: true + tables: + - name: public.products + indexColumns: [name, description] + storeColumns: [id, name, description] ``` -3. Subscribe to SMS events for the created webhook: +`indexColumns` provide the text to search. `storeColumns` are returned by queries and available for filtering; include primary-key columns to return them in results. Source names become Search names such as `public.products` → `search.public_products`. -```sh -curl -X POST "https://dialpad.com/api/v2/subscriptions/sms" \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer [DIALPAD_API_KEY]" \ - -d '{ - "direction": "all", - "enabled": true, - "endpoint_id": "[WEBHOOK_ID]", - "include_internal": false, - "status": false - }' -``` - -4. Write a small service to receive Dialpad webhook events and publish them to NATS JetStream. - -
-See example code in Node.js - -```ts -import express from 'express'; -import bodyParser from 'body-parser'; -import { jwtVerify } from 'jose'; -import { connect, JSONCodec } from 'nats'; - -const app = express(); -app.use(bodyParser.json()); -app.post('/dialpad-webhook', async (req, res) => { - const { payload } = await jwtVerify(request.body, new TextEncoder().encode('[YOUR_WEBHOOK_SECRET]'), { algorithms: ['HS256'] }); - const jsonCodec = JSONCodec(); - const natsConnection = await connect({ servers: "nats://host.docker.internal:4222" }); - const jetstreamManager = await natsConnection.jetstreamManager(); - await jetstreamManager.streams.add({ name: 'bemidb', subjects: ['bemidb.dialpad'] }); - await jetstreamManager.jetstream().publish('bemidb.dialpad', jsonCodec.encode(payload)); -}); -app.listen(3000, () => console.log('Server is running on port 3000')); -``` -
- -5. Run the syncer: +Mount your configuration when starting the container: ```sh -docker run \ - -e NATS_URL=nats://host.docker.internal:4222 \ - -e NATS_JETSTREAM_STREAM=bemidb \ - -e NATS_JETSTREAM_SUBJECT=bemidb.dialpad \ - -e NATS_JETSTREAM_CONSUMER_NAME=bemidb-dialpad \ - -e DESTINATION_SCHEMA_NAME=dialpad \ - -e AWS_REGION -e AWS_S3_BUCKET -e AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY -e CATALOG_DATABASE_URL \ - ghcr.io/bemihq/bemidb:latest syncer-dialpad +docker run --rm --name pgstack \ + -p 54321:54321 \ + -e DATABASE_URL='postgres://postgres:postgres@host.docker.internal:5432/postgres' \ + --mount type=bind,src="$PWD/pgstack.yaml",dst=/app/pgstack.yaml,readonly \ + ghcr.io/pgstack-io/pgstack:latest ``` -#### Syncing from Postgres - -By default, BemiDB syncs all tables from the Postgres database. To include and sync only specific tables from your Postgres database: +Existing rows are indexed at startup, and subsequent changes keep the index current. Once indexing completes, connect to the PgStack server running on port `54321` from another terminal on your host: ```sh -docker run \ - -e SOURCE_POSTGRES_DATABASE_URL=postgres://user:password@host.docker.internal:5432/source \ - -e SOURCE_POSTGRES_INCLUDE_TABLES=public.table1,public.table2 \ # A comma-separated list of tables to include - -e DESTINATION_SCHEMA_NAME=postgres \ - -e AWS_REGION -e AWS_S3_BUCKET -e AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY -e CATALOG_DATABASE_URL \ - ghcr.io/bemihq/bemidb:latest syncer-postgres +psql 'postgres://localhost:54321/pgstack' ``` -To exclude specific tables during the sync: +Search with BM25 keyword ranking: -```sh -docker run \ - -e SOURCE_POSTGRES_DATABASE_URL=postgres://user:password@host.docker.internal:5432/source \ - -e SOURCE_POSTGRES_EXCLUDE_TABLES=public.audit_log,public.cache \ # A comma-separated list of tables to exclude - -e DESTINATION_SCHEMA_NAME=postgres \ - -e AWS_REGION -e AWS_S3_BUCKET -e AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY -e CATALOG_DATABASE_URL \ - ghcr.io/bemihq/bemidb:latest syncer-postgres +```sql +SELECT id, name FROM search.public_products +ORDER BY keyword_rank('rain jacket') LIMIT 10; ``` -#### Customizing S3 endpoint - -BemiDB can work with various S3-compatible object storage solutions, such as MinIO. +For semantic and hybrid search, add `-e OPENAI_API_KEY` to `docker run`. Without a key, indexing stays keyword-only and makes no embedding API calls. -You can run MinIO locally: +```sql +-- Find related meaning. +SELECT id, name FROM search.public_products +ORDER BY semantic_rank('something for wet weather') LIMIT 10; -```sh -minio server ./minio-data -# API: http://172.17.0.3:9000 http://127.0.0.1:9000 -# WebUI: http://172.17.0.3:9001 http://127.0.0.1:9001 +-- Combine semantic and keyword relevance. +SELECT id, name FROM search.public_products +ORDER BY hybrid_rank('waterproof rain jacket') LIMIT 10; ``` -Create a bucket named `bemidb-bucket` in MinIO: +Rankings sort best matches first. Use stored columns in `WHERE` filters. With semantic indexing enabled, indexed text and semantic/hybrid queries are sent to OpenAI's `text-embedding-3-small`, billed to your account. Restarting rebuilds the index and can incur embedding charges again. -```sh -mc alias set local http://localhost:9000 minioadmin minioadmin123 -mc mb local/bemidb-bucket --ignore-existing -``` +### Configuration -Export and use environment variables when starting BemiDB: +Use an optional `pgstack.yaml` file, mounted as shown in the Search example. Without it, Audit is enabled and Search is disabled. Enable either feature or both; Search requires at least one configured table when enabled. Invalid configuration is rejected before source setup. See [pgstack.example.yaml](pgstack.example.yaml). -```sh -export AWS_REGION=us-west-1 -export AWS_S3_BUCKET=bemidb-bucket -export AWS_ACCESS_KEY_ID=minioadmin -export AWS_SECRET_ACCESS_KEY=minioadmin123 -export AWS_S3_ENDPOINT=http://localhost:9000 -``` - -## Configuration - -#### `syncer-amplitude` command options - -| Environment variable | Default value | Description | -|-------------------------------|---------------|--------------------------------------------------------------------| -| `DESTINATION_SCHEMA_NAME` | Required | Schema name in BemiDB to sync data to. | -| `SOURCE_AMPLITUDE_API_KEY` | Required | Amplitude API key for authentication. | -| `SOURCE_AMPLITUDE_SECRET_KEY` | Required | Amplitude secret key for authentication. | -| `SOURCE_AMPLITUDE_START_DATE` | `2025-01-01` | Start date for syncing data from Amplitude in `YYYY-MM-DD` format. | - -#### `syncer-attio` command options - -| Environment variable | Default value | Description | -|---------------------------------|---------------|--------------------------------------------| -| `DESTINATION_SCHEMA_NAME` | Required | Schema name in BemiDB to sync data to. | -| `SOURCE_ATTIO_API_ACCESS_TOKEN` | Required | Attio API access token for authentication. | - -#### `syncer-dialpad` command options - -| Environment variable | Default value | Description | -|--------------------------------|---------------|----------------------------------------------------------------| -| `DESTINATION_SCHEMA_NAME` | Required | Schema name in BemiDB to sync data to. | -| `NATS_URL` | Required | NATS server URL for connecting to receive Dialpad SMS records. | -| `NATS_JETSTREAM_STREAM` | Required | NATS JetStream stream name. | -| `NATS_JETSTREAM_SUBJECT` | Required | NATS JetStream subject name. | -| `NATS_JETSTREAM_CONSUMER_NAME` | Required | NATS JetStream consumer name. | -| `NATS_FETCH_TIMEOUT_SECONDS` | `30` | Timeout in seconds for fetching messages from NATS. | - -#### `syncer-postgres` command options - -| Environment variable | Default value | Description | -|-------------------------------------|---------------|----------------------------------------------------------------------| -| `DESTINATION_SCHEMA_NAME` | Required | Schema name in BemiDB to sync data to. | -| `SOURCE_POSTGRES_DATABASE_URL` | Required | Postgres database URL to sync data from. | -| `SOURCE_POSTGRES_INCLUDE_TABLES` | | List of tables to include in sync. Comma-separated `schema.table`. | -| `SOURCE_POSTGRES_EXCLUDE_TABLES` | | List of tables to exclude from sync. Comma-separated `schema.table`. | - -#### `server` command options - -| Environment variable | Default value | Description | -|----------------------|---------------|----------------------------------------| -| `BEMIDB_HOST` | `0.0.0.0` | Host for BemiDB to listen on | -| `BEMIDB_PORT` | `54321` | Port for BemiDB to listen on | -| `BEMIDB_DATABASE` | `bemidb` | Database name | -| `BEMIDB_USER` | | Database user. Allows any if empty | -| `BEMIDB_PASSWORD` | | Database password. Allows any if empty | - -#### Common options - -| Environment variable | Default value | Description | -|--------------------------------------|--------------------|------------------------------------------------------| -| `CATALOG_DATABASE_URL` | Required | Postgres database URL for the catalog | -| `AWS_REGION` | Required | AWS region | -| `AWS_S3_BUCKET` | Required | AWS S3 bucket name | -| `AWS_ACCESS_KEY_ID` | Required | AWS access key ID | -| `AWS_SECRET_ACCESS_KEY` | Required | AWS secret access key | -| `AWS_S3_ENDPOINT` | `s3.amazonaws.com` | Custom S3 endpoint URL | -| `BEMIDB_LOG_LEVEL` | `INFO` | Log level: `ERROR`, `WARN`, `INFO`, `DEBUG`, `TRACE` | -| `BEMIDB_DISABLE_ANONYMOUS_ANALYTICS` | `false` | Disable collection of anonymous usage metadata | +| Variable | Required | Purpose | +| --- | --- | --- | +| `DATABASE_URL` | Yes | Source Postgres connection URL | +| `OPENAI_API_KEY` | No | Embedding generation for semantic and hybrid search | +| `PGSTACK_PASSWORD` | No | SCRAM authentication for the SQL endpoint | ## Architecture -BemiDB consists of the following main components packaged in a single Docker image: - -- **Database Server**: implements the [Postgres protocol](https://www.postgresql.org/docs/current/protocol.html) to enable Postgres compatibility. -- **Query Engine**: embeds the [DuckDB](https://duckdb.org/) query engine to run analytical queries. -- **Storage Layer**: uses the [Iceberg](https://iceberg.apache.org/) open table format to store data in columnar compressed Parquet files. -- **Data Syncers**: to connect to different data sources and sync data to the storage layer. - -Architecture - -## Benchmark - -BemiDB is optimized for analytical workloads and can run complex queries up to 2000x faster than regular Postgres. - -On the TPC-H benchmark with 22 sequential queries, BemiDB outperforms Postgres by a significant margin: - -* Scale factor: 0.1 - * BemiDB unindexed: 2.3s 👍 - * Postgres unindexed: 1h23m13s 👎 (2,170x slower) - * Postgres indexed: 1.5s 👍 (99.97% bottleneck reduction) -* Scale factor: 1.0 - * BemiDB unindexed: 25.6s 👍 - * Postgres unindexed: ∞ 👎 (infinitely slower) - * Postgres indexed: 1h34m40s 👎 (220x slower) - -See the [benchmark](/benchmark) directory for more details. - -## Data type mapping - -Primitive data types are mapped as follows: - -| PostgreSQL | Parquet | Iceberg | -|-------------------------------------------------------------|-----------------------------------------------------------------|----------------------------------| -| `bool` | `BOOLEAN` | `boolean` | -| `bit`, `int2`, `int4` | `INT32` | `int` | -| `int8`, | `FIXED_LEN_BYTE_ARRAY(9)` (`DECIMAL(38, 0)` / `DECIMAL(38, 0)`) | `decimal(38, 0)` | -| `xid` | `INT64` | `long` | -| `xid8`, `interval` | `FIXED_LEN_BYTE_ARRAY(9)` (`DECIMAL(38, 6)` / `DECIMAL(38, 6)`) | `decimal(38, 6)` | -| `float4` | `FLOAT` | `float` | -| `float8` | `DOUBLE` | `double` | -| `numeric` | `FIXED_LEN_BYTE_ARRAY(16)` (`DECIMAL(P, S)` / `DECIMAL(P, S)`) | `decimal(P, S)` | -| `date` | `INT32` (`DATE` / `DATE`) | `date` | -| `time`, `timetz` | `INT64` (`TIME_MICROS`) | `time` | -| `timestamp`, `timestamptz` | `INT64` (`TIMESTAMP_MICROS`) | `timestamp` | -| `varchar`, `text`, `bpchar` | `BYTE_ARRAY` (`STRING` / `UTF8`) | `string` | -| `uuid` | `BYTE_ARRAY` (`STRING` / `UTF8`) | `string` | -| `bytea` | `BYTE_ARRAY` | `binary` | -| `point`, `line`, `lseg`, `box`, `path`, `polygon`, `circle` | `BYTE_ARRAY` (`STRING` / `UTF8`) | `string` | -| `cidr`, `inet`, `macaddr`, `macaddr8` | `BYTE_ARRAY` (`STRING` / `UTF8`) | `string` | -| `tsvector`, `xml`, `pg_snapshot` | `BYTE_ARRAY` (`STRING` / `UTF8`) | `string` | -| `json`, `jsonb` | `BYTE_ARRAY` (`STRING` / `UTF8`) | `string` (JSON logical type) | -| `_*` (array) | `LIST` `*` | `list` | -| `*` (user-defined type) | `BYTE_ARRAY` (`STRING` / `UTF8`) | `string` | - -Note that Postgres `json` and `jsonb` types are implemented as JSON logical types and stored as strings (Parquet and Iceberg don't support unstructured data types). -You can query JSON columns using standard operators, for example: - -```sql -SELECT * FROM [TABLE] WHERE [JSON_COLUMN]->>'[JSON_KEY]' = '[JSON_VALUE]'; -``` - -## Roadmap - -- [x] Postgres protocol and query support -- [x] Iceberg write operations -- [x] Selective data syncing from Postgres -- [x] Postgres compatibility with other tools - - [x] psql - - [x] Metabase - - [x] TablePlus - - [x] DBeaver - - [x] pgAdmin - - [x] Grafana - - [x] Retool - - [ ] Jupyter notebooks ([#27](https://github.com/BemiHQ/BemiDB/issues/27)) -- [x] Data syncing from other sources - - [x] Amplitude (incremental) - - [x] Attio CRM (full-refresh) - - [x] Postgres (full-refresh) - - [x] Dialpad (real-time) - - [ ] HubSpot - - [ ] Stripe - - [ ] Google Sheets - - [ ] MySQL - - [ ] SQLite ([#24](https://github.com/BemiHQ/BemiDB/issues/24)) -- [x] Iceberg tables compaction -- [x] Packaging in a Docker image -- [x] Table compaction without Trino as a dependency -- [x] Materialized views -- [x] Transformations with dbt ([#25](https://github.com/BemiHQ/BemiDB/issues/25)) -- [ ] Partitioned tables ([#15](https://github.com/BemiHQ/BemiDB/issues/15)) - -Are you looking for real-time data syncing? Check out [BemiDB Cloud](https://bemidb.com), our managed data platform. +```text + Your Postgres + | + | logical replication + v ++----------------- PgStack container -------------------+ +| | +| CDC --> NATS --> Processor | +| | | +| +--------+--------+ | +| | | | +| v v | +| Audit: Iceberg Search: BM25 | +| + Parquet + Lance vectors | +| | | | +| +--------+--------+ | +| | | +| v | +| Postgres-compatible server | +| with embedded DuckDB | +| | ++--------------------------+----------------------------+ + | + | wire protocol + v + Postgres clients +``` + +Audit stores Parquet with Iceberg metadata. Search uses Lance for BM25 and optional vectors. DuckDB runs inside PgStack's Postgres-compatible server to execute SQL over this data. + +## OSS vs Cloud + +The open-source core provides the Search replica and Audit history through SQL. [PgStack Cloud](https://pgstack.io/) adds the managed platform: + +- **Web Control Panel**: database connections, projects, and product settings. +- **Team Management**: organizations, team membership, and shared projects. +- **Audit Trail UI**: change history, filters, and record inspection. +- **Fine-Grained Configuration**: table and column selection for Search and Audit. +- **Flexible Audit Retention**: configurable history for troubleshooting and compliance. +- **Managed Embeddings**: included embedding generation without a separate model API account. +- **Autoscaling**: managed capacity for Audit and Search workloads. +- **Production Security**: encryption, tenant isolation, IP allow rules, and SSH and VPN tunneling. +- **Automatic Updates**: service improvements, fixes, and infrastructure maintenance. +- **Support**: priority response and escalation options, with dedicated Slack support. + +The bundled image is designed for local development and evaluation. For production workloads, PgStack Cloud provides a fully managed service. ## License -Distributed under the terms of the [AGPL-3.0 License](/LICENSE). If you need to modify and distribute the code, please release it to contribute back to the open-source community. +This project is distributed under [AGPL-3.0](LICENSE). + +See [CONTRIBUTING.md](CONTRIBUTING.md) for development. For vulnerability reports, see [SECURITY.md](SECURITY.md). diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..b13c3aa --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,7 @@ +# Security + +Please report suspected vulnerabilities privately to **hi@pgstack.io**, with a reproduction and the affected version. Do not post credentials or exploit details in a public issue before coordination. + +The bundled image is for a trusted local development machine. Bind its SQL port to `127.0.0.1`. Local connections are passwordless by default. Set `PGSTACK_PASSWORD` to require SCRAM-SHA-256 authentication, especially when publishing a port. It does not provide TLS, tenant isolation, or a sandbox for untrusted SQL. Source database credentials and the OpenAI key must remain private. + +Use current PgStack releases; BemiDB 1.x deployment instructions do not describe this runtime. diff --git a/assets/pgstack-logo.png b/assets/pgstack-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..54480196069a3b311c2f4af3a2e15c75d7f34f44 GIT binary patch literal 218632 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

    ooOBCxxqP?UNEQAMQlJFG>A5 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 literal 0 HcmV?d00001 diff --git a/benchmark/README.md b/benchmark/README.md deleted file mode 100644 index bb0d0d6..0000000 --- a/benchmark/README.md +++ /dev/null @@ -1,55 +0,0 @@ -# BemiDB Bechmark - -We use the standardized TPC-H benchmark to compare PostgreSQL with BemiDB. -This benchmark measures the performance of databases that handle large volumes of data and perform business-oriented ad-hoc queries (OLAP). - -![TPC-H database structure](/img/tpc-h_database_structure.png) - -## Running the TPC-H Benchmark - -### PostgreSQL - -Download and unzip `TPC-H_generated_data_s*.zip` from the latest release into the "benchmark/data" directory and then set up a local PostgreSQL database: - -```sh -make pg-init -make pg-up -make pg-create -``` - -Run the benchmark queries with PostgreSQL: - -```sh -make pg-benchmark -``` - -Run the benchmark queries with indexed PostgreSQL: - -```sh -make pg-index -make pg-benchmark -``` - -### BemiDB - -Set up a local BemiDB database: - -```sh -make sync -make up -``` - -Run the benchmark queries with BemiDB: - -```sh -make benchmark -``` - -## Generating the TPC-H Data - -Install the TPC-H benchmark kit: - -```sh -make tpch-install MACHINE=MACOS # MACHINE=LINUX for Linux -make tpch-generate SCALE_FACTOR=1 -``` diff --git a/benchmark/data/create-indexes.ddl b/benchmark/data/create-indexes.ddl deleted file mode 100644 index e1a21e9..0000000 --- a/benchmark/data/create-indexes.ddl +++ /dev/null @@ -1,15 +0,0 @@ -CREATE INDEX IF NOT EXISTS idx_part_name ON part (p_name varchar_pattern_ops); -CREATE INDEX IF NOT EXISTS idx_part_brand_container ON part (p_brand, p_container, p_partkey); -CREATE INDEX IF NOT EXISTS idx_part_partkey ON part (p_partkey); - -CREATE INDEX IF NOT EXISTS idx_partsupp_part_supp ON partsupp (ps_partkey, ps_suppkey); -CREATE INDEX IF NOT EXISTS idx_partsupp_suppkey ON partsupp (ps_suppkey); - -CREATE INDEX IF NOT EXISTS idx_lineitem_dates ON lineitem (l_shipdate); -CREATE INDEX IF NOT EXISTS idx_lineitem_part_supp ON lineitem (l_partkey, l_suppkey); -CREATE INDEX IF NOT EXISTS idx_lineitem_part_qty ON lineitem (l_partkey, l_quantity, l_extendedprice); - -CREATE INDEX IF NOT EXISTS idx_nation_name ON nation (n_name); -CREATE INDEX IF NOT EXISTS idx_nation_nationkey ON nation (n_nationkey); - -CREATE INDEX IF NOT EXISTS idx_supplier_nationkey ON supplier (s_nationkey); diff --git a/benchmark/data/create-tables.ddl b/benchmark/data/create-tables.ddl deleted file mode 100644 index 89efe56..0000000 --- a/benchmark/data/create-tables.ddl +++ /dev/null @@ -1,70 +0,0 @@ --- Sccsid: @(#)dss.ddl 2.1.8.1 -CREATE TABLE NATION ( N_NATIONKEY INTEGER NOT NULL, - N_NAME CHAR(25) NOT NULL, - N_REGIONKEY INTEGER NOT NULL, - N_COMMENT VARCHAR(152)); - -CREATE TABLE REGION ( R_REGIONKEY INTEGER NOT NULL, - R_NAME CHAR(25) NOT NULL, - R_COMMENT VARCHAR(152)); - -CREATE TABLE PART ( P_PARTKEY INTEGER NOT NULL, - P_NAME VARCHAR(55) NOT NULL, - P_MFGR CHAR(25) NOT NULL, - P_BRAND CHAR(10) NOT NULL, - P_TYPE VARCHAR(25) NOT NULL, - P_SIZE INTEGER NOT NULL, - P_CONTAINER CHAR(10) NOT NULL, - P_RETAILPRICE DECIMAL(15,2) NOT NULL, - P_COMMENT VARCHAR(23) NOT NULL ); - -CREATE TABLE SUPPLIER ( S_SUPPKEY INTEGER NOT NULL, - S_NAME CHAR(25) NOT NULL, - S_ADDRESS VARCHAR(40) NOT NULL, - S_NATIONKEY INTEGER NOT NULL, - S_PHONE CHAR(15) NOT NULL, - S_ACCTBAL DECIMAL(15,2) NOT NULL, - S_COMMENT VARCHAR(101) NOT NULL); - -CREATE TABLE PARTSUPP ( PS_PARTKEY INTEGER NOT NULL, - PS_SUPPKEY INTEGER NOT NULL, - PS_AVAILQTY INTEGER NOT NULL, - PS_SUPPLYCOST DECIMAL(15,2) NOT NULL, - PS_COMMENT VARCHAR(199) NOT NULL ); - -CREATE TABLE CUSTOMER ( C_CUSTKEY INTEGER NOT NULL, - C_NAME VARCHAR(25) NOT NULL, - C_ADDRESS VARCHAR(40) NOT NULL, - C_NATIONKEY INTEGER NOT NULL, - C_PHONE CHAR(15) NOT NULL, - C_ACCTBAL DECIMAL(15,2) NOT NULL, - C_MKTSEGMENT CHAR(10) NOT NULL, - C_COMMENT VARCHAR(117) NOT NULL); - -CREATE TABLE ORDERS ( O_ORDERKEY INTEGER NOT NULL, - O_CUSTKEY INTEGER NOT NULL, - O_ORDERSTATUS CHAR(1) NOT NULL, - O_TOTALPRICE DECIMAL(15,2) NOT NULL, - O_ORDERDATE DATE NOT NULL, - O_ORDERPRIORITY CHAR(15) NOT NULL, - O_CLERK CHAR(15) NOT NULL, - O_SHIPPRIORITY INTEGER NOT NULL, - O_COMMENT VARCHAR(79) NOT NULL); - -CREATE TABLE LINEITEM ( L_ORDERKEY INTEGER NOT NULL, - L_PARTKEY INTEGER NOT NULL, - L_SUPPKEY INTEGER NOT NULL, - L_LINENUMBER INTEGER NOT NULL, - L_QUANTITY DECIMAL(15,2) NOT NULL, - L_EXTENDEDPRICE DECIMAL(15,2) NOT NULL, - L_DISCOUNT DECIMAL(15,2) NOT NULL, - L_TAX DECIMAL(15,2) NOT NULL, - L_RETURNFLAG CHAR(1) NOT NULL, - L_LINESTATUS CHAR(1) NOT NULL, - L_SHIPDATE DATE NOT NULL, - L_COMMITDATE DATE NOT NULL, - L_RECEIPTDATE DATE NOT NULL, - L_SHIPINSTRUCT CHAR(25) NOT NULL, - L_SHIPMODE CHAR(10) NOT NULL, - L_COMMENT VARCHAR(44) NOT NULL); - diff --git a/benchmark/queries.sql b/benchmark/queries.sql deleted file mode 100644 index cdf02be..0000000 --- a/benchmark/queries.sql +++ /dev/null @@ -1,694 +0,0 @@ --- TPC TPC-H Parameter Substitution (Version 2.17.3 build 0) --- using 1730829976 as a seed to the RNG - - -select - l_returnflag, - l_linestatus, - sum(l_quantity) as sum_qty, - sum(l_extendedprice) as sum_base_price, - sum(l_extendedprice * (1 - l_discount)) as sum_disc_price, - sum(l_extendedprice * (1 - l_discount) * (1 + l_tax)) as sum_charge, - avg(l_quantity) as avg_qty, - avg(l_extendedprice) as avg_price, - avg(l_discount) as avg_disc, - count(*) as count_order -from - lineitem -where - l_shipdate <= date '1998-12-01' - interval '102 day' -group by - l_returnflag, - l_linestatus -order by - l_returnflag, - l_linestatus -; - - -select - s_acctbal, - s_name, - n_name, - p_partkey, - p_mfgr, - s_address, - s_phone, - s_comment -from - part, - supplier, - partsupp, - nation, - region -where - p_partkey = ps_partkey - and s_suppkey = ps_suppkey - and p_size = 35 - and p_type like '%COPPER' - and s_nationkey = n_nationkey - and n_regionkey = r_regionkey - and r_name = 'EUROPE' - and ps_supplycost = ( - select - min(ps_supplycost) - from - partsupp, - supplier, - nation, - region - where - p_partkey = ps_partkey - and s_suppkey = ps_suppkey - and s_nationkey = n_nationkey - and n_regionkey = r_regionkey - and r_name = 'EUROPE' - ) -order by - s_acctbal desc, - n_name, - s_name, - p_partkey -limit 100; - - -select - l_orderkey, - sum(l_extendedprice * (1 - l_discount)) as revenue, - o_orderdate, - o_shippriority -from - customer, - orders, - lineitem -where - c_mktsegment = 'MACHINERY' - and c_custkey = o_custkey - and l_orderkey = o_orderkey - and o_orderdate < date '1995-03-24' - and l_shipdate > date '1995-03-24' -group by - l_orderkey, - o_orderdate, - o_shippriority -order by - revenue desc, - o_orderdate -limit 10; - - -select - o_orderpriority, - count(*) as order_count -from - orders -where - o_orderdate >= date '1996-08-01' - and o_orderdate < date '1996-08-01' + interval '3 months' - and exists ( - select - * - from - lineitem - where - l_orderkey = o_orderkey - and l_commitdate < l_receiptdate - ) -group by - o_orderpriority -order by - o_orderpriority -; - - -select - n_name, - sum(l_extendedprice * (1 - l_discount)) as revenue -from - customer, - orders, - lineitem, - supplier, - nation, - region -where - c_custkey = o_custkey - and l_orderkey = o_orderkey - and l_suppkey = s_suppkey - and c_nationkey = s_nationkey - and s_nationkey = n_nationkey - and n_regionkey = r_regionkey - and r_name = 'AMERICA' - and o_orderdate >= date '1997-01-01' - and o_orderdate < date '1997-01-01' + interval '1 year' -group by - n_name -order by - revenue desc -; - - -select - sum(l_extendedprice * l_discount) as revenue -from - lineitem -where - l_shipdate >= date '1997-01-01' - and l_shipdate < date '1997-01-01' + interval '1 year' - and l_discount between 0.06 - 0.01 and 0.06 + 0.01 - and l_quantity < 25 -; - - -select - supp_nation, - cust_nation, - l_year, - sum(volume) as revenue -from - ( - select - n1.n_name as supp_nation, - n2.n_name as cust_nation, - extract(year from l_shipdate) as l_year, - l_extendedprice * (1 - l_discount) as volume - from - supplier, - lineitem, - orders, - customer, - nation n1, - nation n2 - where - s_suppkey = l_suppkey - and o_orderkey = l_orderkey - and c_custkey = o_custkey - and s_nationkey = n1.n_nationkey - and c_nationkey = n2.n_nationkey - and ( - (n1.n_name = 'MOROCCO' and n2.n_name = 'SAUDI ARABIA') - or (n1.n_name = 'SAUDI ARABIA' and n2.n_name = 'MOROCCO') - ) - and l_shipdate between date '1995-01-01' and date '1996-12-31' - ) as shipping -group by - supp_nation, - cust_nation, - l_year -order by - supp_nation, - cust_nation, - l_year -; - - -select - o_year, - sum(case - when nation = 'SAUDI ARABIA' then volume - else 0 - end) / sum(volume) as mkt_share -from - ( - select - extract(year from o_orderdate) as o_year, - l_extendedprice * (1 - l_discount) as volume, - n2.n_name as nation - from - part, - supplier, - lineitem, - orders, - customer, - nation n1, - nation n2, - region - where - p_partkey = l_partkey - and s_suppkey = l_suppkey - and l_orderkey = o_orderkey - and o_custkey = c_custkey - and c_nationkey = n1.n_nationkey - and n1.n_regionkey = r_regionkey - and r_name = 'MIDDLE EAST' - and s_nationkey = n2.n_nationkey - and o_orderdate between date '1995-01-01' and date '1996-12-31' - and p_type = 'LARGE BRUSHED BRASS' - ) as all_nations -group by - o_year -order by - o_year -; - - -select - nation, - o_year, - sum(amount) as sum_profit -from - ( - select - n_name as nation, - extract(year from o_orderdate) as o_year, - l_extendedprice * (1 - l_discount) - ps_supplycost * l_quantity as amount - from - part, - supplier, - lineitem, - partsupp, - orders, - nation - where - s_suppkey = l_suppkey - and ps_suppkey = l_suppkey - and ps_partkey = l_partkey - and p_partkey = l_partkey - and o_orderkey = l_orderkey - and s_nationkey = n_nationkey - and p_name like '%orchid%' - ) as profit -group by - nation, - o_year -order by - nation, - o_year desc -; - - -select - c_custkey, - c_name, - sum(l_extendedprice * (1 - l_discount)) as revenue, - c_acctbal, - n_name, - c_address, - c_phone, - c_comment -from - customer, - orders, - lineitem, - nation -where - c_custkey = o_custkey - and l_orderkey = o_orderkey - and o_orderdate >= date '1994-03-01' - and o_orderdate < date '1994-03-01' + interval '3 months' - and l_returnflag = 'R' - and c_nationkey = n_nationkey -group by - c_custkey, - c_name, - c_acctbal, - c_phone, - n_name, - c_address, - c_comment -order by - revenue desc -limit 20; - - -select - ps_partkey, - sum(ps_supplycost * ps_availqty) as value -from - partsupp, - supplier, - nation -where - ps_suppkey = s_suppkey - and s_nationkey = n_nationkey - and n_name = 'SAUDI ARABIA' -group by - ps_partkey having - sum(ps_supplycost * ps_availqty) > ( - select - sum(ps_supplycost * ps_availqty) * 0.0010000000 - from - partsupp, - supplier, - nation - where - ps_suppkey = s_suppkey - and s_nationkey = n_nationkey - and n_name = 'SAUDI ARABIA' - ) -order by - value desc -; - - -select - l_shipmode, - sum(case - when o_orderpriority = '1-URGENT' - or o_orderpriority = '2-HIGH' - then 1 - else 0 - end) as high_line_count, - sum(case - when o_orderpriority <> '1-URGENT' - and o_orderpriority <> '2-HIGH' - then 1 - else 0 - end) as low_line_count -from - orders, - lineitem -where - o_orderkey = l_orderkey - and l_shipmode in ('REG AIR', 'AIR') - and l_commitdate < l_receiptdate - and l_shipdate < l_commitdate - and l_receiptdate >= date '1995-01-01' - and l_receiptdate < date '1995-01-01' + interval '1 year' -group by - l_shipmode -order by - l_shipmode -; - - -select - c_count, - count(*) as custdist -from - ( - select - c_custkey, - count(o_orderkey) - from - customer left outer join orders on - c_custkey = o_custkey - and o_comment not like '%special%accounts%' - group by - c_custkey - ) as c_orders (c_custkey, c_count) -group by - c_count -order by - custdist desc, - c_count desc -; - - -select - 100.00 * sum(case - when p_type like 'PROMO%' - then l_extendedprice * (1 - l_discount) - else 0 - end) / sum(l_extendedprice * (1 - l_discount)) as promo_revenue -from - lineitem, - part -where - l_partkey = p_partkey - and l_shipdate >= date '1995-07-01' - and l_shipdate < date '1995-07-01' + interval '1 month' -; - - with revenue (supplier_no, total_revenue) as ( - select - l_suppkey, - sum(l_extendedprice * (1-l_discount)) - from - lineitem - where - l_shipdate >= date '1997-06-01' - and l_shipdate < date '1997-06-01' + interval '3 months' - group by - l_suppkey - ) - - - select - s_suppkey, - s_name, - s_address, - s_phone, - total_revenue - from - supplier, - revenue - where - s_suppkey = supplier_no - and total_revenue = ( - select - max(total_revenue) - from - revenue - ) - order by - s_suppkey - ; - - -select - p_brand, - p_type, - p_size, - count(distinct ps_suppkey) as supplier_cnt -from - partsupp, - part -where - p_partkey = ps_partkey - and p_brand <> 'Brand#23' - and p_type not like 'LARGE PLATED%' - and p_size in (19, 9, 15, 33, 43, 41, 27, 36) - and ps_suppkey not in ( - select - s_suppkey - from - supplier - where - s_comment like '%Customer%Complaints%' - ) -group by - p_brand, - p_type, - p_size -order by - supplier_cnt desc, - p_brand, - p_type, - p_size -; - - -select - sum(l_extendedprice) / 7.0 as avg_yearly -from - lineitem, - part -where - p_partkey = l_partkey - and p_brand = 'Brand#33' - and p_container = 'LG CAN' - and l_quantity < ( - select - 0.2 * avg(l_quantity) - from - lineitem - where - l_partkey = p_partkey - ) -; - - -select - c_name, - c_custkey, - o_orderkey, - o_orderdate, - o_totalprice, - sum(l_quantity) -from - customer, - orders, - lineitem -where - o_orderkey in ( - select - l_orderkey - from - lineitem - group by - l_orderkey having - sum(l_quantity) > 314 - ) - and c_custkey = o_custkey - and o_orderkey = l_orderkey -group by - c_name, - c_custkey, - o_orderkey, - o_orderdate, - o_totalprice -order by - o_totalprice desc, - o_orderdate -limit 100; - - -select - sum(l_extendedprice* (1 - l_discount)) as revenue -from - lineitem, - part -where - ( - p_partkey = l_partkey - and p_brand = 'Brand#21' - and p_container in ('SM CASE', 'SM BOX', 'SM PACK', 'SM PKG') - and l_quantity >= 5 and l_quantity <= 5 + 10 - and p_size between 1 and 5 - and l_shipmode in ('AIR', 'AIR REG') - and l_shipinstruct = 'DELIVER IN PERSON' - ) - or - ( - p_partkey = l_partkey - and p_brand = 'Brand#24' - and p_container in ('MED BAG', 'MED BOX', 'MED PKG', 'MED PACK') - and l_quantity >= 17 and l_quantity <= 17 + 10 - and p_size between 1 and 10 - and l_shipmode in ('AIR', 'AIR REG') - and l_shipinstruct = 'DELIVER IN PERSON' - ) - or - ( - p_partkey = l_partkey - and p_brand = 'Brand#54' - and p_container in ('LG CASE', 'LG BOX', 'LG PACK', 'LG PKG') - and l_quantity >= 29 and l_quantity <= 29 + 10 - and p_size between 1 and 15 - and l_shipmode in ('AIR', 'AIR REG') - and l_shipinstruct = 'DELIVER IN PERSON' - ) -; - - -select - s_name, - s_address -from - supplier, - nation -where - s_suppkey in ( - select - ps_suppkey - from - partsupp - where - ps_partkey in ( - select - p_partkey - from - part - where - p_name like 'chartreuse%' - ) - and ps_availqty > ( - select - 0.5 * sum(l_quantity) - from - lineitem - where - l_partkey = ps_partkey - and l_suppkey = ps_suppkey - and l_shipdate >= date '1994-01-01' - and l_shipdate < date '1994-01-01' + interval '1 year' - ) - ) - and s_nationkey = n_nationkey - and n_name = 'MOROCCO' -order by - s_name -; - - -select - s_name, - count(*) as numwait -from - supplier, - lineitem l1, - orders, - nation -where - s_suppkey = l1.l_suppkey - and o_orderkey = l1.l_orderkey - and o_orderstatus = 'F' - and l1.l_receiptdate > l1.l_commitdate - and exists ( - select - * - from - lineitem l2 - where - l2.l_orderkey = l1.l_orderkey - and l2.l_suppkey <> l1.l_suppkey - ) - and not exists ( - select - * - from - lineitem l3 - where - l3.l_orderkey = l1.l_orderkey - and l3.l_suppkey <> l1.l_suppkey - and l3.l_receiptdate > l3.l_commitdate - ) - and s_nationkey = n_nationkey - and n_name = 'FRANCE' -group by - s_name -order by - numwait desc, - s_name -limit 100; - - -select - cntrycode, - count(*) as numcust, - sum(c_acctbal) as totacctbal -from - ( - select - substring(c_phone from 1 for 2) as cntrycode, - c_acctbal - from - customer - where - substring(c_phone from 1 for 2) in - ('25', '31', '30', '23', '27', '11', '15') - and c_acctbal > ( - select - avg(c_acctbal) - from - customer - where - c_acctbal > 0.00 - and substring(c_phone from 1 for 2) in - ('25', '31', '30', '23', '27', '11', '15') - ) - and not exists ( - select - * - from - orders - where - o_custkey = c_custkey - ) - ) as custsale -group by - cntrycode -order by - cntrycode -; diff --git a/benchmark/query-templates/1.sql b/benchmark/query-templates/1.sql deleted file mode 100644 index 48369f6..0000000 --- a/benchmark/query-templates/1.sql +++ /dev/null @@ -1,28 +0,0 @@ --- $ID$ --- TPC-H/TPC-R Pricing Summary Report Query (Q1) --- Functional Query Definition --- Approved February 1998 -:x -:o -select - l_returnflag, - l_linestatus, - sum(l_quantity) as sum_qty, - sum(l_extendedprice) as sum_base_price, - sum(l_extendedprice * (1 - l_discount)) as sum_disc_price, - sum(l_extendedprice * (1 - l_discount) * (1 + l_tax)) as sum_charge, - avg(l_quantity) as avg_qty, - avg(l_extendedprice) as avg_price, - avg(l_discount) as avg_disc, - count(*) as count_order -from - lineitem -where - l_shipdate <= date '1998-12-01' - interval ':1 day' -group by - l_returnflag, - l_linestatus -order by - l_returnflag, - l_linestatus; -:n -1 diff --git a/benchmark/query-templates/10.sql b/benchmark/query-templates/10.sql deleted file mode 100644 index 3d7eda9..0000000 --- a/benchmark/query-templates/10.sql +++ /dev/null @@ -1,38 +0,0 @@ --- $ID$ --- TPC-H/TPC-R Returned Item Reporting Query (Q10) --- Functional Query Definition --- Approved February 1998 -:x -:o -select - c_custkey, - c_name, - sum(l_extendedprice * (1 - l_discount)) as revenue, - c_acctbal, - n_name, - c_address, - c_phone, - c_comment -from - customer, - orders, - lineitem, - nation -where - c_custkey = o_custkey - and l_orderkey = o_orderkey - and o_orderdate >= date ':1' - and o_orderdate < date ':1' + interval '3 months' - and l_returnflag = 'R' - and c_nationkey = n_nationkey -group by - c_custkey, - c_name, - c_acctbal, - c_phone, - n_name, - c_address, - c_comment -order by - revenue desc; -:n 20 diff --git a/benchmark/query-templates/11.sql b/benchmark/query-templates/11.sql deleted file mode 100644 index 8d8b744..0000000 --- a/benchmark/query-templates/11.sql +++ /dev/null @@ -1,34 +0,0 @@ --- $ID$ --- TPC-H/TPC-R Important Stock Identification Query (Q11) --- Functional Query Definition --- Approved February 1998 -:x -:o -select - ps_partkey, - sum(ps_supplycost * ps_availqty) as value -from - partsupp, - supplier, - nation -where - ps_suppkey = s_suppkey - and s_nationkey = n_nationkey - and n_name = ':1' -group by - ps_partkey having - sum(ps_supplycost * ps_availqty) > ( - select - sum(ps_supplycost * ps_availqty) * :2 - from - partsupp, - supplier, - nation - where - ps_suppkey = s_suppkey - and s_nationkey = n_nationkey - and n_name = ':1' - ) -order by - value desc; -:n -1 diff --git a/benchmark/query-templates/12.sql b/benchmark/query-templates/12.sql deleted file mode 100644 index 3bb9005..0000000 --- a/benchmark/query-templates/12.sql +++ /dev/null @@ -1,35 +0,0 @@ --- $ID$ --- TPC-H/TPC-R Shipping Modes and Order Priority Query (Q12) --- Functional Query Definition --- Approved February 1998 -:x -:o -select - l_shipmode, - sum(case - when o_orderpriority = '1-URGENT' - or o_orderpriority = '2-HIGH' - then 1 - else 0 - end) as high_line_count, - sum(case - when o_orderpriority <> '1-URGENT' - and o_orderpriority <> '2-HIGH' - then 1 - else 0 - end) as low_line_count -from - orders, - lineitem -where - o_orderkey = l_orderkey - and l_shipmode in (':1', ':2') - and l_commitdate < l_receiptdate - and l_shipdate < l_commitdate - and l_receiptdate >= date ':3' - and l_receiptdate < date ':3' + interval '1 year' -group by - l_shipmode -order by - l_shipmode; -:n -1 diff --git a/benchmark/query-templates/13.sql b/benchmark/query-templates/13.sql deleted file mode 100644 index 20dd693..0000000 --- a/benchmark/query-templates/13.sql +++ /dev/null @@ -1,27 +0,0 @@ --- $ID$ --- TPC-H/TPC-R Customer Distribution Query (Q13) --- Functional Query Definition --- Approved February 1998 -:x -:o -select - c_count, - count(*) as custdist -from - ( - select - c_custkey, - count(o_orderkey) - from - customer left outer join orders on - c_custkey = o_custkey - and o_comment not like '%:1%:2%' - group by - c_custkey - ) as c_orders (c_custkey, c_count) -group by - c_count -order by - custdist desc, - c_count desc; -:n -1 diff --git a/benchmark/query-templates/14.sql b/benchmark/query-templates/14.sql deleted file mode 100644 index e066528..0000000 --- a/benchmark/query-templates/14.sql +++ /dev/null @@ -1,20 +0,0 @@ --- $ID$ --- TPC-H/TPC-R Promotion Effect Query (Q14) --- Functional Query Definition --- Approved February 1998 -:x -:o -select - 100.00 * sum(case - when p_type like 'PROMO%' - then l_extendedprice * (1 - l_discount) - else 0 - end) / sum(l_extendedprice * (1 - l_discount)) as promo_revenue -from - lineitem, - part -where - l_partkey = p_partkey - and l_shipdate >= date ':1' - and l_shipdate < date ':1' + interval '1 month'; -:n -1 diff --git a/benchmark/query-templates/15.sql b/benchmark/query-templates/15.sql deleted file mode 100644 index b293905..0000000 --- a/benchmark/query-templates/15.sql +++ /dev/null @@ -1,41 +0,0 @@ --- $ID$ --- TPC-H/TPC-R Top Supplier Query (Q15) --- Variant A --- Approved February 1998 --- --- BemiDB: Variant without "view" -:x - with revenue (supplier_no, total_revenue) as ( - select - l_suppkey, - sum(l_extendedprice * (1-l_discount)) - from - lineitem - where - l_shipdate >= date ':1' - and l_shipdate < date ':1' + interval '3 months' - group by - l_suppkey - ) - - :o - select - s_suppkey, - s_name, - s_address, - s_phone, - total_revenue - from - supplier, - revenue - where - s_suppkey = supplier_no - and total_revenue = ( - select - max(total_revenue) - from - revenue - ) - order by - s_suppkey; - :n -1 diff --git a/benchmark/query-templates/16.sql b/benchmark/query-templates/16.sql deleted file mode 100644 index f07a965..0000000 --- a/benchmark/query-templates/16.sql +++ /dev/null @@ -1,37 +0,0 @@ --- $ID$ --- TPC-H/TPC-R Parts/Supplier Relationship Query (Q16) --- Functional Query Definition --- Approved February 1998 -:x -:o -select - p_brand, - p_type, - p_size, - count(distinct ps_suppkey) as supplier_cnt -from - partsupp, - part -where - p_partkey = ps_partkey - and p_brand <> ':1' - and p_type not like ':2%' - and p_size in (:3, :4, :5, :6, :7, :8, :9, :10) - and ps_suppkey not in ( - select - s_suppkey - from - supplier - where - s_comment like '%Customer%Complaints%' - ) -group by - p_brand, - p_type, - p_size -order by - supplier_cnt desc, - p_brand, - p_type, - p_size; -:n -1 diff --git a/benchmark/query-templates/17.sql b/benchmark/query-templates/17.sql deleted file mode 100644 index 14534f6..0000000 --- a/benchmark/query-templates/17.sql +++ /dev/null @@ -1,26 +0,0 @@ --- $ID$ --- TPC-H/TPC-R Small-Quantity-Order Revenue Query (Q17) --- Functional Query Definition --- Approved February 1998 --- --- BemiDB: 20s with unindexed PostgreSQL -:x -:o -select - sum(l_extendedprice) / 7.0 as avg_yearly -from - lineitem, - part -where - p_partkey = l_partkey - and p_brand = ':1' - and p_container = ':2' - and l_quantity < ( - select - 0.2 * avg(l_quantity) - from - lineitem - where - l_partkey = p_partkey - ); -:n -1 diff --git a/benchmark/query-templates/18.sql b/benchmark/query-templates/18.sql deleted file mode 100644 index 3f7e125..0000000 --- a/benchmark/query-templates/18.sql +++ /dev/null @@ -1,39 +0,0 @@ --- $ID$ --- TPC-H/TPC-R Large Volume Customer Query (Q18) --- Function Query Definition --- Approved February 1998 -:x -:o -select - c_name, - c_custkey, - o_orderkey, - o_orderdate, - o_totalprice, - sum(l_quantity) -from - customer, - orders, - lineitem -where - o_orderkey in ( - select - l_orderkey - from - lineitem - group by - l_orderkey having - sum(l_quantity) > :1 - ) - and c_custkey = o_custkey - and o_orderkey = l_orderkey -group by - c_name, - c_custkey, - o_orderkey, - o_orderdate, - o_totalprice -order by - o_totalprice desc, - o_orderdate; -:n 100 diff --git a/benchmark/query-templates/19.sql b/benchmark/query-templates/19.sql deleted file mode 100644 index a9c6e5d..0000000 --- a/benchmark/query-templates/19.sql +++ /dev/null @@ -1,42 +0,0 @@ --- $ID$ --- TPC-H/TPC-R Discounted Revenue Query (Q19) --- Functional Query Definition --- Approved February 1998 -:x -:o -select - sum(l_extendedprice* (1 - l_discount)) as revenue -from - lineitem, - part -where - ( - p_partkey = l_partkey - and p_brand = ':1' - and p_container in ('SM CASE', 'SM BOX', 'SM PACK', 'SM PKG') - and l_quantity >= :4 and l_quantity <= :4 + 10 - and p_size between 1 and 5 - and l_shipmode in ('AIR', 'AIR REG') - and l_shipinstruct = 'DELIVER IN PERSON' - ) - or - ( - p_partkey = l_partkey - and p_brand = ':2' - and p_container in ('MED BAG', 'MED BOX', 'MED PKG', 'MED PACK') - and l_quantity >= :5 and l_quantity <= :5 + 10 - and p_size between 1 and 10 - and l_shipmode in ('AIR', 'AIR REG') - and l_shipinstruct = 'DELIVER IN PERSON' - ) - or - ( - p_partkey = l_partkey - and p_brand = ':3' - and p_container in ('LG CASE', 'LG BOX', 'LG PACK', 'LG PKG') - and l_quantity >= :6 and l_quantity <= :6 + 10 - and p_size between 1 and 15 - and l_shipmode in ('AIR', 'AIR REG') - and l_shipinstruct = 'DELIVER IN PERSON' - ); -:n -1 diff --git a/benchmark/query-templates/2.sql b/benchmark/query-templates/2.sql deleted file mode 100644 index 2c941f5..0000000 --- a/benchmark/query-templates/2.sql +++ /dev/null @@ -1,50 +0,0 @@ --- $ID$ --- TPC-H/TPC-R Minimum Cost Supplier Query (Q2) --- Functional Query Definition --- Approved February 1998 -:x -:o -select - s_acctbal, - s_name, - n_name, - p_partkey, - p_mfgr, - s_address, - s_phone, - s_comment -from - part, - supplier, - partsupp, - nation, - region -where - p_partkey = ps_partkey - and s_suppkey = ps_suppkey - and p_size = :1 - and p_type like '%:2' - and s_nationkey = n_nationkey - and n_regionkey = r_regionkey - and r_name = ':3' - and ps_supplycost = ( - select - min(ps_supplycost) - from - partsupp, - supplier, - nation, - region - where - p_partkey = ps_partkey - and s_suppkey = ps_suppkey - and s_nationkey = n_nationkey - and n_regionkey = r_regionkey - and r_name = ':3' - ) -order by - s_acctbal desc, - n_name, - s_name, - p_partkey; -:n 100 diff --git a/benchmark/query-templates/20.sql b/benchmark/query-templates/20.sql deleted file mode 100644 index dccc96c..0000000 --- a/benchmark/query-templates/20.sql +++ /dev/null @@ -1,46 +0,0 @@ --- $ID$ --- TPC-H/TPC-R Potential Part Promotion Query (Q20) --- Function Query Definition --- Approved February 1998 --- --- BemiDB: 1h 23m with unindexed PostgreSQL -:x -:o -select - s_name, - s_address -from - supplier, - nation -where - s_suppkey in ( - select - ps_suppkey - from - partsupp - where - ps_partkey in ( - select - p_partkey - from - part - where - p_name like ':1%' - ) - and ps_availqty > ( - select - 0.5 * sum(l_quantity) - from - lineitem - where - l_partkey = ps_partkey - and l_suppkey = ps_suppkey - and l_shipdate >= date ':2' - and l_shipdate < date ':2' + interval '1 year' - ) - ) - and s_nationkey = n_nationkey - and n_name = ':3' -order by - s_name; -:n -1 diff --git a/benchmark/query-templates/21.sql b/benchmark/query-templates/21.sql deleted file mode 100644 index 380bcfd..0000000 --- a/benchmark/query-templates/21.sql +++ /dev/null @@ -1,46 +0,0 @@ --- $ID$ --- TPC-H/TPC-R Suppliers Who Kept Orders Waiting Query (Q21) --- Functional Query Definition --- Approved February 1998 -:x -:o -select - s_name, - count(*) as numwait -from - supplier, - lineitem l1, - orders, - nation -where - s_suppkey = l1.l_suppkey - and o_orderkey = l1.l_orderkey - and o_orderstatus = 'F' - and l1.l_receiptdate > l1.l_commitdate - and exists ( - select - * - from - lineitem l2 - where - l2.l_orderkey = l1.l_orderkey - and l2.l_suppkey <> l1.l_suppkey - ) - and not exists ( - select - * - from - lineitem l3 - where - l3.l_orderkey = l1.l_orderkey - and l3.l_suppkey <> l1.l_suppkey - and l3.l_receiptdate > l3.l_commitdate - ) - and s_nationkey = n_nationkey - and n_name = ':1' -group by - s_name -order by - numwait desc, - s_name; -:n 100 diff --git a/benchmark/query-templates/22.sql b/benchmark/query-templates/22.sql deleted file mode 100644 index 3cf5b61..0000000 --- a/benchmark/query-templates/22.sql +++ /dev/null @@ -1,44 +0,0 @@ --- $ID$ --- TPC-H/TPC-R Global Sales Opportunity Query (Q22) --- Functional Query Definition --- Approved February 1998 -:x -:o -select - cntrycode, - count(*) as numcust, - sum(c_acctbal) as totacctbal -from - ( - select - substring(c_phone from 1 for 2) as cntrycode, - c_acctbal - from - customer - where - substring(c_phone from 1 for 2) in - (':1', ':2', ':3', ':4', ':5', ':6', ':7') - and c_acctbal > ( - select - avg(c_acctbal) - from - customer - where - c_acctbal > 0.00 - and substring(c_phone from 1 for 2) in - (':1', ':2', ':3', ':4', ':5', ':6', ':7') - ) - and not exists ( - select - * - from - orders - where - o_custkey = c_custkey - ) - ) as custsale -group by - cntrycode -order by - cntrycode; -:n -1 diff --git a/benchmark/query-templates/3.sql b/benchmark/query-templates/3.sql deleted file mode 100644 index 7c38828..0000000 --- a/benchmark/query-templates/3.sql +++ /dev/null @@ -1,29 +0,0 @@ --- $ID$ --- TPC-H/TPC-R Shipping Priority Query (Q3) --- Functional Query Definition --- Approved February 1998 -:x -:o -select - l_orderkey, - sum(l_extendedprice * (1 - l_discount)) as revenue, - o_orderdate, - o_shippriority -from - customer, - orders, - lineitem -where - c_mktsegment = ':1' - and c_custkey = o_custkey - and l_orderkey = o_orderkey - and o_orderdate < date ':2' - and l_shipdate > date ':2' -group by - l_orderkey, - o_orderdate, - o_shippriority -order by - revenue desc, - o_orderdate; -:n 10 diff --git a/benchmark/query-templates/4.sql b/benchmark/query-templates/4.sql deleted file mode 100644 index febf8d5..0000000 --- a/benchmark/query-templates/4.sql +++ /dev/null @@ -1,28 +0,0 @@ --- $ID$ --- TPC-H/TPC-R Order Priority Checking Query (Q4) --- Functional Query Definition --- Approved February 1998 -:x -:o -select - o_orderpriority, - count(*) as order_count -from - orders -where - o_orderdate >= date ':1' - and o_orderdate < date ':1' + interval '3 months' - and exists ( - select - * - from - lineitem - where - l_orderkey = o_orderkey - and l_commitdate < l_receiptdate - ) -group by - o_orderpriority -order by - o_orderpriority; -:n -1 diff --git a/benchmark/query-templates/5.sql b/benchmark/query-templates/5.sql deleted file mode 100644 index 1e2d17e..0000000 --- a/benchmark/query-templates/5.sql +++ /dev/null @@ -1,31 +0,0 @@ --- $ID$ --- TPC-H/TPC-R Local Supplier Volume Query (Q5) --- Functional Query Definition --- Approved February 1998 -:x -:o -select - n_name, - sum(l_extendedprice * (1 - l_discount)) as revenue -from - customer, - orders, - lineitem, - supplier, - nation, - region -where - c_custkey = o_custkey - and l_orderkey = o_orderkey - and l_suppkey = s_suppkey - and c_nationkey = s_nationkey - and s_nationkey = n_nationkey - and n_regionkey = r_regionkey - and r_name = ':1' - and o_orderdate >= date ':2' - and o_orderdate < date ':2' + interval '1 year' -group by - n_name -order by - revenue desc; -:n -1 diff --git a/benchmark/query-templates/6.sql b/benchmark/query-templates/6.sql deleted file mode 100644 index 48f9876..0000000 --- a/benchmark/query-templates/6.sql +++ /dev/null @@ -1,16 +0,0 @@ --- $ID$ --- TPC-H/TPC-R Forecasting Revenue Change Query (Q6) --- Functional Query Definition --- Approved February 1998 -:x -:o -select - sum(l_extendedprice * l_discount) as revenue -from - lineitem -where - l_shipdate >= date ':1' - and l_shipdate < date ':1' + interval '1 year' - and l_discount between :2 - 0.01 and :2 + 0.01 - and l_quantity < :3; -:n -1 diff --git a/benchmark/query-templates/7.sql b/benchmark/query-templates/7.sql deleted file mode 100644 index d1a4441..0000000 --- a/benchmark/query-templates/7.sql +++ /dev/null @@ -1,46 +0,0 @@ --- $ID$ --- TPC-H/TPC-R Volume Shipping Query (Q7) --- Functional Query Definition --- Approved February 1998 -:x -:o -select - supp_nation, - cust_nation, - l_year, - sum(volume) as revenue -from - ( - select - n1.n_name as supp_nation, - n2.n_name as cust_nation, - extract(year from l_shipdate) as l_year, - l_extendedprice * (1 - l_discount) as volume - from - supplier, - lineitem, - orders, - customer, - nation n1, - nation n2 - where - s_suppkey = l_suppkey - and o_orderkey = l_orderkey - and c_custkey = o_custkey - and s_nationkey = n1.n_nationkey - and c_nationkey = n2.n_nationkey - and ( - (n1.n_name = ':1' and n2.n_name = ':2') - or (n1.n_name = ':2' and n2.n_name = ':1') - ) - and l_shipdate between date '1995-01-01' and date '1996-12-31' - ) as shipping -group by - supp_nation, - cust_nation, - l_year -order by - supp_nation, - cust_nation, - l_year; -:n -1 diff --git a/benchmark/query-templates/8.sql b/benchmark/query-templates/8.sql deleted file mode 100644 index 677e06f..0000000 --- a/benchmark/query-templates/8.sql +++ /dev/null @@ -1,44 +0,0 @@ --- $ID$ --- TPC-H/TPC-R National Market Share Query (Q8) --- Functional Query Definition --- Approved February 1998 -:x -:o -select - o_year, - sum(case - when nation = ':1' then volume - else 0 - end) / sum(volume) as mkt_share -from - ( - select - extract(year from o_orderdate) as o_year, - l_extendedprice * (1 - l_discount) as volume, - n2.n_name as nation - from - part, - supplier, - lineitem, - orders, - customer, - nation n1, - nation n2, - region - where - p_partkey = l_partkey - and s_suppkey = l_suppkey - and l_orderkey = o_orderkey - and o_custkey = c_custkey - and c_nationkey = n1.n_nationkey - and n1.n_regionkey = r_regionkey - and r_name = ':2' - and s_nationkey = n2.n_nationkey - and o_orderdate between date '1995-01-01' and date '1996-12-31' - and p_type = ':3' - ) as all_nations -group by - o_year -order by - o_year; -:n -1 diff --git a/benchmark/query-templates/9.sql b/benchmark/query-templates/9.sql deleted file mode 100644 index 1d63511..0000000 --- a/benchmark/query-templates/9.sql +++ /dev/null @@ -1,39 +0,0 @@ --- $ID$ --- TPC-H/TPC-R Product Type Profit Measure Query (Q9) --- Functional Query Definition --- Approved February 1998 -:x -:o -select - nation, - o_year, - sum(amount) as sum_profit -from - ( - select - n_name as nation, - extract(year from o_orderdate) as o_year, - l_extendedprice * (1 - l_discount) - ps_supplycost * l_quantity as amount - from - part, - supplier, - lineitem, - partsupp, - orders, - nation - where - s_suppkey = l_suppkey - and ps_suppkey = l_suppkey - and ps_partkey = l_partkey - and p_partkey = l_partkey - and o_orderkey = l_orderkey - and s_nationkey = n_nationkey - and p_name like '%:1%' - ) as profit -group by - nation, - o_year -order by - nation, - o_year desc; -:n -1 diff --git a/benchmark/scripts/generate-data.sh b/benchmark/scripts/generate-data.sh deleted file mode 100755 index 1e878e7..0000000 --- a/benchmark/scripts/generate-data.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash - -cd benchmark - -# Structure -cp ./tpch-kit/dbgen/dss.ddl ./data/create-tables.ddl - -# Data -cd ./tpch-kit/dbgen -export DSS_PATH=../../data -export DSS_CONFIG=./ -./dbgen -vf -s $SCALE_FACTOR # 1 = 1GB - -# Queries -cd - -rm -rf /tmp/query-templates -mkdir /tmp/query-templates -for i in `ls query-templates/*.sql`; do - tac $i | sed '2s/;//' | tac > /tmp/$i # Remove ";" -done -cd ./tpch-kit/dbgen -export DSS_QUERY=/tmp/query-templates -./qgen -v -s 0.1 | sed 's/limit -1//' > ../../queries.sql diff --git a/benchmark/scripts/load-pg-data.sh b/benchmark/scripts/load-pg-data.sh deleted file mode 100755 index 615c749..0000000 --- a/benchmark/scripts/load-pg-data.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash - -curl -L -o ./tpch.zip https://github.com/BemiHQ/BemiDB/releases/download/v0.1.0/TPC-H_generated_data_s0.1.zip -unzip ./tpch.zip -d ./benchmark/data -rm ./tpch.zip - -cd ./benchmark/data - -mv ./TPC-H_generated_data/* ./ -rm -rf ./TPC-H_generated_data -rm -rf ./__MACOSX - -psql postgres://127.0.0.1:5432/tpch -f ./create-tables.ddl - -for i in `ls *.tbl`; do - table=${i/.tbl/} - echo "Loading $table..." - sed 's/|$//' $i > /tmp/$i - psql postgres://127.0.0.1:5432/tpch -q -c "TRUNCATE $table" - psql postgres://127.0.0.1:5432/tpch -c "\\copy $table FROM '/tmp/$i' CSV DELIMITER '|'" -done diff --git a/benchmark/scripts/measure-memory.sh b/benchmark/scripts/measure-memory.sh deleted file mode 100755 index 96b787c..0000000 --- a/benchmark/scripts/measure-memory.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash - -PID=$(ps | grep "/exe/BemiDB sync" | grep -v grep | awk '{print $1}') - -if ! ps -p "$PID" > /dev/null 2>&1; then - echo "Error: Process with PID $PID does not exist" - exit 1 -fi - -echo "PID Time Mem" - -max_memory=0 - -while true; do - current_time=$(date "+%Y-%m-%d %H:%M:%S") - current_memory=$(top -pid $PID -stats mem -l 1 | tail -n 1 | sed 's/[^0-9]*//g') - - if [ "$current_memory" -gt "$max_memory" ]; then - max_memory=$current_memory - printf "%s %s %sMB (%sMB new max)\n" "$PID" "$current_time" "$current_memory" "$max_memory" - else - printf "%s %s %sMB\n" "$PID" "$current_time" "$current_memory" - fi - - sleep 1 -done diff --git a/cdc/config.go b/cdc/config.go new file mode 100644 index 0000000..cb1653d --- /dev/null +++ b/cdc/config.go @@ -0,0 +1,218 @@ +package main + +import ( + "net/url" + "os" + "strings" +) + +type Config struct { + DatabaseURL string + LogLevel string + SlotName string + PublicationName string + IncludedTables []string + ExcludedTables []string + IgnoreChangeColumns []string + NatsURL string + NatsSubject string + AuditConfigured bool + SearchTables []string + SearchSnapshot bool +} + +func LoadConfig() *Config { + databaseURL := getEnv("DATABASE_URL", "postgres://postgres:postgres@localhost:5432/postgres") + databaseURL = normalizeDatabaseURL(databaseURL) + + config := &Config{ + DatabaseURL: databaseURL, + LogLevel: getEnv("LOG_LEVEL", LOG_LEVEL_INFO), + SlotName: getEnv("SLOT_NAME", "pgstack"), + PublicationName: getEnv("PUBLICATION_NAME", "pgstack"), + NatsURL: getEnv("NATS_URL", ""), + NatsSubject: getEnv("NATS_SUBJECT", ""), + SearchSnapshot: getEnvBool("SEARCH_SNAPSHOT", false), + } + + if searchTables := os.Getenv("SEARCH_TABLES"); searchTables != "" { + config.SearchTables = splitAndTrim(searchTables) + } + + if !isValidLogLevel(config.LogLevel) { + panic("Invalid log level " + config.LogLevel + ". Must be one of " + strings.Join(LOG_LEVELS, ", ")) + } + + includedTables, includedConfigured := os.LookupEnv("AUDIT_INCLUDED_TABLES") + excludedTables, excludedConfigured := os.LookupEnv("AUDIT_EXCLUDED_TABLES") + if includedConfigured && excludedConfigured { + panic("AUDIT_INCLUDED_TABLES and AUDIT_EXCLUDED_TABLES cannot both be set") + } + config.AuditConfigured = includedConfigured || excludedConfigured + if includedConfigured { + config.IncludedTables = splitAndTrimNonEmpty(includedTables) + } + if excludedConfigured { + config.ExcludedTables = splitAndTrimNonEmpty(excludedTables) + } + + if ignoreChangeColumns := os.Getenv("AUDIT_IGNORE_CHANGE_COLUMNS"); ignoreChangeColumns != "" { + config.IgnoreChangeColumns = splitAndTrimNonEmpty(ignoreChangeColumns) + } + + return config +} + +func splitAndTrim(value string) []string { + values := strings.Split(value, ",") + for i := range values { + values[i] = strings.TrimSpace(values[i]) + } + return values +} + +func splitAndTrimNonEmpty(value string) []string { + if strings.TrimSpace(value) == "" { + return nil + } + return splitAndTrim(value) +} + +func getEnvBool(key string, defaultValue bool) bool { + value := strings.TrimSpace(strings.ToLower(os.Getenv(key))) + if value == "" { + return defaultValue + } + return value == "true" || value == "1" || value == "yes" +} + +func getEnv(key, defaultValue string) string { + if value := os.Getenv(key); value != "" { + return value + } + return defaultValue +} + +func normalizeDatabaseURL(raw string) string { + // pgx expects URL userinfo to be escaped; normalize raw passwords with reserved characters. + if _, err := url.Parse(raw); err == nil { + return raw + } + + schemeIdx := strings.Index(raw, "://") + if schemeIdx == -1 { + return raw + } + + scheme := raw[:schemeIdx] + remainder := raw[schemeIdx+3:] + authorityEnd := strings.IndexAny(remainder, "/?#") + authority := remainder + suffix := "" + if authorityEnd != -1 { + authority = remainder[:authorityEnd] + suffix = remainder[authorityEnd:] + } + + atIdx := strings.LastIndex(authority, "@") + if atIdx == -1 { + return raw + } + + userInfo := authority[:atIdx] + host := authority[atIdx+1:] + if host == "" { + return raw + } + + username, password, hasPassword := strings.Cut(userInfo, ":") + normalized := scheme + "://" + host + suffix + parsed, err := url.Parse(normalized) + if err != nil { + return raw + } + + if hasPassword { + parsed.User = url.UserPassword(username, password) + } else { + parsed.User = url.User(username) + } + + return parsed.String() +} + +func (c *Config) ShouldProcessTable(schema, table string) bool { + return c.ShouldAuditTable(schema, table) || c.ShouldSearchTable(schema, table) +} + +func (c *Config) ShouldAuditTable(schema, table string) bool { + if !c.AuditConfigured { + return false + } + fullName := schema + "." + table + + if len(c.ExcludedTables) > 0 { + for _, excluded := range c.ExcludedTables { + if excluded == fullName || excluded == table { + return false + } + } + } + + if len(c.IncludedTables) > 0 { + for _, included := range c.IncludedTables { + if included == fullName || included == table { + return true + } + } + return false + } + + return true +} + +func (c *Config) ShouldSearchTable(schema, table string) bool { + fullName := schema + "." + table + for _, configured := range c.SearchTables { + if configured == fullName { + return true + } + } + return false +} + +func (c *Config) ShouldIgnoreColumn(schema, table, column string) bool { + if len(c.IgnoreChangeColumns) == 0 { + return false + } + + for _, rule := range c.IgnoreChangeColumns { + parts := strings.Split(rule, ".") + if len(parts) != 3 { + continue + } + + ruleSchema, ruleTable, ruleColumn := parts[0], parts[1], parts[2] + + // Check schema match + schemaMatch := ruleSchema == "*" || ruleSchema == schema + + // Check table match + tableMatch := ruleTable == "*" || ruleTable == table + + // Check column match (supports wildcard suffix like *_at) + var columnMatch bool + if strings.HasPrefix(ruleColumn, "*") { + suffix := strings.TrimPrefix(ruleColumn, "*") + columnMatch = strings.HasSuffix(column, suffix) + } else { + columnMatch = ruleColumn == column + } + + if schemaMatch && tableMatch && columnMatch { + return true + } + } + + return false +} diff --git a/cdc/config_test.go b/cdc/config_test.go new file mode 100644 index 0000000..c2a08c1 --- /dev/null +++ b/cdc/config_test.go @@ -0,0 +1,91 @@ +package main + +import ( + "testing" + + "github.com/jackc/pgx/v5/pgconn" +) + +func TestLoadConfigDefaultsLogLevel(t *testing.T) { + t.Setenv("LOG_LEVEL", "") + + config := LoadConfig() + + if config.LogLevel != LOG_LEVEL_INFO { + t.Fatalf("expected default log level %q, got %q", LOG_LEVEL_INFO, config.LogLevel) + } +} + +func TestLoadConfigReadsLogLevelFromEnv(t *testing.T) { + t.Setenv("LOG_LEVEL", LOG_LEVEL_DEBUG) + + config := LoadConfig() + + if config.LogLevel != LOG_LEVEL_DEBUG { + t.Fatalf("expected env log level %q, got %q", LOG_LEVEL_DEBUG, config.LogLevel) + } +} + +func TestNormalizeDatabaseURLEscapesUserInfo(t *testing.T) { + raw := "postgres://user:go12^$@db-prod.slug.us-east-1.rds.amazonaws.com:5432/database" + + got := normalizeDatabaseURL(raw) + want := "postgres://user:go12%5E$@db-prod.slug.us-east-1.rds.amazonaws.com:5432/database" + + if got != want { + t.Fatalf("normalized URL mismatch:\nwant: %s\ngot: %s", want, got) + } + + if _, err := pgconn.ParseConfig(got); err != nil { + t.Fatalf("normalized URL should parse: %v", err) + } +} + +func TestNormalizeDatabaseURLLeavesKeywordDSNUntouched(t *testing.T) { + raw := "host=localhost port=5432 user=postgres password=go$1^3..." + + got := normalizeDatabaseURL(raw) + + if got != raw { + t.Fatalf("expected keyword DSN to remain unchanged:\nwant: %s\ngot: %s", raw, got) + } +} + +func TestShouldProcessUnionOfAuditAndSearchTables(t *testing.T) { + config := &Config{ + AuditConfigured: true, + IncludedTables: []string{"public.audit_events"}, + SearchTables: []string{"public.documents"}, + } + + if !config.ShouldProcessTable("public", "audit_events") { + t.Fatal("expected Audit table to be processed") + } + if !config.ShouldProcessTable("public", "documents") { + t.Fatal("expected Search table to be processed") + } + if config.ShouldProcessTable("public", "unused") { + t.Fatal("expected unused table to be discarded") + } +} + +func TestSearchTablesStillProcessWhenAuditDisabled(t *testing.T) { + config := &Config{AuditConfigured: false, SearchTables: []string{"public.documents"}} + if config.ShouldAuditTable("public", "documents") { + t.Fatal("expected Audit routing to be disabled") + } + if !config.ShouldProcessTable("public", "documents") { + t.Fatal("expected Search routing to remain enabled") + } +} + +func TestLoadConfigDerivesAuditFromFilterPresence(t *testing.T) { + t.Setenv("AUDIT_EXCLUDED_TABLES", "") + config := LoadConfig() + if !config.AuditConfigured { + t.Fatal("expected an explicitly empty exclusion list to enable Audit for all tables") + } + if !config.ShouldAuditTable("public", "documents") { + t.Fatal("expected Audit to include tables when no exclusions are configured") + } +} diff --git a/cdc/go.mod b/cdc/go.mod new file mode 100644 index 0000000..6ef233f --- /dev/null +++ b/cdc/go.mod @@ -0,0 +1,21 @@ +module github.com/pgstack-io/pgstack/cdc + +go 1.25.0 + +require ( + github.com/jackc/pglogrepl v0.0.0-20260401131349-e37c41485510 + github.com/jackc/pgx/v5 v5.11.0 + github.com/nats-io/nats.go v1.52.0 +) + +require ( + github.com/jackc/pgio v1.0.0 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect + github.com/klauspost/compress v1.18.5 // indirect + github.com/nats-io/nkeys v0.4.15 // indirect + github.com/nats-io/nuid v1.0.1 // indirect + golang.org/x/crypto v0.52.0 // indirect + golang.org/x/sys v0.45.0 // indirect + golang.org/x/text v0.37.0 // indirect +) diff --git a/cdc/go.sum b/cdc/go.sum new file mode 100644 index 0000000..7b4acd5 --- /dev/null +++ b/cdc/go.sum @@ -0,0 +1,42 @@ +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/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/pglogrepl v0.0.0-20260401131349-e37c41485510 h1:+PJCokZ2BhyDKlncScmiNzBwqOx+yH1i8xRlWN/wn6A= +github.com/jackc/pglogrepl v0.0.0-20260401131349-e37c41485510/go.mod h1:UzTJ5Jjuf4O9hYWW+HYVwVldYz9J7CaePW0iuNJkrPQ= +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/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.11.0 h1:IzBBtyK9AHqf98cctWFifYSci2hgQR/cd56wB4p+ogg= +github.com/jackc/pgx/v5 v5.11.0/go.mod h1:mal1tBGAFfLHvZzaYh77YS/eC6IX9OWbRV1QIIM0Jn4= +github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= +github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/klauspost/compress v1.18.5 h1:/h1gH5Ce+VWNLSWqPzOVn6XBO+vJbCNGvjoaGBFW2IE= +github.com/klauspost/compress v1.18.5/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= +github.com/nats-io/nats.go v1.52.0 h1:n3avV4VBsCgsdwh71TppsTwtv+QdPs7ntSKM8qJLGsc= +github.com/nats-io/nats.go v1.52.0/go.mod h1:26HypzazeOkyO3/mqd1zZd53STJN0EjCYF9Uy2ZOBno= +github.com/nats-io/nkeys v0.4.15 h1:JACV5jRVO9V856KOapQ7x+EY8Jo3qw1vJt/9Jpwzkk4= +github.com/nats-io/nkeys v0.4.15/go.mod h1:CpMchTXC9fxA5zrMo4KpySxNjiDVvr8ANOSZdiNfUrs= +github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +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/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +golang.org/x/crypto v0.52.0 h1:RMs7fP2rXdep0CftQlK8Uf+kibLm7qkCcradZWYz988= +golang.org/x/crypto v0.52.0/go.mod h1:1QgfPxDqh0T2M/elOJtp9RvuR95kVjir0e6/BvEmGbc= +golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= +golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= +golang.org/x/sys v0.45.0 h1:dO4czNzziLiiXplLQgBCEpCvXQ3dnkn0SdaZSYdQ+FY= +golang.org/x/sys v0.45.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc= +golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/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= diff --git a/src/common/logger_utils.go b/cdc/logger_utils.go similarity index 64% rename from src/common/logger_utils.go rename to cdc/logger_utils.go index af3d9a4..83c92a5 100644 --- a/src/common/logger_utils.go +++ b/cdc/logger_utils.go @@ -1,4 +1,4 @@ -package common +package main import ( "log" @@ -22,30 +22,33 @@ var LOG_LEVELS = []string{ LOG_LEVEL_ERROR, } -func LogError(config *CommonConfig, message ...interface{}) { +func isValidLogLevel(level string) bool { + for _, validLevel := range LOG_LEVELS { + if level == validLevel { + return true + } + } + return false +} + +func LogError(config *Config, message ...interface{}) { log.Println(append([]interface{}{"[ERROR]"}, message...)...) } -func LogWarn(config *CommonConfig, message ...interface{}) { +func LogWarn(config *Config, message ...interface{}) { if config.LogLevel != LOG_LEVEL_ERROR { log.Println(append([]interface{}{"[WARN]"}, message...)...) } } -func LogInfo(config *CommonConfig, message ...interface{}) { +func LogInfo(config *Config, message ...interface{}) { if config.LogLevel != LOG_LEVEL_ERROR && config.LogLevel != LOG_LEVEL_WARN { log.Println(append([]interface{}{"[INFO]"}, message...)...) } } -func LogDebug(config *CommonConfig, message ...interface{}) { +func LogDebug(config *Config, message ...interface{}) { if config.LogLevel == LOG_LEVEL_DEBUG || config.LogLevel == LOG_LEVEL_TRACE { log.Println(append([]interface{}{"[DEBUG]"}, message...)...) } } - -func LogTrace(config *CommonConfig, message ...interface{}) { - if config.LogLevel == LOG_LEVEL_TRACE { - log.Println(append([]interface{}{"[TRACE]"}, message...)...) - } -} diff --git a/cdc/main.go b/cdc/main.go new file mode 100644 index 0000000..565a035 --- /dev/null +++ b/cdc/main.go @@ -0,0 +1,56 @@ +package main + +import ( + "context" + "fmt" + "log" + "os" + "os/signal" + "syscall" +) + +func main() { + config := LoadConfig() + + LogInfo(config, "Starting cdc...") + LogInfo(config, fmt.Sprintf("Slot: %s, Publication: %s", config.SlotName, config.PublicationName)) + if len(config.IncludedTables) > 0 { + LogInfo(config, fmt.Sprintf("Included tables: %v", config.IncludedTables)) + } + if len(config.ExcludedTables) > 0 { + LogInfo(config, fmt.Sprintf("Excluded tables: %v", config.ExcludedTables)) + } + if len(config.IgnoreChangeColumns) > 0 { + LogInfo(config, fmt.Sprintf("Ignore change columns: %v", config.IgnoreChangeColumns)) + } + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + if err := SetupReplicaIdentity(ctx, config); err != nil { + LogWarn(config, "Failed to setup replica identity:", err) + } + + handler, err := NewReplicationHandler(config) + if err != nil { + log.Fatalf("Failed to create replication handler: %v", err) + } + defer handler.Close() + + sigChan := make(chan os.Signal, 1) + signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM) + + go func() { + <-sigChan + LogInfo(config, "Shutting down...") + cancel() + }() + + if err := handler.Start(ctx); err != nil { + if err != context.Canceled { + log.Fatalf("Replication error: %v", err) + } + } + + LogInfo(config, "Stopped") +} diff --git a/cdc/nats.go b/cdc/nats.go new file mode 100644 index 0000000..3881c5a --- /dev/null +++ b/cdc/nats.go @@ -0,0 +1,200 @@ +package main + +import ( + "bytes" + "context" + "encoding/base64" + "encoding/json" + "fmt" + "time" + + "github.com/nats-io/nats.go" + "github.com/nats-io/nats.go/jetstream" +) + +const ( + PRODUCT_AUDIT = "audit" + PRODUCT_SEARCH = "search" +) + +type NatsPublisher struct { + nc *nats.Conn + js jetstream.JetStream + subject string + enabled bool +} + +func NewNatsPublisher(config *Config) (*NatsPublisher, error) { + if config.NatsURL == "" || config.NatsSubject == "" { + LogInfo(config, "NATS URL or subject not configured, publishing disabled") + return &NatsPublisher{enabled: false}, nil + } + + nc, err := nats.Connect(config.NatsURL) + if err != nil { + return nil, fmt.Errorf("failed to connect to NATS: %w", err) + } + js, err := jetstream.New(nc) + if err != nil { + nc.Close() + return nil, fmt.Errorf("failed to create JetStream publisher: %w", err) + } + + LogInfo(config, fmt.Sprintf("Connected to NATS at %s, publishing to subject: %s", config.NatsURL, config.NatsSubject)) + return &NatsPublisher{ + nc: nc, + js: js, + subject: config.NatsSubject, + enabled: true, + }, nil +} + +func (np *NatsPublisher) PublishChange(change *ChangeMessage) error { + if !np.enabled { + return nil + } + + data, err := json.Marshal(change) + if err != nil { + return fmt.Errorf("failed to marshal change: %w", err) + } + + if _, err := np.js.Publish(context.Background(), np.subject, data); err != nil { + return fmt.Errorf("failed to commit message to NATS JetStream: %w", err) + } + + return nil +} + +func (np *NatsPublisher) Flush() error { + if !np.enabled || np.nc == nil { + return nil + } + + if err := np.nc.Flush(); err != nil { + return fmt.Errorf("failed to flush NATS connection: %w", err) + } + + return nil +} + +func (np *NatsPublisher) Close() { + if np.enabled && np.nc != nil { + np.nc.Close() + } +} + +type ChangeMessage struct { + Before map[string]interface{} `json:"before,omitempty"` + After map[string]interface{} `json:"after,omitempty"` + Source SourceMetadata `json:"source"` + Op string `json:"op"` + TsUs int64 `json:"ts_us"` + Message *MessagePayload `json:"message,omitempty"` + Products []string `json:"products,omitempty"` +} + +type MessagePayload struct { + Prefix string `json:"prefix"` + Content string `json:"content"` +} + +type SourceMetadata struct { + TsUs int64 `json:"ts_us"` + Db string `json:"db"` + Schema string `json:"schema"` + Table string `json:"table"` + TxId uint32 `json:"txId"` + Lsn uint64 `json:"lsn"` + Pk []string `json:"pk,omitempty"` +} + +func CreateChangeMessage(change Change, txn *Transaction, lsn uint64, dbName string, primaryKey []string) *ChangeMessage { + now := time.Now() + tsUs := now.UnixMicro() + + msg := &ChangeMessage{ + Before: change.Before, + After: change.After, + Op: getOpCode(change.Operation), + TsUs: tsUs, + Source: SourceMetadata{ + TsUs: txn.CommitTime.UnixMicro(), + Db: dbName, + Schema: change.Schema, + Table: change.Table, + TxId: txn.XID, + Lsn: lsn, + Pk: primaryKey, + }, + } + + return msg +} + +func CreateLogicalMessage(logicalMsg LogicalMessage, txn *Transaction, lsn uint64, dbName string) *ChangeMessage { + now := time.Now() + tsUs := now.UnixMicro() + content := normalizeLogicalMessageContent(logicalMsg.Content) + + msg := &ChangeMessage{ + Op: OPERATION_MESSAGE, + TsUs: tsUs, + Source: SourceMetadata{ + TsUs: txn.CommitTime.UnixMicro(), + Db: dbName, + Schema: "", + Table: "", + TxId: txn.XID, + Lsn: lsn, + }, + Message: &MessagePayload{ + Prefix: logicalMsg.Prefix, + Content: base64.StdEncoding.EncodeToString(content), + }, + } + + return msg +} + +func normalizeLogicalMessageContent(rawContent []byte) []byte { + content := bytes.TrimSpace(rawContent) + if json.Valid(content) { + var value interface{} + if err := json.Unmarshal(content, &value); err != nil { + return content + } + + cleaned, err := json.Marshal(removeNullBytes(value)) + if err != nil { + return content + } + + return cleaned + } + + return bytes.ReplaceAll(content, []byte{0}, nil) +} + +func removeNullBytes(value interface{}) interface{} { + switch v := value.(type) { + case nil: + return nil + case string: + return string(bytes.ReplaceAll([]byte(v), []byte{0}, nil)) + case []interface{}: + cleaned := make([]interface{}, len(v)) + for i, item := range v { + cleaned[i] = removeNullBytes(item) + } + return cleaned + case map[string]interface{}: + cleaned := make(map[string]interface{}, len(v)) + for key, item := range v { + cleaned[key] = removeNullBytes(item) + } + return cleaned + default: + return value + } +} diff --git a/cdc/operation.go b/cdc/operation.go new file mode 100644 index 0000000..53f930d --- /dev/null +++ b/cdc/operation.go @@ -0,0 +1,9 @@ +package main + +const ( + OPERATION_CREATE = "c" + OPERATION_UPDATE = "u" + OPERATION_DELETE = "d" + OPERATION_TRUNCATE = "t" + OPERATION_MESSAGE = "m" +) diff --git a/cdc/replication.go b/cdc/replication.go new file mode 100644 index 0000000..7d8ebc0 --- /dev/null +++ b/cdc/replication.go @@ -0,0 +1,876 @@ +package main + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "time" + + "github.com/jackc/pglogrepl" + "github.com/jackc/pgx/v5" + "github.com/jackc/pgx/v5/pgconn" + "github.com/jackc/pgx/v5/pgproto3" +) + +const ( + MAX_CHANGE_SIZE_BYTES = 2097152 // 2MB + MAX_LOGICAL_MESSAGE_SIZE_BYTES = 10240 // 10KB + APPLICATION_NAME = "PgStack" + ACTIVE_SLOT_TERMINATION_WAIT = 5 * time.Second + TRANSACTION_STANDBY_TIMEOUT = 30 * time.Second + PGOUTPUT_PLUGIN = "pgoutput" + PG_DUPLICATE_OBJECT_CODE = "42710" + REPLICATION_SLOT_WAL_LOST = "lost" + UNCHANGED_TOAST = "UNCHANGED_TOAST" + MESSAGE_PREFIX_CONTEXT = "_bemi" +) + +type ReplicationHandler struct { + conn *pgconn.PgConn + config *Config + relations map[uint32]*pglogrepl.RelationMessage + primaryKeys map[uint32][]string + typeMap *TypeMap + txnBuffer *TransactionBuffer + lastWrittenLSN pglogrepl.LSN + standbyTimeout time.Duration + natsPublisher *NatsPublisher + dbName string +} + +func NewReplicationHandler(config *Config) (*ReplicationHandler, error) { + connConfig, err := pgconn.ParseConfig(config.DatabaseURL) + if err != nil { + return nil, fmt.Errorf("failed to parse database URL: %w", err) + } + + typeMap, err := LoadTypeMap(context.Background(), config.DatabaseURL) + if err != nil { + return nil, fmt.Errorf("failed to load type map: %w", err) + } + + natsPublisher, err := NewNatsPublisher(config) + if err != nil { + return nil, fmt.Errorf("failed to create NATS publisher: %w", err) + } + + return &ReplicationHandler{ + config: config, + relations: make(map[uint32]*pglogrepl.RelationMessage), + primaryKeys: make(map[uint32][]string), + typeMap: typeMap, + txnBuffer: NewTransactionBuffer(), + standbyTimeout: time.Second * 10, + natsPublisher: natsPublisher, + dbName: connConfig.Database, + }, nil +} + +func (r *ReplicationHandler) Start(ctx context.Context) error { + if _, err := r.ensureReplicationSlot(ctx); err != nil { + return fmt.Errorf("failed to ensure replication slot: %w", err) + } + if r.config.SearchSnapshot { + if err := r.RunSearchSnapshot(ctx); err != nil { + return fmt.Errorf("failed to run search snapshot: %w", err) + } + } + if err := r.terminateActiveReplicationSlotConnection(ctx); err != nil { + return fmt.Errorf("failed to terminate active replication slot connection: %w", err) + } + if err := r.recreateLostReplicationSlot(ctx); err != nil { + return fmt.Errorf("failed to recover replication slot: %w", err) + } + + pluginArguments := []string{ + "proto_version '1'", + fmt.Sprintf("publication_names '%s'", r.config.PublicationName), + "messages 'true'", + } + + if err := r.connectReplication(ctx); err != nil { + return fmt.Errorf("failed to connect for replication: %w", err) + } + + err := pglogrepl.StartReplication( + ctx, + r.conn, + r.config.SlotName, + 0, + pglogrepl.StartReplicationOptions{ + PluginArgs: pluginArguments, + }, + ) + if err != nil { + return fmt.Errorf("failed to start replication: %w", err) + } + + LogInfo(r.config, "Logical replication started from slot:", r.config.SlotName) + + standbyMessageTicker := time.NewTicker(r.standbyTimeout) + defer standbyMessageTicker.Stop() + + for { + select { + case <-ctx.Done(): + return ctx.Err() + case <-standbyMessageTicker.C: + if err := r.sendStandbyStatusUpdate(ctx); err != nil { + return fmt.Errorf("failed to send standby status: %w", err) + } + default: + if err := r.receiveMessage(ctx); err != nil { + return err + } + } + } +} + +func connectReplication(ctx context.Context, databaseURL string) (*pgconn.PgConn, error) { + connConfig, err := pgconn.ParseConfig(databaseURL) + if err != nil { + return nil, fmt.Errorf("failed to parse database URL: %w", err) + } + connConfig.RuntimeParams["replication"] = "database" + connConfig.RuntimeParams["application_name"] = APPLICATION_NAME + + conn, err := pgconn.ConnectConfig(ctx, connConfig) + if err != nil { + return nil, fmt.Errorf("failed to connect to database: %w", err) + } + + return conn, nil +} + +func (r *ReplicationHandler) connectReplication(ctx context.Context) error { + if r.conn != nil { + if err := r.conn.Close(ctx); err != nil { + LogWarn(r.config, "Failed to close old replication connection:", err) + } + r.conn = nil + } + + conn, err := connectReplication(ctx, r.config.DatabaseURL) + if err != nil { + return err + } + + r.conn = conn + return nil +} + +func (r *ReplicationHandler) ensureReplicationSlot(ctx context.Context) (pglogrepl.LSN, error) { + conn, err := connectReplication(ctx, r.config.DatabaseURL) + if err != nil { + return 0, err + } + defer conn.Close(ctx) + + result, err := pglogrepl.CreateReplicationSlot(ctx, conn, r.config.SlotName, PGOUTPUT_PLUGIN, pglogrepl.CreateReplicationSlotOptions{}) + if err != nil { + if isDuplicateReplicationSlotError(err) { + LogInfo(r.config, "Replication slot already exists:", r.config.SlotName) + return 0, nil + } + return 0, err + } + + lsn, err := pglogrepl.ParseLSN(result.ConsistentPoint) + if err != nil { + return 0, fmt.Errorf("failed to parse replication slot consistent point %q: %w", result.ConsistentPoint, err) + } + + LogInfo(r.config, fmt.Sprintf("Created replication slot %s at %s", result.SlotName, result.ConsistentPoint)) + return lsn, nil +} + +func (r *ReplicationHandler) recreateLostReplicationSlot(ctx context.Context) error { + conn, err := pgx.Connect(ctx, r.config.DatabaseURL) + if err != nil { + return fmt.Errorf("failed to connect to database: %w", err) + } + defer conn.Close(ctx) + + var walStatus *string + if err := conn.QueryRow(ctx, ` + SELECT wal_status + FROM pg_replication_slots + WHERE slot_name = $1 + `, r.config.SlotName).Scan(&walStatus); err != nil { + if errors.Is(err, pgx.ErrNoRows) { + return nil + } + return fmt.Errorf("failed to query replication slot status: %w", err) + } + + if walStatus == nil || *walStatus != REPLICATION_SLOT_WAL_LOST { + return nil + } + + LogWarn(r.config, fmt.Sprintf( + "Replication slot %s is lost; recreating it at the current WAL position", + r.config.SlotName, + )) + + if _, err := conn.Exec(ctx, `SELECT pg_drop_replication_slot($1)`, r.config.SlotName); err != nil { + return fmt.Errorf("failed to drop lost replication slot: %w", err) + } + if _, err := r.ensureReplicationSlot(ctx); err != nil { + return fmt.Errorf("failed to recreate lost replication slot: %w", err) + } + + return nil +} + +func (r *ReplicationHandler) terminateActiveReplicationSlotConnection(ctx context.Context) error { + conn, err := pgx.Connect(ctx, r.config.DatabaseURL) + if err != nil { + return fmt.Errorf("failed to connect to database: %w", err) + } + defer conn.Close(ctx) + + activePID, err := replicationSlotActivePID(ctx, conn, r.config.SlotName) + if err != nil { + return err + } + if activePID == nil { + return nil + } + + var terminated bool + if err := conn.QueryRow(ctx, `SELECT pg_terminate_backend($1)`, *activePID).Scan(&terminated); err != nil { + return fmt.Errorf("failed to terminate backend %d: %w", *activePID, err) + } + if !terminated { + return fmt.Errorf("postgres did not terminate backend %d", *activePID) + } + + LogInfo(r.config, fmt.Sprintf("Terminated backend %d using replication slot %s", *activePID, r.config.SlotName)) + + select { + case <-ctx.Done(): + return ctx.Err() + case <-time.After(ACTIVE_SLOT_TERMINATION_WAIT): + return nil + } +} + +func replicationSlotActivePID(ctx context.Context, conn *pgx.Conn, slotName string) (*int32, error) { + var activePID *int32 + if err := conn.QueryRow(ctx, ` + SELECT active_pid + FROM pg_replication_slots + WHERE slot_name = $1 + `, slotName).Scan(&activePID); err != nil { + if errors.Is(err, pgx.ErrNoRows) { + return nil, nil + } + return nil, fmt.Errorf("failed to query active PID for replication slot: %w", err) + } + + return activePID, nil +} + +func isDuplicateReplicationSlotError(err error) bool { + var pgErr *pgconn.PgError + return errors.As(err, &pgErr) && pgErr.Code == PG_DUPLICATE_OBJECT_CODE +} + +func (r *ReplicationHandler) receiveMessage(ctx context.Context) error { + ctx, cancel := context.WithTimeout(ctx, time.Second*1) + defer cancel() + + msg, err := r.conn.ReceiveMessage(ctx) + if err != nil { + if pgconn.Timeout(err) { + return nil + } + return fmt.Errorf("failed to receive message: %w", err) + } + + switch msg := msg.(type) { + case *pgproto3.CopyData: + return r.handleCopyData(msg.Data) + default: + LogError(r.config, fmt.Sprintf("Received unexpected message: %T", msg)) + } + + return nil +} + +func (r *ReplicationHandler) handleCopyData(data []byte) error { + if data[0] == pglogrepl.PrimaryKeepaliveMessageByteID { + return r.handlePrimaryKeepalive(data[1:]) + } + + if data[0] != pglogrepl.XLogDataByteID { + return nil + } + + xld, err := pglogrepl.ParseXLogData(data[1:]) + if err != nil { + return fmt.Errorf("failed to parse XLogData: %w", err) + } + + if err := r.handleWALData(xld.WALData, uint64(xld.WALStart)); err != nil { + return err + } + + // Only acknowledge WAL after handling it successfully. In particular, a + // transaction commit is not acknowledged until every JetStream PubAck has + // been received. + r.lastWrittenLSN = xld.WALStart + pglogrepl.LSN(len(xld.WALData)) + return nil +} + +func (r *ReplicationHandler) handleWALData(walData []byte, walStart uint64) error { + logicalMsg, err := pglogrepl.Parse(walData) + if err != nil { + return fmt.Errorf("failed to parse logical replication message: %w", err) + } + + switch msg := logicalMsg.(type) { + case *pglogrepl.RelationMessage: + r.relations[msg.RelationID] = msg + r.extractPrimaryKey(msg) + + case *pglogrepl.BeginMessage: + r.txnBuffer.Begin(msg) + + case *pglogrepl.InsertMessage: + r.handleInsert(msg, walStart) + + case *pglogrepl.UpdateMessage: + r.handleUpdate(msg, walStart) + + case *pglogrepl.DeleteMessage: + r.handleDelete(msg, walStart) + + case *pglogrepl.CommitMessage: + r.txnBuffer.Commit(msg) + if err := r.flushTransaction(); err != nil { + return err + } + + case *pglogrepl.TruncateMessage: + r.handleTruncate(msg, walStart) + + case *pglogrepl.TypeMessage: + LogInfo(r.config, fmt.Sprintf("Type message: %+v", msg)) + + case *pglogrepl.OriginMessage: + LogInfo(r.config, fmt.Sprintf("Origin message: %+v", msg)) + + case *pglogrepl.LogicalDecodingMessage: + r.handleLogicalMessage(msg, walStart) + } + + return nil +} + +func (r *ReplicationHandler) handleInsert(msg *pglogrepl.InsertMessage, walStart uint64) { + rel, ok := r.relations[msg.RelationID] + if !ok { + LogError(r.config, "Unknown relation ID:", msg.RelationID) + return + } + + if !r.config.ShouldProcessTable(rel.Namespace, rel.RelationName) { + return + } + + values := r.decodeRow(rel, msg.Tuple) + change := Change{ + Operation: "INSERT", + Schema: rel.Namespace, + Table: rel.RelationName, + Position: walStart, + After: values, + } + + if r.isChangeTooLarge(change) { + return + } + + r.txnBuffer.AddChange(change) +} + +func (r *ReplicationHandler) handleUpdate(msg *pglogrepl.UpdateMessage, walStart uint64) { + rel, ok := r.relations[msg.RelationID] + if !ok { + LogError(r.config, "Unknown relation ID:", msg.RelationID) + return + } + + if !r.config.ShouldProcessTable(rel.Namespace, rel.RelationName) { + return + } + + var before map[string]interface{} + if msg.OldTuple != nil { + before = r.decodeRow(rel, msg.OldTuple) + } + + after := r.decodeRow(rel, msg.NewTuple) + resolveUnchangedToastFromBefore(msg.OldTupleType, before, after) + + // Check if only ignored columns have changed + if r.shouldSkipUpdate(rel.Namespace, rel.RelationName, before, after) && !r.config.ShouldSearchTable(rel.Namespace, rel.RelationName) { + LogInfo(r.config, "Skipping no-diff changes in", rel.Namespace+"."+rel.RelationName) + return + } + + change := Change{ + Operation: "UPDATE", + Schema: rel.Namespace, + Table: rel.RelationName, + Position: walStart, + Before: before, + After: after, + } + + if r.isChangeTooLarge(change) { + return + } + + r.txnBuffer.AddChange(change) +} + +func (r *ReplicationHandler) handleDelete(msg *pglogrepl.DeleteMessage, walStart uint64) { + rel, ok := r.relations[msg.RelationID] + if !ok { + LogError(r.config, "Unknown relation ID:", msg.RelationID) + return + } + + if !r.config.ShouldProcessTable(rel.Namespace, rel.RelationName) { + return + } + + var before map[string]interface{} + if msg.OldTuple != nil { + before = r.decodeRow(rel, msg.OldTuple) + } + + change := Change{ + Operation: "DELETE", + Schema: rel.Namespace, + Table: rel.RelationName, + Position: walStart, + Before: before, + } + + if r.isChangeTooLarge(change) { + return + } + + r.txnBuffer.AddChange(change) +} + +func (r *ReplicationHandler) handleTruncate(msg *pglogrepl.TruncateMessage, walStart uint64) { + for _, relID := range msg.RelationIDs { + rel, ok := r.relations[relID] + if !ok { + continue + } + + if !r.config.ShouldProcessTable(rel.Namespace, rel.RelationName) { + continue + } + + change := Change{ + Operation: "TRUNCATE", + Schema: rel.Namespace, + Table: rel.RelationName, + Position: walStart, + } + + if r.isChangeTooLarge(change) { + continue + } + + r.txnBuffer.AddChange(change) + } +} + +func (r *ReplicationHandler) handleLogicalMessage(msg *pglogrepl.LogicalDecodingMessage, walStart uint64) { + lm := LogicalMessage{ + Prefix: msg.Prefix, + Content: append([]byte(nil), msg.Content...), + Transactional: msg.Transactional, + Position: walStart, + } + + if r.shouldIgnoreLogicalMessage(lm) { + return + } + + r.txnBuffer.AddLogicalMessage(lm) +} + +func (r *ReplicationHandler) flushTransaction() error { + txn := r.txnBuffer.GetTransaction() + if txn == nil { + return nil + } + + nextStandbyStatus := time.Now().Add(TRANSACTION_STANDBY_TIMEOUT) + sendStandbyStatusIfDue := func() error { + if time.Now().Before(nextStandbyStatus) { + return nil + } + if err := r.sendStandbyStatusUpdate(context.Background()); err != nil { + return err + } + nextStandbyStatus = time.Now().Add(TRANSACTION_STANDBY_TIMEOUT) + return nil + } + + for _, change := range txn.Changes { + if err := sendStandbyStatusIfDue(); err != nil { + return fmt.Errorf("failed to send standby status while flushing transaction %d: %w", txn.XID, err) + } + + LogDebug(r.config, fmt.Sprintf("[%s] %s.%s", change.Operation, change.Schema, change.Table)) + + // Publish to NATS + primaryKey := r.getPrimaryKeyForChange(change) + msg := CreateChangeMessage(change, txn, change.Position, r.dbName, primaryKey) + if r.config.ShouldAuditTable(change.Schema, change.Table) && + (change.Operation != "UPDATE" || !r.shouldSkipUpdate(change.Schema, change.Table, change.Before, change.After)) { + msg.Products = append(msg.Products, PRODUCT_AUDIT) + } + if r.config.ShouldSearchTable(change.Schema, change.Table) { + msg.Products = append(msg.Products, PRODUCT_SEARCH) + } + if len(msg.Products) == 0 { + continue + } + if err := r.natsPublisher.PublishChange(msg); err != nil { + return fmt.Errorf("failed to publish transaction %d change at LSN %d: %w", txn.XID, change.Position, err) + } + } + + for _, lm := range txn.LogicalMessages { + if err := sendStandbyStatusIfDue(); err != nil { + return fmt.Errorf("failed to send standby status while flushing transaction %d: %w", txn.XID, err) + } + + LogDebug(r.config, "[MESSAGE] Prefix:", lm.Prefix) + + // Publish to NATS + msg := CreateLogicalMessage(lm, txn, lm.Position, r.dbName) + if r.config.AuditConfigured { + msg.Products = []string{PRODUCT_AUDIT} + if err := r.natsPublisher.PublishChange(msg); err != nil { + return fmt.Errorf("failed to publish transaction %d logical message at LSN %d: %w", txn.XID, lm.Position, err) + } + } + } + + return nil +} + +func (r *ReplicationHandler) decodeRow(rel *pglogrepl.RelationMessage, tuple *pglogrepl.TupleData) map[string]interface{} { + values := make(map[string]interface{}) + + for idx, col := range tuple.Columns { + if idx >= len(rel.Columns) { + continue + } + + colName := rel.Columns[idx].Name + + switch col.DataType { + case 'n': + values[colName] = nil + case 'u': + values[colName] = UNCHANGED_TOAST + case 't': + values[colName] = r.typeMap.DecodeValue(rel.Columns[idx].DataType, col.Data) + } + } + + return values +} + +func resolveUnchangedToastFromBefore(oldTupleType uint8, before, after map[string]interface{}) { + if oldTupleType != pglogrepl.UpdateMessageTupleTypeOld || before == nil || after == nil { + return + } + + for key, afterVal := range after { + if afterVal != UNCHANGED_TOAST { + continue + } + + beforeVal, ok := before[key] + if !ok || beforeVal == UNCHANGED_TOAST { + continue + } + + after[key] = beforeVal + } +} + +func (r *ReplicationHandler) handlePrimaryKeepalive(data []byte) error { + pkm, err := pglogrepl.ParsePrimaryKeepaliveMessage(data) + if err != nil { + return fmt.Errorf("failed to parse keepalive: %w", err) + } + + if pkm.ReplyRequested { + return r.sendStandbyStatusUpdate(context.Background()) + } + + return nil +} + +func (r *ReplicationHandler) sendStandbyStatusUpdate(ctx context.Context) error { + return pglogrepl.SendStandbyStatusUpdate( + ctx, + r.conn, + pglogrepl.StandbyStatusUpdate{ + WALWritePosition: r.lastWrittenLSN, + }, + ) +} + +func (r *ReplicationHandler) extractPrimaryKey(rel *pglogrepl.RelationMessage) { + pkCols, err := loadPrimaryKey(context.Background(), r.config.DatabaseURL, rel.Namespace, rel.RelationName) + if err != nil { + LogError(r.config, "Failed to load primary key for", rel.Namespace+"."+rel.RelationName+":", err) + return + } + r.primaryKeys[rel.RelationID] = pkCols +} + +func loadPrimaryKey(ctx context.Context, databaseURL, schema, table string) ([]string, error) { + conn, err := pgx.Connect(ctx, databaseURL) + if err != nil { + return nil, fmt.Errorf("failed to connect: %w", err) + } + defer conn.Close(ctx) + return queryPrimaryKey(ctx, conn, schema, table) +} + +type primaryKeyQuerier interface { + Query(ctx context.Context, sql string, args ...any) (pgx.Rows, error) +} + +func queryPrimaryKey(ctx context.Context, querier primaryKeyQuerier, schema, table string) ([]string, error) { + rows, err := querier.Query(ctx, primaryKeyQuery(), schema, table) + if err != nil { + return nil, fmt.Errorf("failed to query primary key: %w", err) + } + defer rows.Close() + + var pkCols []string + for rows.Next() { + var columnName string + if err := rows.Scan(&columnName); err != nil { + return nil, fmt.Errorf("failed to scan primary key column: %w", err) + } + pkCols = append(pkCols, columnName) + } + if err := rows.Err(); err != nil { + return nil, fmt.Errorf("failed to read primary key rows: %w", err) + } + + return pkCols, nil +} + +func primaryKeyQuery() string { + return ` + WITH primary_key_columns AS ( + SELECT a.attname AS column_name, key.ordinality::int AS ordinal_position + FROM pg_index i + JOIN pg_class c ON c.oid = i.indrelid + JOIN pg_namespace n ON n.oid = c.relnamespace + CROSS JOIN LATERAL unnest(i.indkey) WITH ORDINALITY AS key(attnum, ordinality) + JOIN pg_attribute a + ON a.attrelid = c.oid + AND a.attnum = key.attnum + WHERE i.indisprimary + AND n.nspname = $1 + AND c.relname = $2 + ), + fallback_id_columns AS ( + SELECT a.attname AS column_name, a.attnum::int AS ordinal_position + FROM pg_class c + JOIN pg_namespace n ON n.oid = c.relnamespace + JOIN pg_attribute a ON a.attrelid = c.oid + LEFT JOIN pg_attrdef d ON d.adrelid = c.oid AND d.adnum = a.attnum + WHERE n.nspname = $1 + AND c.relname = $2 + AND c.relkind IN ('r', 'p') + AND a.attname = 'id' + AND a.attnotnull + AND a.attnum > 0 + AND NOT a.attisdropped + AND ( + a.attidentity <> '' + OR pg_get_expr(d.adbin, d.adrelid) LIKE 'nextval(%' + ) + AND NOT EXISTS (SELECT 1 FROM primary_key_columns) + ), + key_columns AS ( + SELECT column_name, ordinal_position + FROM primary_key_columns + UNION ALL + SELECT column_name, ordinal_position + FROM fallback_id_columns + ) + SELECT column_name + FROM key_columns + ORDER BY key_columns.ordinal_position + ` +} + +func (r *ReplicationHandler) getPrimaryKeyForChange(change Change) []string { + for relID, rel := range r.relations { + if rel.Namespace == change.Schema && rel.RelationName == change.Table { + return r.primaryKeys[relID] + } + } + return nil +} + +func (r *ReplicationHandler) Close() error { + r.natsPublisher.Close() + if r.conn == nil { + return nil + } + return r.conn.Close(context.Background()) +} + +func (r *ReplicationHandler) shouldSkipUpdate(schema, table string, before, after map[string]interface{}) bool { + if before == nil || after == nil { + return false + } + + // Find columns that have actually changed + var changedColumns []string + for key, beforeVal := range before { + afterVal, exists := after[key] + if !exists { + continue + } + + // Skip UNCHANGED_TOAST values + if beforeVal == UNCHANGED_TOAST || afterVal == UNCHANGED_TOAST { + continue + } + + // Check if values are different + if !valuesEqual(beforeVal, afterVal) { + changedColumns = append(changedColumns, key) + } + } + + // If no columns changed, skip + if len(changedColumns) == 0 { + return true + } + + // Check if all changed columns should be ignored + for _, col := range changedColumns { + if !r.config.ShouldIgnoreColumn(schema, table, col) { + // Found a column that shouldn't be ignored, so don't skip + return false + } + } + + // All changed columns should be ignored + return true +} + +func valuesEqual(a, b interface{}) bool { + // Handle nil cases + if a == nil && b == nil { + return true + } + if a == nil || b == nil { + return false + } + + // Simple comparison (works for basic types) + return fmt.Sprintf("%v", a) == fmt.Sprintf("%v", b) +} + +func (r *ReplicationHandler) isChangeTooLarge(change Change) bool { + // Create a temporary message to estimate size + tempMsg := &ChangeMessage{ + Before: change.Before, + After: change.After, + Op: getOpCode(change.Operation), + Source: SourceMetadata{ + Schema: change.Schema, + Table: change.Table, + }, + } + + data, err := json.Marshal(tempMsg) + if err != nil { + LogError(r.config, "Failed to marshal change for size check:", err) + return false + } + + dataSize := len(data) + + // Ignore large changes (larger than 2MB) + if dataSize > MAX_CHANGE_SIZE_BYTES { + LogWarn(r.config, fmt.Sprintf("Ignoring large change %s.%s = %.2fMB (larger than 2MB)", change.Schema, change.Table, float64(dataSize)/1000000)) + return true + } + + return false +} + +func (r *ReplicationHandler) shouldIgnoreLogicalMessage(lm LogicalMessage) bool { + if lm.Prefix != MESSAGE_PREFIX_CONTEXT { + LogDebug(r.config, "Ignoring logical message with prefix:", lm.Prefix) + return true + } + + // Create a temporary message to estimate size + tempMsg := &ChangeMessage{ + Op: OPERATION_MESSAGE, + Message: &MessagePayload{ + Prefix: lm.Prefix, + Content: string(lm.Content), + }, + } + + data, err := json.Marshal(tempMsg) + if err != nil { + LogError(r.config, "Failed to marshal logical message for size check:", err) + return false + } + + dataSize := len(data) + + // Ignore oversized logical-message operations. + if dataSize > MAX_LOGICAL_MESSAGE_SIZE_BYTES { + LogWarn(r.config, fmt.Sprintf("Ignoring large context message = %.2fKB (larger than 10KB)", float64(dataSize)/1000)) + return true + } + + return false +} + +func getOpCode(operation string) string { + switch operation { + case "INSERT": + return OPERATION_CREATE + case "UPDATE": + return OPERATION_UPDATE + case "DELETE": + return OPERATION_DELETE + case "TRUNCATE": + return OPERATION_TRUNCATE + default: + return "" + } +} diff --git a/cdc/replication_test.go b/cdc/replication_test.go new file mode 100644 index 0000000..76633eb --- /dev/null +++ b/cdc/replication_test.go @@ -0,0 +1,107 @@ +package main + +import ( + "reflect" + "strings" + "testing" + + "github.com/jackc/pglogrepl" +) + +func TestShouldIgnoreLogicalMessage(t *testing.T) { + handler := &ReplicationHandler{config: &Config{LogLevel: LOG_LEVEL_ERROR}} + + tests := []struct { + name string + prefix string + content string + want bool + }{ + {name: "small context", prefix: MESSAGE_PREFIX_CONTEXT, content: "{}", want: false}, + {name: "large context", prefix: MESSAGE_PREFIX_CONTEXT, content: strings.Repeat("a", MAX_LOGICAL_MESSAGE_SIZE_BYTES), want: true}, + {name: "non-context", prefix: "other", content: "{}", want: true}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + logicalMessage := LogicalMessage{Prefix: tt.prefix, Content: []byte(tt.content)} + if got := handler.shouldIgnoreLogicalMessage(logicalMessage); got != tt.want { + t.Fatalf("shouldIgnoreLogicalMessage() = %t, want %t", got, tt.want) + } + }) + } +} + +func TestResolveUnchangedToastFromBeforeCopiesFromFullOldTuple(t *testing.T) { + before := map[string]interface{}{ + "id": int64(1), + "payload": "old toast value", + "name": "before", + } + after := map[string]interface{}{ + "id": int64(1), + "payload": UNCHANGED_TOAST, + "name": "after", + } + + resolveUnchangedToastFromBefore(pglogrepl.UpdateMessageTupleTypeOld, before, after) + + want := map[string]interface{}{ + "id": int64(1), + "payload": "old toast value", + "name": "after", + } + if !reflect.DeepEqual(after, want) { + t.Fatalf("resolved after mismatch:\nwant: %#v\ngot: %#v", want, after) + } +} + +func TestResolveUnchangedToastFromBeforeRequiresFullOldTuple(t *testing.T) { + before := map[string]interface{}{ + "payload": "old toast value", + } + after := map[string]interface{}{ + "payload": UNCHANGED_TOAST, + } + + resolveUnchangedToastFromBefore(pglogrepl.UpdateMessageTupleTypeKey, before, after) + + if after["payload"] != UNCHANGED_TOAST { + t.Fatalf("expected toast marker to remain without full old tuple, got %#v", after["payload"]) + } +} + +func TestResolveUnchangedToastFromBeforeLeavesUnknownValues(t *testing.T) { + tests := []struct { + name string + before map[string]interface{} + after map[string]interface{} + }{ + { + name: "missing before column", + before: map[string]interface{}{}, + after: map[string]interface{}{ + "payload": UNCHANGED_TOAST, + }, + }, + { + name: "unchanged toast before value", + before: map[string]interface{}{ + "payload": UNCHANGED_TOAST, + }, + after: map[string]interface{}{ + "payload": UNCHANGED_TOAST, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + resolveUnchangedToastFromBefore(pglogrepl.UpdateMessageTupleTypeOld, tt.before, tt.after) + + if tt.after["payload"] != UNCHANGED_TOAST { + t.Fatalf("expected unresolved toast marker, got %#v", tt.after["payload"]) + } + }) + } +} diff --git a/cdc/search_snapshot.go b/cdc/search_snapshot.go new file mode 100644 index 0000000..9e14935 --- /dev/null +++ b/cdc/search_snapshot.go @@ -0,0 +1,140 @@ +package main + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "time" + + "github.com/jackc/pglogrepl" + "github.com/jackc/pgx/v5" +) + +const SEARCH_SNAPSHOT_FLUSH_SIZE = 1000 + +func (r *ReplicationHandler) RunSearchSnapshot(ctx context.Context) error { + if len(r.config.SearchTables) == 0 { + return nil + } + + conn, err := pgx.Connect(ctx, r.config.DatabaseURL) + if err != nil { + return fmt.Errorf("failed to connect for search snapshot: %w", err) + } + defer conn.Close(ctx) + var snapshotLSNText string + if err := conn.QueryRow(ctx, "SELECT pg_current_wal_lsn()::text").Scan(&snapshotLSNText); err != nil { + return fmt.Errorf("failed to read search snapshot position: %w", err) + } + snapshotLSN, err := pglogrepl.ParseLSN(snapshotLSNText) + if err != nil { + return fmt.Errorf("failed to parse search snapshot position: %w", err) + } + tx, err := conn.BeginTx(ctx, pgx.TxOptions{IsoLevel: pgx.RepeatableRead, AccessMode: pgx.ReadOnly}) + if err != nil { + return fmt.Errorf("failed to begin search snapshot: %w", err) + } + defer tx.Rollback(ctx) + snapshotTime := time.Now() + + for _, configuredTable := range r.config.SearchTables { + schema, table, err := splitSchemaTable(configuredTable) + if err != nil { + return err + } + primaryKeys, err := queryPrimaryKey(ctx, tx, schema, table) + if err != nil { + return err + } + if len(primaryKeys) == 0 { + return fmt.Errorf("search table %s must have a primary key", configuredTable) + } + + rows, err := tx.Query(ctx, "SELECT to_jsonb(snapshot_row) FROM "+pgx.Identifier{schema, table}.Sanitize()+" AS snapshot_row") + if err != nil { + return fmt.Errorf("failed to snapshot %s: %w", configuredTable, err) + } + count := 0 + for rows.Next() { + var raw []byte + if err := rows.Scan(&raw); err != nil { + rows.Close() + return err + } + var after map[string]interface{} + decoder := json.NewDecoder(bytes.NewReader(raw)) + decoder.UseNumber() + if err := decoder.Decode(&after); err != nil { + rows.Close() + return err + } + message := &ChangeMessage{ + After: after, + Op: OPERATION_CREATE, + TsUs: snapshotTime.UnixMicro(), + Products: []string{PRODUCT_SEARCH}, + Source: SourceMetadata{ + TsUs: snapshotTime.UnixMicro(), + Db: r.dbName, + Schema: schema, + Table: table, + Lsn: uint64(snapshotLSN), + Pk: primaryKeys, + }, + } + if err := r.natsPublisher.PublishChange(message); err != nil { + rows.Close() + return err + } + count++ + if count%SEARCH_SNAPSHOT_FLUSH_SIZE == 0 { + if err := r.natsPublisher.Flush(); err != nil { + rows.Close() + return err + } + } + } + if err := rows.Err(); err != nil { + rows.Close() + return err + } + rows.Close() + // The processor normally holds an unpaired transaction tail briefly for a + // possible context message. This marker closes the synthetic snapshot batch. + if err := r.natsPublisher.PublishChange(&ChangeMessage{ + Op: OPERATION_MESSAGE, + TsUs: snapshotTime.UnixMicro(), + Products: []string{PRODUCT_SEARCH}, + Source: SourceMetadata{ + TsUs: snapshotTime.UnixMicro(), + Db: r.dbName, + Schema: schema, + Table: table, + Lsn: uint64(snapshotLSN), + }, + }); err != nil { + return err + } + if err := r.natsPublisher.Flush(); err != nil { + return err + } + LogInfo(r.config, fmt.Sprintf("Published %d search snapshot rows for %s", count, configuredTable)) + } + if err := tx.Commit(ctx); err != nil { + return fmt.Errorf("failed to commit search snapshot: %w", err) + } + return nil +} + +func splitSchemaTable(value string) (string, string, error) { + for i := 0; i < len(value); i++ { + if value[i] == '.' { + if i == 0 || i == len(value)-1 { + break + } + return value[:i], value[i+1:], nil + } + } + return "", "", fmt.Errorf("invalid schema-qualified search table %q", value) +} diff --git a/cdc/setup.go b/cdc/setup.go new file mode 100644 index 0000000..6634263 --- /dev/null +++ b/cdc/setup.go @@ -0,0 +1,105 @@ +package main + +import ( + "context" + "fmt" + + "github.com/jackc/pgx/v5" + "github.com/jackc/pgx/v5/pgconn" +) + +func SetupReplicaIdentity(ctx context.Context, config *Config) error { + connConfig, err := pgx.ParseConfig(config.DatabaseURL) + if err != nil { + return fmt.Errorf("failed to parse database config: %w", err) + } + + hadNotices := false + connConfig.OnNotice = func(_ *pgconn.PgConn, notice *pgconn.Notice) { + hadNotices = true + LogWarn(config, "PostgreSQL notice:", notice.Message) + } + + conn, err := pgx.ConnectConfig(ctx, connConfig) + if err != nil { + return fmt.Errorf("failed to connect: %w", err) + } + defer conn.Close(ctx) + + sql := fmt.Sprintf(` +DO $do$ +BEGIN + CREATE OR REPLACE PROCEDURE public._%s_set_replica_identity() + AS $$ + DECLARE current_schemaname TEXT; + DECLARE current_tablename TEXT; + BEGIN + FOR current_schemaname, current_tablename IN + SELECT t.schemaname, t.tablename + FROM pg_tables t + JOIN pg_class c ON c.relname = t.tablename + JOIN pg_namespace n ON n.oid = c.relnamespace AND n.nspname = t.schemaname + WHERE t.schemaname NOT IN ('information_schema', 'pg_catalog') + AND t.schemaname NOT LIKE 'pg_toast%%' + AND t.schemaname NOT LIKE 'pg_temp_%%' + AND c.relkind != 'f' AND c.relreplident != 'f' + LOOP + BEGIN + EXECUTE format('ALTER TABLE %%I.%%I REPLICA IDENTITY FULL', current_schemaname, current_tablename); + EXCEPTION WHEN insufficient_privilege THEN + RAISE NOTICE 'Insufficient privilege, skipping table %%.%%', current_schemaname, current_tablename; + END; + END LOOP; + END + $$ LANGUAGE plpgsql + SET search_path = ''; + + CALL public._%s_set_replica_identity(); +EXCEPTION WHEN insufficient_privilege OR read_only_sql_transaction THEN + RAISE NOTICE 'Insufficient privilege or read-only transaction, skipping replica identity setup'; +END +$do$ LANGUAGE plpgsql; + +DO $do$ +BEGIN + CREATE OR REPLACE FUNCTION public._%s_set_replica_identity_func() RETURNS event_trigger + AS $$ + BEGIN + CALL public._%s_set_replica_identity(); + END + $$ LANGUAGE plpgsql + SET search_path = ''; +EXCEPTION WHEN insufficient_privilege OR read_only_sql_transaction THEN + RAISE NOTICE 'Insufficient privilege or read-only transaction, skipping function creation'; +END +$do$ LANGUAGE plpgsql; + +DO $do$ +BEGIN + IF EXISTS (SELECT 1 FROM pg_proc p JOIN pg_namespace n ON p.pronamespace = n.oid WHERE n.nspname = 'public' AND p.proname = '_%s_set_replica_identity_func') THEN + DROP EVENT TRIGGER IF EXISTS _%s_set_replica_identity_trigger; + CREATE EVENT TRIGGER _%s_set_replica_identity_trigger ON ddl_command_end WHEN TAG IN ('CREATE TABLE') + EXECUTE FUNCTION public._%s_set_replica_identity_func(); + ELSE + RAISE NOTICE 'Function public._%s_set_replica_identity_func() does not exist, skipping event trigger creation'; + END IF; +EXCEPTION WHEN insufficient_privilege OR read_only_sql_transaction OR duplicate_object THEN + RAISE NOTICE 'Insufficient privilege, read-only transaction, or duplicate object, skipping event trigger creation'; +END +$do$ LANGUAGE plpgsql; +`, config.PublicationName, config.PublicationName, config.PublicationName, config.PublicationName, + config.PublicationName, config.PublicationName, config.PublicationName, config.PublicationName, config.PublicationName) + + _, err = conn.Exec(ctx, sql) + if err != nil { + return fmt.Errorf("failed to setup replica identity: %w", err) + } + + if hadNotices { + LogWarn(config, "Replica identity setup completed with warnings") + return nil + } + + LogInfo(config, "Replica identity setup completed") + return nil +} diff --git a/cdc/transaction.go b/cdc/transaction.go new file mode 100644 index 0000000..9b59707 --- /dev/null +++ b/cdc/transaction.go @@ -0,0 +1,70 @@ +package main + +import ( + "time" + + "github.com/jackc/pglogrepl" +) + +type Change struct { + Operation string + Schema string + Table string + Position uint64 + Before map[string]interface{} + After map[string]interface{} +} + +type LogicalMessage struct { + Prefix string + Content []byte + Transactional bool + Position uint64 +} + +type Transaction struct { + XID uint32 + CommitTime time.Time + Changes []Change + LogicalMessages []LogicalMessage +} + +type TransactionBuffer struct { + currentTxn *Transaction +} + +func NewTransactionBuffer() *TransactionBuffer { + return &TransactionBuffer{} +} + +func (tb *TransactionBuffer) Begin(msg *pglogrepl.BeginMessage) { + tb.currentTxn = &Transaction{ + XID: msg.Xid, + Changes: []Change{}, + LogicalMessages: []LogicalMessage{}, + } +} + +func (tb *TransactionBuffer) AddChange(change Change) { + if tb.currentTxn != nil { + tb.currentTxn.Changes = append(tb.currentTxn.Changes, change) + } +} + +func (tb *TransactionBuffer) AddLogicalMessage(msg LogicalMessage) { + if tb.currentTxn != nil { + tb.currentTxn.LogicalMessages = append(tb.currentTxn.LogicalMessages, msg) + } +} + +func (tb *TransactionBuffer) Commit(msg *pglogrepl.CommitMessage) { + if tb.currentTxn != nil { + tb.currentTxn.CommitTime = msg.CommitTime + } +} + +func (tb *TransactionBuffer) GetTransaction() *Transaction { + txn := tb.currentTxn + tb.currentTxn = nil + return txn +} diff --git a/cdc/typemap.go b/cdc/typemap.go new file mode 100644 index 0000000..867eb07 --- /dev/null +++ b/cdc/typemap.go @@ -0,0 +1,141 @@ +package main + +import ( + "context" + "encoding/binary" + "encoding/json" + "fmt" + "math" + "strconv" + + "github.com/jackc/pgx/v5" +) + +type TypeMap struct { + types map[uint32]string +} + +func LoadTypeMap(ctx context.Context, databaseURL string) (*TypeMap, error) { + conn, err := pgx.Connect(ctx, databaseURL) + if err != nil { + return nil, fmt.Errorf("failed to connect: %w", err) + } + defer conn.Close(ctx) + + rows, err := conn.Query(ctx, "SELECT oid, typname FROM pg_type") + if err != nil { + return nil, fmt.Errorf("failed to query types: %w", err) + } + defer rows.Close() + + types := make(map[uint32]string) + for rows.Next() { + var oid uint32 + var typname string + if err := rows.Scan(&oid, &typname); err != nil { + return nil, err + } + types[oid] = typname + } + + return &TypeMap{types: types}, nil +} + +func (tm *TypeMap) DecodeValue(dataType uint32, data []byte) interface{} { + if data == nil { + return nil + } + + typeName, ok := tm.types[dataType] + if !ok { + return string(data) + } + + switch typeName { + case "bool": + switch string(data) { + case "t", "true": + return true + case "f", "false": + return false + } + return data[0] == 1 + + case "int2": + if value, err := strconv.ParseInt(string(data), 10, 16); err == nil { + return int16(value) + } + + case "int4": + if value, err := strconv.ParseInt(string(data), 10, 32); err == nil { + return int32(value) + } + + case "int8": + if value, err := strconv.ParseInt(string(data), 10, 64); err == nil { + return value + } + + case "float4": + if value, err := strconv.ParseFloat(string(data), 32); err == nil { + if math.IsInf(value, 0) || math.IsNaN(value) { + return string(data) + } + return float32(value) + } + if len(data) == 4 { + bits := binary.BigEndian.Uint32(data) + value := math.Float32frombits(bits) + if math.IsInf(float64(value), 0) || math.IsNaN(float64(value)) { + return strconv.FormatFloat(float64(value), 'g', -1, 32) + } + return value + } + + case "float8": + if value, err := strconv.ParseFloat(string(data), 64); err == nil { + if math.IsInf(value, 0) || math.IsNaN(value) { + return string(data) + } + return value + } + if len(data) == 8 { + bits := binary.BigEndian.Uint64(data) + value := math.Float64frombits(bits) + if math.IsInf(value, 0) || math.IsNaN(value) { + return strconv.FormatFloat(value, 'g', -1, 64) + } + return value + } + + case "timestamp", "timestamptz": + return string(data) + + case "date": + return string(data) + + case "json", "jsonb": + if typeName == "jsonb" && len(data) > 0 && data[0] == 1 { + data = data[1:] + } + var result interface{} + if err := json.Unmarshal(data, &result); err == nil { + return result + } + return string(data) + + case "uuid": + if len(data) == 16 { + return fmt.Sprintf("%x-%x-%x-%x-%x", + data[0:4], data[4:6], data[6:8], data[8:10], data[10:16]) + } + + case "bytea": + return fmt.Sprintf("\\x%x", data) + + default: + return string(data) + } + + return string(data) +} diff --git a/cdc/typemap_test.go b/cdc/typemap_test.go new file mode 100644 index 0000000..2f7b03f --- /dev/null +++ b/cdc/typemap_test.go @@ -0,0 +1,69 @@ +package main + +import ( + "encoding/json" + "testing" +) + +func TestDecodeValueParsesTextInt4(t *testing.T) { + typeMap := &TypeMap{types: map[uint32]string{23: "int4"}} + + got := typeMap.DecodeValue(23, []byte("6889")) + + if got != int32(6889) { + t.Fatalf("expected text int4 to decode as 6889, got %#v", got) + } +} + +func TestDecodeValueParsesTextInt8(t *testing.T) { + typeMap := &TypeMap{types: map[uint32]string{20: "int8"}} + + got := typeMap.DecodeValue(20, []byte("2579335")) + + if got != int64(2579335) { + t.Fatalf("expected text int8 to decode as 2579335, got %#v", got) + } +} + +func TestDecodeValueParsesTextFloat4BeforeBinaryFallback(t *testing.T) { + typeMap := &TypeMap{types: map[uint32]string{700: "float4"}} + + got := typeMap.DecodeValue(700, []byte("1.25")) + + if got != float32(1.25) { + t.Fatalf("expected text float4 to decode as 1.25, got %#v", got) + } +} + +func TestDecodeValuePreservesNonFiniteTextFloatsAsStrings(t *testing.T) { + typeMap := &TypeMap{types: map[uint32]string{ + 700: "float4", + 701: "float8", + }} + + tests := []struct { + name string + dataType uint32 + value string + }{ + {name: "float4 infinity", dataType: 700, value: "Infinity"}, + {name: "float4 negative infinity", dataType: 700, value: "-Infinity"}, + {name: "float4 NaN", dataType: 700, value: "NaN"}, + {name: "float8 infinity", dataType: 701, value: "Infinity"}, + {name: "float8 negative infinity", dataType: 701, value: "-Infinity"}, + {name: "float8 NaN", dataType: 701, value: "NaN"}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := typeMap.DecodeValue(tt.dataType, []byte(tt.value)) + + if got != tt.value { + t.Fatalf("expected %q to remain a string, got %#v", tt.value, got) + } + if _, err := json.Marshal(got); err != nil { + t.Fatalf("expected decoded value to be JSON-compatible: %v", err) + } + }) + } +} diff --git a/devbox.json b/devbox.json index fdd18df..cedcb60 100644 --- a/devbox.json +++ b/devbox.json @@ -1,15 +1,4 @@ { - "$schema": "https://raw.githubusercontent.com/jetify-com/devbox/0.13.1/.schema/devbox.schema.json", - "packages": [ - "go@1.24.4", - "postgresql@latest" - ], - "shell": { - "init_hook": [], - "scripts": { - "test": [ - "echo \"Error: no test specified\" && exit 1" - ] - } - } + "packages": ["go@1.26"], + "shell": {"init_hook": [], "scripts": {}} } diff --git a/devbox.lock b/devbox.lock deleted file mode 100644 index 31d7b11..0000000 --- a/devbox.lock +++ /dev/null @@ -1,182 +0,0 @@ -{ - "lockfile_version": "1", - "packages": { - "github:NixOS/nixpkgs/nixpkgs-unstable": { - "last_modified": "2025-07-19T04:40:28Z", - "resolved": "github:NixOS/nixpkgs/6b4955211758ba47fac850c040a27f23b9b4008f?lastModified=1752900028&narHash=sha256-dPALCtmik9Wr14MGqVXm%2BOQcv7vhPBXcWNIOThGnB%2FQ%3D" - }, - "go@1.24.4": { - "last_modified": "2025-07-13T22:45:35Z", - "resolved": "github:NixOS/nixpkgs/a421ac6595024edcfbb1ef950a3712b89161c359#go", - "source": "devbox-search", - "version": "1.24.4", - "systems": { - "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/f4a0g1p943l61wfvqnpdr73v9bsyfhf2-go-1.24.4", - "default": true - } - ], - "store_path": "/nix/store/f4a0g1p943l61wfvqnpdr73v9bsyfhf2-go-1.24.4" - }, - "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/mdyik6amglpjs533vk927f9w1qmyw239-go-1.24.4", - "default": true - } - ], - "store_path": "/nix/store/mdyik6amglpjs533vk927f9w1qmyw239-go-1.24.4" - }, - "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/b56ngr9p7x6z368w8m7ps95r3x8gdfv7-go-1.24.4", - "default": true - } - ], - "store_path": "/nix/store/b56ngr9p7x6z368w8m7ps95r3x8gdfv7-go-1.24.4" - }, - "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/xrzqlk92h7z5mz9mlc4a9dyy91n5b68i-go-1.24.4", - "default": true - } - ], - "store_path": "/nix/store/xrzqlk92h7z5mz9mlc4a9dyy91n5b68i-go-1.24.4" - } - } - }, - "postgresql@latest": { - "last_modified": "2025-03-25T17:32:05Z", - "plugin_version": "0.0.2", - "resolved": "github:NixOS/nixpkgs/25d1b84f5c90632a623c48d83a2faf156451e6b1#postgresql", - "source": "devbox-search", - "version": "17.4", - "systems": { - "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/prh52g9iwjdddxbv4n0b52gbnlxnnk6w-postgresql-17.4", - "default": true - }, - { - "name": "man", - "path": "/nix/store/il144892arv36x68b5y95bkvrq32ym91-postgresql-17.4-man", - "default": true - }, - { - "name": "dev", - "path": "/nix/store/7gf8hy13r7li2balcini7004aml54l5n-postgresql-17.4-dev" - }, - { - "name": "doc", - "path": "/nix/store/6x00505hxzfwjfpk15v6p4qqnbpk5dza-postgresql-17.4-doc" - }, - { - "name": "lib", - "path": "/nix/store/c9g6v34cjsf308m9xzcs7figc1vgbbw3-postgresql-17.4-lib" - } - ], - "store_path": "/nix/store/prh52g9iwjdddxbv4n0b52gbnlxnnk6w-postgresql-17.4" - }, - "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/1lgjdy1nm8l68y2jw6m1lhas4j5jcmk1-postgresql-17.4", - "default": true - }, - { - "name": "man", - "path": "/nix/store/1v352rrzfv5p105jfaizxhd29nk41hgp-postgresql-17.4-man", - "default": true - }, - { - "name": "debug", - "path": "/nix/store/5bywayb6ywgznzh9cck9wpya1bzg4v0a-postgresql-17.4-debug" - }, - { - "name": "dev", - "path": "/nix/store/zs35b02p7cay6jp7zr1xihwx8vzab17c-postgresql-17.4-dev" - }, - { - "name": "doc", - "path": "/nix/store/1qccl3dm5wcja6h2kjkhvs5r9l1bx4hz-postgresql-17.4-doc" - }, - { - "name": "lib", - "path": "/nix/store/kyh4l6wsjgwghvjw9810p7nn1ap106mj-postgresql-17.4-lib" - } - ], - "store_path": "/nix/store/1lgjdy1nm8l68y2jw6m1lhas4j5jcmk1-postgresql-17.4" - }, - "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/0mzgv54qxafr66f4d7prz42fhs833mhk-postgresql-17.4", - "default": true - }, - { - "name": "man", - "path": "/nix/store/akb98lb29c1x3mflzcwqy4a0gqfk331r-postgresql-17.4-man", - "default": true - }, - { - "name": "dev", - "path": "/nix/store/gpkbg9yhx7jji2hr3jp89q06hi6v7qrk-postgresql-17.4-dev" - }, - { - "name": "doc", - "path": "/nix/store/9hxw6pf1qnlz1ygx5ximyvc48swb54n0-postgresql-17.4-doc" - }, - { - "name": "lib", - "path": "/nix/store/kyml5v1q498ympq67jvcnhgmsn8384zk-postgresql-17.4-lib" - } - ], - "store_path": "/nix/store/0mzgv54qxafr66f4d7prz42fhs833mhk-postgresql-17.4" - }, - "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/snfxmriwav4i0k1fxp78xk5w12hbv4q9-postgresql-17.4", - "default": true - }, - { - "name": "man", - "path": "/nix/store/pcx190vq4awjcgpmj2flrbp9awhdc74q-postgresql-17.4-man", - "default": true - }, - { - "name": "lib", - "path": "/nix/store/yja4rgfrwyxckwqf10rbr4armbn0p2y5-postgresql-17.4-lib" - }, - { - "name": "debug", - "path": "/nix/store/zrlrz84kzfvnxcx5mis53scr205p29hx-postgresql-17.4-debug" - }, - { - "name": "dev", - "path": "/nix/store/piqzr58swwmbsngl3jp98xgrf17a960n-postgresql-17.4-dev" - }, - { - "name": "doc", - "path": "/nix/store/ilc5sycwvqjjfa33978nb1p14x358l1c-postgresql-17.4-doc" - } - ], - "store_path": "/nix/store/snfxmriwav4i0k1fxp78xk5w12hbv4q9-postgresql-17.4" - } - } - } - } -} diff --git a/docker/bin-test/minio_configure.sh b/docker/bin-test/minio_configure.sh deleted file mode 100755 index dbc25d6..0000000 --- a/docker/bin-test/minio_configure.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash - -set -euo pipefail - -echo "[MinIO] Waiting for server to be ready..." -until curl -f http://localhost:9000/minio/health/live 2>/dev/null; do - echo "MinIO not ready yet, waiting..." - sleep 2 -done -echo "[MinIO] Ready" - -echo "[MinIO] Creating $AWS_S3_BUCKET bucket..." -mc alias set local http://localhost:9000 minioadmin minioadmin123 -mc mb local/$AWS_S3_BUCKET --ignore-existing diff --git a/docker/bin-test/minio_start.sh b/docker/bin-test/minio_start.sh deleted file mode 100755 index e40792c..0000000 --- a/docker/bin-test/minio_start.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash - -set -euo pipefail - -echo "[MinIO] Starting..." -MINIO_ROOT_USER=minioadmin \ - MINIO_ROOT_PASSWORD=minioadmin123 \ - minio server /data/minio --address ":9000" --console-address ":9001" 2>&1 | sed 's/^/[MinIO] /' diff --git a/docker/bin-test/postgres_configure.sh b/docker/bin-test/postgres_configure.sh deleted file mode 100755 index a2bf8a4..0000000 --- a/docker/bin-test/postgres_configure.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash - -set -euo pipefail - -until /usr/lib/postgresql/16/bin/pg_isready -h localhost -p 5432 2>/dev/null; do - echo "[Postgres] Waiting for server to be ready..." - sleep 2 -done - -psql -d postgres -c "CREATE USER postgres WITH PASSWORD 'postgres' SUPERUSER;" 2>&1 | sed 's/^/[Postgres] /' -psql -d postgres -c "CREATE DATABASE catalog OWNER postgres;" 2>&1 | sed 's/^/[Postgres] /' - -echo "[Postgres] Configured successfully" diff --git a/docker/bin-test/postgres_start.sh b/docker/bin-test/postgres_start.sh deleted file mode 100755 index 35ddc97..0000000 --- a/docker/bin-test/postgres_start.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -set -euo pipefail - -export PGDATA="/var/lib/postgresql/data" - -/usr/lib/postgresql/16/bin/initdb -D "$PGDATA" 2>&1 | sed 's/^/[Postgres] /' - -/usr/lib/postgresql/16/bin/pg_ctl -D "$PGDATA" -l "$PGDATA/postgresql.log" start 2>&1 | sed 's/^/[Postgres] /' - -echo "[Postgres] started successfully" diff --git a/docker/bin-test/test.sh b/docker/bin-test/test.sh deleted file mode 100755 index 87280a5..0000000 --- a/docker/bin-test/test.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/bin/bash - -set -euo pipefail - -# Set common environment variables -export CATALOG_DATABASE_URL=postgres://postgres:postgres@localhost:5432/catalog -export AWS_REGION=us-east-1 -export AWS_ACCESS_KEY_ID=minioadmin -export AWS_SECRET_ACCESS_KEY=minioadmin123 -export AWS_S3_ENDPOINT=localhost:9000 -export AWS_S3_BUCKET=bemidb-bucket - -/app/bin/postgres_start.sh & -postgres_pid=$! -/app/bin/postgres_configure.sh - -psql $CATALOG_DATABASE_URL -f /app/scripts/catalog.sql - -/app/bin/minio_start.sh & -minio_pid=$! -trap 'kill -s TERM $postgres_pid $minio_pid 2>/dev/null' EXIT # kill children on exit -/app/bin/minio_configure.sh - -# Seed data -cd /app/src/syncer-postgres/lib -SOURCE_POSTGRES_SYNC_MODE=FULL_REFRESH \ - DESTINATION_SCHEMA_NAME=postgres \ - go test -v ./... - -# Run tests -cd /app/src/common -go test -v -count=1 ./... -cd /app/src/server -BEMIDB_USER=user \ - BEMIDB_PASSWORD=password \ - BEMIDB_LOG_LEVEL=ERROR \ - go test -v -count=1 ./... - -kill -s TERM $postgres_pid $minio_pid 2>/dev/null diff --git a/docker/bin/run.sh b/docker/bin/run.sh deleted file mode 100755 index 7afeac6..0000000 --- a/docker/bin/run.sh +++ /dev/null @@ -1,68 +0,0 @@ -#!/bin/bash - -set -euo pipefail - -case "${1:-}" in - bash) - exec /bin/bash - ;; - syncer-postgres) - : "${SOURCE_POSTGRES_DATABASE_URL:?Environment variable SOURCE_POSTGRES_DATABASE_URL must be set}" - : "${DESTINATION_SCHEMA_NAME:?Environment variable DESTINATION_SCHEMA_NAME must be set}" - - psql $CATALOG_DATABASE_URL -f /app/scripts/catalog.sql - - echo "Starting Syncer for PostgreSQL..." - SOURCE_POSTGRES_SYNC_MODE=FULL_REFRESH ./bin/syncer-postgres 2>&1 | sed 's/^/[Syncer] /' - echo "Syncer for PostgreSQL finished." - ;; - syncer-amplitude) - : "${SOURCE_AMPLITUDE_API_KEY:?Environment variable SOURCE_AMPLITUDE_API_KEY must be set}" - : "${SOURCE_AMPLITUDE_SECRET_KEY:?Environment variable SOURCE_AMPLITUDE_SECRET_KEY must be set}" - : "${DESTINATION_SCHEMA_NAME:?Environment variable DESTINATION_SCHEMA_NAME must be set}" - - psql $CATALOG_DATABASE_URL -f /app/scripts/catalog.sql - - echo "Starting Syncer for Amplitude..." - ./bin/syncer-amplitude 2>&1 | sed 's/^/[Syncer] /' - echo "Syncer for Amplitude finished." - ;; - syncer-attio) - : "${SOURCE_ATTIO_API_ACCESS_TOKEN:?Environment variable SOURCE_ATTIO_API_ACCESS_TOKEN must be set}" - : "${DESTINATION_SCHEMA_NAME:?Environment variable DESTINATION_SCHEMA_NAME must be set}" - - psql $CATALOG_DATABASE_URL -f /app/scripts/catalog.sql - - echo "Starting Syncer for Attio..." - ./bin/syncer-attio 2>&1 | sed 's/^/[Syncer] /' - echo "Syncer for Attio finished." - ;; - syncer-dialpad) - : "${NATS_URL:?Environment variable NATS_URL must be set}" - : "${NATS_JETSTREAM_STREAM:?Environment variable NATS_JETSTREAM_STREAM must be set}" - : "${NATS_JETSTREAM_SUBJECT:?Environment variable NATS_JETSTREAM_SUBJECT must be set}" - : "${NATS_JETSTREAM_CONSUMER_NAME:?Environment variable NATS_JETSTREAM_CONSUMER_NAME must be set}" - : "${DESTINATION_SCHEMA_NAME:?Environment variable DESTINATION_SCHEMA_NAME must be set}" - - psql $CATALOG_DATABASE_URL -f /app/scripts/catalog.sql - - echo "Starting Syncer for Dialpad..." - ./bin/syncer-dialpad 2>&1 | sed 's/^/[Syncer] /' - echo "Syncer for Dialpad finished." - ;; - server) - : "${AWS_REGION:?Environment variable AWS_REGION must be set}" - : "${AWS_S3_BUCKET:?Environment variable AWS_S3_BUCKET must be set}" - : "${AWS_ACCESS_KEY_ID:?Environment variable AWS_ACCESS_KEY_ID must be set}" - : "${AWS_SECRET_ACCESS_KEY:?Environment variable AWS_SECRET_ACCESS_KEY must be set}" - : "${CATALOG_DATABASE_URL:?Environment variable CATALOG_DATABASE_URL must be set}" - - echo "Starting server..." - ./bin/server - ;; - *) - echo "Unknown argument: ${1:-}" - echo "Available options: syncer-postgres, bash" - exit 1 - ;; -esac diff --git a/img/BemiDB.gif b/img/BemiDB.gif deleted file mode 100644 index ca3911239ec742b9da0e80cd7c6ca9fc4edcc9a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4235165 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�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

    0Ru2WcdX_|TGrPT|5;rXWV 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

    Sp$B!eqF>{T|__ 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

    #tIaAG0APV!aggI^eBBYU9a%u31N$2nzi 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 JyA@>+V_ zY1*0!)pg&W-2o5xO_FuwvRJezxzGE0x$!~lBvPM0;;Xv!eO|QY3~$_mp?H{#iN}iMUX(FJ6pB}=OcUMh zB@s8~3o*Hj?0pAW3P#0)bZT>sou>EYXUk;Hp@KEg)YnEp-pXIKP8oEdwJ`l2^f>&uRZEV;xN>y%L{sjO}`r=^#36tIb7q+eN{Z z2j}#=6cx1J1`djyChi&xizVrFnU2glEh30?kvag2Tme!4 z8^>kjt)m7CpV4w#1Cqs0s;g)R2wbQtfa*W7m)RLD|3q$q0*Jt1W?*Jl5nrrqU&s`D zU~gB9qknBZSBETLHMF^q@bMvXy@MJWnUV$_C$=@KLZP%ANK%|nB2RVhqGpedLP!9R zuscB#+SkdBe7G6Pc(H?;sLob5sMV^KL~knJxfyYmgu6UR>!BfIf& zJcBl3r9v&3DgqU>6Jad})oK1coB*n&CQo1mlio7Kl#8>vSkj`UX8Ar(92*Uu6Uho) zC%W8#M$TOZ{(A?J6|4*+H28xdwog^@=y_Lg)fp{kpbnkx8G#|T3hyX`Ni$K=ffgbt zc^}9+Zn}Vk#Hj;=IOi1B%URi>!8D4^-G)V=X4Wr;v~RKBhT}?G8g~%1e71*7A*;hp zyU;OSJ%gc`NW14>KBUCKgXh&j=*T_L5)RlFAI==lFa#%{QxJFxl?~-bD*xzoLtrC` zcxKu`oRB>Q_-0jBRFw<$KMnv@KeK?FhllRAZ9EZGk%d@yq*BRl&#>{KQ@LjzkASz+ zg+#o0=vs)^Z5d@jP4S#>Q}1m;>9Q=A zsGHT2)Nr?BIUY)%j7Q%W>pDuIS8?bKP)$)bAwn4T04)_Ih{C7s!#^bw52z}Y!Ei&3)=jBX(*@>$C}+x{$TpH7Js7m0qM)%% zW}mU5kY!gAVKpD1Um9cr@4zRvfA`X}aRM=^I3#O4ySx|>d)s9MNzA3wlX2^Un*-1j zgD>M;5ICQd-$r}ukbsf?URD?b+)c$S+!lF!^b-H+<$8FG?uOI~|Mp^y|Uzz#>|H<1YwF zUTa3uFe8(NK(J754;`%8ox^s3Rxm>LiA!!E$0CM9)!y~Mg;}}(vAh7lbiUdQx%v?sc&$Pxb&=gNYQn>*%_b~1PATT zVOgw*4$veC)IWusMBK_hd6}$pRU$d7x>>=J{vUZQrI(<#4M=IG+^nM1F`yKN15*jw z!Y)bQhegQTIAIrnq6OzSb9w5p5!nK2o3&j1E%pa*1%9q^Vs|pbdx^eh-DgXg-yM_p zL%5nBR>zbQf6H{nnV0bE@Lo2RSYEO|YHp(hB*)CAc(47B`vnS8>|l<+K0%-Y0r2qy zJp^j=M9uDpiABfBYC$c+gHOQpxzC&X%$KP7nx%G```qDuW>8v|jMUR!;k7EYH4Ob3 zXJy=WJiX62eJ=nQAFtd?m{!ZiiE$o2qX!+7%D>X58-lV|k0jvfI0Ovj60=pR8B_}L z{IyJ@=h)w;y0eBte6m#P%+ZR(G;4FH2g zmtN|4BN9bh10^&`xJ^^T081M$Lx(F(UCPQzd*rl2a{faLPC zCMX|K2vv=10kjKX#d%23Cm*zLC=X~mzK^~$QQ>uG7`|k^?q9Zs9iqK+kn9g=cJ`ss z>@?V)tZ(5;op+@*bto}OV+}uiJ>a1mfp`uNNIf^AY*}*zLa=Ac_h)NI zid(XX`|+d-Orn^rQmc-~?l-qyTcc_GF6+CO4r-!Qasi5*5!DKTVg3~(X*i-t0Rez{ zm51s2p53jHMxOM+f0jsPMNSv>szYCm998AHq&_-Dpc^eX%q@s5Sd5vD4s4#)WSNx! zWg9UuL0-_JE_7$r>AEf8Y1=~KT=#1w)ZVhD41Yjn>!2T@Q{9lDKN^hV7ND~-=!LKH zSNQa15_?&BHfxzcV;-kB!n|;)g4jeG+nN2w)xc zmMH=wAgT!41^oYjw1R1%BJ*8)GtMF6MK9C9ccvl$^CJs$S1>n+Xl@p4a>9+STEJ?1 zUYy)w_2$n>EqUHTMKEnEKAsLlV*xi8zRzL-Po>p-9f(NHhR&xLP*c9QN-HIb)@S#4 znC&)YS;Dvvo%oCk=8fv-jkD%Q3iD3{TH4pG%>+SWuHpoh@wma7cM9(Z2W#qB;`jHi z@!C`wC5HOjS`yAYaR-q!?vtdKI{umgdT3HQjdwtANCVC9^?-BR9g9k>Kom{338HMS z?;N^ii=x@;x(w*==D#D_(-UW}T@?blM5r88k`WO5gj+D0aD1$beLlwW^U2%f+z;tz zAVXK8%jk%u54B|#wF^AiL57%6MH^;*z2}P9eQTxn?)9h1E6<8n`W~;OxU6(t(T2&; zzNB7#$>ucp<9f2e^?y_fA#WLp9jKy%G9c`M0LUyRz`U@0%&vi0sq?dr^1u+)yOj|sg6 z?LB>UqkY-&LipNP8xfco%8QdAuJFP#>oy~f6iv--|`&I zfI)KDOsL&R*S}ox7VFo{E8)t&!e}2)bdOob$}7 zT`(KN!tHkBH)xU0TCljPaVNts%33_#fh?znEU&d(FIX=7JjpP zgP4^V%M)kB&fZzr1xx*8W|(K$8~ZhT%ydtFp<(pAZFCv9iO>&%rkz3IVRCz-g~TcB zjhRKysW|7U_&qSC8!Y>Zn(cX6QERz@vk=`Ou42PC5^Cb0?DWwj*x9>ZCkpc#HDR9I z@GhUIdYs^tPhs|5xx9s!r~7i7UqbaabJNGX08u1EGTB>||Nc*s$nm z*o&Y%`#m!;MbSzp#<>G=*=&~59@g^o1@2a)c;Am) z!x837Ne3UWZEV)8XHFuY_s}jZg+Cja7W=1Y_L17pwlibqlHW{%CjX^=+KrFvP5K6* ze&YhTyJ_`1?@c03@Fvbl?r`BCC8wlv*iUaKN?qAwQ}pee;X*=Eo_s1u4YqfSU&Id1 zd0RD$wd8JxWxq9ychp*t=I^CCCbjtF@lDp**T;I1^E!gdu10}*7n-4LM zX7gGYf|A9#ytG4rg6Y7$`ENt=06+Gr$BcOp6LTJMa&LUUQ2|kR`4mYByB(NWEHSU| z{WGsO$&wG!f0uley8mcjs?mPl!z4(8Hsq)P>L84=b&*Vgh3HTu{{(?`Dt;R7JXm^T z@$}m*)#v<9ItKvDDfzw!LR7aIg9N4VfB;}LPhtlf01gHQElNN$K;j*D!*=xXfI@KY z4)C*m-zpxB6H>=b7bQ}jLeyL`|89F{I-70E%+eKr-5MHN6+y5@Nc8*6emCGHe2kOq zm)E;Le;GRTPZOqET(ooTZ%r|5?_n5IAtGCtq+ap;zE_dSm4rn+EI)cQ_Fb~pD@m>W zS>Y}@M&6PRd|pOh@*WbzHkNnLMN&OB>$Y~*!C27Dnb-m?UdGzd-$k)HijccS$vrP7 zQTRn}aF!c6Z?_;30stoW@oxDouA{Qz09^f8Xb>vv7%dARlq|TCHFMx4^YvV|WcA^~;OG;8-r#v-8#cMbf zSREB_Ry*#<0`Ll92*tjZ?}WR%N!q0&XQCpqj(N*&IP!%6y}jZ^ewQ3q6$UB_)~x8A zo8nxAV-k5YTH6ytPH)9l{m!6Z6%;=WsGMQq8g)Y4U7)ZnX@1Rks;}_czphp9UH0jv z7KHlVtvfmygPUjmOI$add)>IRHEChpY{IWDv>FrmeW)&D#-%19Wqiaw3$2mQN@^`-~i;OA{WQnsh)N_5O z$Dibrio49!+!VW|s%izT7PhbD$Ne*q#?g3)EWQI9P07<|EN>`)6a)Tg!Z4(A)m*=M|i$^~m@R z%@ZhJ`IEuBePB$vYLH5KNId)kGw=9HakRK;dRs}zzMAj ziESUu`wz~{y84nCs<|j|_XqZ#6LKYo=_U{Uk<|{JSUopVlP5crMN`u_eah3T9_~-QgTS5tW#)L9~>$92f$mt*!Lh6E&t?s74af zowmf_K7X93{In!~+LE7bAIA~AmixnC*ZAwWIhF1S{zmL8PIp-hQWsl}yW4wFhLBq} zxTWW|kt6CzHOG;OV*9g9!1QSimc$L23;=8u*6MjXbHkwXJu(R$ z#!u9arB~>+OPCZ?9a~-fWS^-)rkjX+xI4Fs7rzZ=VV7jeJWc!}Ps{A~M3tVxJ{=%S zkiL2-j2@msFL@8l4%%!xfV_U#i|n!e%BLjxd;J7|Pfv&gHw5M=$PjCAXlinwC!hH= z1?N1!EiYw;Hfe&KL|8R>oOZ&!fm|*k>sQ0hK=fsU&d7c%b(A!J^j?t3Umq~`G-B>1 z=Gh;E$UT>Ev~lz*%Je$}3ihXmtV?9%hxb3Zde6b_?DhTd=jKuI=e+IAogL35*y_H0 zRna1CZ?n{MAv(rD3^DP2s}0WOgL>}jmn3IZPhM<%a{d0-x@!}68mc}R<*GUj?!G^A zpu%~_iRbGN=YBKXJzvl7NQ+#;G>KKVs^m63lVRUh1A_y`LFs*}7Bm)En?H#wV?)&v1qz*&Nics< zp>E+H#Q=f2{MEHwJ)aV4r|<{i)-WqF?Opwm$VB%QCKPj-;$&r&8L<+4I({zT!lx;? z{ln@qWti{9jKUf?T50d^fT)Uv>$i?~Se;77PTQU0Lx96Afi9^)kVH)%XZOlwu*?89 z=|Fe!2=5D1lH&qCnqXA)8c1$0xw&f=d~n#M3)Pl?DyKw_&Pw6n)sytXyw(jy*AO<16+^3*g^BV zfAK4?uRO|+^|p$Se8Ze*pd^+fE=;>$j_3$cyuJVp+W6o?yw}rrs-uyA2s;IqI8t*2 zv&_x28Fa?GlseyNa585?9@7rz*}m^1yk5*Ts$>J5n;h}OFlVE_Te*s^9NA4`ozrn+ z>H*)nl;ge^(Q!vS-iy5CYb!dj_yf{sT2kuntUWRCVo80_KS<^I=EMj{9{T7N!l=+W zHZ^qkRAAE;M@>A{d0R(5{LHqxyZ%YRnlHO5$VCZFqpOXL7ZRdnP7Tz?hwDx_{W)-b zS9DZ?jl$o?-sj?Bei65zAXLfFS(t)UaA8=j^5H%(2P233*+vi&%$d){L~eciVL-Vp zwMI(i&{RR9OWm8LPi5ur*IT( zQl#CRzvtQ=a@hFW{Rn6j7%|eRQgbZqBy7b}rOyYd0QhN76%H!d;mSGZ;u3thAzCiL zw#x6sGj6XTn`+F`0=|6Hk`e5JzY*Na@KO-AHX90&gZrI&+R}6+L8P7x} z+<`$q;FhL!%Um#bEv@NYFBTv0r=Lk&or3$dfx69PYIJR?L)-xs)C$Xk+UX_IzImPU zH)0LU&aZ35dU&|A3fL@S;a7vea;kLnbNTH-F_9aW<;5tc{D+AJp|hnLLP564COUVv z_i1DHxA=o0`kzHv`-^rYU3}+PtIoaXWuUh3H6m_ykZpXqT=h9_T2>Co_;)_@A39Wg^i9{J4v(;Z-=nl$KRo^M`zlz^B$>mzkMzIfy6Avm z%w~HmZWi}@X8k<&M`9HG<*?95YmxKrzfm}OZI4YCJY`_OKE>2VO_PW5AA=Z(6Zg1> z3{9X7?sPwM`~-JjoKR?mNgD2{{_?sLq|`5Ht@;8Pe-FJFk$mHLM3r?(6+y1EztY9D zvig)`8c69rLoxv#u`xZ&``f$U?pMju?6jWk`u%Pz*QQq+u|CzZ*?o=#;oiK(Kdg-- z6b5VA2deWNWZb)!Yg`~YNn%eDrux|D+l)(+YxAk2M5t9_=D!bn+mw36CEdUY0%-LM z140a2q;DZ^4cH(L->qFNQPQhh!fVX^K&NCVQ9`*FYMo=$>_F`U>J4=2A$A*`0qLYv zAsgt=OMJH_78x3UOuAjp{pV=L056Q=QIgg19Uqt*OoQnlD#CfuNt{V!gY<L7AExXJkJB>HGv^FvgT^y;2jtk68 zH7|%+BG`n@LzctM)0~q+a#}yLq5w5f8!WV!qZJ>h)(6433RIbRSJG+e2?rtoDCgl| zB*42i6;T4pQJRG_@M`Q5UPnvP$M?Ms-ucpJJcgc$aq5a)^fF7#G^c{JJ-|0@gn_xYk2rry722b|tP&AL#70VYp+Rr-L&O6#Z?{c4+u*Y&qX%64_^~r5IDo4`QEFIKP z%3dweCf3z{_|J0DKs?bAH(#4+1HubIc*{OUgQM?^hCV0HJT>C)Q!a=qvhU{LQpr~5 zCyf#{RSQ|){&l7Hk}bN=0p1qb$~s%>cZF_FE_VZo8<{2^UE2~Ja|TJf>M_S1dI_VB z%K94NHaxNbr~;d{*XNS;MI38~tu&-Y_#T}Nlu1dap5+Xh%8f|w{0StP@*U$IJ$0#J zT?l)hFrXBbH`_ZO#Y)tQ0qyp@RbCucVmIHl#V3rj&Xl(S>05$sk}g`)K#)ElrMVN% z;E*lpIAW(j`gZ-j zeGw!NAj-ypKm}OHN-7j}TGfzM5f1DP-uBK(B`Ic9UXFDK%aY%1qS|FP(nZ}vSM@j_ zw(6ixbkt%9j7C5dN~e7p@shc-gGsn4uGcM4$Y>MVx6zP^fQEK}L?Rs~Rd2)wG3Tc2 z5%nxsGz;I$x<6*T`>h^h2D>KIvFRjFfrhGs25h_RD=3MTuEy0<@nM55(fI`!WE4O> zMyt2gxuo(N_*CcA;6D1+DObO*Th7`+xe`Dg6R9+Vz>y#npWC6@slwoFjYQ1`F@UVf zRjn0asUoyb=R**X44_jRI7C&E5F}Eu6v-jTCeb7o<4Rv04I1{9(Lng`;$&(lNOi+e z@qR>FKl#XzW=J^La%9qEi>a37XxZGUPt-lo;b1@kYcA5KGNu?JI2&8Azd843H2g@@#qVYpX&-+Z5`RfqlhrJhBuF-EXC%vwP3t~Od{&7`W zUijVeb`B_yt~+xLs+F|zXb_AMs{C5?xF0C{8i?8&CXt=kKCuYR0imb>0)RWM&XcO_ zgxfeMQvsTaO+;enHanKNTcV{G9l9nw7apThk800Gec(6r1Rpj z6fQ=Ci{|KVb^F~qPc^tlg$dA1yy-RZ6D`C}d1f(tA?i$;R@>axgOqwST1jp`rRpOH zs4>;)G{JM#(R#u!le~~K(&;>!ejOEru#41_@FVNn>_!iC-mw$e z1Ayw!6Vy6@`kYR5EuGW{Of>1d_eezU5dTnNgEZ&ABQNQFs|V^4K`3D-#v6DJzuSN2 z2P5l?iU*z40X+0b$HFhsN;%W2eo`Zthld#%D}s$?g=swf-OgR)_mS9N!rhQ~0-H>{ z`_;ZL>bPB|MVezbzuO$b#49KNHB5e0bu*)2j4a^5+W<%gP~|mH#Ye=bY<$-Ok{vi> z)SOLD|H1J1yc*3d!m{5a8OgHMuD3XVTbbCue55Od!sea-=p6aBGxEknRA;Y|<8y#y zwOzVnY*}XU#&szRXDiEKPx&)(6E)-aX-0N5tm*lE80YT~wM?*@X7MXaYQ5%Xx9C-0 z<{y2-i5>CXLU;-X<(-8~7L#0K>+o$rBPO)!(N^&heL->AJduvv5F)pb2Tj=$sL?ZLz)&}+1$la+FP8C85}i5$ z6paoCJs%#0a$3LjDOkJL&*)(I-At7Ecb3LBmY{iOtE+t*-1zpQyLFz2S2y@B&9`8s zzO;g+Kb_=odC#Zc_8Q}IcGapjUvXFB5ZwSEQ@FECHMQlERr>*JS%Ma+4`;;_) zNizGfutgp3auR{8-isK)B87p@Paclu-dWpF=d;|`7#^A15-nZFQnQidB)L#|*R@=- zW8QvnSJ4vwu?QV7jU50k^sg|&5)~ZGx95CSQr0l*%Ov^G(06I*tU2T_I^0Kmv(^lB z)2hv4trM>SB9AyyH9E~TctlkPb-oA>>)Z*+BrXEUK91`1WJprx)=aLw6tj;ksR!v) z-4LmIWL@|vl-vMoi}z!18d8Xz0o@RCgK#zejuG>QhYM4y51B&Mfyi1SRBGA1@36r#;DHXP=Wiai?6j(7LM${sZ+ip->~P$Tc3i%CH2H z2eg!#1}w;IVvQ(q)A8e&wepyC^Y`_e-|yetx$nlGqiU%Crpy!ZK34)l7tBvYq*jrQ z-*;*+c50+WRTacU4X{w0IeRP(T_&tGb1>X6)>!;VNKmn&@)*Nnt_1|Fwk6?F1)11@ z)i|I>_F#gKL;S16NlmI6cA}NjR&&zyzy$!3av156{O=KV>*s_>f>AJ#<{0N)GKkFF z=+I)T&7OSg2NFaiu|A&i!XJ|Q7-}SXnK{&H=zho`YnK+gQ;%|}KE_oq&*9}A2i?N( z3&a%$r1i=b=g=L!7vYxSh4}+lG)DUKW6B)uA))1nq!;Dc;kMuGHByx$o5Dpi_Cor* zW47-z{;>-Gy_f6#aQfjpv7@|;@WRoErxM1JDF8X2>F&83+aD2($8@SX3C6K?X}X`x zA&%%aj`T*CbTIJHh9f*c=H|Wm`#ZsA*tZ7npP4@Y4<8_wwOSMz@E!NPTh-BVU`{(v z>vY;uc0Gg~W&uF1C+AcH76|%W_=e-Z&VcV;3@rvt_OS5j{*Be>JZWP9*+o~6eHirL z2`1ibMlCpN4x`t>3%Ggi85Cr=Ht^z(D|GvyeG@zcX`A5ka4^An3xGa!EF+wv7pEv^ z`~qA==`#~oO-29ReN?2p|+0!=udxs?0Wq{BaM#X@@KI7l|zm?n< z&X=-5|6v|V3qi~|KH`w@9Leq zihW?FgEdczWe&!rzwi7;xRyaHLX=3&ec_v)14)NZcT@G~az%jZU(UIzL2)Uti3j{Q z2G82u{*m95r^F3k@x7AdF13^Bb+d@d{pE)JPP-CX=jIgO7XRh3)17#U%CrNMPfE0R zJ{oDWoBBOxeAe#bdUEWWTSku$zq+Izzd3Z{JM?=BHd5Sweb>&H7q@e#g%RXGum1jb zZ1(5b2WL|s3y-a@9^9{%!Mi7Dvza0az!KJ!DfN(~`GmsC6X*M>y-3EFSQ}v^LDW>X3JfbFVm`8+ON`)kQT{^L`^!<`8Wqd}E zF+=aW7kRAi)usKI{4*Dij4XXsg6pqeDYl{NMoMXcK3vXB6psgKlzOaZpY>`IEndtx z@sz5S^z!3OF)l1tBpbE))L9^pj<3aCZWMo*IhQf_FXntq^O0y}{H1D1mB{)ft%_X@ z`M%@(%zI~=jt%i0-LlO8`-;}Z%~j_TH$y^lj8f;nU)mL3euVTWxTIA6aVj=w=6rTk zwwzs{?;&fyJyx2iFfZ3O95*~}x;@y>_@jmY=7*H(#_K;mCJaX(^1ig*i-TFyp5T68 zn&n)3Wf}u1$T1Cj^zz2}`{2({7P8l`ehvJ&A&L>&c17zT~gN3RZeUlzk4|AnE0?=;Hij_99?e3llrmwLAQwF64#Y`*LR>W z8P-b&Rtx1qA?tGczohA9*TLUV5a3yCp-=K{zpub3IOmqfVQxM*4f1w6u#xc zxT5Kg9MnR!mhwx$R)8btHV6bwVn2`_4bC=?`X{5Z8N0)t!fcG_z!mOxL{YAhCP)wM4o z-SZ|3v<5$W+^t5K&blkH{Uxbwtd5f!-b$(~r&P?!8;2@24b-=vs`zEPEpQ=UzK!xx zGJ|Y?8t8~!BRlB?94K%Y;Khq~iDk{FQqRM}p-G&!+T@L1{ist5JO2j5t~OjYmo$MY zC+o|Y>ZU!NW?U}Y6QM#m)2cSV6chC6+snfr$B}x(sUY9A9Y*^#Q3{X=!b0p5o3Yby zjlbZsJMVMK)=-Fyu<+nQ;uDLaZm8X_i5>k|hSoZ|u)x%Kmr_ZW$~rN($ivt{>*+-T zjs&7M~jT0$g9nu>c;XSd#EgP(WRH?pJmWP!^=byT8G zZDN%<#W!pbo%K8*RRDbUrJ@CQm*2DB=Wj7mUBmkOq6UMdJJkL2VK2h)sdh z*VOe!2j+HuroY`oiAIVlB$RNez+_Ul`tdv=)|#6A_Foqr74MvrSAFBiCfHF-bpB!2 zeJdU^NhoQ;Tl}a;>_bISa$I`p7oU)aBh6d)jVqe}LYrJ1pC{DrbAJ(#+4`d5XS9YK zOuPHA^xi(!aq-xBANP_^es>*k-Gvf5h$Aiml+u#+Ku=w_5~<)mo((J{P9yNVstYJH z35L!l8)06z7y31P-uJ9atB#gl=^6O(x8W)TGqkc9y}$4L4!h-XB%KYm&Fh03u}U5q z>DMxR-+S9N%8L=|R#`;enlAE=D3_tpNh~?NYpZtxPa-d*=KWuXJ2S%;fQ` zZF;m^W;Laad)<>`G6}pt4~99tNU<^Y#J?^j_Jtgee1BK22Uuw(gu?iTxnl7P{lISe zl%6H9U}xJz4Zp9aZsLhuPzTS)$xGJs^|MOJ&0}uKUxW(QVSjUMg0)ar>_AGQ6gswV{8=`U6tpn5g$2I{wNAT22%C1? z^{*tKrK4_}|GsPZn6Xu7${Ce+ell`#|BAu-w0Q-k|9}Cf0d3keVxsm7;E3#DZr^e7 zLW0qM_U}&s+A@V;86Quu`65z?JOR$KNFR6gPwUwWS=tBe7(;*I;F@UC{jr7yk`(@k zgXtZ1yNos)eNxN*oJGT!%xCM51w#r?loIfNZTcRxzwS;a$)EkJ`Dz(?Ua+xxscg!A z_!BOM_Aa3MZ|qO|Y2Cl^new8JGt$f@SVQR*iDot=<0Sj;!pIZC=)gk;qQ>#auVxk| zztW~^FlfiN6{UOFuUiEHc{Y}@yVA|nzf3!lWS3XpkfhH|`6Q$4qBmjcq1Ldi}pVv65&A?3#zqxlc z;3{Mk+g;OnopexM_pk?$z^I5Q?4>pvw(&2t5`6Ld{m8)?c zuXOg?6ur2QP@n)Yv%QeIh#(I5QFI;dQ%#}3Sb2L?U23tm!i06|vU&%S&qyYvcsz8| z31qk>g(E2nHTcGC^rHxAT&KhUQF)#SQ>}*a$8EX?&_kk%_-=*tag`2kat(Nu-=je7 zCA?+rlZ_?JB0?Y&f!%Q=FYQA_Awlea1zg0u*)~m36d2%`K-w4_KXw)mK+=Q@h0$VF z0b1e(kV{gl5k79OmarkI(OAatS?~&n@9ZdV(eP_TA4eI-dI04s^nG3SYq~dMZP5w= zH#T)Ad$`X-lAKveEEIh#&GALU|r)e4qR2(bm2=xPNF{k$S2#idK_y3>u>_)X3j z0n6;N<^aNp-tjRW5 zr~uZ?Dl8C4JQ5%#sd9I@m`##m6&Eu#NH|KLYs$tP6{*yV6nuVH6bjt?v)IY^b+HK?w0Wh`{8yx3OBla^D?6r-zW zdVi~@I}u*yycC|X8$+`{NXr;7 z2te{OlQy9j;E2*FAOtfAL;;byZP8B+={wB=6+jFH-nQX!B#)!k#+BlYNiRo{)Ca*T z%^u#D0kmOD%Vj6}a!2YlGxp?*6MCAqqR5R2bg(EXgyhMTwh?=0VoX>n9yk04%)%ai z-(wN$isl6b_gIa&&*T}^1-TWyuipDWtG4-jw~%$}#;|b~cnF z|D&1+V0g!{&Tm$;KGP$vYoZtF$w~CN^l{A03SqU4@R5Y3R43zZ-&m&sr-*b78c>Ra z5_kfCxdF{52vW;&hgX4F)&42~WO{qFiX0HK2uS>m4`7;n7ZNG~Cfb0(ftL>G0139a zqyO(fbPezkQLVXJB9=7wG8K4oOg`E}C6*3pr>P8-nLfvna4XVjhk$<+xC+f%4PEZ` zu!wCvkrSbLp$Qktm78tzLh-zexL(`un$9wj;+&pfx4OfK!+xt=_U^j|zYZO&HfhKy zeb4}&HoRk6(6T34@v1EF?8rF21=aX*A}EyTDe4*=83@JFJ*&oXih5ah<_M1plxyxP zBwNT;v2Y*x@{q0D8aNP<1NSROz{UtcIFKLbhAh!vvo(eQfY9Fj)WAZN1wd?z|4$&c zZ)>_0_y^L^9}Ge5TnuPTY>72dV*)62f;tiCWma-J)kG~BxSJW2$&~)Va#Fbqp!%uQ z{y?`AJs;xIG!_Z!zKx-rG&=#n5M^2y57tJX+1)noFy!5mQ$u^z?nnR4WM`r$Fh4Xr zcz?ZSQD!F?K><$gt&TZ+EyKh|8nQ3_JsxCv-^=kq@U%*z+pD`ZDj@B%%?Fqzzys^i z%HQd>uo^?z*@!#ivs_XW7P@fz^&`+m18*mc)*fSfyV6HN;%-I6@$5|CUl8l5qj)~tk+SM zewOkm5wOVFP6x)JYXEA-iM!9q0ro-L$x_O9qc*uX8;(CgC{;#+)zFkq2qYLHl)13s zHeID%0GuZ_T8#te0gACARKxkbWg;nMA}pSZ(>PfXdk^K(y4Esdns?hxffu~PFK)A1 zUPD)&@hZ-Xxa#Cj{UqPpjef6v)| zQ?=T;cW=+Dm(8lZuVe}=wF}08-F|pfxZ0eb{bGdjR<7oAwW{SyyMatq0EG3E6d?h% zlgbi&^(M~VJY*71g4_yJ12}9giF7j?`HwLY13(^05duJNkYpf&^aC_hQ#QJYSxM)j zH-K2xY66D|OjMVt=hn84!D?RK|4iXaHON{|-$Ngry6q?q~!)y|PBw&_&y z8|tAN1#9Ub+A%RpqUEr}rnlk=+|L%KI)y7=V+fcV!#D0C6wv^yNF`b3eS`bO!$QI$ z2O#?b2;yLP+461_>9>bX_TP7(Q@{oNjn7af+1+ci0XBUe!w;0vquwG01L7!fF-8HiPdWQ?dr)5W9@BnKS+vc&yT9oP`~IB5EcQX1Zm##!yc6D z=K@h&)!-8*I^%d64M4nzwyTj{u88kiDg9RsmHpc2P7caE55f&6eiaf5IE_F>C1u*_ zr`l5O0?z~yw&77@6ds4}?aixh`9B41ji<{&{m!THOJ69CIGv%{B?4Lfcd=^4l6=r<{R3N5C z)us5?ok_oGInYc|n7}{pOkju!6Uhf~4!2HH;r7{D>2sr2b*k;$UAH2Fv}&?6=`tSy zq>lorQt{duF`-QS_pJEuIAHx6bN#Y-jZ6M3CasUth>bLvN}&Zz`1YgX&rR=_Dq}|# zepM@AiwP?P^)dYWiGVLc!W7_spx~9xMgGrf1puhTJ_yQYKG2@s%d_50s(V^mbcPsQ zB)joob_|e*Q;^1TreArYj!ze`JMxy*Ph|*wQqsk!+0kMsz3lI^U&3s2Cf!o!^5Ddo zcA5bq?(#CRpnV6oe{h{MHF{P?SY{jRyOk(m)_9b-!OffA-->k4@9fFN!9KYP@?XaJzc76=F1QMy#v)$vpZ)z z>^fE4G&@-9e)7$g{a@_LhMT!Pk}{gN-`6`mNlir`Uikdr`e0?DS&S_8F3f>d4wa!bF_G%-CGy|YG+ZX7 zi+eI;gRMG|ohnV7W&lh;1ofMiarkJxKVxjMFXWsDc?ZCI&E$nanm)(RS+8=c1oy`h zEMefcj~av)E2?+8`wmPvNFx;|;PPVZV&=9f54j#NGMFx{ZIC{m569cq6dE-t4mqIO zf(JRIoQ>1|;DcL;!jFW8 zCRcFNZY)@7gHlzUNWP?sTJ=- z?_5`8Lq2k&im%o7ba`(RyHG_=ij`-@L+xTFfD0I@c?ZD%vTc55|8pEzeq1%Y43M$( z@m;mUk4-Sh>fC(H-p8w(tzVoFu~}!NYZQ5s)Ng`u7wfh*N)Rx@wQvZ$6^P>WSfnzd z;*`HM$nU)6l29L3nFW7l-*)#_?P`U`}3jq;rpQ;H=Zo4G$i!=^DnXx zr>wl%AK^czVz&~k?P{~QA-CYPIIrftZQ^~`E2p0ur_v@0j9#Wq7Lk+g+P+A)5Zy&k znc%x4sVKuc(w5B*;1G_F;c;<=wAi8JMO1g6tv4j>e6GZ&?q2dHdnnWV+mdMn<~uLSD4&Xq!M6 z9}b>WA4ffLnjdWX@1bL|_^!}iHwG*@I|dUoY04>VJUjo|o~ygOj|KT;NiN3d|5ShR zV4j?t_1fK3mO>I0)grV0I;t2fX4&DFZhtzBUn0_%1`t1y<%(RQkuGhf3VT^Z6eGv^NG!7n!ctv zRCy`0_p0pQV*iJ8aiMaxWJ3PqGTU4ZYp~ZI1a}=(^$9uhiD)wl6dk6L_2t`gM@=m6 z$aobwny(3DA!r1#mZcJBiTwK9-w0|+ln$Zp#x1@vl>ObDyG>uqEgoj{=9J_)JchfY zj9r{<)kO%+>$Gi0lXq--MQR+()*JPccHrqfa#`(r z1@u42z4pnqn;9FXyBeB;Wb31n1rP&D$i&&AlN!GW|M4$u**2d-3>Vc@3dbl<{X`jz z0sP|Zt{qQ?ELyTm#i4^AKaC1{?mTrB0?jJ`kkB1P`}kxCT$#X zw)E25?+3+1U0?qe4q@}ML@Gx@xe0L6fDOTXz(xj1akm+`>d7|}d-O(4w_>@DMYoM( zuJx`VZR>x_{tUZ@KQdmN>M~a>z6))^>#Dv(EeG7N z0$;ow=%#EP{2DT(_MgvKDQGV<3j*7)2XPxmOG~MF1yp z?yX*yMLn3eVw9edH5YDM=!*>hx8ulJ3;2;R$mu*yca|slcC%^A!^_{G$A9V>cyk+r zSJ(}7V7`98EF1w!xu~Dal4k;VrJ75x7j^96Iq%DgsH8X51`|k`a zzu;a=tV`Quf%k4?sy4yKAyoG83QT^_zw>7uaD0I3cgrU>qqmBWRYn{J{(WNSHRnuO zb0Hjk<+A4cOebPk)B2r$aWnEs(h2^7c&-e}bwY>M=;;zV&jk(0?s+ z@|RCIqS+~O#b7{bF8~%Cm;Q;qHGG&!EW*&Yggk;Q%wPt6P z=S`jHA3U7}CekSlU`L!JcnLJYRDdA}-~o*A1QziKQ5N6ohG8z&sHbUIft*%&}W7l>!2LN{44Wfk7a%zLdywdleaNY}05 zikzFgl2Rsn@}Zd)ee^VZ6$GgWhr9$qVUs zFB8B?Z@1GHQGq9Jgr3TZ(hb#S&wQ(1tp1)#HC{2#ZFv~7&@Vnf!;;kd{Mf;V@kSstvkkU zY5&^}1Kg{Vu8TZ{_`5xNeUaMN-SiBX&7BM?s|yP*N1`gOu5CNYwXNA5i7dE#kZOW0 zw@ulv4--Gx7Co-*0r<_Qe{5QvR;c9Oj_#^1trwW1NeBcQ_zRW7+>bd7p8F3_l@|es&ppzgg^i z8VuC$0XT9H?@`Ks#*n)#faYufnh#MxORW6{`wBqGK8Ri#qI(h9O+{!1^Rz7ykC}+9 z7(_1>p^?W^IKVSmLuyy>x_mMZ;4;s_fyRFtswTEMTO*1Dh8z$&}`;-%oFWc`NKIUco?~5GX<#(ybixuF0bVj|xGY#;ME zUr1C(X6)0maBM7C3IIw(on#uHytM|V(|pt#Kt43(?nUWi0!d{KNSz4I^?^NmZ)%X1 z<(g(6O_CN0iYOxJ=o;b?6@GzbTCm7&^)YogD26Z9$p*d;>wPDER*)XoklvS@E*e1Y zuP6>5MDCBI348K>Daqnk#p%=!i_mV*J0atP-kklLXKx2WZZL-4Vn-qRE;Ca>XcM%vp>* z0KAI{6)%EQnG!7HllPCHAAGy;5MJ4#bXw$!GYvUOw8WWMA~I1RJP~9-1eu~B&Qz&Z zRLp@K-h;l=pRQgM3oiEGy;#RBdqvTExFUa@EhVPPe5K@kSwnW^U|yQZ=-jG$F)jV_ z_pxI^>8P0WaMuH3odcBW^haaJ)d2C?@A7B&9}!507FV@+uSqarzmET8%NT3prnTeK z9WxY`;3^+8UMwEOH&!5yz==os_nGkfOoR7J@KSdCzn%G|i_FHUgzL3nDZb>18i4Ep ztH87PTYr&M0Jw_j8Y+sy? zXLXb+rDvJhRe_MdU#cVt5g;qJ#VEdTHJ265_B< zU`0&27VgfSqL|nN^110O#a!kj0(lhuXlX}EkKk;r{ug$ULg1Bw?bO%{>Pi$Fal z@bx`jFRH#{QJQ52>tMnkQxW9?=x7|glnUz|VD&JiSv}G{%reK>LbnfQi#Zq}+bsS5 zR_sZ6LkWk`D}V7P274tP_fGl`2bt)49Ma~!oJKnr-=clN^@$1c4J)L6Iu{IYRM%?N zeq*6DmHa|Il$`2!BEnBQyVZ2Nm3}tnlLNf26!l@q&B&^f%9sAgm+t5Lgz{wrOJr*} zlEY|-@1j_Wg@O*;uieFjHM`>c3o3PtdC$H9V~ID!V?ZqPh8`E9J_eL$Lhe(gdW6!R z1Ck7mttT58$Odj`OZ=#n_G1J05#fvh2wMPUaKf!)>s|)$pZ>6YU<@%lhQNJ~p;XI8 zG{k&Oi$Uzn2@h5V<)$le(+lDc+!>JF9PpWsD*o={y#jbZ`DAwcm@+Tw!JjnR;o)SJ zDcbQg1dEhcEn#&H<42J{B(3ORAYnLhAW<{ra%TaCijv?9wto{y92`Jy`XKM{Acw+cNzTGBA84-F_?aqUy z@T>gSS;OePo`skUtgpfMkV{$gcYuSuG#Nx0Mpnbz^e9j}$V$EJ+L__=_PQ7L0^mD| zkWi*ne>235B<(8%?*zd2qH3eZwyk~N1|?ruI!2{3CHJEKN6~o)HSsiHI3Xbg0)*a4 z=p8~pnv~Ex0@75}geEE_AOiYBNTD}FQ9)7Z(g_F(7EB0TI;g0qG?6YKDk74P@4uV5 znVZ?2o4LK+_kAAlYF%dxowKO~!JdVrjDdmy@KArK|CX)=9(H~UWd1|QsS15Twk-9|IxC6CSym|@7SavV5p3?cJ^DQePn zWP69JbE%r>54x%S5btIaxiKc(IoG-0#Pd&@a9drU-g97COVXbdOR_PFxHF@-iq6>rW`I+xdlGnq)P zurbHR8uHx(KD)bM%ofN)uHs#tdJF?}+Ku}(1F~0#h@^o>_d#t$PQ@^2IQo@4soxv@ zDhB;391lIc#f9d9qj=yZco@xXBAf<}1i+_jU*Vbgadm_Cc#g$Ojpr^gU|Eo7CDdFZ zkVpik|7F7kOxk($YE=ro}au4xSKe>$C40^2a;u|F8O74|-I`MlKA z7L9ubfz6Mx_XH9b4E(8eqO%v-NUqFTXeowwfewo$8cls9M*`YDlyIK3@T!? zZ%0D7%4WF=CKN?;xnk~0`UKd+eh&u#NB+A%oS?~?(iomUV4V|!znJAt*s(z;z-11( zpO(OKXQ3!wt}HjW`UrOsG4lGg_s7B)s8@YrgH-=Ay3a1~9b$O6^)w|oEo=@oUY3)1 zOF(o*-Z`4P>jO?v5>RUZ^70Qzra}D*08U3Lkhd04F8Su@DOw4qxo(3;-pndD+)Hb+ z3_azI{*;$BLqkIXVqe;3aPLS$4FzH00GK;5#wP5^a6fnLQ7QajP!9dtp56#IsZv*I zic~V~rhU=ey9POqctWRee7v@!CbDqtdcku=I@&}uSIX-#4@E*m%!$o<WA+b90;bd)sz`j2@7e z4$H(_%mH}km4R~LaZw;BrsQ}d4SMt=Y`HpqNaGDhgSEn5HkI^!=bj8DPJ*;woi0J7 zFd&2YrCg0q&osFlNMNI|ZPT&IP&Ah}9(=!^lblezXo{%Gf|!#UWwwCy7e|Xau-n*^ z5DZtqvqa$+b}6Fp*>L!*Ow|Ft=yr!4VU?-m+ckLbwqS?d?-Q_EG|w|iV~wxB6U!Oa zkzzHO&C$c*=K>LQ-gCKl#Aw^E?+mVVj4jHHJBrPx@c<6~urNIG`}Z5JN}S1?P5amy zsg^aqmpI4<2y6xbOOI(<9d8ww)x=b3mjBVDHE9+m{waF+M+^hBcH>N#wMnm;4``h) z9D|&nf^g9_g$p4ftz7d&L@eg6=AS%{2xuD;rujWeN*Fo#))K6JPnIw;am?w%$OH3;?cz6= zy{p{wwT8>|*77G#u~q)8`b?~P)t_n$|N7z0nh%}OlOugCuiiVt*P+rfd3F6vyW-1R zXW$jA>_(mNJ-XNeiu)Cb4N-dW8}&Icfi2NX&i!tVHj4+44z8pOKCe@6z^T9ewd5Hp-sCUSRb3HfxMfSmRsS3r5s51w9$qLzq0ye@= z=lAVId@akA?uL~$_diVZj)Ff*%<3Ai&WzEh?L(c-$mlDKn$fY#B<^x5d0P&4msKAQ zDCD23_1Jc7T4F{yX+7U?dYH=Tpt+OTV^m|ty-V3Gu~GgefT~_ z%MlajTqo(jHJ6lVjF)Yz3pdnD<~_3cG_&kEhO`lgAXyy|UpLQ_T9IyZ4+V`wKsojr z+vVBZcSERYiEeFVGTfW6^pH*L{`0LcK!Gl6gzTcu35T`1uRJuGa1Xv8ZNfkQe0@Y- z)wHSb*ohCjy_vY2znH-Yv2&I%4jysutyvJibqNqIui^{jl#dn<7IO+6UnsrC9+xlW z`}T$^cTJgDQAmKaBwJ@V2cER?u#T#d2*mH(-A{Z_)T`nhJTOpIM9f&Ry_+$$(tkJV zh1kIDvKQcTWzE6Gyfbf4*}29nb)0m)d-=(q;M^JDWPRdLtN6WKT1Rz3Ls?C4SvlLm zxZ>I>^P0kqPFdyAu>S2-esjT-2z3$TqkRb@(wJY7LBH($P#(j0&HIPfc2xf*0w7!Jhkv1?ac>_-wX!bi*QI1>`E#9YrKmeeI+%*U za5pLxPmI$)Xc{9yQoGrgFVumKEn4K@D`Yvtxd%#((a_tp0Evh(<|hpfgUng9;6+)e z3W-reOQSgj{dHnmKY{nk)*a1Qhkyd~CiVm-Ayaj#3IfSxARwF5Ess|deZ4pO^Z zm4@G4kokk2z1$fDJ{$uQm4R1)*rO<_-i0zb74S$gkDLUyH_-^s)+)XR|EI6aZ z@yp1swut2cX{MOvXN+8zAci2ZINhtiIEPTKD2d1zDB$L^kT?BPe&XIf%J4WYNr^#* zJtx1BYhe>fM-V-rm2Wrr+)q9v-Qx5|GE)Lwnxu&H=jDDA6ythfur9D4Bs)!lAIegX zSn{If^nR4XM6X4jLZ!0HV)}d@JyT;HHL}&Ki8Z?I>|d5I>olP#mJ3lXF7c4I&#_S= zPSq9TIUIvlJ#^-)?-J0QMO&%I*DG$`SYL3|tqbu{KYjDe{!XFj`(E8A+k7#Mpo>BZ z>DYS9%v`Zan`wNV_^Z5lZyaRF9FUsd+iX%z_s? zt9Zmrsb@4T!6M6j9ms{Up=xOn5Q|U7vroBiIy7{>Sm`Lx(0m5N9P02?4tvVvPoML} zY~OU=Y!$6<2TS*lxwrwx)#JyVD&py)1A9Fweybl#NSN%}(}6OCp0LD!+#*H)hAs>X z!AGUyO#NsIOil&5*W#*fL>yJ>`iB(10qg9_6)V)<7E}eoS(Cdv+?@0YVqoZ$V=!Z* zAeRtoM0cMz^%ChmeWpIxX^3YuMlh9QsDLjgAouMrTc{wcg$GS@`GzngFN;KFqe3WGHGbAfAlZCy{I!+c>4{SgYsEuT_!5GZ z%(c}C;F@Eep)ijtJ7npnqsO-ZHC?T*W6;<7xPW-`k)^BsJno`lWk{VopNq$KW0rN_$by?O$~InPZ1gtrMIQb!D}p_mOmw6CyZrP($0=s z9kpb{rd{530nu)q*7xY+hCC}|~ z3ocmYuK%d-5!F0<^~`i(XH0repna-2IxGsfBl=r0GNmZ~)vf>f(;59V-D;=4o#vTx zsm-xI~WGu7k|m*_&GO?3}{cfG+brVp8?J;j}B|Y!L6%${VX=DcWm&&b&5M z5Gr0x=fxrP-wG;4&ob$&Az9Ebhj;dvWjaX^UGSG1E|gSD>H^5! zBRzkfCb)G>X2t@wZh;1CzO{Pk&wZ=$y*YzJSbn{25hlDr!N0e{INLy*WApR0S?6h7MZ*3>(Ho z9zPt?566HB3H##QHF`W=0AB!_B^hKS2g3OUm*W)Ic@U+hKS|!+IJde@55RdIpY%#B zy>x+^c$CePvuq)j%9o_j9(S3<_xkM=X?BZ04k-y*&ATPYy4)(0HwKNZ&b7t}S-%tZ^294&qY?lW{AFVa&Ns!z5 z>a3Qu*(;b3x^4YltAivfk$CsoR;n}G9(Ps40dNT??AF6Fw1a|eiU$fxJZ(y6xN^Gl zeEl3tqkA&l3LZ=;o|mWQPeWXsbdXmbMPc$IU=VbPc|!+Ts6828o^q}5(aXqsc}A1t z4~K_SwE)Y3eEIZzObK=|PKm_+S#yCoO+c`0%ka&CWYYA>y z58DH^RO61?3o}jKGhAOPiaLk1bolcNU!6ypX?}rdm=DO3`4>GQXq$Y->US*_SU4~w=Z}vVId5Cz_ zN>7XOO_kO3kTdnj9D`s~p>=ar(;xHd%Rv&SCK^644!6#QWQKNK*6WkUt@4--x`T%Pc0ssIQ<{B_760Qb~h2}okxQbhP{G*j5HBT zjnnM?KV{$*p+@~o``1EJ8po$DTYaWao-JT$+~Aff1SsKBTs7a>nEG7V@Dy_Ki4OCL zx#1JrqZx%9U-Nrs9X1m3qSc6*27T<*j#0WK=9!C}ZUA@*zfZwqr~h?9W9(CJ7=kCS zjQM<$6tM?lXF*2OpsY`z@2{tGzD{Rt=n80hCiO^2Ed_ z9j8uZPJ?c&*;Fy(TvGag9sj(}%iQNXZ=J8pB;e(HGmCr_mu0i%)I$I}_t;c8}Tk01od^Y^#TL z{zpuGp_ut?ND+^exIk|#s%>1J;tHc_gtdbU@B0?7bhoHKAL!=#95<;+C`c?MSr$1D z-Kgz<0lRcd@HirU_~lF{x}`mHs6WV0n>>mSfd-AGB;sbK|E01jKfO;r`+oRr7US%P zTlJq^Jiau1`XYU9PV@7ujo(0qU?3o+Q?ujwprtsOU+honN_I+koU2%5U0q0OH0I2k z4K6h#T#p^c@#pWkyRvfKDj#HrO1-j#%3g{)N8`K-z9Bk)Ei?<@jiVq-{KO9lXx@2aPd&aPiIFRz z!+Jg!2h7CJC(Z(tQs$L&{M8=JtKOd1bf3=~^KT)})3*FI90=Tdsgeo)^(qU85&=fz zq|7}M-*g5a9l%Q`$^5dC?F=wEoD&=&A<`BS#{jtC1$ArxV@iS+B8%$qMFYqpjZFvG z9YXD77A${d;CL6!ZwnecfpPbfTplcHSp?<+g6g*xo8kf+$4CxO0_%|rTrl#^aDZ>l zSD&*QXg3;y=HwxgX&HQUD@bEINIQMe?{Kksb{;RXMEIO%|0InM5S*K~h@caE5`s=O z245aILjE&UX8{+Ua0Tjj*qa5~pIgdX{Mw9L3f!y>uUgD=3(6WJNWWc-hH#(LztBJj zSiB{0E#14kc_C5cB%}H(7iK9^KPckCw>(Tp{+VxD7R!lR>Bi4sk|~S&hfvp;MMs$c zgST^hNF;AeNK;&ZYcGtJ5UB4;;Gdo2#h0drU%VrN7A~Y@$9$vFzd5o+xUU2Uc*+E% zD9t?(At)^Q-`vlTM#BYZz|1WbLElRPA*)f%bBGcWABLAltRO0_EIJGLdSSFB&NxY zhp94S9QKB9jxaE#y_IE$p_wJX=|-{)iNlANfcli_1{AjXacuuGgKx*%?P9?Xc|8gf_bYD7(3)SRh)#1sG*Vd5tIvd%!%+iWZWTy~njJuOD zG}^YXk|V^}0a`dSo;&fN4$rlZ2ZyJG=IbxmdM~>x!3TRQMOD(J`+*?yEzp+?30V4g z;}M`SEK_A`IG8vplFrFal`15Q)6;mMncPo_&4pW1##Idc>+hIID+vA&; zBrp_R5@%R7?}aT+gF>pdF9rC0{V{GkvycqzOOsaFkz=P0>F>y&*g@RckXa_n?+MLl z4Y+znC>3&G>D-pvWQ|v)#Hf>4!z8P%o^5|Hx+Kd04H9OMAYckzwoHxhmiqS{)9!nR zKZXXJ$VM+@(a0ap?a7LzNe`b-+khAyzktuuhnCn?orfS{bRmZlfMS1hw|ClNGW7dK zU7J$9kVyNE!=2qJOhG5c$?f8kP9|W;kYen0)hoWBdwudt^u5NZRK8k4&mlNm>rz3@8`9~+k%%aaHMJ^DSGKyF+DD!{-e;*KSjKwM!- znsf?wnxc!Ls^BhN`JHjTiHPWf#U{q4r~Z}}BW5Q4mgR%LZv^s9H>Z2qx@|#j9MS1Z zz)Eo%iEb>EG1->;2d!Vt*gi?z0%E}?%1&ifxujd2sfXOKcX2bMG&jR+2!DvJ+}P@z zbF)+%>ZBelJz*K@HU@;-Kx{EX`(gEccT=PA$)-e&j3l@7)%SSg9{E4h3dO@WXIPE0 zqXxr5h(d~T2dBjaV3eu)dKn}Tmf}n@J;w9*;?9mSEQRp3>dbU%lM&Ey8roPu2pd^6 zNLWfT%M|So)s@%@{k9dym!9_SAnR3J+{3u6-v{Zjv7=uOGWX&~M)xLt{=GrLCnIj; z#{Ii`;otk%8z1`OKE8{e`Njo)M+6&eWjB$*VVTLwIjqfSX3;iZQ3ltD&@ zU{r{n!V2ByIQT}13u$XRVit~O9^|gQ;XY#?i1V1mlR+%m#L@7*1c2E@6-$V?HnnibA=;Wd&w8x zrk<^XX#S_aQBMzRV#k<(wzEEWCjM@e^-DnrnwFVxRE>V=ypY22@3F@c;;NQ=*1>d3 z(1@s}X}G$G*10{#mo^r=ju~L>EF3n#jS<+O}x#N*b85 zSDprDM`MtXl3lA5Td4aHTWCcAOU4Ntv471w4YyBNJl$i#AUdHxZH-{L%vsx#u{kHZ z*!zs`RB635Ac$R`#3Nl)FP0^!Jd4YBxw>mLAcNh{hj|MS-0aN{XYwdG>DgJZ-l8F} z+uXSVJr1{vEBEoVnJ6f;L+3X438_ZUT5-ki^GF+$1cs2m zjK+mMBiV!Rs>?Is6oOTt*yK3&EoAD z7^8}$;PZ3LzlKt8>fa1$=Df;w6Acx@C^YwoUWg~y@EzZxy$L_narbkGZnLA>rLLa< z8<=nDhYdn<4_@$oCxTxYiSR6dL4Lg?lLf~MtRUdjUOS-(#5mqC3tW5z2_A5fwAE7ZbX5lxw8{mH?`QlGJS)igs9^%e^ zHO{9lT|w-+Z;!DY_I zZ|eEi&94xF$6HvzcK0REh%t*!ybN0Uu<)5Twi~{AR?EOmnPzVX#Szm2lgVE8%Ie0} zHKV%BP(g)PA(IX+P+{pVzz;!p4>ZIK-N1kA^+{_X`3(jCDapOSE;I4Zd-+Y~pZBmX zMcY*+64PQ7F1^Lfs{8#xo;oNbhRz@1#|c%YkIID4iE4D%K!4@ZxWX9}$OL;uCijhd$Rbi8U53m-ef=6>3*A%RUTqYrL!e)L){ft5O~@xLi9w z#DHBPB@G|S^7+xbc!KC%BEdGs_6Kv^XJ)&^cSpnvXuWP5INgFD_aDbE zXi9A1ATndj|GIr^Dfn_JpFim?99Lklp;1w3F)nFW5_#vAmCW=}zH$DWtXm+(;Za4m z*(#ozW*tg3PV4tx_IxFAOa7c}(&Pb_OqK-@I6P{tBo0dXVxmFf>`p+kpg$@55@HU* z6K{1qoat~U{dGK>4p-lAPUXb|9MBZx$k@|c?X7DUIg3)vmuYPmW>nSfL6*|-7ChnW zEL6W(9{46h8D$bC7scqa)E(!$s$+o~!)HPxF}E(vlv~gLSQM4d=Rmswc^rIK%=5;I zZgmM&Igw6O6DL*QCFMq4))+N^(9=$4EXC@sWV1`B<2LM1KZ=|}i?;WnFoZc{^Ae|rl^>92?1 zl%ldyR+1)6o~3^n`6*|H0(|wdXD6O^PHHg-)d|Swb1t0jsKN1S-mi(L;UuAK7RyoLp4!quha{Nr<1&%wCLf9z+479>{u^Qbe@lPJd#^pZnxdC_F(}1A4 zQ+N-zwcWPnz*Fed8xOYc2udM_DtE4S$D={F4)Jh=YuU5M9CPFs&j+QKgkE00I~|<< zv9iKZNBHuBzs3cl-nC}X%9C97TWP008dHtMN5dy?;<~(33aw;oK+oU(xy0>&vlJQ` zl4Gw~c)>wr!uSV@+(vl0{35~`QBK512RoOVEUO(Wf{)& zX*T>M>DO?SH!TcDvoDH))Xq7S87z}5RowV@4zY$+m zIG?zSM|Zrt!58xdRKQ;NPwDxie_!=C3*(+g!}o(%LMsmDNs}aqCjjzr5Pu^Xm1i8B zMiCIIk-pG>3>h>%f*#%CTW13x?&!dtTR$lw>0(#BwMH{|76{#F3pm@Y6G@tV;3|L$ zp0ZKWNS%&O((dSiZs!~63?-vkn!6NjG_~@R<*QkkxD*&g=P*;SF&cu|Ai7N!!R~1= z@gXZxA!2farH5z0Zdqy1bm^b@@FgMtr=mSz1^lTeoaHq$G_TC3s1@lt}U z3LhqtQ(ohQ9GYdkNHy5C^aR_;P2D-BDwMEA)}~pR7g%91ly`y2NNJ!VsQ^#sV2e*P z;Lb9Iabxg3fTA_$br+!g-aGTSG1(H4edkgs1&*n)B-^w*ydIVkh}_rxNmBNl(=?!> zeLoYxY4(6*9BkR0Z%_z79ezmp~rOuG(4Kpq9aWAQ%@x{Im|EQhd9&={~ zTtjr9=z>_xB>8?sx+Goy1Nb=xhTt6tXdWtV>W>t;laY>#UUH_9*~QMK3Co%H=7PO3 z{E)cx&I9U0FeijD*77eYjKa;$5WMRBXrUwP;vv}CvD@79BeLS%iDFUi=_;tE&-Kz1 zv5v`!U+qWsd^-EPnX|AU@1=l(j~)N4o}Kkim_P5OFD9UZ^0A%25FO-wpez7WAw968 z4B9F=OdzUL;nrmH3J`j|u&KJTCz32X=OqewZ(hjMub^VVlo*ruXy9vHNb!CVx#vdl z`2o^G0e@(cpHi4VzZukVJOrG2m64Dsjk7 zcmzLHllK9+&w#gk)qsb)-7h7Buero&<$~WYA%Q^!0;+7s;AFDw@X5Q6PiOjEP)rPjT!J>46q)Qw6=K8bE(W9LdDjWQBHlgxb$5dC^V*cY<;>3DbV{y zSoZ5zbIda96jQy*3ggREmB~9%Y#}~7e}3Or$a=a?t~bg3Yoghp^NJ*O#99EyB-}48 zvxWE{tXe;-;p<-^BxU-8>n`A}n{5|P#&|SK*q*_OwqAE?8H6}X)Rh>kwP5euas!r4 ztUk%8Bj_!+Uw3jARzc92v`>~dhr4@#nWv*tWz(zoBQ4hBERWv&6s027RmIqlhr;!q zH;d%{oFWTg7Carr5QrqXnQD97gO?!HsB)*BVt*98qU8b7?Y-k%pL z5EkUj1Sp4qGHzR({dt+$SXtv?$7=HzFC-gOfG}Wzzd#Mm`8OiA5Rk9Fx6-ZI~1>EkTXQmYEL*UFLAJMI=R*u?=#*!1;!>o|2uOnHAs*oWG% zFtHE;Yw~Jb*Qpki8utBJp1iXIihkkbGqs_{dtK27^*^`A$3!;9yErthsaTqoaXa`0 zMr(!UYCcOnJ_}mBMAZOLG~}2`UiH*d_53it?fQ-7yhbldCf5t*&Fhy|TEf@ldIuT{ zkke$d0xPNFFStU~=E&t9>50DdkS3u#wn&<#@eEbERc>5DQ$Z?RFN8JE3tr6QH9KG- z_Ww^`G-;z5{(e;HLfRB+RH;l6eGT35sY#P#e911(ba zD7fKZwW%Y#@}?3QIYzO($dtW5Zw?cPMQ@1~*8a>sFCI;nY$wZBu*_6ISQV;%0V@jE zWJaW$9Z-LzX#eI-g8sEOEhL%}wSV8Gn-RYk&~gmoj;6An-#N6=woFlESw05RC{j&m zX8awoMj(L5?-57#xfWiX)kdu(2)a?Gxdv1ANUhxIA3#`{DWqOr_IXR-U|9+wu3}Pr z^FCR!`26h7^qAcDapMg(=N&8KXzj&SEAw3|vmusg0cdo)nCl%2wnl~j(1HGKJ{L_i zTV%oCv7}EnnTLS1oQqc{Fg$E(T^FNk^}O@d-hJ=wEz@nKD?1l(WJjAwWmZ$qQZ2zR z(&?pV;>2g3zt#N3mLnOcKlhoZH^xP9#Boc?4hQH*FlHB`KWuZnbbr2?wBHK>)T=n4zw|W7^V;<_uhj6l!=~d4=y0vk@ zU_8@2&caI`B0@aoqnzSB+U=zc5s7As#sft(POW8FeMG)ePak-kTi83oBU(RC%UzXe);YF&Z8Zk7_nIw}hq(X4*xe-Anz z1G!_RhoGF|QwrB6icrC?xJ=-MZBvA8bz-PUeL-^6pvo}9O z-9p*nYxfK;Bnyj0dQ*?pT9ZYrTcWfL!c?A$4S}OsslI(}YfDc;{bILOEm+M!46=#a zF5KK%d+)ZDbi{WPaLb7}qONw#@9W>q`kSXt3qqTsjePZktu&|niP*>(tXHelLYI6! zP@a>b9Eib;cI(LNb3Laz-T@sC`F{Q~RbR48g!sjL3V5_1ik>2)10y3|r;6cX&-|l` z(DuqJv?(JgVp&YFp(Iff`Gj9vW~`HFd(efMJ@du(tdp_c)9u+P2rcuT@0B*u62-9Y zy_&$Q@!fHGuZLwRhRWY{6Co3`ztu& zH^pGL%E~C7rC)7@v9~hOv(ojW8e*u&qW2B6K)M)~W6*E^_4XRRZqaD6&-t(78sevA zI(&Y|d4E=)e)~+X>R9~Zvza(%&G)T#{pDNgDSfxvnjYFU2pTwqRq|J_8~a6YWp2e? zp`Tl{GAGjSrW)P*`1HnQs~bIkieGnN)1J@!Kf$MZ+B|ZzCs;`hS&TWRN^3O!%u!>C zgrdYLN1U5q*CSjWQ6=-K2F_GtdsgLTV{PKTxvy2%87o6yP_=eKz84#G<@r;#)x5ElzTm%hUF~32wC?C{!ek`ZWTY{jA~K{Io8&rt`MYU1QBujQoG7;7#@JSADeb7$1D3%4V}A`{SGoE|J!bT;a|OvoB0>o z9^{kxQ*?K~@8;E&rGM=*zX_PwGKr&xyN-YTF>lG<#=gEe$==z=`xj>7HnnV{UN!Di zuA9$V9rx5r{PH`Ju?Ov7ZUA?&B#dCnR*T#_e=J%RKh%dDdWzu$U% z=8KwwXSI1Yt*1v#Uv%y-n{sqz+$5Wg_+Msfw9Vwb)_Qp$FodxIu@_L-j&(|F_p@1l zy#X|tvoK^(Hb)_GcRN+Wpp{NJVfHCaN&3!&MO7BowYWS>$Y{Lke#{Q@o2#UOnw?B| z0#~iw_qzfDHFB>XSJm3nPq(OZ9?F(9s<>BjzftYG>!ATqz%SHm&+N>b>0JGE>)p8< z|AeRUZ6+?Sb#}@cQT9Joc~S8b1e;84SCfDo?Rt#$J(2G#skiNBX6LyL)=AcnRwoFl zQtOltn-b^rzP8pRc5fHdI_7zP=lJE_=Jcj{mm-W;`-^+6sWp9&>PrwlS2&j_b+<%Ft&A_csxM)%v^+VQIPt#EHcW~m_+D7d(5_uYAs73R>WS=Dh{Mlzk6Fse z@7JTwt9-lOqzyQP8)~R3j?I7U*t66fPP?BVv07dE;O-@MhGdQ6x8fgml747%H`1Oo zUQ-<5$*UxD@$<^&aamSm#*1rxI@$t?cRT?R&z(81Yn95&fADIlx6W)ysxy4a6SF7J zl6)ood*;U#=ik-WzT9-~9kC}G&-XVMT)AzL_(#6z8>B5?;nqy;6w}k^syQQ5Nu5uZ zcT@UctH&p+=}X^*X}yp9yA{oS%4Uekm@hp4Y6=IAPn>(Mjb?LPXe!>lbMWBYpcf_@{G?f@TnE*7c$L6Xr3=s%vw%nJk3F4ULd#MT2Y@r z<3vH3V2xOhn(KJRsqT4^rfD0^>$#cdh2%x%<~gx*gU)~4oxtA&AebbAR=b)Yoq_Mg z9LqKjX_cp3>UubSbzUu|{M_dqO6^(?##cA#tkjb&K5A(VIkzD2y9TVU!z4T}X~2u5 zp<1GzRf<5VPT4hLM12F5uK#{!)#;dQFWQCC1uXag*j4P8P1X#@Grsv}5h7jAhXRHC zYk`=iEyJJi;QW%(*J4?>#7{8hi(;99B*go!ljA$IL*t=>n5Dr(6%TLwkCX;yLFX$E zbS*9xNE@?tAVzP4?p`$tzRkOv9BDl9;4cAn))knU@Hr@kyz));kbk(tUt!V|AhfZgiqcEGb+U;F484O^6#s9)ewFait6b7(2^<6 z9DfzzF9K4OV6kmR7ray_N(-NLoA0Q*qAt)W4B4(2jP1FYu znMA;fmbB7h*beLGVRaZS%w)^^8wek^V5U!X8R6KqBw0Dur)Pz~VCDHZrk69WUs z@6^^l)q1<`^M%VuFP%%=Oe0zt5IURG)cqFqbhcXCYzF}tBgp@^2fYo7$9JUYaU`Rg zHqRA{@`);iE^^+RRC->b8I2?`C;>%(1R)h3TSDBzoSA<;xV9XX5EgIVWU~nbpan$` zEIf>f@Eg2YPl&s`2NP3p5jE@_pD_Q|Cp;xC=C@eZmz-Xg8}R0w%3LVS3L{*HP*pt1 zT1ANxDMtwXuTFs!fS*XWj}S5|VV8<8zE)&2(IfKrk*CkX8WpWj{R3?rq=KM;p+qyb;YrF`MD$Q4m7|!E>x5*e`?)6Z9PrDn&iK728Et~YEx3Q( ziYa~IwsEw_!sT)BRhW}AE6seOh(Y{|@iDY=<=#Y@rF!c=*s}I~BkdftD=yLiI9@nY zGH+OK(L-4hc=br~V!5}mZp<%^SK4rhEZ*?!_@O z;^{O@yj68KSG{nc7-Rh6lS|=Ax4%xlP^6K{#GTX5&-YT`we3<$VO`c7!V+Y7Cb0L8FxvVtcn|RNXA>B2AL=oCcKJ?+MMI~g_jR;k*5H^0Z0hL zE=DyIr9=bZFbvxbErHMhCET7#sW6w?lyx1(M0VRu?gQ7Q(Sx!zu(tVZwt4#;>X|Gi z3R%?2hJIP<;_26NCOMZ@ATf(0JW?*3oAX7a&`Vu_t}SYBuQOG_pU}TJgsfQGS}^+% zO1+f&4B+zUEeE1GtatXN;JkLIVQJg-2Frv7_i78y_XN&=oP*2gcfU$eLPujD$WsU+ zPnamm5l$gordVTXX3kS;9OaxNA9sSYrj+kw#A^WKT_>4OY)%|QYo};w2hu|*e4^bv z`x8!BfAUIFkUsXPn*~4~5{3?$a|#OwW*pRZ;zowsdPp-j9~YO+fcBni3vvlhf2}>Z z;WL8gS(Ed5!Qff5Ttkd%Zw-$hAzzK=YL)`E{0K+#kFAmQ?zc@CV;)4#w$3y=uy|+u z!7q2IpY!+_xVZ@;X)8kuIU>d`MOh7Sov!1$o+BkC3(F{h$&>)4=43tqQ6{UNY3hS} zB!TZIfb9fUZ2-B=atph}I5y`pTZl3z82fyovvQ z6;=Yua9uC^jyf$X@*xtVzb0R}BY&4Ko~DMV!m_4kQA4?yESgqeM%UJSL6(5IZKjs@ z8p@BL)#~2z_Pge~4z|EUSE)=|EEzL+6Eiq~3+B=ulgo+wmYtU&ShguYQTkC}0nvU` zvrp3eN$EDRirG^61k2NkSH%Iec+AtZa4^DQnAYjc*R)cg#4ON~oiF!B)}S8`bRquK zpO>E@BitrX?Q`O9nY+s*z5^hNRKj_j^4pb;T4q3wEZvwU>1wK^Nd{o^vP>sIBHjXd zcTpR!;~kCLTlW`3$@5+c?VSqMdcbF{QYN)&iQ$n)z6Geu1{8LcjMF`2fECc~fKpE< zk%No1u4MR$3hs>Nu_b@WpJk?>Dn>9HIysRSH6}5G2n=vRRB=JFQb|WK-)Art_qPmd zFbO_Rlu+3LCXwYbNm6J&{#X7mK&a%AN5}9;K*5;aB}-7|L{u#JLvgQ57Qz2Ycknw% zA;6CB9BT9O(ae_JLk181YxYn<9_|uz_r=5On5+pI6(kdQe zDm^HnEp;u%bo|_az9llAiRvfw?)1RL=1{K0*RYbMb3|Ce#!|PMp#L%cWi(GMjsr2^ zzyUI@RN$nLYgYYT1g)g{@I1z2Z37!@#kNs&f+XGx2qy3mCn38%$=9oXlk!LaJnVt2bnDTn z5m^AWfj5_9iNu_i|AqT-v)Xax5o1=DPAYO-Da=a#w8}A=r{>SCNzk6uQWDa3MN9&O zFpC>-=2d6-hSUk>{(jlT$k8YZ+|U`CkXvKjRWEv0@^6q& z_Yg>0;W)nS&%5O^F^D@ONY!i~UR{ih5f0FxluB<}h~XZ?^gP85$#FKqUeQrU>>Ux6 zRryd-c}i>h>Hd(jY@OS51MjZTbCL^aQLukls@^YMEIfc>Do-&ikCzq1eojqrfG0b( zoA6kP)SlE{T0<4@=m-c!Yi@Agy=bwJ<}#K<+!bgB%RfU?SLIUZ5^&AU6?xtt!*Abe z-A&i!(9;try2H!TEF8$tyt=JbiW;;C(zlaV>OoD*zVD>)YLWR;cE9>AU!c{OLKd$U zX7Ox2$!|wzwkb4k*=wmy#=J0e3hhW3wod$8RxoI&+bEpmBqn9xQuxmDqJm-5xejvf zHLd;W;S{%dZf+%du^pmBC6=H*IS}&!TWOJRb0F|BfEL69Xfkm__3}V^2$jDX&28GI_iUt6eTue5 zeU77qbI64|*D5Rj2arH-zZOVR34^;@D?Su}4E6x`oM31-`d5xC0^E7d92IPBx`F0+ zKfXsYBN(c$`f#LL6~6MH{vi-h*f7k}XVRHf7N%HblSOyMZ zChVlP#6bfijP(Pdl9cM7L3BDSW1 z$1dpcuk%VYp8pzw5Sp^{8ZTT~F$nL9`Oz$Fi6y!5<+AmmF{Pdy}<|3-B zP%v7HYEs#N_%2suJ2Hg(OGrA7YDcvrBW?3Yd^<_~#zY>caw;D+v-`ubhr=+z%)*8XXK)l_$F!JePVjb(?+ORiT0~`m{1?!0Bk> zz^1q)z8S|2rCNo*8@iDy{Y2Wu6|gb}!jt(rRMzP;HeH^2*sMu~72gNnxh9)L`A{h?*;w-NA zN(4jww>~^Wx4IqvBx&kL|SY8ZkNBY%k$#M?}EMY!w$Q|P?9_^ zUZEC7cL&8X8GWS={s9dl9S#10((?ihs36lfUDK(63OH??P70xW>WL3ysOG3l{+zF` z8NVAQxrqu(blESOTDqzGZNJ-C#Neq9!;S)de4HH7qXus&{2yN7K$rX@dT^h*8ZZhw zKd28cf(nxw`Xd_J+O6FV(gI=J!kKR>QumC-2Hj~oZKopx687ob2gD54z*(nqc>ee9 z%>NHp=H1fpLc-eVlS~Z29gW?}mM+d<4NCkl%-h}`EW;pq&84-J9*hV%?M@Nnw6M{< zJX}9&;wAzXs+GAfqN{R$QN{?B{^nw1(<||iFH9b1ts8YMbh)X8yzs8;9}0aiSnOSW zu(bGWpG;w){wy!Du$ZH33!-1EZP@b)J318>a?WS<^DOlBtX!=L^` zgLK~5@1p5#3_whQ7Jz-+J6nREdZ6F9FQS3|kR2}$R1}h){rn=4r|HzIjxov?gCUkK z-t5f~de7L~3$JSC=faJ{M=-xLA`(IwMjkIV4AMXtrqX(9tql;gPcSI{Fvt#G5&s14 z|3U0UgR3-16q@`l*!Ux8J2B#~b@$aTQdd|i?WNA3kvO+kQl5@v8;_=mf#Vq%&^X$q zJ~FJ}rfC0?FsR_(jNX7-c0a<}$SVi~!{qzp?KKFzIzPMu;|6{IFJKDJyxrbVxPuO6 z-;7(gbzU?u|4Yz6GH`J~Fqcgt=Lx@GK<)$IBzIEtLj5=G>=9%Bm-`GNU@^Dix?S3%!qMJ7%&mTa2z=i%SD9}MG-VLP$ff8vQ)+#=n0l5 zk~nkz%LPmzuz$4v)e5S!XvQ*H#1On9(&)lhI!!t}wNTV4m;bOXymIE>9RD*HZ~m)U zQ>9jlO8ERL0ximGAf-v2-fDrZn*fN=5; zAbbU~kai|gR9bXR4RpmC2$q4ML#+(-Uqjj`)1O21T{(~}6P?i`PGtQ9i-buQCES{j zP_<^7(Dg+gLFIi>Aw?p&@sCKE5#&*y8TH5AKh78j%qz9TGEgkUx$+8qxYQykoKybu z-O*B5Jd!iiHvpb~_|7+q+Z9ETSv=vEhFK6IN{INB&HLve@{Mi^<8=;uo|(bQ{3 zJwYNQN?Ke|hLr!5Dj-86GNfR6tby31Lt+5hkQfbKdu$nE?6@aErJCBRhn-S1hP4oZ zmhMAyRJsr(t<>_0aiaaSoxPrZR&22ZY0(hB9eM$lt~hOR-v6k~n!1n~W_$sL7a-Yc zMzhmaBo|ar(Ti_GuXOwmRPmx2l|&Jd>QJ-!erlmk5kgQ{jYl{=AG zr3}<_Rs)ejN{VB}RFlXXIk(WbYFY7x9p3S!5F24&HqaMlFo&{3)E%ZYpe_I7#hvAz zOXtlu~S9rRyPW=Zy*)BOoQsjl*G(0473xC1(`)R^DuCC z3*-v}OU02FPNZBA%!nNdh?6;N!98o(p(oU1l`8$uA%7!C)Ow?(K^28b9>EM3H1t9& zJf}pVng|VZN4FLta9y5K;6l)4hBbW13z>luLqa$~hge|?R&a>7mU0~g{iTk0T*$Hf zGLScBgpC8TAq->a6xN;0kR@4&WI#j^f+5LlApg1<=8`qTE|{c)$r_|46^Y2*(ZVdW zSxA8_vW6r!q!xy5@lMFc}YS}1sU`@$#(GE6W` z3tbR{jxqQ2p&RZpZfHzaYMx_ET(U5i*yQ5mPE$=rX6HG#+LJNI`4LHG^PK23(XR;N z65BB35q7Y{-{iT&yDTIcTN+3?(veSw1nw&S%O-20<4xvRGo1muWhYY>H;zL#ufqyA`z(| zmcbUfl=L@q>Lhr(yk1L9w9ADK(x6^=;s2cG^guC+#;F17f`A$ds*QjIsuS@kMYK9p zICZ8eNi%9!$4b_|0D~tDp_g#pHIM@u;-;L4Lm*`2hB?$#B2U^(LrDUk}Q%_^T4H1#c7V8kUmG7{I zv*I9M2og-9_O*tKgI@HK7uV(Geh)cAfgpAoFEpi=eodgwnu#+oNX4)^$zB4N3$bP{ z7q-xK3d0z--1Lnuv=Y&pam%MGEIcfzV)HKic8Og0adkDsjjnnxqTKc-P=o7@uT##; z5Z#`kYHNsy;u4b(%UA|8`Q6I5hEn?w=Ma}+6=CjmxmMl{L3O#=ldpu?Yp3TzB*N^w zF2SgC%jJm8pd5j)a8I{Fj0mh{?oF|XRm|cQyST+LezA;WOk)}A4!#w!6OJd$0PICJXU$+M@=pFo2O9ZIyQ(W6L{ zDqYI7sne%Wqe`7hwW`&tShH%~%C)Q4uVBN99ZR;X*|TWVs$I*rt=qS7y;EKfu&0E9Za~e;lnmlr3yR{mE*^#5V}H4xw7TUm=y;0o4K>+&!FKl7MLnw zEQEqXt6t5zb<@)YWwnyss?|VQ2ur)(&AYenn5sy{iu})Zaoe_W7k4ZW@;_HAe@mZE zy*fnB|2R)B_?L0?)c*pv|4Q}OFLUeY)2ru=o%BFh0!7ufEnlE2QK@7Jc3j@?-+#`n zC*Xht5*CQ96b(VJv_hO<<`JjZc_8-aJ*lCW&o-k_j{Dr!l!eJYTm z^Q`mFJ_ND)&pi6D|BBB%asJcfHZJBF%aEmr0*fl-g*oc5#1`AoX3@Q3N-BsBq>rWU z%sDARkj?{ZKlvc!j4G$7LW{4_87uC%|M+soDsX zu8>2L_Gh^O2Mi*Q1d)Q|c+uob&OQG?>yA5iHbn2lP70(AGW8Lpn}|jV?D5Cb6`GJX z%E)7BJNQ6sXFb*`1gX1r*7^@O-pnY_e>$fvuRmw4wP&UdJ&-cq$P@2Au0G1}M3(+TC4{G_8E$^CkV4$nbk~iT zf&|Uh?mzT)|CBa21bH&qmJ>eLvE7I#URQv&Ap^EH&_?`j#1KJRHaVyM6Adg&{zEu` zsC2FP=%km$pWJi1r{X~M%$d=&WqY%Y%>{jXv#_P-u6tNH7R0&5P_n+XMUy&xkTVIH zxBK$UhiDKm_qIcj(=A5?>7>I~srELqYttk&4ay?RUwCI1Zu97;9~6lVDd!D2_^9gW zKmE*q(fnr%H09d1Dk{)vf#DhG)JMPq5^6D}P|TOyLmJ~4BwhkBUPY=!xfca*Ac{&D zHvl&fQ*5b54ph^>3`oKfj^uQU$&!8k0Si&2i-lh!2RZVQG>(*wAoU;{ zwi!-_|3qfO4!NRy&DlV_Jz(>!umkZp8>e;pji2%9LN z5w%B1f{D(jL`O!WFa{M-jH2fRf*WYOs2pkg2If#gwsP1ib8RFL6SKn|^KoZK+3`;x zlcJa*mBwJostrL{)TDb=>>qwKiM9G6Gj8~=6|N9bh8&WnMH+^P1)0odOmUjUBxoRb z8_t2oXv&=k$xy%|**tV1gV+$YFVHJ#R500lLanP(Mm4; zqiW3L2`R8Pz;3edAHVbl;P{s`vc0NlC)r2quqC}qN-;I516|G_6QFEXCKjdXoXv`6 z{~I4Z^N8nRqdjHvAAuG}7SW*Hi(*8M>Q(P0`lv@cyYV6xwe29NxFznAdR}@Jg4q{Qm(k75~bi*0YDB3F$DUc$SVvtNF$%S)k zmPu(KBc-E~iu0HA-He{73~OCp3022sav<$=(l)?Xi&L1w6pR@U0+*^+k(?)ugcAjl z4tpA+YL6Web)7(bijwTrgQ{xF*GL^SQeeb&NwiqukRk)t#-?RN44mXY(!q|;|Jvzn zC~F5dra?#JcuBF}G^lGcvbui^iExsX%`*j}3^4LUo%PViJfIW}z(vCwQf1MMlwq@F zGRPDwNd+oGIo!6~vK0LSU2{{NA7{{`A;-1tv zxHK!~gmP;Y$TykVV5PA4- zLJRCqjnM*&(s;@}6%vRu$We|uMG%6qde%N%L=fJx^rlZu5_r}mTn(ca|HuEiB`QvF z8g_v(!RX3s71o4^d?N+qaL$@R5?^dkZs6=azU|_|H^?!a>#=m3zoKmVFV>)c;Y$#;ux~G zavu2f%D4q_2J)aJt%LL(XH+fKl8pt53EI9Yf(*bDQ@eHeCIFrEAcvv70lHE6GjmdO)RzQ{lx zFjhQv<+S22VA2>(`^y;Jq$t9gt18fIn~(Y}gdF-Hb5)3JubCAj8n0Mj>M=y_#+xZM zB|_4ca3LYMW6)CTU|Nw6vNT7%ydLDRuR!cujR+6hAaYxi|4|tqQy{uxx!@Z}+A?nt z*Uh^heykx>T$e*H8)R*1H-1zW|5crdl)2GH5MM_Qj#7UTF)7w^58I%9*kE7IfDO@r z46xuse<4|<0ApNLd}OpnNYXiqf_p79DL}Ol@>34qFnv$4G_cYl5H=9eFjBCvItmgx z`sYMAW*d7_5YONY&UG*DaB)q8g4B0)5HviXWrEm1G`OJ~zM>{2;!@?M9k>7=`LYcR zlRx>xSqc$&Q4w?d;0^$X5Rq{j`B#HS;XsF_9LP`&@(M{uNRB~c%=Ajcp$#*#4s#NYbfH`H6&wve>vksWUTfPtsbTm?*lTm^Jm+CWo_mv7cMG)T8BAaO!ma<2wQYC8> zWCE%RrM76}2@{P}9BpHs1K|q-@eIgW5WK}(dxJ@TwGIAbp1fHOxg|`rW?#=Bq5>fe z0xAt7MGB(uqYQ#T8;CoikQ(4t5MaYPf(KoAv3IV6IhLd-53-^E;*uRIR&y1g|3IP! z@t8OIr3Nt#E=mo+_I3a8m|D7h0XPuUprXEDp6Vc=1(6G~UuKpA3k=wmQkX$nh{ zFy7E(fFviZLQHkRFhz-Rf5fKG|1b>_s3ws5PFLy@V-*Xt5e%mg47j1GoVuk45uj;W zW&N}6SEIh{~0Ar0ywoLCle8K?P8l8Q9MOxtQ1i;a6+A$r&-;wVBJ@u z&u}HMDzP>(8Vu@ovAR{fa-c@F7>A-9vY@HoDp&9k9kg&nuO~h=f+mkgBEn*;hBHcS zVn;Ee*t)qev#6fA}h!KHt)AeTthCTn< zB6xPD&wvX8svifF#!C&p+3X2g$lQ9{vaZ5MTu0vBAR6DE8!JtSKNC<*s zC@K(XBeRToYfqMBy>>5lQasZmyd<@rE#f*6x)6@CH0snebMg(I1YvI2erUOc0eg7p z)PB5ps=g>R@l=MJ{~HorGaPz)JL9&x9Mz3*h8<@Dz6(K&&BGyrIHdW zS#R}bya(Y&x|R@pMhiI|aa-s(TA0w3-PYlI^yc1H4 zBB!?!oC6F`{~M+l?6hKv5J!9vzD6_mhqFf0zvq;c2r(tVbPzOr#4*w&^M<#ACnwdD zh>MCr4^|O!I)#%t$gpgKj!`OjYLREUhj)C(1Q862e9Lw0BsuxZ2C>95oDfhVZKS!K zoBYWSIVI}}aD!&Nk4ecC5ezG4tA`cK+N>0_Y#XA347w~3C>#v95LZPbqP*38UewH9 z^dd>95S6P_bO(W6Rg->23-O%Niw&;}u(A$<^D z8WF)@r~l&^zQSmnVyo$bBhZ@FgxwQhX%H?eLaO&1+c6t)by4EuL*IvnrT|2Y?ACTY z(G;zzwicxR9wz zvP=hM907ELr>78u{oM*K6-z=yTU8JSnK!!RIlPS!m@C>B-XLwWc%GA5k_RT>rnPX41u5v9^*#wAC}$027w#kY2P=c8y-~IN|GOXBR*pXL$x6r zv{8XA6tx_>t~#xJX(nT$QyP`UIWR8cR_+ufvfXy7*QIcJXvcWMk{p=1B|-unf-yK! zv?Zyr7#qq$@R1*RQ&6TNF^;lA45?bT6G-X87*GOOZV?&>k?=AQ2AzV7Va?pq_m?jG;* zjuH|%?<7>np~JTR66sY;IeJ2HVMZGj>i~c7Zy`xg7ikuTn)|LJ*pBcL?`VUa z>=o!hs6O!;Zx-#LbOdf(e`4^@7xWvL(XO?qH704e0$RgwPLoX<&lOvDCXrzD( zEb>>Qm}JVa8K47Om~J=GA@l?h7!f=5V=^Kj+#In04B8M;4?}oKLk=nR^{k!iLb^4Y zi(v`z%4$z6A%q<(wGA1$4za>8s*-&wW?H`k9qgJUYa%omLhQxzco!lxxT74!75IaK zJEM`!TC6CR5;5_UX}#wRn?ehG8YU1+?myG&40@W!;|#PD5o32@-0u0TF<#->YLQV3 zD&{{xRVTBe51G`50d9IG(z(XPO&-H92q8%~EmgLkeiFesT@LiT|IZo^H%dz)afUA^ zPKmom>1Fd!4)zt@%3-at{xhKy89CA=ND6!14=RiiCeZp&ag0SUnzn!2pzWMkuU<)Z_}0n$$1U1KWU_EQ zMTIJ3#!_udHH8~jF4MPd|IutUG1}OF&T@uyI9Kps!i5bVMx0pj;*f3ATAT=M+eC%i zy#2d3uOG*Ln<e>|eQc)&IF8HxTo`g!&Ht^RCr9LF)tu=B!u~Rx4Pu-P&Cq z|255*-~O>nM-;1k{{8*`2Qa{u9{Y#3f5xh(x^f1(=N@+uS_hwr@WIEO2el%IoqF0K z54)UzK_;qy^16#PkOV|AuD0mgEkze!gfT`Lm-DD2kV-k_Eo7oe$DMl+x{jRf*7-+5 zg7&#kp{&Rw$U<(mL60D{N~!T50%yb$CReU(NlB$zQ7ua`$0W1N|A2AEnQqvTXB`e7 zatEJw)(LE)a^|V?pYqB{hfeMsYG<2g{yAktw^}nZ|Iv|7gl{5IP|7EtqOR)eA87a@ zNEDkC<+M{zKOO2sS^iPxA0ek9=$kk7iyR+` z1S_OqOq(bbnn(%LS{Ok(ksuaDQpOpM_=F3aXri^ZV1o~iv8_~|f*0P21`P&XZ&4-a zU0+Ol2GzeDCa9N?Q1K|OMiKsRC!~Vo7S@#KR8{0A&kxk@?^KmiB%WiWv`Okoz2n8!3` zGLgB=WC~yiikJi=KEa4+R#TeP|HNiAr>RYBZu6Sl1m`!qNligq;2-9czy%~Qk#w$; zAnjzQI^*fif57vd@?@t1rceu5{124IA!J+{G?A7OCx|79iv9lCA5oIh7wPavKm6g3 zeNgNl{`iMPGg_;XXmlbN-RMUBfe(!CV;_kizyOdF00C5iRwq%10g)mPX`B-Rgi!z) zXdw%&k;0z~Rm=|sqmMhKsDwc6Pq9Q%i#~9oAMz;2GrVz+Ol;#G;#r_v`ahM zF;7T@)GmU^!yhP34oj?1);Ite=h zquO$uHKivBz+nQQR+)xG9h;DZE{ZV>N$5crH9bmA74S~tmgJ^932Z)f+KRWF53~jAA29ok+x|lun~(-M9HbC;C+I6_r zBrHt>D`Gp503<*zvt8>*)X|Jd{NowPxP&E)Q3*>Rr5OvD$W7@vlAA(60>|}<1ai95 zpGvn{;-R32hm{t=A*G>xU`0ASwu@$5Ll}$DMRwM)mGl0|AKzF-D8#F)_Iha^4|>o# z_Q4Ka&7;0(Ey-*h|KSS|2p|9h5C9`Mae%ns*Cf*Tg)#V1j7az)5|KcPa7m)hbaF%i z6NX7%>p9rM_Eg0G6jC*6OOg@3IVkNpi76O|l#GnBsrZ=XF0L_=T?i>Z@0C@N$PtQN z4D?p|AaaGu@t}LGqqV)LggSoITD0z0BmtnZFq(V-0pP(Gj!=L~o1)e_Pvo|dxP~=& z!HYZm!w;VbZiMlA0S3H5By8xz6o`A=3zI~{7_MisHLTN73DwR#{G>@%_UxbBOeC-n z&Odhe4?R!hur4`qibL^_UHrqvi&%s@(!mZNF$<%ut?za8aSw;=LrD7=s6M^{QEm8x z5{r<=RgX-7|0MVKA9w%(se$khQ6GTHOqp#G(!+ofblU_G3bBXVH3HoE3y^P zfq(d*2|h466Q;lhHiVoY5E#N9h8vO#^I_oxQ9v5VFx+L+A}`LScKF64k~ybj=t1|% zw@c!Regb_!s1OA$npzG#{9_fjJ$JxcyNz*gBFBR+$0j!64rzo!7rTJ5RsB)+MeL#% z`k**LHjy2FFoNJFq4F*q;BZF>0}sDc=>Qxs5`zbYwgjR0fa%bNsxxC3%&3GP{;>!= z0N2%)*M&Ohka@Yf`XA~LL?|pe5ostu0d~D91|Wa|2GkP+7jAt$hCjcYpaQdF})agjiok=;;*oo|CB_KsUOFCzg$CBjuDXA>TNXdz~uR?Hoa=V9XxC2e2J0v3s zmdXNQPyrCw1w2TAEZDCA$O2Yy00@IJ2iQ9YcrpQS02LU(iBKsJU@6$LGQ_K?G^jd; zBZxb|gKM}3L72Q%_&CJ#11Fda7_@;

    0U*F1b>NDoBHEkOmT@tCu5)*s}p5_=gU# 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

    A!?)b%G&1HL+L#)4 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

    1!)|2Y0}5wN@h4 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�*z~}(PX#ci@Roh<2e(g|SYrS^$eLC+wU~!E5 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

    vhA7PXQV@G&$>K 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%0Ad(b_4W~47$cn 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%0AG_eAGiIwy%#5Qby@=y4F34yS6R7{99c!hLm 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 YkYi0kwk9@6mxlVZFw+TnJhS+P<2>w=!(bJW*` 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 $Ov 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

    qfb%Teel9jaWCmXOf8It-RVH`gH1eLZLKsn0IoI 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

    3qKMejL!LRC3=Y-nY8P6*BM-iu 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%0D#3A`;rDBw7%(PRQ7>7jrm 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

    8HXWD8Onyg~HEhji4h(5*R1RC|v}xpA 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 z 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

    TGgHFj>2v9Q6^CSzc4ET(M+$6 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%0DZC;pkOuy=|h4P*GY%a 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

    sDSA^FI8w989;a_F_>sv?Rf&|S<` zGU&YO3ITbrW}fj;!YV{<9<4h+oRn=KQ4&PAi&4Egt9@1xEt7)2nuag}1;Fy<5bj=C zCzV&Qs(Y1bk6ThN7`iyi!Npn>U>w6svs=1{?lw?o;1?(C$hx^#x8fIoR}toX^n`#e z0bU!M)`{jj$)-baZs2u3Ej@%ge^lf)U+0?BDLFJTKy3=`^1uWAVhuHlPc9cx5+k0| zPc+GHH@PS)(E>CR-99%>z}LG+EeU4UYoT9IGTjm*uP&f3Sw(?oc)>u#*qVl4P$p{| z)rm#;_oF{RFWPp=76~8_wTMewh$TRd4qM7-6qV?nHf|_b6@muH@^<<%Ild0?b*H|u ztk251|AnAiw^1+2DVrksT}9*?O;MYeDE)N!RWPp{TmJ_otO0x>ck|p0wv^X5+@EQs ze{&b!%3cEQ@Skf|#&gop(2V@$Vy2)T}#&A#2F6;ijFTDRcn$_ z?H7m^UWXrhzD^^LEDFAdVLm~q;O6TPzi_QyyK5fTjPvcGROOul@>hR#Z40#MMR;d< zuxG4A{L>sRmF#wazaS2-qAltw#8j|C&$M0;mb+@-?=J45J1nXSSr3zSQcf^X^)|wo zw<8NO(BG}lSKSjr({7kiC3ztVHbhKArwD#i_m~RWphk>D6ZRtVHlumZ#90sngE9*U zc7o2j8J8bf8`&G+(H>aeQ|@_|aTY-N6`V4oGH!Pong83IL%9k$>jOB2E?2%~Of|hu z)De|Ok8vKKYS5A{aV_!iQ*WNOd9N$S){fs7p`@+qSrmn1v$2aF=}xK#rPH7L|203vp%La)JRv4=0GtHyJCW;w$aa>#5`Ms z2b{9$be%ls;*?JnZGTWgx`-GHiUU{f11mGAw*5mjN`yGJ7WpYZu6-&baJr7>0LB_wyF!v^yXv~fcfgoN(Xy@$r|HCi?Ai#?nuo>r7diY^w9a1YIcf|69);AgAoC zd2|<52XE}S;rmagrd#pB(`d1$<&6S_`%*I&WzCj-1wqKYma36L+m=|KbLbk*G~8C3 zxR%s(>|7cL9~E9%E%W0J&qxvG(<2!tf>|MNJCnC_x>fa3_!&zv8Tcc&J)hH{5D?Ho z3nRdG661Pw8;;>K+k{WIH1hzxMhEWmR!D_BtG@c=K6k~5y)k$V6aG^yq_Ro)Rz9JA zBiCJ`J=f{+L7#$;&SitvqNep5IAt{87$WM&BR(zSx*r_BiH<#IAGGrTOlbSFrCW

    0bQ#scX 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 z

    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

    >(>8DL_UxPfw&k{g;L*jy7&ol7KGUqB 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 z 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 z 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

    %g@+n{TOO@8{I*t$ZrZ<;j#?HEc0? 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

    %=UW9x1!M}Em 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

    E>EVon1i3R%pSJ{*bR$GCJn@c3NKS=^U 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%0AeP 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

    euZh0w=0 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șnMEJ zIMu|T_?D;G{OGPTxbnk%F5S$%*PA*_KQKA$eqIY)6O7Sy*r{mh#ai>b{UoqD%eq}S zX+}wx#T;WD@<6uPDy2z(m;SQ1yvb8y^YOE?!48v}z9oy@%cKhQP1X*?;|-u69_*w_ z(0N#y>zTGZb&@JDk06`L59h&tX_OcogqdCo%@3HDlPRhYj4n$?;uv4IL=Me#_2*XLFxaK84ygiisnmS-WQ=j-`p8DyR)n_aW8~z2(Pa^O)hx&nKNGA=DFW3;vwGL6p#y z0W!ibseEola|m=%Clbwnt}uB&=aX4~-A=mIzF$`8QG8BxUZ$D$;?;qjaYmAmFZuZT zvX-I~iH#mN0)D<5K>pk8pUqO*@kZ6&!HQ?TSxa%MXRQwmMi%C8%X0~2+~J9bjAiOQ zzK(4AFyyhyW{}mNCvZ~0tY5a$hsD7v>|Y6GT1v?6QkZ7SKc$U%kYpL8Y56ezD4AWJ zF$zWYKHR1IMoQN0yQYlKoR{V6G7{jfbpeP4j+mAP@JeHf6&<4wCcVJfSz$m*v}4(d_(T zx5@XQ^nlgVz^I25LD@LwCb9bH=B(Kp5R z621%V_gO|H%KeBik;#XH7zdPYsgbEX)iM_iM7(r}s^Q#Gnn_hX;S}MKHd!wh%SZ94 zDIT!JNxtd{in$tkN9i-HROM|xyKXR!h=8Gkl8pbTmw$Zb2O(*D@;Y)6w?^qMSxNkf z5m|ve0lN`07A_i77JD=o-z7-xiOxo^)$yWT?aLDCm?ZIzFE1QC>FlbxC|==Y7s6U= zJz3O;W}dQOqR>Cc3mtlESaY4Ry_wiKxiJ(Y=M(IZm+tnaL}c`1pCv2U&;Ck{557Yz z^MHGlpbVXJhp>zHhOOyYR@8*LcFEDx1FN2xRt%HI$qKvkSjS!{dyI@v{u{1YTTvG! z=^H&PCGz{KrX0j2ptl+eEJx^OL?9$lH1S{i;UY;oAQ$81Zzd|(P{cwBaIk(#L?AxmmrCE+CdVWHih1I zaAF~%KD0nnq2XMqFs95xOCv1d#&D8LfonnPNYy4g-E-WzJVO?l8TrYEAj7Z8;Y4Ml z{y42Evucoseva>a(C4-FzRi2GOCPcX0UiWBSreiY)__gPO^R@eD8??yguN)#@H+x1 z*S*Jc%1pLQJsO7nG{nOu48f-S6b?6QFTz@q@vI*0a$H7!!9V*6h{t$`pZH`;)ky^| z>?7HwagBmDu_2QmpxFgG9YRjuHSyM9Y*ELlaOct_9NkNzoTx1+d|i)&&Z^BWf`H(r z^|KJpfT;0==h;I^Zn&hl(F73AtSH!lQpem`_Cnw!Yk@n#KGDz`P7o-|>|Y42li8L} z;V^wUM>qF>IC~4IDA%@am=Xr1ySt>3?ixZGq@@u70g;lBlo}ePq`Q#@6%ml`Mp8kL zM!Ff`zh*ysKYKs__q^}={(r4mu5q{-uKT{u>&)XkPNnO|FR@*2fU-C-OL&%4nc ztY615mldp-isdrS7Og=^ksz@V0ZrmgY4=cOQ}oM6w=goA;d%3xXnAln7a0qeBGta5 zmb0q%w|k_u`|cTYyl!eKE$oGYE%`9L`C#1ERnk}X552B<1s9n}@(_uw!@Bp|#C`4oq=t? z_h58d`a)pN^5;Y9Q;i=^jx#O`QGYnJh%S%%BUtY+L9zNk3P<|k=qv7+52_WPW1S9rl%FE2mbr;{4+=)j^At)QTouWuAr&0~Ly4e;2=$|L`N6%h-+V zIH#G0Zu=9X=>kuuxW&|8ovucSp^P1#;X9ha#n(c*2ohAkQtlfeio$9jfcHk?qmSXu|kqqKbrUuStW;rme*t&aD5_cp`Hx}5M-M)|8{cTURdw{ zbv?OZ(9_e;6+Y}2`7>&4eL%HH2;Ex$+$8#Bs)1QGd6Gn8YUt4>qTONX-nhZ=$pcwR z+M524Ex5i*sIyEq9u%$gt)v6OR`8Zm3-0t>;j}=^!TZQ_b(5aav;;13HJ1zT49r8H zM7LJpL}uS1D03L(k(BmuG@->l5nMEy)4o^aoEZT4Af3C*v%XkQV5Bl za)By^8sT(#801N~D7EKe4RO69BDuQH2(+|o4pWWNArtkcJ?G!iE*aX?K<`A7IK?5m)RS7o&W`(c-%vVxi0Ar<3;=UM)xq;7rk*zw}r5VD&<=PUS_BKsA(= zXjq=qx=1jrx|V0cxoeR8=~W-oavr=2pr*xn7Vp@4=?L?Qr0{5~tz$W3s5S zG=gnb$@Wsv+VG$ro2($E$h-jz1TaXiv!?A=Kcwkw6K!GP$32$M36%Z zsh%WU?#ciiKb#-DzX=_RY~%z#bsBMEqufxL5Q=fkqKUJJBn@_+EI*zd{UC2t`e7gh z&!b9Iiq`K(2m1Gt?d=DVM;g+?_@YULT=PFxO*U(8T3%rC#%t&b!Et@byMJt5@-L(u z+ZtuY4j+eK$~Ef!!|3+_`*ohtwoqQrNE>oJxbn zy$rr;uL#M`Vn~*9>x725M^v4}%V^-nXUU&nI9Y5h9KV|sww|33 z5pzqUolaPLQ}nR)NKH!|fANh^w#8kDUHFBUy_tHe16I|0-pIv78S-dkE2nP!^knar zB4=R_$Ch#B%BWagBO`g0tIsW9?$>+zdx<+d{s&PQv-s5L#W)zzqeXwI-};Ne2D_I` z#1@VadP8;&+cZ$kp}wWLTc~k5`9T`C;>&zn;|5>0 z^ejnYJ0FW!iWqi;*yyd&CrWCtD4OaDSupfyP8%iJPWXxFk;Q6Lc0}mVl-bVzTCoO? z?9Z1)3t?M8PfCGP+xo*-+T7?0lP^>ET6+r2Xn*sHnUW{2>3vhQSjHi=4EsVvZ7{8> zTM8mberQ{nIHc6tyO=QbkdH96PpSi|cTjWVhyv16M{kf$7_POUWVQ_S9u5m<60}vb z(@#*`9wOBUC%A8xn>NcW%yehx!qXjV`z-9u;rA6*9NnDGof9KSS2U0B8=QRS*Dsa| zxXf|mF-_4gBiH9f-yz>%HP4$qaf(!n-1F?E569}J9+5a2{MvBrt+AyKefI9M`)Y8} zJ2en9It=LqPg{U*OAjsE?fcW{{HKM#SH`qThLbMUmzmtL?`mlK>0W&iOUct{=zC}# zNMO*=*U?h})3JxFqAd?AC&su+^vBt?Dh1EFKf~`A5TfEmlNYfNNv}l&F%`p$r_>E! z*pZ24hC$z?_gR#JQ5}R6ROu{GbPR!|-m-bxPg&|HvA!H184vs1uY*kr-^F4 zHWg8NSY)>pjfr9_=$zS}2VJD$5Vi`j8n4iOML>U!{sbF!%#LXKH_$D%>0s(t&DVL5gS067$-ICqx9yxf?*-Kln2?c zn0FNRWWI=)NT>i!I>iZ}Dw5Tp#oV*<_w03}YD%WIHp?X9)|R@I#gUKtOXZfH6_<6z zEy@3V4#9!UK}OEw#GL4a5$=yG4U22AT!&y%(Sx{8*JGmc_@>T}f7sAXQ;y=)L>q3yin7Ul#KG!~FBl zZ*s?u!qy{Rp9n}ANyN?^8y4SE2YpI9Qa`T>oYP`adboJyJB=+9%trbk(TRYPj_U0n zeyGPy%ObwfeFoCIH(seSd{(oeRE%8O-47l^n1Kh%8U%WSM4%1~not2#&Rr2&k6x7! zT>{tpM1{$}Uu~+Iiyc2OOnXfl#z4)db2;wlSE-;~9QHKhAzckK_K?dgc(x=OQv#7h zC^G<}$}OV$OS{Kt+@qA6wo8yb(e`nJs76w!UYVPcwg$++0LAq8ON$8f+F_$QV%6$> zc?s-~Ce4v_^dIM=4GRStq?5f6O-*?6xOe@RTu_#l{$LMXLxvZnaZGEnB#wsdE|Mh_~O8u{H!!eT1%h%e;>8lz5 z1$h19Za21f%(#_{-u#gr)f+vS;}E8ZmEIkGDn=+8+o-ls zW_zAM0!QUX29fxXCPpS!9Q_oKeiY(*oW00gNvEmsQWlbDCktvpcJ{qr5k4+7OBOFD zvSOrGv?^3J@XDM8Kf6WPZ(a5?V2UG!dE+4yq^di_2oIHO`1GrisW7Y@==ho}ECO#ik}|9X={jf|!Wso2;~7nnE<@X4+} z{3J0UAGmsKD3*G_$KW*{H$3xBKk%o@JG|zVSn=4^JhHm+Eq0Gf4SZ%^*%W_g{kJnO zIZL?ihtUOp0$zgA0=+ODXJ1cQ`7y&&-# z@HA)FaNW3qqzwroaA@vBq<_{hk-PCr!!f1!?#k2B$3WAhS6&jN)yC!AiGE}T011jxg+V!iAu z|D9UP_ey%yKORUR&gOd8@}}&Yi=GV5u%K!SxGY0(G+~_3&=y_k>>ae6 zAANi5Z2I}fa3#~@G79t>_A!!o2SR9N zz1c*2d){+rn?RT^BFyZf-vCE$W;K@8m1N+|1t<0mZ$2XHl+Iy2?IoLE8+ zzLr4rF!9%_`Yn2mi$u~vFV^F)msK@2rb*A5O|w_*jONzPLX`qH?BXO(4L>fnp1gMs zy=7$^75(b-$&ZX*L(AKZ`=*BnP(_YH3h)Uj@smm(<0&-=it!oBCHNlSj$DM3Z%<6C zk6f$Vh+t19Wbg9mmr@$u(5cW&SzKHn80c zj?sS@z<>OAO*#mi;>rUBf`bTBzlP(g@msY3VM3dgn;+few>L;3DE&FALt zXllTyl2LLz4z&e^p9U3~>cC(eu@e0`08wwzZvs%&D*YxChAn^Shh{R*C&X0Umw1op z8}piNM#7t>sj@!|^F{L&twg)fcu4o)H2N zk_e*Mqv^Nx$da5Zc|r^{uC-%FK6pF&e4!fl@}qq^q#Td%puPWj;72b=6xqJ*1uq)8 zu~Y?O|0z@6_pJ|bf98ZdbjRAUVsy-6F9XaWk~?xGyqs$6Z`@v-!ca~@TdzlQb)=mb z0&VD9MxG6Jf2JR1$WL%J(9EDk{QT`b8-2_(^HhdZ0d;w$+5*ijx4XvBsbT8e&_0Bv8)WX*vA5D{QSs7rZnbF{LUaWr3Y7$mp2GUf z&YGq}SH(-`UxeWC6>1ms$5zd0NLARYNy=SVM8)%yc#m03R?r{57RB~(j1l|>*@M%g z5MA+79Dp_pjq{AFU;_WozZ)rc^03O*yKB_$k0fy8m$QkqmWJvDXOGhUPhtT+UxOiC zH*FUDs%JZH{bpJjStH1zGykvai&BtK*io2t-@g?6VzB;JlL0u1&*1D3e61wHJN6fc ztFkgdflGiJg_de4=SvIsT(yQPIy<6Y--# z(l72z6_CC{A3=XH)M8DODNSg5O%|%AB(tln9O0GT5rPZhN*-(BDaHp-M|F{SjEfJ! zncF(vG2edV(RMSCOx(T+D6H?z-tdHWEq6ImhKS!~R`c0S)wL)%>N(1vblr1ER-i&lRvrUiUp6$z%tlf2S zj|Vod?|TUGV37=7()XJhpAopIb_+Jt)T=?ddHvl&o|#ruT76M*GHcMZDc5P{h*|t! z&YYSB0fd*v9YEl}vEQ|J5Z`Nddta~dEpYXe>*l^M?9Yz} zk&#&*jGI5B#6|9&A#+G)v9^IZRDEgGf3sQqyGaH5o>277pO-?>AXxI!odSlS9))&B zx8Lc@t5osqfMdMoBXE&z<1#{C!bE9PU;XTq=ZWQ%BTHtZ#M!42?Djyh)MH}&!r@OD z-3VP@6x0U#Wgf#fl%&}WarUkjZ~e!@+e-U994=a$7)r{T0aMIZI;_XmF@lkRWZ*OV z=Hzb2r`rF^wdfLBn8ZvMaAVrZ>Rs%8uqafP$ z!z?#scgYoT5E*E_7;-K;F`rl!`qwqcgoYMqYoD{9E;(CS>x8*5BMcPUo zr9OImW6vRC?HJvFNbvvp%DESmq;Fhm=)Ics`3WCikC@d|C!C1;FWG~~BE4n~QA{W? zEH=5PfVO(8^hcQe*Iz`0-2e3z6sq3VUKVAmam?SP^Sx_D{J5 zq9voYR9c)B*?L*`e@862LTRqUWap*t3bS*Nlcy)-_JNti%mj3gL|Kkr@SYa9(3f4%+ z+z+|GYfK7ZaXuK^loMH(X0f)FB$X9&q|kj}jK@5}#F zlzfE0RJ3?&QuYdck{`<5)(pUlo zHck*@niB!$XLj)5lFTaC0&dm=BF(S23}Oy_ejH^PRMd~F)WyZOH9Nq~kDu2MSQh@IET{rIn zjJMNu08ZzA6urkOcnf$nh^0YnC2x9`u`ab6&y;+)*>1hzC@8G_ zbuLx}SH6n2mB?2fNm)DSWsD<27`aG215?2Q&9k0G@0Tx36PXPHdhAz5u;N`}k119J zBme-wtl#wMOQlkQh!OoA0h+;8$vv>Z~OO$?-)=P&%1>qK|!b3Yi=S--*-cvcB}9gpp1Np z@Ik7y&A>x*uK_OBh}c>rM&;~9Wp5+|+l9 G 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 + exit 1 +fi + +# Validate user configuration before touching local state or source Postgres. +LOCAL_CONFIG="$(python3 /app/local_config.py /app/pgstack.yaml)" +unset AUDIT_INCLUDED_TABLES AUDIT_EXCLUDED_TABLES AUDIT_IGNORE_CHANGE_COLUMNS +AUDIT_ENABLED="$(jq -r '.audit.enabled' <<<"$LOCAL_CONFIG")" +SEARCH_TABLES_JSON="$(jq -c '.search.tables' <<<"$LOCAL_CONFIG")" +SEARCH_TABLES="$(jq -r '.search.tables | map(.name) | join(",")' <<<"$LOCAL_CONFIG")" +SEARCH_SNAPSHOT="$(jq -r '.search.enabled' <<<"$LOCAL_CONFIG")" +export AUDIT_ENABLED SEARCH_TABLES_JSON SEARCH_TABLES SEARCH_SNAPSHOT +export SEARCH_BASE_PATH="local/search" +if [[ "$AUDIT_ENABLED" == true ]]; then + # An explicitly empty exclusion list enables Audit for every table. + export AUDIT_EXCLUDED_TABLES="" +fi +if [[ "$SEARCH_SNAPSHOT" == true && -z "${OPENAI_API_KEY:-}" ]]; then + SEARCH_TABLES_JSON="$(jq -c 'map(. + {keywordOnly: true})' <<<"$SEARCH_TABLES_JSON")" + export SEARCH_TABLES_JSON +fi + +# Each start creates a fresh local capture. +rm -rf "${LOCAL_NATS_DIR}" "${LOCAL_S3_DIR}" +mkdir -p "${LOCAL_NATS_DIR}" "${LOCAL_S3_DIR}" +printf '%s\n' 'max_payload: 2MB' >"${LOCAL_NATS_CONFIG}" + +# CDC configuration +export SLOT_NAME="pgstack_local" +export PUBLICATION_NAME="pgstack" +export NATS_URL="nats://127.0.0.1:4222" +export NATS_STREAM_NAME="pgstack" +export NATS_SUBJECT="pgstack.changes" + +# Local S3/Iceberg configuration +export AWS_S3_ENDPOINT="http://127.0.0.1:9000" +export AWS_ACCESS_KEY_ID="pgstack" +export AWS_SECRET_ACCESS_KEY="pgstack" +export AWS_REGION="us-east-1" +export AWS_S3_BUCKET="pgstack" +export AUDIT_BASE_PATH="local/audit" +export NATS_CONSUMER_NAME="pgstack-processor" + +# Local-edition product limits. These are intentionally not configurable. +export RETENTION_DAYS="1" +export MAX_HOT_PARQUET_SIZE_MB="10" +export NATS_BATCH_INTERVAL_SEC="10" +export DUCKDB_MEMORY_LIMIT="512MB" + +# PostgreSQL-compatible read endpoint +export PGSTACK_HOST="0.0.0.0" +export PGSTACK_PORT="54321" +export PGSTACK_DATABASE="pgstack" +export PGSTACK_USER="" +export PGSTACK_PASSWORD="${PGSTACK_PASSWORD:-}" +export LOG_LEVEL="WARN" + +declare -a PROCESS_PIDS=() +declare -A PROCESS_NAMES=() + +start_process() { + local name="$1" + shift + + "$@" & + local pid=$! + PROCESS_PIDS+=("${pid}") + PROCESS_NAMES["${pid}"]="${name}" + echo "Started ${name} (pid=${pid})" +} + +start_process_without_stdout() { + local name="$1" + shift + + "$@" >/dev/null & + local pid=$! + PROCESS_PIDS+=("${pid}") + PROCESS_NAMES["${pid}"]="${name}" + echo "Started ${name} (pid=${pid})" +} + +filter_nats_stderr() { + local line + + while IFS= read -r line; do + if [[ "${line}" != *"[INF]"* ]]; then + printf '%s\n' "${line}" >&2 + fi + done +} + +filter_rclone_stderr() { + local data_cleanup_error=" ERROR : ${AWS_S3_BUCKET}/${AUDIT_BASE_PATH}/changes/data/: Dir.Remove not empty" + local metadata_cleanup_error=" ERROR : ${AWS_S3_BUCKET}/${AUDIT_BASE_PATH}/changes/metadata/: Dir.Remove not empty" + local line + + while IFS= read -r line; do + if [[ "${line}" != *"${data_cleanup_error}" && "${line}" != *"${metadata_cleanup_error}" ]]; then + printf '%s\n' "${line}" >&2 + fi + done +} + +wait_for_port() { + local host="$1" + local port="$2" + local name="$3" + + for _ in {1..300}; do + if (echo >/dev/tcp/"${host}"/"${port}") >/dev/null 2>&1; then + return 0 + fi + sleep 0.1 + done + + echo "${name} did not become ready on ${host}:${port}" >&2 + return 1 +} + +prepare_source_postgres() { + local active_pid + active_pid="$( + psql "${DATABASE_URL}" \ + --no-psqlrc \ + --tuples-only \ + --no-align \ + --set=ON_ERROR_STOP=1 \ + --command="SELECT active_pid FROM pg_replication_slots WHERE slot_name = 'pgstack_local' AND active" + )" + + if [[ -n "${active_pid}" ]]; then + echo "Replication slot ${SLOT_NAME} is already active on backend ${active_pid}" >&2 + return 1 + fi + + psql "${DATABASE_URL}" \ + --no-psqlrc \ + --set=ON_ERROR_STOP=1 <<'SQL' >/dev/null +SELECT 'CREATE PUBLICATION pgstack FOR ALL TABLES' +WHERE NOT EXISTS ( + SELECT 1 + FROM pg_publication + WHERE pubname = 'pgstack' +) +\gexec + +SELECT pg_drop_replication_slot(slot_name) +FROM pg_replication_slots +WHERE slot_name = 'pgstack_local'; +SQL +} + +setup_nats_stream() { + for _ in {1..300}; do + if nats --server "${NATS_URL}" --no-context stream add "${NATS_STREAM_NAME}" \ + --subjects "${NATS_SUBJECT}" \ + --storage file \ + --retention work \ + --discard old \ + --max-age 24h \ + --dupe-window 24h \ + --replicas 1 \ + --allow-direct \ + --deny-delete \ + --defaults >/dev/null 2>&1; then + echo "NATS JetStream is ready: stream=${NATS_STREAM_NAME} subject=${NATS_SUBJECT}" + return 0 + fi + sleep 0.1 + done + + echo "Failed to create local NATS stream" >&2 + return 1 +} + +# Called by the EXIT trap through cleanup. +# shellcheck disable=SC2317,SC2329 +drop_local_replication_slot() { + if ! psql "${DATABASE_URL}" \ + --no-psqlrc \ + --quiet \ + --set=ON_ERROR_STOP=1 \ + --command="SELECT pg_drop_replication_slot(slot_name) FROM pg_replication_slots WHERE slot_name = 'pgstack_local' AND NOT active" >/dev/null; then + echo "Warning: failed to drop local replication slot ${SLOT_NAME}" >&2 + fi +} + +# Registered as the EXIT trap after source preparation. +# shellcheck disable=SC2317,SC2329 +cleanup() { + trap - EXIT INT TERM + + if ((${#PROCESS_PIDS[@]} > 0)); then + kill -TERM "${PROCESS_PIDS[@]}" 2>/dev/null || true + wait "${PROCESS_PIDS[@]}" 2>/dev/null || true + fi + + drop_local_replication_slot +} + +echo "PGStack local edition" + +prepare_source_postgres + +# Failed setup must never clean up another instance's replication slot. +trap 'cleanup' EXIT +trap 'exit 130' INT +trap 'exit 143' TERM + +start_process_without_stdout "nats" nats-server \ + --config "${LOCAL_NATS_CONFIG}" \ + -js \ + -sd "${LOCAL_NATS_DIR}" \ + -a 127.0.0.1 \ + -p 4222 \ + 2> >(filter_nats_stderr) +setup_nats_stream + +start_process_without_stdout "s3" rclone serve s3 "${LOCAL_S3_DIR}" \ + --addr 127.0.0.1:9000 \ + --log-level ERROR \ + --no-checksum \ + --no-cleanup \ + 2> >(filter_rclone_stderr) +wait_for_port 127.0.0.1 9000 "Local S3" + +start_process "processor" /app/bin/processor +start_process "server" /app/bin/server +start_process "cdc" /app/bin/cdc + +echo "PostgreSQL read endpoint: postgres://127.0.0.1:${PGSTACK_PORT}/${PGSTACK_DATABASE}?sslmode=disable" + +set +e +exited_pid="" +wait -n -p exited_pid "${PROCESS_PIDS[@]}" +status=$? +set -e + +if [[ -n "${exited_pid}" ]]; then + echo "${PROCESS_NAMES[${exited_pid}]:-A child process} exited with status ${status}; stopping local stack" >&2 +else + echo "A child process exited with status ${status}; stopping local stack" >&2 +fi + +exit "${status}" diff --git a/local_config.py b/local_config.py new file mode 100644 index 0000000..8530d8a --- /dev/null +++ b/local_config.py @@ -0,0 +1,89 @@ +#!/usr/bin/env python3 +"""Validate local YAML and emit the internal configuration as JSON.""" +import json +from pathlib import Path +import sys + +import yaml + + +class UniqueKeyLoader(yaml.SafeLoader): + pass + + +def unique_mapping(loader, node): + result = {} + for key_node, value_node in node.value: + key = loader.construct_object(key_node) + if not isinstance(key, str) or key in result: + raise ValueError("YAML keys must be unique strings") + result[key] = loader.construct_object(value_node) + return result + + +UniqueKeyLoader.add_constructor(yaml.resolver.BaseResolver.DEFAULT_MAPPING_TAG, unique_mapping) + + +def mapping(value, allowed, location): + if not isinstance(value, dict) or set(value) - allowed: + raise ValueError(f"{location} must be a mapping with keys: {', '.join(sorted(allowed))}") + return value + + +def enabled(section, default, location): + value = section.get("enabled", default) + if type(value) is not bool: + raise ValueError(f"{location}.enabled must be true or false") + return value + + +def columns(value, location): + if not isinstance(value, list) or not value or any(not isinstance(v, str) or not v.strip() for v in value): + raise ValueError(f"{location} must be a nonempty list of column names") + if len(set(value)) != len(value): + raise ValueError(f"{location} contains duplicate columns") + return value + + +def normalize_config(raw): + root = mapping(raw, {"audit", "search"}, "configuration") + audit = mapping(root.get("audit", {}), {"enabled"}, "audit") + search = mapping(root.get("search", {}), {"enabled", "tables"}, "search") + audit_enabled = enabled(audit, True, "audit") + search_enabled = enabled(search, False, "search") + tables = search.get("tables", []) + if not isinstance(tables, list): + raise ValueError("search.tables must be a list") + if search_enabled != bool(tables): + raise ValueError("Search requires both enabled: true and at least one table; omit tables when disabled") + if not audit_enabled and not search_enabled: + raise ValueError("Enable Audit, Search, or both") + names = set() + for table in tables: + mapping(table, {"name", "indexColumns", "storeColumns"}, "search table") + name = table.get("name") + if not isinstance(name, str) or len(name.split(".")) != 2 or any(not part or any(c.isspace() or c == ',' for c in part) for part in name.split(".")): + raise ValueError("Table names must be schema.table without whitespace or commas") + if name in names: + raise ValueError(f"Duplicate Search table: {name}") + names.add(name) + columns(table.get("indexColumns"), f"{name}.indexColumns") + columns(table.get("storeColumns"), f"{name}.storeColumns") + return {"audit": {"enabled": audit_enabled}, "search": {"enabled": search_enabled, "tables": tables}} + + +def load_config(path): + if not path.exists(): + return normalize_config({}) + if not path.is_file() or path.stat().st_size > 1024 * 1024: + raise ValueError("Configuration must be a regular YAML file smaller than 1 MiB") + with path.open() as source: + raw = yaml.load(source, Loader=UniqueKeyLoader) + return normalize_config(raw if raw is not None else {}) + + +if __name__ == "__main__": + try: + print(json.dumps(load_config(Path(sys.argv[1] if len(sys.argv) > 1 else "/app/pgstack.yaml")))) + except (ValueError, OSError, yaml.YAMLError) as error: + sys.exit(f"Invalid PgStack configuration: {error}") diff --git a/pgstack.example.yaml b/pgstack.example.yaml new file mode 100644 index 0000000..2383c5c --- /dev/null +++ b/pgstack.example.yaml @@ -0,0 +1,9 @@ +# Enable Audit, Search, or both. No file defaults to Audit only. +audit: + enabled: true +search: + enabled: true + tables: + - name: public.products + indexColumns: [name, description] + storeColumns: [id, name, description] diff --git a/processor/config.go b/processor/config.go new file mode 100644 index 0000000..ff5cf16 --- /dev/null +++ b/processor/config.go @@ -0,0 +1,132 @@ +package main + +import ( + "fmt" + "os" + "path" + "strconv" + "strings" + "time" +) + +type Config struct { + IntegrationConfig + LogLevel string + ConsumerName string + NatsURL string + NatsSubject string + NatsStreamName string + NatsBatchInterval time.Duration + S3Endpoint string + S3Bucket string + S3AccessKey string + S3SecretKey string + S3Region string + AuditBasePath string + MaxHotParquetSizeMB int64 + DuckDBMemoryLimit string + RetentionDays *int + SearchBasePath string + SearchTablesJSON string + OpenAIAPIKey string +} + +func LoadConfig() *Config { + batchIntervalSec := getEnvInt("NATS_BATCH_INTERVAL_SEC", 30) + maxHotParquetSizeMB := getRequiredEnvInt64("MAX_HOT_PARQUET_SIZE_MB") + + s3Endpoint := getEnv("AWS_S3_ENDPOINT", "http://localhost:9000") + targetS3Bucket := getRequiredEnv("AWS_S3_BUCKET") + targetAuditBasePath := getRequiredEnv("AUDIT_BASE_PATH") + defaultSearchBasePath := path.Join(path.Dir(targetAuditBasePath), "search") + s3AccessKey := getEnv("AWS_ACCESS_KEY_ID", "minioadmin") + s3SecretKey := getEnv("AWS_SECRET_ACCESS_KEY", "minioadmin") + + config := &Config{ + LogLevel: getEnv("LOG_LEVEL", LOG_LEVEL_INFO), + ConsumerName: consumerName(), + NatsURL: getEnv("NATS_URL", "nats://localhost:4222"), + NatsSubject: getEnv("NATS_SUBJECT", ""), + NatsStreamName: getEnv("NATS_STREAM_NAME", ""), + NatsBatchInterval: time.Duration(batchIntervalSec) * time.Second, + S3Endpoint: s3Endpoint, + S3Bucket: targetS3Bucket, + S3AccessKey: s3AccessKey, + S3SecretKey: s3SecretKey, + S3Region: getEnv("AWS_REGION", "us-east-1"), + AuditBasePath: targetAuditBasePath, + MaxHotParquetSizeMB: maxHotParquetSizeMB, + DuckDBMemoryLimit: getRequiredEnv("DUCKDB_MEMORY_LIMIT"), + RetentionDays: getOptionalEnvInt("RETENTION_DAYS"), + SearchBasePath: getEnv("SEARCH_BASE_PATH", defaultSearchBasePath), + SearchTablesJSON: getEnv("SEARCH_TABLES_JSON", "[]"), + OpenAIAPIKey: getEnv("OPENAI_API_KEY", ""), + } + + if !isValidLogLevel(config.LogLevel) { + panic("Invalid LOG_LEVEL " + config.LogLevel + ". Must be one of " + strings.Join(LOG_LEVELS, ", ")) + } + + loadIntegrationConfig(config) + return config +} + +func (c *Config) MaxHotParquetFileSizeBytes() int64 { + return c.MaxHotParquetSizeMB * 1024 * 1024 +} + +func (c *Config) S3Path(key string) string { + return "s3://" + c.S3Bucket + "/" + key +} + +func getEnv(key, defaultValue string) string { + if value := os.Getenv(key); value != "" { + return strings.TrimSpace(value) + } + return defaultValue +} + +func getRequiredEnv(key string) string { + value := strings.TrimSpace(os.Getenv(key)) + if value == "" { + panic(fmt.Sprintf("%s is required", key)) + } + return value +} + +func getEnvInt(key string, defaultValue int) int { + if value := os.Getenv(key); value != "" { + if i, err := strconv.Atoi(value); err == nil { + return i + } + } + return defaultValue +} + +func getOptionalEnvInt(key string) *int { + value := strings.TrimSpace(os.Getenv(key)) + if value == "" { + return nil + } + + i, err := strconv.Atoi(value) + if err != nil { + panic(fmt.Sprintf("invalid %s: %v", key, err)) + } + + return &i +} + +func getRequiredEnvInt64(key string) int64 { + value := strings.TrimSpace(os.Getenv(key)) + if value == "" { + panic(fmt.Sprintf("%s is required", key)) + } + + i, err := strconv.ParseInt(value, 10, 64) + if err != nil { + panic(fmt.Sprintf("invalid %s: %v", key, err)) + } + + return i +} diff --git a/processor/config_test.go b/processor/config_test.go new file mode 100644 index 0000000..1212b7f --- /dev/null +++ b/processor/config_test.go @@ -0,0 +1,22 @@ +package main + +import ( + "testing" + "time" +) + +func TestLoadConfigUsesResolvedStorage(t *testing.T) { + t.Setenv("AWS_S3_BUCKET", "selected") + t.Setenv("AUDIT_BASE_PATH", "org/project/audit") + t.Setenv("SEARCH_BASE_PATH", "") + t.Setenv("MAX_HOT_PARQUET_SIZE_MB", "96") + t.Setenv("DUCKDB_MEMORY_LIMIT", "1GB") + t.Setenv("NATS_BATCH_INTERVAL_SEC", "300") + config := LoadConfig() + if config.S3Bucket != "selected" || config.AuditBasePath != "org/project/audit" || config.SearchBasePath != "org/project/search" { + t.Fatalf("incorrect resolved storage: %#v", config) + } + if config.NatsBatchInterval != 300*time.Second { + t.Fatal("batch interval not preserved") + } +} diff --git a/processor/deduplication.go b/processor/deduplication.go new file mode 100644 index 0000000..bbf527e --- /dev/null +++ b/processor/deduplication.go @@ -0,0 +1,218 @@ +package main + +import ( + "context" + "fmt" + "strings" + "sync" +) + +const DEDUPLICATION_MAX_SIZE = 50000 + +// DeduplicationKey uniquely identifies a change message +type DeduplicationKey struct { + Position uint64 + Database string + Schema string + Table string + Operation string +} + +// DeduplicationTracker tracks processed messages to prevent duplicates +type DeduplicationTracker struct { + mu sync.RWMutex + processed map[DeduplicationKey]bool + order []DeduplicationKey + maxSize int +} + +func NewDeduplicationTracker(maxSize int) *DeduplicationTracker { + return &DeduplicationTracker{ + processed: make(map[DeduplicationKey]bool), + order: make([]DeduplicationKey, 0, maxSize), + maxSize: maxSize, + } +} + +func (dt *DeduplicationTracker) MakeKey(msg *ChangeMessage, operation string) DeduplicationKey { + return DeduplicationKey{ + Position: msg.Source.Lsn, + Database: msg.Source.Db, + Schema: msg.Source.Schema, + Table: msg.Source.Table, + Operation: operation, + } +} + +// LoadFromParquet reads recent records from Parquet files to populate the tracker +// Uses a sliding window approach: only loads records with LSN within the last N positions +func (dt *DeduplicationTracker) LoadFromParquet( + ctx context.Context, + newDuckDB func() (*DuckDBClient, error), + config *Config, + dataPath string, + s3Client *S3Client, +) error { + // Check if any parquet files exist first + files, err := s3Client.ListFiles(ctx, dataPath) + if err != nil { + return fmt.Errorf("failed to list files: %w", err) + } + + hasParquetFiles := false + for _, file := range files { + if strings.HasSuffix(file, ".parquet") { + hasParquetFiles = true + break + } + } + + if !hasParquetFiles { + LogInfo(config, "No existing parquet files found, starting fresh") + return nil + } + + duckdb, err := newDuckDB() + if err != nil { + return err + } + + s3Path := config.S3Path(dataPath + "/*.parquet") + + // First, get the max position (LSN) from existing data + maxPosQuery := fmt.Sprintf(` + SELECT MAX(position) as max_pos + FROM read_parquet('%s') + `, s3Path) + + var maxPosition *uint64 + err = duckdb.QueryRowContext(ctx, maxPosQuery).Scan(&maxPosition) + if err != nil { + return fmt.Errorf("failed to read maximum position from parquet files: %w", err) + } + + if maxPosition == nil { + LogInfo(config, "No records found in parquet files") + return nil + } + + // Define sliding window: only load records from last N positions + // This prevents loading millions of records on restart + windowSize := uint64(1000000) // 1 million LSN positions (~few hours of changes) + minPosition := uint64(0) + if *maxPosition > windowSize { + minPosition = *maxPosition - windowSize + } + + LogInfo(config, fmt.Sprintf( + "Loading deduplication data from position %d to %d (window size: %d)", + minPosition, + *maxPosition, + windowSize, + )) + + // Query to get unique keys from recent records only + query := fmt.Sprintf(` + SELECT DISTINCT + position, + database, + schema, + "table", + operation + FROM read_parquet('%s') + WHERE position > %d + ORDER BY position ASC + `, s3Path, minPosition) + + rows, err := duckdb.QueryContext(ctx, query) + if err != nil { + return fmt.Errorf("failed to query parquet files: %w", err) + } + defer rows.Close() + + count := 0 + for rows.Next() { + var position uint64 + var database, schema, table, operation string + + if err := rows.Scan(&position, &database, &schema, &table, &operation); err != nil { + return fmt.Errorf("failed to scan row: %w", err) + } + + key := DeduplicationKey{ + Position: position, + Database: database, + Schema: schema, + Table: table, + Operation: operation, + } + + dt.MarkProcessed(key) + + count++ + } + + if err := rows.Err(); err != nil { + return fmt.Errorf("error iterating rows: %w", err) + } + + LogInfo(config, fmt.Sprintf("Loaded %d recent records into deduplication tracker (max LSN: %d)", count, *maxPosition)) + return nil +} + +func (dt *DeduplicationTracker) IsDuplicate(key DeduplicationKey) bool { + dt.mu.RLock() + defer dt.mu.RUnlock() + return dt.processed[key] +} + +func (dt *DeduplicationTracker) MarkProcessed(key DeduplicationKey) { + dt.mu.Lock() + defer dt.mu.Unlock() + + if dt.processed[key] { + return + } + + dt.processed[key] = true + dt.order = append(dt.order, key) + + for len(dt.processed) > dt.maxSize && len(dt.order) > 0 { + oldest := dt.order[0] + dt.order = dt.order[1:] + delete(dt.processed, oldest) + } +} + +// FilterDuplicates removes duplicate records from a slice +func (dt *DeduplicationTracker) FilterDuplicates(config *Config, records []*FetchedRecord) []*FetchedRecord { + filtered := make([]*FetchedRecord, 0, len(records)) + batchKeys := make(map[DeduplicationKey]bool, len(records)) + duplicateCount := 0 + + for _, record := range records { + operation := MapOperation(config, record.Message.Op) + key := dt.MakeKey(record.Message, operation) + + if dt.IsDuplicate(key) || batchKeys[key] { + duplicateCount++ + continue + } + + batchKeys[key] = true + filtered = append(filtered, record) + } + + if duplicateCount > 0 { + LogInfo(config, fmt.Sprintf("Filtered %d duplicate messages", duplicateCount)) + } + + return filtered +} + +func (dt *DeduplicationTracker) MarkRecordsProcessed(config *Config, records []*FetchedRecord) { + for _, record := range records { + operation := MapOperation(config, record.Message.Op) + dt.MarkProcessed(dt.MakeKey(record.Message, operation)) + } +} diff --git a/processor/deduplication_test.go b/processor/deduplication_test.go new file mode 100644 index 0000000..84612c9 --- /dev/null +++ b/processor/deduplication_test.go @@ -0,0 +1,91 @@ +package main + +import "testing" + +func TestDeduplicationTrackerEvictsOldestKeys(t *testing.T) { + tracker := NewDeduplicationTracker(2) + first := DeduplicationKey{Position: 1, Database: "db", Schema: "public", Table: "users", Operation: "CREATE"} + second := DeduplicationKey{Position: 2, Database: "db", Schema: "public", Table: "users", Operation: "CREATE"} + third := DeduplicationKey{Position: 3, Database: "db", Schema: "public", Table: "users", Operation: "CREATE"} + + tracker.MarkProcessed(first) + tracker.MarkProcessed(second) + tracker.MarkProcessed(third) + + if tracker.IsDuplicate(first) { + t.Fatal("expected oldest key to be evicted") + } + if !tracker.IsDuplicate(second) || !tracker.IsDuplicate(third) { + t.Fatal("expected newest keys to remain tracked") + } +} + +func TestDeduplicationTrackerDoesNotReorderDuplicateMarks(t *testing.T) { + tracker := NewDeduplicationTracker(2) + first := DeduplicationKey{Position: 1, Database: "db", Schema: "public", Table: "users", Operation: "CREATE"} + second := DeduplicationKey{Position: 2, Database: "db", Schema: "public", Table: "users", Operation: "CREATE"} + third := DeduplicationKey{Position: 3, Database: "db", Schema: "public", Table: "users", Operation: "CREATE"} + + tracker.MarkProcessed(first) + tracker.MarkProcessed(second) + tracker.MarkProcessed(first) + tracker.MarkProcessed(third) + + if tracker.IsDuplicate(first) { + t.Fatal("expected duplicate mark not to refresh insertion order") + } + if !tracker.IsDuplicate(second) || !tracker.IsDuplicate(third) { + t.Fatal("expected second and third keys to remain tracked") + } +} + +func TestFilterDuplicatesDoesNotMarkRecordsProcessed(t *testing.T) { + config := quietTestConfig() + tracker := NewDeduplicationTracker(10) + record := fetchedRecordForDeduplicationTest(1) + + filtered := tracker.FilterDuplicates(config, []*FetchedRecord{record}) + if len(filtered) != 1 { + t.Fatalf("filtered records = %d, want 1", len(filtered)) + } + + key := tracker.MakeKey(record.Message, MapOperation(config, record.Message.Op)) + if tracker.IsDuplicate(key) { + t.Fatal("filtering must not mark a record before storage succeeds") + } + + tracker.MarkRecordsProcessed(config, filtered) + if !tracker.IsDuplicate(key) { + t.Fatal("expected successfully stored record to be marked") + } +} + +func TestFilterDuplicatesRemovesDuplicatesWithinBatch(t *testing.T) { + config := quietTestConfig() + tracker := NewDeduplicationTracker(10) + record := fetchedRecordForDeduplicationTest(1) + duplicate := fetchedRecordForDeduplicationTest(1) + + filtered := tracker.FilterDuplicates(config, []*FetchedRecord{record, duplicate}) + if len(filtered) != 1 { + t.Fatalf("filtered records = %d, want 1", len(filtered)) + } +} + +func quietTestConfig() *Config { + return &Config{LogLevel: LOG_LEVEL_ERROR} +} + +func fetchedRecordForDeduplicationTest(position uint64) *FetchedRecord { + return &FetchedRecord{ + Message: &ChangeMessage{ + Op: OPERATION_CREATE, + Source: SourceMetadata{ + Lsn: position, + Db: "db", + Schema: "public", + Table: "users", + }, + }, + } +} diff --git a/processor/duckdb.go b/processor/duckdb.go new file mode 100644 index 0000000..857e95e --- /dev/null +++ b/processor/duckdb.go @@ -0,0 +1,130 @@ +package main + +import ( + "context" + "database/sql" + "database/sql/driver" + "errors" + "fmt" + "strings" + + "github.com/duckdb/duckdb-go/v2" +) + +type DuckDBClient struct { + db *sql.DB + connector *duckdb.Connector + config *Config + bootQueries []string +} + +func NewDuckDBClient(config *Config) (*DuckDBClient, error) { + client := &DuckDBClient{ + config: config, + } + client.bootQueries = client.buildBootQueries() + + connector, err := duckdb.NewConnector("", func(execer driver.ExecerContext) error { + return client.executeBootQueries(context.Background(), execer) + }) + if err != nil { + return nil, fmt.Errorf("failed to create duckdb connector: %w", err) + } + + client.connector = connector + client.db = sql.OpenDB(connector) + client.db.SetMaxOpenConns(1) + + if err := client.db.PingContext(context.Background()); err != nil { + client.db.Close() + client.connector.Close() + return nil, fmt.Errorf("failed to ping duckdb: %w", err) + } + + return client, nil +} + +func (d *DuckDBClient) buildBootQueries() []string { + // Strip protocol from endpoint for DuckDB + endpoint := d.config.S3Endpoint + endpoint = strings.TrimPrefix(endpoint, "http://") + endpoint = strings.TrimPrefix(endpoint, "https://") + + queries := []string{ + "INSTALL httpfs", + "LOAD httpfs", + "SET timezone='UTC'", + fmt.Sprintf("SET memory_limit='%s'", d.config.DuckDBMemoryLimit), + "SET threads=1", + "SET preserve_insertion_order=false", + fmt.Sprintf("SET s3_endpoint='%s'", endpoint), + fmt.Sprintf("SET s3_access_key_id='%s'", d.config.S3AccessKey), + fmt.Sprintf("SET s3_secret_access_key='%s'", d.config.S3SecretKey), + fmt.Sprintf("SET s3_region='%s'", d.config.S3Region), + "SET s3_use_ssl=false", + "SET s3_url_style='path'", + } + if d.config.SearchTablesJSON != "" && d.config.SearchTablesJSON != "[]" { + lanceSecretOptions := []string{ + "TYPE LANCE", + "PROVIDER config", + fmt.Sprintf("SCOPE 's3://%s/'", escapeSQLString(d.config.S3Bucket)), + fmt.Sprintf("ACCESS_KEY_ID '%s'", escapeSQLString(d.config.S3AccessKey)), + fmt.Sprintf("SECRET_ACCESS_KEY '%s'", escapeSQLString(d.config.S3SecretKey)), + fmt.Sprintf("REGION '%s'", escapeSQLString(d.config.S3Region)), + } + if strings.HasPrefix(d.config.S3Endpoint, "http://") || strings.HasPrefix(d.config.S3Endpoint, "https://") { + lanceSecretOptions = append(lanceSecretOptions, + fmt.Sprintf("ENDPOINT '%s'", escapeSQLString(d.config.S3Endpoint)), + "VIRTUAL_HOSTED_STYLE_REQUEST false", + ) + if strings.HasPrefix(d.config.S3Endpoint, "http://") { + lanceSecretOptions = append(lanceSecretOptions, "ALLOW_HTTP true") + } + } + queries = append(queries, + "INSTALL lance", + "LOAD lance", + "CREATE OR REPLACE SECRET pgstack_lance ("+strings.Join(lanceSecretOptions, ", ")+")", + fmt.Sprintf("ATTACH 's3://%s/%s' AS search_store (TYPE LANCE, READ_WRITE)", escapeSQLString(d.config.S3Bucket), escapeSQLString(d.config.SearchBasePath)), + ) + } + return queries +} + +func escapeSQLString(value string) string { + return strings.ReplaceAll(value, "'", "''") +} + +func (d *DuckDBClient) executeBootQueries(ctx context.Context, execer driver.ExecerContext) error { + for _, query := range d.bootQueries { + if _, err := execer.ExecContext(ctx, query, nil); err != nil { + return fmt.Errorf("failed to execute %q: %w", query, err) + } + } + + return nil +} + +func (d *DuckDBClient) ExecContext(ctx context.Context, query string, args ...interface{}) (sql.Result, error) { + return d.db.ExecContext(ctx, query, args...) +} + +func (d *DuckDBClient) QueryContext(ctx context.Context, query string, args ...interface{}) (*sql.Rows, error) { + return d.db.QueryContext(ctx, query, args...) +} + +func (d *DuckDBClient) QueryRowContext(ctx context.Context, query string, args ...interface{}) *sql.Row { + return d.db.QueryRowContext(ctx, query, args...) +} + +func (d *DuckDBClient) Close() error { + dbErr := d.db.Close() + connectorErr := d.connector.Close() + return errors.Join(dbErr, connectorErr) +} + +func isDuckDBOutOfMemory(err error) bool { + var duckDBError *duckdb.Error + return errors.As(err, &duckDBError) && duckDBError.Type == duckdb.ErrorTypeOutOfMemory +} diff --git a/processor/duckdb_test.go b/processor/duckdb_test.go new file mode 100644 index 0000000..06ab897 --- /dev/null +++ b/processor/duckdb_test.go @@ -0,0 +1,46 @@ +package main + +import ( + "errors" + "fmt" + "slices" + "testing" + + "github.com/duckdb/duckdb-go/v2" +) + +func TestIsDuckDBOutOfMemory(t *testing.T) { + err := fmt.Errorf("failed to write parquet: %w", &duckdb.Error{ + Type: duckdb.ErrorTypeOutOfMemory, + Msg: "Out of Memory Error: failed to allocate data", + }) + + if !isDuckDBOutOfMemory(err) { + t.Fatal("expected wrapped DuckDB out-of-memory error to be detected") + } +} + +func TestIsDuckDBOutOfMemoryRejectsOtherErrors(t *testing.T) { + tests := []error{ + errors.New("Out of Memory Error: text alone should not match"), + &duckdb.Error{Type: duckdb.ErrorTypeIO, Msg: "IO Error"}, + } + + for _, err := range tests { + if isDuckDBOutOfMemory(err) { + t.Fatalf("did not expect %T to be detected as DuckDB out-of-memory", err) + } + } +} + +func TestDuckDBBootQueriesAttachSearchReadWrite(t *testing.T) { + client := &DuckDBClient{config: &Config{ + S3Bucket: "bucket", + SearchBasePath: "project/search", + SearchTablesJSON: `[{"name":"public.documents"}]`, + }} + query := "ATTACH 's3://bucket/project/search' AS search_store (TYPE LANCE, READ_WRITE)" + if !slices.Contains(client.buildBootQueries(), query) { + t.Fatalf("Search boot queries do not contain %q", query) + } +} diff --git a/processor/embedding_client.go b/processor/embedding_client.go new file mode 100644 index 0000000..f1d7b31 --- /dev/null +++ b/processor/embedding_client.go @@ -0,0 +1,148 @@ +package main + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "io" + "net/http" + "time" +) + +const ( + EMBEDDING_BATCH_SIZE = 256 + EMBEDDING_MAX_INPUT_BYTES = 3200 + EMBEDDING_BATCH_MAX_INPUT_BYTES = 250000 + OPENAI_EMBEDDING_MODEL = "text-embedding-3-small" + OPENAI_EMBEDDING_DIMENSIONS = 1536 +) + +type EmbeddingClient struct { + config *Config + apiKey string + model string + dimensions int + httpClient *http.Client +} + +type embeddingRequest struct { + Model string `json:"model"` + Input []string `json:"input"` + Dimensions int `json:"dimensions"` +} + +type embeddingResponse struct { + Data []struct { + Embedding []float32 `json:"embedding"` + Index int `json:"index"` + } `json:"data"` + Usage struct { + PromptTokens int `json:"prompt_tokens"` + } `json:"usage"` +} + +func NewEmbeddingClient(config *Config) (*EmbeddingClient, error) { + if config.OpenAIAPIKey == "" { + return nil, fmt.Errorf("OPENAI_API_KEY is required when Search is enabled") + } + return &EmbeddingClient{ + config: config, + apiKey: config.OpenAIAPIKey, + model: OPENAI_EMBEDDING_MODEL, + dimensions: OPENAI_EMBEDDING_DIMENSIONS, + httpClient: &http.Client{Timeout: 2 * time.Minute}, + }, nil +} + +func (client *EmbeddingClient) Embed(ctx context.Context, inputs []string) ([][]float32, error) { + result := make([][]float32, 0, len(inputs)) + for start := 0; start < len(inputs); { + end, err := embeddingBatchEnd(inputs, start) + if err != nil { + return nil, err + } + batch, err := client.embedBatch(ctx, inputs[start:end]) + if err != nil { + return nil, err + } + result = append(result, batch...) + start = end + } + return result, nil +} + +func embeddingBatchEnd(inputs []string, start int) (int, error) { + bytes := 0 + end := start + for end < len(inputs) && end-start < EMBEDDING_BATCH_SIZE { + inputBytes := len(inputs[end]) + if inputBytes == 0 { + return 0, fmt.Errorf("embedding input cannot be empty") + } + if inputBytes > EMBEDDING_MAX_INPUT_BYTES { + return 0, fmt.Errorf("embedding input exceeds %d-byte safety limit", EMBEDDING_MAX_INPUT_BYTES) + } + if end > start && bytes+inputBytes > EMBEDDING_BATCH_MAX_INPUT_BYTES { + break + } + bytes += inputBytes + end++ + } + return end, nil +} + +func (client *EmbeddingClient) embedBatch(ctx context.Context, inputs []string) ([][]float32, error) { + body, err := json.Marshal(embeddingRequest{Model: client.model, Input: inputs, Dimensions: client.dimensions}) + if err != nil { + return nil, err + } + req, err := http.NewRequestWithContext(ctx, http.MethodPost, "https://api.openai.com/v1/embeddings", bytes.NewReader(body)) + if err != nil { + return nil, err + } + req.Header.Set("Authorization", "Bearer "+client.apiKey) + req.Header.Set("Content-Type", "application/json") + + var response *http.Response + for attempt := 0; attempt < 4; attempt++ { + response, err = client.httpClient.Do(req) + if err == nil && response.StatusCode != http.StatusTooManyRequests && response.StatusCode < 500 { + break + } + if response != nil { + response.Body.Close() + } + select { + case <-ctx.Done(): + return nil, ctx.Err() + case <-time.After(time.Duration(1<= 300 { + message, _ := io.ReadAll(io.LimitReader(response.Body, 4096)) + return nil, fmt.Errorf("embedding request returned %s: %s", response.Status, string(message)) + } + + var payload embeddingResponse + if err := json.NewDecoder(response.Body).Decode(&payload); err != nil { + return nil, err + } + if len(payload.Data) != len(inputs) { + return nil, fmt.Errorf("embedding response returned %d vectors for %d inputs", len(payload.Data), len(inputs)) + } + vectors := make([][]float32, len(inputs)) + for _, item := range payload.Data { + if item.Index < 0 || item.Index >= len(vectors) || len(item.Embedding) != client.dimensions { + return nil, fmt.Errorf("invalid embedding response item") + } + vectors[item.Index] = item.Embedding + } + LogInfo(client.config, fmt.Sprintf("Built embeddings via OpenAI | Input tokens: %d", payload.Usage.PromptTokens)) + return vectors, nil +} diff --git a/processor/embedding_client_test.go b/processor/embedding_client_test.go new file mode 100644 index 0000000..b251210 --- /dev/null +++ b/processor/embedding_client_test.go @@ -0,0 +1,50 @@ +package main + +import ( + "bytes" + "context" + "io" + "log" + "net/http" + "strings" + "testing" +) + +type embeddingRoundTripperFunc func(*http.Request) (*http.Response, error) + +func (fn embeddingRoundTripperFunc) RoundTrip(request *http.Request) (*http.Response, error) { + return fn(request) +} + +func TestEmbeddingClientLogsOpenAIUsage(t *testing.T) { + var logs bytes.Buffer + previousOutput := log.Writer() + log.SetOutput(&logs) + t.Cleanup(func() { log.SetOutput(previousOutput) }) + + client := &EmbeddingClient{ + config: &Config{LogLevel: LOG_LEVEL_INFO}, + apiKey: "test-key", + model: "text-embedding-3-small", + dimensions: 2, + httpClient: &http.Client{Transport: embeddingRoundTripperFunc(func(*http.Request) (*http.Response, error) { + return &http.Response{ + StatusCode: http.StatusOK, + Body: io.NopCloser(strings.NewReader(`{ + "data":[{"embedding":[0.1,0.2],"index":0}], + "usage":{"prompt_tokens":7,"total_tokens":7} + }`)), + }, nil + })}, + } + + if _, err := client.Embed(context.Background(), []string{"hello"}); err != nil { + t.Fatal(err) + } + if expected := "Built embeddings via OpenAI | Input tokens: 7"; !strings.Contains(logs.String(), expected) { + t.Fatalf("expected log to contain %q, got %q", expected, logs.String()) + } + if strings.Contains(logs.String(), client.model) { + t.Fatalf("expected log to omit model, got %q", logs.String()) + } +} diff --git a/processor/go.mod b/processor/go.mod new file mode 100644 index 0000000..1ae58fc --- /dev/null +++ b/processor/go.mod @@ -0,0 +1,45 @@ +module github.com/pgstack-io/pgstack/processor + +go 1.25.0 + +require ( + github.com/aws/aws-sdk-go v1.55.5 + github.com/duckdb/duckdb-go/v2 v2.10505.0 + github.com/google/uuid v1.6.0 + github.com/linkedin/goavro v2.1.0+incompatible + github.com/nats-io/nats.go v1.52.0 + github.com/xitongsys/parquet-go v1.6.2 + github.com/xitongsys/parquet-go-source v0.0.0-20211228015320-b4f792c43cd0 +) + +require ( + github.com/apache/arrow-go/v18 v18.5.1 // indirect + github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 // indirect + github.com/apache/thrift v0.24.0 // indirect + github.com/duckdb/duckdb-go-bindings v0.10505.0 // indirect + github.com/duckdb/duckdb-go-bindings/lib/darwin-amd64 v0.10505.0 // indirect + github.com/duckdb/duckdb-go-bindings/lib/darwin-arm64 v0.10505.0 // indirect + github.com/duckdb/duckdb-go-bindings/lib/linux-amd64 v0.10505.0 // indirect + github.com/duckdb/duckdb-go-bindings/lib/linux-arm64 v0.10505.0 // indirect + github.com/duckdb/duckdb-go-bindings/lib/windows-amd64 v0.10505.0 // indirect + github.com/go-viper/mapstructure/v2 v2.5.0 // indirect + github.com/goccy/go-json v0.10.5 // indirect + github.com/golang/snappy v1.0.0 // indirect + github.com/google/flatbuffers v25.12.19+incompatible // indirect + github.com/jmespath/go-jmespath v0.4.0 // indirect + github.com/klauspost/compress v1.18.5 // indirect + github.com/klauspost/cpuid/v2 v2.3.0 // indirect + github.com/nats-io/nkeys v0.4.15 // indirect + github.com/nats-io/nuid v1.0.1 // indirect + github.com/pierrec/lz4/v4 v4.1.25 // indirect + github.com/zeebo/xxh3 v1.1.0 // indirect + golang.org/x/crypto v0.52.0 // indirect + golang.org/x/exp v0.0.0-20260112195511-716be5621a96 // indirect + golang.org/x/mod v0.33.0 // indirect + golang.org/x/sync v0.20.0 // indirect + golang.org/x/sys v0.45.0 // indirect + golang.org/x/telemetry v0.0.0-20260209163413-e7419c687ee4 // indirect + golang.org/x/tools v0.42.0 // indirect + golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect + gopkg.in/linkedin/goavro.v1 v1.0.5 // indirect +) diff --git a/processor/go.sum b/processor/go.sum new file mode 100644 index 0000000..6a7f247 --- /dev/null +++ b/processor/go.sum @@ -0,0 +1,414 @@ +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.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/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/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/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= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k= +github.com/Azure/azure-storage-blob-go v0.14.0/go.mod h1:SMqIBi+SuiQH32bvyjngEewEeXoPfKMgWlBDaYf6fck= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= +github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= +github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= +github.com/apache/arrow-go/v18 v18.5.1 h1:yaQ6zxMGgf9YCYw4/oaeOU3AULySDlAYDOcnr4LdHdI= +github.com/apache/arrow-go/v18 v18.5.1/go.mod h1:OCCJsmdq8AsRm8FkBSSmYTwL/s4zHW9CqxeBxEytkNE= +github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 h1:byKBBF2CKWBjjA4J1ZL2JXttJULvWSl50LegTyRZ728= +github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516/go.mod h1:QNYViu/X0HXDHw7m3KXzWSVXIbfUvJqBFe6Gj8/pYA0= +github.com/apache/thrift v0.0.0-20181112125854-24918abba929/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.14.2/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.24.0 h1:zy31L1a49QTNB2bG1BBfMXol3yJrTH975G3pPubQVLQ= +github.com/apache/thrift v0.24.0/go.mod h1:zPt6WxgvTOM6hF92y8C+MkEM5LMxZuk4JcQOiU4Esvs= +github.com/aws/aws-sdk-go v1.30.19/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= +github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU= +github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= +github.com/aws/aws-sdk-go-v2 v1.7.1/go.mod h1:L5LuPC1ZgDr2xQS7AmIec/Jlc7O/Y1u2KxJyNVab250= +github.com/aws/aws-sdk-go-v2/config v1.5.0/go.mod h1:RWlPOAW3E3tbtNAqTwvSW54Of/yP3oiZXMI0xfUdjyA= +github.com/aws/aws-sdk-go-v2/credentials v1.3.1/go.mod h1:r0n73xwsIVagq8RsxmZbGSRQFj9As3je72C2WzUIToc= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.3.0/go.mod h1:2LAuqPx1I6jNfaGDucWfA2zqQCYCOMCDHiCOciALyNw= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.3.2/go.mod h1:qaqQiHSrOUVOfKe6fhgQ6UzhxjwqVW8aHNegd6Ws4w4= +github.com/aws/aws-sdk-go-v2/internal/ini v1.1.1/go.mod h1:Zy8smImhTdOETZqfyn01iNOe0CNggVbPjCajyaz6Gvg= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.2.1/go.mod h1:v33JQ57i2nekYTA70Mb+O18KeH4KqhdqxTJZNK1zdRE= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.2.1/go.mod h1:zceowr5Z1Nh2WVP8bf/3ikB41IZW59E4yIYbg+pC6mw= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.5.1/go.mod h1:6EQZIwNNvHpq/2/QSJnp4+ECvqIy55w95Ofs0ze+nGQ= +github.com/aws/aws-sdk-go-v2/service/s3 v1.11.1/go.mod h1:XLAGFrEjbvMCLvAtWLLP32yTv8GpBquCApZEycDLunI= +github.com/aws/aws-sdk-go-v2/service/sso v1.3.1/go.mod h1:J3A3RGUvuCZjvSuZEcOpHDnzZP/sKbhDWV2T1EOzFIM= +github.com/aws/aws-sdk-go-v2/service/sts v1.6.0/go.mod h1:q7o0j7d7HrJk/vr9uUt3BVRASvcU7gYZB9PUgPiByXg= +github.com/aws/smithy-go v1.6.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= +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/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/colinmarc/hdfs/v2 v2.1.1/go.mod h1:M3x+k8UKKmxtFu++uAZ0OtDU8jR3jnaZIAc6yK4Ue0c= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/duckdb/duckdb-go-bindings v0.10505.0 h1:/0pPsTLrcCsTGxT0VrHgJWnOcPe1tQL1vrki1v3jbAI= +github.com/duckdb/duckdb-go-bindings v0.10505.0/go.mod h1:HoD5xePkDj3VZbBnVVfxVVYIljZ9khCprWA7FgwIiC4= +github.com/duckdb/duckdb-go-bindings/lib/darwin-amd64 v0.10505.0 h1:FrMqquFBQlMsi34h2KZgCku54rqA8xEbXZ0NLVDKwYs= +github.com/duckdb/duckdb-go-bindings/lib/darwin-amd64 v0.10505.0/go.mod h1:EnAvZh1kNJHp5yF+M1ZHNEvapnmt6anq1xXHVrAGqMo= +github.com/duckdb/duckdb-go-bindings/lib/darwin-arm64 v0.10505.0 h1:lbRbpQwT1MmUhh/VTwukV9K8bxKByV3UghAP3MvsbBo= +github.com/duckdb/duckdb-go-bindings/lib/darwin-arm64 v0.10505.0/go.mod h1:IGLSeEcFhNeZF16aVjQCULD7TsFZKG5G7SyKJAXKp5c= +github.com/duckdb/duckdb-go-bindings/lib/linux-amd64 v0.10505.0 h1:nrsaVYj3XYCRbS2FpdOMD/KHE7egRMr+/NR1IHmjT84= +github.com/duckdb/duckdb-go-bindings/lib/linux-amd64 v0.10505.0/go.mod h1:KAIynZ0GHCS7X5fRyuFnQMg/SZBPK/bS9OCOVojClxw= +github.com/duckdb/duckdb-go-bindings/lib/linux-arm64 v0.10505.0 h1:qM6oGDgwXBILJGbTY4fCy6QOczLpucUA6yn6g3ORjh4= +github.com/duckdb/duckdb-go-bindings/lib/linux-arm64 v0.10505.0/go.mod h1:81SGOYoEUs8qaAfSk1wRfM5oobrIJ5KI7AzYhK6/bvQ= +github.com/duckdb/duckdb-go-bindings/lib/windows-amd64 v0.10505.0 h1:DjqZl9rYreHkSOqnqLmkrqH5T8UdQNcxZLJVZzGmXXA= +github.com/duckdb/duckdb-go-bindings/lib/windows-amd64 v0.10505.0/go.mod h1:K25pJL26ARblGDeuAkrdblFvUen92+CwksLtPEHRqqQ= +github.com/duckdb/duckdb-go/v2 v2.10505.0 h1:SWwvLn2Qx/RQSnQNupwgIF8VbnJ5A6OQU9lYb/mDETI= +github.com/duckdb/duckdb-go/v2 v2.10505.0/go.mod h1:m0PW4J4FG9hlFlVdXi6Ds9owpyIDaBdE2jyce00fGcE= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +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-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-viper/mapstructure/v2 v2.5.0 h1:vM5IJoUAy3d7zRSVtIwQgBj7BiWtMPfmPEgAXnvj1Ro= +github.com/go-viper/mapstructure/v2 v2.5.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= +github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +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/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.3 h1:GV+pQPG/EUUbkh47niozDcADz6go/dUwhVzdUQHIVRw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +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/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= +github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +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/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/flatbuffers v25.12.19+incompatible h1:haMV2JRRJCe1998HeW/p0X9UaMTK6SDo0ffLn2+DbLs= +github.com/google/flatbuffers v25.12.19+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +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.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +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/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/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.2.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/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/hashicorp/go-uuid v0.0.0-20180228145832-27454136f036/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +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/jcmturner/gofork v0.0.0-20180107083740-2aebee971930/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= +github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +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/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= +github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= +github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.13.1/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.18.5 h1:/h1gH5Ce+VWNLSWqPzOVn6XBO+vJbCNGvjoaGBFW2IE= +github.com/klauspost/compress v1.18.5/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= +github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y= +github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/linkedin/goavro v2.1.0+incompatible h1:DV2aUlj2xZiuxQyvag8Dy7zjY69ENjS66bWkSfdpddY= +github.com/linkedin/goavro v2.1.0+incompatible/go.mod h1:bBCwI2eGYpUI/4820s67MElg9tdeLbINjLjiM2xZFYM= +github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= +github.com/nats-io/nats.go v1.52.0 h1:n3avV4VBsCgsdwh71TppsTwtv+QdPs7ntSKM8qJLGsc= +github.com/nats-io/nats.go v1.52.0/go.mod h1:26HypzazeOkyO3/mqd1zZd53STJN0EjCYF9Uy2ZOBno= +github.com/nats-io/nkeys v0.4.15 h1:JACV5jRVO9V856KOapQ7x+EY8Jo3qw1vJt/9Jpwzkk4= +github.com/nats-io/nkeys v0.4.15/go.mod h1:CpMchTXC9fxA5zrMo4KpySxNjiDVvr8ANOSZdiNfUrs= +github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/ncw/swift v1.0.52/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= +github.com/pborman/getopt v0.0.0-20180729010549-6fdd0a2c7117/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= +github.com/pierrec/lz4/v4 v4.1.8/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pierrec/lz4/v4 v4.1.25 h1:kocOqRffaIbU5djlIBr7Wh+cx82C0vtFb0fOurZHqD0= +github.com/pierrec/lz4/v4 v4.1.25/go.mod h1:EoQMVJgeeEOMsCqCzqFm2O0cJvljX2nGZjcRIPL34O4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +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.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/xitongsys/parquet-go v1.5.1/go.mod h1:xUxwM8ELydxh4edHGegYq1pA8NnMKDx0K/GyB0o2bww= +github.com/xitongsys/parquet-go v1.6.2 h1:MhCaXii4eqceKPu9BwrjLqyK10oX9WF+xGhwvwbw7xM= +github.com/xitongsys/parquet-go v1.6.2/go.mod h1:IulAQyalCm0rPiZVNnCgm/PCL64X2tdSVGMQ/UeKqWA= +github.com/xitongsys/parquet-go-source v0.0.0-20190524061010-2b72cbee77d5/go.mod h1:xxCx7Wpym/3QCo6JhujJX51dzSXrwmb0oH6FQb39SEA= +github.com/xitongsys/parquet-go-source v0.0.0-20200817004010-026bad9b25d0/go.mod h1:HYhIKsdns7xz80OgkbgJYrtQY7FjHWHKH6cvN7+czGE= +github.com/xitongsys/parquet-go-source v0.0.0-20211228015320-b4f792c43cd0 h1:ti/bIIF7mKX56sp90ByfAsJRkkmEkY71PWavIG+BGL4= +github.com/xitongsys/parquet-go-source v0.0.0-20211228015320-b4f792c43cd0/go.mod h1:qLb2Itmdcp7KPa5KZKvhE9U1q5bYSOmgeOckF/H2rQA= +github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= +github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/xxh3 v1.1.0 h1:s7DLGDK45Dyfg7++yxI0khrfwq9661w9EN78eP/UZVs= +github.com/zeebo/xxh3 v1.1.0/go.mod h1:IisAie1LELR4xhVinxWS5+zf1lA4p0MW4T+w+W07F5s= +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= +golang.org/x/crypto v0.0.0-20180723164146-c126467f60eb/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +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-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= +golang.org/x/crypto v0.52.0 h1:RMs7fP2rXdep0CftQlK8Uf+kibLm7qkCcradZWYz988= +golang.org/x/crypto v0.52.0/go.mod h1:1QgfPxDqh0T2M/elOJtp9RvuR95kVjir0e6/BvEmGbc= +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-20260112195511-716be5621a96 h1:Z/6YuSHTLOHfNFdb8zVZomZr7cqNgTJvA8+Qz75D8gU= +golang.org/x/exp v0.0.0-20260112195511-716be5621a96/go.mod h1:nzimsREAkjBCIEFtHiYkrJyT+2uy9YZJB7H1k68CXZU= +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/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.33.0 h1:tHFzIWbBifEmbwtGz65eaWyGiGZatSrT9prnU8DbVL8= +golang.org/x/mod v0.33.0/go.mod h1:swjeQEj+6r7fODbD2cqrnje9PnziFuw4bmLbBZFrQ5w= +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-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191112182307-2180aed22343/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-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +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/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.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= +golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/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-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/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-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191112214154-59a1497f0cea/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-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-20200828194041-157a740278f4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.45.0 h1:dO4czNzziLiiXplLQgBCEpCvXQ3dnkn0SdaZSYdQ+FY= +golang.org/x/sys v0.45.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/telemetry v0.0.0-20260209163413-e7419c687ee4 h1:bTLqdHv7xrGlFbvf5/TXNxy/iUwwdkjhqQTJDjW7aj0= +golang.org/x/telemetry v0.0.0-20260209163413-e7419c687ee4/go.mod h1:g5NllXBEermZrmR51cJDQxmJUHUOfRAaNyWBM+R+548= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +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/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-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-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-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-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.42.0 h1:uNgphsn75Tdz5Ji2q36v/nsFSfR/9BRFvqhGBaJGd5k= +golang.org/x/tools v0.42.0/go.mod h1:Ma6lCIwGZvHK6XtgbswSoWroEkhugApmsXyrUmBhfr0= +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-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +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/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/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/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.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= +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-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= +gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q= +gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mNfM5bm88whjWx4= +gopkg.in/jcmturner/gokrb5.v7 v7.3.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= +gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8= +gopkg.in/linkedin/goavro.v1 v1.0.5 h1:BJa69CDh0awSsLUmZ9+BowBdokpduDZSM9Zk8oKHfN4= +gopkg.in/linkedin/goavro.v1 v1.0.5/go.mod h1:Aw5GdAbizjOEl0kAMHV9iHmA8reZzW/OKuJAl4Hb9F0= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/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= +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= +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/processor/hot_parquet_compactor.go b/processor/hot_parquet_compactor.go new file mode 100644 index 0000000..63b9ed2 --- /dev/null +++ b/processor/hot_parquet_compactor.go @@ -0,0 +1,87 @@ +package main + +import ( + "context" + "fmt" + "path" + "strings" +) + +const ( + HOT_PARQUET_COMPACTION_MIN_PERCENT = 80 + HOT_PARQUET_COMPACTION_MAX_PERCENT = 120 +) + +func (w *IcebergWriter) compactHotParquetFiles(ctx context.Context, parquetFiles []ParquetFileInfo) ([]ParquetFileInfo, []string, error) { + if len(parquetFiles) < 3 { + return parquetFiles, nil, nil + } + + maxHotSize := w.config.MaxHotParquetFileSizeBytes() + if maxHotSize <= 0 { + return parquetFiles, nil, nil + } + + pairIndex := hotParquetPairIndex(parquetFiles, maxHotSize) + if pairIndex < 0 { + return parquetFiles, nil, nil + } + + newFile, err := w.mergeParquetFiles(ctx, parquetFiles[pairIndex:pairIndex+2], parquetFilenamePrefix(parquetFiles[pairIndex].Path)) + if err != nil { + return nil, nil, err + } + + filesToDelete := []string{ + w.s3PathToKey(parquetFiles[pairIndex].Path), + w.s3PathToKey(parquetFiles[pairIndex+1].Path), + } + + compactedFiles := make([]ParquetFileInfo, 0, len(parquetFiles)-1) + compactedFiles = append(compactedFiles, parquetFiles[:pairIndex]...) + compactedFiles = append(compactedFiles, newFile) + compactedFiles = append(compactedFiles, parquetFiles[pairIndex+2:]...) + + LogInfo(w.config, fmt.Sprintf( + "Compacted hot parquet pair: %s + %s -> %s", + parquetFilename(parquetFiles[pairIndex].Path), + parquetFilename(parquetFiles[pairIndex+1].Path), + parquetFilename(newFile.Path), + )) + + return compactedFiles, filesToDelete, nil +} + +func hotParquetPairIndex(parquetFiles []ParquetFileInfo, maxHotSize int64) int { + latestFileIndex := len(parquetFiles) - 1 + for i := 0; i+1 < latestFileIndex; i++ { + if shouldCompactHotParquetPair(parquetFiles[i], parquetFiles[i+1], maxHotSize) { + return i + } + } + + return -1 +} + +func shouldCompactHotParquetPair(first, second ParquetFileInfo, maxHotSize int64) bool { + return isAroundHotParquetSize(first.Size, maxHotSize) && + isAroundHotParquetSize(second.Size, maxHotSize) +} + +func isAroundHotParquetSize(size, maxHotSize int64) bool { + return size >= maxHotSize*HOT_PARQUET_COMPACTION_MIN_PERCENT/100 && + size <= maxHotSize*HOT_PARQUET_COMPACTION_MAX_PERCENT/100 +} + +func parquetFilename(parquetPath string) string { + return path.Base(parquetPath) +} + +func parquetFilenamePrefix(parquetPath string) string { + filename := parquetFilename(parquetPath) + prefix, _, found := strings.Cut(filename, "_") + if !found { + return strings.TrimSuffix(filename, ".parquet") + } + return prefix +} diff --git a/processor/hot_parquet_compactor_test.go b/processor/hot_parquet_compactor_test.go new file mode 100644 index 0000000..73e1c1a --- /dev/null +++ b/processor/hot_parquet_compactor_test.go @@ -0,0 +1,64 @@ +package main + +import "testing" + +func TestHotParquetPairIndexReturnsFirstEligiblePair(t *testing.T) { + maxHotSize := int64(100) + parquetFiles := []ParquetFileInfo{ + {Size: 200}, + {Size: 100}, + {Size: 110}, + {Size: 105}, + {Size: 100}, + } + + if got := hotParquetPairIndex(parquetFiles, maxHotSize); got != 1 { + t.Fatalf("hotParquetPairIndex = %d, want 1", got) + } +} + +func TestHotParquetPairIndexSkipsLatestFile(t *testing.T) { + maxHotSize := int64(100) + parquetFiles := []ParquetFileInfo{ + {Size: 200}, + {Size: 200}, + {Size: 100}, + {Size: 100}, + } + + if got := hotParquetPairIndex(parquetFiles, maxHotSize); got != -1 { + t.Fatalf("hotParquetPairIndex = %d, want -1", got) + } +} + +func TestShouldCompactHotParquetPairAllowsBothFilesAtMaxPercent(t *testing.T) { + maxHotSize := int64(100) + + if !shouldCompactHotParquetPair( + ParquetFileInfo{Size: 120}, + ParquetFileInfo{Size: 120}, + maxHotSize, + ) { + t.Fatal("expected files at max hot percent to compact") + } +} + +func TestShouldCompactHotParquetPairRequiresEachFileAroundHotSize(t *testing.T) { + maxHotSize := int64(100) + + if shouldCompactHotParquetPair( + ParquetFileInfo{Size: 79}, + ParquetFileInfo{Size: 100}, + maxHotSize, + ) { + t.Fatal("expected file below min hot percent to skip compaction") + } + + if shouldCompactHotParquetPair( + ParquetFileInfo{Size: 100}, + ParquetFileInfo{Size: 121}, + maxHotSize, + ) { + t.Fatal("expected file above max hot percent to skip compaction") + } +} diff --git a/processor/iceberg_metadata.go b/processor/iceberg_metadata.go new file mode 100644 index 0000000..c2aff9c --- /dev/null +++ b/processor/iceberg_metadata.go @@ -0,0 +1,417 @@ +package main + +import ( + "context" + "encoding/json" + "fmt" + "os" + "path" + "time" + + "github.com/google/uuid" + "github.com/linkedin/goavro" +) + +const ( + ICEBERG_METADATA_FILE_NAME = "v1.metadata.json" +) + +const MANIFEST_SCHEMA = `{ + "type": "record", + "name": "manifest_entry", + "fields": [ + {"name": "status", "type": "int", "field-id": 0}, + {"name": "snapshot_id", "type": ["null", "long"], "default": null, "field-id": 1}, + {"name": "sequence_number", "type": ["null", "long"], "default": null, "field-id": 3}, + {"name": "file_sequence_number", "type": ["null", "long"], "default": null, "field-id": 4}, + { + "name": "data_file", + "type": { + "type": "record", + "name": "data_file", + "fields": [ + {"name": "content", "type": "int", "default": 0, "field-id": 134}, + {"name": "file_path", "type": "string", "field-id": 100}, + {"name": "file_format", "type": "string", "field-id": 101}, + {"name": "partition", "type": "null", "default": null, "field-id": 102}, + {"name": "record_count", "type": "long", "field-id": 103}, + {"name": "file_size_in_bytes", "type": "long", "field-id": 104}, + {"name": "column_sizes", "type": ["null", {"type": "array", "logicalType": "map", "items": {"type": "record", "name": "k117_v118", "fields": [{"name": "key", "type": "int", "field-id": 117}, {"name": "value", "type": "long", "field-id": 118}]}}], "default": null, "field-id": 108}, + {"name": "value_counts", "type": ["null", {"type": "array", "logicalType": "map", "items": {"type": "record", "name": "k119_v120", "fields": [{"name": "key", "type": "int", "field-id": 119}, {"name": "value", "type": "long", "field-id": 120}]}}], "default": null, "field-id": 109}, + {"name": "null_value_counts", "type": ["null", {"type": "array", "logicalType": "map", "items": {"type": "record", "name": "k121_v122", "fields": [{"name": "key", "type": "int", "field-id": 121}, {"name": "value", "type": "long", "field-id": 122}]}}], "default": null, "field-id": 110}, + {"name": "nan_value_counts", "type": ["null", {"type": "array", "logicalType": "map", "items": {"type": "record", "name": "k138_v139", "fields": [{"name": "key", "type": "int", "field-id": 138}, {"name": "value", "type": "long", "field-id": 139}]}}], "default": null, "field-id": 137}, + {"name": "lower_bounds", "type": ["null", {"type": "array", "logicalType": "map", "items": {"type": "record", "name": "k126_v127", "fields": [{"name": "key", "type": "int", "field-id": 126}, {"name": "value", "type": "bytes", "field-id": 127}]}}], "default": null, "field-id": 125}, + {"name": "upper_bounds", "type": ["null", {"type": "array", "logicalType": "map", "items": {"type": "record", "name": "k129_v130", "fields": [{"name": "key", "type": "int", "field-id": 129}, {"name": "value", "type": "bytes", "field-id": 130}]}}], "default": null, "field-id": 128}, + {"name": "key_metadata", "type": ["null", "bytes"], "default": null, "field-id": 131}, + {"name": "split_offsets", "type": ["null", {"type": "array", "items": "long", "element-id": 133}], "default": null, "field-id": 132}, + {"name": "equality_ids", "type": ["null", {"type": "array", "items": "int", "element-id": 136}], "default": null, "field-id": 135}, + {"name": "sort_order_id", "type": ["null", "int"], "default": null, "field-id": 140} + ] + }, + "field-id": 2 + } + ] +}` + +const MANIFEST_LIST_SCHEMA = `{ + "type": "record", + "name": "manifest_file", + "fields": [ + {"name": "manifest_path", "type": "string", "field-id": 500}, + {"name": "manifest_length", "type": "long", "field-id": 501}, + {"name": "partition_spec_id", "type": "int", "field-id": 502}, + {"name": "content", "type": "int", "default": 0, "field-id": 517}, + {"name": "sequence_number", "type": "long", "field-id": 515}, + {"name": "min_sequence_number", "type": "long", "field-id": 516}, + {"name": "added_snapshot_id", "type": "long", "field-id": 503}, + {"name": "added_files_count", "type": "int", "field-id": 504}, + {"name": "existing_files_count", "type": "int", "field-id": 505}, + {"name": "deleted_files_count", "type": "int", "field-id": 506}, + {"name": "added_rows_count", "type": "long", "field-id": 512}, + {"name": "existing_rows_count", "type": "long", "field-id": 513}, + {"name": "deleted_rows_count", "type": "long", "field-id": 514}, + {"name": "partitions", "type": ["null", {"type": "array", "element-id": 508, "items": {"type": "record", "name": "r508", "fields": [{"name": "contains_null", "type": "boolean", "field-id": 509}, {"name": "contains_nan", "type": ["null", "boolean"], "default": null, "field-id": 518}, {"name": "lower_bound", "type": ["null", "bytes"], "default": null, "field-id": 510}, {"name": "upper_bound", "type": ["null", "bytes"], "default": null, "field-id": 511}]}}], "default": null, "field-id": 507}, + {"name": "key_metadata", "type": ["null", "bytes"], "default": null, "field-id": 519} + ] +}` + +type ManifestFile struct { + Path string + Size int64 + TotalRecordCount int64 + TotalDataFiles int32 +} + +type ManifestListFile struct { + Path string + SnapshotId int64 + SequenceNumber int + TimestampMs int64 + TotalFilesSize int64 + TotalDataFiles int64 + TotalRecords int64 +} + +type IcebergMetadataWriter struct { + config *Config + s3Client *S3Client + tableS3Path string + metadataPath string +} + +func NewIcebergMetadataWriter(config *Config, s3Client *S3Client, tableS3Path, metadataPath string) *IcebergMetadataWriter { + return &IcebergMetadataWriter{ + config: config, + s3Client: s3Client, + tableS3Path: tableS3Path, + metadataPath: metadataPath, + } +} + +func (w *IcebergMetadataWriter) WriteManifest(parquetFiles []ParquetFileInfo) (ManifestFile, error) { + timestamp := time.Now().Format("20060102-150405") + filename := fmt.Sprintf("%s_%s-m0.avro", timestamp, uuid.New().String()[:8]) + tempFile, err := os.CreateTemp("", "manifest-*.avro") + if err != nil { + return ManifestFile{}, fmt.Errorf("failed to create temp file: %w", err) + } + defer os.Remove(tempFile.Name()) + defer tempFile.Close() + + manifestEntries := make([]map[string]interface{}, len(parquetFiles)) + + for i, pf := range parquetFiles { + columnSizesArr := []interface{}{} + for fieldId, size := range pf.Stats.ColumnSizes { + columnSizesArr = append(columnSizesArr, map[string]interface{}{ + "key": fieldId, + "value": size, + }) + } + + valueCountsArr := []interface{}{} + for fieldId, count := range pf.Stats.ValueCounts { + valueCountsArr = append(valueCountsArr, map[string]interface{}{ + "key": fieldId, + "value": count, + }) + } + + nullValueCountsArr := []interface{}{} + for fieldId, count := range pf.Stats.NullValueCounts { + nullValueCountsArr = append(nullValueCountsArr, map[string]interface{}{ + "key": fieldId, + "value": count, + }) + } + + lowerBoundsArr := []interface{}{} + for fieldId, val := range pf.Stats.LowerBounds { + lowerBoundsArr = append(lowerBoundsArr, map[string]interface{}{ + "key": fieldId, + "value": val, + }) + } + + upperBoundsArr := []interface{}{} + for fieldId, val := range pf.Stats.UpperBounds { + upperBoundsArr = append(upperBoundsArr, map[string]interface{}{ + "key": fieldId, + "value": val, + }) + } + + nanValueCountsArr := []interface{}{} + + dataFile := map[string]interface{}{ + "content": 0, + "file_path": pf.Path, + "file_format": "PARQUET", + "partition": nil, + "record_count": pf.RecordCount, + "file_size_in_bytes": pf.Size, + "column_sizes": map[string]interface{}{ + "array": columnSizesArr, + }, + "value_counts": map[string]interface{}{ + "array": valueCountsArr, + }, + "null_value_counts": map[string]interface{}{ + "array": nullValueCountsArr, + }, + "nan_value_counts": map[string]interface{}{ + "array": nanValueCountsArr, + }, + "lower_bounds": map[string]interface{}{ + "array": lowerBoundsArr, + }, + "upper_bounds": map[string]interface{}{ + "array": upperBoundsArr, + }, + "key_metadata": nil, + "split_offsets": map[string]interface{}{ + "array": pf.Stats.SplitOffsets, + }, + "equality_ids": nil, + "sort_order_id": map[string]interface{}{ + "int": 0, + }, + } + + snapshotId := time.Now().UnixNano() + manifestEntries[i] = map[string]interface{}{ + "status": 1, // ADDED + "snapshot_id": map[string]interface{}{"long": snapshotId}, + "sequence_number": map[string]interface{}{"long": int64(i + 1)}, + "file_sequence_number": map[string]interface{}{"long": int64(i + 1)}, + "data_file": dataFile, + } + } + + codec, err := goavro.NewCodec(MANIFEST_SCHEMA) + if err != nil { + return ManifestFile{}, fmt.Errorf("failed to create avro codec: %w", err) + } + + ocfWriter, err := goavro.NewOCFWriter(goavro.OCFConfig{ + W: tempFile, + Codec: codec, + Schema: MANIFEST_SCHEMA, + }) + if err != nil { + return ManifestFile{}, fmt.Errorf("failed to create OCF writer: %w", err) + } + + if err := ocfWriter.Append(manifestEntries); err != nil { + return ManifestFile{}, fmt.Errorf("failed to write manifest entries: %w", err) + } + + tempFile.Close() + + // Read file and upload to S3 + data, err := os.ReadFile(tempFile.Name()) + if err != nil { + return ManifestFile{}, fmt.Errorf("failed to read temp file: %w", err) + } + + s3Key := path.Join(w.metadataPath, filename) + if err := w.s3Client.Upload(context.TODO(), s3Key, data); err != nil { + return ManifestFile{}, fmt.Errorf("failed to upload manifest: %w", err) + } + + var totalRecords int64 + for _, pf := range parquetFiles { + totalRecords += pf.RecordCount + } + + return ManifestFile{ + Path: w.config.S3Path(s3Key), + Size: int64(len(data)), + TotalRecordCount: totalRecords, + TotalDataFiles: int32(len(parquetFiles)), + }, nil +} + +func (w *IcebergMetadataWriter) WriteManifestList(manifestFile ManifestFile, sequenceNumber int, totalDataFileSize int64) (ManifestListFile, error) { + timestamp := time.Now().Format("20060102-150405") + filename := fmt.Sprintf("snap-%s_%s.avro", timestamp, uuid.New().String()[:8]) + tempFile, err := os.CreateTemp("", "manifest-list-*.avro") + if err != nil { + return ManifestListFile{}, fmt.Errorf("failed to create temp file: %w", err) + } + defer os.Remove(tempFile.Name()) + defer tempFile.Close() + + snapshotId := time.Now().UnixNano() + timestampMs := time.Now().UnixMilli() + + manifestListEntry := map[string]interface{}{ + "manifest_path": manifestFile.Path, + "manifest_length": manifestFile.Size, + "partition_spec_id": 0, + "content": 0, + "sequence_number": int64(sequenceNumber), + "min_sequence_number": int64(1), + "added_snapshot_id": snapshotId, + "added_files_count": int32(0), + "existing_files_count": manifestFile.TotalDataFiles, + "deleted_files_count": int32(0), + "added_rows_count": int64(0), + "existing_rows_count": manifestFile.TotalRecordCount, + "deleted_rows_count": int64(0), + "partitions": nil, + "key_metadata": nil, + } + + codec, err := goavro.NewCodec(MANIFEST_LIST_SCHEMA) + if err != nil { + return ManifestListFile{}, fmt.Errorf("failed to create avro codec: %w", err) + } + + ocfWriter, err := goavro.NewOCFWriter(goavro.OCFConfig{ + W: tempFile, + Codec: codec, + Schema: MANIFEST_LIST_SCHEMA, + }) + if err != nil { + return ManifestListFile{}, fmt.Errorf("failed to create OCF writer: %w", err) + } + + if err := ocfWriter.Append([]map[string]interface{}{manifestListEntry}); err != nil { + return ManifestListFile{}, fmt.Errorf("failed to write manifest list entry: %w", err) + } + + tempFile.Close() + + // Read and upload + data, err := os.ReadFile(tempFile.Name()) + if err != nil { + return ManifestListFile{}, fmt.Errorf("failed to read temp file: %w", err) + } + + s3Key := path.Join(w.metadataPath, filename) + if err := w.s3Client.Upload(context.TODO(), s3Key, data); err != nil { + return ManifestListFile{}, fmt.Errorf("failed to upload manifest list: %w", err) + } + + return ManifestListFile{ + Path: w.config.S3Path(s3Key), + SnapshotId: snapshotId, + SequenceNumber: sequenceNumber, + TimestampMs: timestampMs, + TotalFilesSize: totalDataFileSize, + TotalDataFiles: int64(manifestFile.TotalDataFiles), + TotalRecords: manifestFile.TotalRecordCount, + }, nil +} + +func (w *IcebergMetadataWriter) WriteMetadata(manifestListFile ManifestListFile) error { + tableUUID := uuid.New().String() + + metadata := map[string]interface{}{ + "format-version": 2, + "table-uuid": tableUUID, + "location": w.config.S3Path(w.tableS3Path), + "last-updated-ms": manifestListFile.TimestampMs, + "last-column-id": 14, + "schemas": []interface{}{ + map[string]interface{}{ + "type": "struct", + "schema-id": 0, + "fields": []interface{}{ + map[string]interface{}{"id": 1, "name": "id", "required": true, "type": "string"}, + map[string]interface{}{"id": 2, "name": "database", "required": true, "type": "string"}, + map[string]interface{}{"id": 3, "name": "schema", "required": true, "type": "string"}, + map[string]interface{}{"id": 4, "name": "table", "required": true, "type": "string"}, + map[string]interface{}{"id": 5, "name": "primary_key", "required": false, "type": "string"}, + map[string]interface{}{"id": 6, "name": "operation", "required": true, "type": "string"}, + map[string]interface{}{"id": 7, "name": "before", "required": false, "type": "string"}, + map[string]interface{}{"id": 8, "name": "after", "required": false, "type": "string"}, + map[string]interface{}{"id": 9, "name": "context", "required": false, "type": "string"}, + map[string]interface{}{"id": COMMITTED_AT_FIELD_ID, "name": "committed_at", "required": true, "type": "timestamptz"}, + map[string]interface{}{"id": 11, "name": "queued_at", "required": true, "type": "timestamptz"}, + map[string]interface{}{"id": 12, "name": "created_at", "required": true, "type": "timestamptz"}, + map[string]interface{}{"id": 13, "name": "transaction_id", "required": true, "type": "long"}, + map[string]interface{}{"id": 14, "name": "position", "required": true, "type": "long"}, + }, + }, + }, + "current-schema-id": 0, + "partition-specs": []interface{}{ + map[string]interface{}{ + "spec-id": 0, + "fields": []interface{}{}, + }, + }, + "default-spec-id": 0, + "last-partition-id": 999, + "default-sort-order-id": 0, + "sort-orders": []interface{}{ + map[string]interface{}{ + "order-id": 0, + "fields": []interface{}{}, + }, + }, + "properties": map[string]string{}, + "current-snapshot-id": manifestListFile.SnapshotId, + "refs": map[string]interface{}{ + "main": map[string]interface{}{ + "snapshot-id": manifestListFile.SnapshotId, + "type": "branch", + }, + }, + "snapshots": []interface{}{ + map[string]interface{}{ + "snapshot-id": manifestListFile.SnapshotId, + "timestamp-ms": manifestListFile.TimestampMs, + "sequence-number": manifestListFile.SequenceNumber, + "manifest-list": manifestListFile.Path, + "summary": map[string]interface{}{ + "operation": "append", + "total-data-files": fmt.Sprintf("%d", manifestListFile.TotalDataFiles), + "total-records": fmt.Sprintf("%d", manifestListFile.TotalRecords), + "total-files-size": fmt.Sprintf("%d", manifestListFile.TotalFilesSize), + }, + }, + }, + "snapshot-log": []interface{}{ + map[string]interface{}{ + "snapshot-id": manifestListFile.SnapshotId, + "timestamp-ms": manifestListFile.TimestampMs, + }, + }, + "metadata-log": []interface{}{}, + } + + data, err := json.MarshalIndent(metadata, "", " ") + if err != nil { + return fmt.Errorf("failed to marshal metadata: %w", err) + } + + s3Key := path.Join(w.metadataPath, ICEBERG_METADATA_FILE_NAME) + if err := w.s3Client.Upload(context.TODO(), s3Key, data); err != nil { + return fmt.Errorf("failed to upload metadata: %w", err) + } + + return nil +} diff --git a/processor/iceberg_writer.go b/processor/iceberg_writer.go new file mode 100644 index 0000000..b86479c --- /dev/null +++ b/processor/iceberg_writer.go @@ -0,0 +1,937 @@ +package main + +import ( + "bytes" + "context" + "database/sql" + "database/sql/driver" + "encoding/binary" + "encoding/json" + "errors" + "fmt" + "path" + "sort" + "strconv" + "strings" + "time" + + "github.com/duckdb/duckdb-go/v2" + "github.com/google/uuid" + "github.com/xitongsys/parquet-go-source/s3" + "github.com/xitongsys/parquet-go/reader" + "github.com/xitongsys/parquet-go/source" +) + +const TABLE_NAME = "changes" + +// MapOperation converts Debezium operation codes to readable operation names +func MapOperation(config *Config, op string) string { + switch op { + case OPERATION_CREATE: + return "CREATE" + case OPERATION_UPDATE: + return "UPDATE" + case OPERATION_DELETE: + return "DELETE" + case OPERATION_TRUNCATE: + return "TRUNCATE" + case OPERATION_MESSAGE: + return "MESSAGE" + default: + // Should never happen with valid cdc data + LogWarn(config, fmt.Sprintf("Unknown operation code: %s", op)) + return op + } +} + +type ParquetFileStats struct { + ColumnSizes map[int]int64 + ValueCounts map[int]int64 + NullValueCounts map[int]int64 + LowerBounds map[int][]byte + UpperBounds map[int][]byte + SplitOffsets []int64 +} + +const COMMITTED_AT_FIELD_ID = 10 + +type ParquetFileInfo struct { + Path string + Size int64 + RecordCount int64 + Stats ParquetFileStats +} + +type IcebergMetadata struct { + FormatVersion int `json:"format-version"` + TableUUID string `json:"table-uuid"` + Location string `json:"location"` + LastUpdatedMs int64 `json:"last-updated-ms"` + LastColumnId int `json:"last-column-id"` + CurrentSnapshotId int64 `json:"current-snapshot-id"` + Snapshots []IcebergSnapshot `json:"snapshots"` + Schemas []interface{} `json:"schemas"` +} + +type IcebergSnapshot struct { + SnapshotId int64 `json:"snapshot-id"` + SequenceNumber int `json:"sequence-number"` + TimestampMs int64 `json:"timestamp-ms"` + ManifestList string `json:"manifest-list"` +} + +type IcebergWriter struct { + config *Config + duckdb *DuckDBClient + s3Client *S3Client + tableS3Path string + dataS3Path string + metadataPath string + storageUtils *StorageUtils + cleanedOrphans bool + parquetFiles []ParquetFileInfo + parquetFilesLoaded bool + filesPendingDelete []string +} + +func NewIcebergWriter(config *Config, s3Client *S3Client) *IcebergWriter { + tableS3Path := path.Join(config.AuditBasePath, TABLE_NAME) + dataS3Path := path.Join(tableS3Path, "data") + metadataPath := path.Join(tableS3Path, "metadata") + + return &IcebergWriter{ + config: config, + s3Client: s3Client, + tableS3Path: tableS3Path, + dataS3Path: dataS3Path, + metadataPath: metadataPath, + storageUtils: NewStorageUtils(config, s3Client), + } +} + +func (w *IcebergWriter) SetDuckDB(duckdb *DuckDBClient) { + w.duckdb = duckdb +} + +func (w *IcebergWriter) AppendMessages(ctx context.Context, records []*FetchedRecord) error { + if len(records) == 0 { + return nil + } + if w.duckdb == nil { + return errors.New("duckdb client is not set") + } + + // Use background context for all database/storage operations + // to ensure they complete even if parent context is cancelled + bgCtx := context.Background() + + // Get existing parquet files + existingParquetFiles, err := w.getExistingParquetFiles(bgCtx) + if err != nil { + return fmt.Errorf("failed to get existing files: %w", err) + } + sortParquetFilesInfo(existingParquetFiles) + + var filesToDelete []string + + if !w.cleanedOrphans { + orphanFiles, err := w.orphanParquetFiles(bgCtx, existingParquetFiles) + if err != nil { + LogWarn(w.config, "Failed to find orphan parquet files:", err) + } else { + filesToDelete = append(filesToDelete, orphanFiles...) + w.cleanedOrphans = true + } + } + + // Create temp table with new data + tempTable := w.createTempTableName() + if err := w.createAndPopulateTempTable(bgCtx, tempTable, records); err != nil { + return err + } + defer w.dropTempTable(bgCtx, tempTable) + + var parquetFiles []ParquetFileInfo + var operationDesc string + + if len(existingParquetFiles) > 0 { + lastFile := existingParquetFiles[len(existingParquetFiles)-1] + + if lastFile.Size < w.config.MaxHotParquetFileSizeBytes() { // && lastFile.RecordCount < 1 when testing multiple Parquet files + parquetFiles = existingParquetFiles[:len(existingParquetFiles)-1] + newFile, err := w.mergeAndWriteParquet(bgCtx, tempTable, lastFile) + if err != nil { + return err + } + parquetFiles = append(parquetFiles, newFile) + filesToDelete = append(filesToDelete, w.s3PathToKey(lastFile.Path)) + operationDesc = fmt.Sprintf("merged with last parquet file, parquet_files=%d", len(parquetFiles)) + } else { + parquetFiles = existingParquetFiles + newFile, err := w.writeNewParquet(bgCtx, tempTable) + if err != nil { + return err + } + parquetFiles = append(parquetFiles, newFile) + operationDesc = fmt.Sprintf("created new parquet file, parquet_files=%d", len(parquetFiles)) + } + } else { + // First file + newFile, err := w.writeNewParquet(bgCtx, tempTable) + if err != nil { + return err + } + parquetFiles = []ParquetFileInfo{newFile} + operationDesc = "created first parquet file" + } + + compactedParquetFiles, compactedFilesToDelete, err := w.compactHotParquetFiles(bgCtx, parquetFiles) + if err != nil { + return err + } + if len(compactedFilesToDelete) > 0 { + parquetFiles = compactedParquetFiles + filesToDelete = append(filesToDelete, compactedFilesToDelete...) + operationDesc = fmt.Sprintf("%s, compacted_old_parquet_files=%d, parquet_files=%d", operationDesc, len(compactedFilesToDelete), len(parquetFiles)) + } + sortParquetFilesInfo(parquetFiles) + + retainedParquetFiles, retentionFilesToDelete, err := w.dropOldestParquetFileOutsideRetention(parquetFiles) + if err != nil { + LogWarn(w.config, "Failed to apply retention period:", err) + } else if len(retentionFilesToDelete) > 0 { + parquetFiles = retainedParquetFiles + filesToDelete = append(filesToDelete, retentionFilesToDelete...) + operationDesc = fmt.Sprintf("%s, dropped_oldest_retained_parquet_file=1, parquet_files=%d", operationDesc, len(parquetFiles)) + } + + // Get old metadata files to delete + oldMetadataFiles, err := w.getOldMetadataFiles(bgCtx) + if err != nil { + LogWarn(w.config, "Failed to get old metadata files:", err) + } else { + filesToDelete = append(filesToDelete, oldMetadataFiles...) + } + + // Write Iceberg metadata + if err := w.writeIcebergMetadata(parquetFiles); err != nil { + return fmt.Errorf("failed to write Iceberg metadata: %w", err) + } + + w.setCachedParquetFiles(parquetFiles) + // Keep files from the previous snapshot available for one more successful + // append so readers that already resolved that snapshot can finish. + filesReadyToDelete := w.stageFilesForDeletion(filesToDelete) + w.deleteFiles(bgCtx, filesReadyToDelete) + + LogInfo(w.config, fmt.Sprintf("Appended %d messages (%s)", len(records), operationDesc)) + return nil +} + +func (w *IcebergWriter) writeIcebergMetadata(parquetFiles []ParquetFileInfo) error { + metadataWriter := NewIcebergMetadataWriter(w.config, w.s3Client, w.tableS3Path, w.metadataPath) + + // Calculate total size + var totalSize int64 + for _, pf := range parquetFiles { + totalSize += pf.Size + } + + // Write manifest (lists all parquet files) + manifestFile, err := metadataWriter.WriteManifest(parquetFiles) + if err != nil { + return fmt.Errorf("failed to write manifest: %w", err) + } + + // Write manifest list (references the manifest) + sequenceNumber := len(parquetFiles) + 1 + manifestListFile, err := metadataWriter.WriteManifestList(manifestFile, sequenceNumber, totalSize) + if err != nil { + return fmt.Errorf("failed to write manifest list: %w", err) + } + + // Write metadata.json (root Iceberg metadata) + if err := metadataWriter.WriteMetadata(manifestListFile); err != nil { + return fmt.Errorf("failed to write metadata: %w", err) + } + + LogInfo(w.config, "Wrote Iceberg metadata: manifest, manifest-list, metadata.json") + return nil +} + +func (w *IcebergWriter) createAndPopulateTempTable(ctx context.Context, tableName string, records []*FetchedRecord) error { + createSQL := fmt.Sprintf(` + CREATE TABLE %s ( + id VARCHAR, + database VARCHAR(255), + schema VARCHAR(255), + "table" VARCHAR(255), + primary_key VARCHAR(255), + operation VARCHAR(10), + before JSON, + "after" JSON, + context JSON, + committed_at TIMESTAMPTZ, + queued_at TIMESTAMPTZ, + created_at TIMESTAMPTZ, + transaction_id BIGINT, + position BIGINT + ) + `, tableName) + + if _, err := w.duckdb.ExecContext(ctx, createSQL); err != nil { + return err + } + + conn, err := w.duckdb.db.Conn(ctx) + if err != nil { + return fmt.Errorf("failed to get duckdb connection: %w", err) + } + defer conn.Close() + + return conn.Raw(func(driverConn interface{}) error { + duckdbConn, ok := driverConn.(driver.Conn) + if !ok { + return fmt.Errorf("unexpected duckdb driver connection type %T", driverConn) + } + + appender, err := duckdb.NewAppenderFromConn(duckdbConn, "", tableName) + if err != nil { + return fmt.Errorf("failed to create duckdb appender: %w", err) + } + + for _, record := range records { + row := w.messageToRow(record.Message) + if err := appender.AppendRow( + row.ID, row.Database, row.Schema, row.Table, nullableStringValue(row.PrimaryKey), + row.Operation, nullableJSONValue(row.Before), nullableJSONValue(row.After), nullableJSONValue(row.Context), + row.CommittedAt, row.QueuedAt, row.CreatedAt, + row.TransactionID, row.Position, + ); err != nil { + _ = appender.Close() + return fmt.Errorf("failed to append row: %w", err) + } + } + + if err := appender.Close(); err != nil { + return fmt.Errorf("failed to close duckdb appender: %w", err) + } + return nil + }) +} + +func (w *IcebergWriter) messageToRow(msg *ChangeMessage) struct { + ID string + Database string + Schema string + Table string + PrimaryKey sql.NullString + Operation string + Before sql.NullString + After sql.NullString + Context sql.NullString + CommittedAt time.Time + QueuedAt time.Time + CreatedAt time.Time + TransactionID int64 + Position int64 +} { + id := uuid.New().String() + now := time.Now() + committedAt := time.UnixMicro(msg.Source.TsUs) + queuedAt := time.UnixMicro(msg.TsUs) + + operation := MapOperation(w.config, msg.Op) + + var beforeJSON, afterJSON, contextJSON sql.NullString + if msg.Before != nil { + if data, err := json.Marshal(msg.Before); err == nil { + beforeJSON = sql.NullString{String: string(data), Valid: true} + } + } + if msg.After != nil { + if data, err := json.Marshal(msg.After); err == nil { + afterJSON = sql.NullString{String: string(data), Valid: true} + } + } + if len(msg.Context) > 0 { + if data, err := json.Marshal(msg.Context); err == nil { + contextJSON = sql.NullString{String: string(data), Valid: true} + } + } + + var primaryKeyValue sql.NullString + if len(msg.Source.Pk) > 0 { + // Extract primary key values from After (for INSERT/UPDATE) or Before (for DELETE) + data := msg.After + if data == nil { + data = msg.Before + } + + if data != nil { + var pkStrings []string + for _, pkCol := range msg.Source.Pk { + if val, ok := data[pkCol]; ok { + pkStrings = append(pkStrings, formatPrimaryKeyValue(val)) + } + } + + if len(pkStrings) > 0 { + // Single PK: store as string without quotes, compound PK: store as JSON array + if len(pkStrings) == 1 { + primaryKeyValue = sql.NullString{String: pkStrings[0], Valid: true} + } else { + if pkData, err := json.Marshal(pkStrings); err == nil { + primaryKeyValue = sql.NullString{String: string(pkData), Valid: true} + } + } + } + } + } + + return struct { + ID string + Database string + Schema string + Table string + PrimaryKey sql.NullString + Operation string + Before sql.NullString + After sql.NullString + Context sql.NullString + CommittedAt time.Time + QueuedAt time.Time + CreatedAt time.Time + TransactionID int64 + Position int64 + }{ + ID: id, + Database: msg.Source.Db, + Schema: msg.Source.Schema, + Table: msg.Source.Table, + PrimaryKey: primaryKeyValue, + Operation: operation, + Before: beforeJSON, + After: afterJSON, + Context: contextJSON, + CommittedAt: committedAt, + QueuedAt: queuedAt, + CreatedAt: now, + TransactionID: int64(msg.Source.TxId), + Position: int64(msg.Source.Lsn), + } +} + +func formatPrimaryKeyValue(value interface{}) string { + switch v := value.(type) { + case nil: + return "null" + case json.Number: + return v.String() + case string: + return v + case float64: + return strconv.FormatFloat(v, 'f', -1, 64) + case float32: + return strconv.FormatFloat(float64(v), 'f', -1, 32) + case fmt.Stringer: + return v.String() + default: + return fmt.Sprintf("%v", v) + } +} + +func nullableStringValue(value sql.NullString) interface{} { + if !value.Valid { + return nil + } + return value.String +} + +func nullableJSONValue(value sql.NullString) interface{} { + if !value.Valid { + return nil + } + return json.RawMessage(value.String) +} + +func (w *IcebergWriter) mergeAndWriteParquet(ctx context.Context, tempTable string, existingFile ParquetFileInfo) (ParquetFileInfo, error) { + existingS3Path := existingFile.Path + if !strings.HasPrefix(existingS3Path, "s3://") { + existingS3Path = w.config.S3Path(existingS3Path) + } + + mergedTable := w.createTempTableName() + createSQL := fmt.Sprintf(` + CREATE TABLE %s AS + SELECT * FROM read_parquet('%s') + UNION ALL + SELECT * FROM %s + `, mergedTable, existingS3Path, tempTable) + + if _, err := w.duckdb.ExecContext(ctx, createSQL); err != nil { + return ParquetFileInfo{}, fmt.Errorf("failed to merge: %w", err) + } + defer w.dropTempTable(ctx, mergedTable) + + return w.writeParquetFromTable(ctx, mergedTable) +} + +func (w *IcebergWriter) mergeParquetFiles(ctx context.Context, existingFiles []ParquetFileInfo, filenamePrefix string) (ParquetFileInfo, error) { + if len(existingFiles) == 0 { + return ParquetFileInfo{}, fmt.Errorf("no parquet files to merge") + } + + mergedTable := w.createTempTableName() + selects := make([]string, 0, len(existingFiles)) + for _, existingFile := range existingFiles { + existingS3Path := existingFile.Path + if !strings.HasPrefix(existingS3Path, "s3://") { + existingS3Path = w.config.S3Path(existingS3Path) + } + selects = append(selects, fmt.Sprintf("SELECT * FROM read_parquet('%s')", existingS3Path)) + } + + createSQL := fmt.Sprintf(` + CREATE TABLE %s AS + %s + `, mergedTable, strings.Join(selects, "\nUNION ALL\n")) + + if _, err := w.duckdb.ExecContext(ctx, createSQL); err != nil { + return ParquetFileInfo{}, fmt.Errorf("failed to merge parquet files: %w", err) + } + defer w.dropTempTable(ctx, mergedTable) + + return w.writeParquetFromTableWithFilenamePrefix(ctx, mergedTable, filenamePrefix) +} + +func (w *IcebergWriter) writeNewParquet(ctx context.Context, tempTable string) (ParquetFileInfo, error) { + return w.writeParquetFromTable(ctx, tempTable) +} + +func (w *IcebergWriter) ReadParquetStats(fileReader source.ParquetFile) (ParquetFileStats, error) { + defer fileReader.Close() + + pr, err := reader.NewParquetReader(fileReader, nil, 1) + if err != nil { + return ParquetFileStats{}, fmt.Errorf("failed to create parquet reader: %w", err) + } + defer pr.ReadStop() + + stats := ParquetFileStats{ + ColumnSizes: make(map[int]int64), + ValueCounts: make(map[int]int64), + NullValueCounts: make(map[int]int64), + LowerBounds: make(map[int][]byte), + UpperBounds: make(map[int][]byte), + SplitOffsets: []int64{}, + } + + fieldIdByColumnName := map[string]int{ + "id": 1, + "database": 2, + "schema": 3, + "table": 4, + "primary_key": 5, + "operation": 6, + "before": 7, + "after": 8, + "context": 9, + "committed_at": COMMITTED_AT_FIELD_ID, + "queued_at": 11, + "created_at": 12, + "transaction_id": 13, + "position": 14, + } + + stringColumns := map[string]bool{ + "id": true, + "database": true, + "schema": true, + "table": true, + "primary_key": true, + "operation": true, + "before": true, + "after": true, + "context": true, + } + int64Columns := map[string]bool{ + "committed_at": true, + "queued_at": true, + "created_at": true, + "transaction_id": true, + "position": true, + } + + for _, rowGroup := range pr.Footer.RowGroups { + if rowGroup.FileOffset != nil { + stats.SplitOffsets = append(stats.SplitOffsets, *rowGroup.FileOffset) + } + + for _, columnChunk := range rowGroup.Columns { + columnMetaData := columnChunk.MetaData + columnName := strings.ToLower(columnMetaData.PathInSchema[0]) + fieldId, ok := fieldIdByColumnName[columnName] + if !ok { + continue + } + stats.ColumnSizes[fieldId] += columnMetaData.TotalCompressedSize + stats.ValueCounts[fieldId] += int64(columnMetaData.NumValues) + if columnMetaData.Statistics != nil && columnMetaData.Statistics.NullCount != nil { + stats.NullValueCounts[fieldId] += *columnMetaData.Statistics.NullCount + } else { + stats.NullValueCounts[fieldId] += 0 + } + + if columnMetaData.Statistics != nil { + minValue := columnMetaData.Statistics.Min + maxValue := columnMetaData.Statistics.Max + + isString := stringColumns[columnName] + isInt64 := int64Columns[columnName] + // Ignore empty values for non-string columns + if (isString || len(minValue) > 0) && shouldReplaceLowerBound(stats.LowerBounds[fieldId], minValue, isInt64) { + stats.LowerBounds[fieldId] = minValue + } + if (isString || len(maxValue) > 0) && shouldReplaceUpperBound(stats.UpperBounds[fieldId], maxValue, isInt64) { + stats.UpperBounds[fieldId] = maxValue + } + } + } + } + + return stats, nil +} + +func shouldReplaceLowerBound(current, candidate []byte, isInt64 bool) bool { + if current == nil { + return true + } + return compareParquetBound(current, candidate, isInt64) > 0 +} + +func shouldReplaceUpperBound(current, candidate []byte, isInt64 bool) bool { + if current == nil { + return true + } + return compareParquetBound(current, candidate, isInt64) < 0 +} + +func compareParquetBound(left, right []byte, isInt64 bool) int { + if isInt64 && len(left) == 8 && len(right) == 8 { + leftValue := int64(binary.LittleEndian.Uint64(left)) + rightValue := int64(binary.LittleEndian.Uint64(right)) + switch { + case leftValue < rightValue: + return -1 + case leftValue > rightValue: + return 1 + default: + return 0 + } + } + + return bytes.Compare(left, right) +} + +func (w *IcebergWriter) writeParquetFromTable(ctx context.Context, tableName string) (ParquetFileInfo, error) { + return w.writeParquetFromTableWithFilenamePrefix(ctx, tableName, time.Now().Format("20060102-150405")) +} + +func (w *IcebergWriter) writeParquetFromTableWithFilenamePrefix(ctx context.Context, tableName string, filenamePrefix string) (ParquetFileInfo, error) { + filename := fmt.Sprintf("%s_%s.parquet", filenamePrefix, uuid.New().String()[:8]) + filePath := path.Join(w.dataS3Path, filename) + s3Path := w.config.S3Path(filePath) + + fieldIds := []string{ + `"id": 1`, + `"database": 2`, + `"schema": 3`, + `"table": 4`, + `"primary_key": 5`, + `"operation": 6`, + `"before": 7`, + `"after": 8`, + `"context": 9`, + fmt.Sprintf(`"committed_at": %d`, COMMITTED_AT_FIELD_ID), + `"queued_at": 11`, + `"created_at": 12`, + `"transaction_id": 13`, + `"position": 14`, + } + copySQL := fmt.Sprintf(`COPY %s TO '%s' (FORMAT parquet, COMPRESSION zstd, COMPRESSION_LEVEL 1, ROW_GROUP_SIZE 100000, FIELD_IDS {%s})`, tableName, s3Path, strings.Join(fieldIds, ", ")) + + if _, err := w.duckdb.ExecContext(ctx, copySQL); err != nil { + return ParquetFileInfo{}, fmt.Errorf("failed to write parquet: %w", err) + } + + // Get row count by reading back the file + var recordCount int64 + countSQL := fmt.Sprintf(`SELECT COUNT(*) FROM '%s'`, s3Path) + + err := w.duckdb.QueryRowContext(ctx, countSQL).Scan(&recordCount) + if err != nil { + return ParquetFileInfo{}, fmt.Errorf("failed to get record count: %w", err) + } + + // Get file size from S3 metadata + fileSize, err := w.s3Client.GetFileSize(ctx, filePath) + if err != nil { + return ParquetFileInfo{}, fmt.Errorf("failed to get file size: %w", err) + } + + // Read parquet stats + fileReader, err := s3.NewS3FileReaderWithClient(ctx, w.s3Client.client, w.config.S3Bucket, filePath) + if err != nil { + return ParquetFileInfo{}, fmt.Errorf("failed to create s3 file reader: %w", err) + } + parquetStats, err := w.ReadParquetStats(fileReader) + if err != nil { + return ParquetFileInfo{}, fmt.Errorf("failed to read parquet stats: %w", err) + } + + // Format file size for readability + var sizeStr string + if fileSize >= 1024*1024 { + sizeStr = fmt.Sprintf("%.2f MB", float64(fileSize)/(1024*1024)) + } else if fileSize >= 1024 { + sizeStr = fmt.Sprintf("%.2f KB", float64(fileSize)/1024) + } else { + sizeStr = fmt.Sprintf("%d bytes", fileSize) + } + LogInfo(w.config, fmt.Sprintf("Wrote parquet file: %s | Records: %d | Size: %s", filename, recordCount, sizeStr)) + + return ParquetFileInfo{ + Path: w.config.S3Path(filePath), + Size: fileSize, + RecordCount: recordCount, + Stats: parquetStats, + }, nil +} + +func (w *IcebergWriter) getLatestMetadataFile(ctx context.Context) (string, error) { + return path.Join(w.metadataPath, ICEBERG_METADATA_FILE_NAME), nil +} + +func (w *IcebergWriter) getExistingParquetFiles(ctx context.Context) ([]ParquetFileInfo, error) { + if w.parquetFilesLoaded { + return cloneParquetFilesInfo(w.parquetFiles), nil + } + + metadataFile, err := w.getLatestMetadataFile(ctx) + if err != nil { + return nil, fmt.Errorf("failed to get metadata: %w", err) + } + + parquetFiles, err := w.storageUtils.CurrentParquetFiles(ctx, metadataFile) + if errors.Is(err, ErrIcebergMetadataNotFound) { + dataFiles, listErr := w.s3Client.ListFiles(ctx, w.dataS3Path) + if listErr != nil { + return nil, fmt.Errorf("failed to list data files after missing metadata: %w", listErr) + } + + for _, file := range dataFiles { + if strings.HasSuffix(file, ".parquet") { + return nil, fmt.Errorf("iceberg metadata is missing but parquet data files exist under %s", w.dataS3Path) + } + } + + w.setCachedParquetFiles(nil) + w.cleanedOrphans = true + return nil, nil + } + if err != nil { + return nil, err + } + + w.setCachedParquetFiles(parquetFiles) + return cloneParquetFilesInfo(w.parquetFiles), nil +} + +func (w *IcebergWriter) setCachedParquetFiles(parquetFiles []ParquetFileInfo) { + w.parquetFiles = cloneParquetFilesInfo(parquetFiles) + w.parquetFilesLoaded = true +} + +func cloneParquetFilesInfo(parquetFiles []ParquetFileInfo) []ParquetFileInfo { + if parquetFiles == nil { + return nil + } + cloned := make([]ParquetFileInfo, len(parquetFiles)) + copy(cloned, parquetFiles) + return cloned +} + +func sortParquetFilesInfo(parquetFiles []ParquetFileInfo) { + sort.Slice(parquetFiles, func(i, j int) bool { + return parquetFilename(parquetFiles[i].Path) < parquetFilename(parquetFiles[j].Path) + }) +} + +func (w *IcebergWriter) dropOldestParquetFileOutsideRetention(parquetFiles []ParquetFileInfo) ([]ParquetFileInfo, []string, error) { + if len(parquetFiles) == 0 { + return parquetFiles, nil, nil + } + + if w.config.RetentionDays == nil { + return parquetFiles, nil, nil + } + + retentionStartsAt := time.Now().UTC().AddDate(0, 0, -*w.config.RetentionDays) + oldestFile := parquetFiles[0] + maxCommittedAt, err := maxCommittedAtFromMetadata(oldestFile) + if err != nil { + return parquetFiles, nil, err + } + if !maxCommittedAt.Valid || !maxCommittedAt.Time.Before(retentionStartsAt) { + return parquetFiles, nil, nil + } + + LogInfo(w.config, fmt.Sprintf( + "Attempting to drop parquet file outside retention: file=%s, max_committed_at=%s, retention_starts_at=%s", + parquetFilename(oldestFile.Path), + maxCommittedAt.Time.UTC().Format(time.RFC3339Nano), + retentionStartsAt.Format(time.RFC3339Nano), + )) + + return parquetFiles[1:], []string{w.s3PathToKey(oldestFile.Path)}, nil +} + +func maxCommittedAtFromMetadata(parquetFile ParquetFileInfo) (sql.NullTime, error) { + upperBound, ok := parquetFile.Stats.UpperBounds[COMMITTED_AT_FIELD_ID] + if !ok { + return sql.NullTime{}, nil + } + if len(upperBound) != 8 { + return sql.NullTime{}, fmt.Errorf( + "invalid committed_at upper bound for %s: got %d bytes, want 8", + parquetFilename(parquetFile.Path), + len(upperBound), + ) + } + + return sql.NullTime{ + Time: time.UnixMicro(int64(binary.LittleEndian.Uint64(upperBound))).UTC(), + Valid: true, + }, nil +} + +func (w *IcebergWriter) orphanParquetFiles(ctx context.Context, parquetFiles []ParquetFileInfo) ([]string, error) { + files, err := w.s3Client.ListFiles(ctx, w.dataS3Path) + if err != nil { + return nil, err + } + + liveKeys := make(map[string]struct{}, len(parquetFiles)) + for _, parquetFile := range parquetFiles { + liveKeys[w.s3PathToKey(parquetFile.Path)] = struct{}{} + } + + var orphanFiles []string + for _, file := range files { + if !strings.HasSuffix(file, ".parquet") { + continue + } + + fileKey := path.Join(w.dataS3Path, file) + if _, ok := liveKeys[fileKey]; !ok { + orphanFiles = append(orphanFiles, fileKey) + } + } + + if len(orphanFiles) > 0 { + LogInfo(w.config, fmt.Sprintf("Found %d orphan parquet file(s) not referenced by current Iceberg metadata", len(orphanFiles))) + } + + return orphanFiles, nil +} + +func (w *IcebergWriter) createTempTableName() string { + return "temp_" + strings.ReplaceAll(uuid.New().String(), "-", "") +} + +func (w *IcebergWriter) dropTempTable(ctx context.Context, tableName string) { + _, _ = w.duckdb.ExecContext(ctx, "DROP TABLE IF EXISTS "+tableName) +} + +func (w *IcebergWriter) s3PathToKey(s3Path string) string { + // Convert s3://bucket/path to path + prefix := fmt.Sprintf("s3://%s/", w.config.S3Bucket) + return strings.TrimPrefix(s3Path, prefix) +} + +func (w *IcebergWriter) getOldMetadataFiles(ctx context.Context) ([]string, error) { + files, err := w.s3Client.ListFiles(ctx, w.metadataPath) + if err != nil { + return nil, err + } + + var keysToDelete []string + for _, file := range files { + // Delete old manifest and manifest-list files (avro files) + if strings.HasSuffix(file, ".avro") { + keysToDelete = append(keysToDelete, path.Join(w.metadataPath, file)) + } + } + + return keysToDelete, nil +} + +func (w *IcebergWriter) deleteFiles(ctx context.Context, keys []string) { + if len(keys) == 0 { + return + } + + for _, key := range keys { + var fileName string + if strings.Contains(key, "/data/") { + fileName = strings.Split(key, "/data/")[1] + } else if strings.Contains(key, "/metadata/") { + fileName = strings.Split(key, "/metadata/")[1] + } else { + fileName = key + } + + LogInfo(w.config, fmt.Sprintf("Deleting old file: %s", fileName)) + if err := w.s3Client.Delete(ctx, key); err != nil { + LogWarn(w.config, fmt.Sprintf("Failed to delete %s: %v", fileName, err)) + } + } +} + +func (w *IcebergWriter) stageFilesForDeletion(keys []string) []string { + ready := uniqueStrings(w.filesPendingDelete) + readySet := make(map[string]struct{}, len(ready)) + for _, key := range ready { + readySet[key] = struct{}{} + } + + nextSet := make(map[string]struct{}, len(keys)) + next := make([]string, 0, len(keys)) + for _, key := range keys { + if _, beingDeleted := readySet[key]; beingDeleted { + continue + } + if _, exists := nextSet[key]; exists { + continue + } + nextSet[key] = struct{}{} + next = append(next, key) + } + + w.filesPendingDelete = next + return ready +} + +func uniqueStrings(values []string) []string { + seen := make(map[string]struct{}, len(values)) + unique := make([]string, 0, len(values)) + for _, value := range values { + if _, exists := seen[value]; exists { + continue + } + seen[value] = struct{}{} + unique = append(unique, value) + } + return unique +} diff --git a/processor/iceberg_writer_test.go b/processor/iceberg_writer_test.go new file mode 100644 index 0000000..f9b9da1 --- /dev/null +++ b/processor/iceberg_writer_test.go @@ -0,0 +1,192 @@ +package main + +import ( + "encoding/binary" + "testing" + "time" +) + +func TestParquetInt64BoundsUseNumericOrdering(t *testing.T) { + actualMin := int64Bound(1781621455606000) + actualMax := int64Bound(1781813349941875) + + lexicographicallySmallerButLater := int64Bound(1781810317423793) + lexicographicallyLargerButEarlier := int64Bound(1781719942625000) + + lower := lexicographicallySmallerButLater + if shouldReplaceLowerBound(lower, actualMin, true) { + lower = actualMin + } + if got := int64(binary.LittleEndian.Uint64(lower)); got != 1781621455606000 { + t.Fatalf("lower bound = %d, want %d", got, int64(1781621455606000)) + } + + upper := lexicographicallyLargerButEarlier + if shouldReplaceUpperBound(upper, actualMax, true) { + upper = actualMax + } + if got := int64(binary.LittleEndian.Uint64(upper)); got != 1781813349941875 { + t.Fatalf("upper bound = %d, want %d", got, int64(1781813349941875)) + } +} + +func TestParquetStringBoundsUseByteOrdering(t *testing.T) { + if !shouldReplaceLowerBound([]byte("b"), []byte("a"), false) { + t.Fatal("expected string lower bound to use byte ordering") + } + if !shouldReplaceUpperBound([]byte("b"), []byte("c"), false) { + t.Fatal("expected string upper bound to use byte ordering") + } +} + +func TestMaxCommittedAtFromMetadataUsesUpperBound(t *testing.T) { + want := time.Date(2026, 6, 19, 12, 34, 56, 789000000, time.UTC) + got, err := maxCommittedAtFromMetadata(ParquetFileInfo{ + Path: "s3://bucket/path/file.parquet", + Stats: ParquetFileStats{ + UpperBounds: map[int][]byte{ + COMMITTED_AT_FIELD_ID: int64Bound(want.UnixMicro()), + }, + }, + }) + if err != nil { + t.Fatalf("maxCommittedAtFromMetadata returned error: %v", err) + } + if !got.Valid { + t.Fatal("maxCommittedAtFromMetadata returned invalid time") + } + if !got.Time.Equal(want) { + t.Fatalf("maxCommittedAtFromMetadata = %s, want %s", got.Time, want) + } +} + +func TestMaxCommittedAtFromMetadataMissingBound(t *testing.T) { + got, err := maxCommittedAtFromMetadata(ParquetFileInfo{}) + if err != nil { + t.Fatalf("maxCommittedAtFromMetadata returned error: %v", err) + } + if got.Valid { + t.Fatalf("maxCommittedAtFromMetadata valid = true, want false") + } +} + +func TestMaxCommittedAtFromMetadataInvalidBound(t *testing.T) { + _, err := maxCommittedAtFromMetadata(ParquetFileInfo{ + Path: "s3://bucket/path/file.parquet", + Stats: ParquetFileStats{ + UpperBounds: map[int][]byte{ + COMMITTED_AT_FIELD_ID: []byte{1, 2, 3}, + }, + }, + }) + if err == nil { + t.Fatal("maxCommittedAtFromMetadata returned nil error for invalid bound") + } +} + +func TestDropOldestParquetFileOutsideRetentionDropsExpiredOldestFile(t *testing.T) { + retentionDays := 1 + writer := &IcebergWriter{ + config: &Config{ + S3Bucket: "bucket", + RetentionDays: &retentionDays, + }, + } + oldFile := parquetFileWithMaxCommittedAt("s3://bucket/path/old.parquet", time.Now().UTC().AddDate(0, 0, -2)) + newFile := parquetFileWithMaxCommittedAt("s3://bucket/path/new.parquet", time.Now().UTC()) + + gotFiles, gotKeys, err := writer.dropOldestParquetFileOutsideRetention([]ParquetFileInfo{oldFile, newFile}) + if err != nil { + t.Fatalf("dropOldestParquetFileOutsideRetention returned error: %v", err) + } + if len(gotFiles) != 1 || gotFiles[0].Path != newFile.Path { + t.Fatalf("retained files = %+v, want only %s", gotFiles, newFile.Path) + } + if len(gotKeys) != 1 || gotKeys[0] != "path/old.parquet" { + t.Fatalf("delete keys = %+v, want [path/old.parquet]", gotKeys) + } +} + +func TestDropOldestParquetFileOutsideRetentionKeepsFileWithinRetention(t *testing.T) { + retentionDays := 1 + writer := &IcebergWriter{ + config: &Config{ + S3Bucket: "bucket", + RetentionDays: &retentionDays, + }, + } + parquetFiles := []ParquetFileInfo{ + parquetFileWithMaxCommittedAt("s3://bucket/path/file.parquet", time.Now().UTC()), + } + + gotFiles, gotKeys, err := writer.dropOldestParquetFileOutsideRetention(parquetFiles) + if err != nil { + t.Fatalf("dropOldestParquetFileOutsideRetention returned error: %v", err) + } + if len(gotFiles) != len(parquetFiles) || gotFiles[0].Path != parquetFiles[0].Path { + t.Fatalf("retained files = %+v, want original files", gotFiles) + } + if len(gotKeys) != 0 { + t.Fatalf("delete keys = %+v, want none", gotKeys) + } +} + +func TestDropOldestParquetFileOutsideRetentionKeepsFilesWithoutRetention(t *testing.T) { + writer := &IcebergWriter{ + config: &Config{ + S3Bucket: "bucket", + }, + } + parquetFiles := []ParquetFileInfo{ + parquetFileWithMaxCommittedAt("s3://bucket/path/file.parquet", time.Now().UTC().AddDate(0, 0, -2)), + } + + gotFiles, gotKeys, err := writer.dropOldestParquetFileOutsideRetention(parquetFiles) + if err != nil { + t.Fatalf("dropOldestParquetFileOutsideRetention returned error: %v", err) + } + if len(gotFiles) != len(parquetFiles) || gotFiles[0].Path != parquetFiles[0].Path { + t.Fatalf("retained files = %+v, want original files", gotFiles) + } + if len(gotKeys) != 0 { + t.Fatalf("delete keys = %+v, want none", gotKeys) + } +} + +func TestStageFilesForDeletionWaitsOneSuccessfulCycle(t *testing.T) { + writer := &IcebergWriter{} + + if ready := writer.stageFilesForDeletion([]string{"old.parquet", "old.parquet"}); len(ready) != 0 { + t.Fatalf("first cycle ready files = %v, want none", ready) + } + + ready := writer.stageFilesForDeletion([]string{"old.parquet", "old.avro", "old.avro"}) + if len(ready) != 1 || ready[0] != "old.parquet" { + t.Fatalf("second cycle ready files = %v, want [old.parquet]", ready) + } + if len(writer.filesPendingDelete) != 1 || writer.filesPendingDelete[0] != "old.avro" { + t.Fatalf("second cycle pending files = %v, want [old.avro]", writer.filesPendingDelete) + } + + ready = writer.stageFilesForDeletion(nil) + if len(ready) != 1 || ready[0] != "old.avro" { + t.Fatalf("third cycle ready files = %v, want [old.avro]", ready) + } +} + +func parquetFileWithMaxCommittedAt(filePath string, committedAt time.Time) ParquetFileInfo { + return ParquetFileInfo{ + Path: filePath, + Stats: ParquetFileStats{ + UpperBounds: map[int][]byte{ + COMMITTED_AT_FIELD_ID: int64Bound(committedAt.UnixMicro()), + }, + }, + } +} + +func int64Bound(value int64) []byte { + bound := make([]byte, 8) + binary.LittleEndian.PutUint64(bound, uint64(value)) + return bound +} diff --git a/processor/logger_utils.go b/processor/logger_utils.go new file mode 100644 index 0000000..83c92a5 --- /dev/null +++ b/processor/logger_utils.go @@ -0,0 +1,54 @@ +package main + +import ( + "log" +) + +type LogLevel string + +const ( + LOG_LEVEL_TRACE = "TRACE" + LOG_LEVEL_DEBUG = "DEBUG" + LOG_LEVEL_WARN = "WARN" + LOG_LEVEL_INFO = "INFO" + LOG_LEVEL_ERROR = "ERROR" +) + +var LOG_LEVELS = []string{ + LOG_LEVEL_TRACE, + LOG_LEVEL_DEBUG, + LOG_LEVEL_WARN, + LOG_LEVEL_INFO, + LOG_LEVEL_ERROR, +} + +func isValidLogLevel(level string) bool { + for _, validLevel := range LOG_LEVELS { + if level == validLevel { + return true + } + } + return false +} + +func LogError(config *Config, message ...interface{}) { + log.Println(append([]interface{}{"[ERROR]"}, message...)...) +} + +func LogWarn(config *Config, message ...interface{}) { + if config.LogLevel != LOG_LEVEL_ERROR { + log.Println(append([]interface{}{"[WARN]"}, message...)...) + } +} + +func LogInfo(config *Config, message ...interface{}) { + if config.LogLevel != LOG_LEVEL_ERROR && config.LogLevel != LOG_LEVEL_WARN { + log.Println(append([]interface{}{"[INFO]"}, message...)...) + } +} + +func LogDebug(config *Config, message ...interface{}) { + if config.LogLevel == LOG_LEVEL_DEBUG || config.LogLevel == LOG_LEVEL_TRACE { + log.Println(append([]interface{}{"[DEBUG]"}, message...)...) + } +} diff --git a/processor/main.go b/processor/main.go new file mode 100644 index 0000000..eba2945 --- /dev/null +++ b/processor/main.go @@ -0,0 +1,317 @@ +package main + +import ( + "context" + "fmt" + "log" + "os" + "os/signal" + "strconv" + "strings" + "syscall" +) + +func main() { + config := LoadConfig() + + LogInfo(config, "Starting processor...") + LogInfo(config, fmt.Sprintf("NATS: %s, Subject: %s", config.NatsURL, config.NatsSubject)) + LogInfo(config, fmt.Sprintf("S3: %s, Bucket: %s", config.S3Endpoint, config.S3Bucket)) + LogInfo(config, fmt.Sprintf("Batch interval: %v, Max hot Parquet size: %d MB", config.NatsBatchInterval, config.MaxHotParquetSizeMB)) + LogInfo(config, fmt.Sprintf("DuckDB memory limit: %s", config.DuckDBMemoryLimit)) + LogInfo(config, fmt.Sprintf("Retention days: %s", formatRetentionDays(config.RetentionDays))) + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + s3Client, err := NewS3Client(config) + if err != nil { + log.Fatalf("Failed to create S3 client: %v", err) + } + + if err := s3Client.EnsureBucket(ctx); err != nil { + LogWarn(config, "Failed to ensure bucket exists:", err) + } + + if err := prepareStorage(ctx, config, s3Client); err != nil { + log.Fatalf("Failed to prepare storage: %v", err) + } + + writer := NewIcebergWriter(config, s3Client) + searchWriter, err := NewSearchWriter(config) + if err != nil { + log.Fatalf("Failed to create Search writer: %v", err) + } + if err := reconcileSearchTables(ctx, config, searchWriter); err != nil { + log.Fatalf("Failed to reconcile Search tables: %v", err) + } + + natsConsumer, err := NewNatsConsumer(config) + if err != nil { + log.Fatalf("Failed to create NATS consumer: %v", err) + } + defer natsConsumer.Close() + + // Initialize message buffer and deduplication tracker + messageBuffer := NewMessageBuffer() + deduplicationTracker := NewDeduplicationTracker(DEDUPLICATION_MAX_SIZE) + + deduplicationInitialized := false + + sigChan := make(chan os.Signal, 1) + signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM) + + go func() { + <-sigChan + LogInfo(config, "Shutting down...") + cancel() + }() + + LogInfo(config, "Starting to consume messages...") + + for { + select { + case <-ctx.Done(): + LogInfo(config, "Context cancelled, exiting...") + return + default: + batch, err := natsConsumer.ConsumeBatch(ctx, config.NatsBatchInterval) + if err != nil { + LogError(config, "Error consuming batch:", err) + continue + } + + if len(batch.Messages) == 0 { + LogDebug(config, "No messages received in batch window, continuing...") + continue + } + + LogInfo(config, fmt.Sprintf("Received %d messages", len(batch.Messages))) + + stitchResult, err := processBatch( + ctx, + config, + batch, + &messageBuffer, + writer, + deduplicationTracker, + &deduplicationInitialized, + s3Client, + searchWriter, + ) + if err != nil { + if isDuckDBOutOfMemory(err) { + log.Fatalf("DuckDB ran out of memory: %v", err) + } + LogError(config, "Error processing messages:", err) + // Don't ack on failure - messages will be redelivered + continue + } + + // Ack every resolved message. With AckExplicitPolicy, JetStream acks are + // per-message; acking a later stream sequence does not ack earlier ones. + ackedCount := 0 + for _, natsMsg := range stitchResult.AckMessages { + if natsMsg == nil { + continue + } + if err := natsMsg.Ack(); err != nil { + LogError(config, "Failed to ack message:", err) + continue + } + ackedCount++ + } + if ackedCount > 0 { + LogInfo(config, fmt.Sprintf("Acked %d messages through sequence #%d", ackedCount, stitchResult.AckStreamSequence)) + } + + } + } +} + +func processBatch( + ctx context.Context, + config *Config, + batch *MessageBatch, + messageBuffer **MessageBuffer, + writer *IcebergWriter, + deduplicationTracker *DeduplicationTracker, + deduplicationInitialized *bool, + s3Client *S3Client, + searchWriter *SearchWriter, +) (*StitchResult, error) { + var duckdb *DuckDBClient + defer func() { + closeBatchDuckDB(config, duckdb, writer, searchWriter) + }() + + ensureDuckDB := func() (*DuckDBClient, error) { + if duckdb != nil { + return duckdb, nil + } + client, err := NewDuckDBClient(config) + if err != nil { + return nil, fmt.Errorf("failed to create DuckDB client: %w", err) + } + duckdb = client + return duckdb, nil + } + + if !*deduplicationInitialized { + LogInfo(config, "Loading existing records for deduplication...") + if err := deduplicationTracker.LoadFromParquet(ctx, ensureDuckDB, config, writer.dataS3Path, s3Client); err != nil { + return nil, fmt.Errorf("failed to initialize deduplication: %w", err) + } + *deduplicationInitialized = true + } + + stitchResult := StitchMessages(config, batch, *messageBuffer) + *messageBuffer = stitchResult.Buffer + + auditRecords := recordsForProduct(stitchResult.StitchedRecords, PRODUCT_AUDIT) + uniqueRecords := deduplicationTracker.FilterDuplicates(config, auditRecords) + searchRecords := recordsForProduct(stitchResult.StitchedRecords, PRODUCT_SEARCH) + + LogInfo(config, fmt.Sprintf( + "Processing: stitched=%d, audit=%d, search=%d, buffered=%d", + len(stitchResult.StitchedRecords), + len(uniqueRecords), + len(searchRecords), + (*messageBuffer).Size(), + )) + + if err := processAuditRecords(ctx, writer, deduplicationTracker, uniqueRecords, ensureDuckDB); err != nil { + return nil, err + } + if err := processSearchRecords(ctx, searchWriter, searchRecords, ensureDuckDB); err != nil { + return nil, err + } + + return stitchResult, nil +} + +func reconcileSearchTables(ctx context.Context, config *Config, writer *SearchWriter) error { + if !writer.Enabled() { + return nil + } + + duckdb, err := NewDuckDBClient(config) + if err != nil { + return fmt.Errorf("failed to create DuckDB client: %w", err) + } + writer.SetDuckDB(duckdb) + defer func() { + writer.SetDuckDB(nil) + if err := duckdb.Close(); err != nil { + LogWarn(config, "Failed to close Search reconciliation DuckDB:", err) + } + }() + + return writer.ReconcileTables(ctx) +} + +func recordsForProduct(records []*FetchedRecord, product string) []*FetchedRecord { + filtered := make([]*FetchedRecord, 0, len(records)) + for _, record := range records { + if record.Message.IsForProduct(product) { + filtered = append(filtered, record) + } + } + return filtered +} + +func processAuditRecords( + ctx context.Context, + writer *IcebergWriter, + tracker *DeduplicationTracker, + records []*FetchedRecord, + ensureDuckDB func() (*DuckDBClient, error), +) error { + if len(records) == 0 { + return nil + } + + duckdb, err := ensureDuckDB() + if err != nil { + return err + } + writer.SetDuckDB(duckdb) + if err := writer.AppendMessages(ctx, records); err != nil { + return err + } + tracker.MarkRecordsProcessed(writer.config, records) + return nil +} + +func processSearchRecords( + ctx context.Context, + writer *SearchWriter, + records []*FetchedRecord, + ensureDuckDB func() (*DuckDBClient, error), +) error { + if len(records) == 0 { + return nil + } + + duckdb, err := ensureDuckDB() + if err != nil { + return err + } + writer.SetDuckDB(duckdb) + return writer.Apply(ctx, records) +} + +func closeBatchDuckDB(config *Config, duckdb *DuckDBClient, icebergWriter *IcebergWriter, searchWriter *SearchWriter) { + icebergWriter.SetDuckDB(nil) + searchWriter.SetDuckDB(nil) + if duckdb == nil { + return + } + if err := duckdb.Close(); err != nil { + LogWarn(config, "Failed to close DuckDB client:", err) + } + memoryUsage := getPodMemoryUsage() + if memoryUsage == "" { + memoryUsage = "unavailable" + } + LogDebug(config, fmt.Sprintf("Closed batch DuckDB. Pod memory: %s", memoryUsage)) +} + +func formatRetentionDays(retentionDays *int) string { + if retentionDays == nil { + return "unlimited" + } + + return strconv.Itoa(*retentionDays) +} + +func getPodMemoryUsage() string { + data, err := os.ReadFile("/sys/fs/cgroup/memory.current") + if err != nil { + return "" + } + + bytes, err := strconv.ParseInt(strings.TrimSpace(string(data)), 10, 64) + if err != nil { + return "" + } + + return formatBytes(bytes) +} + +func formatBytes(bytes int64) string { + const unit = 1024 + if bytes < unit { + return fmt.Sprintf("%d B", bytes) + } + + value := float64(bytes) + for _, suffix := range []string{"KB", "MB", "GB", "TB"} { + value /= unit + if value < unit { + return fmt.Sprintf("%.2f %s", value, suffix) + } + } + + return fmt.Sprintf("%.2f PB", value/unit) +} diff --git a/processor/nats_consumer.go b/processor/nats_consumer.go new file mode 100644 index 0000000..695044c --- /dev/null +++ b/processor/nats_consumer.go @@ -0,0 +1,180 @@ +package main + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "time" + + "github.com/nats-io/nats.go" + "github.com/nats-io/nats.go/jetstream" +) + +const ( + MAX_NATS_BATCH_MESSAGES = 5000 + PRODUCT_AUDIT = "audit" + PRODUCT_SEARCH = "search" +) + +type ChangeMessage struct { + Before map[string]interface{} `json:"before,omitempty"` + After map[string]interface{} `json:"after,omitempty"` + Source SourceMetadata `json:"source"` + Op string `json:"op"` + TsUs int64 `json:"ts_us"` + Message *MessagePayload `json:"message,omitempty"` + Context map[string]interface{} `json:"-"` // Populated during stitching + Products []string `json:"products,omitempty"` +} + +func (message *ChangeMessage) IsForProduct(product string) bool { + // Fallback to audit product, legacy messages may not have products configured + if len(message.Products) == 0 { + return product == PRODUCT_AUDIT + } + for _, configured := range message.Products { + if configured == product { + return true + } + } + return false +} + +type MessagePayload struct { + Prefix string `json:"prefix"` + Content string `json:"content"` +} + +type SourceMetadata struct { + TsUs int64 `json:"ts_us"` + Db string `json:"db"` + Schema string `json:"schema"` + Table string `json:"table"` + TxId uint32 `json:"txId"` + Lsn uint64 `json:"lsn"` + Pk []string `json:"pk,omitempty"` +} + +type NatsConsumer struct { + nc *nats.Conn + js jetstream.JetStream + consumer jetstream.Consumer + config *Config +} + +type MessageBatch struct { + Messages []*ChangeMessage + NatsMsg []jetstream.Msg +} + +func NewNatsConsumer(config *Config) (*NatsConsumer, error) { + nc, err := nats.Connect(config.NatsURL) + if err != nil { + return nil, fmt.Errorf("failed to connect to NATS: %w", err) + } + + js, err := jetstream.New(nc) + if err != nil { + nc.Close() + return nil, fmt.Errorf("failed to create JetStream context: %w", err) + } + + // Use project-specific consumer name so multiple processor instances + // for different projects don't conflict + consumerName := config.ConsumerName + + consumer, err := js.CreateOrUpdateConsumer(context.Background(), config.NatsStreamName, jetstream.ConsumerConfig{ + // Durable consumer name - persists across restarts + // Format: [projectId]-processor (e.g., "proj_abc123-processor") + Durable: consumerName, + + // Only consume messages matching this subject pattern + FilterSubject: config.NatsSubject, + + // MaxAckPending: -1 means unlimited unacknowledged messages + // Default is 1000, but we batch process so we want flexibility + // The consumer won't stop delivering if we have many in-flight + MaxAckPending: -1, + + // AckExplicitPolicy: Messages must be explicitly acknowledged + // We ack after successfully writing to Parquet/Iceberg + // This ensures at-least-once delivery semantics + AckPolicy: jetstream.AckExplicitPolicy, + + // DeliverAllPolicy: Start from the beginning of the stream + // On first connection, deliver all messages (not just new ones) + // Good for initial sync or recovery scenarios + DeliverPolicy: jetstream.DeliverAllPolicy, + + // AckWait needs to be longer than the fetch window plus write time. + // Otherwise messages fetched early in the batch can redeliver before + // the processor reaches its post-write ack path. + AckWait: config.NatsBatchInterval * 2, + + // MaxDeliver: -1 means infinite redelivery attempts + // If we fail to process a message, NATS will keep trying forever + // Better than dropping messages; we can add DLQ later if needed + MaxDeliver: -1, + }) + if err != nil { + nc.Close() + return nil, fmt.Errorf("failed to create consumer: %w", err) + } + + LogInfo(config, fmt.Sprintf( + "Connected to NATS stream: %s, subject: %s, consumer: %s", + config.NatsStreamName, + config.NatsSubject, + consumerName, + )) + + return &NatsConsumer{ + nc: nc, + js: js, + consumer: consumer, + config: config, + }, nil +} + +func (nc *NatsConsumer) ConsumeBatch(ctx context.Context, timeout time.Duration) (*MessageBatch, error) { + messages := []*ChangeMessage{} + natsMessages := []jetstream.Msg{} + + msgs, err := nc.consumer.Fetch(MAX_NATS_BATCH_MESSAGES, jetstream.FetchMaxWait(timeout)) + if err != nil { + return &MessageBatch{ + Messages: messages, + NatsMsg: natsMessages, + }, nil + } + + for msg := range msgs.Messages() { + var change ChangeMessage + decoder := json.NewDecoder(bytes.NewReader(msg.Data())) + decoder.UseNumber() + if err := decoder.Decode(&change); err != nil { + LogError(nc.config, "Failed to unmarshal message:", err) + msg.Ack() // Ack bad messages immediately to avoid reprocessing + continue + } + + messages = append(messages, &change) + natsMessages = append(natsMessages, msg) // Store for later ack + } + + if msgs.Error() != nil { + LogError(nc.config, "Error fetching messages:", msgs.Error()) + } + + return &MessageBatch{ + Messages: messages, + NatsMsg: natsMessages, + }, nil +} + +func (nc *NatsConsumer) Close() { + if nc.nc != nil { + nc.nc.Close() + } +} diff --git a/processor/operation.go b/processor/operation.go new file mode 100644 index 0000000..53f930d --- /dev/null +++ b/processor/operation.go @@ -0,0 +1,9 @@ +package main + +const ( + OPERATION_CREATE = "c" + OPERATION_UPDATE = "u" + OPERATION_DELETE = "d" + OPERATION_TRUNCATE = "t" + OPERATION_MESSAGE = "m" +) diff --git a/processor/runtime_integration.go b/processor/runtime_integration.go new file mode 100644 index 0000000..e68c865 --- /dev/null +++ b/processor/runtime_integration.go @@ -0,0 +1,13 @@ +package main + +import "context" + +type IntegrationConfig struct{} + +func loadIntegrationConfig(_ *Config) {} + +func consumerName() string { + return getEnv("NATS_CONSUMER_NAME", "pgstack-processor") +} + +func prepareStorage(_ context.Context, _ *Config, _ *S3Client) error { return nil } diff --git a/processor/s3_client.go b/processor/s3_client.go new file mode 100644 index 0000000..8e6feb1 --- /dev/null +++ b/processor/s3_client.go @@ -0,0 +1,148 @@ +package main + +import ( + "bytes" + "context" + "fmt" + "io" + "net/url" + "sort" + "strings" + "time" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/credentials" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/s3" +) + +type S3Client struct { + client *s3.S3 + bucket string +} + +func NewS3Client(config *Config) (*S3Client, error) { + sess, err := session.NewSession(&aws.Config{ + Region: aws.String(config.S3Region), + Endpoint: aws.String(config.S3Endpoint), + Credentials: credentials.NewStaticCredentials(config.S3AccessKey, config.S3SecretKey, ""), + S3ForcePathStyle: aws.Bool(true), + }) + if err != nil { + return nil, fmt.Errorf("failed to create AWS session: %w", err) + } + + client := s3.New(sess) + + return &S3Client{ + client: client, + bucket: config.S3Bucket, + }, nil +} + +func (s3c *S3Client) Upload(ctx context.Context, key string, data []byte) error { + // Use a timeout-based context instead of the parent context + // This ensures uploads complete even if parent context is cancelled + uploadCtx, cancel := context.WithTimeout(context.Background(), 60*time.Second) + defer cancel() + + _, err := s3c.client.PutObjectWithContext(uploadCtx, &s3.PutObjectInput{ + Bucket: aws.String(s3c.bucket), + Key: aws.String(key), + Body: bytes.NewReader(data), + }) + return err +} + +func (s3c *S3Client) CopyFrom(ctx context.Context, sourceBucket string, sourceKey string, targetKey string) error { + copyCtx, cancel := context.WithTimeout(context.Background(), 60*time.Second) + defer cancel() + + copySource := url.PathEscape(sourceBucket + "/" + sourceKey) + copySource = strings.ReplaceAll(copySource, "%2F", "/") + + _, err := s3c.client.CopyObjectWithContext(copyCtx, &s3.CopyObjectInput{ + Bucket: aws.String(s3c.bucket), + Key: aws.String(targetKey), + CopySource: aws.String(copySource), + }) + return err +} + +func (s3c *S3Client) GetFileSize(ctx context.Context, key string) (int64, error) { + headCtx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + + result, err := s3c.client.HeadObjectWithContext(headCtx, &s3.HeadObjectInput{ + Bucket: aws.String(s3c.bucket), + Key: aws.String(key), + }) + if err != nil { + return 0, err + } + + return *result.ContentLength, nil +} + +func (s3c *S3Client) Download(ctx context.Context, key string) ([]byte, error) { + result, err := s3c.client.GetObjectWithContext(ctx, &s3.GetObjectInput{ + Bucket: aws.String(s3c.bucket), + Key: aws.String(key), + }) + if err != nil { + return nil, err + } + defer result.Body.Close() + + return io.ReadAll(result.Body) +} + +func (s3c *S3Client) ListFiles(ctx context.Context, prefix string) ([]string, error) { + // Use a timeout-based context instead of the parent context + listCtx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + + result, err := s3c.client.ListObjectsV2WithContext(listCtx, &s3.ListObjectsV2Input{ + Bucket: aws.String(s3c.bucket), + Prefix: aws.String(prefix), + }) + if err != nil { + return nil, err + } + + var files []string + for _, obj := range result.Contents { + filename := strings.TrimPrefix(*obj.Key, prefix+"/") + if filename != "" && !strings.Contains(filename, "/") { + files = append(files, filename) + } + } + + sort.Strings(files) + return files, nil +} + +func (s3c *S3Client) EnsureBucket(ctx context.Context) error { + _, err := s3c.client.HeadBucketWithContext(ctx, &s3.HeadBucketInput{ + Bucket: aws.String(s3c.bucket), + }) + if err == nil { + return nil + } + + _, err = s3c.client.CreateBucketWithContext(ctx, &s3.CreateBucketInput{ + Bucket: aws.String(s3c.bucket), + }) + return err +} + +func (s3c *S3Client) Delete(ctx context.Context, key string) error { + deleteCtx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + + _, err := s3c.client.DeleteObjectWithContext(deleteCtx, &s3.DeleteObjectInput{ + Bucket: aws.String(s3c.bucket), + Key: aws.String(key), + }) + return err +} diff --git a/processor/search_writer.go b/processor/search_writer.go new file mode 100644 index 0000000..80f3539 --- /dev/null +++ b/processor/search_writer.go @@ -0,0 +1,964 @@ +package main + +import ( + "context" + "crypto/sha256" + "database/sql" + "encoding/hex" + "encoding/json" + "errors" + "fmt" + "math" + "sort" + "strings" + "time" + "unicode/utf8" +) + +const ( + SEARCH_INPUT_FORMAT_VERSION = 2 + SEARCH_CHUNK_OVERLAP_BYTES = 400 + VECTOR_INDEX_ROW_THRESHOLD = 100_000 + SEARCH_VERSION_RETENTION = time.Hour + SEARCH_MAINTENANCE_INTERVAL = time.Hour + + PGSTACK_TEXT_COLUMN = "__pgstack_text" + PGSTACK_TEXT_INDEX = "__pgstack_text_idx" + PGSTACK_CHUNK_INDEX_COLUMN = "__pgstack_chunk_index" + PGSTACK_SOURCE_KEY_COLUMN = "__pgstack_source_key" + PGSTACK_UPDATED_AT_COLUMN = "__pgstack_updated_at" + PGSTACK_POSITION_COLUMN = "__pgstack_position" +) + +type searchEmbeddingConfig struct { + ID string + Name string + Columns []string +} + +type SearchTableConfig struct { + Name string `json:"name"` + IndexColumns []string `json:"indexColumns"` + StoreColumns []string `json:"storeColumns"` + KeywordOnly bool `json:"keywordOnly,omitempty"` +} + +// Keyword-only tables need no vector columns or embedding requests. +func (table SearchTableConfig) embeddings() []searchEmbeddingConfig { + if table.KeywordOnly { + return nil + } + return []searchEmbeddingConfig{{ID: "embedding_hash", Name: "__pgstack_embedding", Columns: table.IndexColumns}} +} + +type searchRow struct { + table SearchTableConfig + message *ChangeMessage + values map[string]interface{} + chunkIndex int + text interface{} + existing bool + hashes map[string]string + changedEmbeddings []searchEmbeddingConfig + vectors map[string][]float32 +} + +type searchColumn struct { + name string + dataType string +} + +type embeddingTask struct { + // row and embedding identify where the vector returned for this flattened + // API input must be stored after the batched embedding request completes. + row *searchRow + embedding searchEmbeddingConfig + input string +} + +type searchCleanup struct { + table SearchTableConfig + message *ChangeMessage + values map[string]interface{} + chunkCount int +} + +type searchApplyPlan struct { + rows []*searchRow + tasks []embeddingTask + cleanups []searchCleanup + sourceRows int +} + +type existingSearchRows struct { + hashes map[int]map[string]string + position uint64 +} + +type SearchWriter struct { + config *Config + duckdb *DuckDBClient + tables map[string]SearchTableConfig + embeddings *EmbeddingClient + cleaned bool + lastMaintainedAtByTableName map[string]time.Time +} + +func NewSearchWriter(config *Config) (*SearchWriter, error) { + var tables []SearchTableConfig + if err := json.Unmarshal([]byte(config.SearchTablesJSON), &tables); err != nil { + return nil, fmt.Errorf("failed to parse SEARCH_TABLES_JSON: %w", err) + } + byName := make(map[string]SearchTableConfig, len(tables)) + physicalNames := make(map[string]string, len(tables)) + for _, table := range tables { + if _, exists := byName[table.Name]; exists { + return nil, fmt.Errorf("duplicate Search table: %s", table.Name) + } + physicalName := searchPhysicalTableName(table.Name) + if previous, exists := physicalNames[physicalName]; exists { + return nil, fmt.Errorf("search table name collision: %s and %s", previous, table.Name) + } + if err := validateSearchTableConfig(table); err != nil { + return nil, err + } + byName[table.Name] = table + physicalNames[physicalName] = table.Name + } + writer := &SearchWriter{config: config, tables: byName, lastMaintainedAtByTableName: make(map[string]time.Time)} + needsEmbeddings := false + for _, table := range tables { + needsEmbeddings = needsEmbeddings || !table.KeywordOnly + } + if needsEmbeddings { + client, err := NewEmbeddingClient(config) + if err != nil { + return nil, err + } + writer.embeddings = client + } + return writer, nil +} + +func validateSearchTableConfig(table SearchTableConfig) error { + columnNames := make(map[string]bool, len(table.StoreColumns)+len(table.embeddings())) + for _, column := range table.StoreColumns { + if column == "" || columnNames[column] || strings.HasPrefix(column, "__pgstack_") { + return fmt.Errorf("invalid or duplicate Search column: %s.%s", table.Name, column) + } + columnNames[column] = true + } + if len(table.IndexColumns) == 0 { + return fmt.Errorf("search table %s must have at least one index column", table.Name) + } + indexColumns := make(map[string]bool) + for _, column := range table.IndexColumns { + if column == "" || indexColumns[column] || strings.HasPrefix(column, "__pgstack_") { + return fmt.Errorf("invalid or duplicate Search index column: %s.%s", table.Name, column) + } + indexColumns[column] = true + } + + return nil +} + +func (writer *SearchWriter) Enabled() bool { + return len(writer.tables) > 0 +} + +func (writer *SearchWriter) SetDuckDB(duckdb *DuckDBClient) { + writer.duckdb = duckdb +} + +func (writer *SearchWriter) ReconcileTables(ctx context.Context) error { + if !writer.Enabled() { + return nil + } + if writer.duckdb == nil { + return errors.New("duckdb client is not set") + } + if err := writer.dropRemovedTables(ctx); err != nil { + return err + } + for _, table := range writer.tables { + if err := writer.ensureTable(ctx, table, table.StoreColumns); err != nil { + return err + } + if err := writer.maintainTableIndexes(ctx, table, false); err != nil { + return err + } + } + writer.cleaned = true + return nil +} + +func (writer *SearchWriter) Apply(ctx context.Context, records []*FetchedRecord) error { + if len(records) == 0 || !writer.Enabled() { + return nil + } + if writer.duckdb == nil { + return errors.New("duckdb client is not set") + } + if !writer.cleaned { + if err := writer.dropRemovedTables(ctx); err != nil { + return err + } + writer.cleaned = true + } + + plan, err := writer.buildApplyPlan(ctx, writer.latestRecords(records)) + if err != nil { + return err + } + if err := writer.populateEmbeddings(ctx, plan.tasks); err != nil { + return err + } + if err := writer.persistApplyPlan(ctx, plan); err != nil { + return err + } + if err := writer.maintainTables(ctx, plan); err != nil { + return err + } + + LogInfo(writer.config, fmt.Sprintf("Applied %d Search source rows as %d chunks with %d embedding inputs", plan.sourceRows, len(plan.rows), len(plan.tasks))) + return nil +} + +func (writer *SearchWriter) buildApplyPlan(ctx context.Context, records []*FetchedRecord) (*searchApplyPlan, error) { + plan := &searchApplyPlan{ + rows: make([]*searchRow, 0, len(records)), + cleanups: make([]searchCleanup, 0, len(records)), + } + for _, record := range records { + table, ok := writer.tables[record.Message.Source.Schema+"."+record.Message.Source.Table] + if !ok { + continue + } + if err := writer.ensureTable(ctx, table, record.Message.Source.Pk); err != nil { + return nil, err + } + if record.Message.Op != OPERATION_TRUNCATE && len(record.Message.Source.Pk) == 0 { + return nil, fmt.Errorf("search table %s has no primary key metadata", table.Name) + } + if record.Message.Op == OPERATION_DELETE || record.Message.Op == OPERATION_TRUNCATE { + plan.rows = append(plan.rows, &searchRow{table: table, message: record.Message, values: record.Message.Before}) + plan.sourceRows++ + continue + } + + existingRows, err := writer.existingHashes(ctx, table, record.Message, record.Message.After) + if err != nil { + return nil, err + } + if existingRows.position > record.Message.Source.Lsn { + continue + } + + chunksByEmbedding := make(map[string][]string, len(table.embeddings())) + chunkCount := 1 + for _, embedding := range table.embeddings() { + chunks := chunkEmbeddingInput(searchEmbeddingInput(embedding, record.Message.After)) + chunksByEmbedding[embedding.ID] = chunks + chunkCount = max(chunkCount, len(chunks)) + } + + for chunkIndex := 0; chunkIndex < chunkCount; chunkIndex++ { + row := &searchRow{ + table: table, + message: record.Message, + values: record.Message.After, + chunkIndex: chunkIndex, + hashes: make(map[string]string), + vectors: make(map[string][]float32), + } + existingHashes, existing := existingRows.hashes[chunkIndex] + row.existing = existing + if chunkIndex == 0 { + // Keep full source text once, without embedding field labels or overlap. + // This preserves keyword frequencies and phrases across vector chunks. + row.text = searchKeywordInput(table, record.Message.After) + } + for _, embedding := range table.embeddings() { + chunks := chunksByEmbedding[embedding.ID] + if chunkIndex >= len(chunks) { + if existingHashes[embedding.ID] != "" { + row.changedEmbeddings = append(row.changedEmbeddings, embedding) + } + continue + } + input := chunks[chunkIndex] + hash := writer.embeddingHash(embedding, input) + row.hashes[embedding.ID] = hash + if !existing || existingHashes[embedding.ID] != hash { + row.changedEmbeddings = append(row.changedEmbeddings, embedding) + plan.tasks = append(plan.tasks, embeddingTask{row: row, embedding: embedding, input: input}) + } + } + plan.rows = append(plan.rows, row) + } + plan.cleanups = append(plan.cleanups, searchCleanup{table: table, message: record.Message, values: record.Message.After, chunkCount: chunkCount}) + plan.sourceRows++ + } + return plan, nil +} + +func (writer *SearchWriter) populateEmbeddings(ctx context.Context, tasks []embeddingTask) error { + inputs := make([]string, len(tasks)) + for i := range tasks { + inputs[i] = tasks[i].input + } + if len(inputs) > 0 { + vectors, err := writer.embeddings.Embed(ctx, inputs) + if err != nil { + return err + } + for i, vector := range vectors { + tasks[i].row.vectors[tasks[i].embedding.ID] = vector + } + } + return nil +} + +func (writer *SearchWriter) persistApplyPlan(ctx context.Context, plan *searchApplyPlan) error { + for _, row := range plan.rows { + if err := writer.applyRow(ctx, row); err != nil { + return err + } + } + for _, cleanup := range plan.cleanups { + if err := writer.deleteStaleChunks(ctx, cleanup.table, cleanup.message, cleanup.values, cleanup.chunkCount); err != nil { + return err + } + } + return nil +} + +// maintainTables runs once after a CDC batch has been persisted. It compacts +// table fragments and creates missing indices after the row threshold. Once an +// hour, it also indexes accumulated rows in merge mode and vacuums old versions. +func (writer *SearchWriter) maintainTables(ctx context.Context, plan *searchApplyPlan) error { + tables := make(map[string]SearchTableConfig) + for _, row := range plan.rows { + tables[row.table.Name] = row.table + } + for _, cleanup := range plan.cleanups { + tables[cleanup.table.Name] = cleanup.table + } + for _, table := range tables { + maintenanceDue := searchMaintenanceDue(writer.lastMaintainedAtByTableName[table.Name], time.Now()) + if err := writer.compactTable(ctx, table); err != nil { + return err + } + if err := writer.maintainTableIndexes(ctx, table, maintenanceDue); err != nil { + return err + } + if maintenanceDue { + if err := writer.vacuumTable(ctx, table); err != nil { + // Vacuum only reclaims old versions. A cleanup failure must not + // reject an otherwise persisted CDC batch and cause redelivery. + LogWarn(writer.config, err) + } + if writer.lastMaintainedAtByTableName == nil { + writer.lastMaintainedAtByTableName = make(map[string]time.Time) + } + writer.lastMaintainedAtByTableName[table.Name] = time.Now() + } + } + return nil +} + +func (writer *SearchWriter) maintainTableIndexes(ctx context.Context, table SearchTableConfig, merge bool) error { + datasetPath := writer.searchDatasetPath(table) + indices, err := writer.vectorIndexes(ctx, datasetPath) + if err != nil { + return fmt.Errorf("failed to inspect Search indices for %s: %w", table.Name, err) + } + + if indices[PGSTACK_TEXT_INDEX] { + if merge { + query := searchOptimizeIndexQuery(PGSTACK_TEXT_INDEX, datasetPath) + if err := writer.executeLanceMaintenance(ctx, query); err != nil { + return fmt.Errorf("failed to optimize Search text index on %s: %w", table.Name, err) + } + } + } else { + query := searchTextIndexQuery(datasetPath) + if _, err := writer.duckdb.ExecContext(ctx, query); err != nil { + return fmt.Errorf("failed to create Search text index on %s: %w", table.Name, err) + } + } + + missingIndex := false + for _, embedding := range table.embeddings() { + if !indices[vectorIndexName(embedding.ID)] { + missingIndex = true + break + } + } + var rowCount int64 + if missingIndex { + qualified := "search_store.main." + quoteIdentifier(searchPhysicalTableName(table.Name)) + if err := writer.duckdb.QueryRowContext(ctx, "SELECT count(*) FROM "+qualified).Scan(&rowCount); err != nil { + return fmt.Errorf("failed to count Search rows for %s: %w", table.Name, err) + } + } + + for _, embedding := range table.embeddings() { + indexName := vectorIndexName(embedding.ID) + if indices[indexName] { + if merge { + query := searchOptimizeIndexQuery(indexName, datasetPath) + if err := writer.executeLanceMaintenance(ctx, query); err != nil { + return fmt.Errorf("failed to optimize Search index %s on %s: %w", indexName, table.Name, err) + } + } + continue + } + if rowCount < VECTOR_INDEX_ROW_THRESHOLD { + continue + } + + partitions := max(1, int(math.Sqrt(float64(rowCount)))) + query := searchVectorIndexQuery(datasetPath, embedding, partitions) + if _, err := writer.duckdb.ExecContext(ctx, query); err != nil { + return fmt.Errorf("failed to create Search index %s on %s: %w", indexName, table.Name, err) + } + LogInfo(writer.config, fmt.Sprintf("Created L2 vector index %s on %s.%s with %d partitions for %d rows", indexName, table.Name, embedding.Name, partitions, rowCount)) + } + return nil +} + +func (writer *SearchWriter) vectorIndexes(ctx context.Context, datasetPath string) (map[string]bool, error) { + rows, err := writer.duckdb.QueryContext(ctx, "SHOW INDEXES ON '"+escapeSQLString(datasetPath)+"'") + if err != nil { + return nil, err + } + defer rows.Close() + + indices := make(map[string]bool) + for rows.Next() { + var indexName, indexType, fields string + var rowsIndexed uint64 + var details sql.NullString + if err := rows.Scan(&indexName, &indexType, &fields, &rowsIndexed, &details); err != nil { + return nil, err + } + indices[indexName] = true + } + return indices, rows.Err() +} + +func (writer *SearchWriter) compactTable(ctx context.Context, table SearchTableConfig) error { + query := "OPTIMIZE '" + escapeSQLString(writer.searchDatasetPath(table)) + "'" + if err := writer.executeLanceMaintenance(ctx, query); err != nil { + return fmt.Errorf("failed to compact Search table %s: %w", table.Name, err) + } + return nil +} + +func (writer *SearchWriter) vacuumTable(ctx context.Context, table SearchTableConfig) error { + query := fmt.Sprintf( + "VACUUM LANCE '%s' WITH (older_than_seconds = %d, retain_n_versions = 1)", + escapeSQLString(writer.searchDatasetPath(table)), + SEARCH_VERSION_RETENTION/time.Second, + ) + if err := writer.executeLanceMaintenance(ctx, query); err != nil { + return fmt.Errorf("failed to clean up Search versions for %s: %w", table.Name, err) + } + return nil +} + +func (writer *SearchWriter) executeLanceMaintenance(ctx context.Context, query string) error { + var operation, target, metrics string + return writer.duckdb.QueryRowContext(ctx, query).Scan(&operation, &target, &metrics) +} + +func searchMaintenanceDue(lastMaintainedAt time.Time, now time.Time) bool { + return lastMaintainedAt.IsZero() || now.Sub(lastMaintainedAt) >= SEARCH_MAINTENANCE_INTERVAL +} + +func (writer *SearchWriter) searchDatasetPath(table SearchTableConfig) string { + return fmt.Sprintf("s3://%s/%s/%s.lance", writer.config.S3Bucket, strings.Trim(writer.config.SearchBasePath, "/"), searchPhysicalTableName(table.Name)) +} + +// Lance index DDL uses its own parser: quoted index names are rejected, and +// quotes around column names become part of the field name. These identifiers +// are generated internally, so emit them bare while still escaping dataset URIs. +func searchTextIndexQuery(datasetPath string) string { + return fmt.Sprintf("CREATE INDEX %s ON '%s' (%s) USING INVERTED", PGSTACK_TEXT_INDEX, escapeSQLString(datasetPath), PGSTACK_TEXT_COLUMN) +} + +func searchVectorIndexQuery(datasetPath string, embedding searchEmbeddingConfig, partitions int) string { + return fmt.Sprintf("CREATE INDEX %s ON '%s' (%s) USING IVF_FLAT WITH (num_partitions = %d, metric_type = 'l2')", + vectorIndexName(embedding.ID), escapeSQLString(datasetPath), embedding.Name, partitions) +} + +func searchOptimizeIndexQuery(indexName, datasetPath string) string { + return "ALTER INDEX " + indexName + " ON '" + escapeSQLString(datasetPath) + "' OPTIMIZE WITH (mode = 'merge')" +} + +func vectorIndexName(embeddingID string) string { + return "__pgstack_vector_" + embeddingID + "_idx" +} + +// latestRecords collapses a batch to its newest Search mutation per configured +// source table and primary key. The result contains source records, not chunks, +// and is sorted by source position so Apply handles them deterministically. +// +// Example input: id=1 UPDATE@10, id=2 DELETE@12, id=1 UPDATE@14 +// Example output: id=2 DELETE@12, id=1 UPDATE@14 +func (writer *SearchWriter) latestRecords(records []*FetchedRecord) []*FetchedRecord { + latest := make(map[string]*FetchedRecord) + for _, record := range records { + message := record.Message + if !message.IsForProduct(PRODUCT_SEARCH) { + continue + } + table, ok := writer.tables[message.Source.Schema+"."+message.Source.Table] + if !ok { + continue + } + keyValues := make([]string, 0, len(message.Source.Pk)) + values := message.After + if message.Op == OPERATION_DELETE { + values = message.Before + } + for _, column := range message.Source.Pk { + keyValues = append(keyValues, fmt.Sprint(values[column])) + } + key := table.Name + "\x00" + strings.Join(keyValues, "\x00") + if previous := latest[key]; previous == nil || previous.Message.Source.Lsn <= message.Source.Lsn { + latest[key] = record + } + } + result := make([]*FetchedRecord, 0, len(latest)) + for _, record := range latest { + result = append(result, record) + } + sort.Slice(result, func(i, j int) bool { return result[i].Message.Source.Lsn < result[j].Message.Source.Lsn }) + return result +} + +func (writer *SearchWriter) ensureTable(ctx context.Context, table SearchTableConfig, primaryKeys []string) error { + name := searchPhysicalTableName(table.Name) + qualified := "search_store.main." + quoteIdentifier(name) + rows, err := writer.duckdb.QueryContext(ctx, "DESCRIBE "+qualified) + if err == nil { + var columns []searchColumn + for rows.Next() { + var columnName, columnType string + var nullable, key, defaultValue, extra sql.NullString + if err := rows.Scan(&columnName, &columnType, &nullable, &key, &defaultValue, &extra); err != nil { + rows.Close() + return err + } + columns = append(columns, searchColumn{name: columnName, dataType: columnType}) + } + if err := rows.Err(); err != nil { + rows.Close() + return err + } + rows.Close() + return writer.ensureColumns(ctx, qualified, table, primaryKeys, columns) + } + if len(primaryKeys) == 0 { + return fmt.Errorf("search table %s must have a primary key", table.Name) + } + + columns := writer.desiredColumns(table) + definitions := make([]string, len(columns)) + for i, column := range columns { + definitions[i] = quoteIdentifier(column.name) + " " + column.dataType + } + _, err = writer.duckdb.ExecContext(ctx, "CREATE TABLE "+qualified+" ("+strings.Join(definitions, ", ")+")") + if err != nil { + return fmt.Errorf("failed to create Search table %s: %w", table.Name, err) + } + return nil +} + +func (writer *SearchWriter) ensureColumns(ctx context.Context, qualified string, table SearchTableConfig, primaryKeys []string, existing []searchColumn) error { + desired := writer.desiredColumns(table) + if searchColumnsEqual(existing, desired) { + return nil + } + + if _, err := writer.duckdb.ExecContext(ctx, "DROP TABLE "+qualified); err != nil { + return err + } + return writer.ensureTable(ctx, table, primaryKeys) +} + +func searchColumnsEqual(left []searchColumn, right []searchColumn) bool { + if len(left) != len(right) { + return false + } + for i := range left { + if left[i].name != right[i].name || normalizeSearchType(left[i].dataType) != normalizeSearchType(right[i].dataType) { + return false + } + } + return true +} + +func (writer *SearchWriter) desiredColumns(table SearchTableConfig) []searchColumn { + columns := make([]searchColumn, 0, len(table.StoreColumns)+len(table.embeddings())*2+4) + for _, column := range table.StoreColumns { + columns = append(columns, searchColumn{name: column, dataType: "VARCHAR"}) + } + for _, embedding := range table.embeddings() { + columns = append(columns, searchColumn{name: embedding.Name, dataType: fmt.Sprintf("FLOAT[%d]", OPENAI_EMBEDDING_DIMENSIONS)}) + } + columns = append(columns, + searchColumn{name: PGSTACK_UPDATED_AT_COLUMN, dataType: "TIMESTAMPTZ"}, + searchColumn{name: PGSTACK_POSITION_COLUMN, dataType: "UBIGINT"}, + ) + for _, embedding := range table.embeddings() { + columns = append(columns, searchColumn{name: "__pgstack_" + embedding.ID, dataType: "VARCHAR"}) + } + columns = append(columns, + searchColumn{name: PGSTACK_CHUNK_INDEX_COLUMN, dataType: "UINTEGER"}, + searchColumn{name: PGSTACK_SOURCE_KEY_COLUMN, dataType: "VARCHAR"}, + ) + columns = append(columns, searchColumn{name: PGSTACK_TEXT_COLUMN, dataType: "VARCHAR"}) + return columns +} + +func normalizeSearchType(dataType string) string { + normalized := strings.ToUpper(strings.Join(strings.Fields(dataType), " ")) + if normalized == "TIMESTAMP WITH TIME ZONE" { + return "TIMESTAMPTZ" + } + return normalized +} + +func (writer *SearchWriter) dropRemovedTables(ctx context.Context) error { + rows, err := writer.duckdb.QueryContext(ctx, "SHOW TABLES FROM search_store.main") + if err != nil { + return err + } + defer rows.Close() + desired := make(map[string]bool, len(writer.tables)) + for name := range writer.tables { + desired[searchPhysicalTableName(name)] = true + } + var removed []string + for rows.Next() { + var name string + if err := rows.Scan(&name); err != nil { + return err + } + if !desired[name] { + removed = append(removed, name) + } + } + if err := rows.Err(); err != nil { + return err + } + for _, name := range removed { + if _, err := writer.duckdb.ExecContext(ctx, "DROP TABLE search_store.main."+quoteIdentifier(name)); err != nil { + return err + } + } + return nil +} + +// existingHashes loads the stored input hash for every embedding on every Lance +// chunk belonging to one source row. Apply uses the hashes to embed only changed +// inputs, and the greatest stored position to reject an older CDC mutation. +// +// Conceptually, it returns: +// +// hashes: { +// chunk 0: {embedding_hash: hash1}, +// chunk 1: {embedding_hash: hash2}, +// } +// position: greatest stored source LSN +func (writer *SearchWriter) existingHashes(ctx context.Context, table SearchTableConfig, message *ChangeMessage, values map[string]interface{}) (existingSearchRows, error) { + result := existingSearchRows{hashes: make(map[int]map[string]string)} + if len(message.Source.Pk) == 0 { + return result, fmt.Errorf("search table %s has no primary key metadata", table.Name) + } + columns := []string{quoteIdentifier(PGSTACK_CHUNK_INDEX_COLUMN), quoteIdentifier(PGSTACK_POSITION_COLUMN)} + for _, embedding := range table.embeddings() { + columns = append(columns, quoteIdentifier("__pgstack_"+embedding.ID)) + } + where, args := primaryKeyPredicate(message.Source.Pk, values) + query := "SELECT " + strings.Join(columns, ", ") + " FROM search_store.main." + quoteIdentifier(searchPhysicalTableName(table.Name)) + " WHERE " + where + rows, err := writer.duckdb.QueryContext(ctx, query, args...) + if err != nil { + return result, err + } + defer rows.Close() + for rows.Next() { + var chunkIndex int + var position uint64 + hashes := make([]sql.NullString, len(table.embeddings())) + destinations := make([]interface{}, 0, len(hashes)+2) + destinations = append(destinations, &chunkIndex, &position) + for i := range hashes { + destinations = append(destinations, &hashes[i]) + } + if err := rows.Scan(destinations...); err != nil { + return result, err + } + chunkHashes := make(map[string]string, len(hashes)) + for i, hash := range hashes { + if hash.Valid { + chunkHashes[table.embeddings()[i].ID] = hash.String + } + } + result.hashes[chunkIndex] = chunkHashes + result.position = max(result.position, position) + } + return result, rows.Err() +} + +func (writer *SearchWriter) deleteStaleChunks(ctx context.Context, table SearchTableConfig, message *ChangeMessage, values map[string]interface{}, chunkCount int) error { + _, args := primaryKeyPredicate(message.Source.Pk, values) + args = append(args, chunkCount, message.Source.Lsn) + qualified := "search_store.main." + quoteIdentifier(searchPhysicalTableName(table.Name)) + query := searchMergeDeleteQuery(qualified, message.Source.Pk, true) + _, err := writer.duckdb.ExecContext(ctx, query, args...) + return err +} + +// applyRow persists one physical Lance chunk. It truncates or deletes for those +// CDC operations, updates an existing chunk (including only changed embeddings), +// or inserts a new chunk. Position guards prevent stale CDC data from winning. +func (writer *SearchWriter) applyRow(ctx context.Context, row *searchRow) error { + qualified := "search_store.main." + quoteIdentifier(searchPhysicalTableName(row.table.Name)) + if row.message.Op == OPERATION_TRUNCATE { + _, err := writer.duckdb.ExecContext(ctx, "TRUNCATE TABLE "+qualified) + return err + } + if row.message.Op == OPERATION_DELETE { + _, primaryArgs := primaryKeyPredicate(row.message.Source.Pk, row.values) + args := append(primaryArgs, row.message.Source.Lsn) + _, err := writer.duckdb.ExecContext(ctx, searchMergeDeleteQuery(qualified, row.message.Source.Pk, false), args...) + return err + } + + if row.existing { + args := make([]interface{}, 0, len(row.table.StoreColumns)+len(row.changedEmbeddings)*2+4) + for _, column := range row.table.StoreColumns { + args = append(args, searchStoredValue(row.values[column])) + } + args = append(args, row.text) + for _, embedding := range row.changedEmbeddings { + args = append(args, searchEmbeddingValue(row, embedding.ID), searchEmbeddingHashValue(row, embedding.ID)) + } + args = append(args, searchSourceKey(row.message.Source.Pk, row.values), time.UnixMicro(row.message.Source.TsUs), row.message.Source.Lsn) + args = append(args, row.chunkIndex) + query := searchMergeUpdateQuery(qualified, row.table, row.changedEmbeddings, row.message.Source.Pk, OPENAI_EMBEDDING_DIMENSIONS) + _, err := writer.duckdb.ExecContext(ctx, query, args...) + return err + } + + columns := make([]string, 0, len(row.table.StoreColumns)+len(row.table.embeddings())*2+4) + args := make([]interface{}, 0, cap(columns)) + for _, column := range row.table.StoreColumns { + columns = append(columns, quoteIdentifier(column)) + args = append(args, searchStoredValue(row.values[column])) + } + columns = append(columns, quoteIdentifier(PGSTACK_TEXT_COLUMN)) + args = append(args, row.text) + for _, embedding := range row.table.embeddings() { + columns = append(columns, quoteIdentifier(embedding.Name)) + args = append(args, searchEmbeddingValue(row, embedding.ID)) + } + columns = append(columns, + quoteIdentifier(PGSTACK_CHUNK_INDEX_COLUMN), + quoteIdentifier(PGSTACK_SOURCE_KEY_COLUMN), + quoteIdentifier(PGSTACK_UPDATED_AT_COLUMN), + quoteIdentifier(PGSTACK_POSITION_COLUMN), + ) + args = append(args, row.chunkIndex, searchSourceKey(row.message.Source.Pk, row.values), time.UnixMicro(row.message.Source.TsUs), row.message.Source.Lsn) + for _, embedding := range row.table.embeddings() { + columns = append(columns, quoteIdentifier("__pgstack_"+embedding.ID)) + args = append(args, searchEmbeddingHashValue(row, embedding.ID)) + } + placeholders := make([]string, len(columns)) + for i := range placeholders { + placeholders[i] = "?" + } + _, err := writer.duckdb.ExecContext(ctx, "INSERT INTO "+qualified+" ("+strings.Join(columns, ", ")+") VALUES ("+strings.Join(placeholders, ", ")+")", args...) + return err +} + +func searchEmbeddingValue(row *searchRow, embeddingID string) interface{} { + vector, ok := row.vectors[embeddingID] + if !ok { + return nil + } + return vector +} + +func searchEmbeddingHashValue(row *searchRow, embeddingID string) interface{} { + hash, ok := row.hashes[embeddingID] + if !ok { + return nil + } + return hash +} + +func (writer *SearchWriter) embeddingHash(embedding searchEmbeddingConfig, input string) string { + fingerprint := fmt.Sprintf("%s\x00%s\x00%d\x00%d\x00%s", OPENAI_EMBEDDING_MODEL, embedding.ID, OPENAI_EMBEDDING_DIMENSIONS, SEARCH_INPUT_FORMAT_VERSION, strings.Join(embedding.Columns, "\x00")) + sum := sha256.Sum256([]byte(fingerprint + "\x00" + input)) + return hex.EncodeToString(sum[:]) +} + +func searchEmbeddingInput(embedding searchEmbeddingConfig, values map[string]interface{}) string { + parts := make([]string, 0, len(embedding.Columns)) + for _, column := range embedding.Columns { + encoded, _ := json.Marshal(values[column]) + parts = append(parts, column+":"+string(encoded)) + } + return strings.Join(parts, "\n") +} + +func chunkEmbeddingInput(input string) []string { + if len(input) <= EMBEDDING_MAX_INPUT_BYTES { + return []string{input} + } + + chunks := make([]string, 0, len(input)/EMBEDDING_MAX_INPUT_BYTES+1) + for start := 0; start < len(input); { + end := min(start+EMBEDDING_MAX_INPUT_BYTES, len(input)) + for end > start && !utf8.ValidString(input[start:end]) { + end-- + } + if end == start { + _, size := utf8.DecodeRuneInString(input[start:]) + end = start + size + } + chunks = append(chunks, input[start:end]) + if end == len(input) { + break + } + + start = max(start+1, end-SEARCH_CHUNK_OVERLAP_BYTES) + for start < end && !utf8.RuneStart(input[start]) { + start++ + } + } + return chunks +} + +func searchSourceKey(primaryKeys []string, values map[string]interface{}) string { + hash := sha256.New() + for _, column := range primaryKeys { + hash.Write([]byte(column)) + hash.Write([]byte{0}) + encoded, _ := json.Marshal(values[column]) + hash.Write(encoded) + hash.Write([]byte{0}) + } + return hex.EncodeToString(hash.Sum(nil)) +} + +func searchKeywordInput(table SearchTableConfig, values map[string]interface{}) string { + parts := make([]string, 0, len(table.IndexColumns)) + for _, column := range table.IndexColumns { + if value := searchStoredValue(values[column]); value != nil { + parts = append(parts, fmt.Sprint(value)) + } + } + return strings.Join(parts, "\n") +} + +func searchStoredValue(value interface{}) interface{} { + if value == nil { + return nil + } + switch typed := value.(type) { + case string: + return typed + case json.Number: + return typed.String() + default: + encoded, _ := json.Marshal(value) + return string(encoded) + } +} + +func primaryKeyPredicate(columns []string, values map[string]interface{}) (string, []interface{}) { + predicates := make([]string, len(columns)) + args := make([]interface{}, len(columns)) + for i, column := range columns { + predicates[i] = quoteIdentifier(column) + " = ?" + args[i] = searchStoredValue(values[column]) + } + return strings.Join(predicates, " AND "), args +} + +// searchMergeDeleteQuery uses MERGE for predicate deletes because the bundled +// Lance extension can apply DELETE FROM predicates as an unfiltered delete. +func searchMergeDeleteQuery(qualified string, primaryKeys []string, staleChunksOnly bool) string { + sourceColumns := make([]string, 0, len(primaryKeys)+2) + conditions := make([]string, 0, len(primaryKeys)+2) + for _, column := range primaryKeys { + quoted := quoteIdentifier(column) + sourceColumns = append(sourceColumns, "?::VARCHAR AS "+quoted) + conditions = append(conditions, "target."+quoted+" = source."+quoted) + } + if staleChunksOnly { + quoted := quoteIdentifier(PGSTACK_CHUNK_INDEX_COLUMN) + sourceColumns = append(sourceColumns, "?::UINTEGER AS "+quoted) + conditions = append(conditions, "target."+quoted+" >= source."+quoted) + } + quotedPosition := quoteIdentifier(PGSTACK_POSITION_COLUMN) + sourceColumns = append(sourceColumns, "?::UBIGINT AS "+quotedPosition) + conditions = append(conditions, "target."+quotedPosition+" <= source."+quotedPosition) + + return "MERGE INTO " + qualified + " AS target USING (SELECT " + strings.Join(sourceColumns, ", ") + + ") AS source ON " + strings.Join(conditions, " AND ") + " WHEN MATCHED THEN DELETE" +} + +// searchMergeUpdateQuery uses MERGE because Lance UPDATE cannot execute plans +// where DuckDB leaves one or more predicates as pushed table filters. MERGE +// applies the same primary-key, chunk, and source-position guards in its join. +func searchMergeUpdateQuery(qualified string, table SearchTableConfig, changedEmbeddings []searchEmbeddingConfig, primaryKeys []string, embeddingDimensions int) string { + sourceColumns := make([]string, 0, len(table.StoreColumns)+len(changedEmbeddings)*2+4) + sets := make([]string, 0, len(table.StoreColumns)+len(changedEmbeddings)*2+3) + addSet := func(column string, dataType string) { + quoted := quoteIdentifier(column) + sourceColumns = append(sourceColumns, "?::"+dataType+" AS "+quoted) + sets = append(sets, quoted+" = source."+quoted) + } + for _, column := range table.StoreColumns { + addSet(column, "VARCHAR") + } + addSet(PGSTACK_TEXT_COLUMN, "VARCHAR") + for _, embedding := range changedEmbeddings { + addSet(embedding.Name, fmt.Sprintf("FLOAT[%d]", embeddingDimensions)) + addSet("__pgstack_"+embedding.ID, "VARCHAR") + } + addSet(PGSTACK_SOURCE_KEY_COLUMN, "VARCHAR") + addSet(PGSTACK_UPDATED_AT_COLUMN, "TIMESTAMPTZ") + addSet(PGSTACK_POSITION_COLUMN, "UBIGINT") + + conditions := make([]string, 0, len(primaryKeys)+2) + for _, column := range primaryKeys { + quoted := quoteIdentifier(column) + conditions = append(conditions, "target."+quoted+" = source."+quoted) + } + quotedChunk := quoteIdentifier(PGSTACK_CHUNK_INDEX_COLUMN) + quotedPosition := quoteIdentifier(PGSTACK_POSITION_COLUMN) + sourceColumns = append(sourceColumns, "?::UINTEGER AS "+quotedChunk) + conditions = append(conditions, + "target."+quotedChunk+" = source."+quotedChunk, + "target."+quotedPosition+" <= source."+quotedPosition, + ) + + return "MERGE INTO " + qualified + " AS target USING (SELECT " + strings.Join(sourceColumns, ", ") + + ") AS source ON " + strings.Join(conditions, " AND ") + " WHEN MATCHED THEN UPDATE SET " + strings.Join(sets, ", ") +} + +func searchPhysicalTableName(schemaTable string) string { + return strings.ReplaceAll(schemaTable, ".", "_") +} + +func quoteIdentifier(value string) string { + return `"` + strings.ReplaceAll(value, `"`, `""`) + `"` +} diff --git a/processor/search_writer_test.go b/processor/search_writer_test.go new file mode 100644 index 0000000..37835bc --- /dev/null +++ b/processor/search_writer_test.go @@ -0,0 +1,320 @@ +package main + +import ( + "context" + "database/sql" + "fmt" + "reflect" + "strings" + "testing" + "time" + "unicode/utf8" +) + +func TestSearchPhysicalTableName(t *testing.T) { + if got := searchPhysicalTableName("public.documents"); got != "public_documents" { + t.Fatalf("unexpected physical table name: %s", got) + } +} + +func TestSearchDatasetAndIndexNames(t *testing.T) { + writer := &SearchWriter{config: &Config{S3Bucket: "bucket", SearchBasePath: "/org/project/search/"}} + table := SearchTableConfig{Name: "public.documents"} + if got := writer.searchDatasetPath(table); got != "s3://bucket/org/project/search/public_documents.lance" { + t.Fatalf("unexpected Search dataset path: %s", got) + } + if got := vectorIndexName("default"); got != "__pgstack_vector_default_idx" { + t.Fatalf("unexpected Search index name: %s", got) + } +} + +func TestSearchMaintenanceDue(t *testing.T) { + now := time.Date(2026, time.August, 27, 12, 0, 0, 0, time.UTC) + if !searchMaintenanceDue(time.Time{}, now) { + t.Fatal("expected the first maintenance to be due") + } + if searchMaintenanceDue(now.Add(-SEARCH_MAINTENANCE_INTERVAL+time.Second), now) { + t.Fatal("expected maintenance within the interval to be skipped") + } + if !searchMaintenanceDue(now.Add(-SEARCH_MAINTENANCE_INTERVAL), now) { + t.Fatal("expected maintenance at the interval boundary to be due") + } +} + +func TestChunkEmbeddingInputPreservesLongUTF8Input(t *testing.T) { + input := strings.Repeat("é", EMBEDDING_MAX_INPUT_BYTES/2+100) + chunks := chunkEmbeddingInput(input) + if len(chunks) < 2 { + t.Fatalf("expected multiple chunks, got %d", len(chunks)) + } + for _, chunk := range chunks { + if len(chunk) > EMBEDDING_MAX_INPUT_BYTES { + t.Fatalf("chunk exceeds byte limit: %d", len(chunk)) + } + if !utf8.ValidString(chunk) { + t.Fatalf("chunk is not valid UTF-8") + } + } + withoutOverlap := chunks[0] + chunks[1][min(SEARCH_CHUNK_OVERLAP_BYTES, len(chunks[1])):] + if withoutOverlap != input { + t.Fatal("chunking lost input content") + } +} + +func TestEmbeddingBatchEndHonorsByteBudget(t *testing.T) { + inputs := make([]string, 100) + for i := range inputs { + inputs[i] = strings.Repeat("c", EMBEDDING_MAX_INPUT_BYTES) + } + end, err := embeddingBatchEnd(inputs, 0) + if err != nil { + t.Fatal(err) + } + if end != EMBEDDING_BATCH_MAX_INPUT_BYTES/EMBEDDING_MAX_INPUT_BYTES { + t.Fatalf("unexpected byte-budgeted batch end: %d", end) + } +} + +func TestSearchMergeDeleteQuery(t *testing.T) { + qualified := `search_store.main."public_documents"` + query := searchMergeDeleteQuery(qualified, []string{"tenant_id", "id"}, true) + for _, expected := range []string{ + `MERGE INTO search_store.main."public_documents" AS target`, + `?::VARCHAR AS "tenant_id"`, + `target."tenant_id" = source."tenant_id"`, + `target."id" = source."id"`, + `target."__pgstack_chunk_index" >= source."__pgstack_chunk_index"`, + `target."__pgstack_position" <= source."__pgstack_position"`, + `WHEN MATCHED THEN DELETE`, + } { + if !strings.Contains(query, expected) { + t.Fatalf("expected %q in MERGE delete query: %s", expected, query) + } + } +} + +func TestSearchMergeUpdateQuery(t *testing.T) { + qualified := `search_store.main."public_documents"` + table := SearchTableConfig{ + StoreColumns: []string{"tenant_id", "id", "body"}, + } + changedEmbeddings := []searchEmbeddingConfig{{ID: "default", Name: "embedding"}} + query := searchMergeUpdateQuery(qualified, table, changedEmbeddings, []string{"tenant_id", "id"}, 1536) + for _, expected := range []string{ + `MERGE INTO search_store.main."public_documents" AS target`, + `?::VARCHAR AS "tenant_id"`, + `?::FLOAT[1536] AS "embedding"`, + `"embedding" = source."embedding"`, + `"__pgstack_default" = source."__pgstack_default"`, + `target."tenant_id" = source."tenant_id"`, + `target."id" = source."id"`, + `target."__pgstack_chunk_index" = source."__pgstack_chunk_index"`, + `target."__pgstack_position" <= source."__pgstack_position"`, + `WHEN MATCHED THEN UPDATE SET`, + } { + if !strings.Contains(query, expected) { + t.Fatalf("expected %q in MERGE update query: %s", expected, query) + } + } +} + +func TestSearchColumnsPutMetadataLast(t *testing.T) { + writer := &SearchWriter{config: &Config{}} + columns := writer.desiredColumns(SearchTableConfig{ + StoreColumns: []string{"id", "body"}, + IndexColumns: []string{"body"}, + }) + names := make([]string, len(columns)) + for i, column := range columns { + names[i] = column.name + } + want := []string{"id", "body", "__pgstack_embedding", "__pgstack_updated_at", "__pgstack_position", "__pgstack_embedding_hash", "__pgstack_chunk_index", "__pgstack_source_key", "__pgstack_text"} + if !reflect.DeepEqual(names, want) { + t.Fatalf("unexpected Search column order: %#v", names) + } + if columns[2].dataType != "FLOAT[1536]" { + t.Fatalf("unexpected embedding type: %s", columns[2].dataType) + } +} + +func TestSearchSourceKeyUsesPrimaryKeyColumns(t *testing.T) { + values := map[string]interface{}{"id": "1", "tenant_id": "2", "body": "ignored"} + original := searchSourceKey([]string{"tenant_id", "id"}, values) + values["body"] = "updated" + if original != searchSourceKey([]string{"tenant_id", "id"}, values) { + t.Fatal("non-primary-key change affected source key") + } + values["id"] = "3" + if original == searchSourceKey([]string{"tenant_id", "id"}, values) { + t.Fatal("primary-key change did not affect source key") + } +} + +func TestEmbeddingHashChangesWithSettingsAndInput(t *testing.T) { + embedding := searchEmbeddingConfig{ID: "id", Columns: []string{"body"}} + writer := &SearchWriter{config: &Config{}} + original := writer.embeddingHash(embedding, "body:\"hello\"") + if original == writer.embeddingHash(embedding, "body:\"updated\"") { + t.Fatal("input change did not change embedding hash") + } + embedding.Columns = []string{"title"} + if original == writer.embeddingHash(embedding, "body:\"hello\"") { + t.Fatal("embedding settings change did not change embedding hash") + } +} + +func TestSearchWriterConsumesIndexColumnsAPI(t *testing.T) { + writer, err := NewSearchWriter(&Config{OpenAIAPIKey: "test", SearchTablesJSON: `[{"name":"public.documents","indexColumns":["title","body"],"storeColumns":["id","title"]}]`}) + if err != nil { + t.Fatal(err) + } + table := writer.tables["public.documents"] + embeddings := table.embeddings() + if len(embeddings) != 1 || embeddings[0].Name != "__pgstack_embedding" { + t.Fatalf("unexpected managed index: %#v", embeddings) + } + input := searchEmbeddingInput(embeddings[0], map[string]interface{}{"title": "Jacket", "body": "Waterproof", "id": "ignored"}) + if input != "title:\"Jacket\"\nbody:\"Waterproof\"" { + t.Fatalf("unexpected indexed input: %s", input) + } + for _, config := range []string{ + `[{"name":"public.documents","storeColumns":["id"]}]`, + `[{"name":"public.documents","indexColumns":["body","body"],"storeColumns":["id"]}]`, + `[{"name":"public.documents","indexColumns":["__pgstack_embedding"],"storeColumns":["id"]}]`, + } { + if _, err := NewSearchWriter(&Config{OpenAIAPIKey: "test", SearchTablesJSON: config}); err == nil { + t.Fatalf("expected invalid configuration: %s", config) + } + } +} + +func TestSearchKeywordInputUsesValuesOnly(t *testing.T) { + table := SearchTableConfig{IndexColumns: []string{"title", "body", "optional", "count"}, StoreColumns: []string{"id"}} + input := searchKeywordInput(table, map[string]interface{}{"title": "Rain jacket", "body": "Waterproof gear", "count": 42, "id": "ignored"}) + if input != "Rain jacket\nWaterproof gear\n42" { + t.Fatalf("unexpected full-text input: %q", input) + } +} + +func TestSearchTextPersistence(t *testing.T) { + db, err := sql.Open("duckdb", "") + if err != nil { + t.Fatal(err) + } + t.Cleanup(func() { _ = db.Close() }) + db.SetMaxOpenConns(1) + ctx := context.Background() + if _, err := db.ExecContext(ctx, "ATTACH ':memory:' AS search_store"); err != nil { + t.Fatal(err) + } + writer := &SearchWriter{config: &Config{}, duckdb: &DuckDBClient{db: db, config: &Config{}}} + table := SearchTableConfig{Name: "public.documents", StoreColumns: []string{"id"}, IndexColumns: []string{"body"}} + if err := writer.ensureTable(ctx, table, []string{"id"}); err != nil { + t.Fatal(err) + } + vector := make([]float32, OPENAI_EMBEDDING_DIMENSIONS) + vector[0] = 1 + row := &searchRow{table: table, message: &ChangeMessage{Op: OPERATION_CREATE, Source: SourceMetadata{Pk: []string{"id"}, Lsn: 1}}, values: map[string]interface{}{"id": "1"}, text: "rain jacket", vectors: map[string][]float32{"embedding_hash": vector}, hashes: map[string]string{"embedding_hash": "unchanged"}} + if err := writer.applyRow(ctx, row); err != nil { + t.Fatal(err) + } + var count int + var text sql.NullString + if err := db.QueryRowContext(ctx, "SELECT __pgstack_text FROM search_store.main.public_documents").Scan(&text); err != nil || text.String != "rain jacket" { + t.Fatalf("insert did not persist indexed text: %v %v", text, err) + } + // Update text while retaining the existing embedding and its hash. + row.existing = true + row.message.Op = OPERATION_UPDATE + row.message.Source.Lsn = 2 + row.text = "waterproof coat" + if err := writer.applyRow(ctx, row); err != nil { + t.Fatal(err) + } + var hash string + if err := db.QueryRowContext(ctx, "SELECT __pgstack_text, __pgstack_embedding_hash FROM search_store.main.public_documents").Scan(&text, &hash); err != nil || text.String != "waterproof coat" || hash != "unchanged" { + t.Fatalf("text update changed embedding or failed: %v %s %v", text, hash, err) + } + row.message.Source.Lsn = 1 + row.text = "stale text" + if err := writer.applyRow(ctx, row); err != nil { + t.Fatal(err) + } + if err := db.QueryRowContext(ctx, "SELECT __pgstack_text FROM search_store.main.public_documents").Scan(&text); err != nil || text.String != "waterproof coat" { + t.Fatalf("stale text replaced current data: %v %v", text, err) + } + row.message.Op = OPERATION_DELETE + row.message.Source.Lsn = 3 + if err := writer.applyRow(ctx, row); err != nil { + t.Fatal(err) + } + if err := db.QueryRowContext(ctx, "SELECT count(*) FROM search_store.main.public_documents").Scan(&count); err != nil || count != 0 { + t.Fatalf("delete retained text: %d %v", count, err) + } +} + +func TestKeywordOnlySearchWithoutEmbeddingKey(t *testing.T) { + writer, err := NewSearchWriter(&Config{SearchTablesJSON: `[{"name":"public.documents","indexColumns":["body"],"storeColumns":["id","body"],"keywordOnly":true}]`}) + if err != nil { + t.Fatal(err) + } + if writer.embeddings != nil { + t.Fatal("keyword-only indexing must not initialize an embedding client") + } + table := writer.tables["public.documents"] + for _, column := range writer.desiredColumns(table) { + if strings.Contains(column.name, "embedding") { + t.Fatal("unexpected vector column", column.name) + } + } + if got := searchKeywordInput(table, map[string]interface{}{"body": "rain jacket"}); got != "rain jacket" { + t.Fatal(got) + } + if _, err := NewSearchWriter(&Config{SearchTablesJSON: `[{"name":"public.documents","indexColumns":["body"],"storeColumns":["id"]}]`}); err == nil { + t.Fatal("semantic indexing must still require credentials") + } +} + +// Exercise the exact production DDL against Lance's custom parser. DuckDB's +// normal quoted-identifier rules do not apply to these index statements. +func TestSearchIndexDDLWithLance(t *testing.T) { + db, err := sql.Open("duckdb", "") + if err != nil { + t.Fatal(err) + } + t.Cleanup(func() { _ = db.Close() }) + db.SetMaxOpenConns(1) + ctx := context.Background() + if _, err := db.ExecContext(ctx, "LOAD lance"); err != nil { + t.Skipf("Lance extension unavailable: %v", err) + } + datasetPath := t.TempDir() + "/documents.lance" + query := fmt.Sprintf("COPY (SELECT 'rain jacket' AS %s, [1.0,0.0]::FLOAT[2] AS __pgstack_embedding UNION ALL SELECT 'sun hat', [0.0,1.0]::FLOAT[2]) TO '%s' (FORMAT lance, MODE overwrite)", PGSTACK_TEXT_COLUMN, escapeSQLString(datasetPath)) + if _, err := db.ExecContext(ctx, query); err != nil { + t.Fatal(err) + } + embedding := SearchTableConfig{IndexColumns: []string{"body"}}.embeddings()[0] + for _, query := range []string{searchTextIndexQuery(datasetPath), searchVectorIndexQuery(datasetPath, embedding, 1)} { + if _, err := db.ExecContext(ctx, query); err != nil { + t.Fatalf("%s: %v", query, err) + } + } + writer := &SearchWriter{duckdb: &DuckDBClient{db: db}} + indices, err := writer.vectorIndexes(ctx, datasetPath) + if err != nil { + t.Fatal(err) + } + for _, name := range []string{PGSTACK_TEXT_INDEX, vectorIndexName(embedding.ID)} { + if !indices[name] { + t.Fatalf("missing index %s: %v", name, indices) + } + query := searchOptimizeIndexQuery(name, datasetPath) + if err := writer.executeLanceMaintenance(ctx, query); err != nil { + t.Fatalf("%s: %v", query, err) + } + } + var count int + if err := db.QueryRowContext(ctx, "SELECT count(*) FROM lance_fts('"+escapeSQLString(datasetPath)+"', '"+PGSTACK_TEXT_COLUMN+"', 'rain')").Scan(&count); err != nil || count != 1 { + t.Fatalf("text index search: count=%d, error=%v", count, err) + } +} diff --git a/processor/stitcher.go b/processor/stitcher.go new file mode 100644 index 0000000..1862fa2 --- /dev/null +++ b/processor/stitcher.go @@ -0,0 +1,243 @@ +package main + +import ( + "encoding/base64" + "encoding/json" + "fmt" + "sort" + + "github.com/nats-io/nats.go/jetstream" +) + +const ( + MESSAGE_PREFIX_CONTEXT = "_bemi" +) + +type FetchedRecord struct { + Message *ChangeMessage + NatsMsg jetstream.Msg + StreamSequence uint64 + Subject string + MessagePrefix string + IsContextMsg bool + IsMutation bool +} + +type MessageBuffer struct { + // Map: subject -> transactionId -> list of FetchedRecords + store map[string]map[uint32][]*FetchedRecord +} + +type StitchResult struct { + StitchedRecords []*FetchedRecord + Buffer *MessageBuffer + AckMessages []jetstream.Msg + AckStreamSequence uint64 +} + +func NewMessageBuffer() *MessageBuffer { + return &MessageBuffer{ + store: make(map[string]map[uint32][]*FetchedRecord), + } +} + +func (mb *MessageBuffer) Add(record *FetchedRecord) { + subject := record.Subject + txId := record.Message.Source.TxId + + if mb.store[subject] == nil { + mb.store[subject] = make(map[uint32][]*FetchedRecord) + } + + mb.store[subject][txId] = append(mb.store[subject][txId], record) +} + +func (mb *MessageBuffer) GetByTransaction(subject string, txId uint32) []*FetchedRecord { + if mb.store[subject] == nil { + return nil + } + return mb.store[subject][txId] +} + +func (mb *MessageBuffer) Size() int { + total := 0 + for _, txMap := range mb.store { + for _, records := range txMap { + total += len(records) + } + } + return total +} + +// ForEach iterates over all records grouped by subject, sorted by transactionId and streamSequence. +func (mb *MessageBuffer) ForEach(callback func(subject string, records []*FetchedRecord)) { + for subject, txMap := range mb.store { + var allRecords []*FetchedRecord + for _, records := range txMap { + allRecords = append(allRecords, records...) + } + + sort.Slice(allRecords, func(i, j int) bool { + if allRecords[i].Message.Source.TxId != allRecords[j].Message.Source.TxId { + return allRecords[i].Message.Source.TxId < allRecords[j].Message.Source.TxId + } + return allRecords[i].StreamSequence < allRecords[j].StreamSequence + }) + + callback(subject, allRecords) + } +} + +func NewFetchedRecord(config *Config, msg *ChangeMessage, natsMsg jetstream.Msg, subject string) *FetchedRecord { + record := &FetchedRecord{ + Message: msg, + NatsMsg: natsMsg, + Subject: subject, + } + + // Get metadata + metadata, err := natsMsg.Metadata() + if err != nil { + LogError(config, "Failed to get message metadata:", err) + return record + } + record.StreamSequence = metadata.Sequence.Stream + + // Determine message type + if msg.Message != nil { + record.MessagePrefix = msg.Message.Prefix + if msg.Message.Prefix == MESSAGE_PREFIX_CONTEXT { + record.IsContextMsg = true + } + } + + // Check if it's a mutation (c/u/d/t operations create data changes) + if msg.Op == OPERATION_CREATE || msg.Op == OPERATION_UPDATE || msg.Op == OPERATION_DELETE || msg.Op == OPERATION_TRUNCATE { + record.IsMutation = true + } + + return record +} + +// ParseContext extracts context from a context message +func ParseContext(config *Config, msg *ChangeMessage) map[string]interface{} { + if msg.Message == nil || msg.Message.Prefix != MESSAGE_PREFIX_CONTEXT { + return nil + } + + content := []byte(msg.Message.Content) + decoded, err := base64.StdEncoding.DecodeString(msg.Message.Content) + if err == nil { + content = decoded + } + + var context map[string]interface{} + if err := json.Unmarshal(content, &context); err != nil { + LogWarn(config, fmt.Sprintf( + "Failed to parse context JSON: %v (content_bytes=%d, base64_decoded=%t)", + err, + len(content), + decoded != nil, + )) + return nil + } + + return context +} + +// StitchMessages processes a batch of messages with context stitching and buffering +func StitchMessages(config *Config, batch *MessageBatch, buffer *MessageBuffer) *StitchResult { + // Convert batch to FetchedRecords and add to buffer + for i, msg := range batch.Messages { + natsMsg := batch.NatsMsg[i] + record := NewFetchedRecord(config, msg, natsMsg, natsMsg.Subject()) + buffer.Add(record) + } + + stitched := []*FetchedRecord{} + newBuffer := NewMessageBuffer() + ackMessages := []jetstream.Msg{} + ackedSequences := make(map[uint64]bool) + maxAckSequence := uint64(0) + + addAck := func(record *FetchedRecord) { + if record == nil || record.NatsMsg == nil || ackedSequences[record.StreamSequence] { + return + } + ackedSequences[record.StreamSequence] = true + ackMessages = append(ackMessages, record.NatsMsg) + if record.StreamSequence > maxAckSequence { + maxAckSequence = record.StreamSequence + } + } + + buffer.ForEach(func(subject string, records []*FetchedRecord) { + if len(records) == 0 { + return + } + + for idx, record := range records { + txId := record.Message.Source.TxId + sameTransactionRecords := buffer.GetByTransaction(subject, txId) + var contextRecord *FetchedRecord + + for _, r := range sameTransactionRecords { + if r.IsContextMsg { + contextRecord = r + break + } + } + + // Keep only the current subject tail in the buffer. If its pair does + // not arrive in the next non-empty batch, a later record will push it + // out and it will be processed/acked without context. + isLastMessage := idx == len(records)-1 + isUnpairedMutation := record.IsMutation && contextRecord == nil + isUnpairedContext := record.IsContextMsg + + if isLastMessage && (isUnpairedMutation || isUnpairedContext) && len(sameTransactionRecords) == 1 { + newBuffer.Add(record) + if record.NatsMsg != nil { + if err := record.NatsMsg.InProgress(); err != nil { + LogError(config, "Failed to mark buffered message in progress:", err) + } + } + continue + } + + if record.IsContextMsg { + addAck(record) + continue + } + + if record.IsMutation { + if contextRecord != nil { + record.Message.Context = ParseContext(config, contextRecord.Message) + addAck(contextRecord) + } + stitched = append(stitched, record) + addAck(record) + continue + } + + // Non-mutation messages are intentionally ignored, but still acked. + addAck(record) + } + }) + + LogDebug(config, fmt.Sprintf( + "Stitching: fetched=%d, stitched=%d, buffered=%d, ack_count=%d, max_ack_seq=%d", + len(batch.Messages), + len(stitched), + newBuffer.Size(), + len(ackMessages), + maxAckSequence, + )) + + return &StitchResult{ + StitchedRecords: stitched, + Buffer: newBuffer, + AckMessages: ackMessages, + AckStreamSequence: maxAckSequence, + } +} diff --git a/processor/stitcher_test.go b/processor/stitcher_test.go new file mode 100644 index 0000000..a13de09 --- /dev/null +++ b/processor/stitcher_test.go @@ -0,0 +1,242 @@ +package main + +import ( + "context" + "encoding/base64" + "encoding/json" + "testing" + "time" + + "github.com/nats-io/nats.go" + "github.com/nats-io/nats.go/jetstream" +) + +type fakeJetStreamMsg struct { + subject string + streamSequence uint64 + acked bool + inProgress bool +} + +func (m *fakeJetStreamMsg) Metadata() (*jetstream.MsgMetadata, error) { + return &jetstream.MsgMetadata{ + Sequence: jetstream.SequencePair{Stream: m.streamSequence}, + }, nil +} + +func (m *fakeJetStreamMsg) Data() []byte { + return nil +} + +func (m *fakeJetStreamMsg) Headers() nats.Header { + return nil +} + +func (m *fakeJetStreamMsg) Subject() string { + return m.subject +} + +func (m *fakeJetStreamMsg) Reply() string { + return "" +} + +func (m *fakeJetStreamMsg) Ack() error { + m.acked = true + return nil +} + +func (m *fakeJetStreamMsg) DoubleAck(context.Context) error { + return m.Ack() +} + +func (m *fakeJetStreamMsg) Nak() error { + return nil +} + +func (m *fakeJetStreamMsg) NakWithDelay(time.Duration) error { + return nil +} + +func (m *fakeJetStreamMsg) InProgress() error { + m.inProgress = true + return nil +} + +func (m *fakeJetStreamMsg) Term() error { + return nil +} + +func (m *fakeJetStreamMsg) TermWithReason(string) error { + return nil +} + +func TestStitchMessagesBuffersMutationUntilContextArrives(t *testing.T) { + mutationMsg := &fakeJetStreamMsg{subject: "cdc.project.pipeline", streamSequence: 10} + buffer := NewMessageBuffer() + + firstResult := StitchMessages(quietTestConfig(), &MessageBatch{ + Messages: []*ChangeMessage{changeMessage(1, OPERATION_CREATE)}, + NatsMsg: []jetstream.Msg{mutationMsg}, + }, buffer) + + if len(firstResult.StitchedRecords) != 0 { + t.Fatalf("expected no stitched records, got %d", len(firstResult.StitchedRecords)) + } + if firstResult.Buffer.Size() != 1 { + t.Fatalf("expected one buffered record, got %d", firstResult.Buffer.Size()) + } + if len(firstResult.AckMessages) != 0 { + t.Fatalf("expected no ackable messages, got %d", len(firstResult.AckMessages)) + } + if !mutationMsg.inProgress { + t.Fatal("expected buffered message to be marked in progress") + } +} + +func TestStitchMessagesStitchesBufferedMutationWhenContextArrives(t *testing.T) { + subject := "cdc.project.pipeline" + mutationMsg := &fakeJetStreamMsg{subject: subject, streamSequence: 10} + contextMsg := &fakeJetStreamMsg{subject: subject, streamSequence: 11} + buffer := NewMessageBuffer() + + firstResult := StitchMessages(quietTestConfig(), &MessageBatch{ + Messages: []*ChangeMessage{changeMessage(1, OPERATION_CREATE)}, + NatsMsg: []jetstream.Msg{mutationMsg}, + }, buffer) + + secondResult := StitchMessages(quietTestConfig(), &MessageBatch{ + Messages: []*ChangeMessage{contextMessage(1, `{"user_id":"user_123"}`)}, + NatsMsg: []jetstream.Msg{contextMsg}, + }, firstResult.Buffer) + + if secondResult.Buffer.Size() != 0 { + t.Fatalf("expected empty buffer, got %d", secondResult.Buffer.Size()) + } + if len(secondResult.StitchedRecords) != 1 { + t.Fatalf("expected one stitched record, got %d", len(secondResult.StitchedRecords)) + } + + context := secondResult.StitchedRecords[0].Message.Context + if context["user_id"] != "user_123" { + t.Fatalf("expected stitched context user_id, got %#v", context) + } + if len(secondResult.AckMessages) != 2 { + t.Fatalf("expected mutation and context messages to be ackable, got %d", len(secondResult.AckMessages)) + } + if secondResult.AckStreamSequence != 11 { + t.Fatalf("expected max ack stream sequence 11, got %d", secondResult.AckStreamSequence) + } +} + +func TestStitchMessagesReleasesBufferedMutationWithoutContextOnNextBatch(t *testing.T) { + subject := "cdc.project.pipeline" + firstMutationMsg := &fakeJetStreamMsg{subject: subject, streamSequence: 10} + secondMutationMsg := &fakeJetStreamMsg{subject: subject, streamSequence: 11} + buffer := NewMessageBuffer() + + firstResult := StitchMessages(quietTestConfig(), &MessageBatch{ + Messages: []*ChangeMessage{changeMessage(1, OPERATION_CREATE)}, + NatsMsg: []jetstream.Msg{firstMutationMsg}, + }, buffer) + + secondResult := StitchMessages(quietTestConfig(), &MessageBatch{ + Messages: []*ChangeMessage{changeMessage(2, OPERATION_CREATE)}, + NatsMsg: []jetstream.Msg{secondMutationMsg}, + }, firstResult.Buffer) + + if secondResult.Buffer.Size() != 1 { + t.Fatalf("expected newest unpaired mutation to remain buffered, got %d", secondResult.Buffer.Size()) + } + if len(secondResult.StitchedRecords) != 1 { + t.Fatalf("expected older mutation to be released, got %d stitched records", len(secondResult.StitchedRecords)) + } + if secondResult.StitchedRecords[0].Message.Context != nil { + t.Fatalf("expected released mutation to have no context, got %#v", secondResult.StitchedRecords[0].Message.Context) + } + if len(secondResult.AckMessages) != 1 { + t.Fatalf("expected only released mutation to be ackable, got %d", len(secondResult.AckMessages)) + } + if secondResult.AckStreamSequence != 10 { + t.Fatalf("expected max ack stream sequence 10, got %d", secondResult.AckStreamSequence) + } + if !secondMutationMsg.inProgress { + t.Fatal("expected newest buffered mutation to be marked in progress") + } +} + +func changeMessage(txId uint32, op string) *ChangeMessage { + return &ChangeMessage{ + After: map[string]interface{}{"id": 1}, + Op: op, + Source: SourceMetadata{ + TxId: txId, + }, + } +} + +func TestFormatPrimaryKeyValuePreservesJSONNumber(t *testing.T) { + got := formatPrimaryKeyValue(json.Number("842545207")) + if got != "842545207" { + t.Fatalf("expected integer primary key without exponent, got %q", got) + } +} + +func TestFormatPrimaryKeyValueHandlesMixedTypes(t *testing.T) { + tests := []struct { + name string + value interface{} + want string + }{ + {name: "string", value: "abc-123", want: "abc-123"}, + {name: "uuid", value: "4aa8716a-d66f-4d74-8cb2-bef3bf08957b", want: "4aa8716a-d66f-4d74-8cb2-bef3bf08957b"}, + {name: "float64", value: float64(842545207), want: "842545207"}, + {name: "bool", value: true, want: "true"}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := formatPrimaryKeyValue(tt.value); got != tt.want { + t.Fatalf("expected %q, got %q", tt.want, got) + } + }) + } +} + +func TestMessageToRowPreservesCompoundPrimaryKeyValues(t *testing.T) { + writer := &IcebergWriter{} + msg := &ChangeMessage{ + After: map[string]interface{}{ + "id": json.Number("842545207"), + "account": "4aa8716a-d66f-4d74-8cb2-bef3bf08957b", + }, + Op: OPERATION_CREATE, + Source: SourceMetadata{ + TsUs: time.Now().UnixMicro(), + Pk: []string{"id", "account"}, + }, + TsUs: time.Now().UnixMicro(), + } + + row := writer.messageToRow(msg) + if !row.PrimaryKey.Valid { + t.Fatal("expected primary key to be set") + } + + want := `["842545207","4aa8716a-d66f-4d74-8cb2-bef3bf08957b"]` + if row.PrimaryKey.String != want { + t.Fatalf("expected compound primary key %s, got %s", want, row.PrimaryKey.String) + } +} + +func contextMessage(txId uint32, content string) *ChangeMessage { + return &ChangeMessage{ + Op: OPERATION_MESSAGE, + Source: SourceMetadata{ + TxId: txId, + }, + Message: &MessagePayload{ + Prefix: MESSAGE_PREFIX_CONTEXT, + Content: base64.StdEncoding.EncodeToString([]byte(content)), + }, + } +} diff --git a/processor/storage_utils.go b/processor/storage_utils.go new file mode 100644 index 0000000..e0d22d1 --- /dev/null +++ b/processor/storage_utils.go @@ -0,0 +1,233 @@ +package main + +import ( + "bytes" + "context" + "encoding/json" + "errors" + "fmt" + "strings" + + "github.com/aws/aws-sdk-go/aws/awserr" + "github.com/linkedin/goavro" +) + +var ErrIcebergMetadataNotFound = errors.New("iceberg metadata not found") + +type StorageUtils struct { + config *Config + s3Client *S3Client +} + +func NewStorageUtils(config *Config, s3Client *S3Client) *StorageUtils { + return &StorageUtils{ + config: config, + s3Client: s3Client, + } +} + +func (utils *StorageUtils) CurrentParquetFiles(ctx context.Context, metadataKey string) ([]ParquetFileInfo, error) { + metadata, err := utils.parseMetadata(ctx, metadataKey) + if err != nil { + return nil, fmt.Errorf("failed to parse metadata: %w", err) + } + + manifestListPath, err := utils.currentManifestListPath(metadata) + if err != nil { + return nil, err + } + + manifestKey, err := utils.readManifestList(ctx, utils.s3PathToKey(manifestListPath)) + if err != nil { + return nil, err + } + + parquetFiles, err := utils.readManifestParquetFiles(ctx, manifestKey) + if err != nil { + return nil, err + } + + return parquetFiles, nil +} + +func (utils *StorageUtils) parseMetadata(ctx context.Context, metadataKey string) (*IcebergMetadata, error) { + data, err := utils.s3Client.Download(ctx, metadataKey) + if err != nil { + if awsErr, ok := err.(awserr.Error); ok && awsErr.Code() == "NoSuchKey" { + return nil, ErrIcebergMetadataNotFound + } + return nil, err + } + + var metadata IcebergMetadata + if err := json.Unmarshal(data, &metadata); err != nil { + return nil, err + } + + return &metadata, nil +} + +func (utils *StorageUtils) currentManifestListPath(metadata *IcebergMetadata) (string, error) { + if metadata == nil || len(metadata.Snapshots) == 0 { + return "", fmt.Errorf("metadata has no snapshots") + } + + snapshot := metadata.Snapshots[0] + if snapshot.ManifestList == "" { + return "", fmt.Errorf("snapshot %d has no manifest list", snapshot.SnapshotId) + } + return snapshot.ManifestList, nil +} + +func (utils *StorageUtils) readManifestList(ctx context.Context, manifestListKey string) (string, error) { + data, err := utils.s3Client.Download(ctx, manifestListKey) + if err != nil { + return "", fmt.Errorf("failed to download manifest list %s: %w", manifestListKey, err) + } + + ocfReader, err := goavro.NewOCFReader(bytes.NewReader(data)) + if err != nil { + return "", fmt.Errorf("failed to read manifest list %s: %w", manifestListKey, err) + } + + if !ocfReader.Scan() { + return "", fmt.Errorf("manifest list %s has no records", manifestListKey) + } + + record, err := ocfReader.Read() + if err != nil { + return "", fmt.Errorf("failed to decode manifest list %s: %w", manifestListKey, err) + } + + recordMap, ok := record.(map[string]interface{}) + if !ok { + return "", fmt.Errorf("unexpected manifest list record in %s", manifestListKey) + } + + manifestPath, ok := recordMap["manifest_path"].(string) + if !ok || manifestPath == "" { + return "", fmt.Errorf("manifest list %s contains invalid manifest_path", manifestListKey) + } + + return utils.s3PathToKey(manifestPath), nil +} + +func (utils *StorageUtils) readManifestParquetFiles(ctx context.Context, manifestKey string) ([]ParquetFileInfo, error) { + data, err := utils.s3Client.Download(ctx, manifestKey) + if err != nil { + return nil, fmt.Errorf("failed to download manifest %s: %w", manifestKey, err) + } + + ocfReader, err := goavro.NewOCFReader(bytes.NewReader(data)) + if err != nil { + return nil, fmt.Errorf("failed to read manifest %s: %w", manifestKey, err) + } + + var parquetFiles []ParquetFileInfo + for ocfReader.Scan() { + record, err := ocfReader.Read() + if err != nil { + return nil, fmt.Errorf("failed to decode manifest %s: %w", manifestKey, err) + } + + recordMap, ok := record.(map[string]interface{}) + if !ok { + return nil, fmt.Errorf("unexpected manifest record in %s", manifestKey) + } + + dataFile, ok := recordMap["data_file"].(map[string]interface{}) + if !ok { + return nil, fmt.Errorf("manifest %s contains invalid data_file", manifestKey) + } + + filePath, ok := dataFile["file_path"].(string) + if !ok || filePath == "" { + return nil, fmt.Errorf("manifest %s contains invalid file_path", manifestKey) + } + + parquetFiles = append(parquetFiles, ParquetFileInfo{ + Path: filePath, + Size: avroInt64(dataFile["file_size_in_bytes"]), + RecordCount: avroInt64(dataFile["record_count"]), + Stats: ParquetFileStats{ + ColumnSizes: avroInt64Map(dataFile["column_sizes"]), + ValueCounts: avroInt64Map(dataFile["value_counts"]), + NullValueCounts: avroInt64Map(dataFile["null_value_counts"]), + LowerBounds: avroBytesMap(dataFile["lower_bounds"]), + UpperBounds: avroBytesMap(dataFile["upper_bounds"]), + SplitOffsets: avroInt64Slice(dataFile["split_offsets"]), + }, + }) + } + + return parquetFiles, nil +} + +func avroInt64(value interface{}) int64 { + switch v := value.(type) { + case int: + return int64(v) + case int32: + return int64(v) + case int64: + return v + case float64: + return int64(v) + default: + return 0 + } +} + +func avroInt64Map(value interface{}) map[int]int64 { + result := make(map[int]int64) + for _, entry := range avroArray(value) { + entryMap, ok := entry.(map[string]interface{}) + if !ok { + continue + } + result[int(avroInt64(entryMap["key"]))] = avroInt64(entryMap["value"]) + } + return result +} + +func avroBytesMap(value interface{}) map[int][]byte { + result := make(map[int][]byte) + for _, entry := range avroArray(value) { + entryMap, ok := entry.(map[string]interface{}) + if !ok { + continue + } + bytesValue, ok := entryMap["value"].([]byte) + if !ok { + continue + } + result[int(avroInt64(entryMap["key"]))] = bytesValue + } + return result +} + +func avroInt64Slice(value interface{}) []int64 { + values := avroArray(value) + result := make([]int64, 0, len(values)) + for _, value := range values { + result = append(result, avroInt64(value)) + } + return result +} + +func avroArray(value interface{}) []interface{} { + unionMap, ok := value.(map[string]interface{}) + if !ok { + return nil + } + array, ok := unionMap["array"].([]interface{}) + if !ok { + return nil + } + return array +} + +func (utils *StorageUtils) s3PathToKey(s3Path string) string { + prefix := fmt.Sprintf("s3://%s/", utils.config.S3Bucket) + return strings.TrimPrefix(s3Path, prefix) +} diff --git a/scripts/build-docker.sh b/scripts/build-docker.sh deleted file mode 100755 index 8ce72cf..0000000 --- a/scripts/build-docker.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash - -VERSION=$(grep -E 'VERSION = "[^"]+"' src/common/common_config.go | sed -E 's/.*VERSION = "([^"]+)".*/\1/') -if [ -z "$VERSION" ]; then - echo "Error: Could not extract version" - exit 1 -fi - -echo "Building bemidb version $VERSION for linux/amd64" -docker buildx build --build-arg PLATFORM=linux/amd64 -t ghcr.io/bemihq/bemidb:$VERSION-amd64 . - -echo "Building bemidb version $VERSION for linux/arm64" -docker buildx build --build-arg PLATFORM=linux/arm64 -t ghcr.io/bemihq/bemidb:$VERSION-arm64 . diff --git a/scripts/catalog.sql b/scripts/catalog.sql deleted file mode 100644 index 409e14e..0000000 --- a/scripts/catalog.sql +++ /dev/null @@ -1,16 +0,0 @@ -CREATE TABLE IF NOT EXISTS iceberg_tables ( - table_namespace VARCHAR(255) NOT NULL, - table_name VARCHAR(255) NOT NULL, - metadata_location VARCHAR(1000), - columns JSONB -); - -CREATE UNIQUE INDEX IF NOT EXISTS idx_tables ON iceberg_tables (table_namespace, table_name); - -CREATE TABLE IF NOT EXISTS iceberg_materialized_views ( - schema_name VARCHAR(255) NOT NULL, - table_name VARCHAR(255) NOT NULL, - definition TEXT NOT NULL -); - -CREATE UNIQUE INDEX IF NOT EXISTS idx_materialized_views ON iceberg_materialized_views (schema_name, table_name); diff --git a/scripts/publish-docker.sh b/scripts/publish-docker.sh deleted file mode 100755 index ecad21f..0000000 --- a/scripts/publish-docker.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/bash - -VERSION=$(grep -E 'VERSION = "[^"]+"' src/common/common_config.go | sed -E 's/.*VERSION = "([^"]+)".*/\1/') -if [ -z "$VERSION" ]; then - echo "Error: Could not extract version" - exit 1 -fi - -echo "Pushing bemidb version $VERSION to ghcr.io" - -docker push ghcr.io/bemihq/bemidb:$VERSION-amd64 -docker push ghcr.io/bemihq/bemidb:$VERSION-arm64 - -docker manifest inspect ghcr.io/bemihq/bemidb:$VERSION &> /dev/null && docker manifest rm ghcr.io/bemihq/bemidb:$VERSION -docker manifest create ghcr.io/bemihq/bemidb:$VERSION ghcr.io/bemihq/bemidb:$VERSION-amd64 ghcr.io/bemihq/bemidb:$VERSION-arm64 -docker manifest annotate ghcr.io/bemihq/bemidb:$VERSION ghcr.io/bemihq/bemidb:$VERSION-amd64 --arch amd64 -docker manifest annotate ghcr.io/bemihq/bemidb:$VERSION ghcr.io/bemihq/bemidb:$VERSION-arm64 --arch arm64 -docker manifest push ghcr.io/bemihq/bemidb:$VERSION - -docker manifest inspect ghcr.io/bemihq/bemidb:latest &> /dev/null && docker manifest rm ghcr.io/bemihq/bemidb:latest -docker manifest create ghcr.io/bemihq/bemidb:latest ghcr.io/bemihq/bemidb:$VERSION-amd64 ghcr.io/bemihq/bemidb:$VERSION-arm64 -docker manifest annotate ghcr.io/bemihq/bemidb:latest ghcr.io/bemihq/bemidb:$VERSION-amd64 --arch amd64 -docker manifest annotate ghcr.io/bemihq/bemidb:latest ghcr.io/bemihq/bemidb:$VERSION-arm64 --arch arm64 -docker manifest push ghcr.io/bemihq/bemidb:latest - -echo -echo "See https://github.com/orgs/BemiHQ/packages/container/package/bemidb" diff --git a/scripts/test-data-types.sql b/scripts/test-data-types.sql deleted file mode 100644 index 85be940..0000000 --- a/scripts/test-data-types.sql +++ /dev/null @@ -1,190 +0,0 @@ --- Usage: psql postgres://127.0.0.1:5432/dbname -P pager=off -v ON_ERROR_STOP=on -f ./scripts/test-data-types.sql - -DROP TABLE IF EXISTS test_table; -DROP TYPE IF EXISTS address; - -CREATE EXTENSION IF NOT EXISTS ltree; - -CREATE TYPE address AS ( - city VARCHAR(50) -); - -CREATE TABLE test_table ( - id SERIAL PRIMARY KEY, - bit_column BIT, - bool_column BOOLEAN, - bpchar_column BPCHAR(10), - varchar_column VARCHAR(255), - text_column TEXT, - int2_column INT2, - int4_column INT4, - int8_column INT8, - hugeint_column NUMERIC(20, 0), - xid_column XID, - xid8_column XID8, - float4_column FLOAT4, - float8_column FLOAT8, - numeric_column NUMERIC(40, 2), - numeric_column_without_precision NUMERIC, - date_column DATE, - time_column TIME, - timeMsColumn TIME(3), - timetz_column TIMETZ, - timetz_ms_column TIMETZ(3), - timestamp_column TIMESTAMP, - timestamp_ms_column TIMESTAMP(3), - timestamptz_column TIMESTAMPTZ, - timestamptz_ms_column TIMESTAMPTZ(3), - uuid_column UUID, - bytea_column BYTEA, - interval_column INTERVAL, - point_column POINT, - inet_column INET, - json_column JSON, - jsonb_column JSONB, - tsvector_column TSVECTOR, - xml_column XML, - pg_snapshot_column PG_SNAPSHOT, - array_text_column TEXT[], - array_int_column INT[], - array_jsonb_column JSONB[], - array_ltree_column LTREE[], - user_defined_column address -); - -INSERT INTO test_table ( - bit_column, - bool_column, - bpchar_column, - varchar_column, - text_column, - int2_column, - int4_column, - int8_column, - hugeint_column, - xid_column, - xid8_column, - float4_column, - float8_column, - numeric_column, - numeric_column_without_precision, - date_column, - time_column, - timeMsColumn, - timetz_column, - timetz_ms_column, - timestamp_column, - timestamp_ms_column, - timestamptz_column, - timestamptz_ms_column, - uuid_column, - bytea_column, - interval_column, - point_column, - inet_column, - json_column, - jsonb_column, - tsvector_column, - xml_column, - pg_snapshot_column, - array_text_column, - array_int_column, - array_jsonb_column, - array_ltree_column, - user_defined_column -) VALUES ( - B'1', -- bit_column - TRUE, -- bool_column - 'bpchar', -- bpchar_column - 'varchar', -- varchar_column - 'text', -- text_column - 32767::INT2, -- int2_column - 2147483647::INT4, -- int4_column - 9223372036854775807::INT8, -- int8_column - 10000000000000000000, -- hugeint_column - '4294967295'::XID, -- xid_column - '18446744073709551615'::XID8, -- xid8_column - 3.14::FLOAT4, -- float4_column - 3.141592653589793::FLOAT8, -- float8_column - 12345.67::NUMERIC(10, 2), -- numeric_column - 12345.67, -- numeric_column_without_precision - '2024-01-01', -- date_column - '12:00:00.123456', -- time_column - '12:00:00.123', -- timeMsColumn - '12:00:00.123456-05', -- timetz_column - '12:00:00.123-05', -- timetz_ms_column - '2024-01-01 12:00:00.123456', -- timestamp_column - '2024-01-01 12:00:00.123', -- timestamp_ms_column - '2024-01-01 12:00:00.123456-05', -- timestamptz_column - '2024-01-01 12:00:00.123-05', -- timestamptz_ms_column - '58a7c845-af77-44b2-8664-7ca613d92f04', -- uuid_column - decode('48656c6c6f', 'hex'), -- bytea_column - '1 mon 2 days 01:00:01.000001'::INTERVAL, -- interval_column - '(1, 2)'::POINT, -- point_column - '192.168.0.1', -- inet_column - '{"key": "value"}'::JSON, -- json_column - '{"key": "value"}'::JSONB, -- jsonb_column - to_tsvector('Sample text for tsvector'), -- tsvector_column - 'text', -- xml_column - pg_current_snapshot(), -- pg_snapshot_column - '{"one", "two", "three"}', -- array_text_column - '{1, 2, 3}', -- array_int_column - '{"{\"key\": \"value1\"}", "{\"key\": \"value2\"}"}'::JSONB[], -- array_jsonb_column - '{"a.b", "c.d"}'::LTREE[], -- array_ltree_column - ROW('Toronto') -- user_defined_column -), ( - NULL, -- bit_column - FALSE, -- bool_column - '', -- bpchar_column - NULL, -- varchar_column - '', -- text_column - -32767::INT2, -- int2_column - NULL, -- int4_column - -9223372036854775807::INT8, -- int8_column - NULL, -- hugeint_column - NULL, -- xid_column - NULL, -- xid8_column - 'NaN', -- float4_column - -3.141592653589793::FLOAT8, -- float8_column - -12345.00::NUMERIC(10, 2), -- numeric_column - NULL, -- numeric_column_without_precision - '20025-11-12', -- date_column - '12:00:00.123', -- time_column - NULL, -- timeMsColumn - '12:00:00.12300+05', -- timetz_column - '12:00:00.1+05', -- timetz_ms_column - '2024-01-01 12:00:00', -- timestamp_column - NULL, -- timestamp_ms_column - '2024-01-01 12:00:00.000123+05', -- timestamptz_column - '2024-01-01 12:00:00.12+05', -- timestamptz_ms_column - NULL, -- uuid_column - NULL, -- bytea_column - NULL, -- interval_column - NULL, -- point_column - NULL, -- inet_column - NULL, -- json_column - '{}'::JSONB, -- jsonb_column - NULL, -- tsvector_column - NULL, -- xml_column - NULL, -- pg_snapshot_column - NULL, -- array_text_column - '{}', -- array_int_column - NULL, -- array_jsonb_column - NULL, -- array_ltree_column - NULL -- user_defined_column -); - -SELECT - table_schema, - table_name, - column_name, - data_type, - udt_name, - is_nullable, - character_maximum_length, - numeric_precision, - numeric_scale, - datetime_precision -FROM information_schema.columns -WHERE table_schema = 'public' -ORDER BY table_schema, table_name, ordinal_position; diff --git a/scripts/test-partitioned-tables.sql b/scripts/test-partitioned-tables.sql deleted file mode 100644 index 2109005..0000000 --- a/scripts/test-partitioned-tables.sql +++ /dev/null @@ -1,19 +0,0 @@ --- Usage: psql postgres://127.0.0.1:5432/dbname -P pager=off -v ON_ERROR_STOP=on -f ./scripts/test-partitioned-tables.sql - -DROP TABLE IF EXISTS test_table; - -CREATE TABLE test_table ( - id SERIAL, - created_at TIMESTAMP NOT NULL -) PARTITION BY RANGE (created_at); - -CREATE TABLE test_table_q1 PARTITION OF test_table FOR VALUES FROM ('2024-01-01') TO ('2024-04-01'); -CREATE TABLE test_table_q2 PARTITION OF test_table FOR VALUES FROM ('2024-04-01') TO ('2024-07-01'); -CREATE TABLE test_table_q3 PARTITION OF test_table FOR VALUES FROM ('2024-07-01') TO ('2024-10-01'); -CREATE TABLE test_table_q4 PARTITION OF test_table FOR VALUES FROM ('2024-10-01') TO ('2025-01-01'); - -INSERT INTO test_table (created_at) VALUES - ('2024-02-15 10:00:00'), - ('2024-09-01 12:00:30'), - ('2024-10-12 08:00:00'), - ('2024-05-20 14:30:00'); diff --git a/scripts/test-schemas.sql b/scripts/test-schemas.sql deleted file mode 100644 index 734442c..0000000 --- a/scripts/test-schemas.sql +++ /dev/null @@ -1,30 +0,0 @@ --- Usage: psql postgres://127.0.0.1:5432/dbname -P pager=off -v ON_ERROR_STOP=on -f ./scripts/test-schemas.sql - -DROP SCHEMA IF EXISTS test_schema CASCADE; - -CREATE SCHEMA test_schema; - -CREATE TABLE test_schema.test_table ( - id SERIAL PRIMARY KEY -); - -CREATE TABLE test_schema.simple_table ( - id SERIAL PRIMARY KEY -); - -INSERT INTO test_schema.simple_table DEFAULT VALUES; - -SELECT - table_schema, - table_name, - column_name, - data_type, - udt_name, - is_nullable, - character_maximum_length, - numeric_precision, - numeric_scale, - datetime_precision -FROM information_schema.columns -WHERE table_schema = 'test_schema' -ORDER BY table_schema, table_name, ordinal_position; diff --git a/server/authentication.go b/server/authentication.go new file mode 100644 index 0000000..0aac928 --- /dev/null +++ b/server/authentication.go @@ -0,0 +1,97 @@ +package main + +import ( + "encoding/base64" + "errors" + "strconv" + "strings" + "time" + + "github.com/jackc/pgx/v5/pgproto3" + "github.com/xdg-go/scram" +) + +func (server *PostgresServer) authenticatePassword() error { + if server.config.EncryptedPassword == "" { + return nil + } + failure := func() error { + return NewClientError(PG_ERROR_SEVERITY_FATAL, "28P01", "password authentication failed", errors.New("password authentication failed")) + } + credentials, err := scramCredentials(server.config.EncryptedPassword) + if err != nil { + return failure() + } + verifier, err := scram.SHA256.NewServer(func(_ string) (scram.StoredCredentials, error) { return credentials, nil }) + if err != nil { + return failure() + } + conversation := verifier.NewConversation() + if err := (*server.conn).SetDeadline(time.Now().Add(10 * time.Second)); err != nil { + return err + } + defer (*server.conn).SetDeadline(time.Time{}) + if err := server.backend.SetAuthType(pgproto3.AuthTypeSASL); err != nil { + return err + } + server.writeMessages(&pgproto3.AuthenticationSASL{AuthMechanisms: []string{"SCRAM-SHA-256"}}) + message, err := server.backend.Receive() + if err != nil { + return failure() + } + initial, ok := message.(*pgproto3.SASLInitialResponse) + if !ok || initial.AuthMechanism != "SCRAM-SHA-256" { + return failure() + } + challenge, err := conversation.Step(string(initial.Data)) + if err != nil { + return failure() + } + if err := server.backend.SetAuthType(pgproto3.AuthTypeSASLContinue); err != nil { + return err + } + server.writeMessages(&pgproto3.AuthenticationSASLContinue{Data: []byte(challenge)}) + message, err = server.backend.Receive() + if err != nil { + return failure() + } + response, ok := message.(*pgproto3.SASLResponse) + if !ok { + return failure() + } + final, err := conversation.Step(string(response.Data)) + if err != nil || !conversation.Done() || !conversation.Valid() { + return failure() + } + server.writeMessages(&pgproto3.AuthenticationSASLFinal{Data: []byte(final)}) + return nil +} + +func scramCredentials(secret string) (scram.StoredCredentials, error) { + invalid := errors.New("invalid SCRAM verifier") + parts := strings.Split(secret, "$") + if len(parts) != 3 || parts[0] != "SCRAM-SHA-256" { + return scram.StoredCredentials{}, invalid + } + factors, keys := strings.Split(parts[1], ":"), strings.Split(parts[2], ":") + if len(factors) != 2 || len(keys) != 2 { + return scram.StoredCredentials{}, invalid + } + iterations, err := strconv.Atoi(factors[0]) + if err != nil || iterations <= 0 { + return scram.StoredCredentials{}, invalid + } + salt, err := base64.StdEncoding.DecodeString(factors[1]) + if err != nil || len(salt) == 0 { + return scram.StoredCredentials{}, invalid + } + stored, err := base64.StdEncoding.DecodeString(keys[0]) + if err != nil || len(stored) != 32 { + return scram.StoredCredentials{}, invalid + } + key, err := base64.StdEncoding.DecodeString(keys[1]) + if err != nil || len(key) != 32 { + return scram.StoredCredentials{}, invalid + } + return scram.StoredCredentials{KeyFactors: scram.KeyFactors{Salt: string(salt), Iters: iterations}, StoredKey: stored, ServerKey: key}, nil +} diff --git a/server/authentication_test.go b/server/authentication_test.go new file mode 100644 index 0000000..3c5e316 --- /dev/null +++ b/server/authentication_test.go @@ -0,0 +1,107 @@ +package main + +import ( + "context" + "net" + "testing" + "time" + + "github.com/jackc/pgx/v5/pgconn" + "github.com/jackc/pgx/v5/pgproto3" +) + +func TestStandaloneAuthentication(t *testing.T) { + configureStandaloneTest(t) + for _, test := range []struct { + name, password string + accepted bool + }{ + {"correct", "correct-password", true}, + {"wrong", "wrong-password", false}, + {"empty", "", false}, + } { + t.Run(test.name, func(t *testing.T) { + listener, err := net.Listen("tcp", "127.0.0.1:0") + if err != nil { + t.Fatal(err) + } + defer listener.Close() + done := make(chan error, 1) + go func() { + conn, err := listener.Accept() + if err != nil { + done <- err + return + } + defer conn.Close() + config := &Config{Database: "pgstack", User: "reader", EncryptedPassword: StringToScramSha256("correct-password")} + server := NewPostgresServer(config, &conn) + done <- server.handleStartup() + }() + config, err := pgconn.ParseConfig("postgres://reader@" + listener.Addr().String() + "/pgstack?sslmode=disable") + if err != nil { + t.Fatal(err) + } + config.Password = test.password + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + conn, err := pgconn.ConnectConfig(ctx, config) + if conn != nil { + conn.Close(ctx) + } + if (err == nil) != test.accepted { + t.Fatalf("accepted=%v, error=%v", test.accepted, err) + } + serverErr := <-done + if (serverErr == nil) != test.accepted { + t.Fatalf("server error=%v", serverErr) + } + }) + } +} + +func TestStandaloneNoPasswordPacketCannotBypassChallenge(t *testing.T) { + configureStandaloneTest(t) + serverConn, clientConn := net.Pipe() + defer clientConn.Close() + clientConn.SetDeadline(time.Now().Add(5 * time.Second)) + done := make(chan error, 1) + go func() { + defer serverConn.Close() + server := NewPostgresServer(&Config{Database: "pgstack", EncryptedPassword: StringToScramSha256("secret")}, &serverConn) + done <- server.handleStartup() + }() + frontend := pgproto3.NewFrontend(clientConn, clientConn) + frontend.Send(&pgproto3.StartupMessage{ProtocolVersion: 196608, Parameters: map[string]string{"database": "pgstack", "user": "reader"}}) + if err := frontend.Flush(); err != nil { + t.Fatal(err) + } + message, err := frontend.Receive() + if err != nil { + t.Fatal(err) + } + if _, ok := message.(*pgproto3.AuthenticationSASL); !ok { + t.Fatalf("expected password challenge, got %T", message) + } + frontend.Send(&pgproto3.Query{String: "SELECT 1"}) + if err := frontend.Flush(); err != nil { + t.Fatal(err) + } + message, err = frontend.Receive() + if err != nil { + t.Fatal(err) + } + if response, ok := message.(*pgproto3.ErrorResponse); !ok || response.Code != "28P01" { + t.Fatalf("expected authentication failure, got %#v", message) + } + if err := <-done; err == nil { + t.Fatal("startup bypassed authentication") + } +} + +func TestStandaloneHasNoSpecialUser(t *testing.T) { + configureStandaloneTest(t) + if startupUserAllowed(&Config{User: "reader"}, "pgstack") { + t.Fatal("unexpected privileged user") + } +} diff --git a/server/client_error.go b/server/client_error.go new file mode 100644 index 0000000..f0f4aa7 --- /dev/null +++ b/server/client_error.go @@ -0,0 +1,41 @@ +package main + +const ( + PG_ERROR_SEVERITY_ERROR = "ERROR" + PG_ERROR_SEVERITY_FATAL = "FATAL" + + PG_ERROR_CODE_INTERNAL_ERROR = "XX000" + PG_ERROR_CODE_INVALID_CATALOG_NAME = "3D000" + PG_ERROR_CODE_INVALID_AUTHORIZATION_SPECIFICATION = "28000" + PG_ERROR_CODE_SYNTAX_ERROR = "42601" + PG_ERROR_CODE_FEATURE_NOT_SUPPORTED = "0A000" + PG_ERROR_CODE_PROTOCOL_VIOLATION = "08P01" + PG_ERROR_CODE_INVALID_PARAMETER_VALUE = "22023" +) + +type ClientError struct { + Severity string + Code string + Message string + cause error +} + +func NewClientError(severity, code, message string, cause error) *ClientError { + return &ClientError{ + Severity: severity, + Code: code, + Message: message, + cause: cause, + } +} + +func (clientError *ClientError) Error() string { + if clientError.cause != nil { + return clientError.cause.Error() + } + return clientError.Message +} + +func (clientError *ClientError) Unwrap() error { + return clientError.cause +} diff --git a/server/client_error_test.go b/server/client_error_test.go new file mode 100644 index 0000000..6edcd56 --- /dev/null +++ b/server/client_error_test.go @@ -0,0 +1,74 @@ +package main + +import ( + "errors" + "net" + "testing" + + "github.com/jackc/pgx/v5/pgproto3" +) + +func TestClientErrorKeepsPrivateCauseForLogging(t *testing.T) { + cause := errors.New("private s3://bucket/path/file.parquet error") + err := NewClientError(PG_ERROR_SEVERITY_ERROR, PG_ERROR_CODE_INTERNAL_ERROR, "safe message", cause) + + if err.Error() != cause.Error() { + t.Fatalf("logged error = %q, want %q", err.Error(), cause.Error()) + } + if !errors.Is(err, cause) { + t.Fatal("client error does not unwrap to its private cause") + } +} + +func TestWriteErrorUsesExplicitClientError(t *testing.T) { + clientError := NewClientError( + PG_ERROR_SEVERITY_FATAL, + PG_ERROR_CODE_INVALID_AUTHORIZATION_SPECIFICATION, + `role "postgres" does not exist`, + errors.New("private authentication details"), + ) + + response := writeAndReadErrorResponse(t, clientError, false) + if response.Severity != clientError.Severity || response.Code != clientError.Code || response.Message != clientError.Message { + t.Fatalf("response = %+v, want severity=%s code=%s message=%q", response, clientError.Severity, clientError.Code, clientError.Message) + } +} + +func TestWriteErrorHidesInternalError(t *testing.T) { + response := writeAndReadErrorResponse(t, errors.New("private s3://bucket/path/file.parquet error"), true) + if response.Severity != PG_ERROR_SEVERITY_ERROR || response.Code != PG_ERROR_CODE_INTERNAL_ERROR || response.Message != CLIENT_ERROR_MESSAGE { + t.Fatalf("response = %+v, want generic internal error", response) + } +} + +func writeAndReadErrorResponse(t *testing.T, err error, expectReadyForQuery bool) *pgproto3.ErrorResponse { + t.Helper() + serverConn, clientConn := net.Pipe() + t.Cleanup(func() { + serverConn.Close() + clientConn.Close() + }) + server := NewPostgresServer(&Config{}, &serverConn) + written := make(chan struct{}) + go func() { + server.writeError(err) + close(written) + }() + + frontend := pgproto3.NewFrontend(clientConn, clientConn) + message, receiveErr := frontend.Receive() + if receiveErr != nil { + t.Fatalf("receive error response: %v", receiveErr) + } + response, ok := message.(*pgproto3.ErrorResponse) + if !ok { + t.Fatalf("message type = %T, want *pgproto3.ErrorResponse", message) + } + if expectReadyForQuery { + if _, receiveErr := frontend.Receive(); receiveErr != nil { + t.Fatalf("receive ready-for-query response: %v", receiveErr) + } + } + <-written + return response +} diff --git a/server/config.go b/server/config.go new file mode 100644 index 0000000..2f38929 --- /dev/null +++ b/server/config.go @@ -0,0 +1,156 @@ +package main + +import ( + "flag" + "os" + "slices" + "strconv" + "strings" +) + +const ( + VERSION = "2.0.0" + + ENV_LOG_LEVEL = "LOG_LEVEL" + ENV_AUDIT_ENABLED = "AUDIT_ENABLED" + + ENV_AWS_REGION = "AWS_REGION" + ENV_AWS_S3_ENDPOINT = "AWS_S3_ENDPOINT" + ENV_AWS_S3_BUCKET = "AWS_S3_BUCKET" + ENV_AWS_ACCESS_KEY_ID = "AWS_ACCESS_KEY_ID" + ENV_AWS_SECRET_ACCESS_KEY = "AWS_SECRET_ACCESS_KEY" + + ENV_PORT = "PGSTACK_PORT" + ENV_DATABASE = "PGSTACK_DATABASE" + ENV_USER = "PGSTACK_USER" + ENV_PASSWORD = "PGSTACK_PASSWORD" + ENV_HOST = "PGSTACK_HOST" + ENV_DUCKDB_MEMORY_LIMIT = "DUCKDB_MEMORY_LIMIT" + ENV_OPENAI_API_KEY = "OPENAI_API_KEY" + + DEFAULT_LOG_LEVEL = "INFO" + DEFAULT_AWS_S3_ENDPOINT = "s3.amazonaws.com" + DEFAULT_HOST = "0.0.0.0" + DEFAULT_PORT = "54321" + DEFAULT_DATABASE = "pgstack" + DEFAULT_DUCKDB_MEMORY_LIMIT = "512MB" +) + +type Config struct { + // AWS config + AwsRegion string + AwsS3Endpoint string + AwsS3Bucket string + AwsAccessKeyId string + AwsSecretAccessKey string + + // Server config + LogLevel string + AuditEnabled bool + AuditBasePath string + Host string + Port string + Database string + User string + EncryptedPassword string + DuckDBMemoryLimit string + SearchBasePath string + SearchTablesJSON string + OpenAIAPIKey string +} + +type configParseValues struct { + password string +} + +var _config Config +var _configParseValues configParseValues + +func init() { + registerFlags() +} + +func registerFlags() { + flag.StringVar(&_config.LogLevel, "log-level", os.Getenv(ENV_LOG_LEVEL), `Log level: "ERROR", "WARN", "INFO", "DEBUG", "TRACE". Default: "`+DEFAULT_LOG_LEVEL+`"`) + flag.BoolVar(&_config.AuditEnabled, "audit-enabled", getEnvBool(ENV_AUDIT_ENABLED, true), "Enable Audit and Iceberg support") + flag.StringVar(&_config.AwsRegion, "aws-region", os.Getenv(ENV_AWS_REGION), "AWS region") + flag.StringVar(&_config.AwsS3Endpoint, "aws-s3-endpoint", os.Getenv(ENV_AWS_S3_ENDPOINT), "AWS S3 endpoint. Default: \""+DEFAULT_AWS_S3_ENDPOINT+`"`) + flag.StringVar(&_config.AwsS3Bucket, "aws-s3-bucket", os.Getenv(ENV_AWS_S3_BUCKET), "AWS S3 bucket name") + flag.StringVar(&_config.AwsAccessKeyId, "aws-access-key-id", os.Getenv(ENV_AWS_ACCESS_KEY_ID), "AWS access key ID") + flag.StringVar(&_config.AwsSecretAccessKey, "aws-secret-access-key", os.Getenv(ENV_AWS_SECRET_ACCESS_KEY), "AWS secret access key") + + flag.StringVar(&_config.AuditBasePath, "audit-base-path", os.Getenv("AUDIT_BASE_PATH"), "Base path in S3 for Iceberg tables") + flag.StringVar(&_config.Host, "host", os.Getenv(ENV_HOST), "Host for pgstack to listen on") + flag.StringVar(&_config.Port, "port", os.Getenv(ENV_PORT), "Port for pgstack to listen on") + flag.StringVar(&_config.Database, "database", os.Getenv(ENV_DATABASE), "Database name") + flag.StringVar(&_config.User, "user", os.Getenv(ENV_USER), "Database user") + flag.StringVar(&_configParseValues.password, "password", os.Getenv(ENV_PASSWORD), "Database password") + flag.StringVar(&_config.DuckDBMemoryLimit, "duckdb-memory-limit", os.Getenv(ENV_DUCKDB_MEMORY_LIMIT), "DuckDB memory limit. Default: \""+DEFAULT_DUCKDB_MEMORY_LIMIT+`"`) + flag.StringVar(&_config.SearchBasePath, "search-base-path", os.Getenv("SEARCH_BASE_PATH"), "Base path in S3 for Lance tables") + flag.StringVar(&_config.SearchTablesJSON, "search-tables-json", os.Getenv("SEARCH_TABLES_JSON"), "Search table configuration as JSON") + flag.StringVar(&_config.OpenAIAPIKey, "openai-api-key", os.Getenv(ENV_OPENAI_API_KEY), "OpenAI API key used by search rank") +} + +func parseFlags() { + flag.Parse() + + if _config.LogLevel == "" { + _config.LogLevel = DEFAULT_LOG_LEVEL + } else if !slices.Contains(LOG_LEVELS, _config.LogLevel) { + panic("Invalid log level " + _config.LogLevel + ". Must be one of " + strings.Join(LOG_LEVELS, ", ")) + } + if _config.AwsRegion == "" { + panic("AWS region is required") + } + if _config.AwsS3Endpoint == "" { + _config.AwsS3Endpoint = DEFAULT_AWS_S3_ENDPOINT + } + if _config.AwsS3Bucket == "" { + panic("AWS S3 bucket name is required") + } + if _config.AwsAccessKeyId != "" && _config.AwsSecretAccessKey == "" { + panic("AWS secret access key is required") + } + if _config.AwsAccessKeyId == "" && _config.AwsSecretAccessKey != "" { + panic("AWS access key ID is required") + } + + if _config.Host == "" { + panic("Host is required") + } + if _config.Port == "" { + _config.Port = DEFAULT_PORT + } + if _config.Database == "" { + _config.Database = DEFAULT_DATABASE + } + if _configParseValues.password != "" { + _config.EncryptedPassword = StringToScramSha256(_configParseValues.password) + } + if _config.DuckDBMemoryLimit == "" { + _config.DuckDBMemoryLimit = DEFAULT_DUCKDB_MEMORY_LIMIT + } + if _config.AuditEnabled && _config.AuditBasePath == "" { + panic("Audit base path is required when Audit is enabled") + } + + validateRuntimeConfig(&_config) + _configParseValues = configParseValues{} +} + +func LoadConfig() *Config { + parseFlags() + return &_config +} + +func getEnvBool(key string, defaultValue bool) bool { + value := strings.TrimSpace(os.Getenv(key)) + if value == "" { + return defaultValue + } + parsed, err := strconv.ParseBool(value) + if err != nil { + panic("Invalid boolean " + key + ": " + value) + } + return parsed +} diff --git a/server/duckdb_boot_test.go b/server/duckdb_boot_test.go new file mode 100644 index 0000000..839555b --- /dev/null +++ b/server/duckdb_boot_test.go @@ -0,0 +1,52 @@ +package main + +import ( + "slices" + "testing" +) + +func TestDuckdbBootQueriesEnableExternalFileCaches(t *testing.T) { + queries := duckdbBootQueris(&Config{}) + + for _, query := range []string{ + "SET parquet_metadata_cache=true", + "SET enable_external_file_cache=true", + } { + if !slices.Contains(queries, query) { + t.Fatalf("boot queries do not contain %q", query) + } + } +} + +func TestDuckdbBootQueriesLoadIcebergOnlyForAudit(t *testing.T) { + withoutAudit := duckdbBootQueris(&Config{AuditEnabled: false}) + for _, query := range []string{"INSTALL iceberg", "LOAD iceberg"} { + if slices.Contains(withoutAudit, query) { + t.Fatalf("Search-only boot queries contain %q", query) + } + } + + withAudit := duckdbBootQueris(&Config{AuditEnabled: true}) + for _, query := range []string{"INSTALL iceberg", "LOAD iceberg"} { + if !slices.Contains(withAudit, query) { + t.Fatalf("Audit boot queries do not contain %q", query) + } + } +} + +func TestDuckdbBootQueriesAttachSearchReadWrite(t *testing.T) { + queries := duckdbBootQueris(&Config{ + AwsS3Bucket: "bucket", + SearchBasePath: "project/search", + SearchTablesJSON: `[{"name":"public.documents","storeColumns":["id","body"],"indexColumns":["body"]}]`, + }) + for _, query := range []string{ + "ATTACH 's3://bucket/project/search' AS search_store (TYPE LANCE, READ_WRITE)", + "CREATE SCHEMA search", + `CREATE TABLE search."public_documents" ("id" VARCHAR, "body" VARCHAR)`, + } { + if !slices.Contains(queries, query) { + t.Fatalf("Search boot queries do not contain %q", query) + } + } +} diff --git a/server/duckdb_client.go b/server/duckdb_client.go new file mode 100644 index 0000000..0b7c5a8 --- /dev/null +++ b/server/duckdb_client.go @@ -0,0 +1,210 @@ +package main + +import ( + "context" + "database/sql" + "database/sql/driver" + "fmt" + "strings" + "sync/atomic" + + "github.com/duckdb/duckdb-go/v2" +) + +type DuckdbClient struct { + Config *Config + Db *sql.DB + Connector *duckdb.Connector + BootQueries []string +} + +func NewDuckdbClient(config *Config, bootQueries ...[]string) (*DuckdbClient, error) { + client := &DuckdbClient{Config: config} + + client.BootQueries = []string{ + "SET timezone='UTC'", + } + if bootQueries != nil { + client.BootQueries = append(client.BootQueries, bootQueries[0]...) + } + + client.BootQueries = append( + client.BootQueries, + duckdbS3SecretQuery(config), + ) + if config.LogLevel == LOG_LEVEL_TRACE { + client.BootQueries = append(client.BootQueries, "CALL enable_logging('HTTP')", "SET logging_storage = 'stdout'") + } + + db, connector, err := client.openDatabase() + if err != nil { + return nil, err + } + client.Db = db + client.Connector = connector + return client, nil +} + +// openDatabase boots a shared in-memory database, then initializes session +// settings on each new connection. Schemas and secrets are created only once. +func (client *DuckdbClient) openDatabase() (*sql.DB, *duckdb.Connector, error) { + ctx := context.Background() + var sessionQueries []string + for _, query := range client.BootQueries { + if strings.HasPrefix(query, "SET ") || strings.HasPrefix(query, "USE ") { + sessionQueries = append(sessionQueries, query) + } + } + var booted atomic.Bool + connector, err := duckdb.NewConnector("", func(execer driver.ExecerContext) error { + // The boot connection runs all queries in order. Replaying USE before + // boot has created its schema would fail. + if !booted.Load() { + return nil + } + for _, query := range sessionQueries { + if _, err := execer.ExecContext(ctx, query, nil); err != nil { + return fmt.Errorf("failed to initialize DuckDB session: %w", err) + } + } + return nil + }) + if err != nil { + return nil, nil, fmt.Errorf("failed to create DuckDB connector: %w", err) + } + db := sql.OpenDB(connector) + for _, query := range client.BootQueries { + if _, err := db.ExecContext(ctx, query); err != nil { + db.Close() + connector.Close() + return nil, nil, fmt.Errorf("failed to execute DuckDB boot query: %w", err) + } + } + booted.Store(true) + + if client.Config.SearchTablesJSON != "" && client.Config.SearchTablesJSON != "[]" { + // Lance caches dataset handles per connection. The processor commits + // through a separate process; an early read can pin an empty snapshot + // even after rows arrive. Closing connections when their results are + // released makes the next query open the latest committed version. + // The shared database, catalog, and secrets remain alive. + db.SetMaxIdleConns(0) + } + return db, connector, nil +} + +func duckdbS3SecretQuery(config *Config) string { + // DuckDB adds the protocol to S3 secret endpoints. + s3Endpoint := strings.TrimPrefix(config.AwsS3Endpoint, "http://") + s3Endpoint = strings.TrimPrefix(s3Endpoint, "https://") + + options := []string{ + "TYPE S3", + "KEY_ID '" + config.AwsAccessKeyId + "'", + "SECRET '" + config.AwsSecretAccessKey + "'", + "REGION '" + config.AwsRegion + "'", + "ENDPOINT '" + s3Endpoint + "'", + "SCOPE 's3://" + config.AwsS3Bucket + "'", + } + if IsLocalHost(config.AwsS3Endpoint) { + options = append(options, "USE_SSL false") + } + if config.AwsS3Endpoint != DEFAULT_AWS_S3_ENDPOINT { + // Use endpoint/bucket/key instead of bucket.endpoint/key. + options = append(options, "URL_STYLE 'path'") + } + + return "CREATE OR REPLACE SECRET aws_s3_secret (" + strings.Join(options, ", ") + ")" +} + +func duckdbLanceSecretQuery(config *Config) string { + options := []string{ + "TYPE LANCE", + "PROVIDER config", + "SCOPE 's3://" + config.AwsS3Bucket + "/'", + "ACCESS_KEY_ID '" + config.AwsAccessKeyId + "'", + "SECRET_ACCESS_KEY '" + config.AwsSecretAccessKey + "'", + "REGION '" + config.AwsRegion + "'", + } + if IsLocalHost(config.AwsS3Endpoint) { + options = append(options, + "ENDPOINT '"+config.AwsS3Endpoint+"'", + "VIRTUAL_HOSTED_STYLE_REQUEST false", + "ALLOW_HTTP true", + ) + } + return "CREATE OR REPLACE SECRET pgstack_lance (" + strings.Join(options, ", ") + ")" +} + +func (client *DuckdbClient) QueryContext(ctx context.Context, query string, args ...any) (*sql.Rows, error) { + LogDebug(client.Config, "Querying DuckDB:", query) + return client.Db.QueryContext(ctx, query, args...) +} + +func (client *DuckdbClient) PrepareContext(ctx context.Context, query string) (*sql.Stmt, error) { + LogDebug(client.Config, "Preparing DuckDB statement:", query) + return client.Db.PrepareContext(ctx, query) +} + +func (client *DuckdbClient) ExecContext(ctx context.Context, query string, args ...map[string]string) (sql.Result, error) { + LogDebug(client.Config, "Executing DuckDB:", query) + if len(args) == 0 { + return client.Db.ExecContext(ctx, query) + } + + return client.Db.ExecContext(ctx, replaceNamedStringArgs(query, args[0])) +} + +func (client *DuckdbClient) ExecTransactionContext(ctx context.Context, queries []string, args ...[]map[string]string) error { + tx, err := client.Db.Begin() + LogDebug(client.Config, "Executing DuckDB: BEGIN") + if err != nil { + return err + } + + for i, query := range queries { + LogDebug(client.Config, "Executing DuckDB in transaction:", query) + var err error + if len(args) == 0 { + _, err = tx.ExecContext(ctx, query) + } else { + _, err = tx.ExecContext(ctx, replaceNamedStringArgs(query, args[0][i])) + } + if err != nil { + tx.Rollback() + return err + } + } + + LogDebug(client.Config, "Executing DuckDB: COMMIT") + return tx.Commit() +} + +func (client *DuckdbClient) Close() { + client.Db.Close() + client.Connector.Close() +} + +func (client *DuckdbClient) RecreateDb() error { + db, connector, err := client.openDatabase() + if err != nil { + return fmt.Errorf("failed to recreate DuckDB: %w", err) + } + + client.Db.Close() + client.Connector.Close() + client.Db = db + client.Connector = connector + return nil +} + +func replaceNamedStringArgs(query string, args map[string]string) string { + for key, value := range args { + query = strings.ReplaceAll( + query, + "$"+key, + strings.ReplaceAll(value, "'", "''"), + ) + } + return query +} diff --git a/server/duckdb_client_test.go b/server/duckdb_client_test.go new file mode 100644 index 0000000..e3693e9 --- /dev/null +++ b/server/duckdb_client_test.go @@ -0,0 +1,100 @@ +package main + +import ( + "context" + "database/sql" + "fmt" + "strings" + "testing" +) + +func TestSearchReaderSeesExternalCommits(t *testing.T) { + ctx := context.Background() + writer, err := sql.Open("duckdb", "") + if err != nil { + t.Fatal(err) + } + defer writer.Close() + if _, err := writer.ExecContext(ctx, "LOAD lance"); err != nil { + t.Skipf("Lance extension unavailable: %v", err) + } + root := strings.ReplaceAll(t.TempDir(), "'", "''") + for _, query := range []string{ + fmt.Sprintf("ATTACH '%s' AS search_store (TYPE LANCE, READ_WRITE)", root), + "CREATE TABLE search_store.main.products AS SELECT 'before' AS name", + } { + if _, err := writer.ExecContext(ctx, query); err != nil { + t.Fatal(err) + } + } + reader, err := NewDuckdbClient(&Config{ + AwsRegion: "us-east-1", AwsS3Bucket: "test", AwsS3Endpoint: DEFAULT_AWS_S3_ENDPOINT, + SearchTablesJSON: `[{"name":"public.products","indexColumns":["name"],"storeColumns":["name"]}]`, + }, []string{"LOAD lance", "CREATE SCHEMA public", "USE public"}) + if err != nil { + t.Fatal(err) + } + defer reader.Close() + check := func(want string) { + t.Helper() + var name, schema, timezone string + query := fmt.Sprintf("SELECT name, current_schema(), current_setting('TimeZone') FROM '%s/products.lance'", root) + if err := reader.Db.QueryRowContext(ctx, query).Scan(&name, &schema, &timezone); err != nil { + t.Fatal(err) + } + if name != want || schema != "public" || timezone != "UTC" { + t.Fatalf("got (%q, %q, %q), want (%q, public, UTC)", name, schema, timezone, want) + } + } + check("before") + if _, err := writer.ExecContext(ctx, "UPDATE search_store.main.products SET name = 'after'"); err != nil { + t.Fatal(err) + } + check("after") + if err := reader.RecreateDb(); err != nil { + t.Fatal(err) + } + check("after") + if _, err := writer.ExecContext(ctx, "UPDATE search_store.main.products SET name = 'latest'"); err != nil { + t.Fatal(err) + } + check("latest") +} + +func TestDuckdbS3SecretQueryConfiguresLocalEndpoint(t *testing.T) { + query := duckdbS3SecretQuery(&Config{ + AwsRegion: "us-east-1", + AwsS3Endpoint: "http://127.0.0.1:9000", + AwsS3Bucket: "pgstack", + AwsAccessKeyId: "pgstack", + AwsSecretAccessKey: "pgstack", + }) + + for _, expected := range []string{ + "ENDPOINT '127.0.0.1:9000'", + "USE_SSL false", + "URL_STYLE 'path'", + } { + if !strings.Contains(query, expected) { + t.Errorf("local S3 secret query does not contain %q: %s", expected, query) + } + } +} + +func TestDuckdbS3SecretQueryUsesAwsDefaults(t *testing.T) { + query := duckdbS3SecretQuery(&Config{ + AwsRegion: "us-east-1", + AwsS3Endpoint: DEFAULT_AWS_S3_ENDPOINT, + AwsS3Bucket: "pgstack", + AwsAccessKeyId: "key", + }) + + for _, unexpected := range []string{ + "USE_SSL", + "URL_STYLE", + } { + if strings.Contains(query, unexpected) { + t.Errorf("AWS S3 secret query unexpectedly contains %q: %s", unexpected, query) + } + } +} diff --git a/server/embedding_client.go b/server/embedding_client.go new file mode 100644 index 0000000..58b750f --- /dev/null +++ b/server/embedding_client.go @@ -0,0 +1,125 @@ +package main + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "io" + "net/http" + "time" +) + +const ( + OPENAI_EMBEDDING_MODEL = "text-embedding-3-small" + OPENAI_EMBEDDING_DIMENSIONS = 1536 + OPENAI_EMBEDDINGS_URL = "https://api.openai.com/v1/embeddings" + EMBEDDING_MAX_INPUT_BYTES = 3200 +) + +type EmbeddingClient struct { + config *Config + apiKey string + model string + dimensions int + url string + httpClient *http.Client +} + +type embeddingRequest struct { + Model string `json:"model"` + Input []string `json:"input"` + Dimensions int `json:"dimensions"` +} + +type embeddingResponse struct { + Data []struct { + Embedding []float32 `json:"embedding"` + Index int `json:"index"` + } `json:"data"` + Usage struct { + PromptTokens int `json:"prompt_tokens"` + } `json:"usage"` +} + +func NewEmbeddingClient(config *Config) *EmbeddingClient { + return &EmbeddingClient{ + config: config, + apiKey: config.OpenAIAPIKey, + model: OPENAI_EMBEDDING_MODEL, + dimensions: OPENAI_EMBEDDING_DIMENSIONS, + url: OPENAI_EMBEDDINGS_URL, + httpClient: &http.Client{Timeout: 30 * time.Second}, + } +} + +func (client *EmbeddingClient) Embed(ctx context.Context, input string) ([]float32, error) { + if err := validateEmbeddingInput(input); err != nil { + return nil, err + } + if client.apiKey == "" { + return nil, fmt.Errorf("OPENAI_API_KEY is required to use search rank") + } + body, err := json.Marshal(embeddingRequest{ + Model: client.model, + Input: []string{input}, + Dimensions: client.dimensions, + }) + if err != nil { + return nil, err + } + req, err := http.NewRequestWithContext(ctx, http.MethodPost, client.url, bytes.NewReader(body)) + if err != nil { + return nil, err + } + req.Header.Set("Authorization", "Bearer "+client.apiKey) + req.Header.Set("Content-Type", "application/json") + + var response *http.Response + for attempt := 0; attempt < 4; attempt++ { + response, err = client.httpClient.Do(req) + if err == nil && response.StatusCode != http.StatusTooManyRequests && response.StatusCode < 500 { + break + } + if attempt == 3 { + break + } + if response != nil { + response.Body.Close() + } + select { + case <-ctx.Done(): + return nil, ctx.Err() + case <-time.After(time.Duration(1<= 300 { + message, _ := io.ReadAll(io.LimitReader(response.Body, 4096)) + return nil, fmt.Errorf("embedding request returned %s: %s", response.Status, string(message)) + } + + var payload embeddingResponse + if err := json.NewDecoder(response.Body).Decode(&payload); err != nil { + return nil, fmt.Errorf("invalid embedding response: %w", err) + } + if len(payload.Data) != 1 || payload.Data[0].Index != 0 || len(payload.Data[0].Embedding) != client.dimensions { + return nil, fmt.Errorf("invalid embedding response item") + } + LogInfo(client.config, fmt.Sprintf("Built embeddings via OpenAI | Input tokens: %d", payload.Usage.PromptTokens)) + return payload.Data[0].Embedding, nil +} + +func validateEmbeddingInput(input string) error { + if input == "" { + return fmt.Errorf("search rank input cannot be empty") + } + if len(input) > EMBEDDING_MAX_INPUT_BYTES { + return fmt.Errorf("search rank input cannot exceed %d bytes", EMBEDDING_MAX_INPUT_BYTES) + } + return nil +} diff --git a/server/embedding_client_test.go b/server/embedding_client_test.go new file mode 100644 index 0000000..c4635c7 --- /dev/null +++ b/server/embedding_client_test.go @@ -0,0 +1,127 @@ +package main + +import ( + "bytes" + "context" + "encoding/json" + "log" + "net/http" + "net/http/httptest" + "strings" + "testing" + + "github.com/jackc/pgx/v5/pgproto3" +) + +func TestEmbeddingClientAndLiteralCache(t *testing.T) { + var logs bytes.Buffer + previousOutput := log.Writer() + log.SetOutput(&logs) + t.Cleanup(func() { log.SetOutput(previousOutput) }) + + requests := 0 + server := httptest.NewServer(http.HandlerFunc(func(response http.ResponseWriter, request *http.Request) { + requests++ + if request.Header.Get("Authorization") != "Bearer test-key" { + t.Errorf("unexpected authorization header: %q", request.Header.Get("Authorization")) + } + var body embeddingRequest + if err := json.NewDecoder(request.Body).Decode(&body); err != nil { + t.Error(err) + } + if body.Model != OPENAI_EMBEDDING_MODEL || body.Dimensions != 2 || len(body.Input) != 1 || body.Input[0] != "dog" { + t.Errorf("unexpected embedding request: %#v", body) + } + response.Header().Set("Content-Type", "application/json") + _, _ = response.Write([]byte(`{"data":[{"embedding":[0.6,0.8],"index":0}],"usage":{"prompt_tokens":7}}`)) + })) + t.Cleanup(server.Close) + + client := NewEmbeddingClient(&Config{LogLevel: LOG_LEVEL_INFO, OpenAIAPIKey: "test-key"}) + client.dimensions = 2 + client.url = server.URL + queryHandler := &QueryHandler{Config: &Config{}, EmbeddingClient: client} + dog := "dog" + specs := map[int]SearchParameterSpec{ + 1: {Dimensions: 2, RequireNonZero: true, LiteralText: &dog}, + 2: {Dimensions: 2, RequireNonZero: true, LiteralText: &dog}, + } + variables, err := queryHandler.resolveEmbeddedLiteralParameters(context.Background(), specs) + if err != nil { + t.Fatal(err) + } + if requests != 1 { + t.Fatalf("embedding requests = %d, want 1", requests) + } + if !strings.Contains(logs.String(), "Built embeddings via OpenAI | Input tokens: 7") { + t.Fatalf("expected embedding usage log, got %q", logs.String()) + } + for _, variable := range variables { + vector := variable.([]float32) + if len(vector) != 2 || vector[0] != 0.6 || vector[1] != 0.8 { + t.Fatalf("unexpected embedded vector: %#v", vector) + } + } + prepared := &PreparedStatement{VectorParameters: map[int]SearchParameterSpec{ + 1: {Dimensions: 2, RequireNonZero: true}, + }} + _, prepared, err = queryHandler.HandleBindQuery(&pgproto3.Bind{Parameters: [][]byte{[]byte("dog")}}, prepared) + if err != nil { + t.Fatal(err) + } + vector := prepared.Variables[0].([]float32) + if len(vector) != 2 || vector[0] != 0.6 || vector[1] != 0.8 { + t.Fatalf("unexpected bound embedding: %#v", vector) + } + prepared = &PreparedStatement{VectorParameters: map[int]SearchParameterSpec{ + 1: {Dimensions: 2, RequireNonZero: true, LiteralText: &dog}, + }} + _, prepared, err = queryHandler.HandleBindQuery(&pgproto3.Bind{}, prepared) + if err != nil { + t.Fatal(err) + } + vector = prepared.Variables[0].([]float32) + if len(vector) != 2 || vector[0] != 0.6 || vector[1] != 0.8 { + t.Fatalf("unexpected hidden literal embedding: %#v", vector) + } +} + +func TestEmbeddingClientValidatesInput(t *testing.T) { + client := NewEmbeddingClient(&Config{}) + if _, err := client.Embed(context.Background(), "dog"); err == nil { + t.Fatal("expected missing API key error") + } + client.apiKey = "test-key" + if _, err := client.Embed(context.Background(), ""); err == nil { + t.Fatal("expected empty input error") + } + if _, err := client.Embed(context.Background(), strings.Repeat("x", EMBEDDING_MAX_INPUT_BYTES+1)); err == nil || !strings.Contains(err.Error(), "cannot exceed 3200 bytes") { + t.Fatalf("expected oversized input error, got %v", err) + } +} + +func TestQueryHandlerHidesEmbeddingProviderError(t *testing.T) { + var logs bytes.Buffer + previousOutput := log.Writer() + log.SetOutput(&logs) + t.Cleanup(func() { log.SetOutput(previousOutput) }) + + server := httptest.NewServer(http.HandlerFunc(func(response http.ResponseWriter, _ *http.Request) { + response.WriteHeader(http.StatusBadRequest) + _, _ = response.Write([]byte("sensitive upstream error")) + })) + t.Cleanup(server.Close) + config := &Config{OpenAIAPIKey: "test-key"} + client := NewEmbeddingClient(config) + client.dimensions = 2 + client.url = server.URL + queryHandler := &QueryHandler{Config: config, EmbeddingClient: client} + + _, err := queryHandler.embedVectorParameter(context.Background(), "dog", SearchParameterSpec{Dimensions: 2}, nil) + if err == nil || err.Error() != "search rank failed" { + t.Fatalf("unexpected public error: %v", err) + } + if strings.Contains(err.Error(), "upstream") || !strings.Contains(logs.String(), "sensitive upstream error") { + t.Fatalf("expected provider detail only in server log; error=%q logs=%q", err, logs.String()) + } +} diff --git a/server/error_utils.go b/server/error_utils.go new file mode 100644 index 0000000..70e6489 --- /dev/null +++ b/server/error_utils.go @@ -0,0 +1,43 @@ +package main + +import ( + "errors" + "fmt" + "os" + "runtime/debug" +) + +func PanicIfError(config *Config, err error) { + if err != nil { + printUnexpectedError(config, err) + os.Exit(1) + } +} + +func Panic(config *Config, message string) { + err := errors.New(message) + PanicIfError(config, err) +} + +func PrintErrorAndExit(config *Config, message string) { + LogError(config, message+"\n") + os.Exit(1) +} + +func HandleUnexpectedPanic(config *Config) { + func() { + if r := recover(); r != nil { + err, _ := r.(error) + printUnexpectedError(config, err) + os.Exit(1) + } + }() +} + +func printUnexpectedError(config *Config, err error) { + errorMessage := err.Error() + stackTrace := string(debug.Stack()) + + fmt.Println("Unexpected error:", errorMessage) + fmt.Println(stackTrace) +} diff --git a/server/go.mod b/server/go.mod new file mode 100644 index 0000000..d6f4303 --- /dev/null +++ b/server/go.mod @@ -0,0 +1,63 @@ +module github.com/pgstack-io/pgstack/server + +go 1.25.0 + +require ( + github.com/duckdb/duckdb-go/v2 v2.10505.0 + github.com/google/uuid v1.6.0 + github.com/jackc/pgx/v5 v5.9.2 + github.com/pganalyze/pg_query_go/v6 v6.1.0 + golang.org/x/crypto v0.52.0 +) + +require ( + github.com/aws/aws-sdk-go-v2 v1.47.1 + github.com/aws/aws-sdk-go-v2/config v1.25.3 + github.com/aws/aws-sdk-go-v2/credentials v1.16.2 + github.com/aws/aws-sdk-go-v2/service/s3 v1.114.1 + github.com/xdg-go/scram v1.1.2 + google.golang.org/protobuf v1.36.11 +) + +require ( + github.com/apache/arrow-go/v18 v18.5.1 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.20 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.4 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.5.4 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.8.4 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.5.4 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.19 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.11.5 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.14.4 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.20.4 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.17.2 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.20.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.25.3 // indirect + github.com/aws/smithy-go v1.28.1 // indirect + github.com/duckdb/duckdb-go-bindings v0.10505.0 // indirect + github.com/duckdb/duckdb-go-bindings/lib/darwin-amd64 v0.10505.0 // indirect + github.com/duckdb/duckdb-go-bindings/lib/darwin-arm64 v0.10505.0 // indirect + github.com/duckdb/duckdb-go-bindings/lib/linux-amd64 v0.10505.0 // indirect + github.com/duckdb/duckdb-go-bindings/lib/linux-arm64 v0.10505.0 // indirect + github.com/duckdb/duckdb-go-bindings/lib/windows-amd64 v0.10505.0 // indirect + github.com/go-viper/mapstructure/v2 v2.5.0 // indirect + github.com/goccy/go-json v0.10.5 // indirect + github.com/google/flatbuffers v25.12.19+incompatible // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect + github.com/klauspost/compress v1.18.3 // indirect + github.com/klauspost/cpuid/v2 v2.3.0 // indirect + github.com/pierrec/lz4/v4 v4.1.25 // indirect + github.com/xdg-go/pbkdf2 v1.0.0 // indirect + github.com/xdg-go/stringprep v1.0.4 // indirect + github.com/zeebo/xxh3 v1.1.0 // indirect + golang.org/x/exp v0.0.0-20260112195511-716be5621a96 // indirect + golang.org/x/mod v0.35.0 // indirect + golang.org/x/sync v0.20.0 // indirect + golang.org/x/sys v0.45.0 // indirect + golang.org/x/telemetry v0.0.0-20260409153401-be6f6cb8b1fa // indirect + golang.org/x/text v0.37.0 // indirect + golang.org/x/tools v0.44.0 // indirect + golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect +) diff --git a/server/go.sum b/server/go.sum new file mode 100644 index 0000000..c3574f1 --- /dev/null +++ b/server/go.sum @@ -0,0 +1,166 @@ +github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= +github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= +github.com/apache/arrow-go/v18 v18.5.1 h1:yaQ6zxMGgf9YCYw4/oaeOU3AULySDlAYDOcnr4LdHdI= +github.com/apache/arrow-go/v18 v18.5.1/go.mod h1:OCCJsmdq8AsRm8FkBSSmYTwL/s4zHW9CqxeBxEytkNE= +github.com/apache/thrift v0.22.0 h1:r7mTJdj51TMDe6RtcmNdQxgn9XcyfGDOzegMDRg47uc= +github.com/apache/thrift v0.22.0/go.mod h1:1e7J/O1Ae6ZQMTYdy9xa3w9k+XHWPfRvdPyJeynQ+/g= +github.com/aws/aws-sdk-go-v2 v1.47.1 h1:uOIZnp4PK3ZhKI0dNrJrhTEsLxbpXHTAJlwoS1pvAtw= +github.com/aws/aws-sdk-go-v2 v1.47.1/go.mod h1:bttEH6JqnUL8LepvDVfdrds/fZ5bCIxzpe3abyUrhDU= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.20 h1:GPRlPwz40I2B2VrBEASOA3Bi77NyeqejNLkifosX0rs= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.20/go.mod h1:g7PNzKcsOKWb4fkSRBA7BZVAS6Y8IcxzN+nRohhQ1Q8= +github.com/aws/aws-sdk-go-v2/config v1.25.3 h1:E4m9LbwJOoncDNt3e9MPLbz/saxWcGUlZVBydydD6+8= +github.com/aws/aws-sdk-go-v2/config v1.25.3/go.mod h1:tAByZy03nH5jcq0vZmkcVoo6tRzRHEwSFx3QW4NmDw8= +github.com/aws/aws-sdk-go-v2/credentials v1.16.2 h1:0sdZ5cwfOAipTzZ7eOL0gw4LAhk/RZnTa16cDqIt8tg= +github.com/aws/aws-sdk-go-v2/credentials v1.16.2/go.mod h1:sDdvGhXrSVT5yzBDR7qXz+rhbpiMpUYfF3vJ01QSdrc= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.4 h1:9wKDWEjwSnXZre0/O3+ZwbBl1SmlgWYBbrTV10X/H1s= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.4/go.mod h1:t4i+yGHMCcUNIX1x7YVYa6bH/Do7civ5I6cG/6PMfyA= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.5.4 h1:CLq4+8UHCI+ZZYl/EuJxXovaIVN2xeeT8JV+dsApQ5E= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.5.4/go.mod h1:Wv4q5sAM04xAMkoOedxLx2inVf6K5FdxYp+A61L+q/0= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.8.4 h1:dD4MR81I7YkpEBRk6UP9rocC2QnT3qVuXwzlYTtfGEs= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.8.4/go.mod h1:EcXV1kAFd5XwSkDHlj94gnF3q5CkJyYiIJfH8N0VmrE= +github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1 h1:uR9lXYjdPX0xY+NhvaJ4dD8rpSRz5VY81ccIIoNG+lw= +github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.5.4 h1:7Wo47d/xn/7KttCSBd8EGYeZ7ULRFRkUHr6vkZPBzVQ= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.5.4/go.mod h1:tDB2IVC1xC3vX8o+6uRlzhTxP3g1b77CZXFX/oD2FnQ= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.19 h1:bAdDl/HkGCcGPoe25ToSHEw23VIxt6CT5fLcg111BKg= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.19/go.mod h1:KaUzbLxv4CeSxh6ZCl9B4m7CuFenS8kUEaDs+f/DQr4= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.11.5 h1:/TYsZXdA8UTa+WCtCYSAJIr1vwl0+eho6TUgJGwFFO8= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.11.5/go.mod h1:qPqp1Uwd/BqdhPufv6oem9j5J7HNsgc2V22dUiDPn+s= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.14.4 h1:29SvnfGhXjTl8ONxFwbj2rs6lbhiFXD2CgFQmbT/bXY= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.14.4/go.mod h1:wm04I5DMuNVvZHFe/dHnUxincvNbbK7AiNBbYsQivek= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.20.4 h1:pPiWfgeNxqluKEph7hvU88kuGKBPOWzO+Dk9t2zqqNs= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.20.4/go.mod h1:YlwGoIUDG/3kBQbdNOVs/xKZ9J01G8e/6D1mRBj9uTk= +github.com/aws/aws-sdk-go-v2/service/s3 v1.114.1 h1:9T6eO8/WXhij4PQaa2WaYsdekSCmT9Hw66Pw0S8do0Q= +github.com/aws/aws-sdk-go-v2/service/s3 v1.114.1/go.mod h1:9APRWGLFITKD+xzWSIyT9V7QV4bNlEuIieWlzXgGFlI= +github.com/aws/aws-sdk-go-v2/service/sso v1.17.2 h1:V47N5eKgVZoRSvx2+RQ0EpAEit/pqOhqeSQFiS4OFEQ= +github.com/aws/aws-sdk-go-v2/service/sso v1.17.2/go.mod h1:/pE21vno3q1h4bbhUOEi+6Zu/aT26UK2WKkDXd+TssQ= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.20.0 h1:/XiEU7VIFcVWRDQLabyrSjBoKIm8UkYgsvWDuFW8Img= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.20.0/go.mod h1:dWqm5G767qwKPuayKfzm4rjzFmVjiBFbOJrpSPnAMDs= +github.com/aws/aws-sdk-go-v2/service/sts v1.25.3 h1:M2w4kiMGJCCM6Ljmmx/l6mmpfa3gPJVpBencfnsgvqs= +github.com/aws/aws-sdk-go-v2/service/sts v1.25.3/go.mod h1:4EqRHDCKP78hq3zOnmFXu5k0j4bXbRFfCh/zQ6KnEfQ= +github.com/aws/smithy-go v1.28.1 h1:R/nXH00c8qcfCzQVELtRw+eLQWtzv+VAIEFJ1/xxXlQ= +github.com/aws/smithy-go v1.28.1/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/duckdb/duckdb-go-bindings v0.10505.0 h1:/0pPsTLrcCsTGxT0VrHgJWnOcPe1tQL1vrki1v3jbAI= +github.com/duckdb/duckdb-go-bindings v0.10505.0/go.mod h1:HoD5xePkDj3VZbBnVVfxVVYIljZ9khCprWA7FgwIiC4= +github.com/duckdb/duckdb-go-bindings/lib/darwin-amd64 v0.10505.0 h1:FrMqquFBQlMsi34h2KZgCku54rqA8xEbXZ0NLVDKwYs= +github.com/duckdb/duckdb-go-bindings/lib/darwin-amd64 v0.10505.0/go.mod h1:EnAvZh1kNJHp5yF+M1ZHNEvapnmt6anq1xXHVrAGqMo= +github.com/duckdb/duckdb-go-bindings/lib/darwin-arm64 v0.10505.0 h1:lbRbpQwT1MmUhh/VTwukV9K8bxKByV3UghAP3MvsbBo= +github.com/duckdb/duckdb-go-bindings/lib/darwin-arm64 v0.10505.0/go.mod h1:IGLSeEcFhNeZF16aVjQCULD7TsFZKG5G7SyKJAXKp5c= +github.com/duckdb/duckdb-go-bindings/lib/linux-amd64 v0.10505.0 h1:nrsaVYj3XYCRbS2FpdOMD/KHE7egRMr+/NR1IHmjT84= +github.com/duckdb/duckdb-go-bindings/lib/linux-amd64 v0.10505.0/go.mod h1:KAIynZ0GHCS7X5fRyuFnQMg/SZBPK/bS9OCOVojClxw= +github.com/duckdb/duckdb-go-bindings/lib/linux-arm64 v0.10505.0 h1:qM6oGDgwXBILJGbTY4fCy6QOczLpucUA6yn6g3ORjh4= +github.com/duckdb/duckdb-go-bindings/lib/linux-arm64 v0.10505.0/go.mod h1:81SGOYoEUs8qaAfSk1wRfM5oobrIJ5KI7AzYhK6/bvQ= +github.com/duckdb/duckdb-go-bindings/lib/windows-amd64 v0.10505.0 h1:DjqZl9rYreHkSOqnqLmkrqH5T8UdQNcxZLJVZzGmXXA= +github.com/duckdb/duckdb-go-bindings/lib/windows-amd64 v0.10505.0/go.mod h1:K25pJL26ARblGDeuAkrdblFvUen92+CwksLtPEHRqqQ= +github.com/duckdb/duckdb-go/v2 v2.10505.0 h1:SWwvLn2Qx/RQSnQNupwgIF8VbnJ5A6OQU9lYb/mDETI= +github.com/duckdb/duckdb-go/v2 v2.10505.0/go.mod h1:m0PW4J4FG9hlFlVdXi6Ds9owpyIDaBdE2jyce00fGcE= +github.com/go-viper/mapstructure/v2 v2.5.0 h1:vM5IJoUAy3d7zRSVtIwQgBj7BiWtMPfmPEgAXnvj1Ro= +github.com/go-viper/mapstructure/v2 v2.5.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= +github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= +github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/flatbuffers v25.12.19+incompatible h1:haMV2JRRJCe1998HeW/p0X9UaMTK6SDo0ffLn2+DbLs= +github.com/google/flatbuffers v25.12.19+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +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/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.9.2 h1:3ZhOzMWnR4yJ+RW1XImIPsD1aNSz4T4fyP7zlQb56hw= +github.com/jackc/pgx/v5 v5.9.2/go.mod h1:mal1tBGAFfLHvZzaYh77YS/eC6IX9OWbRV1QIIM0Jn4= +github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= +github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= +github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= +github.com/klauspost/compress v1.18.3 h1:9PJRvfbmTabkOX8moIpXPbMMbYN60bWImDDU7L+/6zw= +github.com/klauspost/compress v1.18.3/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4= +github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y= +github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= +github.com/pganalyze/pg_query_go/v6 v6.1.0 h1:jG5ZLhcVgL1FAw4C/0VNQaVmX1SUJx71wBGdtTtBvls= +github.com/pganalyze/pg_query_go/v6 v6.1.0/go.mod h1:nvTHIuoud6e1SfrUaFwHqT0i4b5Nr+1rPWVds3B5+50= +github.com/pierrec/lz4/v4 v4.1.25 h1:kocOqRffaIbU5djlIBr7Wh+cx82C0vtFb0fOurZHqD0= +github.com/pierrec/lz4/v4 v4.1.25/go.mod h1:EoQMVJgeeEOMsCqCzqFm2O0cJvljX2nGZjcRIPL34O4= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= +github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= +github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= +github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= +github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= +github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= +github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/xxh3 v1.1.0 h1:s7DLGDK45Dyfg7++yxI0khrfwq9661w9EN78eP/UZVs= +github.com/zeebo/xxh3 v1.1.0/go.mod h1:IisAie1LELR4xhVinxWS5+zf1lA4p0MW4T+w+W07F5s= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.52.0 h1:RMs7fP2rXdep0CftQlK8Uf+kibLm7qkCcradZWYz988= +golang.org/x/crypto v0.52.0/go.mod h1:1QgfPxDqh0T2M/elOJtp9RvuR95kVjir0e6/BvEmGbc= +golang.org/x/exp v0.0.0-20260112195511-716be5621a96 h1:Z/6YuSHTLOHfNFdb8zVZomZr7cqNgTJvA8+Qz75D8gU= +golang.org/x/exp v0.0.0-20260112195511-716be5621a96/go.mod h1:nzimsREAkjBCIEFtHiYkrJyT+2uy9YZJB7H1k68CXZU= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.35.0 h1:Ww1D637e6Pg+Zb2KrWfHQUnH2dQRLBQyAtpr/haaJeM= +golang.org/x/mod v0.35.0/go.mod h1:+GwiRhIInF8wPm+4AoT6L0FA1QWAad3OMdTRx4tFYlU= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +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/sync v0.0.0-20190423024810-112230192c58/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.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= +golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/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-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.45.0 h1:dO4czNzziLiiXplLQgBCEpCvXQ3dnkn0SdaZSYdQ+FY= +golang.org/x/sys v0.45.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/telemetry v0.0.0-20260409153401-be6f6cb8b1fa h1:efT73AJZfAAUV7SOip6pWGkwJDzIGiKBZGVzHYa+ve4= +golang.org/x/telemetry v0.0.0-20260409153401-be6f6cb8b1fa/go.mod h1:kHjTxDEnAu6/Nl9lDkzjWpR+bmKfxeiRuSDlsMb70gE= +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/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/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.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc= +golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.44.0 h1:UP4ajHPIcuMjT1GqzDWRlalUEoY+uzoZKnhOjbIPD2c= +golang.org/x/tools v0.44.0/go.mod h1:KA0AfVErSdxRZIsOVipbv3rQhVXTnlU6UhKxHd1seDI= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/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-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= +google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/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= diff --git a/server/iceberg_reader.go b/server/iceberg_reader.go new file mode 100644 index 0000000..5f5f57e --- /dev/null +++ b/server/iceberg_reader.go @@ -0,0 +1,196 @@ +package main + +import ( + "encoding/json" + "fmt" + "io" + "path" + "strings" +) + +// IcebergReader reads Iceberg table metadata directly from S3 +type IcebergReader struct { + Config *Config + S3Client *S3Client +} + +func NewIcebergReader(config *Config, s3Client *S3Client) *IcebergReader { + return &IcebergReader{ + Config: config, + S3Client: s3Client, + } +} + +// SchemaTables discovers all tables by scanning S3 for metadata files +func (reader *IcebergReader) SchemaTables() (Set[IcebergSchemaTable], error) { + schemaTables := NewSet[IcebergSchemaTable]() + + // List all folders in the iceberg base path (e.g., "audit/") + // Each folder like "audit/changes" becomes "audit.changes" + basePath := reader.Config.AuditBasePath + if basePath == "" { + basePath = "." + } + + // List objects with the base path prefix + objects := reader.S3Client.ListObjects(basePath + "/") + + // Track discovered table paths + discoveredPaths := make(map[string]bool) + + for _, obj := range objects.Contents { + key := *obj.Key + + // Look for metadata files: schema/table/metadata/v*.metadata.json + if strings.Contains(key, "/metadata/") && strings.HasSuffix(key, ".metadata.json") { + // Extract schema and table from path + // Example: "audit/changes/metadata/v1.metadata.json" -> schema="audit", table="changes" + relativePath := strings.TrimPrefix(key, basePath+"/") + parts := strings.Split(relativePath, "/") + + var schema, table string + if len(parts) >= 4 { + schema = parts[0] + table = parts[1] + } else if len(parts) == 3 { + table = parts[0] + baseParts := strings.Split(strings.TrimSuffix(basePath, "/"), "/") + if len(baseParts) > 0 && baseParts[len(baseParts)-1] != "" && baseParts[len(baseParts)-1] != "." { + schema = baseParts[len(baseParts)-1] + } else { + schema = "public" + } + } + + if schema != "" && table != "" { + tablePath := schema + "/" + table + + if !discoveredPaths[tablePath] { + discoveredPaths[tablePath] = true + schemaTables.Add(IcebergSchemaTable{ + Schema: schema, + Table: table, + }) + } + } + } + } + + return schemaTables, nil +} + +// MetadataFileS3Path returns the path to the latest metadata file for a table +func (reader *IcebergReader) MetadataFileS3Path(icebergSchemaTable IcebergSchemaTable) string { + basePath := reader.Config.AuditBasePath + var tablePath string + if basePath != "" { + baseParts := strings.Split(strings.TrimSuffix(basePath, "/"), "/") + lastBasePart := "" + if len(baseParts) > 0 { + lastBasePart = baseParts[len(baseParts)-1] + } + if lastBasePart == icebergSchemaTable.Schema { + tablePath = path.Join(basePath, icebergSchemaTable.Table) + } else { + tablePath = path.Join(basePath, icebergSchemaTable.Schema, icebergSchemaTable.Table) + } + } else { + tablePath = path.Join(icebergSchemaTable.Schema, icebergSchemaTable.Table) + } + metadataPath := tablePath + "/metadata" + + // List metadata files + objects := reader.S3Client.ListObjects(metadataPath + "/") + + // Find the latest v*.metadata.json file + var latestVersion int + var latestFile string + + for _, obj := range objects.Contents { + key := *obj.Key + if strings.HasSuffix(key, ".metadata.json") { + // Extract version number from filename like "v1.metadata.json" + filename := path.Base(key) + var version int + if _, err := fmt.Sscanf(filename, "v%d.metadata.json", &version); err == nil { + if version > latestVersion { + latestVersion = version + latestFile = key + } + } + } + } + + if latestFile == "" { + // Fallback to v1.metadata.json + return tablePath + "/metadata/v1.metadata.json" + } + + return latestFile +} + +// TableColumns reads column information from the Iceberg metadata file +func (reader *IcebergReader) TableColumns(icebergSchemaTable IcebergSchemaTable) ([]IcebergSchemaColumn, error) { + metadataPath := reader.MetadataFileS3Path(icebergSchemaTable) + if metadataPath == "" { + return nil, fmt.Errorf("metadata file not found for table %s.%s", icebergSchemaTable.Schema, icebergSchemaTable.Table) + } + + // Read metadata file from S3 + s3Key := reader.S3Client.ObjectKey(metadataPath) + getObjectOutput := reader.S3Client.GetObject(s3Key) + defer getObjectOutput.Body.Close() + + contentBytes, err := io.ReadAll(getObjectOutput.Body) + if err != nil { + return nil, fmt.Errorf("failed to read metadata file: %w", err) + } + content := string(contentBytes) + + // Parse Iceberg metadata JSON + var metadata struct { + Schemas []struct { + Fields []struct { + ID int `json:"id"` + Name string `json:"name"` + Required bool `json:"required"` + Type interface{} `json:"type"` + } `json:"fields"` + } `json:"schemas"` + } + + if err := json.Unmarshal([]byte(content), &metadata); err != nil { + return nil, fmt.Errorf("failed to parse metadata JSON: %w", err) + } + + // Use the last (current) schema + if len(metadata.Schemas) == 0 { + return nil, fmt.Errorf("no schemas found in metadata") + } + + currentSchema := metadata.Schemas[len(metadata.Schemas)-1] + columns := make([]IcebergSchemaColumn, 0, len(currentSchema.Fields)) + + for _, field := range currentSchema.Fields { + columns = append(columns, IcebergSchemaColumn{ + Name: field.Name, + Type: reader.icebergTypeToString(field.Type), + Required: field.Required, + }) + } + + return columns, nil +} + +// icebergTypeToString converts Iceberg type to string representation +func (reader *IcebergReader) icebergTypeToString(icebergType interface{}) string { + switch t := icebergType.(type) { + case string: + return t + case map[string]interface{}: + if typeStr, ok := t["type"].(string); ok { + return typeStr + } + } + return fmt.Sprintf("%v", icebergType) +} diff --git a/server/iceberg_schema_column.go b/server/iceberg_schema_column.go new file mode 100644 index 0000000..3f237e5 --- /dev/null +++ b/server/iceberg_schema_column.go @@ -0,0 +1,27 @@ +package main + +import ( + "fmt" +) + +type IcebergSchemaColumn struct { + Name string `json:"name"` + Type string `json:"type"` + Position int `json:"position"` + List bool `json:"list"` + Required bool `json:"required"` +} + +func (column IcebergSchemaColumn) ToSql() string { + sql := fmt.Sprintf(`"%s" %s`, column.Name, column.Type) + + if column.List { + sql += "[]" + } + + if column.Required { + sql += " NOT NULL" + } + + return sql +} diff --git a/server/iceberg_schema_table.go b/server/iceberg_schema_table.go new file mode 100644 index 0000000..1e8a292 --- /dev/null +++ b/server/iceberg_schema_table.go @@ -0,0 +1,14 @@ +package main + +import ( + "fmt" +) + +type IcebergSchemaTable struct { + Schema string + Table string +} + +func (schemaTable IcebergSchemaTable) String() string { + return fmt.Sprintf(`"%s"."%s"`, schemaTable.Schema, schemaTable.Table) +} diff --git a/server/logger_utils.go b/server/logger_utils.go new file mode 100644 index 0000000..3ba8ee7 --- /dev/null +++ b/server/logger_utils.go @@ -0,0 +1,51 @@ +package main + +import ( + "log" +) + +type LogLevel string + +const ( + LOG_LEVEL_TRACE = "TRACE" + LOG_LEVEL_DEBUG = "DEBUG" + LOG_LEVEL_WARN = "WARN" + LOG_LEVEL_INFO = "INFO" + LOG_LEVEL_ERROR = "ERROR" +) + +var LOG_LEVELS = []string{ + LOG_LEVEL_TRACE, + LOG_LEVEL_DEBUG, + LOG_LEVEL_WARN, + LOG_LEVEL_INFO, + LOG_LEVEL_ERROR, +} + +func LogError(config *Config, message ...interface{}) { + log.Println(append([]interface{}{"[ERROR]"}, redactLogValues(message)...)...) +} + +func LogWarn(config *Config, message ...interface{}) { + if config.LogLevel != LOG_LEVEL_ERROR { + log.Println(append([]interface{}{"[WARN]"}, redactLogValues(message)...)...) + } +} + +func LogInfo(config *Config, message ...interface{}) { + if config.LogLevel != LOG_LEVEL_ERROR && config.LogLevel != LOG_LEVEL_WARN { + log.Println(append([]interface{}{"[INFO]"}, redactLogValues(message)...)...) + } +} + +func LogDebug(config *Config, message ...interface{}) { + if config.LogLevel == LOG_LEVEL_DEBUG || config.LogLevel == LOG_LEVEL_TRACE { + log.Println(append([]interface{}{"[DEBUG]"}, redactLogValues(message)...)...) + } +} + +func LogTrace(config *Config, message ...interface{}) { + if config.LogLevel == LOG_LEVEL_TRACE { + log.Println(append([]interface{}{"[TRACE]"}, redactLogValues(message)...)...) + } +} diff --git a/server/main.go b/server/main.go new file mode 100644 index 0000000..05d2377 --- /dev/null +++ b/server/main.go @@ -0,0 +1,89 @@ +package main + +import ( + "slices" + "sync/atomic" +) + +const ( + COMMAND_START = "start" + COMMAND_VERSION = "version" + + DUCKDB_SCHEMA_MAIN = "main" +) + +func main() { + config := LoadConfig() + defer HandleUnexpectedPanic(config) + + tcpListener := NewTcpListener(config) + LogInfo(config, "PgStack: Listening on", tcpListener.Addr()) + runtimeManager := &RuntimeManager{} + + var connectionCount int64 = 0 + for { + conn := AcceptConnection(config, tcpListener) + atomic.AddInt64(&connectionCount, 1) + LogInfo(config, "PgStack: Accepted", Int64ToString(atomic.LoadInt64(&connectionCount))+"th", "connection from", conn.RemoteAddr()) + server := NewPostgresServer(config, &conn) + + go func() { + server.Run(runtimeManager.Acquire) + defer server.Close() + LogInfo(config, "PgStack: Closed", Int64ToString(atomic.LoadInt64(&connectionCount))+"th", "connection from", conn.RemoteAddr()) + atomic.AddInt64(&connectionCount, -1) + }() + } +} + +func duckdbBootQueris(config *Config) []string { + setupQueries := []string{ + "INSTALL httpfs", + "LOAD httpfs", + } + if config.AuditEnabled { + setupQueries = append(setupQueries, + "INSTALL iceberg", + "LOAD iceberg", + ) + } + setupQueries = append(setupQueries, + // Set up schemas + "SELECT oid FROM pg_catalog.pg_namespace", + "CREATE SCHEMA "+PG_SCHEMA_PUBLIC, + + // Configure DuckDB + "SET memory_limit='"+config.DuckDBMemoryLimit+"'", + "SET threads=2", + "SET preserve_insertion_order=false", + "SET scalar_subquery_error_on_multiple_rows=false", + // Cache + "SET parquet_metadata_cache=true", + "SET enable_external_file_cache=true", + "SET validate_external_file_cache=VALIDATE_REMOTE", + ) + queries := slices.Concat( + setupQueries, + + // Create pg-compatible functions + CreatePgCatalogMacroQueries(config), + CreateInformationSchemaMacroQueries(config), + + // Create pg-compatible tables and views + CreatePgCatalogTableQueries(config), + CreateInformationSchemaTableQueries(config), + + // Use the public schema + []string{"USE " + PG_SCHEMA_PUBLIC}, + ) + if config.SearchTablesJSON != "" && config.SearchTablesJSON != "[]" { + queries = append(queries, + "INSTALL lance", + "LOAD lance", + duckdbLanceSecretQuery(config), + "ATTACH 's3://"+config.AwsS3Bucket+"/"+config.SearchBasePath+"' AS search_store (TYPE LANCE, READ_WRITE)", + ) + queries = append(queries, searchCatalogBootQueries(config)...) + } + return queries +} diff --git a/server/main_test.go b/server/main_test.go new file mode 100644 index 0000000..9fe32ac --- /dev/null +++ b/server/main_test.go @@ -0,0 +1,197 @@ +package main + +import ( + "errors" + "sync" + "sync/atomic" + "testing" + "time" +) + +func TestRuntimeManagerSharesLazyInitialization(t *testing.T) { + started := make(chan struct{}) + allowInitialization := make(chan struct{}) + manager := &RuntimeManager{ + runtimeFactory: func(config *Config) (*ServerRuntime, error) { + close(started) + <-allowInitialization + return fakeServerRuntime(), nil + }, + } + + firstDone := make(chan error, 1) + go func() { + _, release, err := manager.Acquire(&Config{Database: "slow"}) + if err == nil { + release() + } + firstDone <- err + }() + <-started + + secondDone := make(chan error, 1) + go func() { + _, release, err := manager.Acquire(&Config{Database: "fast"}) + if err == nil { + release() + } + secondDone <- err + }() + + select { + case <-secondDone: + close(allowInitialization) + t.Fatal("second initialization should wait for the first lazy startup") + default: + } + + close(allowInitialization) + if err := <-firstDone; err != nil { + t.Fatalf("first database initialization failed: %v", err) + } + if err := <-secondDone; err != nil { + t.Fatalf("second database initialization failed: %v", err) + } +} + +func TestRuntimeManagerWaitsForExpiredRuntimeToCloseBeforeRecreating(t *testing.T) { + var attempts atomic.Int32 + runtime := fakeServerRuntime() + manager := &RuntimeManager{ + runtime: runtime, + runtimeFactory: func(config *Config) (*ServerRuntime, error) { + attempts.Add(1) + return fakeServerRuntime(), nil + }, + } + config := &Config{Database: "expired"} + + runtime.RequestMu.RLock() + expired := make(chan struct{}) + go func() { + manager.expireRuntime(config, runtime) + close(expired) + }() + + deadline := time.After(time.Second) + for { + manager.mu.Lock() + isExpired := runtime.Expired + manager.mu.Unlock() + if isExpired { + break + } + + select { + case <-deadline: + runtime.RequestMu.RUnlock() + t.Fatal("runtime was not marked expired") + default: + time.Sleep(time.Millisecond) + } + } + + acquireDone := make(chan error, 1) + go func() { + _, release, err := manager.Acquire(config) + if err == nil { + release() + } + acquireDone <- err + }() + + select { + case <-acquireDone: + runtime.RequestMu.RUnlock() + t.Fatal("new runtime was created before expired runtime closed") + default: + } + if got := attempts.Load(); got != 0 { + runtime.RequestMu.RUnlock() + t.Fatalf("runtime creation attempts before close = %d, want 0", got) + } + + runtime.RequestMu.RUnlock() + select { + case <-expired: + case <-time.After(time.Second): + t.Fatal("expired runtime did not close") + } + if err := <-acquireDone; err != nil { + t.Fatalf("runtime acquisition after close failed: %v", err) + } + if got := attempts.Load(); got != 1 { + t.Fatalf("runtime creation attempts after close = %d, want 1", got) + } +} + +func TestRuntimeManagerRetriesAfterInitializationFailure(t *testing.T) { + var attempts atomic.Int32 + manager := &RuntimeManager{ + runtimeFactory: func(config *Config) (*ServerRuntime, error) { + if attempts.Add(1) == 1 { + return nil, errors.New("boot failed") + } + return fakeServerRuntime(), nil + }, + } + config := &Config{Database: "retry"} + + if _, _, err := manager.Acquire(config); err == nil { + t.Fatal("expected first initialization to fail") + } + _, release, err := manager.Acquire(config) + if err != nil { + t.Fatalf("expected initialization retry to succeed: %v", err) + } + release() + + if got := attempts.Load(); got != 2 { + t.Fatalf("initialization attempts = %d, want 2", got) + } +} + +func TestRuntimeManagerSharesInitializationWithinDatabase(t *testing.T) { + var attempts atomic.Int32 + started := make(chan struct{}) + allowInitialization := make(chan struct{}) + manager := &RuntimeManager{ + runtimeFactory: func(config *Config) (*ServerRuntime, error) { + attempts.Add(1) + close(started) + <-allowInitialization + return fakeServerRuntime(), nil + }, + } + config := &Config{Database: "shared"} + done := make(chan error, 2) + + acquire := func() { + _, release, err := manager.Acquire(config) + if err == nil { + release() + } + done <- err + } + go acquire() + <-started + go acquire() + close(allowInitialization) + + for range 2 { + if err := <-done; err != nil { + t.Fatalf("database initialization failed: %v", err) + } + } + if got := attempts.Load(); got != 1 { + t.Fatalf("initialization attempts = %d, want 1", got) + } +} + +func fakeServerRuntime() *ServerRuntime { + return &ServerRuntime{ + QueryHandler: &QueryHandler{}, + RequestMu: &sync.RWMutex{}, + Closed: make(chan struct{}), + } +} diff --git a/src/server/parser_a_expr.go b/server/parser_a_expr.go similarity index 79% rename from src/server/parser_a_expr.go rename to server/parser_a_expr.go index fc23284..e63342a 100644 --- a/src/server/parser_a_expr.go +++ b/server/parser_a_expr.go @@ -7,14 +7,16 @@ import ( ) type ParserAExpr struct { - config *Config - utils *ParserUtils + config *Config + utils *ParserUtils + parserTypeCast *ParserTypeCast } func NewParserAExpr(config *Config) *ParserAExpr { return &ParserAExpr{ - config: config, - utils: NewParserUtils(config), + config: config, + utils: NewParserUtils(config), + parserTypeCast: NewParserTypeCast(config), } } @@ -153,6 +155,37 @@ func (parser *ParserAExpr) ConvertedRightAnyStringConstantToIn(node *pgQuery.Nod } } +// value = ANY($1::text[]) -> list_contains($1::text[], value) +// +// DuckDB cannot UNNEST a parameterized list in an ANY expression because it +// treats it as a correlated expression. list_contains has the same membership +// semantics for this common equality form without requiring UNNEST. +func (parser *ParserAExpr) RemappedAnyTextArrayParameter(node *pgQuery.Node) *pgQuery.Node { + aExpr := parser.AExpr(node) + if aExpr == nil || aExpr.Kind != pgQuery.A_Expr_Kind_AEXPR_OP_ANY || len(aExpr.Name) != 1 || aExpr.Name[0].GetString_().Sval != "=" { + return node + } + + if aExpr.Rexpr == nil { + return node + } + typeCast := aExpr.Rexpr.GetTypeCast() + if typeCast == nil || typeCast.Arg.GetParamRef() == nil { + return node + } + + typeName := parser.parserTypeCast.TypeName(typeCast) + if typeName != "text[]" && typeName != "pg_catalog.text[]" { + return node + } + + return pgQuery.MakeFuncCallNode( + []*pgQuery.Node{pgQuery.MakeStrNode("list_contains")}, + []*pgQuery.Node{aExpr.Rexpr, aExpr.Lexpr}, + 0, + ) +} + // pg_catalog.[operator] -> [operator] func (parser *ParserAExpr) RemovePgCatalog(node *pgQuery.Node) { aExpr := parser.AExpr(node) diff --git a/src/server/parser_column_ref.go b/server/parser_column_ref.go similarity index 100% rename from src/server/parser_column_ref.go rename to server/parser_column_ref.go diff --git a/src/server/parser_function.go b/server/parser_function.go similarity index 94% rename from src/server/parser_function.go rename to server/parser_function.go index feeba6c..aea2c87 100644 --- a/src/server/parser_function.go +++ b/server/parser_function.go @@ -4,8 +4,6 @@ import ( "strings" pgQuery "github.com/pganalyze/pg_query_go/v6" - - "github.com/BemiHQ/BemiDB/src/common" ) type ParserFunction struct { @@ -60,7 +58,7 @@ func (parser *ParserFunction) RemapSchemaToMain(functionCall *pgQuery.FuncCall) case 2: functionCall.Funcname[0] = pgQuery.MakeStrNode(DUCKDB_SCHEMA_MAIN) default: - common.Panic(parser.config.CommonConfig, "Unexpected function name length: "+common.IntToString(len(functionCall.Funcname))) + Panic(parser.config, "Unexpected function name length: "+IntToString(len(functionCall.Funcname))) } } @@ -101,7 +99,7 @@ func (parser *ParserFunction) RemapJsonbAgg(functionCall *pgQuery.FuncCall) { func (parser *ParserFunction) RemapFormatToPrintf(functionCall *pgQuery.FuncCall) { format := parser.FirstArgumentToString(functionCall) for i := range functionCall.Args[1:] { - format = strings.Replace(format, "%s", "%"+common.IntToString(i+1)+"$s", 1) + format = strings.Replace(format, "%s", "%"+IntToString(i+1)+"$s", 1) } functionCall.Funcname = []*pgQuery.Node{pgQuery.MakeStrNode("printf")} diff --git a/src/server/parser_select.go b/server/parser_select.go similarity index 100% rename from src/server/parser_select.go rename to server/parser_select.go diff --git a/src/server/parser_show.go b/server/parser_show.go similarity index 100% rename from src/server/parser_show.go rename to server/parser_show.go diff --git a/src/server/parser_table.go b/server/parser_table.go similarity index 68% rename from src/server/parser_table.go rename to server/parser_table.go index a5256a7..df4b40c 100644 --- a/src/server/parser_table.go +++ b/server/parser_table.go @@ -1,9 +1,6 @@ package main import ( - "strings" - - "github.com/BemiHQ/BemiDB/src/common" pgQuery "github.com/pganalyze/pg_query_go/v6" ) @@ -50,58 +47,22 @@ func (parser *ParserTable) IsTableFromInformationSchema(qSchemaTable QuerySchema // public.table -> (SELECT permitted, columns FROM iceberg_scan('path')) table // public.table -> (SELECT NULL WHERE FALSE) table // public.table t -> (SELECT * FROM iceberg_scan('path')) t -func (parser *ParserTable) MakeIcebergTableNode(queryToIcebergTable QueryToIcebergTable, permissions *map[string][]string) *pgQuery.Node { - var query string - if permissions == nil { - query = "SELECT * FROM iceberg_scan('" + queryToIcebergTable.IcebergTablePath + "')" - } else if columnNames, allowed := (*permissions)[queryToIcebergTable.QuerySchemaTable.ToIcebergSchemaTable().ToArg()]; allowed { - quotedColumnNames := make([]string, len(columnNames)) - for i, columnName := range columnNames { - quotedColumnNames[i] = "\"" + columnName + "\"" - } - query = "SELECT " + strings.Join(quotedColumnNames, ", ") + " FROM iceberg_scan('" + queryToIcebergTable.IcebergTablePath + "')" - } else { - query = "SELECT NULL WHERE FALSE" - } - +func (parser *ParserTable) MakeIcebergTableNode(queryToIcebergTable QueryToIcebergTable) *pgQuery.Node { + query := "SELECT * FROM iceberg_scan('" + queryToIcebergTable.IcebergTablePath + "')" return parser.makeSubselectNode(query, queryToIcebergTable.QuerySchemaTable) } // information_schema.tables -> (SELECT * FROM main.tables) information_schema_tables -// information_schema.tables -> (SELECT * FROM main.tables WHERE table_schema || '.' || table_name IN ('permitted.table')) information_schema_tables // information_schema.tables t -> (SELECT * FROM main.tables) t -func (parser *ParserTable) MakeInformationSchemaTablesNode(qSchemaTable QuerySchemaTable, permissions *map[string][]string) *pgQuery.Node { +func (parser *ParserTable) MakeInformationSchemaTablesNode(qSchemaTable QuerySchemaTable) *pgQuery.Node { query := "SELECT * FROM main.tables" - - if permissions != nil { - quotedSchemaTableNames := []string{} - for schemaTable := range *permissions { - quotedSchemaTableNames = append(quotedSchemaTableNames, "'"+schemaTable+"'") - } - query += " WHERE table_schema || '.' || table_name IN (" + strings.Join(quotedSchemaTableNames, ", ") + ")" - } - return parser.makeSubselectNode(query, qSchemaTable) } // information_schema.columns -> (SELECT * FROM main.columns) information_schema_columns -// information_schema.columns -> (SELECT * FROM main.columns WHERE (table_schema || '.' || table_name IN ('permitted.table') AND column_name IN ('permitted', 'columns')) OR ...) information_schema_columns // information_schema.columns c -> (SELECT * FROM main.columns) c -func (parser *ParserTable) MakeInformationSchemaColumnsNode(qSchemaTable QuerySchemaTable, permissions *map[string][]string) *pgQuery.Node { +func (parser *ParserTable) MakeInformationSchemaColumnsNode(qSchemaTable QuerySchemaTable) *pgQuery.Node { query := "SELECT * FROM main.columns" - - if permissions != nil { - conditions := []string{} - for schemaTable, columnNames := range *permissions { - quotedColumnNames := []string{} - for _, columnName := range columnNames { - quotedColumnNames = append(quotedColumnNames, "'"+columnName+"'") - } - conditions = append(conditions, "(table_schema || '.' || table_name = '"+schemaTable+"' AND column_name IN ("+strings.Join(quotedColumnNames, ", ")+"))") - } - query += " WHERE " + strings.Join(conditions, " OR ") - } - return parser.makeSubselectNode(query, qSchemaTable) } @@ -161,7 +122,7 @@ func (parser *ParserTable) SetAliasIfNotExists(rangeFunction *pgQuery.RangeFunct // (query) AS qSchemaTable func (parser *ParserTable) makeSubselectNode(query string, qSchemaTable QuerySchemaTable) *pgQuery.Node { queryTree, err := pgQuery.Parse(query) - common.PanicIfError(parser.config.CommonConfig, err) + PanicIfError(parser.config, err) alias := qSchemaTable.Alias if alias == "" { diff --git a/src/server/parser_type_cast.go b/server/parser_type_cast.go similarity index 81% rename from src/server/parser_type_cast.go rename to server/parser_type_cast.go index 6f6fd0e..5349c5d 100644 --- a/src/server/parser_type_cast.go +++ b/server/parser_type_cast.go @@ -4,6 +4,8 @@ import ( "strings" pgQuery "github.com/pganalyze/pg_query_go/v6" + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/reflect/protoreflect" ) type ParserTypeCast struct { @@ -11,6 +13,37 @@ type ParserTypeCast struct { config *Config } +func (parser *ParserTypeCast) TextArrayParameters(message proto.Message) map[int]bool { + parameters := make(map[int]bool) + + var visit func(protoreflect.Message) + visit = func(current protoreflect.Message) { + if typeCast, ok := current.Interface().(*pgQuery.TypeCast); ok { + typeName := parser.TypeName(typeCast) + if typeName == "text[]" || typeName == "pg_catalog.text[]" { + if parameter := typeCast.Arg.GetParamRef(); parameter != nil { + parameters[int(parameter.Number)] = true + } + } + } + + current.Range(func(field protoreflect.FieldDescriptor, value protoreflect.Value) bool { + if field.IsList() && field.Kind() == protoreflect.MessageKind { + list := value.List() + for i := 0; i < list.Len(); i++ { + visit(list.Get(i).Message()) + } + } else if field.Kind() == protoreflect.MessageKind { + visit(value.Message()) + } + return true + }) + } + + visit(message.ProtoReflect()) + return parameters +} + func NewParserTypeCast(config *Config) *ParserTypeCast { return &ParserTypeCast{utils: NewParserUtils(config), config: config} } @@ -88,7 +121,12 @@ func (parser *ParserTypeCast) SetTypeCastArg(typeCast *pgQuery.TypeCast, arg *pg } func (parser *ParserTypeCast) MakeListValueFromArray(node *pgQuery.Node) *pgQuery.Node { - arrayStr := node.GetAConst().GetSval().Sval + arrayConstant := node.GetAConst() + if arrayConstant == nil || arrayConstant.GetSval() == nil { + return node + } + + arrayStr := arrayConstant.GetSval().Sval arrayStr = strings.Trim(arrayStr, "{}") elements := strings.Split(arrayStr, ",") diff --git a/src/server/parser_utils.go b/server/parser_utils.go similarity index 88% rename from src/server/parser_utils.go rename to server/parser_utils.go index 8465a8c..c4df726 100644 --- a/src/server/parser_utils.go +++ b/server/parser_utils.go @@ -2,8 +2,6 @@ package main import ( pgQuery "github.com/pganalyze/pg_query_go/v6" - - "github.com/BemiHQ/BemiDB/src/common" ) type ParserUtils struct { @@ -27,7 +25,7 @@ func (utils *ParserUtils) SchemaFunction(functionCall *pgQuery.FuncCall) *QueryS Function: functionCall.Funcname[1].GetString_().Sval, } default: - common.Panic(utils.config.CommonConfig, "Invalid function call") + Panic(utils.config, "Invalid function call") return nil } } diff --git a/src/server/pg_constants.go b/server/pg_constants.go similarity index 93% rename from src/server/pg_constants.go rename to server/pg_constants.go index 58f1ab2..0559546 100644 --- a/src/server/pg_constants.go +++ b/server/pg_constants.go @@ -1,13 +1,12 @@ package main -import ( - "github.com/BemiHQ/BemiDB/src/common" -) +import () const ( PG_SCHEMA_INFORMATION_SCHEMA = "information_schema" PG_SCHEMA_PG_CATALOG = "pg_catalog" PG_SCHEMA_PUBLIC = "public" + PG_SCHEMA_SEARCH = "search" PG_FUNCTION_FORMAT = "format" PG_FUNCTION_ENCODE = "encode" @@ -16,6 +15,7 @@ const ( PG_FUNCTION_JSONB_ARRAY_ELEMENTS = "jsonb_array_elements" PG_TABLE_PG_MATVIEWS = "pg_matviews" + PG_TABLE_PG_ATTRIBUTE = "pg_attribute" PG_TABLE_PG_CLASS = "pg_class" PG_TABLE_PG_STAT_USER_TABLES = "pg_stat_user_tables" PG_TABLE_TABLES = "tables" @@ -24,7 +24,7 @@ const ( PG_VAR_SEARCH_PATH = "search_path" ) -var PG_SYSTEM_TABLES = common.NewSet[string]().AddAll([]string{ +var PG_SYSTEM_TABLES = NewSet[string]().AddAll([]string{ "pg_aggregate", "pg_am", "pg_amop", @@ -97,7 +97,7 @@ var PG_SYSTEM_TABLES = common.NewSet[string]().AddAll([]string{ "pg_views", }) -var PG_SYSTEM_VIEWS = common.NewSet[string]().AddAll([]string{ +var PG_SYSTEM_VIEWS = NewSet[string]().AddAll([]string{ "pg_stat_activity", "pg_stat_replication", "pg_stat_wal_receiver", diff --git a/src/server/postgres_server.go b/server/postgres_server.go similarity index 65% rename from src/server/postgres_server.go rename to server/postgres_server.go index fdae1b3..bcaded2 100644 --- a/src/server/postgres_server.go +++ b/server/postgres_server.go @@ -8,8 +8,6 @@ import ( "time" "github.com/jackc/pgx/v5/pgproto3" - - "github.com/BemiHQ/BemiDB/src/common" ) const ( @@ -17,9 +15,8 @@ const ( PG_ENCODING = "UTF8" PG_TX_STATUS_IDLE = 'I' - SYSTEM_AUTH_USER = "bemidb" - RETRY_SIMPLE_QUERY_TIMEOUT = 5 * time.Second + CLIENT_ERROR_MESSAGE = "internal server error" ) type PostgresServer struct { @@ -39,7 +36,7 @@ func NewPostgresServer(config *Config, conn *net.Conn) *PostgresServer { func NewTcpListener(config *Config) net.Listener { parsedIp := net.ParseIP(config.Host) if parsedIp == nil { - common.PrintErrorAndExit(config.CommonConfig, "Invalid host: "+config.Host+".") + PrintErrorAndExit(config, "Invalid host: "+config.Host+".") } var network, host string @@ -52,23 +49,22 @@ func NewTcpListener(config *Config) net.Listener { } tcpListener, err := net.Listen(network, host+":"+config.Port) - common.PanicIfError(config.CommonConfig, err) + PanicIfError(config, err) return tcpListener } func AcceptConnection(config *Config, listener net.Listener) net.Conn { conn, err := listener.Accept() - common.PanicIfError(config.CommonConfig, err) + PanicIfError(config, err) return conn } -func (server *PostgresServer) Run(queryHandler *QueryHandler) { +func (server *PostgresServer) Run(runtimeProvider func(*Config) (*QueryHandler, func(), error)) { err := server.handleStartup() if err != nil { - common.LogError(server.config.CommonConfig, "Error handling startup:", err) + LogError(server.config, "Error handling startup:", err) return // Terminate connection } - for { message, err := server.backend.Receive() if err != nil { @@ -77,17 +73,29 @@ func (server *PostgresServer) Run(queryHandler *QueryHandler) { switch message := message.(type) { case *pgproto3.Query: + queryHandler, releaseRuntime, err := runtimeProvider(server.config) + if err != nil { + server.writeError(fmt.Errorf("failed to initialize database runtime: %w", err)) + continue + } server.handleSimpleQuery(queryHandler, message) + releaseRuntime() case *pgproto3.Parse: + queryHandler, releaseRuntime, err := runtimeProvider(server.config) + if err != nil { + server.writeError(fmt.Errorf("failed to initialize database runtime: %w", err)) + continue + } err = server.handleExtendedQuery(queryHandler, message) // recursion + releaseRuntime() if err != nil { return // Terminate connection } case *pgproto3.Terminate: - common.LogDebug(server.config.CommonConfig, "Client terminated connection") + LogDebug(server.config, "Client terminated connection") return default: - common.LogError(server.config.CommonConfig, "Received message other than Query from client:", message) + LogError(server.config, "Received message other than Query from client:", message) return // Terminate connection } } @@ -98,11 +106,11 @@ func (server *PostgresServer) Close() error { } func (server *PostgresServer) handleSimpleQuery(queryHandler *QueryHandler, queryMessage *pgproto3.Query) { - common.LogDebug(server.config.CommonConfig, "Received query:", queryMessage.String) + LogDebug(server.config, "Received query:", queryMessage.String) messages, err := queryHandler.HandleSimpleQuery(queryMessage.String) if err != nil { if server.isS3NotFoundError(err) { - common.LogDebug(server.config.CommonConfig, "Retrying query due to resynced table") + LogDebug(server.config, "Retrying query due to resynced table") time.Sleep(RETRY_SIMPLE_QUERY_TIMEOUT) messages, err = queryHandler.HandleSimpleQuery(queryMessage.String) } @@ -117,12 +125,13 @@ func (server *PostgresServer) handleSimpleQuery(queryHandler *QueryHandler, quer func (server *PostgresServer) isS3NotFoundError(err error) bool { return strings.Contains(err.Error(), "v1.metadata.json\": 404 (Not Found)") || + strings.Contains(err.Error(), "v1.metadata.json': (HTTP 404)") || strings.Contains(err.Error(), ".parquet' (HTTP 404)") || strings.Contains(err.Error(), ".avro' (HTTP 404)") } func (server *PostgresServer) handleExtendedQuery(queryHandler *QueryHandler, parseMessage *pgproto3.Parse) error { - common.LogDebug(server.config.CommonConfig, "Parsing query", parseMessage.Query) + LogDebug(server.config, "Parsing query", parseMessage.Query) messages, preparedStatement, err := queryHandler.HandleParseQuery(parseMessage) if err != nil { server.writeError(err) @@ -143,7 +152,7 @@ func (server *PostgresServer) handleExtendedQuery(queryHandler *QueryHandler, pa continue } - common.LogDebug(server.config.CommonConfig, "Binding query", message.PreparedStatement) + LogDebug(server.config, "Binding query", message.PreparedStatement) messages, preparedStatement, err = queryHandler.HandleBindQuery(message, preparedStatement) if err != nil { server.writeError(err) @@ -155,7 +164,7 @@ func (server *PostgresServer) handleExtendedQuery(queryHandler *QueryHandler, pa continue } - common.LogDebug(server.config.CommonConfig, "Describing query", message.Name, "("+string(message.ObjectType)+")") + LogDebug(server.config, "Describing query", message.Name, "("+string(message.ObjectType)+")") var messages []pgproto3.Message messages, preparedStatement, err = queryHandler.HandleDescribeQuery(message, preparedStatement) if err != nil { @@ -168,7 +177,7 @@ func (server *PostgresServer) handleExtendedQuery(queryHandler *QueryHandler, pa continue } - common.LogDebug(server.config.CommonConfig, "Executing query", message.Portal) + LogDebug(server.config, "Executing query", message.Portal) messages, err := queryHandler.HandleExecuteQuery(message, preparedStatement) if err != nil { server.writeError(err) @@ -176,7 +185,7 @@ func (server *PostgresServer) handleExtendedQuery(queryHandler *QueryHandler, pa } server.writeMessages(messages...) case *pgproto3.Sync: - common.LogDebug(server.config.CommonConfig, "Syncing query") + LogDebug(server.config, "Syncing query") server.writeMessages( &pgproto3.ReadyForQuery{TxStatus: PG_TX_STATUS_IDLE}, ) @@ -194,10 +203,10 @@ func (server *PostgresServer) handleExtendedQuery(queryHandler *QueryHandler, pa case *pgproto3.Flush: // Ignore Flush messages, as we are sending responses immediately. case *pgproto3.Close: - common.LogDebug(server.config.CommonConfig, "Closing prepared statement", message.Name) + LogDebug(server.config, "Closing prepared statement", message.Name) server.writeMessages(&pgproto3.CloseComplete{}) default: - common.LogError(server.config.CommonConfig, fmt.Sprintf("Received unexpected message type from client: %T", message)) + LogError(server.config, fmt.Sprintf("Received unexpected message type from client: %T", message)) return fmt.Errorf("received unexpected message type from client: %T", message) } } @@ -212,15 +221,28 @@ func (server *PostgresServer) writeMessages(messages ...pgproto3.Message) { } func (server *PostgresServer) writeError(err error) { - common.LogError(server.config.CommonConfig, err.Error()) + LogError(server.config, err.Error()) + severity := PG_ERROR_SEVERITY_ERROR + code := PG_ERROR_CODE_INTERNAL_ERROR + message := CLIENT_ERROR_MESSAGE + var clientError *ClientError + if errors.As(err, &clientError) { + severity = clientError.Severity + code = clientError.Code + message = clientError.Message + } - server.writeMessages( + messages := []pgproto3.Message{ &pgproto3.ErrorResponse{ - Severity: "ERROR", - Message: err.Error(), + Severity: severity, + Code: code, + Message: message, }, - &pgproto3.ReadyForQuery{TxStatus: PG_TX_STATUS_IDLE}, - ) + } + if severity != PG_ERROR_SEVERITY_FATAL { + messages = append(messages, &pgproto3.ReadyForQuery{TxStatus: PG_TX_STATUS_IDLE}) + } + server.writeMessages(messages...) } func (server *PostgresServer) handleStartup() error { @@ -232,16 +254,17 @@ func (server *PostgresServer) handleStartup() error { switch startupMessage := startupMessage.(type) { case *pgproto3.StartupMessage: params := startupMessage.Parameters - common.LogDebug(server.config.CommonConfig, "BemiDB: startup message", params) + LogDebug(server.config, "PgStack: startup message", params) - if params["database"] != server.config.Database { - server.writeError(errors.New("database " + params["database"] + " does not exist")) - return errors.New("database does not exist") + connectionConfig, err := server.configForStartup(params["database"], params["user"]) + if err != nil { + server.writeError(err) + return err } - - if server.config.User != "" && params["user"] != server.config.User && params["user"] != SYSTEM_AUTH_USER { - server.writeError(errors.New("role \"" + params["user"] + "\" does not exist")) - return errors.New("role does not exist") + server.config = connectionConfig + if err := server.authenticateStartup(params["user"]); err != nil { + server.writeError(err) + return err } server.writeMessages( @@ -256,9 +279,31 @@ func (server *PostgresServer) handleStartup() error { if err != nil { return err } - server.handleStartup() - return nil + return server.handleStartup() default: return errors.New("unknown startup message") } } + +func (server *PostgresServer) configForStartup(database string, user string) (*Config, error) { + if database != server.config.Database { + message := "database \"" + database + "\" does not exist" + return nil, NewClientError( + PG_ERROR_SEVERITY_FATAL, + PG_ERROR_CODE_INVALID_CATALOG_NAME, + message, + errors.New(message), + ) + } + if !startupUserAllowed(server.config, user) { + message := "role \"" + user + "\" does not exist" + return nil, NewClientError( + PG_ERROR_SEVERITY_FATAL, + PG_ERROR_CODE_INVALID_AUTHORIZATION_SPECIFICATION, + message, + errors.New(message), + ) + } + + return server.config, nil +} diff --git a/server/postgres_server_test.go b/server/postgres_server_test.go new file mode 100644 index 0000000..177d3c9 --- /dev/null +++ b/server/postgres_server_test.go @@ -0,0 +1,37 @@ +package main + +import ( + "errors" + "testing" +) + +func TestConfigForStartupPreservesDatabaseError(t *testing.T) { + server := &PostgresServer{config: &Config{Database: "db_expected", User: "u_expected"}} + + _, err := server.configForStartup("db_missing", "u_expected") + if err == nil || err.Error() != `database "db_missing" does not exist` { + t.Fatalf("unexpected error: %v", err) + } + assertClientError(t, err, PG_ERROR_SEVERITY_FATAL, PG_ERROR_CODE_INVALID_CATALOG_NAME, `database "db_missing" does not exist`) +} + +func TestConfigForStartupPreservesRoleError(t *testing.T) { + server := &PostgresServer{config: &Config{Database: "db_expected", User: "u_expected"}} + + _, err := server.configForStartup("db_expected", "u_missing") + if err == nil || err.Error() != `role "u_missing" does not exist` { + t.Fatalf("unexpected error: %v", err) + } + assertClientError(t, err, PG_ERROR_SEVERITY_FATAL, PG_ERROR_CODE_INVALID_AUTHORIZATION_SPECIFICATION, `role "u_missing" does not exist`) +} + +func assertClientError(t *testing.T, err error, severity, code, message string) { + t.Helper() + var clientError *ClientError + if !errors.As(err, &clientError) { + t.Fatalf("error type = %T, want *ClientError", err) + } + if clientError.Severity != severity || clientError.Code != code || clientError.Message != message { + t.Fatalf("client error = %+v, want severity=%s code=%s message=%q", clientError, severity, code, message) + } +} diff --git a/server/query_handler.go b/server/query_handler.go new file mode 100644 index 0000000..e9cabf7 --- /dev/null +++ b/server/query_handler.go @@ -0,0 +1,573 @@ +package main + +import ( + "context" + "database/sql" + "encoding/binary" + "fmt" + "math" + "sort" + "strings" + "time" + + "github.com/google/uuid" + "github.com/jackc/pgx/v5/pgproto3" + "github.com/jackc/pgx/v5/pgtype" +) + +const ( + FALLBACK_SQL_QUERY = "SELECT 1" + PREPARE_STATEMENT_TIMEOUT = 30 * time.Second +) + +type QueryHandler struct { + Config *Config + ServerDuckdbClient *DuckdbClient + QueryRemapper *QueryRemapper + ResponseHandler *ResponseHandler + EmbeddingClient *EmbeddingClient +} + +type PreparedStatement struct { + // Parse + Name string + OriginalQuery string + Query string + Statement *sql.Stmt + ParameterOIDs []uint32 + // VectorParameters maps one-based PostgreSQL bind parameter numbers to + // search text/vector validation and generated search bindings. + VectorParameters map[int]SearchParameterSpec + // TextArrayParameters identifies PostgreSQL text[] values that need decoding + // from PostgreSQL's wire representation before DuckDB can bind them. + TextArrayParameters map[int]bool + + // Bind + Bound bool + Variables []interface{} + Portal string + + // Describe + Described bool + + // Describe/Execute + Rows *sql.Rows +} + +func NewQueryHandler(config *Config, serverDuckdbClient *DuckdbClient) (*QueryHandler, error) { + s3Client, err := NewS3Client(config) + if err != nil { + return nil, err + } + icebergReader := NewIcebergReader(config, s3Client) + + queryHandler := &QueryHandler{ + Config: config, + ServerDuckdbClient: serverDuckdbClient, + QueryRemapper: NewQueryRemapper(config, icebergReader, serverDuckdbClient), + ResponseHandler: NewResponseHandler(config), + EmbeddingClient: NewEmbeddingClient(config), + } + + return queryHandler, nil +} + +func (queryHandler *QueryHandler) HandleSimpleQuery(originalQuery string) ([]pgproto3.Message, error) { + remappedQuery, err := queryHandler.QueryRemapper.ParseAndRemapQuery(originalQuery) + if err != nil { + return nil, err + } + if len(remappedQuery.Statements) == 0 { + return []pgproto3.Message{&pgproto3.EmptyQueryResponse{}}, nil + } + if len(sortedGeneratedVectorParameterNumbers(remappedQuery.VectorParameters)) > 0 && len(remappedQuery.Statements) != 1 { + err := fmt.Errorf("search rank is only supported in a single simple-query statement") + return nil, NewClientError(PG_ERROR_SEVERITY_ERROR, PG_ERROR_CODE_FEATURE_NOT_SUPPORTED, err.Error(), err) + } + variables, err := queryHandler.resolveEmbeddedLiteralParameters(context.Background(), remappedQuery.VectorParameters) + if err != nil { + return nil, NewClientError(PG_ERROR_SEVERITY_ERROR, PG_ERROR_CODE_INVALID_PARAMETER_VALUE, err.Error(), err) + } + + var queriesMessages []pgproto3.Message + + for i, queryStatement := range remappedQuery.Statements { + LogInfo(queryHandler.Config, "Original query:", remappedQuery.OriginalStatements[i]) + LogInfo(queryHandler.Config, "Remapped query:", queryStatement) + rows, err := queryHandler.ServerDuckdbClient.QueryContext(context.Background(), queryStatement, variables...) + if err != nil { + errorMessage := err.Error() + LogError(queryHandler.Config, "Query execution error:", errorMessage) + if errorMessage == "Binder Error: UNNEST requires a single list as input" { + // https://github.com/duckdbClient/duckdb/issues/11693 + LogWarn(queryHandler.Config, "Couldn't handle query via DuckDB:", queryStatement+"\n"+err.Error()) + queriesMsgs, err := queryHandler.HandleSimpleQuery(FALLBACK_SQL_QUERY) // self-recursion + if err != nil { + return nil, err + } + queriesMessages = append(queriesMessages, queriesMsgs...) + continue + } else { + return nil, err + } + } + defer rows.Close() + + var queryMessages []pgproto3.Message + descriptionMessages, err := queryHandler.rowsToDescriptionMessages(rows, remappedQuery.OriginalStatements[i]) + if err != nil { + return nil, err + } + queryMessages = append(queryMessages, descriptionMessages...) + dataMessages, err := queryHandler.rowsToDataMessages(rows, remappedQuery.OriginalStatements[i]) + if err != nil { + return nil, err + } + queryMessages = append(queryMessages, dataMessages...) + + queriesMessages = append(queriesMessages, queryMessages...) + } + + return queriesMessages, nil +} + +func (queryHandler *QueryHandler) HandleParseQuery(message *pgproto3.Parse) ([]pgproto3.Message, *PreparedStatement, error) { + originalQuery := string(message.Query) + remappedQuery, err := queryHandler.QueryRemapper.ParseAndRemapQuery(originalQuery) + if err != nil { + return nil, nil, err + } + if len(remappedQuery.Statements) > 1 { + err := fmt.Errorf("multiple queries in a single parse message are not supported: %s", originalQuery) + return nil, nil, NewClientError( + PG_ERROR_SEVERITY_ERROR, + PG_ERROR_CODE_SYNTAX_ERROR, + "cannot insert multiple commands into a prepared statement", + err, + ) + } + + preparedStatement := &PreparedStatement{ + Name: message.Name, + OriginalQuery: originalQuery, + ParameterOIDs: message.ParameterOIDs, + VectorParameters: remappedQuery.VectorParameters, + TextArrayParameters: remappedQuery.TextArrayParameters, + } + if len(remappedQuery.Statements) == 0 { + return []pgproto3.Message{&pgproto3.ParseComplete{}}, preparedStatement, nil + } + + query := remappedQuery.Statements[0] + preparedStatement.Query = query + statement, err := queryHandler.prepareContextWithTimeout(query) + preparedStatement.Statement = statement + if err != nil { + return nil, nil, err + } + + return []pgproto3.Message{&pgproto3.ParseComplete{}}, preparedStatement, nil +} + +func (queryHandler *QueryHandler) prepareContextWithTimeout(query string) (*sql.Stmt, error) { + ctx := context.Background() + timeoutCtx, cancel := context.WithTimeout(ctx, PREPARE_STATEMENT_TIMEOUT) + defer cancel() + + type result struct { + statement *sql.Stmt + err error + } + resultChan := make(chan result, 1) + + go func() { + statement, err := queryHandler.ServerDuckdbClient.PrepareContext(timeoutCtx, query) + resultChan <- result{statement, err} + }() + + select { + case res := <-resultChan: + return res.statement, res.err + case <-timeoutCtx.Done(): + LogWarn(queryHandler.Config, "PrepareContext timed out, recreating DuckDB connection") + if err := queryHandler.ServerDuckdbClient.RecreateDb(); err != nil { + return nil, fmt.Errorf("failed to recreate DuckDB after prepare timeout: %w", err) + } + queryHandler.QueryRemapper.remapperTable.Reset() + return queryHandler.ServerDuckdbClient.PrepareContext(ctx, query) + } +} + +func (queryHandler *QueryHandler) HandleBindQuery(message *pgproto3.Bind, preparedStatement *PreparedStatement) ([]pgproto3.Message, *PreparedStatement, error) { + if message.PreparedStatement != preparedStatement.Name { + err := fmt.Errorf("prepared statement mismatch, %s instead of %s: %s", message.PreparedStatement, preparedStatement.Name, preparedStatement.OriginalQuery) + return nil, nil, NewClientError(PG_ERROR_SEVERITY_ERROR, PG_ERROR_CODE_PROTOCOL_VIOLATION, "bind message references an unexpected prepared statement", err) + } + + var variables []interface{} + paramFormatCodes := message.ParameterFormatCodes + embeddingCache := make(map[string][]float32) + + for i, param := range message.Parameters { + parameterNumber := i + 1 + if param == nil { + if _, isVector := preparedStatement.VectorParameters[parameterNumber]; isVector { + err := fmt.Errorf("search rank parameter $%d cannot be NULL", parameterNumber) + return nil, nil, NewClientError(PG_ERROR_SEVERITY_ERROR, PG_ERROR_CODE_INVALID_PARAMETER_VALUE, err.Error(), err) + } + variables = append(variables, nil) + continue + } + + textFormat := true + if len(paramFormatCodes) == 1 { + textFormat = paramFormatCodes[0] == 0 + } else if len(paramFormatCodes) > 1 { + textFormat = paramFormatCodes[i] == 0 + } + + if vectorSpec, isVector := preparedStatement.VectorParameters[parameterNumber]; isVector { + if vectorSpec.LiteralText != nil || vectorSpec.SourceParameter != 0 || vectorSpec.RowCountTable != "" { + err := fmt.Errorf("bind message supplied a hidden search rank parameter") + return nil, nil, NewClientError(PG_ERROR_SEVERITY_ERROR, PG_ERROR_CODE_PROTOCOL_VIOLATION, err.Error(), err) + } + value, err := queryHandler.resolveSearchParameter(context.Background(), string(param), vectorSpec, embeddingCache) + if err != nil { + return nil, nil, NewClientError(PG_ERROR_SEVERITY_ERROR, PG_ERROR_CODE_INVALID_PARAMETER_VALUE, err.Error(), err) + } + variables = append(variables, value) + } else if preparedStatement.TextArrayParameters[parameterNumber] { + value, err := parseTextArrayBindParameter(param, textFormat) + if err != nil { + return nil, nil, NewClientError(PG_ERROR_SEVERITY_ERROR, PG_ERROR_CODE_INVALID_PARAMETER_VALUE, err.Error(), err) + } + variables = append(variables, value) + } else if textFormat { + variables = append(variables, string(param)) + } else if len(param) == 4 { + variables = append(variables, int32(binary.BigEndian.Uint32(param))) + } else if len(param) == 8 { + variables = append(variables, int64(binary.BigEndian.Uint64(param))) + } else if len(param) == 16 { + variables = append(variables, uuid.UUID(param).String()) + } else { + err := fmt.Errorf("unsupported parameter format: %v (length %d). Original query: %s", param, len(param), preparedStatement.OriginalQuery) + return nil, nil, NewClientError(PG_ERROR_SEVERITY_ERROR, PG_ERROR_CODE_PROTOCOL_VIOLATION, "unsupported bind parameter format", err) + } + } + generatedParameterNumbers := sortedGeneratedVectorParameterNumbers(preparedStatement.VectorParameters) + for _, parameterNumber := range generatedParameterNumbers { + if parameterNumber != len(variables)+1 { + err := fmt.Errorf("hidden search rank parameter $%d is out of order", parameterNumber) + return nil, nil, NewClientError(PG_ERROR_SEVERITY_ERROR, PG_ERROR_CODE_PROTOCOL_VIOLATION, err.Error(), err) + } + spec := preparedStatement.VectorParameters[parameterNumber] + text := "" + if spec.SourceParameter != 0 { + if spec.SourceParameter > len(message.Parameters) || message.Parameters[spec.SourceParameter-1] == nil { + return nil, nil, fmt.Errorf("unbound search text parameter $%d", spec.SourceParameter) + } + text = string(message.Parameters[spec.SourceParameter-1]) + } else if spec.LiteralText != nil { + text = *spec.LiteralText + } + value, err := queryHandler.resolveSearchParameter(context.Background(), text, spec, embeddingCache) + if err != nil { + return nil, nil, NewClientError(PG_ERROR_SEVERITY_ERROR, PG_ERROR_CODE_INVALID_PARAMETER_VALUE, err.Error(), err) + } + variables = append(variables, value) + } + + LogDebug(queryHandler.Config, "Bound variables:", redactVectorVariables(variables, preparedStatement.VectorParameters)) + preparedStatement.Bound = true + preparedStatement.Variables = variables + preparedStatement.Portal = message.DestinationPortal + + messages := []pgproto3.Message{&pgproto3.BindComplete{}} + + return messages, preparedStatement, nil +} + +func parseTextArrayBindParameter(param []byte, textFormat bool) ([]string, error) { + formatCode := int16(pgtype.BinaryFormatCode) + if textFormat { + formatCode = pgtype.TextFormatCode + } + + var value []string + if err := pgtype.NewMap().Scan(pgtype.TextArrayOID, formatCode, param, &value); err != nil { + return nil, fmt.Errorf("invalid text[] bind parameter: %w", err) + } + return value, nil +} + +func (queryHandler *QueryHandler) resolveEmbeddedLiteralParameters(ctx context.Context, specs map[int]SearchParameterSpec) ([]interface{}, error) { + parameterNumbers := sortedGeneratedVectorParameterNumbers(specs) + if len(parameterNumbers) == 0 { + for parameterNumber, spec := range specs { + if spec.LiteralText == nil { + return nil, fmt.Errorf("search rank($%d) requires the extended query protocol", parameterNumber) + } + } + return nil, nil + } + variables := make([]interface{}, 0, len(parameterNumbers)) + cache := make(map[string][]float32) + for index, parameterNumber := range parameterNumbers { + if parameterNumber != index+1 { + return nil, fmt.Errorf("unbound parameter precedes search rank literal") + } + spec := specs[parameterNumber] + if spec.LiteralText == nil && spec.RowCountTable == "" { + return nil, fmt.Errorf("search rank requires the extended query protocol") + } + value, err := queryHandler.resolveSearchParameter(ctx, searchLiteralText(spec), spec, cache) + if err != nil { + return nil, err + } + variables = append(variables, value) + } + return variables, nil +} + +func sortedGeneratedVectorParameterNumbers(specs map[int]SearchParameterSpec) []int { + parameterNumbers := make([]int, 0) + for parameterNumber, spec := range specs { + if spec.LiteralText != nil || spec.SourceParameter != 0 || spec.RowCountTable != "" { + parameterNumbers = append(parameterNumbers, parameterNumber) + } + } + sort.Ints(parameterNumbers) + return parameterNumbers +} + +func searchLiteralText(spec SearchParameterSpec) string { + if spec.LiteralText != nil { + return *spec.LiteralText + } + return "" +} + +func (queryHandler *QueryHandler) resolveSearchParameter(ctx context.Context, text string, spec SearchParameterSpec, cache map[string][]float32) (interface{}, error) { + if spec.RowCountTable != "" { + var count int64 + rows, err := queryHandler.ServerDuckdbClient.QueryContext(ctx, "SELECT count(*) FROM "+spec.RowCountTable) + if err != nil { + return nil, err + } + defer rows.Close() + if !rows.Next() { + return nil, fmt.Errorf("failed to count Search chunks: %v", rows.Err()) + } + err = rows.Scan(&count) + return max(int64(1), count), err + } + if spec.TextOnly { + if err := validateEmbeddingInput(text); err != nil { + return nil, err + } + return text, nil + } + return queryHandler.embedVectorParameter(ctx, text, spec, cache) +} + +func (queryHandler *QueryHandler) embedVectorParameter(ctx context.Context, text string, spec SearchParameterSpec, cache map[string][]float32) ([]float32, error) { + if err := validateEmbeddingInput(text); err != nil { + return nil, err + } + if cache != nil { + if vector, ok := cache[text]; ok { + return vector, nil + } + } + vector, err := queryHandler.EmbeddingClient.Embed(ctx, text) + if err != nil { + return nil, queryHandler.hiddenEmbeddingError(err) + } + if len(vector) != spec.Dimensions { + return nil, queryHandler.hiddenEmbeddingError(fmt.Errorf("embedding response must have %d dimensions, got %d", spec.Dimensions, len(vector))) + } + normSquared := 0.0 + for _, component := range vector { + if math.IsNaN(float64(component)) || math.IsInf(float64(component), 0) { + return nil, queryHandler.hiddenEmbeddingError(fmt.Errorf("embedding response components must be finite REAL values")) + } + normSquared += float64(component) * float64(component) + } + if spec.RequireNonZero && normSquared == 0 { + return nil, queryHandler.hiddenEmbeddingError(fmt.Errorf("cosine distance requires a non-zero embedding response")) + } + if cache != nil { + cache[text] = vector + } + return vector, nil +} + +func (queryHandler *QueryHandler) hiddenEmbeddingError(err error) error { + LogError(queryHandler.Config, "search rank failed:", err) + return fmt.Errorf("search rank failed") +} + +func (queryHandler *QueryHandler) HandleDescribeQuery(message *pgproto3.Describe, preparedStatement *PreparedStatement) ([]pgproto3.Message, *PreparedStatement, error) { + switch message.ObjectType { + case 'S': // Statement + if message.Name != preparedStatement.Name { + err := fmt.Errorf("statement mismatch, %s instead of %s: %s", message.Name, preparedStatement.Name, preparedStatement.OriginalQuery) + return nil, nil, NewClientError(PG_ERROR_SEVERITY_ERROR, PG_ERROR_CODE_PROTOCOL_VIOLATION, "describe message references an unexpected prepared statement", err) + } + case 'P': // Portal + if message.Name != preparedStatement.Portal { + err := fmt.Errorf("portal mismatch, %s instead of %s: %s", message.Name, preparedStatement.Portal, preparedStatement.OriginalQuery) + return nil, nil, NewClientError(PG_ERROR_SEVERITY_ERROR, PG_ERROR_CODE_PROTOCOL_VIOLATION, "describe message references an unexpected portal", err) + } + default: + err := fmt.Errorf("unsupported describe object type: %c. Original query: %s", message.ObjectType, preparedStatement.OriginalQuery) + return nil, nil, NewClientError(PG_ERROR_SEVERITY_ERROR, PG_ERROR_CODE_PROTOCOL_VIOLATION, "unsupported describe object type", err) + } + + preparedStatement.Described = true + if preparedStatement.Query == "" || !preparedStatement.Bound { // Empty query or Parse->[No Bind]->Describe + return []pgproto3.Message{&pgproto3.NoData{}}, preparedStatement, nil + } + + rows, err := preparedStatement.Statement.QueryContext(context.Background(), preparedStatement.Variables...) + if err != nil { + return nil, nil, fmt.Errorf("couldn't execute statement: %w. Original query: %s", err, preparedStatement.OriginalQuery) + } + preparedStatement.Rows = rows + + messages, err := queryHandler.rowsToDescriptionMessages(preparedStatement.Rows, preparedStatement.OriginalQuery) + if err != nil { + return nil, nil, err + } + return messages, preparedStatement, nil +} + +func (queryHandler *QueryHandler) HandleExecuteQuery(message *pgproto3.Execute, preparedStatement *PreparedStatement) ([]pgproto3.Message, error) { + if message.Portal != preparedStatement.Portal { + err := fmt.Errorf("portal mismatch, %s instead of %s: %s", message.Portal, preparedStatement.Portal, preparedStatement.OriginalQuery) + return nil, NewClientError(PG_ERROR_SEVERITY_ERROR, PG_ERROR_CODE_PROTOCOL_VIOLATION, "execute message references an unexpected portal", err) + } + + if preparedStatement.Query == "" { + return []pgproto3.Message{&pgproto3.EmptyQueryResponse{}}, nil + } + + if preparedStatement.Rows == nil { // Parse->[No Bind]->Describe->Execute or Parse->Bind->[No Describe]->Execute + rows, err := preparedStatement.Statement.QueryContext(context.Background(), preparedStatement.Variables...) + if err != nil { + return nil, err + } + preparedStatement.Rows = rows + } + + defer preparedStatement.Rows.Close() + + return queryHandler.rowsToDataMessages(preparedStatement.Rows, preparedStatement.OriginalQuery) +} + +func (queryHandler *QueryHandler) rowsToDescriptionMessages(rows *sql.Rows, originalQuery string) ([]pgproto3.Message, error) { + cols, err := rows.ColumnTypes() + if err != nil { + return nil, fmt.Errorf("couldn't get column types: %w. Original query: %s", err, originalQuery) + } + + var messages []pgproto3.Message + + rowDescription := queryHandler.generateRowDescription(cols) + if rowDescription != nil { + messages = append(messages, rowDescription) + } + + return messages, nil +} + +func (queryHandler *QueryHandler) rowsToDataMessages(rows *sql.Rows, originalQuery string) ([]pgproto3.Message, error) { + cols, err := rows.ColumnTypes() + if err != nil { + return nil, fmt.Errorf("couldn't get column types: %w. Original query: %s", err, originalQuery) + } + + var messages []pgproto3.Message + for rows.Next() { + dataRow, err := queryHandler.generateDataRow(rows, cols) + if err != nil { + return nil, fmt.Errorf("couldn't get data row: %w. Original query: %s", err, originalQuery) + } + messages = append(messages, dataRow) + } + if err := rows.Err(); err != nil { + return nil, fmt.Errorf("couldn't read query results: %w. Original query: %s", err, originalQuery) + } + + commandTag := FALLBACK_SQL_QUERY + upperOriginalQueryStatement := strings.ToUpper(originalQuery) + switch { + case strings.HasPrefix(upperOriginalQueryStatement, "SET "): + commandTag = "SET" + case strings.HasPrefix(upperOriginalQueryStatement, "SHOW "): + commandTag = "SHOW" + case strings.HasPrefix(upperOriginalQueryStatement, "DISCARD ALL"): + commandTag = "DISCARD ALL" + case strings.HasPrefix(upperOriginalQueryStatement, "BEGIN"): + commandTag = "BEGIN" + case strings.HasPrefix(upperOriginalQueryStatement, "COMMIT"): + commandTag = "COMMIT" + case strings.HasPrefix(upperOriginalQueryStatement, "CREATE MATERIALIZED VIEW "): + commandTag = "CREATE MATERIALIZED VIEW" + case strings.HasPrefix(upperOriginalQueryStatement, "DROP MATERIALIZED VIEW "): + commandTag = "DROP MATERIALIZED VIEW" + case strings.HasPrefix(upperOriginalQueryStatement, "REFRESH MATERIALIZED VIEW "): + commandTag = "REFRESH MATERIALIZED VIEW" + default: + // Fallback to SELECT from FALLBACK_SQL_QUERY + } + + messages = append(messages, &pgproto3.CommandComplete{CommandTag: []byte(commandTag)}) + return messages, nil +} + +func (queryHandler *QueryHandler) generateRowDescription(cols []*sql.ColumnType) *pgproto3.RowDescription { + description := pgproto3.RowDescription{Fields: []pgproto3.FieldDescription{}} + + for _, col := range cols { + typeIod := queryHandler.ResponseHandler.ColumnDescriptionTypeOid(col) + + if col.Name() == "Success" && typeIod == pgtype.BoolOID && len(cols) == 1 { + // Skip the "Success" DuckDBClient column returned from SET ... commands + return nil + } + + description.Fields = append(description.Fields, pgproto3.FieldDescription{ + Name: []byte(col.Name()), + TableOID: 0, + TableAttributeNumber: 0, + DataTypeOID: typeIod, + DataTypeSize: -1, + TypeModifier: -1, + Format: 0, + }) + } + return &description +} + +func (queryHandler *QueryHandler) generateDataRow(rows *sql.Rows, cols []*sql.ColumnType) (*pgproto3.DataRow, error) { + valuePointers := make([]interface{}, len(cols)) + for i, col := range cols { + valuePointers[i] = queryHandler.ResponseHandler.RowValuePointer(col) + } + + err := rows.Scan(valuePointers...) + if err != nil { + return nil, err + } + + var values [][]byte + for i, valuePointer := range valuePointers { + value := queryHandler.ResponseHandler.RowValueBytes(valuePointer, cols[i]) + values = append(values, value) + } + dataRow := pgproto3.DataRow{Values: values} + + return &dataRow, nil +} diff --git a/server/query_handler_test.go b/server/query_handler_test.go new file mode 100644 index 0000000..a37a07b --- /dev/null +++ b/server/query_handler_test.go @@ -0,0 +1,1025 @@ +package main + +import ( + "context" + "encoding/binary" + "fmt" + "net/http" + "net/http/httptest" + "slices" + "strings" + "testing" + + "github.com/jackc/pgx/v5/pgproto3" + "github.com/jackc/pgx/v5/pgtype" +) + +type queryResponseExpectation struct { + query string + columnNames []string + values []string +} + +func TestHandleQueryFixedSizeFloatArray(t *testing.T) { + queryHandler := initQueryHandlerForTest(t) + if _, err := queryHandler.ServerDuckdbClient.ExecContext( + context.Background(), + "CREATE TABLE public.fixed_vector AS SELECT [1.0, 2.0]::FLOAT[2] AS embedding", + ); err != nil { + t.Fatalf("create fixed-size array fixture: %v", err) + } + messages, err := queryHandler.HandleSimpleQuery("SELECT embedding FROM fixed_vector") + if err != nil { + t.Fatalf("handle fixed-size array query: %v", err) + } + assertMessageTypes(t, messages, "*pgproto3.RowDescription", "*pgproto3.DataRow", "*pgproto3.CommandComplete") + + description := messages[0].(*pgproto3.RowDescription) + if description.Fields[0].DataTypeOID != pgtype.Float4ArrayOID { + t.Fatalf("fixed-size FLOAT array OID = %d, want %d", description.Fields[0].DataTypeOID, pgtype.Float4ArrayOID) + } + assertDataRow(t, messages[1], []string{"{1,2}"}) +} + +func TestDuckdbQueryContextBindsEmbeddingVector(t *testing.T) { + queryHandler := initQueryHandlerForTest(t) + rows, err := queryHandler.ServerDuckdbClient.QueryContext( + context.Background(), + "SELECT array_distance($1::REAL[2], [0.6, 0.8]::REAL[2])", + []float32{0.6, 0.8}, + ) + if err != nil { + t.Fatal(err) + } + defer rows.Close() + if !rows.Next() { + t.Fatal("expected distance row") + } + var distance float32 + if err := rows.Scan(&distance); err != nil { + t.Fatal(err) + } + if distance != 0 { + t.Fatalf("distance = %v, want 0", distance) + } +} + +func TestHandleQueryUnsignedIntegers(t *testing.T) { + queryHandler := initQueryHandlerForTest(t) + if _, err := queryHandler.ServerDuckdbClient.ExecContext( + context.Background(), + "CREATE TABLE public.unsigned_values AS SELECT 4294967295::UINTEGER AS chunk_index, 18446744073709551615::UBIGINT AS source_position", + ); err != nil { + t.Fatalf("create unsigned integer fixture: %v", err) + } + messages, err := queryHandler.HandleSimpleQuery("SELECT chunk_index, source_position FROM unsigned_values") + if err != nil { + t.Fatalf("handle unsigned integer query: %v", err) + } + assertMessageTypes(t, messages, "*pgproto3.RowDescription", "*pgproto3.DataRow", "*pgproto3.CommandComplete") + + description := messages[0].(*pgproto3.RowDescription) + if description.Fields[0].DataTypeOID != pgtype.XIDOID { + t.Fatalf("UINTEGER OID = %d, want %d", description.Fields[0].DataTypeOID, pgtype.XIDOID) + } + if description.Fields[1].DataTypeOID != pgtype.XID8OID { + t.Fatalf("UBIGINT OID = %d, want %d", description.Fields[1].DataTypeOID, pgtype.XID8OID) + } + assertDataRow(t, messages[1], []string{"4294967295", "18446744073709551615"}) +} + +func TestHandleQueryPgSystemTables(t *testing.T) { + queryHandler := initQueryHandlerForTest(t) + + tests := []queryResponseExpectation{ + { + query: "SELECT * FROM pg_catalog.pg_inherits", + columnNames: []string{"inhrelid", "inhparent", "inhseqno", "inhdetachpending"}, + }, + { + query: "SELECT indnullsnotdistinct FROM pg_catalog.pg_index", + columnNames: []string{"indnullsnotdistinct"}, + }, + { + query: "SELECT relhassubclass FROM pg_class LIMIT 1", + columnNames: []string{"relhassubclass"}, + values: []string{"f"}, + }, + { + query: "SELECT oid FROM pg_catalog.pg_extension", + columnNames: []string{"oid"}, + values: []string{"13823"}, + }, + { + query: "SELECT slot_name FROM pg_replication_slots", + columnNames: []string{"slot_name"}, + }, + { + query: "SELECT oid, datname, datdba FROM pg_catalog.pg_database WHERE oid = 16388", + columnNames: []string{"oid", "datname", "datdba"}, + values: []string{"16388", "pgstack", "10"}, + }, + { + query: "SELECT COALESCE(NULL, (SELECT datname FROM pg_database WHERE datname = 'pgstack')) AS datname", + columnNames: []string{"datname"}, + values: []string{"pgstack"}, + }, + { + query: "SELECT COALESCE(NULL, '[]'::jsonb) AS json_value", + columnNames: []string{"json_value"}, + values: []string{"[]"}, + }, + { + query: "SELECT jsonb_array_length(COALESCE('[]'::jsonb, '{}'::jsonb)) AS length", + columnNames: []string{"length"}, + values: []string{"0"}, + }, + { + query: "SELECT * FROM pg_catalog.pg_stat_gssapi", + columnNames: []string{"pid", "gss_authenticated", "principal", "encrypted", "credentials_delegated"}, + }, + { + query: "SELECT * FROM pg_catalog.pg_user", + columnNames: []string{"usename", "usesysid", "usecreatedb", "usesuper", "userepl", "usebypassrls", "passwd", "valuntil", "useconfig"}, + values: []string{"user", "10", "t", "t", "t", "t", "", "", ""}, + }, + { + query: "SELECT datid FROM pg_catalog.pg_stat_activity", + columnNames: []string{"datid"}, + }, + { + query: "SELECT schemaname, matviewname AS objectname FROM pg_catalog.pg_matviews", + columnNames: []string{"schemaname", "objectname"}, + }, + { + query: "SELECT * FROM pg_catalog.pg_views", + columnNames: []string{"schemaname", "viewname", "viewowner", "definition"}, + }, + { + query: "SELECT oid FROM pg_collation", + columnNames: []string{"oid"}, + values: []string{"100"}, + }, + { + query: "SELECT * FROM pg_opclass", + columnNames: []string{"oid", "opcmethod", "opcname", "opcnamespace", "opcowner", "opcfamily", "opcintype", "opcdefault", "opckeytype"}, + }, + { + query: "SELECT * FROM pg_catalog.pg_shdescription", + columnNames: []string{"objoid", "classoid", "description"}, + }, + { + query: "SELECT * FROM pg_catalog.pg_roles", + columnNames: []string{"oid", "rolname", "rolsuper", "rolinherit", "rolcreaterole", "rolcreatedb", "rolcanlogin", "rolreplication", "rolconnlimit", "rolpassword", "rolvaliduntil", "rolbypassrls", "rolconfig"}, + values: []string{"10", "user", "t", "t", "t", "t", "t", "f", "-1", "", "", "f", ""}, + }, + { + query: "SELECT * FROM pg_auth_members", + columnNames: []string{"oid", "roleid", "member", "grantor", "admin_option", "inherit_option", "set_option"}, + }, + { + query: "SELECT * FROM pg_catalog.pg_policy", + columnNames: []string{"oid", "polname", "polrelid", "polcmd", "polpermissive", "polroles", "polqual", "polwithcheck"}, + }, + { + query: "SELECT * FROM pg_catalog.pg_statistic_ext", + columnNames: []string{"oid", "stxrelid", "stxname", "stxnamespace", "stxowner", "stxstattarget", "stxkeys", "stxkind", "stxexprs"}, + }, + { + query: "SELECT * FROM pg_catalog.pg_publication", + columnNames: []string{"oid", "pubname", "pubowner", "puballtables", "pubinsert", "pubupdate", "pubdelete", "pubtruncate", "pubviaroot"}, + }, + { + query: "SELECT * FROM pg_catalog.pg_publication_rel", + columnNames: []string{"oid", "prpubid", "prrelid", "prqual", "prattrs"}, + }, + { + query: "SELECT * FROM pg_catalog.pg_publication_namespace", + columnNames: []string{"oid", "pnpubid", "pnnspid"}, + }, + { + query: "SELECT * FROM pg_catalog.pg_rewrite", + columnNames: []string{"oid", "rulename", "ev_class", "ev_type", "ev_enabled", "is_instead", "ev_qual", "ev_action"}, + }, + { + query: "SELECT * FROM user", + columnNames: []string{"user"}, + values: []string{"user"}, + }, + { + query: "SELECT oid FROM pg_type WHERE typname = 'text'", + columnNames: []string{"oid"}, + values: []string{"25"}, + }, + { + query: "SELECT DISTINCT ON (typlen) oid FROM pg_type ORDER BY oid LIMIT 1", + columnNames: []string{"oid"}, + values: []string{"16"}, + }, + // Temporarily disabled: requires the BemiDB postgres.test_table Iceberg fixture. + // {query: "SELECT relname FROM pg_catalog.pg_class ...", ...}, + // {query: "SELECT schemaname, relname, n_live_tup FROM pg_stat_user_tables ...", ...}, + } + + for _, test := range tests { + t.Run(test.query, func(t *testing.T) { + assertQueryResponse(t, queryHandler, test) + }) + } +} + +func TestHandleQueryPgAttributeUsesPostgresTypeOids(t *testing.T) { + queryHandler := initQueryHandlerForTest(t) + _, err := queryHandler.ServerDuckdbClient.ExecContext(context.Background(), "CREATE SCHEMA audit") + if err != nil { + t.Fatalf("create test schema: %v", err) + } + _, err = queryHandler.ServerDuckdbClient.ExecContext( + context.Background(), + `CREATE TABLE audit.changes ( + id VARCHAR, + committed_at TIMESTAMPTZ, + transaction_id BIGINT + )`, + ) + if err != nil { + t.Fatalf("create test table: %v", err) + } + + assertQueryResponse(t, queryHandler, queryResponseExpectation{ + query: `SELECT + MAX(CASE WHEN a.attname = 'id' THEN a.atttypid END) AS text_oid, + MAX(CASE WHEN a.attname = 'id' THEN t.typname END) AS text_name, + MAX(CASE WHEN a.attname = 'committed_at' THEN a.atttypid END) AS timestamptz_oid, + MAX(CASE WHEN a.attname = 'committed_at' THEN t.typname END) AS timestamptz_name, + MAX(CASE WHEN a.attname = 'transaction_id' THEN a.atttypid END) AS int8_oid, + MAX(CASE WHEN a.attname = 'transaction_id' THEN t.typname END) AS int8_name + FROM pg_catalog.pg_attribute a + JOIN pg_catalog.pg_class c ON c.oid = a.attrelid + JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace + LEFT JOIN pg_catalog.pg_type t ON t.oid = a.atttypid + WHERE n.nspname = 'audit' AND c.relname = 'changes'`, + columnNames: []string{"text_oid", "text_name", "timestamptz_oid", "timestamptz_name", "int8_oid", "int8_name"}, + values: []string{"25", "text", "1184", "timestamptz", "20", "int8"}, + }) + assertQueryResponse(t, queryHandler, queryResponseExpectation{ + query: `SELECT udt_name + FROM information_schema.columns + WHERE table_schema = 'audit' + AND table_name = 'changes' + AND column_name = 'committed_at'`, + columnNames: []string{"udt_name"}, + values: []string{"timestamptz"}, + }) +} + +func TestHandleQueryPgFunctions(t *testing.T) { + queryHandler := initQueryHandlerForTest(t) + + tests := []queryResponseExpectation{ + { + query: "SELECT VERSION()", + columnNames: []string{"version"}, + values: []string{"PostgreSQL 17.0, compiled by PgStack"}, + }, + { + query: "SELECT pg_catalog.pg_get_userbyid(p.proowner) AS owner, 'Foo' AS foo FROM pg_catalog.pg_proc p LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace LIMIT 1", + columnNames: []string{"owner", "foo"}, + values: []string{"user", "Foo"}, + }, + { + query: "SELECT QUOTE_IDENT('fooBar') AS quote_ident", + columnNames: []string{"quote_ident"}, + values: []string{"\"fooBar\""}, + }, + // Temporarily disabled: DuckDB now returns "NULLS_LAST" while the BemiDB + // compatibility test expects PostgreSQL-style "nulls_last". + // { + // query: "SELECT setting FROM pg_show_all_settings() WHERE name = 'default_null_order'", + // columnNames: []string{"setting"}, + // values: []string{"nulls_last"}, + // }, + { + query: "SELECT pg_catalog.pg_get_partkeydef(c.oid) AS pg_get_partkeydef FROM pg_catalog.pg_class c LIMIT 1", + columnNames: []string{"pg_get_partkeydef"}, + values: []string{""}, + }, + { + query: "SELECT pg_tablespace_location(t.oid) AS loc FROM pg_catalog.pg_tablespace t LIMIT 1", + columnNames: []string{"loc"}, + values: []string{""}, + }, + { + query: "SELECT pg_catalog.pg_get_viewdef(NULL, TRUE) AS viewdef", + columnNames: []string{"viewdef"}, + values: []string{""}, + }, + { + query: "SELECT set_config('bytea_output', 'hex', false) AS set_config", + columnNames: []string{"set_config"}, + values: []string{"hex"}, + }, + { + query: "SELECT pg_catalog.pg_encoding_to_char(6) AS pg_encoding_to_char", + columnNames: []string{"pg_encoding_to_char"}, + values: []string{"UTF8"}, + }, + { + query: "SELECT pg_backend_pid() AS pg_backend_pid", + columnNames: []string{"pg_backend_pid"}, + values: []string{"0"}, + }, + { + query: "SELECT pg_cancel_backend(12345) AS pg_cancel_backend", + columnNames: []string{"pg_cancel_backend"}, + values: []string{"t"}, + }, + { + query: "SELECT * FROM pg_is_in_recovery()", + columnNames: []string{"pg_is_in_recovery"}, + values: []string{"f"}, + }, + { + query: "SELECT row_to_json(t) AS row_to_json FROM (SELECT usename FROM pg_shadow WHERE usename = 'user') t", + columnNames: []string{"row_to_json"}, + values: []string{`{"usename":"user"}`}, + }, + { + query: "SELECT current_setting('default_tablespace') AS current_setting", + columnNames: []string{"current_setting"}, + values: []string{""}, + }, + { + query: "SELECT array_to_string('[1, 2, 3]', '') AS str", + columnNames: []string{"str"}, + values: []string{"123"}, + }, + { + query: "SELECT * FROM pg_catalog.generate_series(1, 1)", + columnNames: []string{"generate_series"}, + values: []string{"1"}, + }, + { + query: "SELECT format('Hello %s, %s, %1$s', 'World', 'Earth') AS str", + columnNames: []string{"str"}, + values: []string{"Hello World, Earth, World"}, + }, + { + query: "SELECT encode(sha256('foo'), 'hex'::text) AS encode", + columnNames: []string{"encode"}, + values: []string{"2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae"}, + }, + { + query: "SELECT jsonb_object_agg('key', 'value') AS jsonb_object_agg", + columnNames: []string{"jsonb_object_agg"}, + values: []string{`{"key":"value"}`}, + }, + // Temporarily disabled: DuckDB resolves only the last json_build_object + // overload created by the compatibility macros. + // { + // query: "SELECT json_build_object('min', 1, 'max', 2) AS json_build_object", + // columnNames: []string{"json_build_object"}, + // values: []string{`{"max":2,"min":1}`}, + // }, + { + query: "SELECT jsonb_array_length('[1, 2, 3]'::jsonb) AS jsonb_array_length", + columnNames: []string{"jsonb_array_length"}, + values: []string{"3"}, + }, + { + query: `SELECT jsonb_pretty('{"key": "value"}'::jsonb) AS jsonb_pretty`, + columnNames: []string{"jsonb_pretty"}, + values: []string{"{\n \"key\": \"value\"\n}"}, + }, + { + query: `SELECT json_array_elements('[{"key": "value1"}]') AS json_array_elements`, + columnNames: []string{"json_array_elements"}, + values: []string{`{"key":"value1"}`}, + }, + { + query: "SELECT TO_CHAR('2024-01-15 14:30:00'::timestamp, 'YYYY-MM-DD') AS to_char", + columnNames: []string{"to_char"}, + values: []string{"2024-01-15"}, + }, + } + + for _, test := range tests { + t.Run(test.query, func(t *testing.T) { + assertQueryResponse(t, queryHandler, test) + }) + } +} + +func TestHandleQueryExpressions(t *testing.T) { + queryHandler := initQueryHandlerForTest(t) + + tests := []queryResponseExpectation{ + { + query: "SELECT word FROM (VALUES ('abort', 'U', 't', 'unreserved', 'can be bare label')) t(word, catcode, barelabel, catdesc, baredesc) WHERE word <> ALL('{a,abs,absolute,action}'::text[])", + columnNames: []string{"word"}, + values: []string{"abort"}, + }, + { + query: "SELECT NULL::text AS word", + columnNames: []string{"word"}, + values: []string{""}, + }, + { + query: "SELECT t.x FROM (VALUES (1::int2, 'pg_type'::regclass)) t(x, y)", + columnNames: []string{"x"}, + values: []string{"1"}, + }, + { + query: "SELECT 'pg_catalog.array_in'::regproc AS regproc", + columnNames: []string{"regproc"}, + values: []string{"array_in"}, + }, + { + query: "SELECT '1 week'::interval AS interval", + columnNames: []string{"interval"}, + values: []string{"0 months 7 days 0 microseconds"}, + }, + { + query: `SELECT '{"key": "value"}'::jsonb AS jsonb`, + columnNames: []string{"jsonb"}, + values: []string{`{"key":"value"}`}, + }, + { + query: "SELECT date_trunc('month', '2025-02-24 15:58:23-05'::timestamptz + '-1 month'::interval) AS date", + columnNames: []string{"date"}, + values: []string{"2025-01-01 00:00:00+00:00"}, + }, + { + query: "SELECT 'foo'::pg_catalog.text AS text", + columnNames: []string{"text"}, + values: []string{"foo"}, + }, + { + query: "SELECT 1::pg_catalog.regtype::pg_catalog.text AS text", + columnNames: []string{"text"}, + values: []string{"1"}, + }, + { + query: "SELECT 1 AS value ORDER BY 1::pg_catalog.regclass::pg_catalog.text", + columnNames: []string{"value"}, + values: []string{"1"}, + }, + { + query: "SELECT stxnamespace::pg_catalog.regnamespace::pg_catalog.text AS text FROM pg_catalog.pg_statistic_ext", + columnNames: []string{"text"}, + }, + { + query: "SELECT * FROM pg_catalog.pg_get_keywords() LIMIT 1", + columnNames: []string{"word", "catcode", "barelabel", "catdesc", "baredesc"}, + values: []string{"abort", "U", "t", "unreserved", "can be bare label"}, + }, + { + query: "SELECT pg_get_keywords.word FROM pg_catalog.pg_get_keywords() LIMIT 1", + columnNames: []string{"word"}, + values: []string{"abort"}, + }, + { + query: "SELECT * FROM generate_series(1, 2) AS series(index) LIMIT 1", + columnNames: []string{"index"}, + values: []string{"1"}, + }, + { + query: "SELECT * FROM generate_series(1, array_upper(current_schemas(FALSE), 1)) AS series(index) LIMIT 1", + columnNames: []string{"index"}, + values: []string{"1"}, + }, + // Temporarily disabled: _pg_expandarray is registered as a DuckDB table + // function, but PostgreSQL permits this composite-returning scalar syntax. + // { + // query: "SELECT (information_schema._pg_expandarray(ARRAY[10])).n", + // columnNames: []string{"n"}, + // values: []string{"1"}, + // }, + // { + // query: "SELECT (information_schema._pg_expandarray(ARRAY[10])).x AS value", + // columnNames: []string{"value"}, + // values: []string{"10"}, + // }, + { + query: "SELECT s.usename, r.rolconfig FROM pg_catalog.pg_shadow s LEFT JOIN pg_catalog.pg_roles r ON s.usename = r.rolname", + columnNames: []string{"usename", "rolconfig"}, + values: []string{"user", ""}, + }, + { + query: "SELECT a.oid, pd.description FROM pg_catalog.pg_roles a LEFT JOIN pg_catalog.pg_shdescription pd ON a.oid = pd.objoid", + columnNames: []string{"oid", "description"}, + values: []string{"10", ""}, + }, + { + query: "SELECT (SELECT 1 FROM (SELECT 1 AS inner_val) JOIN (SELECT NULL) ON inner_val = indclass[1]) AS test FROM pg_index", + columnNames: []string{"test"}, + }, + { + query: "SELECT CASE WHEN true THEN 'yes' ELSE 'no' END AS case", + columnNames: []string{"case"}, + values: []string{"yes"}, + }, + { + query: "SELECT CASE WHEN false THEN 'yes' ELSE 'no' END AS case", + columnNames: []string{"case"}, + values: []string{"no"}, + }, + { + query: "SELECT CASE WHEN true THEN 'one' WHEN false THEN 'two' ELSE 'three' END AS case", + columnNames: []string{"case"}, + values: []string{"one"}, + }, + { + query: "SELECT CASE WHEN (SELECT count(extname) FROM pg_catalog.pg_extension WHERE extname = 'bdr') > 0 THEN 'pgd' WHEN (SELECT count(*) FROM pg_replication_slots) > 0 THEN 'log' ELSE NULL END AS type", + columnNames: []string{"type"}, + values: []string{""}, + }, + { + query: "SELECT CASE WHEN TRUE THEN pg_catalog.pg_is_in_recovery() END AS case", + columnNames: []string{"case"}, + values: []string{"f"}, + }, + { + query: "SELECT CASE WHEN FALSE THEN true ELSE pg_catalog.pg_is_in_recovery() END AS case", + columnNames: []string{"case"}, + values: []string{"f"}, + }, + { + query: "SELECT CASE WHEN nsp.nspname = ANY('{information_schema}') THEN false ELSE true END AS db_support FROM pg_catalog.pg_namespace nsp LIMIT 1", + columnNames: []string{"db_support"}, + values: []string{"t"}, + }, + { + query: "SELECT gss_authenticated, encrypted FROM (SELECT false, false, false, false, false WHERE false) t(pid, gss_authenticated, principal, encrypted, credentials_delegated) WHERE pid = pg_backend_pid()", + columnNames: []string{"gss_authenticated", "encrypted"}, + }, + { + query: "WITH RECURSIVE simple_cte AS (SELECT oid, rolname FROM pg_roles WHERE rolname = 'postgres' UNION ALL SELECT oid, rolname FROM pg_roles) SELECT * FROM simple_cte", + columnNames: []string{"oid", "rolname"}, + values: []string{"10", "user"}, + }, + { + query: "SELECT ARRAY(SELECT 1 FROM pg_enum ORDER BY enumsortorder) AS array", + columnNames: []string{"array"}, + values: []string{"{}"}, + }, + { + query: "SELECT pg_shadow.usename FROM pg_shadow", + columnNames: []string{"usename"}, + values: []string{"user"}, + }, + { + query: "SELECT pg_roles.rolname FROM pg_roles", + columnNames: []string{"rolname"}, + values: []string{"user"}, + }, + { + query: "SELECT pg_extension.extname FROM pg_extension", + columnNames: []string{"extname"}, + values: []string{"plpgsql"}, + }, + { + query: "SELECT pg_database.datname FROM pg_database", + columnNames: []string{"datname"}, + values: []string{"pgstack"}, + }, + { + query: "SELECT pg_inherits.inhrelid FROM pg_inherits", + columnNames: []string{"inhrelid"}, + }, + { + query: "SELECT pg_shdescription.objoid FROM pg_shdescription", + columnNames: []string{"objoid"}, + }, + { + query: "SELECT pg_statio_user_tables.relid FROM pg_statio_user_tables", + columnNames: []string{"relid"}, + }, + { + query: "SELECT pg_replication_slots.slot_name FROM pg_replication_slots", + columnNames: []string{"slot_name"}, + }, + { + query: "SELECT pg_stat_gssapi.pid FROM pg_stat_gssapi", + columnNames: []string{"pid"}, + }, + { + query: "SELECT pg_auth_members.oid FROM pg_auth_members", + columnNames: []string{"oid"}, + }, + { + query: "SELECT x.usename, (SELECT split_part(passwd, ':', 1) FROM pg_shadow WHERE usename = x.usename) AS password FROM pg_shadow x WHERE x.usename = 'user'", + columnNames: []string{"usename", "password"}, + values: []string{"user", "SCRAM-SHA-256$4096"}, + }, + // Temporarily disabled: the remaining expression cases reference the + // postgres.test_table Iceberg fixture from BemiDB. + } + + for _, test := range tests { + t.Run(test.query, func(t *testing.T) { + assertQueryResponse(t, queryHandler, test) + }) + } +} + +func TestHandleQueryShow(t *testing.T) { + queryHandler := initQueryHandlerForTest(t) + + tests := []queryResponseExpectation{ + {query: "SHOW search_path", columnNames: []string{"search_path"}, values: []string{`"$user", public`}}, + {query: "SHOW timezone", columnNames: []string{"timezone"}, values: []string{"UTC"}}, + } + for _, test := range tests { + t.Run(test.query, func(t *testing.T) { + assertQueryResponse(t, queryHandler, test) + }) + } +} + +func TestHandleParseQuery(t *testing.T) { + queryHandler := initQueryHandlerForTest(t) + + t.Run("query", func(t *testing.T) { + messages, preparedStatement, err := queryHandler.HandleParseQuery(&pgproto3.Parse{ + Query: "SELECT usename, passwd FROM pg_shadow WHERE usename=$1", + }) + if err != nil { + t.Fatalf("parse query: %v", err) + } + assertMessageTypes(t, messages, "*pgproto3.ParseComplete") + if preparedStatement.Query != "SELECT usename, passwd FROM main.pg_shadow WHERE usename = $1" { + t.Errorf("remapped query = %q", preparedStatement.Query) + } + if preparedStatement.Statement == nil { + t.Error("prepared statement is nil") + } + }) + + t.Run("empty query", func(t *testing.T) { + messages, preparedStatement, err := queryHandler.HandleParseQuery(&pgproto3.Parse{}) + if err != nil { + t.Fatalf("parse empty query: %v", err) + } + assertMessageTypes(t, messages, "*pgproto3.ParseComplete") + if preparedStatement.Query != "" || preparedStatement.Statement != nil { + t.Errorf("empty prepared statement = %#v", preparedStatement) + } + }) +} + +func TestHandleBindQuery(t *testing.T) { + queryHandler := initQueryHandlerForTest(t) + + tests := []struct { + name string + query string + parameter []byte + formatCode int16 + want any + }{ + { + name: "text parameter", + query: "SELECT usename FROM pg_shadow WHERE usename=$1", + parameter: []byte("user"), + want: "user", + }, + { + name: "4-byte binary parameter", + query: "SELECT c.oid FROM pg_catalog.pg_class c WHERE c.relnamespace=$1", + parameter: binary.BigEndian.AppendUint32(nil, 2200), + formatCode: 1, + want: int32(2200), + }, + { + name: "8-byte binary parameter", + query: "SELECT c.oid FROM pg_catalog.pg_class c WHERE c.relnamespace=$1", + parameter: binary.BigEndian.AppendUint64(nil, 2200), + formatCode: 1, + want: int64(2200), + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + _, preparedStatement, err := queryHandler.HandleParseQuery(&pgproto3.Parse{Query: test.query}) + if err != nil { + t.Fatalf("parse query: %v", err) + } + messages, preparedStatement, err := queryHandler.HandleBindQuery(&pgproto3.Bind{ + Parameters: [][]byte{test.parameter}, + ParameterFormatCodes: []int16{test.formatCode}, + }, preparedStatement) + if err != nil { + t.Fatalf("bind query: %v", err) + } + assertMessageTypes(t, messages, "*pgproto3.BindComplete") + if len(preparedStatement.Variables) != 1 || preparedStatement.Variables[0] != test.want { + t.Errorf("bound variables = %#v, want %#v", preparedStatement.Variables, test.want) + } + }) + } + + // Requires an Iceberg table fixture that is not available in this repository's unit-test setup. + // t.Run("16-byte UUID parameter", ...) +} + +func TestHandleTextArrayBindQuery(t *testing.T) { + queryHandler := initQueryHandlerForTest(t) + + _, preparedStatement, err := queryHandler.HandleParseQuery(&pgproto3.Parse{ + Query: "SELECT 'sec,ond' = ANY($1::pg_catalog.text[])", + }) + if err != nil { + t.Fatalf("parse query: %v", err) + } + + _, preparedStatement, err = queryHandler.HandleBindQuery(&pgproto3.Bind{ + Parameters: [][]byte{[]byte(`{first,"sec,ond"}`)}, + }, preparedStatement) + if err != nil { + t.Fatalf("bind query: %v", err) + } + + messages, err := queryHandler.HandleExecuteQuery(&pgproto3.Execute{}, preparedStatement) + if err != nil { + t.Fatalf("execute query: %v", err) + } + assertMessageTypes(t, messages, "*pgproto3.DataRow", "*pgproto3.CommandComplete") + assertDataRow(t, messages[0], []string{"t"}) +} + +func TestHandleDescribeAndExecuteQuery(t *testing.T) { + queryHandler := initQueryHandlerForTest(t) + + t.Run("describe and execute", func(t *testing.T) { + _, preparedStatement, err := queryHandler.HandleParseQuery(&pgproto3.Parse{ + Query: "SELECT usename, split_part(passwd, ':', 1) FROM pg_shadow WHERE usename=$1", + }) + if err != nil { + t.Fatalf("parse query: %v", err) + } + _, preparedStatement, err = queryHandler.HandleBindQuery(&pgproto3.Bind{ + Parameters: [][]byte{[]byte("user")}, + }, preparedStatement) + if err != nil { + t.Fatalf("bind query: %v", err) + } + messages, preparedStatement, err := queryHandler.HandleDescribeQuery( + &pgproto3.Describe{ObjectType: 'P'}, + preparedStatement, + ) + if err != nil { + t.Fatalf("describe query: %v", err) + } + assertMessageTypes(t, messages, "*pgproto3.RowDescription") + if preparedStatement.Rows == nil { + t.Fatal("described prepared statement has no rows") + } + + messages, err = queryHandler.HandleExecuteQuery(&pgproto3.Execute{}, preparedStatement) + if err != nil { + t.Fatalf("execute query: %v", err) + } + assertMessageTypes(t, messages, "*pgproto3.DataRow", "*pgproto3.CommandComplete") + assertDataRow(t, messages[0], []string{"user", "SCRAM-SHA-256$4096"}) + }) + + t.Run("empty query", func(t *testing.T) { + _, preparedStatement, err := queryHandler.HandleParseQuery(&pgproto3.Parse{}) + if err != nil { + t.Fatalf("parse query: %v", err) + } + _, preparedStatement, err = queryHandler.HandleBindQuery(&pgproto3.Bind{}, preparedStatement) + if err != nil { + t.Fatalf("bind query: %v", err) + } + messages, preparedStatement, err := queryHandler.HandleDescribeQuery( + &pgproto3.Describe{ObjectType: 'P'}, + preparedStatement, + ) + if err != nil { + t.Fatalf("describe query: %v", err) + } + assertMessageTypes(t, messages, "*pgproto3.NoData") + + messages, err = queryHandler.HandleExecuteQuery(&pgproto3.Execute{}, preparedStatement) + if err != nil { + t.Fatalf("execute query: %v", err) + } + assertMessageTypes(t, messages, "*pgproto3.EmptyQueryResponse") + }) + + t.Run("describe statement without bind", func(t *testing.T) { + _, preparedStatement, err := queryHandler.HandleParseQuery(&pgproto3.Parse{ + Query: "SELECT usename FROM pg_shadow WHERE usename=$1", + ParameterOIDs: []uint32{25}, + }) + if err != nil { + t.Fatalf("parse query: %v", err) + } + messages, _, err := queryHandler.HandleDescribeQuery( + &pgproto3.Describe{ObjectType: 'S'}, + preparedStatement, + ) + if err != nil { + t.Fatalf("describe query: %v", err) + } + assertMessageTypes(t, messages, "*pgproto3.NoData") + }) +} + +func TestHandleMultipleQueries(t *testing.T) { + queryHandler := initQueryHandlerForTest(t) + + t.Run("multiple SET statements", func(t *testing.T) { + messages, err := queryHandler.HandleSimpleQuery(`SET client_encoding TO 'UTF8'; +SET client_min_messages TO 'warning'; +SET standard_conforming_strings = on;`) + if err != nil { + t.Fatalf("handle queries: %v", err) + } + assertMessageTypes(t, messages, + "*pgproto3.CommandComplete", + "*pgproto3.CommandComplete", + "*pgproto3.CommandComplete", + ) + }) + + t.Run("mixed SET and SELECT statements", func(t *testing.T) { + messages, err := queryHandler.HandleSimpleQuery(`SET client_encoding TO 'UTF8'; +SELECT split_part(passwd, ':', 1) FROM pg_shadow WHERE usename='user';`) + if err != nil { + t.Fatalf("handle queries: %v", err) + } + assertMessageTypes(t, messages, + "*pgproto3.CommandComplete", + "*pgproto3.RowDescription", + "*pgproto3.DataRow", + "*pgproto3.CommandComplete", + ) + assertDataRow(t, messages[2], []string{"SCRAM-SHA-256$4096"}) + }) + + t.Run("multiple SELECT statements", func(t *testing.T) { + messages, err := queryHandler.HandleSimpleQuery(`SELECT 1; +SELECT split_part(passwd, ':', 1) FROM pg_shadow WHERE usename='user';`) + if err != nil { + t.Fatalf("handle queries: %v", err) + } + assertMessageTypes(t, messages, + "*pgproto3.RowDescription", "*pgproto3.DataRow", "*pgproto3.CommandComplete", + "*pgproto3.RowDescription", "*pgproto3.DataRow", "*pgproto3.CommandComplete", + ) + assertDataRow(t, messages[1], []string{"1"}) + assertDataRow(t, messages[4], []string{"SCRAM-SHA-256$4096"}) + }) + + t.Run("error in one statement", func(t *testing.T) { + _, err := queryHandler.HandleSimpleQuery(`SET client_encoding TO 'UTF8'; +SELECT * FROM non_existent_table; +SET standard_conforming_strings = on;`) + if err == nil || !strings.Contains(err.Error(), "non_existent_table") { + t.Errorf("error = %v, want missing-table error", err) + } + }) +} + +func TestHandleSimpleQueryControlStatements(t *testing.T) { + queryHandler := initQueryHandlerForTest(t) + + tests := []struct { + name string + query string + messageType string + commandTag string + }{ + {name: "SET", query: "SET client_encoding TO 'UTF8'", messageType: "*pgproto3.CommandComplete", commandTag: "SET"}, + {name: "DISCARD ALL", query: "DISCARD ALL", messageType: "*pgproto3.CommandComplete", commandTag: "DISCARD ALL"}, + {name: "BEGIN", query: "BEGIN", messageType: "*pgproto3.CommandComplete", commandTag: "BEGIN"}, + {name: "empty", query: "", messageType: "*pgproto3.EmptyQueryResponse"}, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + messages, err := queryHandler.HandleSimpleQuery(test.query) + if err != nil { + t.Fatalf("handle query: %v", err) + } + assertMessageTypes(t, messages, test.messageType) + if test.commandTag != "" && string(messages[0].(*pgproto3.CommandComplete).CommandTag) != test.commandTag { + t.Errorf("command tag = %q, want %q", messages[0].(*pgproto3.CommandComplete).CommandTag, test.commandTag) + } + }) + } +} + +func assertQueryResponse(t *testing.T, queryHandler *QueryHandler, expectation queryResponseExpectation) { + t.Helper() + + messages, err := queryHandler.HandleSimpleQuery(expectation.query) + if err != nil { + t.Fatalf("handle query: %v", err) + } + wantMessageCount := 2 + if expectation.values != nil { + wantMessageCount = 3 + } + if len(messages) != wantMessageCount { + t.Fatalf("message count = %d, want %d", len(messages), wantMessageCount) + } + rowDescription, ok := messages[0].(*pgproto3.RowDescription) + if !ok { + t.Fatalf("first message type = %T, want *pgproto3.RowDescription", messages[0]) + } + columnNames := make([]string, len(rowDescription.Fields)) + for i, field := range rowDescription.Fields { + columnNames[i] = string(field.Name) + } + if !slices.Equal(columnNames, expectation.columnNames) { + t.Errorf("column names = %v, want %v", columnNames, expectation.columnNames) + } + if expectation.values != nil { + assertDataRow(t, messages[1], expectation.values) + } +} + +func assertMessageTypes(t *testing.T, messages []pgproto3.Message, expectedTypes ...string) { + t.Helper() + if len(messages) != len(expectedTypes) { + t.Fatalf("message count = %d, want %d", len(messages), len(expectedTypes)) + } + for i, expectedType := range expectedTypes { + if actualType := fmt.Sprintf("%T", messages[i]); actualType != expectedType { + t.Errorf("message %d type = %s, want %s", i, actualType, expectedType) + } + } +} + +func assertDataRow(t *testing.T, message pgproto3.Message, expectedValues []string) { + t.Helper() + dataRow, ok := message.(*pgproto3.DataRow) + if !ok { + t.Fatalf("message type = %T, want *pgproto3.DataRow", message) + } + values := make([]string, len(dataRow.Values)) + for i, value := range dataRow.Values { + values[i] = string(value) + } + if !slices.Equal(values, expectedValues) { + t.Errorf("row values = %v, want %v", values, expectedValues) + } +} + +func initQueryHandlerForTest(t *testing.T) *QueryHandler { + t.Helper() + + s3Server := httptest.NewServer(http.HandlerFunc(func(response http.ResponseWriter, _ *http.Request) { + response.Header().Set("Content-Type", "application/xml") + _, _ = response.Write([]byte(` + + test + 0 + 1000 + false +`)) + })) + t.Cleanup(s3Server.Close) + + config := &Config{ + AwsRegion: "us-east-1", + AwsS3Endpoint: s3Server.URL, + AwsS3Bucket: "test", + AwsAccessKeyId: "test", + AwsSecretAccessKey: "test", + Database: "pgstack", + User: "user", + EncryptedPassword: "SCRAM-SHA-256$4096:test", + DuckDBMemoryLimit: DEFAULT_DUCKDB_MEMORY_LIMIT, + } + + bootQueries := slices.Concat( + []string{ + "SELECT oid FROM pg_catalog.pg_namespace", + "CREATE SCHEMA " + PG_SCHEMA_PUBLIC, + }, + CreatePgCatalogMacroQueries(config), + CreateInformationSchemaMacroQueries(config), + CreatePgCatalogTableQueries(config), + // Synthetic catalog fixture tests SQL remapping independently of authentication policy. + []string{"CREATE OR REPLACE VIEW pg_shadow AS SELECT 'user' AS usename, 'SCRAM-SHA-256$4096:test' AS passwd"}, + CreateInformationSchemaTableQueries(config), + []string{"USE " + PG_SCHEMA_PUBLIC}, + ) + duckdbClient, err := NewDuckdbClient(config, bootQueries) + if err != nil { + t.Fatalf("initialize DuckDB: %v", err) + } + t.Cleanup(duckdbClient.Close) + + queryHandler, err := NewQueryHandler(config, duckdbClient) + if err != nil { + t.Fatalf("initialize query handler: %v", err) + } + return queryHandler +} diff --git a/server/query_log.go b/server/query_log.go new file mode 100644 index 0000000..dd29deb --- /dev/null +++ b/server/query_log.go @@ -0,0 +1,42 @@ +package main + +import ( + "fmt" + "regexp" +) + +var VECTOR_DISTANCE_LITERAL_LOG_PATTERN = regexp.MustCompile(`(?is)(<=>|<->|<#>|<\+>|<~>|<%>)\s*'[^']*'`) +var VECTOR_ARRAY_LITERAL_LOG_PATTERN = regexp.MustCompile(`(?is)\bARRAY\s*\[[^]]*\]\s*::\s*(REAL|FLOAT4?)\s*\[(\d+)\]`) + +func redactVectorLiterals(query string) string { + query = VECTOR_DISTANCE_LITERAL_LOG_PATTERN.ReplaceAllString(query, `$1 '[vector omitted]'`) + return VECTOR_ARRAY_LITERAL_LOG_PATTERN.ReplaceAllString(query, `ARRAY[vector omitted]::$1[$2]`) +} + +func redactLogValues(values []interface{}) []interface{} { + redacted := append([]interface{}(nil), values...) + for index, value := range redacted { + switch value := value.(type) { + case string: + redacted[index] = redactVectorLiterals(value) + case error: + redacted[index] = redactVectorLiterals(value.Error()) + } + } + return redacted +} + +func redactVectorVariables(variables []interface{}, specs map[int]SearchParameterSpec) []interface{} { + redacted := append([]interface{}(nil), variables...) + for parameterNumber, spec := range specs { + index := parameterNumber - 1 + if index >= 0 && index < len(redacted) { + if spec.TextOnly { + redacted[index] = "[search text omitted]" + } else if spec.RowCountTable == "" { + redacted[index] = fmt.Sprintf("[vector omitted: %d dimensions]", spec.Dimensions) + } + } + } + return redacted +} diff --git a/server/query_log_test.go b/server/query_log_test.go new file mode 100644 index 0000000..36eca8b --- /dev/null +++ b/server/query_log_test.go @@ -0,0 +1,61 @@ +package main + +import ( + "bytes" + "log" + "strings" + "testing" +) + +func TestRedactVectorLiterals(t *testing.T) { + vector := "[-0.003017425537109375,-0.026702880859375,0.0050506591796875]" + tests := []struct { + query string + want string + }{ + { + query: `SELECT * FROM search.test ORDER BY embedding <=> '` + vector + `' LIMIT 5`, + want: `embedding <=> '[vector omitted]'`, + }, + { + query: `SELECT array_distance(embedding, ARRAY[-0.003017425537109375,-0.026702880859375]::REAL[1536])`, + want: `ARRAY[vector omitted]::REAL[1536]`, + }, + { + query: `SELECT array_cosine_distance(embedding, ARRAY[-0.003017425537109375,-0.026702880859375]::float4[1536])`, + want: `ARRAY[vector omitted]::float4[1536]`, + }, + } + for _, test := range tests { + redacted := redactVectorLiterals(test.query) + if strings.Contains(redacted, "-0.003017425537109375") || !strings.Contains(redacted, test.want) { + t.Fatalf("unexpected redacted query: %s", redacted) + } + } +} + +func TestLoggerRedactsRemappedVectorQuery(t *testing.T) { + var output bytes.Buffer + previousOutput := log.Writer() + log.SetOutput(&output) + t.Cleanup(func() { log.SetOutput(previousOutput) }) + + LogInfo(&Config{LogLevel: LOG_LEVEL_INFO}, "Remapped query:", `SELECT array_cosine_distance(embedding, ARRAY[-0.003017425537109375,-0.026702880859375]::float4[1536])`) + logged := output.String() + if strings.Contains(logged, "-0.003017425537109375") || !strings.Contains(logged, "Remapped query: SELECT array_cosine_distance(embedding, ARRAY[vector omitted]::float4[1536])") { + t.Fatalf("unexpected remapped-query log: %s", logged) + } +} + +func TestRedactVectorVariables(t *testing.T) { + variables := []interface{}{"user", "[0.1,0.2]"} + redacted := redactVectorVariables(variables, map[int]SearchParameterSpec{ + 2: {Dimensions: 1536}, + }) + if redacted[0] != "user" || redacted[1] != "[vector omitted: 1536 dimensions]" { + t.Fatalf("unexpected redacted variables: %#v", redacted) + } + if variables[1] != "[0.1,0.2]" { + t.Fatalf("redaction mutated bound variables: %#v", variables) + } +} diff --git a/src/server/query_remapper.go b/server/query_remapper.go similarity index 61% rename from src/server/query_remapper.go rename to server/query_remapper.go index de14da9..3da0930 100644 --- a/src/server/query_remapper.go +++ b/server/query_remapper.go @@ -1,26 +1,22 @@ package main import ( - "encoding/json" "errors" "fmt" "strings" pgQuery "github.com/pganalyze/pg_query_go/v6" - - "github.com/BemiHQ/BemiDB/src/common" ) const ( - INSPECT_SQL_COMMENT = " --INSPECT" - PERMISSIONS_SQL_COMMENT = "BEMIDB_PERMISSIONS" + INSPECT_SQL_COMMENT = " --INSPECT" ) -var SUPPORTED_SET_STATEMENTS = common.NewSet[string]().AddAll([]string{ +var SUPPORTED_SET_STATEMENTS = NewSet[string]().AddAll([]string{ "timezone", // SET SESSION timezone TO 'UTC' }) -var KNOWN_SET_STATEMENTS = common.NewSet[string]().AddAll([]string{ +var KNOWN_SET_STATEMENTS = NewSet[string]().AddAll([]string{ "client_encoding", // SET client_encoding TO 'UTF8' "client_min_messages", // SET client_min_messages TO 'warning' "standard_conforming_strings", // SET standard_conforming_strings = on @@ -40,11 +36,17 @@ type QueryRemapper struct { remapperSelect *QueryRemapperSelect remapperShow *QueryRemapperShow IcebergReader *IcebergReader - IcebergWriter *IcebergWriter config *Config } -func NewQueryRemapper(config *Config, icebergReader *IcebergReader, icebergWriter *IcebergWriter, serverDuckdbClient *common.DuckdbClient) *QueryRemapper { +type RemappedQuery struct { + Statements []string + OriginalStatements []string + VectorParameters map[int]SearchParameterSpec + TextArrayParameters map[int]bool +} + +func NewQueryRemapper(config *Config, icebergReader *IcebergReader, serverDuckdbClient *DuckdbClient) *QueryRemapper { return &QueryRemapper{ remapperTable: NewQueryRemapperTable(config, icebergReader, serverDuckdbClient), remapperExpression: NewQueryRemapperExpression(config), @@ -52,78 +54,84 @@ func NewQueryRemapper(config *Config, icebergReader *IcebergReader, icebergWrite remapperSelect: NewQueryRemapperSelect(config), remapperShow: NewQueryRemapperShow(config), IcebergReader: icebergReader, - IcebergWriter: icebergWriter, config: config, } } -func (remapper *QueryRemapper) ParseAndRemapQuery(query string) ([]string, []string, error) { +func (remapper *QueryRemapper) ParseAndRemapQuery(query string) (*RemappedQuery, error) { queryTree, err := pgQuery.Parse(query) if err != nil { - return nil, nil, fmt.Errorf("couldn't parse query: %s. %w", query, err) + return nil, NewClientError( + PG_ERROR_SEVERITY_ERROR, + PG_ERROR_CODE_SYNTAX_ERROR, + err.Error(), + fmt.Errorf("couldn't parse query: %s. %w", query, err), + ) } + textArrayParameters := remapper.remapperExpression.parserTypeCast.TextArrayParameters(queryTree) if strings.HasSuffix(query, INSPECT_SQL_COMMENT) { - common.LogDebug(remapper.config.CommonConfig, queryTree.Stmts) - } - - var permissions *map[string][]string - if strings.Count(query, "/*"+PERMISSIONS_SQL_COMMENT+" ") == 1 && strings.Count(query, " "+PERMISSIONS_SQL_COMMENT+"*/") == 1 { - permissions, err = remapper.extractPermissions(query) - if err != nil { - return nil, nil, fmt.Errorf("couldn't extract permissions from query comment: %s. %w", query, err) - } - common.LogDebug(remapper.config.CommonConfig, "Parsed permissions:", permissions) + LogDebug(remapper.config, queryTree.Stmts) } var originalQueryStatements []string for _, stmt := range queryTree.Stmts { originalQueryStatement, err := pgQuery.Deparse(&pgQuery.ParseResult{Stmts: []*pgQuery.RawStmt{stmt}}) if err != nil { - return nil, nil, fmt.Errorf("couldn't deparse query: %s. %w", query, err) + return nil, fmt.Errorf("couldn't deparse query: %s. %w", query, err) } originalQueryStatements = append(originalQueryStatements, originalQueryStatement) } - remappedStatements, err := remapper.remapStatements(queryTree.Stmts, permissions) + vectorParameters := make(map[int]SearchParameterSpec) + remappedStatements, err := remapper.remapStatements(queryTree.Stmts, vectorParameters) if err != nil { - return nil, nil, err + return nil, err } var queryStatements []string for _, remappedStatement := range remappedStatements { queryStatement, err := pgQuery.Deparse(&pgQuery.ParseResult{Stmts: []*pgQuery.RawStmt{remappedStatement}}) if err != nil { - return nil, nil, fmt.Errorf("couldn't deparse remapped query: %s. %w", query, err) + return nil, fmt.Errorf("couldn't deparse remapped query: %s. %w", query, err) } queryStatements = append(queryStatements, queryStatement) } - return queryStatements, originalQueryStatements, nil + return &RemappedQuery{ + Statements: queryStatements, + OriginalStatements: originalQueryStatements, + VectorParameters: vectorParameters, + TextArrayParameters: textArrayParameters, + }, nil } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -func (remapper *QueryRemapper) remapStatements(statements []*pgQuery.RawStmt, permissions *map[string][]string) ([]*pgQuery.RawStmt, error) { +func (remapper *QueryRemapper) remapStatements(statements []*pgQuery.RawStmt, vectorParameters map[int]SearchParameterSpec) ([]*pgQuery.RawStmt, error) { // Empty query if len(statements) == 0 { return statements, nil } for i, stmt := range statements { - common.LogTrace(remapper.config.CommonConfig, "Remapping statement #"+common.IntToString(i+1)) + LogTrace(remapper.config, "Remapping statement #"+IntToString(i+1)) node := stmt.Stmt switch { // Empty statement case node == nil: - return nil, errors.New("empty statement") + err := errors.New("empty statement") + return nil, NewClientError(PG_ERROR_SEVERITY_ERROR, PG_ERROR_CODE_SYNTAX_ERROR, err.Error(), err) // SELECT case node.GetSelectStmt() != nil: selectStatement := node.GetSelectStmt() - remapper.remapSelectStatement(selectStatement, permissions, 1) + if err := remapper.remapSearchRank(selectStatement, vectorParameters); err != nil { + return nil, NewClientError(PG_ERROR_SEVERITY_ERROR, PG_ERROR_CODE_FEATURE_NOT_SUPPORTED, err.Error(), err) + } + remapper.remapSelectStatement(selectStatement, 1) stmt.Stmt = &pgQuery.Node{Node: &pgQuery.Node_SelectStmt{SelectStmt: selectStatement}} statements[i] = stmt @@ -145,42 +153,31 @@ func (remapper *QueryRemapper) remapStatements(statements []*pgQuery.RawStmt, pe // CREATE MATERIALIZED VIEW [IF NOT EXISTS] AS ... [WITH NO DATA] case node.GetCreateTableAsStmt() != nil: - err := remapper.createMaterializedView(node) - if err != nil { - return nil, err - } + LogInfo(remapper.config, "CREATE TABLE/MATERIALIZED VIEW not supported (read-only server)") statements[i] = NOOP_QUERY_TREE.Stmts[0] // DROP MATERIALIZED VIEW [IF EXISTS] case node.GetDropStmt() != nil && (node.GetDropStmt().RemoveType == pgQuery.ObjectType_OBJECT_TABLE || node.GetDropStmt().RemoveType == pgQuery.ObjectType_OBJECT_MATVIEW): - err := remapper.dropMaterializedViewFromNode(node) - if err != nil { - return nil, err - } + LogInfo(remapper.config, "DROP TABLE/VIEW not supported (read-only server)") statements[i] = NOOP_QUERY_TREE.Stmts[0] // REFRESH MATERIALIZED VIEW case node.GetRefreshMatViewStmt() != nil: - err := remapper.refreshMaterializedViewFromNode(node) - if err != nil { - return nil, err - } + LogInfo(remapper.config, "REFRESH MATERIALIZED VIEW not supported (read-only server)") statements[i] = NOOP_QUERY_TREE.Stmts[0] // ALTER TABLE [IF EXISTS] ... RENAME TO ... case node.GetRenameStmt() != nil && (node.GetRenameStmt().RenameType == pgQuery.ObjectType_OBJECT_TABLE || node.GetRenameStmt().RenameType == pgQuery.ObjectType_OBJECT_MATVIEW): - err := remapper.renameMaterializedViewFromNode(node) - if err != nil { - return nil, err - } + LogInfo(remapper.config, "RENAME TABLE/VIEW not supported (read-only server)") statements[i] = NOOP_QUERY_TREE.Stmts[0] // Unsupported query default: - common.LogDebug(remapper.config.CommonConfig, "Query tree:", stmt, node) - return nil, errors.New("unsupported query type") + LogDebug(remapper.config, "Query tree:", stmt, node) + err := errors.New("unsupported query type") + return nil, NewClientError(PG_ERROR_SEVERITY_ERROR, PG_ERROR_CODE_FEATURE_NOT_SUPPORTED, err.Error(), err) } } @@ -196,25 +193,25 @@ func (remapper *QueryRemapper) remapSetStatement(stmt *pgQuery.RawStmt) *pgQuery } if !KNOWN_SET_STATEMENTS.Contains(strings.ToLower(setStatement.Name)) { - common.LogWarn(remapper.config.CommonConfig, "Unknown SET ", setStatement.Name, ":", setStatement) + LogWarn(remapper.config, "Unknown SET ", setStatement.Name, ":", setStatement) } return NOOP_QUERY_TREE.Stmts[0] } -func (remapper *QueryRemapper) remapSelectStatement(selectStatement *pgQuery.SelectStmt, permissions *map[string][]string, indentLevel int) { +func (remapper *QueryRemapper) remapSelectStatement(selectStatement *pgQuery.SelectStmt, indentLevel int) { // SELECT - remappedColumnRefs := remapper.remapSelect(selectStatement, permissions, indentLevel) // recursion + remappedColumnRefs := remapper.remapSelect(selectStatement, indentLevel) // recursion // UNION if selectStatement.FromClause == nil && selectStatement.Larg != nil && selectStatement.Rarg != nil { remapper.traceTreeTraversal("UNION left", indentLevel) leftSelectStatement := selectStatement.Larg - remapper.remapSelectStatement(leftSelectStatement, permissions, indentLevel+1) // self-recursion + remapper.remapSelectStatement(leftSelectStatement, indentLevel+1) // self-recursion remapper.traceTreeTraversal("UNION right", indentLevel) rightSelectStatement := selectStatement.Rarg - remapper.remapSelectStatement(rightSelectStatement, permissions, indentLevel+1) // self-recursion + remapper.remapSelectStatement(rightSelectStatement, indentLevel+1) // self-recursion } // WHERE @@ -224,7 +221,7 @@ func (remapper *QueryRemapper) remapSelectStatement(selectStatement *pgQuery.Sel if remapper.removeWhereClause(selectStatement.WhereClause) { selectStatement.WhereClause = nil } else { - selectStatement.WhereClause = remapper.remappedExpressions(selectStatement.WhereClause, remappedColumnRefs, permissions, indentLevel) // recursion + selectStatement.WhereClause = remapper.remappedExpressions(selectStatement.WhereClause, remappedColumnRefs, indentLevel) // recursion } } @@ -233,7 +230,7 @@ func (remapper *QueryRemapper) remapSelectStatement(selectStatement *pgQuery.Sel remapper.traceTreeTraversal("WITH CTE's", indentLevel) for _, cte := range selectStatement.WithClause.Ctes { if cteSelect := cte.GetCommonTableExpr().Ctequery.GetSelectStmt(); cteSelect != nil { - remapper.remapSelectStatement(cteSelect, permissions, indentLevel+1) // self-recursion + remapper.remapSelectStatement(cteSelect, indentLevel+1) // self-recursion } } } @@ -242,19 +239,19 @@ func (remapper *QueryRemapper) remapSelectStatement(selectStatement *pgQuery.Sel for i, fromNode := range selectStatement.FromClause { // JOIN if fromNode.GetJoinExpr() != nil { - selectStatement.FromClause[i] = remapper.remapJoinExpressions(selectStatement, fromNode, remappedColumnRefs, permissions, indentLevel+1) // recursion + selectStatement.FromClause[i] = remapper.remapJoinExpressions(selectStatement, fromNode, remappedColumnRefs, indentLevel+1) // recursion } // FROM if fromNode.GetRangeVar() != nil { // FROM [TABLE] remapper.traceTreeTraversal("FROM table", indentLevel) - selectStatement.FromClause[i] = remapper.remapperTable.RemapTable(fromNode, permissions) + selectStatement.FromClause[i] = remapper.remapperTable.RemapTable(fromNode) } else if fromNode.GetRangeSubselect() != nil { // FROM (SELECT ...) remapper.traceTreeTraversal("FROM subselect", indentLevel) subSelectStatement := fromNode.GetRangeSubselect().Subquery.GetSelectStmt() - remapper.remapSelectStatement(subSelectStatement, permissions, indentLevel+1) // self-recursion + remapper.remapSelectStatement(subSelectStatement, indentLevel+1) // self-recursion } else if fromNode.GetRangeFunction() != nil { // FROM PG_FUNCTION() remapper.traceTreeTraversal("FROM function()", indentLevel) @@ -267,7 +264,7 @@ func (remapper *QueryRemapper) remapSelectStatement(selectStatement *pgQuery.Sel if selectStatement.SortClause != nil { remapper.traceTreeTraversal("ORDER BY statements", indentLevel) for _, sortNode := range selectStatement.SortClause { - sortNode.GetSortBy().Node = remapper.remappedExpressions(sortNode.GetSortBy().Node, remappedColumnRefs, permissions, indentLevel) // recursion + sortNode.GetSortBy().Node = remapper.remappedExpressions(sortNode.GetSortBy().Node, remappedColumnRefs, indentLevel) // recursion } } @@ -275,43 +272,43 @@ func (remapper *QueryRemapper) remapSelectStatement(selectStatement *pgQuery.Sel if selectStatement.GroupClause != nil { remapper.traceTreeTraversal("GROUP BY statements", indentLevel) for i, groupNode := range selectStatement.GroupClause { - selectStatement.GroupClause[i] = remapper.remappedExpressions(groupNode, remappedColumnRefs, permissions, indentLevel) // recursion + selectStatement.GroupClause[i] = remapper.remappedExpressions(groupNode, remappedColumnRefs, indentLevel) // recursion } } } -func (remapper *QueryRemapper) remapJoinExpressions(selectStatement *pgQuery.SelectStmt, node *pgQuery.Node, remappedColumnRefs map[string]string, permissions *map[string][]string, indentLevel int) *pgQuery.Node { +func (remapper *QueryRemapper) remapJoinExpressions(selectStatement *pgQuery.SelectStmt, node *pgQuery.Node, remappedColumnRefs map[string]string, indentLevel int) *pgQuery.Node { remapper.traceTreeTraversal("JOIN left", indentLevel) leftJoinNode := node.GetJoinExpr().Larg if leftJoinNode.GetJoinExpr() != nil { - leftJoinNode = remapper.remapJoinExpressions(selectStatement, leftJoinNode, remappedColumnRefs, permissions, indentLevel+1) // self-recursion + leftJoinNode = remapper.remapJoinExpressions(selectStatement, leftJoinNode, remappedColumnRefs, indentLevel+1) // self-recursion } else if leftJoinNode.GetRangeVar() != nil { // TABLE remapper.traceTreeTraversal("TABLE left", indentLevel+1) - leftJoinNode = remapper.remapperTable.RemapTable(leftJoinNode, permissions) + leftJoinNode = remapper.remapperTable.RemapTable(leftJoinNode) } else if leftJoinNode.GetRangeSubselect() != nil { leftSelectStatement := leftJoinNode.GetRangeSubselect().Subquery.GetSelectStmt() - remapper.remapSelectStatement(leftSelectStatement, permissions, indentLevel+1) // parent-recursion + remapper.remapSelectStatement(leftSelectStatement, indentLevel+1) // parent-recursion } node.GetJoinExpr().Larg = leftJoinNode remapper.traceTreeTraversal("JOIN right", indentLevel) rightJoinNode := node.GetJoinExpr().Rarg if rightJoinNode.GetJoinExpr() != nil { - rightJoinNode = remapper.remapJoinExpressions(selectStatement, rightJoinNode, remappedColumnRefs, permissions, indentLevel+1) // self-recursion + rightJoinNode = remapper.remapJoinExpressions(selectStatement, rightJoinNode, remappedColumnRefs, indentLevel+1) // self-recursion } else if rightJoinNode.GetRangeVar() != nil { // TABLE remapper.traceTreeTraversal("TABLE right", indentLevel+1) - rightJoinNode = remapper.remapperTable.RemapTable(rightJoinNode, permissions) + rightJoinNode = remapper.remapperTable.RemapTable(rightJoinNode) } else if rightJoinNode.GetRangeSubselect() != nil { rightSelectStatement := rightJoinNode.GetRangeSubselect().Subquery.GetSelectStmt() - remapper.remapSelectStatement(rightSelectStatement, permissions, indentLevel+1) // parent-recursion + remapper.remapSelectStatement(rightSelectStatement, indentLevel+1) // parent-recursion } node.GetJoinExpr().Rarg = rightJoinNode if quals := node.GetJoinExpr().Quals; quals != nil { remapper.traceTreeTraversal("JOIN on", indentLevel) - node.GetJoinExpr().Quals = remapper.remappedExpressions(quals, remappedColumnRefs, permissions, indentLevel) // recursion + node.GetJoinExpr().Quals = remapper.remappedExpressions(quals, remappedColumnRefs, indentLevel) // recursion // DuckDB doesn't support non-INNER JOINs with ON clauses that reference columns from outer tables: // SELECT ( @@ -336,18 +333,18 @@ func (remapper *QueryRemapper) remapJoinExpressions(selectStatement *pgQuery.Sel return node } -func (remapper *QueryRemapper) remappedExpressions(node *pgQuery.Node, remappedColumnRefs map[string]string, permissions *map[string][]string, indentLevel int) *pgQuery.Node { +func (remapper *QueryRemapper) remappedExpressions(node *pgQuery.Node, remappedColumnRefs map[string]string, indentLevel int) *pgQuery.Node { // CASE caseExpression := node.GetCaseExpr() if caseExpression != nil { - remapper.remapCaseExpression(caseExpression, remappedColumnRefs, permissions, indentLevel) // recursion + remapper.remapCaseExpression(caseExpression, remappedColumnRefs, indentLevel) // recursion } // OR/AND boolExpr := node.GetBoolExpr() if boolExpr != nil { for i, arg := range boolExpr.Args { - boolExpr.Args[i] = remapper.remappedExpressions(arg, remappedColumnRefs, permissions, indentLevel+1) // self-recursion + boolExpr.Args[i] = remapper.remappedExpressions(arg, remappedColumnRefs, indentLevel+1) // self-recursion } } @@ -356,7 +353,7 @@ func (remapper *QueryRemapper) remappedExpressions(node *pgQuery.Node, remappedC if coalesceExpr != nil { for i, arg := range coalesceExpr.Args { if arg != nil { - coalesceExpr.Args[i] = remapper.remappedExpressions(arg, remappedColumnRefs, permissions, indentLevel+1) // self-recursion + coalesceExpr.Args[i] = remapper.remappedExpressions(arg, remappedColumnRefs, indentLevel+1) // self-recursion } } } @@ -365,7 +362,7 @@ func (remapper *QueryRemapper) remappedExpressions(node *pgQuery.Node, remappedC subLink := node.GetSubLink() if subLink != nil { subSelect := subLink.Subselect.GetSelectStmt() - remapper.remapSelectStatement(subSelect, permissions, indentLevel+1) // recursion + remapper.remapSelectStatement(subSelect, indentLevel+1) // recursion } // Operator: =, ?, etc. @@ -373,17 +370,17 @@ func (remapper *QueryRemapper) remappedExpressions(node *pgQuery.Node, remappedC if aExpr != nil { node = remapper.remapperExpression.RemappedExpression(node) if aExpr.Lexpr != nil { - aExpr.Lexpr = remapper.remappedExpressions(aExpr.Lexpr, remappedColumnRefs, permissions, indentLevel+1) // self-recursion + aExpr.Lexpr = remapper.remappedExpressions(aExpr.Lexpr, remappedColumnRefs, indentLevel+1) // self-recursion } if aExpr.Rexpr != nil { - aExpr.Rexpr = remapper.remappedExpressions(aExpr.Rexpr, remappedColumnRefs, permissions, indentLevel+1) // self-recursion + aExpr.Rexpr = remapper.remappedExpressions(aExpr.Rexpr, remappedColumnRefs, indentLevel+1) // self-recursion } } // IS NULL nullTest := node.GetNullTest() if nullTest != nil { - nullTest.Arg = remapper.remappedExpressions(nullTest.Arg, remappedColumnRefs, permissions, indentLevel+1) // self-recursion + nullTest.Arg = remapper.remappedExpressions(nullTest.Arg, remappedColumnRefs, indentLevel+1) // self-recursion } // IN @@ -404,12 +401,12 @@ func (remapper *QueryRemapper) remappedExpressions(node *pgQuery.Node, remappedC for i, arg := range functionCall.Args { if arg != nil { - functionCall.Args[i] = remapper.remappedExpressions(arg, remappedColumnRefs, permissions, indentLevel+1) // self-recursion + functionCall.Args[i] = remapper.remappedExpressions(arg, remappedColumnRefs, indentLevel+1) // self-recursion } } if functionCall.AggFilter != nil && functionCall.AggFilter.GetNullTest() != nil { - functionCall.AggFilter.GetNullTest().Arg = remapper.remappedExpressions(functionCall.AggFilter.GetNullTest().Arg, remappedColumnRefs, permissions, indentLevel+1) // self-recursion + functionCall.AggFilter.GetNullTest().Arg = remapper.remappedExpressions(functionCall.AggFilter.GetNullTest().Arg, remappedColumnRefs, indentLevel+1) // self-recursion } } @@ -438,29 +435,29 @@ func (remapper *QueryRemapper) remappedExpressions(node *pgQuery.Node, remappedC } // CASE ... -func (remapper *QueryRemapper) remapCaseExpression(caseExpr *pgQuery.CaseExpr, remappedColumnRefs map[string]string, permissions *map[string][]string, indentLevel int) { +func (remapper *QueryRemapper) remapCaseExpression(caseExpr *pgQuery.CaseExpr, remappedColumnRefs map[string]string, indentLevel int) { for _, when := range caseExpr.Args { if whenClause := when.GetCaseWhen(); whenClause != nil { // WHEN ... if whenClause.Expr != nil { - whenClause.Expr = remapper.remappedExpressions(whenClause.Expr, remappedColumnRefs, permissions, indentLevel+1) // recursion + whenClause.Expr = remapper.remappedExpressions(whenClause.Expr, remappedColumnRefs, indentLevel+1) // recursion } // THEN ... if whenClause.Result != nil { - whenClause.Result = remapper.remappedExpressions(whenClause.Result, remappedColumnRefs, permissions, indentLevel+1) // recursion + whenClause.Result = remapper.remappedExpressions(whenClause.Result, remappedColumnRefs, indentLevel+1) // recursion } } } // ELSE ... if caseExpr.Defresult != nil { - caseExpr.Defresult = remapper.remappedExpressions(caseExpr.Defresult, remappedColumnRefs, permissions, indentLevel+1) // recursion + caseExpr.Defresult = remapper.remappedExpressions(caseExpr.Defresult, remappedColumnRefs, indentLevel+1) // recursion } } // SELECT ... -func (remapper *QueryRemapper) remapSelect(selectStatement *pgQuery.SelectStmt, permissions *map[string][]string, indentLevel int) map[string]string { +func (remapper *QueryRemapper) remapSelect(selectStatement *pgQuery.SelectStmt, indentLevel int) map[string]string { remapper.traceTreeTraversal("SELECT statements", indentLevel) remappedColumnRefs := make(map[string]string) @@ -475,7 +472,7 @@ func (remapper *QueryRemapper) remapSelect(selectStatement *pgQuery.SelectStmt, valNode := targetNode.GetResTarget().Val if valNode != nil { - targetNode.GetResTarget().Val = remapper.remappedExpressions(valNode, remappedColumnRefs, permissions, indentLevel) // recursion + targetNode.GetResTarget().Val = remapper.remappedExpressions(valNode, remappedColumnRefs, indentLevel) // recursion } // Nested SELECT @@ -510,7 +507,7 @@ func (remapper *QueryRemapper) remapSelect(selectStatement *pgQuery.SelectStmt, // DISTINCT ON (column) distinctClauses := selectStatement.GetDistinctClause() for i, distinctNode := range distinctClauses { - distinctClauses[i] = remapper.remappedExpressions(distinctNode, remappedColumnRefs, permissions, indentLevel) // recursion + distinctClauses[i] = remapper.remappedExpressions(distinctNode, remappedColumnRefs, indentLevel) // recursion } return remappedColumnRefs @@ -563,173 +560,6 @@ func (remapper *QueryRemapper) removeWhereClause(whereClause *pgQuery.Node) bool return true } -func (remapper *QueryRemapper) createMaterializedView(node *pgQuery.Node) error { - // Extract the schema and table names - icebergSchemaTable := common.IcebergSchemaTable{ - Schema: node.GetCreateTableAsStmt().Into.Rel.Schemaname, - Table: node.GetCreateTableAsStmt().Into.Rel.Relname, - } - if icebergSchemaTable.Schema == "" { - icebergSchemaTable.Schema = PG_SCHEMA_PUBLIC - } - - // Extract the definition of the materialized view - definitionSelectStmt := node.GetCreateTableAsStmt().Query.GetSelectStmt() - definitionRawStmt := &pgQuery.RawStmt{Stmt: &pgQuery.Node{Node: &pgQuery.Node_SelectStmt{SelectStmt: definitionSelectStmt}}} - definition, err := pgQuery.Deparse(&pgQuery.ParseResult{Stmts: []*pgQuery.RawStmt{definitionRawStmt}}) - if err != nil { - return fmt.Errorf("couldn't read definition of CREATE MATERIALIZED VIEW: %w", err) - } - - ifNotExists := node.GetCreateTableAsStmt().IfNotExists - - // Store the materialized view in the catalog - err = remapper.IcebergWriter.CreateMaterializedView(icebergSchemaTable, definition, ifNotExists) - if err != nil { - if strings.HasPrefix(err.Error(), "ERROR: duplicate key value violates unique constraint") { - return fmt.Errorf("relation %s already exists", icebergSchemaTable.String()) - } else { - return fmt.Errorf("couldn't create materialized view: %w", err) - } - } - - // Refresh the materialized view if it is not a "CREATE MATERIALIZED VIEW ... WITH NO DATA" statement - if !node.GetCreateTableAsStmt().Into.SkipData { - queryStatements, _, err := remapper.ParseAndRemapQuery(definition) - if err != nil { - deleteErr := remapper.IcebergWriter.DropMaterializedView(icebergSchemaTable, true) - if deleteErr != nil { - return fmt.Errorf("couldn't remap definition of CREATE MATERIALIZED VIEW: %w (%w)", err, deleteErr) - } - return fmt.Errorf("couldn't remap definition of CREATE MATERIALIZED VIEW: %w", err) - } - - err = remapper.IcebergWriter.RefreshMaterializedView(icebergSchemaTable, queryStatements[0]) - if err != nil { - deleteErr := remapper.IcebergWriter.DropMaterializedView(icebergSchemaTable, true) - if deleteErr != nil { - return fmt.Errorf("couldn't refresh materialized view: %w (%w)", err, deleteErr) - } - return fmt.Errorf("couldn't refresh materialized view: %w", err) - } - } - - return nil -} - -func (remapper *QueryRemapper) dropMaterializedViewFromNode(node *pgQuery.Node) error { - var icebergSchemaTable common.IcebergSchemaTable - dropStatement := node.GetDropStmt() - nodeItems := dropStatement.Objects[0].GetList().Items - - switch len(nodeItems) { - case 3: - if nodeItems[0].GetString_().Sval != remapper.config.Database { - return fmt.Errorf("cross-database materialized view drop is not supported: %s", nodeItems[0].GetString_().Sval) - } - icebergSchemaTable = common.IcebergSchemaTable{ - Schema: nodeItems[1].GetString_().Sval, - Table: nodeItems[2].GetString_().Sval, - } - case 2: - icebergSchemaTable = common.IcebergSchemaTable{ - Schema: nodeItems[0].GetString_().Sval, - Table: nodeItems[1].GetString_().Sval, - } - case 1: - icebergSchemaTable = common.IcebergSchemaTable{ - Schema: PG_SCHEMA_PUBLIC, - Table: nodeItems[0].GetString_().Sval, - } - default: - return errors.New("couldn't read DROP MATERIALIZED VIEW statement") - } - - // Drop the materialized view from the catalog - err := remapper.IcebergWriter.DropMaterializedView(icebergSchemaTable, dropStatement.MissingOk) - if err != nil { - return err - } - - return nil -} - -func (remapper *QueryRemapper) refreshMaterializedViewFromNode(node *pgQuery.Node) error { - icebergSchemaTable := common.IcebergSchemaTable{ - Schema: node.GetRefreshMatViewStmt().Relation.Schemaname, - Table: node.GetRefreshMatViewStmt().Relation.Relname, - } - if icebergSchemaTable.Schema == "" { - icebergSchemaTable.Schema = PG_SCHEMA_PUBLIC - } - - materializedView, err := remapper.IcebergReader.MaterializedView(icebergSchemaTable) - if err != nil { - return err - } - - queryStatements, _, err := remapper.ParseAndRemapQuery(materializedView.Definition) - if err != nil { - return fmt.Errorf("couldn't remap definition of REFRESH MATERIALIZED VIEW: %w", err) - } - - if node.GetRefreshMatViewStmt().Concurrent { - go func() { - err := remapper.IcebergWriter.RefreshMaterializedView(icebergSchemaTable, queryStatements[0]) - if err != nil { - common.LogError(remapper.config.CommonConfig, "couldn't refresh materialized view concurrently: %s", err) - } - }() - } else { - err = remapper.IcebergWriter.RefreshMaterializedView(icebergSchemaTable, queryStatements[0]) - if err != nil { - return fmt.Errorf("couldn't refresh materialized view: %w", err) - } - } - - return nil -} - -func (remapper *QueryRemapper) renameMaterializedViewFromNode(node *pgQuery.Node) error { - icebergSchemaTable := common.IcebergSchemaTable{ - Schema: node.GetRenameStmt().Relation.Schemaname, - Table: node.GetRenameStmt().Relation.Relname, - } - if icebergSchemaTable.Schema == "" { - icebergSchemaTable.Schema = PG_SCHEMA_PUBLIC - } - - renameStatement := node.GetRenameStmt() - newName := renameStatement.Newname - - err := remapper.IcebergWriter.RenameMaterializedView(icebergSchemaTable, newName, renameStatement.MissingOk) - if err != nil { - return fmt.Errorf("couldn't rename table: %w", err) - } - - return nil -} - -func (remapper *QueryRemapper) extractPermissions(query string) (*map[string][]string, error) { - parts := strings.Split(query, "/*"+PERMISSIONS_SQL_COMMENT+" ") - if len(parts) != 2 { - return nil, nil - } - parts = strings.Split(parts[1], " "+PERMISSIONS_SQL_COMMENT+"*/") - if len(parts) != 2 { - return nil, nil - } - - // JSON parse - var permissions map[string][]string - err := json.Unmarshal([]byte(parts[0]), &permissions) - if err != nil { - return nil, err - } - - return &permissions, nil -} - func (remapper *QueryRemapper) traceTreeTraversal(label string, indentLevel int) { - common.LogTrace(remapper.config.CommonConfig, strings.Repeat(">", indentLevel), label) + LogTrace(remapper.config, strings.Repeat(">", indentLevel), label) } diff --git a/src/server/query_remapper_expression.go b/server/query_remapper_expression.go similarity index 96% rename from src/server/query_remapper_expression.go rename to server/query_remapper_expression.go index a5815b2..872d921 100644 --- a/src/server/query_remapper_expression.go +++ b/server/query_remapper_expression.go @@ -88,6 +88,12 @@ func (remapper *QueryRemapperExpression) remappedOperatorExpression(node *pgQuer return node } + // value = ANY($1::text[]) -> list_contains($1::text[], value) + node = remapper.parserAExpr.RemappedAnyTextArrayParameter(node) + if node.GetAExpr() == nil { + return node + } + // = ANY('{information_schema, ...}') -> IN ('information_schema', ...) node = remapper.parserAExpr.ConvertedRightAnyStringConstantToIn(node) diff --git a/src/server/query_remapper_function.go b/server/query_remapper_function.go similarity index 80% rename from src/server/query_remapper_function.go rename to server/query_remapper_function.go index fd5a181..de22e69 100644 --- a/src/server/query_remapper_function.go +++ b/server/query_remapper_function.go @@ -4,12 +4,10 @@ import ( "regexp" pgQuery "github.com/pganalyze/pg_query_go/v6" - - "github.com/BemiHQ/BemiDB/src/common" ) -var PG_CATALOG_MACRO_FUNCTION_NAMES = common.Set[string]{} -var PG_INFORMATION_SCHEMA_MACRO_FUNCTION_NAMES = common.Set[string]{} +var PG_CATALOG_MACRO_FUNCTION_NAMES = Set[string]{} +var PG_INFORMATION_SCHEMA_MACRO_FUNCTION_NAMES = Set[string]{} func CreatePgCatalogMacroQueries(config *Config) []string { result := []string{ @@ -33,7 +31,7 @@ func CreatePgCatalogMacroQueries(config *Config) []string { "CREATE MACRO quote_ident(text) AS '\"' || text || '\"'", "CREATE MACRO row_to_json(record) AS to_json(record), (record, pretty_bool) AS to_json(record)", "CREATE MACRO set_config(setting_name, new_value, is_local) AS new_value", - "CREATE MACRO version() AS 'PostgreSQL " + PG_VERSION + ", compiled by BemiDB'", + "CREATE MACRO version() AS 'PostgreSQL " + PG_VERSION + ", compiled by PgStack'", "CREATE MACRO pg_get_statisticsobjdef_columns(oid) AS NULL", "CREATE MACRO pg_relation_is_publishable(val) AS NULL", `CREATE MACRO jsonb_extract_path_text(from_json, path_elems) AS @@ -46,26 +44,26 @@ func CreatePgCatalogMacroQueries(config *Config) []string { `CREATE MACRO jsonb_pretty(json) AS json_pretty(json)`, `CREATE MACRO json_array_elements(json) AS unnest(json_extract(json, '$[*]'))`, `CREATE MACRO jsonb_array_elements(json) AS unnest(json_extract(json, '$[*]'))`, - `CREATE MACRO json_build_object(k1, v1) AS json_object(k1, v1), - (k1, v1, k2, v2) AS json_object(k1, v1, k2, v2), - (k1, v1, k2, v2, k3, v3) AS json_object(k1, v1, k2, v2, k3, v3), - (k1, v1, k2, v2, k3, v3, k4, v4) AS json_object(k1, v1, k2, v2, k3, v3, k4, v4)`, + `CREATE OR REPLACE MACRO json_build_object(k1, v1) AS json_object(CAST(k1 AS VARCHAR), v1)`, + `CREATE OR REPLACE MACRO json_build_object(k1, v1, k2, v2) AS json_object(CAST(k1 AS VARCHAR), v1, CAST(k2 AS VARCHAR), v2)`, + `CREATE OR REPLACE MACRO json_build_object(k1, v1, k2, v2, k3, v3) AS json_object(CAST(k1 AS VARCHAR), v1, CAST(k2 AS VARCHAR), v2, CAST(k3 AS VARCHAR), v3)`, + `CREATE OR REPLACE MACRO json_build_object(k1, v1, k2, v2, k3, v3, k4, v4) AS json_object(CAST(k1 AS VARCHAR), v1, CAST(k2 AS VARCHAR), v2, CAST(k3 AS VARCHAR), v3, CAST(k4 AS VARCHAR), v4)`, `CREATE MACRO array_upper(arr, dimension) AS CASE dimension WHEN 1 THEN len(arr) ELSE NULL END`, - `CREATE MACRO to_char(timestamp, text) AS + `CREATE MACRO to_char(timestamp_var, text) AS CASE text - WHEN 'YYYY-MM-DD' THEN strftime(timestamp, '%Y-%m-%d') - WHEN 'YYYY-MM-DD HH24:MI:SS' THEN strftime(timestamp, '%Y-%m-%d %H:%M:%S') - WHEN 'MM/DD/YYYY' THEN strftime(timestamp, '%m/%d/%Y') - WHEN 'DD-MON-YYYY' THEN strftime(timestamp, '%d-%b-%Y') - WHEN 'HH24:MI:SS' THEN strftime(timestamp, '%H:%M:%S') - WHEN 'YYYY' THEN strftime(timestamp, '%Y') - WHEN 'MM' THEN strftime(timestamp, '%m') - WHEN 'DD' THEN strftime(timestamp, '%d') - ELSE strftime(timestamp, text) + WHEN 'YYYY-MM-DD' THEN strftime(timestamp_var, '%Y-%m-%d') + WHEN 'YYYY-MM-DD HH24:MI:SS' THEN strftime(timestamp_var, '%Y-%m-%d %H:%M:%S') + WHEN 'MM/DD/YYYY' THEN strftime(timestamp_var, '%m/%d/%Y') + WHEN 'DD-MON-YYYY' THEN strftime(timestamp_var, '%d-%b-%Y') + WHEN 'HH24:MI:SS' THEN strftime(timestamp_var, '%H:%M:%S') + WHEN 'YYYY' THEN strftime(timestamp_var, '%Y') + WHEN 'MM' THEN strftime(timestamp_var, '%m') + WHEN 'DD' THEN strftime(timestamp_var, '%d') + ELSE strftime(timestamp_var, text) END`, // Table functions @@ -105,13 +103,13 @@ func CreatePgCatalogMacroQueries(config *Config) []string { func CreateInformationSchemaMacroQueries(config *Config) []string { result := []string{ - "CREATE MACRO _pg_expandarray(arr) AS STRUCT_PACK(x := unnest(arr), n := unnest(generate_series(1, array_length(arr))))", + "CREATE MACRO _pg_expandarray(arr) AS TABLE SELECT unnest(arr) AS x, unnest(generate_series(1, array_length(arr))) AS n", } PG_INFORMATION_SCHEMA_MACRO_FUNCTION_NAMES = extractMacroNames(result) return result } -var BUILTIN_DUCKDB_PG_FUNCTION_NAMES = common.NewSet[string]().AddAll([]string{ +var BUILTIN_DUCKDB_PG_FUNCTION_NAMES = NewSet[string]().AddAll([]string{ "array_to_string", "generate_series", }) @@ -194,8 +192,8 @@ func (remapper *QueryRemapperFunction) RemapNestedFunctionCalls(functionCall *pg } } -func extractMacroNames(macros []string) common.Set[string] { - names := make(common.Set[string]) +func extractMacroNames(macros []string) Set[string] { + names := make(Set[string]) re := regexp.MustCompile(`CREATE MACRO (\w+)\(`) for _, macro := range macros { diff --git a/server/query_remapper_search.go b/server/query_remapper_search.go new file mode 100644 index 0000000..d987b9e --- /dev/null +++ b/server/query_remapper_search.go @@ -0,0 +1,509 @@ +package main + +import ( + "encoding/json" + "fmt" + "strconv" + "strings" + + pgQuery "github.com/pganalyze/pg_query_go/v6" + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/reflect/protoreflect" +) + +const ( + VECTOR_SEARCH_OVERSAMPLE = 10 + HYBRID_RRF_CONSTANT = 60 + PGSTACK_CHUNK_INDEX_COLUMN = "__pgstack_chunk_index" + PGSTACK_SOURCE_KEY_COLUMN = "__pgstack_source_key" + PGSTACK_VECTOR_RANK_COLUMN = "__pgstack_rank" +) + +type serverSearchTable struct { + Name string `json:"name"` + IndexColumns []string `json:"indexColumns"` + StoreColumns []string `json:"storeColumns"` + KeywordOnly bool `json:"keywordOnly,omitempty"` +} + +type vectorQueryOperand struct { + key string + sql string +} + +type SearchParameterSpec struct { + Dimensions int + RequireNonZero bool + LiteralText *string + SourceParameter int + TextOnly bool + RowCountTable string +} + +func (remapper *QueryRemapper) remapSearchRank(selectStatement *pgQuery.SelectStmt, vectorParameters map[int]SearchParameterSpec) error { + hasRank := false + visitSearchMessages(selectStatement, func(message protoreflect.Message) { + if call, ok := message.Interface().(*pgQuery.FuncCall); ok && isSearchRankFunction(call) { + hasRank = true + } + }) + if !hasRank { + return nil + } + if len(selectStatement.FromClause) != 1 || len(selectStatement.SortClause) != 1 { + return fmt.Errorf("search rank requires one Search table and one ORDER BY rank function") + } + rangeVar := selectStatement.FromClause[0].GetRangeVar() + if rangeVar == nil || rangeVar.Schemaname != PG_SCHEMA_SEARCH || len(rangeVar.Alias.GetColnames()) != 0 { + return fmt.Errorf("search rank requires a single Search table without column aliases") + } + if len(selectStatement.GroupClause) != 0 || selectStatement.HavingClause != nil || len(selectStatement.DistinctClause) != 0 || len(selectStatement.WindowClause) != 0 { + return fmt.Errorf("search rank does not support grouping, DISTINCT, or window clauses") + } + sortBy := selectStatement.SortClause[0].GetSortBy() + if sortBy == nil || sortBy.Node == nil { + return nil + } + functionCall := sortBy.Node.GetFuncCall() + if !isSearchRankFunction(functionCall) { + return fmt.Errorf("search rank must be the ORDER BY expression") + } + if functionCall.AggDistinct || functionCall.AggStar || len(functionCall.AggOrder) != 0 || functionCall.AggFilter != nil || functionCall.Over != nil || functionCall.AggWithinGroup { + return fmt.Errorf("search rank functions do not support aggregate or window syntax") + } + if sortBy.SortbyDir != pgQuery.SortByDir_SORTBY_DEFAULT && sortBy.SortbyDir != pgQuery.SortByDir_SORTBY_ASC { + return fmt.Errorf("search rank queries must use ascending order") + } + limit := int32(10) + if selectStatement.LimitCount != nil { + if selectStatement.LimitCount.GetAConst() == nil || selectStatement.LimitCount.GetAConst().GetIval() == nil { + return fmt.Errorf("search rank LIMIT must be an integer") + } + limit = selectStatement.LimitCount.GetAConst().GetIval().Ival + } + if limit <= 0 { + return fmt.Errorf("search rank LIMIT must be positive") + } + if selectStatement.LimitCount == nil { + selectStatement.LimitCount = pgQuery.MakeAConstIntNode(int64(limit), 0) + selectStatement.LimitOption = pgQuery.LimitOption_LIMIT_OPTION_COUNT + } + + offset := int32(0) + if selectStatement.LimitOffset != nil { + constant := selectStatement.LimitOffset.GetAConst() + if constant == nil || constant.GetIval() == nil || constant.GetIval().Ival < 0 { + return fmt.Errorf("search rank OFFSET must be a non-negative integer") + } + offset = constant.GetIval().Ival + } + requiredDocuments := int64(limit) + int64(offset) + + embeddingName := "__pgstack_embedding" + var configuredTables []serverSearchTable + if err := json.Unmarshal([]byte(remapper.config.SearchTablesJSON), &configuredTables); err != nil { + return fmt.Errorf("invalid Search server configuration: %w", err) + } + var configuredTable *serverSearchTable + for _, table := range configuredTables { + if strings.ReplaceAll(table.Name, ".", "_") != rangeVar.Relname { + continue + } + configuredTable = &table + break + } + if configuredTable == nil || len(configuredTable.IndexColumns) == 0 { + return fmt.Errorf("unknown or unindexed Search table: search.%s", rangeVar.Relname) + } + + rankFunction := functionCall.Funcname[0].GetString_().Sval + if configuredTable.KeywordOnly && rankFunction != "keyword_rank" { + return fmt.Errorf("%s requires semantic indexing; restart the local image with OPENAI_API_KEY", rankFunction) + } + dimensions := OPENAI_EMBEDDING_DIMENSIONS + if rankFunction == "keyword_rank" { + dimensions = 0 + } + nextParameterNumber := maxVectorParameterNumber(selectStatement) + 1 + queryOperand, err := parseSearchRankArgument(functionCall, dimensions, vectorParameters, &nextParameterNumber) + if err != nil { + return err + } + distanceExpression := fmt.Sprintf( + "%s(%s, %s)", + "array_cosine_distance", + quoteVectorIdentifier(embeddingName), + queryOperand.sql, + ) + replaceSearchRankTargets(selectStatement, queryOperand.key, rankFunction) + // Keep search text validation/binding separate from ordinary SQL parameters. + validationCopy := proto.Clone(selectStatement).(*pgQuery.SelectStmt) + validationCopy.SortClause = nil + var validationError error + visitSearchMessages(validationCopy, func(message protoreflect.Message) { + if call, ok := message.Interface().(*pgQuery.FuncCall); ok && isSearchRankFunction(call) { + validationError = fmt.Errorf("selected rank functions must match the ORDER BY query") + } + if parameter, ok := message.Interface().(*pgQuery.ParamRef); ok && queryOperand.key == "parameter:"+strconv.Itoa(int(parameter.Number)) { + validationError = fmt.Errorf("search rank parameter $%d cannot also be used outside the rank function; use a separate parameter", parameter.Number) + } + }) + if validationError != nil { + return validationError + } + + path := fmt.Sprintf("s3://%s/%s/%s.lance", remapper.config.AwsS3Bucket, strings.Trim(remapper.config.SearchBasePath, "/"), rangeVar.Relname) + alias := rangeVar.Relname + if rangeVar.Alias != nil { + alias = rangeVar.Alias.Aliasname + } + projectedColumns := make([]string, 0, len(configuredTable.StoreColumns)+1) + for _, column := range configuredTable.StoreColumns { + projectedColumns = append(projectedColumns, quoteVectorIdentifier(column)) + } + publicColumns := strings.Join(projectedColumns, ", ") + projectedColumns = append(projectedColumns, quoteVectorIdentifier(PGSTACK_SOURCE_KEY_COLUMN)) + searchLimit := requiredDocuments * VECTOR_SEARCH_OVERSAMPLE + projected := strings.Join(projectedColumns, ", ") + projectedWithDistance := projected + ", " + quoteVectorIdentifier("__pgstack_distance") + physicalTable := "search_store.main." + quoteVectorIdentifier(rangeVar.Relname) + // Apply filters directly to each raw retrieval before chunk deduplication. + // Conservative prefilter eligibility avoids rejecting valid DuckDB expressions + // that Lance cannot evaluate. Those still retain filtered exhaustive fallbacks. + prefilter := isSearchPrefilter(selectStatement.WhereClause) + vectorSource := func(k string) string { + return fmt.Sprintf("SELECT %s, %s AS __pgstack_distance FROM lance_vector_search('%s', '%s', %s, k => %s, prefilter => %t)", + projected, distanceExpression, strings.ReplaceAll(path, "'", "''"), embeddingName, queryOperand.sql, k, prefilter) + } + textOperand := queryOperand.sql + if rankFunction == "hybrid_rank" { + textParameter := nextParameterNumber + nextParameterNumber++ + textSpec := SearchParameterSpec{TextOnly: true} + if parameter := functionCall.Args[0].GetParamRef(); parameter != nil { + textSpec.SourceParameter = int(parameter.Number) + } else { + text := functionCall.Args[0].GetAConst().GetSval().Sval + textSpec.LiteralText = &text + } + vectorParameters[textParameter] = textSpec + textOperand = searchOperandSQL(textParameter, 0) + } + keywordSource := func(k string) string { + return fmt.Sprintf("SELECT %s, -_score AS __pgstack_distance FROM lance_fts('%s', '__pgstack_text', %s, k => %s, prefilter => %t)", + projected, strings.ReplaceAll(path, "'", "''"), textOperand, k, prefilter) + } + if rankFunction == "keyword_rank" && (selectStatement.WhereClause == nil || prefilter) { + // Only the first chunk has searchable text, so FTS already returns unique + // documents. With no postfilter, LIMIT + OFFSET is the entire retrieval budget. + source, err := filterSearchSource(keywordSource(strconv.FormatInt(requiredDocuments, 10)), selectStatement.WhereClause, alias) + if err != nil { + return err + } + template := fmt.Sprintf("SELECT %s FROM (%s) AS %s ORDER BY __pgstack_distance, __pgstack_source_key", + projectedWithDistance, source, quoteVectorIdentifier(alias)) + return remapSearchSource(selectStatement, template, configuredTable.StoreColumns, alias) + } + vectorFallback := fmt.Sprintf("SELECT %s, %s AS __pgstack_distance FROM %s WHERE %s IS NOT NULL", + projected, distanceExpression, physicalTable, quoteVectorIdentifier(embeddingName)) + allChunks := "" + if rankFunction != "semantic_rank" { + vectorParameters[nextParameterNumber] = SearchParameterSpec{RowCountTable: physicalTable} + allChunks = fmt.Sprintf("CAST($%d AS BIGINT)", nextParameterNumber) + } + filteredDocuments := func(source string) (string, error) { + filtered, err := filterSearchSource(source, selectStatement.WhereClause, alias) + if err != nil { + return "", err + } + return buildVectorDocumentsQuery(filtered, projectedWithDistance, alias), nil + } + buildDocuments := func(fallback bool) (string, error) { + k := strconv.FormatInt(searchLimit, 10) + if fallback { + k = allChunks + } + if rankFunction == "keyword_rank" { + return filteredDocuments(keywordSource(k)) + } + vectorSQL := vectorFallback + if !fallback { + vectorSQL = vectorSource(k) + } + vectorDocuments, err := filteredDocuments(vectorSQL) + if err != nil || rankFunction == "semantic_rank" { + return vectorDocuments, err + } + keywordDocuments, err := filteredDocuments(keywordSource(k)) + if err != nil { + return "", err + } + return buildHybridDocumentsQuery(vectorDocuments, keywordDocuments, projected), nil + } + candidateDocuments, err := buildDocuments(false) + if err != nil { + return err + } + fallbackDocuments, err := buildDocuments(true) + if err != nil { + return err + } + template := fmt.Sprintf( + `SELECT * FROM ( + WITH __pgstack_candidate_docs AS MATERIALIZED (%s), + __pgstack_fallback_docs AS (%s), + __pgstack_search_docs AS ( + SELECT %s FROM __pgstack_candidate_docs + WHERE (SELECT count(*) FROM __pgstack_candidate_docs) >= %d + UNION ALL + SELECT %s FROM __pgstack_fallback_docs + WHERE (SELECT count(*) FROM __pgstack_candidate_docs) < %d + ) + SELECT %s FROM __pgstack_search_docs + ) AS %s ORDER BY %s, %s`, + candidateDocuments, + fallbackDocuments, + projectedWithDistance, + requiredDocuments, + projectedWithDistance, + requiredDocuments, + publicColumns+", "+quoteVectorIdentifier("__pgstack_distance")+", "+quoteVectorIdentifier(PGSTACK_SOURCE_KEY_COLUMN), + quoteVectorIdentifier(alias), + quoteVectorIdentifier("__pgstack_distance"), + quoteVectorIdentifier(PGSTACK_SOURCE_KEY_COLUMN), + ) + return remapSearchSource(selectStatement, template, configuredTable.StoreColumns, alias) +} + +func remapSearchSource(selectStatement *pgQuery.SelectStmt, template string, columns []string, alias string) error { + parsed, err := pgQuery.Parse(template) + if err != nil { + return fmt.Errorf("failed to build search: %w", err) + } + templateSelect := parsed.Stmts[0].Stmt.GetSelectStmt() + expandSearchStars(selectStatement, columns, alias) + selectStatement.FromClause = templateSelect.FromClause + selectStatement.SortClause = templateSelect.SortClause + selectStatement.WhereClause = nil + return nil +} + +func buildVectorDocumentsQuery(source string, projectedColumns string, alias string) string { + return fmt.Sprintf( + `SELECT %s FROM ( + SELECT %s, row_number() OVER (PARTITION BY %s ORDER BY %s) AS %s + FROM (%s) AS __pgstack_chunks + ) AS %s WHERE %s = 1`, + projectedColumns, + projectedColumns, + quoteVectorIdentifier(PGSTACK_SOURCE_KEY_COLUMN), + quoteVectorIdentifier("__pgstack_distance"), + quoteVectorIdentifier(PGSTACK_VECTOR_RANK_COLUMN), + source, + quoteVectorIdentifier(alias), + quoteVectorIdentifier(PGSTACK_VECTOR_RANK_COLUMN), + ) +} + +// Both inputs contain one row per source document. Rank each retrieval after +// deduplication so extra vector chunks cannot boost a document's fusion score. +func buildHybridDocumentsQuery(vectorDocuments, keywordDocuments, columns string) string { + return fmt.Sprintf(`WITH __pgstack_vector_docs AS (%s), __pgstack_keyword_docs AS (%s), + __pgstack_signals AS ( + SELECT %s, -1.0 / (%d + rank() OVER (ORDER BY __pgstack_distance)) AS __pgstack_distance FROM __pgstack_vector_docs + UNION ALL + SELECT %s, -1.0 / (%d + rank() OVER (ORDER BY __pgstack_distance)) AS __pgstack_distance FROM __pgstack_keyword_docs + ) + SELECT %s, sum(__pgstack_distance) AS __pgstack_distance FROM __pgstack_signals GROUP BY %s`, + vectorDocuments, keywordDocuments, columns, HYBRID_RRF_CONSTANT, columns, HYBRID_RRF_CONSTANT, columns, columns) +} + +func filterSearchSource(source string, filter *pgQuery.Node, alias string) (string, error) { + parsed, err := pgQuery.Parse(source) + if err != nil { + return "", fmt.Errorf("failed to build search source: %w", err) + } + statement := parsed.Stmts[0].Stmt.GetSelectStmt() + if function := statement.FromClause[0].GetRangeFunction(); function != nil { + function.Alias = &pgQuery.Alias{Aliasname: alias} + } else { + statement.FromClause[0].GetRangeVar().Alias = &pgQuery.Alias{Aliasname: alias} + } + if filter != nil { + condition := proto.Clone(filter).(*pgQuery.Node) + if statement.WhereClause == nil { + statement.WhereClause = condition + } else { + statement.WhereClause = &pgQuery.Node{Node: &pgQuery.Node_BoolExpr{BoolExpr: &pgQuery.BoolExpr{ + Boolop: pgQuery.BoolExprType_AND_EXPR, Args: []*pgQuery.Node{statement.WhereClause, condition}, + }}} + } + } + return pgQuery.Deparse(parsed) +} + +// DuckDB translates simple column comparisons and conjunctions into Lance +// filters. Other expressions remain valid SQL with best-effort pushdown. +func isSearchPrefilter(filter *pgQuery.Node) bool { + if filter == nil { + return false + } + if boolean := filter.GetBoolExpr(); boolean != nil { + if boolean.Boolop != pgQuery.BoolExprType_AND_EXPR || len(boolean.Args) == 0 { + return false + } + for _, argument := range boolean.Args { + if !isSearchPrefilter(argument) { + return false + } + } + return true + } + if null := filter.GetNullTest(); null != nil { + return null.Arg.GetColumnRef() != nil && !null.Argisrow + } + expression := filter.GetAExpr() + if expression == nil || expression.Kind != pgQuery.A_Expr_Kind_AEXPR_OP || len(expression.Name) != 1 { + return false + } + switch expression.Name[0].GetString_().GetSval() { + case "=", "<>", "!=", "<", ">", "<=", ">=": + default: + return false + } + // Stored columns are VARCHAR. Numeric literals may cast the column, turning + // a comparison into an expression that cannot be guaranteed to prefilter. + isValue := func(node *pgQuery.Node) bool { + return node.GetParamRef() != nil || node.GetAConst().GetSval() != nil + } + return expression.Lexpr.GetColumnRef() != nil && isValue(expression.Rexpr) || expression.Rexpr.GetColumnRef() != nil && isValue(expression.Lexpr) +} + +func parseSearchRankArgument(functionCall *pgQuery.FuncCall, dimensions int, vectorParameters map[int]SearchParameterSpec, nextParameterNumber *int) (*vectorQueryOperand, error) { + if len(functionCall.Args) != 1 { + return nil, fmt.Errorf("search rank functions require exactly one text argument") + } + argument := functionCall.Args[0] + if parameter := argument.GetParamRef(); parameter != nil { + parameterNumber := int(parameter.Number) + vectorParameters[parameterNumber] = SearchParameterSpec{Dimensions: dimensions, RequireNonZero: dimensions > 0, TextOnly: dimensions == 0} + return &vectorQueryOperand{ + key: "parameter:" + strconv.Itoa(parameterNumber), + sql: searchOperandSQL(parameterNumber, dimensions), + }, nil + } + constant := argument.GetAConst() + if constant == nil || constant.GetSval() == nil { + return nil, fmt.Errorf("search rank argument must be a text literal or bind parameter") + } + text := constant.GetSval().Sval + if err := validateEmbeddingInput(text); err != nil { + return nil, err + } + parameterNumber := *nextParameterNumber + *nextParameterNumber = parameterNumber + 1 + vectorParameters[parameterNumber] = SearchParameterSpec{Dimensions: dimensions, RequireNonZero: dimensions > 0, LiteralText: &text, TextOnly: dimensions == 0} + return &vectorQueryOperand{ + key: "literal:" + text, + sql: searchOperandSQL(parameterNumber, dimensions), + }, nil +} + +func searchOperandSQL(parameter, dimensions int) string { + if dimensions == 0 { + return fmt.Sprintf("CAST($%d AS VARCHAR)", parameter) + } + return fmt.Sprintf("CAST($%d AS REAL[%d])", parameter, dimensions) +} + +func isSearchRankFunction(functionCall *pgQuery.FuncCall) bool { + if functionCall == nil || len(functionCall.Funcname) != 1 || functionCall.Funcname[0].GetString_() == nil { + return false + } + switch functionCall.Funcname[0].GetString_().Sval { + case "semantic_rank", "hybrid_rank", "keyword_rank": + return true + default: + return false + } +} + +func maxVectorParameterNumber(message proto.Message) int { + maximum := 0 + visitSearchMessages(message, func(current protoreflect.Message) { + if parameter, ok := current.Interface().(*pgQuery.ParamRef); ok { + maximum = max(maximum, int(parameter.Number)) + } + }) + return maximum +} + +func visitSearchMessages(message proto.Message, visitor func(protoreflect.Message)) { + var visit func(protoreflect.Message) + visit = func(current protoreflect.Message) { + visitor(current) + current.Range(func(field protoreflect.FieldDescriptor, value protoreflect.Value) bool { + if field.IsList() && field.Kind() == protoreflect.MessageKind { + list := value.List() + for i := 0; i < list.Len(); i++ { + visit(list.Get(i).Message()) + } + } else if field.Kind() == protoreflect.MessageKind { + visit(value.Message()) + } + return true + }) + } + visit(message.ProtoReflect()) +} + +func replaceSearchRankTargets(selectStatement *pgQuery.SelectStmt, operandKey string, rankFunction string) { + for _, targetNode := range selectStatement.TargetList { + target := targetNode.GetResTarget() + if target == nil || target.Val == nil { + continue + } + functionCall := target.Val.GetFuncCall() + if !isSearchRankFunction(functionCall) || functionCall.Funcname[0].GetString_().Sval != rankFunction || len(functionCall.Args) != 1 { + continue + } + argument := functionCall.Args[0] + matches := false + if parameter := argument.GetParamRef(); parameter != nil { + matches = operandKey == "parameter:"+strconv.Itoa(int(parameter.Number)) + } + if constant := argument.GetAConst(); constant != nil && constant.GetSval() != nil { + matches = operandKey == "literal:"+constant.GetSval().Sval + } + if matches { + if target.Name == "" { + target.Name = functionCall.Funcname[0].GetString_().Sval + } + target.Val = pgQuery.MakeColumnRefNode([]*pgQuery.Node{pgQuery.MakeStrNode("__pgstack_distance")}, 0) + } + } +} + +// The ranking column is available to ORDER BY but must not leak through SELECT *. +func expandSearchStars(statement *pgQuery.SelectStmt, columns []string, alias string) { + var targets []*pgQuery.Node + for _, node := range statement.TargetList { + target := node.GetResTarget() + column := target.GetVal().GetColumnRef() + if column == nil || len(column.Fields) == 0 || column.Fields[len(column.Fields)-1].GetAStar() == nil || + (len(column.Fields) > 1 && (len(column.Fields) != 2 || column.Fields[0].GetString_().GetSval() != alias)) { + targets = append(targets, node) + continue + } + for _, name := range columns { + targets = append(targets, &pgQuery.Node{Node: &pgQuery.Node_ResTarget{ResTarget: &pgQuery.ResTarget{ + Val: pgQuery.MakeColumnRefNode([]*pgQuery.Node{pgQuery.MakeStrNode(alias), pgQuery.MakeStrNode(name)}, 0), + }}}) + } + } + statement.TargetList = targets +} + +func quoteVectorIdentifier(value string) string { + return `"` + strings.ReplaceAll(value, `"`, `""`) + `"` +} diff --git a/server/query_remapper_search_test.go b/server/query_remapper_search_test.go new file mode 100644 index 0000000..2366425 --- /dev/null +++ b/server/query_remapper_search_test.go @@ -0,0 +1,262 @@ +package main + +import ( + "fmt" + "strings" + "testing" + + pgQuery "github.com/pganalyze/pg_query_go/v6" +) + +func searchTestConfig() *Config { + return &Config{AwsS3Bucket: "bucket", SearchBasePath: "org/project/search", SearchTablesJSON: `[{"name":"public.documents","indexColumns":["title","body"],"storeColumns":["id","body"]}]`} +} + +func remapSearchForTest(t *testing.T, query string) (string, map[int]SearchParameterSpec, error) { + t.Helper() + parsed, err := pgQuery.Parse(query) + if err != nil { + t.Fatal(err) + } + parameters := map[int]SearchParameterSpec{} + err = (&QueryRemapper{config: searchTestConfig()}).remapSearchRank(parsed.Stmts[0].Stmt.GetSelectStmt(), parameters) + if err != nil { + return "", parameters, err + } + sql, err := pgQuery.Deparse(parsed) + return sql, parameters, err +} + +func TestSemanticRank(t *testing.T) { + for _, function := range []string{"semantic_rank"} { + t.Run(function, func(t *testing.T) { + query, parameters, err := remapSearchForTest(t, `SELECT *, `+function+`('rain jacket') AS rank FROM search.public_documents ORDER BY `+function+`('rain jacket') LIMIT 5`) + if err != nil { + t.Fatal(err) + } + spec := parameters[1] + if len(parameters) != 1 || spec.LiteralText == nil || *spec.LiteralText != "rain jacket" || !spec.RequireNonZero { + t.Fatalf("unexpected rank parameters: %#v", parameters) + } + for _, expected := range []string{"lance_vector_search", "org/project/search/public_documents.lance", "array_cosine_distance", "__pgstack_embedding", "k := 50", "__pgstack_rank = 1", "__pgstack_fallback_docs", "__pgstack_distance AS rank", "$1::real[1536]"} { + if !strings.Contains(query, expected) { + t.Fatalf("missing %q: %s", expected, query) + } + } + if !strings.HasPrefix(query, "SELECT public_documents.id, public_documents.body,") { + t.Fatalf("SELECT * exposes internal columns: %s", query) + } + if strings.Contains(query, "rain jacket") || strings.Contains(query, function+"(") { + t.Fatalf("unmapped rank expression: %s", query) + } + }) + } +} + +func TestSearchRankParametersAndFilters(t *testing.T) { + for _, input := range []struct { + argument, cast string + parameter int + }{ + {"'rain jacket'", "$2::real[1536]", 2}, + {"$2", "$2::real[1536]", 2}, + } { + query, parameters, err := remapSearchForTest(t, `SELECT documents.id, semantic_rank(`+input.argument+`) AS rank FROM search.public_documents AS documents WHERE documents.id = $1 ORDER BY semantic_rank(`+input.argument+`) LIMIT 5 OFFSET 2`) + if err != nil { + t.Fatal(err) + } + if _, ok := parameters[input.parameter]; !ok { + t.Fatalf("missing embedding parameter: %#v", parameters) + } + for _, expected := range []string{input.cast, "k := 70", "count(*) FROM __pgstack_candidate_docs) >= 7", "OFFSET 2", "__pgstack_distance AS rank"} { + if !strings.Contains(query, expected) { + t.Fatalf("missing %q: %s", expected, query) + } + } + if strings.Count(query, "documents.id = $1") != 2 { + t.Fatalf("filter must apply before candidate/fallback choice: %s", query) + } + } + query, _, err := remapSearchForTest(t, `SELECT id FROM search.public_documents ORDER BY semantic_rank($1)`) + if err != nil { + t.Fatal(err) + } + if !strings.Contains(query, "LIMIT 10") || !strings.Contains(query, "k := 100") { + t.Fatalf("missing default limit: %s", query) + } +} + +func TestSearchRankValidation(t *testing.T) { + for _, test := range []struct{ query, want string }{ + {`SELECT * FROM search.public_documents ORDER BY semantic_rank('')`, "cannot be empty"}, + {`SELECT * FROM search.public_documents ORDER BY semantic_rank('` + strings.Repeat("x", EMBEDDING_MAX_INPUT_BYTES+1) + `')`, "cannot exceed"}, + {`SELECT * FROM search.public_documents ORDER BY semantic_rank(NULL)`, "text literal or bind parameter"}, + {`SELECT * FROM search.public_documents ORDER BY semantic_rank(body)`, "text literal or bind parameter"}, + {`SELECT * FROM search.public_documents ORDER BY semantic_rank()`, "exactly one"}, + {`SELECT * FROM search.public_documents ORDER BY semantic_rank('one', 'two')`, "exactly one"}, + {`SELECT * FROM search.public_documents ORDER BY semantic_rank('one') DESC`, "ascending"}, + {`SELECT * FROM search.public_documents ORDER BY semantic_rank('one') LIMIT 0`, "positive"}, + {`SELECT * FROM search.public_documents ORDER BY semantic_rank('one') LIMIT $1`, "integer"}, + {`SELECT * FROM search.public_documents ORDER BY semantic_rank('one') OFFSET -1`, "non-negative"}, + {`SELECT * FROM search.public_documents ORDER BY semantic_rank(DISTINCT 'one')`, "aggregate"}, + {`SELECT * FROM search.unknown ORDER BY semantic_rank('one')`, "unknown or unindexed"}, + {`SELECT * FROM search.public_documents WHERE body = $1 ORDER BY semantic_rank($1)`, "separate parameter"}, + {`SELECT semantic_rank('two') FROM search.public_documents ORDER BY semantic_rank('one')`, "must match"}, + {`SELECT * FROM search.public_documents ORDER BY semantic_rank('one'), id`, "one ORDER BY"}, + } { + t.Run(test.want+test.query[:min(35, len(test.query))], func(t *testing.T) { + _, _, err := remapSearchForTest(t, test.query) + if err == nil || !strings.Contains(err.Error(), test.want) { + t.Fatalf("expected %q, got %v for %s", test.want, err, test.query) + } + }) + } +} + +func TestSearchTableScanExposesStoredColumns(t *testing.T) { + config := searchTestConfig() + remapper := &QueryRemapperTable{parserTable: NewParserTable(config), config: config} + parsed, err := pgQuery.Parse(`SELECT * FROM search.public_documents AS documents`) + if err != nil { + t.Fatal(err) + } + statement := parsed.Stmts[0].Stmt.GetSelectStmt() + statement.FromClause[0] = remapper.RemapTable(statement.FromClause[0]) + query, err := pgQuery.Deparse(parsed) + if err != nil { + t.Fatal(err) + } + for _, expected := range []string{"SELECT id, body FROM search_store.main.public_documents", "__pgstack_chunk_index = 0", "documents"} { + if !strings.Contains(query, expected) { + t.Fatalf("missing %q: %s", expected, query) + } + } +} + +func TestKeywordAndHybridRankRemapping(t *testing.T) { + for _, function := range []string{"keyword_rank", "hybrid_rank"} { + query, specs, err := remapSearchForTest(t, "SELECT id, "+function+"($2) AS rank FROM search.public_documents AS d WHERE d.id = $1 ORDER BY "+function+"($2) LIMIT 2 OFFSET 1") + if err != nil { + t.Fatal(err) + } + want := "lance_fts" + if function == "hybrid_rank" { + want = "lance_vector_search" + } + if !strings.Contains(query, want) || (function == "keyword_rank" && strings.Contains(query, "array_cosine_distance")) || !strings.Contains(query, "__pgstack_text") { + t.Fatalf("incorrect search source: %s", query) + } + if specs[2].TextOnly != (function == "keyword_rank") { + t.Fatalf("incorrect binding: %#v", specs) + } + if function == "hybrid_rank" && specs[3].SourceParameter != 2 { + t.Fatalf("missing original query text: %#v", specs) + } + expectedFilters := 1 + if function == "hybrid_rank" { + expectedFilters = 4 + } + if strings.Count(query, "d.id = $1") != expectedFilters { + t.Fatalf("missing filtered fallback: %s", query) + } + } + for _, query := range []string{ + "SELECT semantic_rank('rain') FROM search.public_documents ORDER BY keyword_rank('rain')", + "SELECT keyword_rank('rain') FROM search.public_documents ORDER BY hybrid_rank('rain')", + "SELECT id FROM search.public_documents WHERE body = $1 ORDER BY keyword_rank($1)", + } { + if _, _, err := remapSearchForTest(t, query); err == nil { + t.Fatalf("expected mismatched rank/binding rejection: %s", query) + } + } +} + +func TestSearchFilterPlacement(t *testing.T) { + for _, test := range []struct { + filter string + prefilter bool + }{ + {"d.body = $1", true}, + {"d.body = 'waterproof' AND d.id >= '2'", true}, + {"d.body IS NOT NULL", true}, + {"length(d.body) > 3", false}, + {"d.id = 2", false}, + {"d.body = 'waterproof' OR d.body = 'excluded'", false}, + } { + for _, function := range []string{"semantic_rank", "keyword_rank", "hybrid_rank"} { + query, _, err := remapSearchForTest(t, "SELECT id FROM search.public_documents AS d WHERE "+test.filter+" ORDER BY "+function+"('rain jacket') LIMIT 2") + if err != nil { + t.Fatal(err) + } + if !strings.Contains(query, fmt.Sprintf("prefilter := %t", test.prefilter)) { + t.Fatalf("incorrect prefilter for %s: %s", test.filter, query) + } + if !strings.Contains(query, " d WHERE ") || strings.Contains(query, "__pgstack_rank = 1 AND") { + t.Fatalf("filter was applied after deduplication: %s", query) + } + if function == "hybrid_rank" && (!strings.Contains(query, "__pgstack_signals") || !strings.Contains(query, "rank() OVER") || strings.Contains(query, "lance_hybrid_search")) { + t.Fatalf("missing document fusion: %s", query) + } + } + } +} + +func TestKeywordRankDirectRetrieval(t *testing.T) { + for _, filter := range []string{"", "WHERE d.body = 'waterproof'", "WHERE d.body = $1", "WHERE d.body IS NOT NULL"} { + query, specs, err := remapSearchForTest(t, "SELECT *, keyword_rank('rain jacket') AS rank FROM search.public_documents AS d "+filter+" ORDER BY keyword_rank('rain jacket') LIMIT 5 OFFSET 2") + if err != nil { + t.Fatal(err) + } + if strings.Count(query, "lance_fts(") != 1 || !strings.Contains(query, "k := 7") || !strings.Contains(query, "OFFSET 2") { + t.Fatalf("incorrect direct retrieval: %s", query) + } + for _, unnecessary := range []string{"__pgstack_fallback_docs", "row_number()", "__pgstack_candidate_docs", "count(*)"} { + if strings.Contains(query, unnecessary) { + t.Fatalf("direct keyword retrieval contains %s: %s", unnecessary, query) + } + } + if len(specs) != 1 { + t.Fatalf("unexpected hidden parameters: %#v", specs) + } + for _, spec := range specs { + if !spec.TextOnly || spec.RowCountTable != "" { + t.Fatalf("unexpected binding: %#v", spec) + } + } + if !strings.HasPrefix(query, "SELECT d.id, d.body, __pgstack_distance AS rank") { + t.Fatalf("incorrect public projection: %s", query) + } + } + query, specs, err := remapSearchForTest(t, "SELECT id FROM search.public_documents WHERE length(body) > 3 ORDER BY keyword_rank('rain jacket') LIMIT 5") + if err != nil { + t.Fatal(err) + } + if !strings.Contains(query, "__pgstack_fallback_docs") || !strings.Contains(query, "k := 50") || len(specs) != 2 { + t.Fatalf("complex filter lost fallback: %s %#v", query, specs) + } +} + +func TestKeywordOnlyRankModes(t *testing.T) { + config := searchTestConfig() + config.SearchTablesJSON = strings.Replace(config.SearchTablesJSON, `"name":`, `"keywordOnly":true,"name":`, 1) + for _, function := range []string{"keyword_rank", "semantic_rank", "hybrid_rank"} { + parsed, err := pgQuery.Parse(`SELECT id FROM search.public_documents ORDER BY ` + function + `('rain jacket') LIMIT 5`) + if err != nil { + t.Fatal(err) + } + parameters := map[int]SearchParameterSpec{} + err = (&QueryRemapper{config: config}).remapSearchRank(parsed.Stmts[0].Stmt.GetSelectStmt(), parameters) + if function == "keyword_rank" { + if err != nil { + t.Fatal(err) + } + for _, parameter := range parameters { + if !parameter.TextOnly { + t.Fatal("keyword query requested embeddings") + } + } + } else if err == nil || !strings.Contains(err.Error(), "requires semantic indexing") { + t.Fatalf("unexpected error: %v", err) + } + } +} diff --git a/src/server/query_remapper_select.go b/server/query_remapper_select.go similarity index 100% rename from src/server/query_remapper_select.go rename to server/query_remapper_select.go diff --git a/src/server/query_remapper_show.go b/server/query_remapper_show.go similarity index 100% rename from src/server/query_remapper_show.go rename to server/query_remapper_show.go diff --git a/src/server/query_remapper_table.go b/server/query_remapper_table.go similarity index 89% rename from src/server/query_remapper_table.go rename to server/query_remapper_table.go index 5d675c1..f51d1d7 100644 --- a/src/server/query_remapper_table.go +++ b/server/query_remapper_table.go @@ -2,15 +2,14 @@ package main import ( "context" + "encoding/json" "regexp" "strings" pgQuery "github.com/pganalyze/pg_query_go/v6" - - "github.com/BemiHQ/BemiDB/src/common" ) -var PG_CATALOG_TABLE_NAMES = common.Set[string]{} +var PG_CATALOG_TABLE_NAMES = Set[string]{} type QueryRemapperTable struct { parserTable *ParserTable @@ -18,16 +17,13 @@ type QueryRemapperTable struct { remapperFunction *QueryRemapperFunction icebergReader *IcebergReader config *Config - ServerDuckdbClient *common.DuckdbClient // nilable + ServerDuckdbClient *DuckdbClient // nilable // Runtime loaded - IcebergPersistentSchemaTables common.Set[common.IcebergSchemaTable] - IcebergMaterlizedSchemaTables common.Set[common.IcebergSchemaTable] - IcebergEmbeddingSchemaTables common.Set[common.IcebergSchemaTable] - IcebergMaterializedViews []common.IcebergMaterializedView + IcebergPersistentSchemaTables Set[IcebergSchemaTable] } -func NewQueryRemapperTable(config *Config, icebergReader *IcebergReader, serverDuckdbClient *common.DuckdbClient) *QueryRemapperTable { +func NewQueryRemapperTable(config *Config, icebergReader *IcebergReader, serverDuckdbClient *DuckdbClient) *QueryRemapperTable { remapper := &QueryRemapperTable{ parserTable: NewParserTable(config), parserFunction: NewParserFunction(config), @@ -41,9 +37,29 @@ func NewQueryRemapperTable(config *Config, icebergReader *IcebergReader, serverD } // FROM / JOIN [TABLE] -func (remapper *QueryRemapperTable) RemapTable(node *pgQuery.Node, permissions *map[string][]string) *pgQuery.Node { +func (remapper *QueryRemapperTable) RemapTable(node *pgQuery.Node) *pgQuery.Node { parser := remapper.parserTable qSchemaTable := parser.NodeToQuerySchemaTable(node) + if qSchemaTable.Schema == PG_SCHEMA_SEARCH { + var tables []serverSearchTable + if remapper.config != nil { + _ = json.Unmarshal([]byte(remapper.config.SearchTablesJSON), &tables) + } + columns := "*" + for _, table := range tables { + if strings.ReplaceAll(table.Name, ".", "_") == qSchemaTable.Table { + quoted := make([]string, len(table.StoreColumns)) + for i, column := range table.StoreColumns { + quoted[i] = quoteVectorIdentifier(column) + } + columns = strings.Join(quoted, ", ") + break + } + } + query := "SELECT " + columns + " FROM search_store.main." + quoteVectorIdentifier(qSchemaTable.Table) + + " WHERE " + quoteVectorIdentifier(PGSTACK_CHUNK_INDEX_COLUMN) + " = 0" + return parser.makeSubselectNode(query, qSchemaTable) + } // pg_catalog.pg_* system tables if remapper.isTableFromPgCatalog(qSchemaTable) { @@ -60,8 +76,6 @@ func (remapper *QueryRemapperTable) RemapTable(node *pgQuery.Node, permissions * // pg_matviews -> reload Iceberg materialized views case PG_TABLE_PG_MATVIEWS: - remapper.reloadIcebergMaterializedViews() - remapper.upsertPgMatviews() } // pg_catalog.[table] -> main.[table] for tables defined in CreatePgCatalogTableQueries @@ -78,15 +92,13 @@ func (remapper *QueryRemapperTable) RemapTable(node *pgQuery.Node, permissions * if parser.IsTableFromInformationSchema(qSchemaTable) { switch qSchemaTable.Table { // information_schema.tables -> (SELECT * FROM main.tables) information_schema_tables - // information_schema.tables -> (SELECT * FROM main.tables WHERE table_schema || '.' || table_name IN ('permitted.table')) information_schema_tables case PG_TABLE_TABLES: remapper.reloadIcebergTables() - return parser.MakeInformationSchemaTablesNode(qSchemaTable, permissions) + return parser.MakeInformationSchemaTablesNode(qSchemaTable) // information_schema.columns -> (SELECT * FROM main.columns) information_schema_columns - // information_schema.columns -> (SELECT * FROM main.columns WHERE (table_schema || '.' || table_name IN ('permitted.table') AND column_name IN ('permitted', 'columns')) OR ...) information_schema_columns case PG_TABLE_COLUMNS: - return parser.MakeInformationSchemaColumnsNode(qSchemaTable, permissions) + return parser.MakeInformationSchemaColumnsNode(qSchemaTable) } // information_schema.* other system tables -> return as is @@ -94,27 +106,21 @@ func (remapper *QueryRemapperTable) RemapTable(node *pgQuery.Node, permissions * } schemaTable := qSchemaTable.ToIcebergSchemaTable() - if !remapper.IcebergPersistentSchemaTables.Contains(schemaTable) && !remapper.IcebergMaterlizedSchemaTables.Contains(schemaTable) { // Reload Iceberg tables if not found + if !remapper.IcebergPersistentSchemaTables.Contains(schemaTable) { // Reload Iceberg tables if not found remapper.reloadIcebergTables() - if !remapper.IcebergPersistentSchemaTables.Contains(schemaTable) && !remapper.IcebergMaterlizedSchemaTables.Contains(schemaTable) { + if !remapper.IcebergPersistentSchemaTables.Contains(schemaTable) { return node // Let it return "Catalog Error: Table with name _ does not exist!" } } - // public.table_with_embedding -> return as is - if remapper.IcebergEmbeddingSchemaTables.Contains(schemaTable) { - return node - } - - // public.table -> (SELECT * FROM iceberg_scan('path')) table - // schema.table -> (SELECT * FROM iceberg_scan('path')) schema_table - // public.table -> (SELECT permitted, columns FROM iceberg_scan('path')) table - // public.table -> (SELECT NULL WHERE FALSE) table - icebergPath := remapper.icebergReader.MetadataFileS3Path(schemaTable) // iceberg/schema/table/metadata/v1.metadata.json + // public.table -> (SELECT * FROM iceberg_scan('s3://bucket/path')) table + // schema.table -> (SELECT * FROM iceberg_scan('s3://bucket/path')) schema_table + icebergPath := remapper.icebergReader.MetadataFileS3Path(schemaTable) // iceberg/schema/table/metadata/v1.metadata.json + icebergS3Path := remapper.icebergReader.S3Client.BucketS3Prefix() + icebergPath // s3://bucket/iceberg/schema/table/metadata/v1.metadata.json return parser.MakeIcebergTableNode(QueryToIcebergTable{ QuerySchemaTable: qSchemaTable, - IcebergTablePath: icebergPath, - }, permissions) + IcebergTablePath: icebergS3Path, + }) } // FROM FUNCTION() @@ -142,27 +148,21 @@ func (remapper *QueryRemapperTable) RemapTableFunctionCall(rangeFunction *pgQuer } func (remapper *QueryRemapperTable) Reset() { - remapper.IcebergPersistentSchemaTables = common.NewSet[common.IcebergSchemaTable]() - remapper.IcebergMaterlizedSchemaTables = common.NewSet[common.IcebergSchemaTable]() - remapper.IcebergEmbeddingSchemaTables = common.NewSet[common.IcebergSchemaTable]() - remapper.IcebergMaterializedViews = []common.IcebergMaterializedView{} + remapper.IcebergPersistentSchemaTables = NewSet[IcebergSchemaTable]() remapper.reloadIcebergTables() } func (remapper *QueryRemapperTable) reloadIcebergTables() { - remapper.reloadIcebergMaterializedViews() + if !remapper.config.AuditEnabled { + return + } remapper.reloadIcebergPersistentTables() } func (remapper *QueryRemapperTable) reloadIcebergPersistentTables() { newIcebergSchemaTables, err := remapper.icebergReader.SchemaTables() - common.PanicIfError(remapper.config.CommonConfig, err) - - // Exclude materialized views - for _, icebergSchemaTable := range remapper.IcebergMaterlizedSchemaTables.Values() { - newIcebergSchemaTables.Remove(icebergSchemaTable) - } + PanicIfError(remapper.config, err) previousIcebergSchemaTables := remapper.IcebergPersistentSchemaTables remapper.IcebergPersistentSchemaTables = newIcebergSchemaTables @@ -172,84 +172,31 @@ func (remapper *QueryRemapperTable) reloadIcebergPersistentTables() { for _, icebergSchemaTable := range newIcebergSchemaTables.Values() { if !previousIcebergSchemaTables.Contains(icebergSchemaTable) { catalogTableColumns, err := remapper.icebergReader.TableColumns(icebergSchemaTable) - common.PanicIfError(remapper.config.CommonConfig, err) + PanicIfError(remapper.config, err) var sqlColumns []string - hasEmbeddingColumn := false for _, catalogTableColumn := range catalogTableColumns { sqlColumns = append(sqlColumns, catalogTableColumn.ToSql()) - if catalogTableColumn.Name == common.EMBEDDING_COLUMN_NAME { - hasEmbeddingColumn = true - } } // Create schema and table _, err = remapper.ServerDuckdbClient.ExecContext(ctx, "CREATE SCHEMA IF NOT EXISTS "+icebergSchemaTable.Schema) - common.PanicIfError(remapper.config.CommonConfig, err) + PanicIfError(remapper.config, err) _, err = remapper.ServerDuckdbClient.ExecContext(ctx, "CREATE TABLE "+icebergSchemaTable.String()+" ("+strings.Join(sqlColumns, ", ")+")") - common.PanicIfError(remapper.config.CommonConfig, err) - - // Reload embedding table data and create a cosine index - if hasEmbeddingColumn { - icebergPath := remapper.icebergReader.MetadataFileS3Path(icebergSchemaTable) - _, err = remapper.ServerDuckdbClient.ExecContext(ctx, "INSERT INTO "+icebergSchemaTable.String()+" SELECT * FROM iceberg_scan('"+icebergPath+"')") - common.PanicIfError(remapper.config.CommonConfig, err) - - _, err = remapper.ServerDuckdbClient.ExecContext(ctx, "CREATE INDEX "+icebergSchemaTable.Table+"_embedding ON "+icebergSchemaTable.String()+" USING HNSW ("+common.EMBEDDING_COLUMN_NAME+") WITH (metric='cosine')") - common.PanicIfError(remapper.config.CommonConfig, err) - remapper.IcebergEmbeddingSchemaTables.Add(icebergSchemaTable) - } + PanicIfError(remapper.config, err) } } // DROP TABLE for _, icebergSchemaTable := range previousIcebergSchemaTables.Values() { if !newIcebergSchemaTables.Contains(icebergSchemaTable) { _, err = remapper.ServerDuckdbClient.ExecContext(ctx, "DROP TABLE "+icebergSchemaTable.String()) - common.PanicIfError(remapper.config.CommonConfig, err) - remapper.IcebergEmbeddingSchemaTables.Remove(icebergSchemaTable) - } - } -} - -func (remapper *QueryRemapperTable) reloadIcebergMaterializedViews() { - newIcebergMaterializedViews, err := remapper.icebergReader.MaterializedViews() - common.PanicIfError(remapper.config.CommonConfig, err) - - remapper.IcebergMaterializedViews = newIcebergMaterializedViews - - newMaterializedSchemaTables := common.NewSet[common.IcebergSchemaTable]() - for _, icebergMaterializedView := range newIcebergMaterializedViews { - newMaterializedSchemaTables.Add(icebergMaterializedView.ToIcebergSchemaTable()) - } - previousIcebergSchemaTables := remapper.IcebergMaterlizedSchemaTables - remapper.IcebergMaterlizedSchemaTables = newMaterializedSchemaTables - - ctx := context.Background() - // CREATE VIEW - for _, icebergSchemaTable := range remapper.IcebergMaterlizedSchemaTables.Values() { - if !previousIcebergSchemaTables.Contains(icebergSchemaTable) { - _, err = remapper.ServerDuckdbClient.ExecContext(ctx, "CREATE SCHEMA IF NOT EXISTS "+icebergSchemaTable.Schema) - common.PanicIfError(remapper.config.CommonConfig, err) - _, err = remapper.ServerDuckdbClient.ExecContext(ctx, "CREATE VIEW "+icebergSchemaTable.String()+" AS SELECT 1") - common.PanicIfError(remapper.config.CommonConfig, err) - _, err = remapper.ServerDuckdbClient.ExecContext(ctx, "INSERT INTO pg_matviews VALUES ('"+icebergSchemaTable.Schema+"', '"+icebergSchemaTable.Table+"', '"+remapper.config.User+"', NULL, FALSE, TRUE, '')") - common.PanicIfError(remapper.config.CommonConfig, err) - } - } - // DROP VIEW - for _, icebergSchemaTable := range previousIcebergSchemaTables.Values() { - if !newMaterializedSchemaTables.Contains(icebergSchemaTable) { - _, err = remapper.ServerDuckdbClient.ExecContext(ctx, "DROP VIEW "+icebergSchemaTable.String()) - common.PanicIfError(remapper.config.CommonConfig, err) - _, err = remapper.ServerDuckdbClient.ExecContext(ctx, "DELETE FROM pg_matviews WHERE schemaname = '"+icebergSchemaTable.Schema+"' AND matviewname = '"+icebergSchemaTable.Table+"'") - common.PanicIfError(remapper.config.CommonConfig, err) + PanicIfError(remapper.config, err) } } } func (remapper *QueryRemapperTable) upsertPgStatUserTables() { - icebergSchemaTables := append(remapper.IcebergPersistentSchemaTables.Values(), remapper.IcebergMaterlizedSchemaTables.Values()...) - + icebergSchemaTables := remapper.IcebergPersistentSchemaTables.Values() sqls := []string{"DELETE FROM pg_stat_user_tables"} if len(icebergSchemaTables) > 0 { values := make([]string, len(icebergSchemaTables)) @@ -259,28 +206,7 @@ func (remapper *QueryRemapperTable) upsertPgStatUserTables() { sqls = append(sqls, "INSERT INTO pg_stat_user_tables VALUES "+strings.Join(values, ", ")) } err := remapper.ServerDuckdbClient.ExecTransactionContext(context.Background(), sqls) - common.PanicIfError(remapper.config.CommonConfig, err) -} - -func (remapper *QueryRemapperTable) upsertPgMatviews() { - args := []map[string]string{map[string]string{}} - sqls := []string{"DELETE FROM pg_matviews"} - if len(remapper.IcebergMaterializedViews) > 0 { - values := make([]string, len(remapper.IcebergMaterializedViews)) - arg := map[string]string{} - for i, icebergMaterializedView := range remapper.IcebergMaterializedViews { - iStr := common.IntToString(i) - values[i] = "('$schema" + iStr + "', '$table" + iStr + "', '$owner" + iStr + "', NULL, FALSE, TRUE, '$definition" + iStr + "')" - arg["schema"+iStr] = icebergMaterializedView.Schema - arg["table"+iStr] = icebergMaterializedView.Table - arg["owner"+iStr] = remapper.config.User - arg["definition"+iStr] = icebergMaterializedView.Definition - } - sqls = append(sqls, "INSERT INTO pg_matviews VALUES "+strings.Join(values, ", ")) - args = append(args, arg) - } - err := remapper.ServerDuckdbClient.ExecTransactionContext(context.Background(), sqls, args) - common.PanicIfError(remapper.config.CommonConfig, err) + PanicIfError(remapper.config, err) } // System pg_* tables @@ -288,12 +214,11 @@ func (remapper *QueryRemapperTable) isTableFromPgCatalog(qSchemaTable QuerySchem return qSchemaTable.Schema == PG_SCHEMA_PG_CATALOG || (qSchemaTable.Schema == "" && (PG_SYSTEM_TABLES.Contains(qSchemaTable.Table) || PG_SYSTEM_VIEWS.Contains(qSchemaTable.Table)) && - !remapper.IcebergPersistentSchemaTables.Contains(qSchemaTable.ToIcebergSchemaTable()) && - !remapper.IcebergMaterlizedSchemaTables.Contains(qSchemaTable.ToIcebergSchemaTable())) + !remapper.IcebergPersistentSchemaTables.Contains(qSchemaTable.ToIcebergSchemaTable())) } -func extractTableNames(tables []string) common.Set[string] { - names := make(common.Set[string]) +func extractTableNames(tables []string) Set[string] { + names := make(Set[string]) re := regexp.MustCompile(`CREATE (TABLE|VIEW) (\w+)`) for _, table := range tables { @@ -309,6 +234,7 @@ func extractTableNames(tables []string) common.Set[string] { func CreatePgCatalogTableQueries(config *Config) []string { result := []string{ // Static empty tables + "CREATE TABLE pg_constraint(oid oid, conname text, connamespace oid, contype char, condeferrable bool, condeferred bool, convalidated bool, conrelid oid, contypid oid, conindid oid, conparentid oid, confrelid oid, confupdtype char, confdeltype char, confmatchtype char, conislocal bool, coninhcount int4, connoinherit bool, conkey int2[], confkey int2[], conpfeqop oid[], conppeqop oid[], conffeqop oid[], confdelsetcols int2[], conexclop oid[], conbin text)", "CREATE TABLE pg_inherits(inhrelid oid, inhparent oid, inhseqno int4, inhdetachpending bool)", "CREATE TABLE pg_shdescription(objoid oid, classoid oid, description text)", "CREATE TABLE pg_statio_user_tables(relid oid, schemaname text, relname text, heap_blks_read int8, heap_blks_hit int8, idx_blks_read int8, idx_blks_hit int8, toast_blks_read int8, toast_blks_hit int8, tidx_blks_read int8, tidx_blks_hit int8)", @@ -331,7 +257,7 @@ func CreatePgCatalogTableQueries(config *Config) []string { "CREATE TABLE pg_stat_user_tables(relid oid, schemaname text, relname text, seq_scan int8, last_seq_scan timestamp, seq_tup_read int8, idx_scan int8, last_idx_scan timestamp, idx_tup_fetch int8, n_tup_ins int8, n_tup_upd int8, n_tup_del int8, n_tup_hot_upd int8, n_tup_newpage_upd int8, n_live_tup int8, n_dead_tup int8, n_mod_since_analyze int8, n_ins_since_vacuum int8, last_vacuum timestamp, last_autovacuum timestamp, last_analyze timestamp, last_autoanalyze timestamp, vacuum_count int8, autovacuum_count int8, analyze_count int8, autoanalyze_count int8)", // Static views - "CREATE VIEW pg_shadow AS SELECT '" + config.User + "' AS usename, '10'::oid AS usesysid, FALSE AS usecreatedb, FALSE AS usesuper, TRUE AS userepl, FALSE AS usebypassrls, '" + config.EncryptedPassword + "' AS passwd, NULL::timestamp AS valuntil, NULL::text[] AS useconfig", + passwordCatalogQuery(config), "CREATE VIEW pg_roles AS SELECT '10'::oid AS oid, '" + config.User + "' AS rolname, TRUE AS rolsuper, TRUE AS rolinherit, TRUE AS rolcreaterole, TRUE AS rolcreatedb, TRUE AS rolcanlogin, FALSE AS rolreplication, -1 AS rolconnlimit, NULL::text AS rolpassword, NULL::timestamp AS rolvaliduntil, FALSE AS rolbypassrls, NULL::text[] AS rolconfig", "CREATE VIEW pg_extension AS SELECT '13823'::oid AS oid, 'plpgsql' AS extname, '10'::oid AS extowner, '11'::oid AS extnamespace, FALSE AS extrelocatable, '1.0'::text AS extversion, NULL::text[] AS extconfig, NULL::text[] AS extcondition", "CREATE VIEW pg_database AS SELECT '16388'::oid AS oid, '" + config.Database + "' AS datname, '10'::oid AS datdba, '6'::int4 AS encoding, 'c' AS datlocprovider, FALSE AS datistemplate, TRUE AS datallowconn, '-1'::int4 AS datconnlimit, '722'::int8 AS datfrozenxid, '1'::int4 AS datminmxid, '1663'::oid AS dattablespace, 'en_US.UTF-8' AS datcollate, 'en_US.UTF-8' AS datctype, 'en_US.UTF-8' AS datlocale, NULL::text AS daticurules, NULL::text AS datcollversion, NULL::text[] AS datacl", @@ -344,7 +270,7 @@ func CreatePgCatalogTableQueries(config *Config) []string { "CREATE VIEW pg_index AS SELECT *, FALSE AS indnullsnotdistinct FROM pg_catalog.pg_index", // Hide DuckDB's system and duplicate schemas "CREATE VIEW pg_namespace AS SELECT * FROM pg_catalog.pg_namespace WHERE oid >= (SELECT oid FROM pg_catalog.pg_namespace WHERE nspname = '" + PG_SCHEMA_PUBLIC + "')", - // DuckDB does not support relforcerowsecurity column + // DuckDB does not support relhassubclass and relforcerowsecurity columns `CREATE VIEW pg_class AS SELECT oid, relname, @@ -373,8 +299,64 @@ func CreatePgCatalogTableQueries(config *Config) []string { ELSE relkind END AS relkind, + FALSE AS relhassubclass, FALSE AS relforcerowsecurity FROM pg_catalog.pg_class`, + // DuckDB's pg_attribute.atttypid values use DuckDB-internal type IDs. Translate + // user-visible columns to PostgreSQL OIDs so clients can join them to pg_type. + `CREATE VIEW ` + PG_TABLE_PG_ATTRIBUTE + ` AS SELECT + a.* REPLACE ( + CASE columns.data_type + WHEN 'BOOLEAN' THEN 16 + WHEN 'BOOLEAN[]' THEN 1000 + WHEN 'BLOB' THEN 17 + WHEN 'BLOB[]' THEN 1001 + WHEN 'SMALLINT' THEN 21 + WHEN 'SMALLINT[]' THEN 1005 + WHEN 'INTEGER' THEN 23 + WHEN 'INTEGER[]' THEN 1007 + WHEN 'BIGINT' THEN 20 + WHEN 'BIGINT[]' THEN 1016 + WHEN 'UINTEGER' THEN 28 + WHEN 'UINTEGER[]' THEN 1011 + WHEN 'UBIGINT' THEN 5069 + WHEN 'UBIGINT[]' THEN 271 + WHEN 'HUGEINT' THEN 1700 + WHEN 'HUGEINT[]' THEN 1231 + WHEN 'FLOAT' THEN 700 + WHEN 'FLOAT[]' THEN 1021 + WHEN 'DOUBLE' THEN 701 + WHEN 'DOUBLE[]' THEN 1022 + WHEN 'VARCHAR' THEN 25 + WHEN 'VARCHAR[]' THEN 1009 + WHEN 'TIME' THEN 1083 + WHEN 'TIME[]' THEN 1183 + WHEN 'DATE' THEN 1082 + WHEN 'DATE[]' THEN 1182 + WHEN 'TIMESTAMP' THEN 1114 + WHEN 'TIMESTAMP[]' THEN 1115 + WHEN 'TIMESTAMP WITH TIME ZONE' THEN 1184 + WHEN 'TIMESTAMP WITH TIME ZONE[]' THEN 1185 + WHEN 'UUID' THEN 2950 + WHEN 'UUID[]' THEN 2951 + WHEN 'INTERVAL' THEN 1186 + WHEN 'INTERVAL[]' THEN 1187 + WHEN 'JSON' THEN 114 + WHEN 'JSON[]' THEN 199 + ELSE CASE + WHEN starts_with(columns.data_type, 'DECIMAL') AND ends_with(columns.data_type, '[]') THEN 1231 + WHEN starts_with(columns.data_type, 'DECIMAL') THEN 1700 + ELSE a.atttypid + END + END AS atttypid + ) + FROM pg_catalog.pg_attribute a + LEFT JOIN pg_catalog.pg_class class ON class.oid = a.attrelid + LEFT JOIN pg_catalog.pg_namespace namespace ON namespace.oid = class.relnamespace + LEFT JOIN information_schema.columns columns + ON columns.table_schema = namespace.nspname + AND columns.table_name = class.relname + AND columns.column_name = a.attname`, `CREATE VIEW pg_type AS SELECT * FROM pg_catalog.pg_type UNION ALL @@ -765,7 +747,6 @@ func CreateInformationSchemaTableQueries(config *Config) []string { WHEN 'DATE[]' THEN '_date' WHEN 'FLOAT' THEN 'float4' WHEN 'FLOAT[]' THEN '_float4' - WHEN 'FLOAT[` + common.EMBEDDING_COLUMN_LENGTH + `]' THEN '_float4' WHEN 'DOUBLE' THEN 'float8' WHEN 'DOUBLE[]' THEN '_float8' WHEN 'DECIMAL' THEN 'numeric' @@ -778,6 +759,8 @@ func CreateInformationSchemaTableQueries(config *Config) []string { WHEN 'TIME[]' THEN '_time' WHEN 'TIMESTAMP' THEN 'timestamp' WHEN 'TIMESTAMP[]' THEN '_timestamp' + WHEN 'TIMESTAMP WITH TIME ZONE' THEN 'timestamptz' + WHEN 'TIMESTAMP WITH TIME ZONE[]' THEN '_timestamptz' WHEN 'UUID' THEN 'uuid' WHEN 'UUID[]' THEN '_uuid' WHEN 'JSON' THEN 'json' diff --git a/src/server/custom_types.go b/server/query_schema_table.go similarity index 84% rename from src/server/custom_types.go rename to server/query_schema_table.go index 835ce5c..46dcbc4 100644 --- a/src/server/custom_types.go +++ b/server/query_schema_table.go @@ -2,8 +2,6 @@ package main import ( "strings" - - "github.com/BemiHQ/BemiDB/src/common" ) //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -34,15 +32,15 @@ func NewQuerySchemaTableFromString(schemaTable string) QuerySchemaTable { return qSchemaTable } -func (qSchemaTable QuerySchemaTable) ToIcebergSchemaTable() common.IcebergSchemaTable { +func (qSchemaTable QuerySchemaTable) ToIcebergSchemaTable() IcebergSchemaTable { if qSchemaTable.Schema == "" { - return common.IcebergSchemaTable{ + return IcebergSchemaTable{ Schema: PG_SCHEMA_PUBLIC, Table: qSchemaTable.Table, } } - return common.IcebergSchemaTable{ + return IcebergSchemaTable{ Schema: qSchemaTable.Schema, Table: qSchemaTable.Table, } diff --git a/src/server/response_handler.go b/server/response_handler.go similarity index 82% rename from src/server/response_handler.go rename to server/response_handler.go index 3e7ebdb..375a55d 100644 --- a/src/server/response_handler.go +++ b/server/response_handler.go @@ -6,12 +6,11 @@ import ( "encoding/csv" "encoding/json" "fmt" + "strconv" "strings" + "github.com/duckdb/duckdb-go/v2" "github.com/jackc/pgx/v5/pgtype" - "github.com/marcboeker/go-duckdb/v2" - - "github.com/BemiHQ/BemiDB/src/common" ) type ResponseHandler struct { @@ -26,7 +25,8 @@ func NewResponseHandler(config *Config) *ResponseHandler { // https://pkg.go.dev/github.com/jackc/pgx/v5/pgtype#pkg-constants func (responseHandler *ResponseHandler) ColumnDescriptionTypeOid(col *sql.ColumnType) uint32 { - switch col.DatabaseTypeName() { + databaseTypeName := col.DatabaseTypeName() + switch databaseTypeName { case "BOOLEAN": return pgtype.BoolOID case "BOOLEAN[]": @@ -60,7 +60,7 @@ func (responseHandler *ResponseHandler) ColumnDescriptionTypeOid(col *sql.Column return pgtype.NumericArrayOID case "FLOAT": return pgtype.Float4OID - case "FLOAT[]", "FLOAT[" + common.EMBEDDING_COLUMN_LENGTH + "]": + case "FLOAT[]": return pgtype.Float4ArrayOID case "DOUBLE": return pgtype.Float8OID @@ -100,19 +100,28 @@ func (responseHandler *ResponseHandler) ColumnDescriptionTypeOid(col *sql.Column return pgtype.JSONOID } - if strings.HasPrefix(col.DatabaseTypeName(), "DECIMAL") { - if strings.HasSuffix(col.DatabaseTypeName(), "[]") { + // Lance embedding columns use DuckDB fixed-size array types such as + // FLOAT[1536], which PostgreSQL clients should see as float4[]. + if strings.HasPrefix(databaseTypeName, "FLOAT[") && strings.HasSuffix(databaseTypeName, "]") { + return pgtype.Float4ArrayOID + } + + if strings.HasPrefix(databaseTypeName, "DECIMAL") { + if strings.HasSuffix(databaseTypeName, "[]") { return pgtype.NumericArrayOID } else { return pgtype.NumericOID } } - common.Panic(responseHandler.Config.CommonConfig, "Unsupported serialized column type: "+col.DatabaseTypeName()) + Panic(responseHandler.Config, "Unsupported serialized column type: "+databaseTypeName) return 0 } func (responseHandler *ResponseHandler) RowValuePointer(col *sql.ColumnType) interface{} { + if col.DatabaseTypeName() == "UINTEGER" || col.DatabaseTypeName() == "UBIGINT" { + return new(NullUint64) + } switch col.ScanType().String() { case "int16": return new(sql.NullInt16) @@ -120,7 +129,7 @@ func (responseHandler *ResponseHandler) RowValuePointer(col *sql.ColumnType) int return new(sql.NullInt32) case "int64", "*big.Int": return new(sql.NullInt64) - case "uint64", "float64", "float32": + case "float64", "float32": return new(sql.NullFloat64) case "string": // return a *sql.NullString so Scan writes into the right type @@ -141,7 +150,7 @@ func (responseHandler *ResponseHandler) RowValuePointer(col *sql.ColumnType) int return new(NullArray) } - common.Panic(responseHandler.Config.CommonConfig, "Unsupported data row type: "+col.ScanType().String()) + Panic(responseHandler.Config, "Unsupported data row type: "+col.ScanType().String()) return nil } @@ -149,19 +158,25 @@ func (responseHandler *ResponseHandler) RowValueBytes(valuePtr interface{}, col switch value := valuePtr.(type) { case *sql.NullInt16: if value.Valid { - return []byte(common.IntToString(int(value.Int16))) + return []byte(IntToString(int(value.Int16))) } else { return nil } case *sql.NullInt32: if value.Valid { - return []byte(common.IntToString(int(value.Int32))) + return []byte(IntToString(int(value.Int32))) } else { return nil } case *sql.NullInt64: if value.Valid { - return []byte(common.IntToString(int(value.Int64))) + return []byte(IntToString(int(value.Int64))) + } else { + return nil + } + case *NullUint64: + if value.Valid { + return []byte(strconv.FormatUint(value.Uint64, 10)) } else { return nil } @@ -195,7 +210,7 @@ func (responseHandler *ResponseHandler) RowValueBytes(valuePtr interface{}, col case "TIMESTAMPTZ": return []byte(value.Time.Format("2006-01-02 15:04:05.999999-07:00")) default: - common.Panic(responseHandler.Config.CommonConfig, "Unsupported scanned time type: "+col.DatabaseTypeName()) + Panic(responseHandler.Config, "Unsupported scanned time type: "+col.DatabaseTypeName()) } } else { return nil @@ -228,7 +243,7 @@ func (responseHandler *ResponseHandler) RowValueBytes(valuePtr interface{}, col return []byte(*value) } - common.Panic(responseHandler.Config.CommonConfig, "Unsupported scanned row type: "+col.ScanType().Name()) + Panic(responseHandler.Config, "Unsupported scanned row type: "+col.ScanType().Name()) return nil } @@ -334,6 +349,25 @@ type NullArray struct { Value []interface{} } +type NullUint64 struct { + Uint64 uint64 + Valid bool +} + +func (value *NullUint64) Scan(source interface{}) error { + if source == nil { + value.Valid = false + return nil + } + parsed, err := strconv.ParseUint(fmt.Sprint(source), 10, 64) + if err != nil { + return err + } + value.Uint64 = parsed + value.Valid = true + return nil +} + func (nullArray *NullArray) Scan(value interface{}) error { if value == nil { nullArray.Present = false diff --git a/server/runtime_integration.go b/server/runtime_integration.go new file mode 100644 index 0000000..8c60cbc --- /dev/null +++ b/server/runtime_integration.go @@ -0,0 +1,15 @@ +package main + +func startupUserAllowed(config *Config, user string) bool { + return config.User == "" || user == config.User +} + +func passwordCatalogQuery(_ *Config) string { + return "CREATE VIEW pg_shadow AS SELECT NULL::text AS usename, NULL::oid AS usesysid, FALSE AS usecreatedb, FALSE AS usesuper, FALSE AS userepl, FALSE AS usebypassrls, NULL::text AS passwd, NULL::timestamp AS valuntil, NULL::text[] AS useconfig WHERE FALSE" +} + +func (server *PostgresServer) authenticateStartup(_ string) error { + return server.authenticatePassword() +} + +func validateRuntimeConfig(_ *Config) {} diff --git a/server/runtime_integration_test.go b/server/runtime_integration_test.go new file mode 100644 index 0000000..5100de7 --- /dev/null +++ b/server/runtime_integration_test.go @@ -0,0 +1,26 @@ +package main + +import ( + "strings" + "testing" +) + +func configureStandaloneTest(t *testing.T) { + t.Setenv("PGSTACK_AUTH_MODE", "proxy") +} + +func TestStandaloneLocalPasswordOptional(t *testing.T) { + configureStandaloneTest(t) + validateRuntimeConfig(&Config{}) + server := &PostgresServer{config: &Config{}} + if err := server.authenticateStartup("reader"); err != nil { + t.Fatal(err) + } +} + +func TestStandaloneCatalogContainsNoPassword(t *testing.T) { + query := passwordCatalogQuery(&Config{User: "reader", EncryptedPassword: "secret-verifier"}) + if strings.Contains(query, "secret-verifier") || !strings.Contains(query, "WHERE FALSE") { + t.Fatal("password catalog must be empty") + } +} diff --git a/server/runtime_manager.go b/server/runtime_manager.go new file mode 100644 index 0000000..4b71b66 --- /dev/null +++ b/server/runtime_manager.go @@ -0,0 +1,162 @@ +package main + +import ( + "fmt" + "os" + "strconv" + "strings" + "sync" + "time" +) + +const ( + DUCKDB_RESTART_INTERVAL = 1 * time.Hour +) + +type ServerRuntime struct { + DuckdbClient *DuckdbClient + QueryHandler *QueryHandler + RequestMu *sync.RWMutex + Expired bool + Closed chan struct{} +} + +type RuntimeManager struct { + mu sync.Mutex + runtime *ServerRuntime + ready chan struct{} + runtimeFactory func(*Config) (*ServerRuntime, error) +} + +func (manager *RuntimeManager) Acquire(config *Config) (*QueryHandler, func(), error) { + for { + manager.mu.Lock() + if manager.ready != nil { + ready := manager.ready + manager.mu.Unlock() + <-ready + continue + } + + if manager.runtime != nil { + runtime := manager.runtime + if runtime.Expired { + closed := runtime.Closed + manager.mu.Unlock() + <-closed + continue + } + runtime.RequestMu.RLock() + manager.mu.Unlock() + return runtime.QueryHandler, runtime.RequestMu.RUnlock, nil + } + + ready := make(chan struct{}) + manager.ready = ready + manager.mu.Unlock() + + runtime, err := manager.createRuntime(config) + + manager.mu.Lock() + if err == nil { + manager.runtime = runtime + } + manager.ready = nil + close(ready) + manager.mu.Unlock() + + if err != nil { + return nil, nil, err + } + go manager.expireRuntimeAfter(config, runtime) + } +} + +func (manager *RuntimeManager) createRuntime(config *Config) (*ServerRuntime, error) { + if manager.runtimeFactory != nil { + return manager.runtimeFactory(config) + } + + duckdbClient, err := NewDuckdbClient(config, duckdbBootQueris(config)) + if err != nil { + return nil, err + } + queryHandler, err := NewQueryHandler(config, duckdbClient) + if err != nil { + duckdbClient.Close() + return nil, err + } + + runtime := &ServerRuntime{ + DuckdbClient: duckdbClient, + QueryHandler: queryHandler, + RequestMu: &sync.RWMutex{}, + Closed: make(chan struct{}), + } + LogInfo(config, "DuckDB: Connected for database", config.Database) + return runtime, nil +} + +func (manager *RuntimeManager) expireRuntimeAfter(config *Config, runtime *ServerRuntime) { + timer := time.NewTimer(DUCKDB_RESTART_INTERVAL) + defer timer.Stop() + <-timer.C + + manager.expireRuntime(config, runtime) +} + +func (manager *RuntimeManager) expireRuntime(config *Config, runtime *ServerRuntime) { + manager.mu.Lock() + if manager.runtime != runtime { + manager.mu.Unlock() + return + } + runtime.Expired = true + manager.mu.Unlock() + + runtime.RequestMu.Lock() + logPodMemoryUsage(config) + if runtime.DuckdbClient != nil { + runtime.DuckdbClient.Close() + } + runtime.RequestMu.Unlock() + + manager.mu.Lock() + if manager.runtime == runtime { + manager.runtime = nil + } + close(runtime.Closed) + manager.mu.Unlock() + + LogInfo(config, "DuckDB: Closed expired database", config.Database) +} + +func logPodMemoryUsage(config *Config) { + memoryUsage := "unavailable" + data, err := os.ReadFile("/sys/fs/cgroup/memory.current") + if err == nil { + bytes, parseErr := strconv.ParseInt(strings.TrimSpace(string(data)), 10, 64) + if parseErr == nil { + memoryUsage = formatBytes(bytes) + } + } + + LogInfo(config, fmt.Sprintf("Pod memory before closing DuckDB: %s", memoryUsage)) +} + +func formatBytes(bytes int64) string { + const unit = 1024 + if bytes < unit { + return fmt.Sprintf("%d B", bytes) + } + + value := float64(bytes) + for _, suffix := range []string{"KB", "MB", "GB", "TB"} { + value /= unit + if value < unit { + return fmt.Sprintf("%.2f %s", value, suffix) + } + } + + return fmt.Sprintf("%.2f PB", value/unit) +} diff --git a/server/s3_client.go b/server/s3_client.go new file mode 100644 index 0000000..e72e935 --- /dev/null +++ b/server/s3_client.go @@ -0,0 +1,87 @@ +package main + +import ( + "context" + "fmt" + "strings" + + "github.com/aws/aws-sdk-go-v2/aws" + awsConfig "github.com/aws/aws-sdk-go-v2/config" + "github.com/aws/aws-sdk-go-v2/credentials" + "github.com/aws/aws-sdk-go-v2/service/s3" +) + +type S3Client struct { + Config *Config + S3 *s3.Client +} + +func NewS3Client(Config *Config) (*S3Client, error) { + var awsConfigOptions = []func(*awsConfig.LoadOptions) error{ + awsConfig.WithRegion(Config.AwsRegion), + } + + if Config.LogLevel == LOG_LEVEL_TRACE { + awsConfigOptions = append(awsConfigOptions, awsConfig.WithClientLogMode(aws.LogRequest)) + } + + awsCredentials := credentials.NewStaticCredentialsProvider( + Config.AwsAccessKeyId, + Config.AwsSecretAccessKey, + "", + ) + awsConfigOptions = append(awsConfigOptions, awsConfig.WithCredentialsProvider(awsCredentials)) + + loadedAwsConfig, err := awsConfig.LoadDefaultConfig(context.Background(), awsConfigOptions...) + if err != nil { + return nil, fmt.Errorf("failed to load AWS configuration: %w", err) + } + + s3Client := s3.NewFromConfig(loadedAwsConfig, func(o *s3.Options) { + if Config.AwsS3Endpoint != DEFAULT_AWS_S3_ENDPOINT { + endpoint := Config.AwsS3Endpoint + if !strings.HasPrefix(endpoint, "http://") && !strings.HasPrefix(endpoint, "https://") { + if IsLocalHost(endpoint) { + endpoint = "http://" + endpoint + } else { + endpoint = "https://" + endpoint + } + } + o.BaseEndpoint = aws.String(endpoint) + o.UsePathStyle = true + } + }) + + return &S3Client{ + Config: Config, + S3: s3Client, + }, nil +} + +func (s3Client *S3Client) BucketS3Prefix() string { + return "s3://" + s3Client.Config.AwsS3Bucket + "/" +} + +// s3://bucket/some/path -> some/path +func (s3Client *S3Client) ObjectKey(objectPath string) string { + return strings.TrimPrefix(objectPath, s3Client.BucketS3Prefix()) +} + +func (s3Client *S3Client) GetObject(fileKey string) *s3.GetObjectOutput { + getObjectOutput, err := s3Client.S3.GetObject(context.Background(), &s3.GetObjectInput{ + Bucket: aws.String(s3Client.Config.AwsS3Bucket), + Key: aws.String(fileKey), + }) + PanicIfError(s3Client.Config, err) + return getObjectOutput +} + +func (s3Client *S3Client) ListObjects(prefix string) *s3.ListObjectsV2Output { + listObjectsOutput, err := s3Client.S3.ListObjectsV2(context.Background(), &s3.ListObjectsV2Input{ + Bucket: aws.String(s3Client.Config.AwsS3Bucket), + Prefix: aws.String(prefix), + }) + PanicIfError(s3Client.Config, err) + + return listObjectsOutput +} diff --git a/server/search_catalog.go b/server/search_catalog.go new file mode 100644 index 0000000..5d9dd59 --- /dev/null +++ b/server/search_catalog.go @@ -0,0 +1,33 @@ +package main + +import ( + "encoding/json" + "fmt" + "strings" +) + +// searchCatalogBootQueries creates empty catalog tables for PostgreSQL schema +// discovery. Query remapping reads the corresponding tables from Lance. +func searchCatalogBootQueries(config *Config) []string { + var tables []serverSearchTable + if err := json.Unmarshal([]byte(config.SearchTablesJSON), &tables); err != nil { + panic(fmt.Sprintf("invalid SEARCH_TABLES_JSON: %v", err)) + } + + queries := []string{"CREATE SCHEMA " + PG_SCHEMA_SEARCH} + for _, table := range tables { + columns := make([]string, 0, len(table.StoreColumns)) + for _, column := range table.StoreColumns { + columns = append(columns, quoteVectorIdentifier(column)+" VARCHAR") + } + + tableName := strings.ReplaceAll(table.Name, ".", "_") + queries = append(queries, fmt.Sprintf( + "CREATE TABLE %s.%s (%s)", + PG_SCHEMA_SEARCH, + quoteVectorIdentifier(tableName), + strings.Join(columns, ", "), + )) + } + return queries +} diff --git a/server/search_query_test.go b/server/search_query_test.go new file mode 100644 index 0000000..761dc81 --- /dev/null +++ b/server/search_query_test.go @@ -0,0 +1,496 @@ +package main + +import ( + "context" + "encoding/json" + "fmt" + "math" + "net/http" + "net/http/httptest" + "strings" + "testing" + + "github.com/jackc/pgx/v5/pgproto3" +) + +// Exercise the full SQL remapper and wire handler with real DuckDB execution. +// Only external embedding generation and the Lance candidate source are stubbed. +func TestSearchRankQueryExecution(t *testing.T) { + handler := initQueryHandlerForTest(t) + handler.Config.SearchTablesJSON = searchTestConfig().SearchTablesJSON + handler.Config.SearchBasePath = "search" + vector := make([]float32, OPENAI_EMBEDDING_DIMENSIONS) + vector[0] = 1 + requests := 0 + embeddingServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + requests++ + var request embeddingRequest + if err := json.NewDecoder(r.Body).Decode(&request); err != nil { + t.Error(err) + } + if len(request.Input) != 1 || request.Input[0] != "rain jacket" { + t.Errorf("unexpected embedding input: %#v", request.Input) + } + _ = json.NewEncoder(w).Encode(map[string]interface{}{"data": []interface{}{map[string]interface{}{"index": 0, "embedding": vector}}}) + })) + t.Cleanup(embeddingServer.Close) + handler.EmbeddingClient.apiKey = "test" + handler.EmbeddingClient.url = embeddingServer.URL + ctx := context.Background() + for _, sql := range []string{ + `ATTACH ':memory:' AS search_store`, + `CREATE TABLE search_store.main.public_documents (id VARCHAR, body VARCHAR, __pgstack_embedding FLOAT[1536], __pgstack_source_key VARCHAR, __pgstack_chunk_index INTEGER)`, + `INSERT INTO search_store.main.public_documents VALUES + ('1','waterproof', array_resize([1.0],1536,0)::FLOAT[1536], '1', 0), + ('1','waterproof', array_resize([0.9,0.1],1536,0)::FLOAT[1536], '1', 1), + ('2','waterproof', array_resize([0.6,0.8],1536,0)::FLOAT[1536], '2', 0), + ('3','excluded', array_resize([1.0],1536,0)::FLOAT[1536], '3', 0)`, + // Deliberately incomplete candidates verify the fallback after filtering/deduplication. + `CREATE MACRO lance_vector_search(dataset, embedding_column, query_vector, k := 10, prefilter := false) AS TABLE SELECT * FROM search_store.main.public_documents WHERE id IN ('1','3')`, + `CREATE MACRO lance_fts(dataset, text_column, query_text, k := 10, prefilter := false) AS TABLE SELECT *, CASE id WHEN '2' THEN 8.0 ELSE 2.0 END AS _score FROM search_store.main.public_documents WHERE query_text = 'rain jacket' AND id IN ('1','2') AND __pgstack_chunk_index = 0 ORDER BY _score DESC LIMIT k`, + } { + if _, err := handler.ServerDuckdbClient.ExecContext(ctx, sql); err != nil { + t.Fatal(err) + } + } + for _, function := range []string{"semantic_rank", "keyword_rank", "hybrid_rank"} { + t.Run(function, func(t *testing.T) { + before := requests + messages, err := handler.HandleSimpleQuery(fmt.Sprintf(`SELECT * FROM search.public_documents AS d WHERE d.body = 'waterproof' ORDER BY %s('rain jacket') LIMIT 2`, function)) + if err != nil { + t.Fatal(err) + } + expectedRequests := 1 + if function == "keyword_rank" { + expectedRequests = 0 + } + if requests != before+expectedRequests { + t.Fatalf("expected one embedding call, got %d", requests-before) + } + assertMessageTypes(t, messages, "*pgproto3.RowDescription", "*pgproto3.DataRow", "*pgproto3.DataRow", "*pgproto3.CommandComplete") + description := messages[0].(*pgproto3.RowDescription) + if len(description.Fields) != 2 || string(description.Fields[0].Name) != "id" || string(description.Fields[1].Name) != "body" { + t.Fatalf("internal columns leaked: %#v", description.Fields) + } + first, second := "1", "2" + if function == "keyword_rank" { + first, second = "2", "1" + } + assertDataRow(t, messages[1], []string{first, "waterproof"}) + assertDataRow(t, messages[2], []string{second, "waterproof"}) + }) + } + for _, input := range []struct { + query string + parameters [][]byte + }{ + {`SELECT id FROM search.public_documents WHERE body = $1 ORDER BY semantic_rank($2) LIMIT 1 OFFSET 1`, [][]byte{[]byte("waterproof"), []byte("rain jacket")}}, + {`SELECT id FROM search.public_documents WHERE body = $1 ORDER BY semantic_rank('rain jacket') LIMIT 1 OFFSET 1`, [][]byte{[]byte("waterproof")}}, + } { + _, prepared, err := handler.HandleParseQuery(&pgproto3.Parse{Query: input.query}) + if err != nil { + t.Fatal(err) + } + _, prepared, err = handler.HandleBindQuery(&pgproto3.Bind{Parameters: input.parameters}, prepared) + if err != nil { + t.Fatal(err) + } + messages, err := handler.HandleExecuteQuery(&pgproto3.Execute{}, prepared) + if err != nil { + t.Fatal(err) + } + assertDataRow(t, messages[0], []string{"2"}) + prepared.Statement.Close() + } + for _, function := range []string{"keyword_rank", "hybrid_rank"} { + for _, argument := range []string{"$2", "'rain jacket'"} { + parameters := [][]byte{[]byte("waterproof")} + if argument == "$2" { + parameters = append(parameters, []byte("rain jacket")) + } + _, prepared, err := handler.HandleParseQuery(&pgproto3.Parse{Query: fmt.Sprintf("SELECT id, %s(%s) AS rank FROM search.public_documents WHERE body = $1 ORDER BY %s(%s) LIMIT 1 OFFSET 1", function, argument, function, argument)}) + if err != nil { + t.Fatal(err) + } + _, prepared, err = handler.HandleBindQuery(&pgproto3.Bind{Parameters: parameters}, prepared) + if err != nil { + t.Fatal(err) + } + messages, err := handler.HandleExecuteQuery(&pgproto3.Execute{}, prepared) + if err != nil { + t.Fatal(err) + } + expected := "1" + if function == "hybrid_rank" { + expected = "2" + } + if string(messages[0].(*pgproto3.DataRow).Values[0]) != expected { + t.Fatalf("unexpected %s results: %#v", function, messages) + } + prepared.Statement.Close() + } + } + before := requests + messages, err := handler.HandleSimpleQuery(`SELECT id FROM search.public_documents ORDER BY keyword_rank('missing')`) + if err != nil { + t.Fatal(err) + } + assertMessageTypes(t, messages, "*pgproto3.RowDescription", "*pgproto3.CommandComplete") + if requests != before { + t.Fatal("keyword search generated embeddings") + } + // The ANN-only branch must still collapse duplicate chunks and expose an explicit rank. + ranked, err := handler.HandleSimpleQuery(`SELECT d.id, semantic_rank('rain jacket') AS rank FROM search.public_documents AS d WHERE d.body = 'waterproof' ORDER BY semantic_rank('rain jacket') LIMIT 1`) + if err != nil { + t.Fatal(err) + } + assertDataRow(t, ranked[1], []string{"1", "0"}) + if string(ranked[0].(*pgproto3.RowDescription).Fields[1].Name) != "rank" { + t.Fatal("rank alias was lost") + } + for _, sql := range []string{ + `SELECT id FROM search.public_documents ORDER BY embedding <=> '[1,2]'`, + `SELECT id FROM search.public_documents ORDER BY embedding <=> pgstack.embed('rain jacket')`, + } { + if _, err := handler.HandleSimpleQuery(sql); err == nil { + t.Fatalf("obsolete API unexpectedly supported: %s", sql) + } + } + messages, err = handler.HandleSimpleQuery(`SELECT * FROM search.public_documents ORDER BY id`) + if err != nil { + t.Fatal(err) + } + if len(messages[0].(*pgproto3.RowDescription).Fields) != 2 { + t.Fatal("table scan exposes internal columns") + } + for _, field := range messages[0].(*pgproto3.RowDescription).Fields { + if strings.HasPrefix(string(field.Name), "__pgstack_") { + t.Fatal("internal field exposed") + } + } +} + +// Verify generated SQL against the real extension when it is locally available. +// A local dataset replaces only the S3 URI; ranking and binding are unchanged. +func TestSearchRankLanceExecution(t *testing.T) { + handler := initQueryHandlerForTest(t) + ctx := context.Background() + if _, err := handler.ServerDuckdbClient.ExecContext(ctx, "LOAD lance"); err != nil { + t.Skipf("Lance extension unavailable: %v", err) + } + handler.Config.SearchTablesJSON = searchTestConfig().SearchTablesJSON + handler.Config.SearchBasePath = "search" + vector := make([]float32, OPENAI_EMBEDDING_DIMENSIONS) + vector[0] = 1 + requests := 0 + embeddingServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + requests++ + _ = json.NewEncoder(w).Encode(map[string]interface{}{"data": []interface{}{map[string]interface{}{"index": 0, "embedding": vector}}}) + })) + t.Cleanup(embeddingServer.Close) + handler.EmbeddingClient.apiKey = "test" + handler.EmbeddingClient.url = embeddingServer.URL + root := t.TempDir() + dataset := root + "/public_documents.lance" + for _, query := range []string{ + fmt.Sprintf("ATTACH '%s' AS search_store (TYPE lance)", strings.ReplaceAll(root, "'", "''")), + `CREATE TABLE search_store.main.public_documents AS + SELECT '1' AS id, 'waterproof' AS body, array_resize([1.0],1536,0)::FLOAT[1536] AS __pgstack_embedding, '1' AS __pgstack_source_key, 0::UINTEGER AS __pgstack_chunk_index, 'rain jacket waterproof' AS __pgstack_text + UNION ALL SELECT '2','waterproof',array_resize([0.6,0.8],1536,0)::FLOAT[1536],'2',0,'rain jacket rain jacket' + UNION ALL SELECT '3','excluded',array_resize([0.9,0.43589],1536,0)::FLOAT[1536],'3',0,'sun hat'`, + fmt.Sprintf("CREATE INDEX text_idx ON '%s' (__pgstack_text) USING INVERTED", strings.ReplaceAll(dataset, "'", "''")), + } { + if _, err := handler.ServerDuckdbClient.ExecContext(ctx, query); err != nil { + t.Fatal(err) + } + } + for _, function := range []string{"semantic_rank", "keyword_rank", "hybrid_rank"} { + for _, argument := range []string{"'rain jacket'", "$1"} { + original := fmt.Sprintf("SELECT id, %s(%s) AS rank FROM search.public_documents WHERE body = 'waterproof' ORDER BY %s(%s) LIMIT 2", function, argument, function, argument) + remapped, err := handler.QueryRemapper.ParseAndRemapQuery(original) + if err != nil { + t.Fatal(err) + } + query := strings.ReplaceAll(remapped.Statements[0], "s3://test/search/public_documents.lance", dataset) + before := requests + var variables []interface{} + if argument == "$1" { + statement, err := handler.ServerDuckdbClient.PrepareContext(ctx, query) + if err != nil { + t.Fatal(err) + } + prepared := &PreparedStatement{OriginalQuery: original, Query: query, Statement: statement, VectorParameters: remapped.VectorParameters} + _, prepared, err = handler.HandleBindQuery(&pgproto3.Bind{Parameters: [][]byte{[]byte("rain jacket")}}, prepared) + if err != nil { + t.Fatal(err) + } + variables = prepared.Variables + statement.Close() + } else { + variables, err = handler.resolveEmbeddedLiteralParameters(ctx, remapped.VectorParameters) + if err != nil { + t.Fatal(err) + } + } + rows, err := handler.ServerDuckdbClient.QueryContext(ctx, query, variables...) + if err != nil { + t.Fatal(err) + } + var ids []string + for rows.Next() { + var id string + var rank float64 + if err := rows.Scan(&id, &rank); err != nil { + t.Fatal(err) + } + if function != "semantic_rank" && rank >= 0 { + t.Fatalf("expected negated relevance score: %s %g", function, rank) + } + ids = append(ids, id) + } + if err := rows.Err(); err != nil { + t.Fatal(err) + } + rows.Close() + if len(ids) != 2 { + t.Fatalf("%s: unexpected results: %v", function, ids) + } + if function == "semantic_rank" && ids[0] != "1" || function == "keyword_rank" && ids[0] != "2" { + t.Fatalf("%s: incorrect ranking: %v", function, ids) + } + expectedRequests := 1 + if function == "keyword_rank" { + expectedRequests = 0 + } + if requests-before != expectedRequests { + t.Fatalf("%s: unexpected embedding requests: %d", function, requests-before) + } + } + } + // A selective filter leaves fewer documents than LIMIT. Keyword search returns + // its direct matches; hybrid search exercises its fallback. + for _, function := range []string{"keyword_rank", "hybrid_rank"} { + original := fmt.Sprintf("SELECT id FROM search.public_documents WHERE id = '2' ORDER BY %s('rain jacket') LIMIT 2", function) + remapped, err := handler.QueryRemapper.ParseAndRemapQuery(original) + if err != nil { + t.Fatal(err) + } + variables, err := handler.resolveEmbeddedLiteralParameters(ctx, remapped.VectorParameters) + if err != nil { + t.Fatal(err) + } + query := strings.ReplaceAll(remapped.Statements[0], "s3://test/search/public_documents.lance", dataset) + rows, err := handler.ServerDuckdbClient.QueryContext(ctx, query, variables...) + if err != nil { + t.Fatal(err) + } + if !rows.Next() { + t.Fatalf("%s fallback lost matching document: %v", function, rows.Err()) + } + var id string + if err := rows.Scan(&id); err != nil || id != "2" { + t.Fatalf("%s fallback returned %s: %v", function, id, err) + } + if rows.Next() { + t.Fatalf("%s fallback leaked nonmatches", function) + } + if err := rows.Err(); err != nil { + t.Fatal(err) + } + rows.Close() + } + + // Exercise native prefiltering, bound filters, and expressions that require + // DuckDB evaluation, rather than only checking generated SQL. + for _, test := range []struct { + filter string + parameters [][]byte + want int + }{ + {"d.id = '2'", nil, 1}, + {"'2' = d.id", nil, 1}, + {"d.id >= '2' AND d.body = 'waterproof'", nil, 1}, + {"d.body IS NOT NULL", nil, 3}, + {"d.id = 2", nil, 1}, + {"CAST(d.id AS INTEGER) = 2", nil, 1}, + {"length(d.body) > 3", nil, 3}, + {"d.id = '1' OR d.id = '2'", nil, 2}, + {"d.id IN ('1', '2')", nil, 2}, + {"d.body LIKE 'water%'", nil, 2}, + {"d.body IS NULL", nil, 0}, + {"d.id = $1", [][]byte{[]byte("2")}, 1}, + } { + for _, function := range []string{"semantic_rank", "keyword_rank", "hybrid_rank"} { + original := fmt.Sprintf("SELECT id FROM search.public_documents AS d WHERE %s ORDER BY %s('rain jacket') LIMIT 3", test.filter, function) + remapped, err := handler.QueryRemapper.ParseAndRemapQuery(original) + if err != nil { + t.Fatal(err) + } + query := strings.ReplaceAll(remapped.Statements[0], "s3://test/search/public_documents.lance", dataset) + var variables []interface{} + if len(test.parameters) > 0 { + statement, err := handler.ServerDuckdbClient.PrepareContext(ctx, query) + if err != nil { + t.Fatal(err) + } + prepared := &PreparedStatement{OriginalQuery: original, Query: query, Statement: statement, VectorParameters: remapped.VectorParameters} + _, prepared, err = handler.HandleBindQuery(&pgproto3.Bind{Parameters: test.parameters}, prepared) + if err != nil { + t.Fatal(err) + } + variables = prepared.Variables + statement.Close() + } else { + variables, err = handler.resolveEmbeddedLiteralParameters(ctx, remapped.VectorParameters) + if err != nil { + t.Fatal(err) + } + } + rows, err := handler.ServerDuckdbClient.QueryContext(ctx, query, variables...) + if err != nil { + t.Fatalf("%s WHERE %s: %v", function, test.filter, err) + } + count := 0 + for rows.Next() { + count++ + } + if err := rows.Err(); err != nil { + t.Fatal(err) + } + rows.Close() + want := test.want + if function == "keyword_rank" && want == 3 { + want = 2 + } + if count != want { + t.Fatalf("%s WHERE %s: expected %d, got %d", function, test.filter, want, count) + } + } + } + + // Populate more excluded top matches than the candidate budget, then query + // the candidate CTE directly so an exhaustive fallback cannot hide failed pushdown. + if _, err := handler.ServerDuckdbClient.ExecContext(ctx, `INSERT INTO search_store.main.public_documents + SELECT 'blocked-' || CAST(i AS VARCHAR), 'excluded', array_resize([1.0],1536,0)::FLOAT[1536], 'blocked-' || CAST(i AS VARCHAR), 0, repeat('rain jacket ', 100) + FROM range(40) AS blocked(i)`); err != nil { + t.Fatal(err) + } + for _, function := range []string{"semantic_rank", "keyword_rank", "hybrid_rank"} { + remapped, err := handler.QueryRemapper.ParseAndRemapQuery(fmt.Sprintf("SELECT id FROM search.public_documents AS d WHERE d.body = $1 ORDER BY %s('rain jacket') LIMIT 2", function)) + if err != nil { + t.Fatal(err) + } + query := strings.ReplaceAll(remapped.Statements[0], "s3://test/search/public_documents.lance", dataset) + query = strings.Replace(query, "FROM __pgstack_search_docs", "FROM __pgstack_candidate_docs", 1) + statement, err := handler.ServerDuckdbClient.PrepareContext(ctx, query) + if err != nil { + t.Fatal(err) + } + prepared := &PreparedStatement{Query: query, Statement: statement, VectorParameters: remapped.VectorParameters} + _, prepared, err = handler.HandleBindQuery(&pgproto3.Bind{Parameters: [][]byte{[]byte("waterproof")}}, prepared) + if err != nil { + t.Fatal(err) + } + rows, err := statement.QueryContext(ctx, prepared.Variables...) + if err != nil { + t.Fatal(err) + } + count := 0 + for rows.Next() { + var id string + if err := rows.Scan(&id); err != nil || (id != "1" && id != "2") { + t.Fatalf("prefilter returned %s: %v", id, err) + } + count++ + } + if err := rows.Err(); err != nil { + t.Fatal(err) + } + rows.Close() + statement.Close() + if count != 2 { + t.Fatalf("%s prefilter lost a top matching document: got %d", function, count) + } + } + // The whole-document keyword match lives on chunk 0, while the strongest + // semantic match is a later chunk. Duplicate semantic chunks must not boost RRF. + for _, query := range []string{ + `DELETE FROM search_store.main.public_documents WHERE id = '1'`, + `INSERT INTO search_store.main.public_documents VALUES ('1','waterproof',array_resize([0.0,1.0],1536,0)::FLOAT[1536],'1',0,'rain jacket rain jacket rain jacket')`, + `UPDATE search_store.main.public_documents SET __pgstack_text = 'rain jacket' WHERE id = '2'`, + `INSERT INTO search_store.main.public_documents VALUES ('1','waterproof',array_resize([1.0],1536,0)::FLOAT[1536],'1',1,NULL), ('1','waterproof',array_resize([1.0],1536,0)::FLOAT[1536],'1',2,NULL)`, + } { + if _, err := handler.ServerDuckdbClient.ExecContext(ctx, query); err != nil { + t.Fatal(err) + } + } + remapped, err := handler.QueryRemapper.ParseAndRemapQuery("SELECT id, hybrid_rank('rain jacket') AS rank FROM search.public_documents WHERE body = 'waterproof' ORDER BY hybrid_rank('rain jacket') LIMIT 2") + if err != nil { + t.Fatal(err) + } + variables, err := handler.resolveEmbeddedLiteralParameters(ctx, remapped.VectorParameters) + if err != nil { + t.Fatal(err) + } + query := strings.ReplaceAll(remapped.Statements[0], "s3://test/search/public_documents.lance", dataset) + rows, err := handler.ServerDuckdbClient.QueryContext(ctx, query, variables...) + if err != nil { + t.Fatal(err) + } + for i, wantID := range []string{"1", "2"} { + if !rows.Next() { + t.Fatalf("missing hybrid document %s: %v", wantID, rows.Err()) + } + var id string + var rank float64 + if err := rows.Scan(&id, &rank); err != nil { + t.Fatal(err) + } + wantRank := -2.0 / float64(HYBRID_RRF_CONSTANT+i+1) + if id != wantID || math.Abs(rank-wantRank) > 1e-9 { + t.Fatalf("incorrect document fusion: id=%s rank=%g, expected %s %g", id, rank, wantID, wantRank) + } + } + if rows.Next() { + t.Fatal("duplicate chunks leaked through fusion") + } + if err := rows.Err(); err != nil { + t.Fatal(err) + } + rows.Close() + + // Only chunk 0 is indexed for FTS. Direct keyword retrieval must still return + // each source document once when it has multiple semantic chunks. + remapped, err = handler.QueryRemapper.ParseAndRemapQuery("SELECT id FROM search.public_documents WHERE body = 'waterproof' ORDER BY keyword_rank('rain jacket') LIMIT 10") + if err != nil { + t.Fatal(err) + } + variables, err = handler.resolveEmbeddedLiteralParameters(ctx, remapped.VectorParameters) + if err != nil { + t.Fatal(err) + } + query = strings.ReplaceAll(remapped.Statements[0], "s3://test/search/public_documents.lance", dataset) + rows, err = handler.ServerDuckdbClient.QueryContext(ctx, query, variables...) + if err != nil { + t.Fatal(err) + } + seen := map[string]bool{} + for rows.Next() { + var id string + if err := rows.Scan(&id); err != nil { + t.Fatal(err) + } + if seen[id] { + t.Fatalf("keyword retrieval duplicated source document %s", id) + } + seen[id] = true + } + if err := rows.Err(); err != nil { + t.Fatal(err) + } + rows.Close() + if len(seen) != 2 || !seen["1"] || !seen["2"] { + t.Fatalf("incorrect keyword documents: %v", seen) + } + +} diff --git a/src/common/set.go b/server/set.go similarity index 69% rename from src/common/set.go rename to server/set.go index ff847d9..5e4da8e 100644 --- a/src/common/set.go +++ b/server/set.go @@ -1,4 +1,4 @@ -package common +package main type Set[T comparable] map[T]struct{} @@ -19,11 +19,6 @@ func (set Set[T]) AddAll(items []T) Set[T] { return set } -func (set Set[T]) Remove(item T) Set[T] { - delete(set, item) - return set -} - func (set Set[T]) Contains(item T) bool { _, ok := set[item] return ok @@ -37,13 +32,3 @@ func (set Set[T]) Values() []T { return values } - -func (set Set[T]) Reset() { - for key := range set { - delete(set, key) - } -} - -func (set Set[T]) IsEmpty() bool { - return len(set) == 0 -} diff --git a/src/server/utils.go b/server/utils.go similarity index 77% rename from src/server/utils.go rename to server/utils.go index d86b224..882b04e 100644 --- a/src/server/utils.go +++ b/server/utils.go @@ -6,11 +6,36 @@ import ( "crypto/sha256" "encoding/base64" "fmt" + "strconv" + "strings" "unicode" "golang.org/x/crypto/pbkdf2" ) +func IntToString(i int) string { + return strconv.Itoa(i) +} + +func IsLocalHost(host string) bool { + host = strings.TrimPrefix(host, "http://") + host = strings.TrimPrefix(host, "https://") + return strings.HasPrefix(host, "127.0.0.1") || strings.HasPrefix(host, "localhost") +} + +func Int64ToString(i int64) string { + return strconv.FormatInt(i, 10) +} + +func StringContainsUpper(str string) bool { + for _, char := range str { + if unicode.IsUpper(char) { + return true + } + } + return false +} + func StringToScramSha256(password string) string { saltLength := 16 digestLength := 32 @@ -38,15 +63,6 @@ func StringToScramSha256(password string) string { ) } -func StringContainsUpper(str string) bool { - for _, char := range str { - if unicode.IsUpper(char) { - return true - } - } - return false -} - func hmacSha256Hash(key []byte, message []byte) []byte { hash := hmac.New(sha256.New, key) hash.Write(message) diff --git a/src/common/capped_buffer.go b/src/common/capped_buffer.go deleted file mode 100644 index 32a7724..0000000 --- a/src/common/capped_buffer.go +++ /dev/null @@ -1,105 +0,0 @@ -package common - -import ( - "errors" - "io" - "sync" -) - -const DEFAULT_CAPPED_BUFFER_SIZE = 32 * 1024 * 1024 // 32 MB in memory - -type CappedBuffer struct { - Config *CommonConfig - MaxSizeBytes int - - buffer []byte - mutex sync.Mutex - conditionalSync *sync.Cond - - closeOnceSync sync.Once - closed bool -} - -func NewCappedBuffer(config *CommonConfig, maxSizeBytes int) *CappedBuffer { - sizedBuffer := &CappedBuffer{ - Config: config, - buffer: make([]byte, 0, maxSizeBytes), - MaxSizeBytes: maxSizeBytes, - } - sizedBuffer.conditionalSync = sync.NewCond(&sizedBuffer.mutex) - return sizedBuffer -} - -// Implements io.Writer -func (buf *CappedBuffer) Write(payload []byte) (writtenBytes int, err error) { - if len(payload) == 0 { - return 0, nil - } - - buf.mutex.Lock() - defer buf.mutex.Unlock() - - if buf.closed { - return 0, errors.New("buffer is closed") - } - - for len(buf.buffer)+len(payload) > buf.MaxSizeBytes && !buf.closed { - LogTrace(buf.Config, ">> Waiting for more space in capped buffer...") - buf.conditionalSync.Wait() // Wait for the reader - } - - // Check again if buffer was closed while waiting - if buf.closed { - return 0, errors.New("buffer is closed") - } - - writtenBytes = len(payload) - buf.buffer = append(buf.buffer, payload...) - LogTrace(buf.Config, ">> Writing", writtenBytes, "bytes to capped buffer...") - - buf.conditionalSync.Broadcast() // Notify the reader that new data is available - - return writtenBytes, nil -} - -// Implements io.Reader -func (buf *CappedBuffer) Read(payload []byte) (readBytes int, err error) { - if len(payload) == 0 { - return 0, nil - } - - buf.mutex.Lock() - defer buf.mutex.Unlock() - - for len(buf.buffer) == 0 && !buf.closed { - LogTrace(buf.Config, "<< Waiting for more data in capped buffer...") - buf.conditionalSync.Wait() // Wait for the writer - } - - if len(buf.buffer) == 0 && buf.closed { - return 0, io.EOF - } - - maxReadBytes := len(payload) - readBytes = copy(payload, buf.buffer) - buf.buffer = buf.buffer[readBytes:] - LogTrace(buf.Config, "<< Reading "+IntToString(readBytes)+"/"+IntToString(maxReadBytes)+" bytes from capped buffer...") - - buf.conditionalSync.Broadcast() // Notify the writer that space is now available - - return readBytes, nil -} - -func (buf *CappedBuffer) Close() error { - buf.closeOnceSync.Do(func() { - buf.mutex.Lock() - - LogTrace(buf.Config, "== Closing capped buffer...") - buf.closed = true - - buf.conditionalSync.Broadcast() // Wake up any waiting writers/readers - - buf.mutex.Unlock() - }) - return nil -} diff --git a/src/common/capped_buffer_test.go b/src/common/capped_buffer_test.go deleted file mode 100644 index 0e9dda2..0000000 --- a/src/common/capped_buffer_test.go +++ /dev/null @@ -1,320 +0,0 @@ -package common - -import ( - "bytes" - "io" - "sync" - "testing" - "time" -) - -func initTestConfig() *CommonConfig { - return &CommonConfig{ - LogLevel: LOG_LEVEL_INFO, // Use INFO to avoid excessive logging during tests - } -} - -func TestCappedBufferWrite(t *testing.T) { - t.Run("Writes data to buffer", func(t *testing.T) { - config := initTestConfig() - bufferSize := 100 // 100 bytes - buffer := NewCappedBuffer(config, bufferSize) - writeData := []byte("hello world") - - writtenBytes, err := buffer.Write(writeData) - - if err != nil { - t.Fatalf("Failed to write to buffer: %v", err) - } - if writtenBytes != len(writeData) { - t.Errorf("Expected to write %d bytes, but wrote %d", len(writeData), writtenBytes) - } - }) - - t.Run("Waits to write data to a full buffer", func(t *testing.T) { - config := initTestConfig() - bufferSize := 11 - buffer := NewCappedBuffer(config, bufferSize) - writeDataFull := []byte("hello world") - buffer.Write(writeDataFull) - writeDataOverflow := []byte("overflow") - done := make(chan struct{}) - - go func() { - buffer.Write(writeDataOverflow) - close(done) - }() - - select { - case <-done: - t.Error("Write to full buffer should block, but it returned immediately") - case <-time.After(100 * time.Millisecond): - // This is expected - Write should block - } - }) - - t.Run("Writes data to a buffer after it was read (more space available)", func(t *testing.T) { - config := initTestConfig() - bufferSize := 11 - buffer := NewCappedBuffer(config, bufferSize) - writeDataFull := []byte("hello world") - buffer.Write(writeDataFull) - writeDataOverflow := []byte("over") - done := make(chan struct{}) - - go func() { - writtenBytes, err := buffer.Write(writeDataOverflow) - if err != nil { - t.Errorf("Failed to write to buffer: %v", err) - } - if writtenBytes != len(writeDataOverflow) { - t.Errorf("Expected to write %d bytes, but wrote %d", len(writeDataOverflow), writtenBytes) - } - - close(done) - }() - - readData := make([]byte, 5) - readBytes, err := buffer.Read(readData) - if err != nil { - t.Fatalf("Failed to read from buffer: %v", err) - } - if readBytes != 5 { - t.Errorf("Expected to read 5 bytes, but read %d", readBytes) - } - - select { - case <-done: - // This is expected - Write should proceed - case <-time.After(100 * time.Millisecond): - t.Error("Write should have proceeded after Read") - } - }) - - t.Run("Receive error when writing to a closed buffer", func(t *testing.T) { - config := initTestConfig() - bufferSize := 100 - buffer := NewCappedBuffer(config, bufferSize) - writeData := []byte("hello world") - - buffer.Close() - - writtenBytes, err := buffer.Write(writeData) - - if err == nil { - t.Error("Write to closed buffer should return an error") - } - if err.Error() != "buffer is closed" { - t.Errorf("Expected error message 'buffer is closed', but got: %v", err) - } - if writtenBytes != 0 { - t.Errorf("Expected to write 0 bytes, but wrote %d", writtenBytes) - } - }) -} - -func TestCappedBufferRead(t *testing.T) { - t.Run("Reads data from buffer", func(t *testing.T) { - config := initTestConfig() - bufferSize := 100 // 100 bytes - buffer := NewCappedBuffer(config, bufferSize) - writeData := []byte("hello world") - buffer.Write(writeData) - readData := make([]byte, len(writeData)) - - readBytes, err := buffer.Read(readData) - - if err != nil { - t.Fatalf("Failed to read from buffer: %v", err) - } - if readBytes != len(writeData) { - t.Errorf("Expected to read %d bytes, but read %d", len(writeData), readBytes) - } - if !bytes.Equal(readData, writeData) { - t.Errorf("Read data does not match written data. Got %q, want %q", readData, writeData) - } - }) - - t.Run("Waits to read data from an empty buffer", func(t *testing.T) { - config := initTestConfig() - bufferSize := 100 // 100 bytes - buffer := NewCappedBuffer(config, bufferSize) - done := make(chan struct{}) // Create a channel to signal when read is done - readData := make([]byte, 10) - - // Start a goroutine to read from the buffer - go func() { - buffer.Read(readData) - close(done) - }() - - // Wait for a short time to see if Read blocks - select { - case <-done: - t.Error("Read from empty buffer should block, but it returned immediately") - case <-time.After(100 * time.Millisecond): - // This is expected - Read should block - } - }) - - t.Run("Waits and reads data from a buffer after it was closed", func(t *testing.T) { - config := initTestConfig() - bufferSize := 100 // 100 bytes - buffer := NewCappedBuffer(config, bufferSize) - writeData := []byte("hello world") - buffer.Write(writeData) - done := make(chan struct{}) // Create a channel to signal when read is done - readData := make([]byte, 11) - - // Start a goroutine to read from the buffer - go func() { - readBytes, err := buffer.Read(readData) - if err != nil { - t.Errorf("Failed to read from buffer: %v", err) - } - if readBytes != len(writeData) { - t.Errorf("Expected to read %d bytes, but read %d", len(writeData), readBytes) - } - close(done) - }() - - buffer.Close() // Close the buffer to unblock the read - - // Wait for the read to complete - select { - case <-done: - if !bytes.Equal(readData, writeData) { - t.Errorf("Read data does not match written data. Got %q, want %q", readData, writeData) - } - case <-time.After(100 * time.Millisecond): - t.Error("Read should have returned after Close") - } - }) - - t.Run("Reads data from a buffer after it was written to (more data available)", func(t *testing.T) { - config := initTestConfig() - bufferSize := 11 - buffer := NewCappedBuffer(config, bufferSize) - readData := make([]byte, 5) - done := make(chan struct{}) - writeData := []byte("hello world") - - go func() { - readBytes, err := buffer.Read(readData) - if err != nil { - t.Errorf("Failed to read from buffer: %v", err) - } - if readBytes != len(readData) { - t.Errorf("Expected to read %d bytes, but read %d", len(readData), readBytes) - } - if !bytes.Equal(readData, writeData[:len(readData)]) { - t.Errorf("Read data does not match written data. Got %q, want %q", readData, writeData[:len(readData)]) - } - close(done) - }() - - buffer.Write(writeData) - - select { - case <-done: - // This is expected - Read should proceed - case <-time.After(100 * time.Millisecond): - t.Error("Read should have proceeded after Write") - } - }) - - t.Run("Receive EOF when reading from a closed and empty buffer", func(t *testing.T) { - config := initTestConfig() - bufferSize := 100 - buffer := NewCappedBuffer(config, bufferSize) - readData := make([]byte, 10) - - buffer.Close() - - readBytes, err := buffer.Read(readData) - - if err != io.EOF { - t.Errorf("Read from closed and empty buffer should return EOF, but got: %v", err) - } - if readBytes != 0 { - t.Errorf("Expected to read 0 bytes, but read %d", readBytes) - } - }) -} - -func TestCappedBufferConcurrentReadWrite(t *testing.T) { - t.Run("Concurrent read and write operations", func(t *testing.T) { - config := initTestConfig() - bufferSize := 100 // 100 bytes - buffer := NewCappedBuffer(config, bufferSize) - iterations := 100 - writeData := []byte("test data") - - // WaitGroup to wait for all goroutines to complete - var wg sync.WaitGroup - wg.Add(2) // One for reader, one for writer - - // Start writer goroutine - go func() { - defer wg.Done() - for i := 0; i < iterations; i++ { - _, err := buffer.Write(writeData) - if err != nil { - t.Errorf("Write error at iteration %d: %v", i, err) - return - } - } - }() - - // Start reader goroutine - go func() { - defer wg.Done() - readData := make([]byte, len(writeData)) - for i := 0; i < iterations; i++ { - _, err := buffer.Read(readData) - if err != nil { - t.Errorf("Read error at iteration %d: %v", i, err) - return - } - if !bytes.Equal(readData, writeData) { - t.Errorf("Read data does not match at iteration %d. Got %q, want %q", i, readData, writeData) - return - } - } - }() - - // Wait for both goroutines to complete - wg.Wait() - }) - - t.Run("Multiple sequential read and write operations", func(t *testing.T) { - config := initTestConfig() - bufferSize := 20 - buffer := NewCappedBuffer(config, bufferSize) - data1 := []byte("first") - data2 := []byte("second") - data3 := []byte("third") - readData1 := make([]byte, 5) // "first" - readData2 := make([]byte, 6) // "second" - readData3 := make([]byte, 5) // "third" - - buffer.Write(data1) - buffer.Write(data2) - buffer.Write(data3) - - readBytes1, _ := buffer.Read(readData1) - if readBytes1 != 5 || string(readData1) != "first" { - t.Errorf("First read failed: got %q, want %q", readData1, "first") - } - - readBytes2, _ := buffer.Read(readData2) - if readBytes2 != 6 || string(readData2) != "second" { - t.Errorf("Second read failed: got %q, want %q", readData2, "second") - } - - readBytes3, _ := buffer.Read(readData3) - if readBytes3 != 5 || string(readData3) != "third" { - t.Errorf("Third read failed: got %q, want %q", readData3, "third") - } - }) -} diff --git a/src/common/common_config.go b/src/common/common_config.go deleted file mode 100644 index c7811fa..0000000 --- a/src/common/common_config.go +++ /dev/null @@ -1,34 +0,0 @@ -package common - -const ( - VERSION = "1.8.0" - - ENV_LOG_LEVEL = "BEMIDB_LOG_LEVEL" - ENV_DISABLE_ANONYMOUS_ANALYTICS = "BEMIDB_DISABLE_ANONYMOUS_ANALYTICS" - - ENV_CATALOG_DATABASE_URL = "CATALOG_DATABASE_URL" - - ENV_AWS_REGION = "AWS_REGION" - ENV_AWS_S3_ENDPOINT = "AWS_S3_ENDPOINT" - ENV_AWS_S3_BUCKET = "AWS_S3_BUCKET" - ENV_AWS_ACCESS_KEY_ID = "AWS_ACCESS_KEY_ID" - ENV_AWS_SECRET_ACCESS_KEY = "AWS_SECRET_ACCESS_KEY" - - DEFAULT_LOG_LEVEL = "INFO" - DEFAULT_AWS_S3_ENDPOINT = "s3.amazonaws.com" -) - -type AwsConfig struct { - Region string - S3Endpoint string // optional - S3Bucket string - AccessKeyId string - SecretAccessKey string -} - -type CommonConfig struct { - Aws AwsConfig - LogLevel string - CatalogDatabaseUrl string - DisableAnonymousAnalytics bool -} diff --git a/src/common/duckdb_client.go b/src/common/duckdb_client.go deleted file mode 100644 index 6fb719a..0000000 --- a/src/common/duckdb_client.go +++ /dev/null @@ -1,154 +0,0 @@ -package common - -import ( - "context" - "database/sql" - "strings" - - "github.com/marcboeker/go-duckdb/v2" -) - -var SYNCER_DUCKDB_BOOT_QUERIES = []string{ - "SET memory_limit='2GB'", - "SET threads=2", -} - -type DuckdbClient struct { - Config *CommonConfig - Db *sql.DB - Connector *duckdb.Connector - BootQueries []string -} - -func NewDuckdbClient(config *CommonConfig, bootQueries ...[]string) *DuckdbClient { - ctx := context.Background() - connector, err := duckdb.NewConnector("", nil) - PanicIfError(config, err) - db := sql.OpenDB(connector) - - client := &DuckdbClient{ - Config: config, - Db: db, - Connector: connector, - } - - client.BootQueries = []string{ - "SET timezone='UTC'", - } - if bootQueries != nil { - client.BootQueries = append(client.BootQueries, bootQueries[0]...) - } - client.BootQueries = append( - client.BootQueries, - "CREATE OR REPLACE SECRET aws_s3_secret (TYPE S3, KEY_ID '"+config.Aws.AccessKeyId+"', SECRET '"+config.Aws.SecretAccessKey+"', REGION '"+config.Aws.Region+"', ENDPOINT '"+config.Aws.S3Endpoint+"', SCOPE 's3://"+config.Aws.S3Bucket+"')", - ) - if IsLocalHost(config.Aws.S3Endpoint) { - client.BootQueries = append(client.BootQueries, "SET s3_use_ssl=false") - } - if config.Aws.S3Endpoint != DEFAULT_AWS_S3_ENDPOINT { - client.BootQueries = append(client.BootQueries, "SET s3_url_style='path'") // Use endpoint/bucket/key (path, deprecated on AWS) instead of bucket.endpoint/key (vhost) - } - if config.LogLevel == LOG_LEVEL_TRACE { - client.BootQueries = append(client.BootQueries, "PRAGMA enable_logging('HTTP')", "SET logging_storage = 'stdout'") - } - - for _, query := range client.BootQueries { - _, err := client.ExecContext(ctx, query) - PanicIfError(config, err) - } - - return client -} - -func (client *DuckdbClient) QueryContext(ctx context.Context, query string) (*sql.Rows, error) { - LogDebug(client.Config, "Querying DuckDB:", query) - return client.Db.QueryContext(ctx, query) -} - -func (client *DuckdbClient) QueryRowContext(ctx context.Context, query string, args ...map[string]string) *sql.Row { - LogDebug(client.Config, "Querying DuckDB row:", query) - if len(args) == 0 { - return client.Db.QueryRowContext(ctx, query) - } - return client.Db.QueryRowContext(ctx, replaceNamedStringArgs(query, args[0])) -} - -func (client *DuckdbClient) PrepareContext(ctx context.Context, query string) (*sql.Stmt, error) { - LogDebug(client.Config, "Preparing DuckDB statement:", query) - return client.Db.PrepareContext(ctx, query) -} - -func (client *DuckdbClient) ExecContext(ctx context.Context, query string, args ...map[string]string) (sql.Result, error) { - LogDebug(client.Config, "Executing DuckDB:", query) - if len(args) == 0 { - return client.Db.ExecContext(ctx, query) - } - - return client.Db.ExecContext(ctx, replaceNamedStringArgs(query, args[0])) -} - -func (client *DuckdbClient) ExecTransactionContext(ctx context.Context, queries []string, args ...[]map[string]string) error { - tx, err := client.Db.Begin() - LogDebug(client.Config, "Executing DuckDB: BEGIN") - if err != nil { - return err - } - - for i, query := range queries { - LogDebug(client.Config, "Executing DuckDB in transaction:", query) - var err error - if len(args) == 0 { - _, err = tx.ExecContext(ctx, query) - } else { - _, err = tx.ExecContext(ctx, replaceNamedStringArgs(query, args[0][i])) - } - if err != nil { - tx.Rollback() - return err - } - } - - LogDebug(client.Config, "Executing DuckDB: COMMIT") - return tx.Commit() -} - -func (client *DuckdbClient) Appender(schema string, table string) (*duckdb.Appender, error) { - conn, err := client.Connector.Connect(context.Background()) - if err != nil { - return nil, err - } - return duckdb.NewAppenderFromConn(conn, schema, table) -} - -func (client *DuckdbClient) Close() { - client.Db.Close() -} - -func (client *DuckdbClient) RecreateDb() { - ctx := context.Background() - - client.Db.Close() - - connector, err := duckdb.NewConnector("", nil) - PanicIfError(client.Config, err) - db := sql.OpenDB(connector) - client.Db = db - client.Connector = connector - - for _, query := range client.BootQueries { - _, err := client.Db.ExecContext(ctx, query) - PanicIfError(client.Config, err) - } - -} - -func replaceNamedStringArgs(query string, args map[string]string) string { - for key, value := range args { - query = strings.ReplaceAll( - query, - "$"+key, - strings.ReplaceAll(value, "'", "''"), - ) - } - return query -} diff --git a/src/common/duckdb_schema_column.go b/src/common/duckdb_schema_column.go deleted file mode 100644 index 9e62be4..0000000 --- a/src/common/duckdb_schema_column.go +++ /dev/null @@ -1,62 +0,0 @@ -package common - -import "strings" - -const ( - DUCKDB_YES = "YES" -) - -type DuckdbSchemaColumn struct { - ColumnName string - DataType string - IsNullable string - OrdinalPosition string - NumericPrecision string - NumericScale string - DatetimePrecision string - Config *CommonConfig -} - -func (column *DuckdbSchemaColumn) ToIcebergSchemaColumn() *IcebergSchemaColumn { - icebergSchemaColumn := &IcebergSchemaColumn{ - Config: column.Config, - ColumnName: column.ColumnName, - Position: StringToInt(column.OrdinalPosition), - NumericPrecision: StringToInt(column.NumericPrecision), - NumericScale: StringToInt(column.NumericScale), - IsRequired: column.IsNullable != DUCKDB_YES, - DatetimePrecision: StringToInt(column.DatetimePrecision), - IsList: strings.HasSuffix(column.DataType, "[]"), - } - - switch strings.TrimSuffix(column.DataType, "[]") { - case "BOOLEAN": - icebergSchemaColumn.ColumnType = IcebergColumnTypeBoolean - case "INTEGER": - icebergSchemaColumn.ColumnType = IcebergColumnTypeInteger - case "BIGINT": - icebergSchemaColumn.ColumnType = IcebergColumnTypeLong - case "FLOAT": - icebergSchemaColumn.ColumnType = IcebergColumnTypeFloat - case "DOUBLE": - icebergSchemaColumn.ColumnType = IcebergColumnTypeDouble - case "DATE": - icebergSchemaColumn.ColumnType = IcebergColumnTypeDate - case "TIME": - icebergSchemaColumn.ColumnType = IcebergColumnTypeTime - case "TIMESTAMP": - icebergSchemaColumn.ColumnType = IcebergColumnTypeTimestamp - case "BLOB": - icebergSchemaColumn.ColumnType = IcebergColumnTypeBinary - case "VARCHAR", "JSON": - icebergSchemaColumn.ColumnType = IcebergColumnTypeString - default: - if strings.HasPrefix(column.DataType, "DECIMAL(") { - icebergSchemaColumn.ColumnType = IcebergColumnTypeDecimal - } else { - panic("Unsupported DuckDB type: " + column.DataType) - } - } - - return icebergSchemaColumn -} diff --git a/src/common/error_utils.go b/src/common/error_utils.go deleted file mode 100644 index f292774..0000000 --- a/src/common/error_utils.go +++ /dev/null @@ -1,82 +0,0 @@ -package common - -import ( - "bytes" - "encoding/json" - "errors" - "fmt" - "net/http" - "os" - "runtime" - "runtime/debug" - "time" -) - -func PanicIfError(config *CommonConfig, err error) { - if err != nil { - sendAnonymousErrorReport(config, err) - printUnexpectedError(config, err) - os.Exit(1) - } -} - -func Panic(config *CommonConfig, message string) { - err := errors.New(message) - PanicIfError(config, err) -} - -func PrintErrorAndExit(config *CommonConfig, message string) { - LogError(config, message+"\n") - os.Exit(1) -} - -func HandleUnexpectedPanic(config *CommonConfig) { - func() { - if r := recover(); r != nil { - err, _ := r.(error) - sendAnonymousErrorReport(config, err) - printUnexpectedError(config, err) - os.Exit(1) - } - }() -} - -func printUnexpectedError(config *CommonConfig, err error) { - errorMessage := err.Error() - stackTrace := string(debug.Stack()) - - fmt.Println("Unexpected error:", errorMessage) - fmt.Println(stackTrace) -} - -type AnonymousErrorData struct { - Command string `json:"command"` - OsName string `json:"osName"` - Version string `json:"version"` - Error string `json:"error"` - StackTrace string `json:"stackTrace"` - S3Bucket string `json:"s3Bucket"` -} - -func sendAnonymousErrorReport(config *CommonConfig, err error) { - if config.DisableAnonymousAnalytics { - return - } - - data := AnonymousErrorData{ - Command: "server", - OsName: runtime.GOOS + "-" + runtime.GOARCH, - Version: VERSION, - Error: err.Error(), - StackTrace: string(debug.Stack()), - S3Bucket: config.Aws.S3Endpoint + "/" + config.Aws.S3Bucket, - } - - jsonData, err := json.Marshal(data) - if err != nil { - return - } - - client := http.Client{Timeout: 5 * time.Second} - _, _ = client.Post("https://api.bemidb.com/api/errors", "application/json", bytes.NewBuffer(jsonData)) -} diff --git a/src/common/go.mod b/src/common/go.mod deleted file mode 100644 index 1290641..0000000 --- a/src/common/go.mod +++ /dev/null @@ -1,64 +0,0 @@ -module github.com/BemiHQ/BemiDB/src/common - -go 1.24.4 - -require ( - github.com/aws/aws-sdk-go-v2 v1.37.0 - github.com/aws/aws-sdk-go-v2/config v1.30.1 - github.com/aws/aws-sdk-go-v2/credentials v1.18.1 - github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1 - github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0 - github.com/google/uuid v1.6.0 - github.com/jackc/pgx/v5 v5.7.5 - github.com/linkedin/goavro v2.1.0+incompatible - github.com/marcboeker/go-duckdb/v2 v2.3.2 - github.com/xitongsys/parquet-go v1.6.2 - github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b -) - -require ( - github.com/apache/arrow-go/v18 v18.4.0 // indirect - github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 // indirect - github.com/apache/thrift v0.22.0 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.26.0 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.35.0 // indirect - github.com/aws/smithy-go v1.22.5 // indirect - github.com/duckdb/duckdb-go-bindings v0.1.16 // indirect - github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11 // indirect - github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11 // indirect - github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11 // indirect - github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11 // indirect - github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11 // indirect - github.com/go-viper/mapstructure/v2 v2.3.0 // indirect - github.com/goccy/go-json v0.10.5 // indirect - github.com/golang/snappy v1.0.0 // indirect - github.com/google/flatbuffers v25.2.10+incompatible // indirect - github.com/jackc/pgpassfile v1.0.0 // indirect - github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect - github.com/klauspost/compress v1.18.0 // indirect - github.com/klauspost/cpuid/v2 v2.2.11 // indirect - github.com/marcboeker/go-duckdb/arrowmapping v0.0.9 // indirect - github.com/marcboeker/go-duckdb/mapping v0.0.10 // indirect - github.com/pierrec/lz4/v4 v4.1.22 // indirect - github.com/zeebo/xxh3 v1.0.2 // indirect - golang.org/x/crypto v0.37.0 // indirect - golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect - golang.org/x/mod v0.25.0 // indirect - golang.org/x/sync v0.15.0 // indirect - golang.org/x/sys v0.33.0 // indirect - golang.org/x/text v0.26.0 // indirect - golang.org/x/tools v0.34.0 // indirect - golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect - gopkg.in/linkedin/goavro.v1 v1.0.5 // indirect -) diff --git a/src/common/go.sum b/src/common/go.sum deleted file mode 100644 index 74c3ead..0000000 --- a/src/common/go.sum +++ /dev/null @@ -1,1160 +0,0 @@ -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.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.66.0/go.mod h1:dgqGAjKCDxyhGTtC9dAREQGUJpkceNm1yt590Qno0Ko= -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.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.82.0/go.mod h1:vlKccHJGuFBFufnAnuB08dfEH9Y3H7dzDzRECFdC2TA= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= -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 v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.2.0/go.mod h1:xlogom/6gr8RJGBe7nT2eGsQYAFUbbv8dbC29qE3Xmw= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -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/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= -cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= -cloud.google.com/go/iam v0.1.1/go.mod h1:CKqrcnI/suGpybEHxZ7BMehL0oA4LpdyJdUlTl9jVMw= -cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= -cloud.google.com/go/kms v1.1.0/go.mod h1:WdbppnCDMDpOvoYBMn1+gNmOeEoZYqAv+HeuKARGCXI= -cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= -cloud.google.com/go/monitoring v1.1.0/go.mod h1:L81pzz7HKn14QCMaCs6NTQkdBnE87TElyanS95vIcl4= -cloud.google.com/go/monitoring v1.4.0/go.mod h1:y6xnxfwI3hTFWOdkOaD7nfJVlwuC3/mS/5kvtT131p4= -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/pubsub v1.19.0/go.mod h1:/O9kmSe9bb9KRnIAWkzmqhPjHo6LtzGOBYd/kr06XSs= -cloud.google.com/go/secretmanager v1.3.0/go.mod h1:+oLTkouyiYiabAQNugCeTS3PAArGiMJuBqvJnJsyH+U= -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.12.0/go.mod h1:fFLk2dp2oAhDz8QFKwqrjdJvxSp/W2g7nillojlL5Ho= -cloud.google.com/go/storage v1.21.0/go.mod h1:XmRlxkgPjlBONznT2dDUU/5XlpU2OjMnKuqnZI01LAA= -cloud.google.com/go/trace v1.0.0/go.mod h1:4iErSByzxkyHWzzlAj63/Gmjz0NH1ASqhJguHpGcr6A= -cloud.google.com/go/trace v1.2.0/go.mod h1:Wc8y/uYyOhPy12KEnXG9XGrvfMz5F5SrYecQlbW1rwM= -contrib.go.opencensus.io/exporter/aws v0.0.0-20200617204711-c478e41e60e9/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= -contrib.go.opencensus.io/exporter/stackdriver v0.13.10/go.mod h1:I5htMbyta491eUxufwwZPQdcKvvgzMB4O9ni41YnIM8= -contrib.go.opencensus.io/integrations/ocsql v0.1.7/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/azure-amqp-common-go/v3 v3.2.1/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= -github.com/Azure/azure-amqp-common-go/v3 v3.2.2/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= -github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k= -github.com/Azure/azure-sdk-for-go v51.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v59.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.0.0/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.0.0/go.mod h1:+6sju8gk8FRmSajX3Oz4G5Gm7P+mbqE9FVaXXFYTkCM= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U= -github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.0.0/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.0.0/go.mod h1:ceIuwmxDWptoW3eCqSXlnPsZFKh4X+R38dWPv7GS9Vs= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.0.0/go.mod h1:s1tW/At+xHqjNFvWU4G0c0Qv33KOhvbGNj0RCTQDV8s= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.2.0/go.mod h1:c+Lifp3EDEamAkPVzMooRNOK6CZjNSdEnf1A7jsI9u4= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.1.0/go.mod h1:7QJP7dr2wznCMeqIrhMgWGf7XpAQnVrJqDm9nvV3Cu4= -github.com/Azure/azure-service-bus-go v0.11.5/go.mod h1:MI6ge2CuQWBVq+ly456MY7XqNLJip5LO1iSFodbNLbU= -github.com/Azure/azure-storage-blob-go v0.14.0/go.mod h1:SMqIBi+SuiQH32bvyjngEewEeXoPfKMgWlBDaYf6fck= -github.com/Azure/go-amqp v0.16.0/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= -github.com/Azure/go-amqp v0.16.4/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest v0.11.19/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest v0.11.22/go.mod h1:BAWYUWGPEtKPzjVkp0Q6an0MJcJDsoh5Z1BFAEFs4Xs= -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/adal v0.9.14/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/adal v0.9.17/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= -github.com/Azure/go-autorest/autorest/azure/auth v0.5.9/go.mod h1:hg3/1yw0Bq87O3KvvnJoAh34/0zbP7SFizX/qN5JvjU= -github.com/Azure/go-autorest/autorest/azure/cli v0.4.2/go.mod h1:7qkJkT+j6b+hIpzMOwPChJhTqS8VbsqqgULzMNRugoM= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= -github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/AzureAD/microsoft-authentication-library-for-go v0.4.0/go.mod h1:Vt9sXTKwMyGcOxSmLDMnGPgqsUg7m8pe215qMLrDXw4= -github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/GoogleCloudPlatform/cloudsql-proxy v1.29.0/go.mod h1:spvB9eLJH9dutlbPSRmHvSXXHOwGRyeXh1jVdquA2G8= -github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= -github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/apache/arrow-go/v18 v18.4.0 h1:/RvkGqH517iY8bZKc4FD5/kkdwXJGjxf28JIXbJ/oB0= -github.com/apache/arrow-go/v18 v18.4.0/go.mod h1:Aawvwhj8x2jURIzD9Moy72cF0FyJXOpkYpdmGRHcw14= -github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 h1:byKBBF2CKWBjjA4J1ZL2JXttJULvWSl50LegTyRZ728= -github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516/go.mod h1:QNYViu/X0HXDHw7m3KXzWSVXIbfUvJqBFe6Gj8/pYA0= -github.com/apache/thrift v0.0.0-20181112125854-24918abba929/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.14.2/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.22.0 h1:r7mTJdj51TMDe6RtcmNdQxgn9XcyfGDOzegMDRg47uc= -github.com/apache/thrift v0.22.0/go.mod h1:1e7J/O1Ae6ZQMTYdy9xa3w9k+XHWPfRvdPyJeynQ+/g= -github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= -github.com/aws/aws-sdk-go v1.30.19/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= -github.com/aws/aws-sdk-go v1.37.0/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go v1.43.31 h1:yJZIr8nMV1hXjAvvOLUFqZRJcHV7udPQBfhJqawDzI0= -github.com/aws/aws-sdk-go v1.43.31/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= -github.com/aws/aws-sdk-go-v2 v1.16.2/go.mod h1:ytwTPBG6fXTZLxxeeCCWj2/EMYp/xDUgX+OET6TLNNU= -github.com/aws/aws-sdk-go-v2 v1.23.0/go.mod h1:i1XDttT4rnf6vxc9AuskLc6s7XBee8rlLilKlc03uAA= -github.com/aws/aws-sdk-go-v2 v1.37.0 h1:YtCOESR/pN4j5oA7cVHSfOwIcuh/KwHC4DOSXFbv5F0= -github.com/aws/aws-sdk-go-v2 v1.37.0/go.mod h1:9Q0OoGQoboYIAJyslFyF1f5K1Ryddop8gqMhWx/n4Wg= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.1/go.mod h1:n8Bs1ElDD2wJ9kCRTczA83gYbBmjSwZp3umc6zF4EeM= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.1/go.mod h1:t8PYl/6LzdAqsU4/9tz28V/kU+asFePvpOMkdul0gEQ= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 h1:6GMWV6CNpA/6fbFHnoAjrv4+LGfyTqZz2LtCHnspgDg= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0/go.mod h1:/mXlTIVG9jbxkqDnr5UQNQxW1HRYxeGklkM9vAFeabg= -github.com/aws/aws-sdk-go-v2/config v1.15.3/go.mod h1:9YL3v07Xc/ohTsxFXzan9ZpFpdTOFl4X65BAKYaz8jg= -github.com/aws/aws-sdk-go-v2/config v1.25.3/go.mod h1:tAByZy03nH5jcq0vZmkcVoo6tRzRHEwSFx3QW4NmDw8= -github.com/aws/aws-sdk-go-v2/config v1.30.1 h1:sHL8g/+9tcZATeV2tEkEfxZeaNokDtKsSjGMGHD49qA= -github.com/aws/aws-sdk-go-v2/config v1.30.1/go.mod h1:wkibEyFfxXRyTSzRU4bbF5IUsSXyE4xQ4ZjkGmi5tFo= -github.com/aws/aws-sdk-go-v2/credentials v1.11.2/go.mod h1:j8YsY9TXTm31k4eFhspiQicfXPLZ0gYXA50i4gxPE8g= -github.com/aws/aws-sdk-go-v2/credentials v1.16.2/go.mod h1:sDdvGhXrSVT5yzBDR7qXz+rhbpiMpUYfF3vJ01QSdrc= -github.com/aws/aws-sdk-go-v2/credentials v1.18.1 h1:E55xvOqlX7CvB66Z7rSM9usCrFU1ryUIUHqiXsEzVoE= -github.com/aws/aws-sdk-go-v2/credentials v1.18.1/go.mod h1:iobSQfR5MkvILxssGOvi/P1jjOhrRzfTiCPCzku0vx4= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.3/go.mod h1:uk1vhHHERfSVCUnqSqz8O48LBYDSC+k6brng09jcMOk= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.4/go.mod h1:t4i+yGHMCcUNIX1x7YVYa6bH/Do7civ5I6cG/6PMfyA= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0 h1:9sBTeKQwAvmJUWKIACIoiFSnxxl+sS++YDfr17/ngq0= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0/go.mod h1:LW9/PxQD1SYFC7pnWcgqPhoyZprhjEdg5hBK6qYPLW8= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.3/go.mod h1:0dHuD2HZZSiwfJSy1FO5bX1hQ1TxVV1QXXjpn3XUE44= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.14.0/go.mod h1:UcgIwJ9KHquYxs6Q5skC9qXjhYMK+JASDYcXQ4X7JZE= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1 h1:aAjA/1JZ1xH/F9XvxJu9cXZyp7BqVXtHpztyZ6p799E= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1/go.mod h1:ia9HASsPba/7o84sp6iE4wZPdNTJ0oicBe5sWQQk+Ys= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.9/go.mod h1:AnVH5pvai0pAF4lXRq0bmhbes1u9R8wTE+g+183bZNM= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.3/go.mod h1:7sGSz1JCKHWWBHq98m6sMtWQikmYPpxjqOydDemiVoM= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0 h1:H2iZoqW/v2Jnrh1FnU725Bq6KJ0k2uP63yH+DcY+HUI= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0/go.mod h1:L0FqLbwMXHvNC/7crWV1iIxUlOKYZUE8KuTIA+TozAI= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.3/go.mod h1:ssOhaLpRlh88H3UmEcsBoVKq309quMvm3Ds8e9d4eJM= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.3/go.mod h1:ify42Rb7nKeDDPkFjKn7q1bPscVPu/+gmHH8d2c+anU= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0 h1:EDped/rNzAhFPhVY0sDGbtD16OKqksfA8OjF/kLEgw8= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0/go.mod h1:uUI335jvzpZRPpjYx6ODc/wg1qH+NnoSTK/FwVeK0C0= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.10/go.mod h1:8DcYQcz0+ZJaSxANlHIsbbi6S+zMwjwdDqwW3r9AzaE= -github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.3/go.mod h1:5yzAuE9i2RkVAttBl8yxZgQr5OCq4D5yDnG7j9x2L0U= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0 h1:iLvW/zOkHGU3BDU5thWnj+UZ9pjhuVhv1loLj7yVtBw= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0/go.mod h1:Fn3gvhdF1x5Rs9nUoCy/fJT1ms8f8dO7RqM9lJHuazQ= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.1/go.mod h1:GeUru+8VzrTXV/83XyMJ80KpH8xO89VPoUileyNQ+tc= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1/go.mod h1:l9ymW25HOqymeU2m1gbUQ3rUIsTwKs8gYHXkqDQUhiI= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 h1:6+lZi2JeGKtCraAj1rpoZfKqnQ9SptseRZioejfUOLM= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0/go.mod h1:eb3gfbVIxIoGgJsi9pGne19dhCBpK6opTYpQqAmdy44= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.3/go.mod h1:Seb8KNmD6kVTjwRjVEgOT5hPin6sq+v4C2ycJQDwuH8= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.3/go.mod h1:R+/S1O4TYpcktbVwddeOYg+uwUfLhADP2S/x4QwsCTM= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0 h1:qGyLBQPphYzUf+IIlb5tHnvg1U2Vc5hXPcP7oRSQfy0= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0/go.mod h1:g+dzKSLXiR/8ATkPXmLhPOI6rDdjLP3tngeo3FvDcIw= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.3/go.mod h1:wlY6SVjuwvh3TVRpTqdy4I1JpBFLX4UGeKZdWntaocw= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.3/go.mod h1:Owv1I59vaghv1Ax8zz8ELY8DN7/Y0rGS+WWAmjgi950= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0 h1:eRhU3Sh8dGbaniI6B+I48XJMrTPRkK4DKo+vqIxziOU= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0/go.mod h1:paNLV18DZ6FnWE/bd06RIKPDIFpjuvCkGKWTG/GDBeM= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.3/go.mod h1:Bm/v2IaN6rZ+Op7zX+bOUMdL4fsrYZiD0dsjLhNKwZc= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.3/go.mod h1:KZgs2ny8HsxRIRbDwgvJcHHBZPOzQr/+NtGwnP+w2ec= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0 h1:6jusT+XCcvnD+Elxvm7bUf5sCMTpZEp3AKjYQ4tWJSo= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0/go.mod h1:LimGpdIF/sTBdgqwOEkrArXLCoTamK/9L9x8IKBFTIc= -github.com/aws/aws-sdk-go-v2/service/kms v1.16.3/go.mod h1:QuiHPBqlOFCi4LqdSskYYAWpQlx3PKmohy+rE2F+o5g= -github.com/aws/aws-sdk-go-v2/service/s3 v1.26.3/go.mod h1:g1qvDuRsJY+XghsV6zg00Z4KJ7DtFFCx8fJD2a491Ak= -github.com/aws/aws-sdk-go-v2/service/s3 v1.43.0/go.mod h1:NXRKkiRF+erX2hnybnVU660cYT5/KChRD4iUgJ97cI8= -github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0 h1:gAV4NEp4A+JOrIdoXkAeyy6IOo7+X2s/jRuaHKYiMaU= -github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0/go.mod h1:JIQwK8sZ5MuKGm5rrFwp9MHUcyYEsQNpVixuPDlnwaU= -github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.15.4/go.mod h1:PJc8s+lxyU8rrre0/4a0pn2wgwiDvOEzoOjcJUBr67o= -github.com/aws/aws-sdk-go-v2/service/sns v1.17.4/go.mod h1:kElt+uCcXxcqFyc+bQqZPFD9DME/eC6oHBXvFzQ9Bcw= -github.com/aws/aws-sdk-go-v2/service/sqs v1.18.3/go.mod h1:skmQo0UPvsjsuYYSYMVmrPc1HWCbHUJyrCEp+ZaLzqM= -github.com/aws/aws-sdk-go-v2/service/ssm v1.24.1/go.mod h1:NR/xoKjdbRJ+qx0pMR4mI+N/H1I1ynHwXnO6FowXJc0= -github.com/aws/aws-sdk-go-v2/service/sso v1.11.3/go.mod h1:7UQ/e69kU7LDPtY40OyoHYgRmgfGM4mgsLYtcObdveU= -github.com/aws/aws-sdk-go-v2/service/sso v1.17.2/go.mod h1:/pE21vno3q1h4bbhUOEi+6Zu/aT26UK2WKkDXd+TssQ= -github.com/aws/aws-sdk-go-v2/service/sso v1.26.0 h1:cuFWHH87GP1NBGXXfMicUbE7Oty5KpPxN6w4JpmuxYc= -github.com/aws/aws-sdk-go-v2/service/sso v1.26.0/go.mod h1:aJBemdlbCKyOXEXdXBqS7E+8S9XTDcOTaoOjtng54hA= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.20.0/go.mod h1:dWqm5G767qwKPuayKfzm4rjzFmVjiBFbOJrpSPnAMDs= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0 h1:t2va+wewPOYIqC6XyJ4MGjiGKkczMAPsgq5W4FtL9ME= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0/go.mod h1:ExCTcqYqN0hYYRsDlBVU8+68grqlWdgX9/nZJwQW4aY= -github.com/aws/aws-sdk-go-v2/service/sts v1.16.3/go.mod h1:bfBj0iVmsUyUg4weDB4NxktD9rDGeKSVWnjTnwbx9b8= -github.com/aws/aws-sdk-go-v2/service/sts v1.25.3/go.mod h1:4EqRHDCKP78hq3zOnmFXu5k0j4bXbRFfCh/zQ6KnEfQ= -github.com/aws/aws-sdk-go-v2/service/sts v1.35.0 h1:FD9agdG4CeOGS3ORLByJk56YIXDS7mxFpmZyCtpqExc= -github.com/aws/aws-sdk-go-v2/service/sts v1.35.0/go.mod h1:NDzDPbBF1xtSTZUMuZx0w3hIfWzcL7X2AQ0Tr9becIQ= -github.com/aws/smithy-go v1.11.2/go.mod h1:3xHYmszWVx2c0kIwQeEVf9uSm4fYZt67FBJnwub1bgM= -github.com/aws/smithy-go v1.17.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= -github.com/aws/smithy-go v1.22.5 h1:P9ATCXPMb2mPjYBgueqJNCA5S9UfktsW0tTxi+a7eqw= -github.com/aws/smithy-go v1.22.5/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/bobg/gcsobj v0.1.2/go.mod h1:vS49EQ1A1Ib8FgrL58C8xXYZyOCR2TgzAdopy6/ipa8= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -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/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/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= -github.com/colinmarc/hdfs/v2 v2.1.1/go.mod h1:M3x+k8UKKmxtFu++uAZ0OtDU8jR3jnaZIAc6yK4Ue0c= -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/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU= -github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= -github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= -github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= -github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= -github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/duckdb/duckdb-go-bindings v0.1.16 h1:XPCk9hzP06PoWIxDPVU3gAy0m1XmLaZHTzLggNx/U9k= -github.com/duckdb/duckdb-go-bindings v0.1.16/go.mod h1:pBnfviMzANT/9hi4bg+zW4ykRZZPCXlVuvBWEcZofkc= -github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11 h1:GXQkG4HmEbwPtqCSabJTp9wZQQ7Gqr3KveLNesQWQOs= -github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11/go.mod h1:Ezo7IbAfB8NP7CqPIN8XEHKUg5xdRRQhcPPlCXImXYA= -github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11 h1:ATJMSBIDA/YAm/6CKeBDRtGK1OOwqfTZbWg9Y5fAc9E= -github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11/go.mod h1:eS7m/mLnPQgVF4za1+xTyorKRBuK0/BA44Oy6DgrGXI= -github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11 h1:AjvnGst1avyOECYiykthyHR4DTYTaqNDPr5W/0t5j0k= -github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11/go.mod h1:1GOuk1PixiESxLaCGFhag+oFi7aP+9W8byymRAvunBk= -github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11 h1:j3B1biawuhtxe2Chkiqcwf1Kxe8VJc8lLVmjBIcJrkI= -github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11/go.mod h1:o7crKMpT2eOIi5/FY6HPqaXcvieeLSqdXXaXbruGX7w= -github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11 h1:xR3vRE8y+48U6xDNkUlOfbl7/OTA7FVcDXJ+5vETuHU= -github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11/go.mod h1:IlOhJdVKUJCAPj3QsDszUo8DVdvp1nBFp4TUJVdw99s= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -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/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= -github.com/gin-gonic/gin v1.7.3/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= -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-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= -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-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= -github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-viper/mapstructure/v2 v2.3.0 h1:27XbWsHIqhbdR5TIC911OfYvgSaW93HM+dX7970Q7jk= -github.com/go-viper/mapstructure/v2 v2.3.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= -github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= -github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.4.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= -github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188/go.mod h1:vXjM/+wXQnTPR4KqTKDgJukSZ6amVRtWMPEjE6sQoK8= -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/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/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -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.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= -github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -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/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/flatbuffers v25.2.10+incompatible h1:F3vclr7C3HpB1k9mxCGRMXq6FdUalZ6H/pNX4FP1v0Q= -github.com/google/flatbuffers v25.2.10+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -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.6/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.8/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/go-replayers/grpcreplay v1.1.0/go.mod h1:qzAvJ8/wi57zq7gWqaE6AwLM6miiXUQwP1S+I9icmhk= -github.com/google/go-replayers/httpreplay v1.1.1/go.mod h1:gN9GeLIs7l6NUoVaSSnv2RiqK1NiwAmD0MrKeC9IIks= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+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/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -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-20200905233945-acf8798be1f7/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-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210506205249-923b5ab0fc1a/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.2.0/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.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= -github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/wire v0.5.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU= -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.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hanwen/go-fuse v1.0.0/go.mod h1:unqXarDXqzAk0rt98O2tVndEPIpUgLD9+rwFisZH3Ok= -github.com/hanwen/go-fuse/v2 v2.1.0/go.mod h1:oRyA5eK+pvJyv5otpO/DgccS8y/RvYMaO00GgRLGryc= -github.com/hashicorp/go-uuid v0.0.0-20180228145832-27454136f036/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -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/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/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.11.0/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= -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/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.2.0/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-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= -github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/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.10.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.15.0/go.mod h1:D/zyOyXiaM1TmVWnOM18p0xdDtdakRBa0RsVGI3U3bw= -github.com/jackc/pgx/v5 v5.7.5 h1:JHGfMnQY+IEtGM63d+NGMjoRpysB2JBwDr5fsngwmJs= -github.com/jackc/pgx/v5 v5.7.5/go.mod h1:aruU7o91Tc2q2cFp5h4uP3f6ztExVpyVv88Xl/8Vl8M= -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.2.1 h1:gI8os0wpRXFd4FiAY2dWiqRK037tjj3t7rKFeO4X5iw= -github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= -github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= -github.com/jcmturner/gofork v0.0.0-20180107083740-2aebee971930/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= -github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= -github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -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/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= -github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= -github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.13.1/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= -github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= -github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= -github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= -github.com/klauspost/cpuid/v2 v2.2.11 h1:0OwqZRYI2rFrjS4kvkDnqJkKHdHaRnCm68/DY4OxRzU= -github.com/klauspost/cpuid/v2 v2.2.11/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= -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/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -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/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -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.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/linkedin/goavro v2.1.0+incompatible h1:DV2aUlj2xZiuxQyvag8Dy7zjY69ENjS66bWkSfdpddY= -github.com/linkedin/goavro v2.1.0+incompatible/go.mod h1:bBCwI2eGYpUI/4820s67MElg9tdeLbINjLjiM2xZFYM= -github.com/marcboeker/go-duckdb/arrowmapping v0.0.9 h1:xj+kFOqR2gH3Mcxx9LmAVHebSnCiPm303N+uxfkWVmY= -github.com/marcboeker/go-duckdb/arrowmapping v0.0.9/go.mod h1:o56AqVS90v5bpxhPnOK9La7AfNTOrMORiqTQrlRbdPQ= -github.com/marcboeker/go-duckdb/mapping v0.0.10 h1:b/y2W8/hNlD0Dwjq0mCqIlLXpjQMnWy0WqDV9b9lHQQ= -github.com/marcboeker/go-duckdb/mapping v0.0.10/go.mod h1:Ro6Tw6sGG50O8S0daZsA8TrQJz/DvGrzGvMD7Jihirw= -github.com/marcboeker/go-duckdb/v2 v2.3.2 h1:96zG2JPyIhCFjHdBjjSpOdhzJzehoGTdl7LskkuMUTs= -github.com/marcboeker/go-duckdb/v2 v2.3.2/go.mod h1:VeXz9ZM6klNvICHrXEUzaHSgNqBeTdyMxr4CICw/UaY= -github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= -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.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs= -github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= -github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI= -github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= -github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= -github.com/minio/minio-go/v7 v7.0.34/go.mod h1:nCrRzjoSUQh8hgKKtu3Y708OLvRLtuASMg2/nvmbarw= -github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= -github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= -github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= -github.com/ncw/swift v1.0.52/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -github.com/pborman/getopt v0.0.0-20180729010549-6fdd0a2c7117/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= -github.com/pierrec/lz4/v4 v4.1.8/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= -github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= -github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= -github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= -github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -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/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -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/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.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -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/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -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.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -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.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/xitongsys/parquet-go v1.5.1/go.mod h1:xUxwM8ELydxh4edHGegYq1pA8NnMKDx0K/GyB0o2bww= -github.com/xitongsys/parquet-go v1.6.2 h1:MhCaXii4eqceKPu9BwrjLqyK10oX9WF+xGhwvwbw7xM= -github.com/xitongsys/parquet-go v1.6.2/go.mod h1:IulAQyalCm0rPiZVNnCgm/PCL64X2tdSVGMQ/UeKqWA= -github.com/xitongsys/parquet-go-source v0.0.0-20190524061010-2b72cbee77d5/go.mod h1:xxCx7Wpym/3QCo6JhujJX51dzSXrwmb0oH6FQb39SEA= -github.com/xitongsys/parquet-go-source v0.0.0-20200817004010-026bad9b25d0/go.mod h1:HYhIKsdns7xz80OgkbgJYrtQY7FjHWHKH6cvN7+czGE= -github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b h1:zbb5qM/t3N+O33Vp5sFyG6yIcWZV1q7rfEjJM8UsRBQ= -github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b/go.mod h1:2ActxmJ4q17Cdruar9nKEkzKSOL1Ol03737Bkz10rTY= -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.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= -github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= -github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= -github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= -github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= -go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0= -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.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -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/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -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.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= -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.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= -gocloud.dev v0.26.0/go.mod h1:mkUgejbnbLotorqDyvedJO20XcZNTynmSeVSQS9btVg= -golang.org/x/crypto v0.0.0-20180723164146-c126467f60eb/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -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-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/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-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-20211115234514-b4de73f9ece8/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220511200225-c6db032c6c88/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= -golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= -golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= -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-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= -golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= -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/lint v0.0.0-20210508222113-6edffad5e616/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.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w= -golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= -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-20191112182307-2180aed22343/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-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -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-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211020060615-d418f374d309/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220401154927-543a649e0bdd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -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.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -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.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -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-20210220032951-036812b2e83c/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.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= -golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= -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-20191112214154-59a1497f0cea/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-20200828194041-157a740278f4/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-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/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-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/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-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220204135822-1c1b9b1eba6a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220330033206-e17cdc41300f/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-20220704084225-05e143d24a9e/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.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= -golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -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/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -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.5/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.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= -golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= -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/time v0.0.0-20211116232009-f0f3c7e86c11/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220224211638-0e9765cccd65/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-20190422233926-fe54fb35175b/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-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-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-20200828161849-5deb26317202/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20200915173823-2db8f0ff891c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20200918232735-d647fc253266/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -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.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo= -golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg= -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= -golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= -golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= -gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= -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.31.0/go.mod h1:CL+9IBCa2WWU6gRuBWaKqGWLFFwbEUXkfeMkHLQWYWo= -google.golang.org/api v0.32.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -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.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.46.0/go.mod h1:ceL4oozhkAiTID8XMmJBsIxID/9wMXJVVFXPg4ylg3I= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.58.0/go.mod h1:cAbP2FsxoGVNwtgNAmmn3y5G1TWAiVYRmg4yku3lv+E= -google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.64.0/go.mod h1:931CdxA8Rm4t6zqTFGSsgwbAEZ2+GMYurbndwSimebM= -google.golang.org/api v0.66.0/go.mod h1:I1dmXYpX7HGwz/ejRxwQp2qj5bFAz93HiCU1C1oYd9M= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.68.0/go.mod h1:sOM8pTpwgflXRhz+oC8H2Dr+UcbMqkPPWNJo88Q7TH8= -google.golang.org/api v0.69.0/go.mod h1:boanBiw+h5c3s+tBPgEzLDRHfFLWV0qXxRHz3ws7C80= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -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/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-20200513103714-09dca8ec2884/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-20200831141814-d751682dd103/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-20200914193844-75d14daec038/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200921151605-7abf4a1a14d5/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-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210429181445-86c259c2b4ab/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210517163617-5e0236093d7a/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210921142501-181ce0d877f6/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211018162055-cf77aa76bad2/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211223182754-3ac035c7e7cb/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220111164026-67b88f271998/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220114231437-d2e6a121cae0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220201184016-50beb8ab5c44/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220204002441-d6cc3cc0770e/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220211171837-173942840c17/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220216160803-4663080d8bc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220401170504-314d38edb7de/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -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.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -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.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= -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.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -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-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= -gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= -gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q= -gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mNfM5bm88whjWx4= -gopkg.in/jcmturner/gokrb5.v7 v7.3.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= -gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8= -gopkg.in/linkedin/goavro.v1 v1.0.5 h1:BJa69CDh0awSsLUmZ9+BowBdokpduDZSM9Zk8oKHfN4= -gopkg.in/linkedin/goavro.v1 v1.0.5/go.mod h1:Aw5GdAbizjOEl0kAMHV9iHmA8reZzW/OKuJAl4Hb9F0= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/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/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= -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= -nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= -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/src/common/iceberg_catalog.go b/src/common/iceberg_catalog.go deleted file mode 100644 index 44dd5d2..0000000 --- a/src/common/iceberg_catalog.go +++ /dev/null @@ -1,362 +0,0 @@ -package common - -import ( - "context" - "encoding/json" - "fmt" - "strings" -) - -const ( - TEMP_TABLE_SUFFIX_SYNCING = "-bemidb-syncing" - TEMP_TABLE_SUFFIX_DELETING = "-bemidb-deleting" -) - -// --------------------------------------------------------------------------------------------------------------------- - -type IcebergSchemaTable struct { - Schema string - Table string -} - -func (schemaTable IcebergSchemaTable) ToArg() string { - return schemaTable.Schema + "." + schemaTable.Table -} - -func (schemaTable IcebergSchemaTable) String() string { - return fmt.Sprintf(`"%s"."%s"`, schemaTable.Schema, schemaTable.Table) -} - -// --------------------------------------------------------------------------------------------------------------------- - -type IcebergMaterializedView struct { - Schema string - Table string - Definition string -} - -func (view IcebergMaterializedView) ToIcebergSchemaTable() IcebergSchemaTable { - return IcebergSchemaTable{ - Schema: view.Schema, - Table: view.Table, - } -} - -// --------------------------------------------------------------------------------------------------------------------- - -type IcebergCatalog struct { - Config *CommonConfig -} - -func NewIcebergCatalog(config *CommonConfig) *IcebergCatalog { - return &IcebergCatalog{ - Config: config, - } -} - -// Read ---------------------------------------------------------------------------------------------------------------- - -func (catalog *IcebergCatalog) SchemaTables() (Set[IcebergSchemaTable], error) { - pgClient := catalog.newPostgresClient() - defer pgClient.Close() - - rows, err := pgClient.Query( - context.Background(), - "SELECT table_namespace, table_name FROM iceberg_tables WHERE table_name NOT LIKE '%"+TEMP_TABLE_SUFFIX_SYNCING+"' AND table_name NOT LIKE '%"+TEMP_TABLE_SUFFIX_DELETING+"'", - ) - if err != nil { - return nil, err - } - defer rows.Close() - - schemaTables := make(Set[IcebergSchemaTable]) - for rows.Next() { - var schema, table string - err := rows.Scan(&schema, &table) - if err != nil { - return nil, err - } - schemaTables.Add(IcebergSchemaTable{Schema: schema, Table: table}) - } - return schemaTables, nil -} - -func (catalog *IcebergCatalog) MaterializedViews() ([]IcebergMaterializedView, error) { - pgClient := catalog.newPostgresClient() - defer pgClient.Close() - - rows, err := pgClient.Query( - context.Background(), - "SELECT schema_name, table_name, definition FROM iceberg_materialized_views WHERE table_name NOT LIKE '%"+TEMP_TABLE_SUFFIX_SYNCING+"' AND table_name NOT LIKE '%"+TEMP_TABLE_SUFFIX_DELETING+"'", - ) - if err != nil { - return nil, err - } - defer rows.Close() - - materializedViews := []IcebergMaterializedView{} - for rows.Next() { - var schema, table, definition string - err := rows.Scan(&schema, &table, &definition) - if err != nil { - return nil, err - } - materializedViews = append(materializedViews, IcebergMaterializedView{ - Schema: schema, - Table: table, - Definition: definition, - }) - } - return materializedViews, nil -} - -func (catalog *IcebergCatalog) MaterializedView(icebergSchemaTable IcebergSchemaTable) (IcebergMaterializedView, error) { - pgClient := catalog.newPostgresClient() - defer pgClient.Close() - - var schema, table, definition string - err := pgClient.QueryRow( - context.Background(), - "SELECT schema_name, table_name, definition FROM iceberg_materialized_views WHERE schema_name=$1 AND table_name=$2", - icebergSchemaTable.Schema, icebergSchemaTable.Table, - ).Scan(&schema, &table, &definition) - - if err != nil { - if err.Error() == "no rows in result set" { - return IcebergMaterializedView{}, fmt.Errorf("relation %s does not exist", icebergSchemaTable.String()) - } - return IcebergMaterializedView{}, err - } - - return IcebergMaterializedView{ - Schema: schema, - Table: table, - Definition: definition, - }, nil -} - -func (catalog *IcebergCatalog) MetadataFileS3Path(icebergSchemaTable IcebergSchemaTable) string { - pgClient := catalog.newPostgresClient() - defer pgClient.Close() - - var path string - err := pgClient.QueryRow( - context.Background(), - "SELECT metadata_location FROM iceberg_tables WHERE table_namespace=$1 AND table_name=$2", - icebergSchemaTable.Schema, icebergSchemaTable.Table, - ).Scan(&path) - if err != nil && err.Error() == "no rows in result set" { - return "" - } - PanicIfError(catalog.Config, err) - - return path -} - -func (catalog *IcebergCatalog) SchemaTableNames(schemaName string) Set[string] { - pgClient := catalog.newPostgresClient() - defer pgClient.Close() - - rows, err := pgClient.Query( - context.Background(), - "SELECT table_name FROM iceberg_tables WHERE table_namespace=$1 AND table_name NOT LIKE '%"+TEMP_TABLE_SUFFIX_SYNCING+"' AND table_name NOT LIKE '%"+TEMP_TABLE_SUFFIX_DELETING+"'", - schemaName, - ) - PanicIfError(catalog.Config, err) - defer rows.Close() - - tableNames := make(Set[string]) - for rows.Next() { - var table string - err := rows.Scan(&table) - PanicIfError(catalog.Config, err) - tableNames.Add(table) - } - return tableNames -} - -func (catalog *IcebergCatalog) TableColumns(icebergSchemaTable IcebergSchemaTable) ([]CatalogTableColumn, error) { - pgClient := catalog.newPostgresClient() - defer pgClient.Close() - - var columnsJson []byte - err := pgClient.QueryRow( - context.Background(), - "SELECT columns FROM iceberg_tables WHERE table_namespace=$1 AND table_name=$2", - icebergSchemaTable.Schema, icebergSchemaTable.Table, - ).Scan(&columnsJson) - if err != nil { - return nil, err - } - - var catalogTableColumns []CatalogTableColumn - err = json.Unmarshal(columnsJson, &catalogTableColumns) - if err != nil { - return nil, err - } - - return catalogTableColumns, nil -} - -func (catalog *IcebergCatalog) TableS3Path(icebergTableName IcebergSchemaTable) string { - metadataFileS3Path := catalog.MetadataFileS3Path(icebergTableName) - if metadataFileS3Path == "" { - return "" - } - - return strings.Split(metadataFileS3Path, "/metadata/")[0] -} - -// Write --------------------------------------------------------------------------------------------------------------- - -func (catalog *IcebergCatalog) CreateTable(icebergSchemaTable IcebergSchemaTable, metadataLocation string, icebergSchemaColumns []*IcebergSchemaColumn) { - pgClient := catalog.newPostgresClient() - defer pgClient.Close() - - catalogTableColumns := make([]CatalogTableColumn, len(icebergSchemaColumns)) - for i, icebergSchemaColumn := range icebergSchemaColumns { - catalogTableColumns[i] = icebergSchemaColumn.CatalogTableColumn() - } - columnsJson, err := json.Marshal(catalogTableColumns) - PanicIfError(catalog.Config, err) - - _, err = pgClient.Exec( - context.Background(), - "INSERT INTO iceberg_tables (table_namespace, table_name, metadata_location, columns) VALUES ($1, $2, $3, $4)", - icebergSchemaTable.Schema, - icebergSchemaTable.Table, - metadataLocation, - columnsJson, - ) - PanicIfError(catalog.Config, err) -} - -func (catalog *IcebergCatalog) RenameTable(oldIcebergSchemaTable IcebergSchemaTable, newIcebergTableName string) { - pgClient := catalog.newPostgresClient() - defer pgClient.Close() - - _, err := pgClient.Exec( - context.Background(), - "UPDATE iceberg_tables SET table_name=$1 WHERE table_namespace=$2 AND table_name=$3", - newIcebergTableName, - oldIcebergSchemaTable.Schema, - oldIcebergSchemaTable.Table, - ) - PanicIfError(catalog.Config, err) -} - -func (catalog *IcebergCatalog) DropTable(icebergSchemaTable IcebergSchemaTable) { - pgClient := catalog.newPostgresClient() - defer pgClient.Close() - - _, err := pgClient.Exec( - context.Background(), - "DELETE FROM iceberg_tables WHERE table_namespace=$1 AND table_name=$2", - icebergSchemaTable.Schema, - icebergSchemaTable.Table, - ) - PanicIfError(catalog.Config, err) -} - -func (catalog *IcebergCatalog) CreateMaterializedView(icebergSchemaTable IcebergSchemaTable, definition string, ifNotExists bool) error { - pgClient := catalog.newPostgresClient() - defer pgClient.Close() - - exists, err := catalog.doesMaterializedViewExist(pgClient, icebergSchemaTable) - if err != nil { - return err - } - if exists { - if ifNotExists { - return nil - } else { - return fmt.Errorf("materialized view %s already exists", icebergSchemaTable.String()) - } - } - - ctx := context.Background() - _, err = pgClient.Exec( - ctx, - "INSERT INTO iceberg_materialized_views (schema_name, table_name, definition) VALUES ($1, $2, $3)", - icebergSchemaTable.Schema, icebergSchemaTable.Table, definition, - ) - - return err -} - -func (catalog *IcebergCatalog) RenameMaterializedView(icebergSchemaTable IcebergSchemaTable, newName string, missingOk bool) error { - ctx := context.Background() - pgClient := catalog.newPostgresClient() - defer pgClient.Close() - - exists, err := catalog.doesMaterializedViewExist(pgClient, icebergSchemaTable) - if err != nil { - return err - } - if !exists { - if missingOk { - return nil - } else { - return fmt.Errorf("materialized view %s does not exist", icebergSchemaTable.String()) - } - } - - _, err = pgClient.Exec( - ctx, - "UPDATE iceberg_materialized_views SET table_name=$1 WHERE schema_name=$2 AND table_name=$3", - newName, icebergSchemaTable.Schema, icebergSchemaTable.Table, - ) - - return err -} - -func (catalog *IcebergCatalog) DropMaterializedView(icebergSchemaTable IcebergSchemaTable, missingOk bool) error { - ctx := context.Background() - - pgClient := catalog.newPostgresClient() - defer pgClient.Close() - - exists, err := catalog.doesMaterializedViewExist(pgClient, icebergSchemaTable) - if err != nil { - return err - } - if !exists { - if missingOk { - return nil - } else { - return fmt.Errorf("materialized view %s does not exist", icebergSchemaTable.String()) - } - } - - _, err = pgClient.Exec( - ctx, - "DELETE FROM iceberg_materialized_views WHERE schema_name=$1 AND table_name=$2", - icebergSchemaTable.Schema, icebergSchemaTable.Table, - ) - - return err -} - -func (catalog *IcebergCatalog) doesMaterializedViewExist(pgClient *PostgresClient, icebergSchemaTable IcebergSchemaTable) (bool, error) { - var exists bool - err := pgClient.QueryRow( - context.Background(), - "SELECT TRUE FROM iceberg_materialized_views WHERE schema_name=$1 AND table_name=$2", - icebergSchemaTable.Schema, icebergSchemaTable.Table, - ).Scan(&exists) - - if err != nil { - if err.Error() == "no rows in result set" { - return false, nil - } else { - return false, fmt.Errorf("error checking materialized view existence: %w", err) - } - } - return exists, nil -} - -// --------------------------------------------------------------------------------------------------------------------- - -func (catalog *IcebergCatalog) newPostgresClient() *PostgresClient { - return NewPostgresClient(catalog.Config, catalog.Config.CatalogDatabaseUrl) -} diff --git a/src/common/iceberg_schema_column.go b/src/common/iceberg_schema_column.go deleted file mode 100644 index 63969f9..0000000 --- a/src/common/iceberg_schema_column.go +++ /dev/null @@ -1,503 +0,0 @@ -package common - -import ( - "encoding/csv" - "encoding/json" - "fmt" - "math" - "math/big" - "reflect" - "strings" - "time" - - "github.com/marcboeker/go-duckdb/v2" -) - -type IcebergColumnType string -type IcebergLogicalColumnType string - -const ( - IcebergColumnTypeBoolean IcebergColumnType = "boolean" - IcebergColumnTypeString IcebergColumnType = "string" - IcebergColumnTypeInteger IcebergColumnType = "int" - IcebergColumnTypeDecimal IcebergColumnType = "decimal" - IcebergColumnTypeLong IcebergColumnType = "long" - IcebergColumnTypeFloat IcebergColumnType = "float" - IcebergColumnTypeDouble IcebergColumnType = "double" - IcebergColumnTypeDate IcebergColumnType = "date" - IcebergColumnTypeTime IcebergColumnType = "time" - IcebergColumnTypeTimeTz IcebergColumnType = "timetz" - IcebergColumnTypeTimestamp IcebergColumnType = "timestamp" - IcebergColumnTypeBinary IcebergColumnType = "binary" - - IcebergLogicalColumnTypeInterval IcebergLogicalColumnType = "interval" - IcebergLogicalColumnTypeBpchar IcebergLogicalColumnType = "bpchar" - IcebergLogicalColumnTypePoint IcebergLogicalColumnType = "point" - IcebergLogicalColumnTypeJson IcebergLogicalColumnType = "json" - IcebergLogicalColumnTypeUserDefined IcebergLogicalColumnType = "user_defined" - - BEMIDB_NULL_STRING = "BEMIDB_NULL" - - PARQUET_NAN = 0 // DuckDB crashes on NaN, libc++abi: terminating due to uncaught exception of type duckdb::InvalidConfigurationException: {"exception_type":"Invalid Configuration","exception_message":"Column float4_column lower bound deserialization failed: Failed to deserialize blob '' of size 0, attempting to produce value of type 'FLOAT'"} - PARQUET_MAX_DECIMAL_PRECISION = 38 - PARQUET_FALLBACK_DECIMAL_SCALE = 6 - PARQUET_NESTED_FIELD_ID_PREFIX = 1000 - - EMBEDDING_COLUMN_NAME = "_bemi_embedding" - EMBEDDING_COLUMN_LENGTH = "1536" -) - -type CatalogTableColumn struct { - Name string `json:"name"` - Type string `json:"type"` - Position int `json:"position"` - List bool `json:"list"` - Required bool `json:"required"` -} - -func (tableColumn CatalogTableColumn) ToSql() string { - if tableColumn.Name == EMBEDDING_COLUMN_NAME { - return `"` + EMBEDDING_COLUMN_NAME + `" ` + `FLOAT[` + EMBEDDING_COLUMN_LENGTH + `]` - } - - sql := fmt.Sprintf(`"%s" %s`, tableColumn.Name, tableColumn.Type) - - if tableColumn.List { - sql += "[]" - } - - if tableColumn.Required { - sql += " NOT NULL" - } - - return sql -} - -func (tableColumn CatalogTableColumn) ToMetadataFieldMap() map[string]interface{} { - primitiveType := tableColumn.Type - if primitiveType == "json" { - primitiveType = "string" - } - - result := map[string]interface{}{ - "id": tableColumn.Position, - "name": tableColumn.Name, - "type": primitiveType, - "required": tableColumn.Required, - } - - if tableColumn.List { - result["type"] = map[string]interface{}{ - "type": "list", - "element": primitiveType, - "element-id": PARQUET_NESTED_FIELD_ID_PREFIX + tableColumn.Position, - "element-required": false, - } - } - - return result -} - -// --------------------------------------------------------------------------------------------------------------------- - -type IcebergSchemaColumn struct { - Config *CommonConfig - ColumnName string - ColumnType IcebergColumnType - LogicalColumnType IcebergLogicalColumnType - Position int - NumericPrecision int - NumericScale int - DatetimePrecision int - IsList bool - IsRequired bool - IsPartOfUniqueIndex bool -} - -func (col *IcebergSchemaColumn) NormalizedColumnName() string { - return strings.ReplaceAll(col.ColumnName, ",", "_") // Parquet doesn't allow commas in column names -} - -func (col *IcebergSchemaColumn) QuotedColumnName() string { - return `"` + col.NormalizedColumnName() + `"` -} - -func (col *IcebergSchemaColumn) NormalizedPrecision() int { - if col.NumericPrecision > PARQUET_MAX_DECIMAL_PRECISION || col.NumericPrecision == 0 { - return PARQUET_MAX_DECIMAL_PRECISION - } - return col.NumericPrecision -} - -func (col *IcebergSchemaColumn) NormalizedScale() int { - if col.NumericPrecision == 0 { - return PARQUET_FALLBACK_DECIMAL_SCALE - } - return col.NumericScale -} - -func (col *IcebergSchemaColumn) CatalogTableColumn() CatalogTableColumn { - catalogTableColumn := CatalogTableColumn{ - Name: col.NormalizedColumnName(), - Position: col.Position, - Required: col.IsRequired, - List: col.IsList, - } - - switch col.ColumnType { - case IcebergColumnTypeBoolean: - catalogTableColumn.Type = "boolean" - case IcebergColumnTypeString: - switch col.LogicalColumnType { - case IcebergLogicalColumnTypeJson: - catalogTableColumn.Type = "json" - default: - catalogTableColumn.Type = "string" - } - case IcebergColumnTypeInteger: - catalogTableColumn.Type = "int" - case IcebergColumnTypeDecimal: - catalogTableColumn.Type = "decimal(" + IntToString(col.NormalizedPrecision()) + ", " + IntToString(col.NormalizedScale()) + ")" - case IcebergColumnTypeLong: - catalogTableColumn.Type = "long" - case IcebergColumnTypeFloat: - catalogTableColumn.Type = "float" - case IcebergColumnTypeDouble: - catalogTableColumn.Type = "double" - case IcebergColumnTypeDate: - catalogTableColumn.Type = "date" - case IcebergColumnTypeTime, IcebergColumnTypeTimeTz: - catalogTableColumn.Type = "time" - case IcebergColumnTypeTimestamp: - catalogTableColumn.Type = "timestamp" - case IcebergColumnTypeBinary: - catalogTableColumn.Type = "binary" - default: - panic("Unsupported column type: " + string(col.ColumnType)) - } - - return catalogTableColumn -} - -func (col *IcebergSchemaColumn) DuckdbType() string { - var duckdbType string - switch col.ColumnType { - case IcebergColumnTypeBoolean: - duckdbType = "BOOLEAN" - case IcebergColumnTypeString: - duckdbType = "VARCHAR" - case IcebergColumnTypeInteger: - duckdbType = "INTEGER" - case IcebergColumnTypeLong: - duckdbType = "BIGINT" - case IcebergColumnTypeDecimal: - duckdbType = "DECIMAL(" + IntToString(col.NormalizedPrecision()) + ", " + IntToString(col.NormalizedScale()) + ")" - case IcebergColumnTypeFloat: - duckdbType = "FLOAT" - case IcebergColumnTypeDouble: - duckdbType = "DOUBLE" - case IcebergColumnTypeDate: - duckdbType = "DATE" - case IcebergColumnTypeTime, IcebergColumnTypeTimeTz: - duckdbType = "TIME" - case IcebergColumnTypeTimestamp: - duckdbType = "TIMESTAMP" - case IcebergColumnTypeBinary: - duckdbType = "BLOB" - default: - panic("Unsupported column type for DuckDB: " + string(col.ColumnType)) - } - - if col.IsList { - return duckdbType + "[]" - } - return duckdbType -} - -func (col *IcebergSchemaColumn) DuckdbValueFromCsv(value string) interface{} { - if value == BEMIDB_NULL_STRING { - return nil - } - - if col.IsList { - var values []interface{} - - csvString := strings.TrimPrefix(value, "{") - csvString = strings.TrimSuffix(csvString, "}") - if csvString == "" { - return values - } - - csvString = strings.ReplaceAll(csvString, "\\\"", "\"\"") // Replace escaped double quotes with double quotes according to CSV format rules - csvReader := csv.NewReader(strings.NewReader(csvString)) - stringValues, err := csvReader.Read() - PanicIfError(col.Config, err) - - for _, stringValue := range stringValues { - primitiveValue := col.duckdbPrimitiveValueFromCsv(stringValue) - values = append(values, primitiveValue) - } - return values - } - - return col.duckdbPrimitiveValueFromCsv(value) -} - -func (col *IcebergSchemaColumn) DuckdbValueFromJson(value any) interface{} { - if value == nil { - return nil - } - - if col.IsList { - var values []interface{} - for _, itemValue := range value.([]any) { - primitiveValue := col.duckdbPrimitiveValueFromJson(itemValue) - values = append(values, primitiveValue) - } - return values - } - - return col.duckdbPrimitiveValueFromJson(value) -} - -func (col *IcebergSchemaColumn) duckdbPrimitiveValueFromCsv(value string) interface{} { - switch col.ColumnType { - case IcebergColumnTypeBoolean: - return value == "t" - case IcebergColumnTypeString: - return value - case IcebergColumnTypeBinary: - return []byte(value) - case IcebergColumnTypeInteger: - return int32(StringToInt(value)) - case IcebergColumnTypeLong: - return StringToInt64(value) - case IcebergColumnTypeFloat: - valueFloat := StringToFloat64(value) - if math.IsNaN(valueFloat) { - return PARQUET_NAN - } - return float32(valueFloat) - case IcebergColumnTypeDouble: - valueFloat := StringToFloat64(value) - if math.IsNaN(valueFloat) { - return PARQUET_NAN - } - return valueFloat - case IcebergColumnTypeDecimal: - switch col.LogicalColumnType { - case IcebergLogicalColumnTypeInterval: - microseconds := 0 - - parts := strings.Split(value, " ") - for i, part := range parts { - if strings.HasPrefix(part, "year") { - Panic(col.Config, "Year intervals are not supported yet") - } else if strings.HasPrefix(part, "mon") { - months := StringToInt(parts[i-1]) - microseconds += months * 30_437_500 * 24 * 60 * 60 // Approximation: 30.4375 days per month - } else if strings.HasPrefix(part, "day") { - days := StringToInt(parts[i-1]) - microseconds += days * 24 * 60 * 60 * 1_000_000 - } else if strings.Contains(part, ":") { - timeParts := strings.Split(part, ":") - hours := StringToInt(timeParts[0]) - minutes := StringToInt(timeParts[1]) - secondsParts := strings.Split(timeParts[2], ".") - seconds := StringToInt(secondsParts[0]) - microseconds += (hours * 60 * 60 * 1_000_000) + (minutes * 60 * 1_000_000) + (seconds * 1_000_000) - if len(secondsParts) > 1 && len(secondsParts[1]) == 6 { - microseconds += StringToInt(secondsParts[1]) - } - } - } - valueMicrosecondsString := IntToString(microseconds) - return col.duckdbDecimal(valueMicrosecondsString) - default: - return col.duckdbDecimal(value) - } - case IcebergColumnTypeDate: - return StringDateToTime(value) - case IcebergColumnTypeTime: - parsedTime, err := time.Parse("15:04:05.999999", value) - PanicIfError(col.Config, err) - return parsedTime - case IcebergColumnTypeTimeTz: - parsedTime, err := time.Parse("15:04:05.999999-07", value) - PanicIfError(col.Config, err) - return parsedTime - case IcebergColumnTypeTimestamp: - parsedTimestamp, err := time.Parse("2006-01-02 15:04:05.999999", value) - if err != nil { - parsedTimestamp, err = time.Parse("2006-01-02 15:04:05.999999-07:00", value) - if err != nil { - parsedTimestamp, err = time.Parse("2006-01-02 15:04:05.999999-07", value) - PanicIfError(col.Config, err) - } - } - return parsedTimestamp - } - - panic("Unsupported value: " + value + " for column type: " + string(col.ColumnType)) -} - -func (col *IcebergSchemaColumn) duckdbPrimitiveValueFromJson(value any) interface{} { - kind := reflect.TypeOf(value).Kind() - - switch col.ColumnType { - case IcebergColumnTypeInteger, - IcebergColumnTypeLong, - IcebergColumnTypeFloat, - IcebergColumnTypeDouble: - switch kind { - case reflect.Bool: - if value.(bool) { - return 1 - } else { - return 0 - } - case reflect.String: - if value.(string) == "NaN" { - return PARQUET_NAN - } - default: - return value - } - case IcebergColumnTypeDecimal: - valueString := Float64ToString(value.(float64)) - return col.duckdbDecimal(valueString) - case IcebergColumnTypeBinary: - return []byte("\\x" + value.(string)) - case IcebergColumnTypeBoolean: - switch kind { - case reflect.String: - return value.(string) == "true" - default: - return value - } - case IcebergColumnTypeString: - switch col.LogicalColumnType { - case IcebergLogicalColumnTypeBpchar: - return strings.TrimRight(value.(string), " ") - case IcebergLogicalColumnTypePoint: - valueMap := value.(map[string]interface{}) - return "(" + Float64ToString(valueMap["x"].(float64)) + "," + Float64ToString(valueMap["y"].(float64)) + ")" - case IcebergLogicalColumnTypeUserDefined: - valueString := value.(string) - valueDecodedHex, err := HexToString(valueString) - if err == nil { - return valueDecodedHex - } else { - return valueString - } - } - - switch kind { - case reflect.Map: - jsonBytes, err := json.Marshal(value) - PanicIfError(col.Config, err) - return string(jsonBytes) - case reflect.Float64: - return Float64ToString(value.(float64)) - default: - return value - } - case IcebergColumnTypeDate: - switch kind { - case reflect.String: - valueString := value.(string) - if valueString == "" { - return nil - } - return StringDateToTime(valueString) - case reflect.Float64: - days := value.(float64) - return time.Unix(0, 0).UTC().AddDate(0, 0, int(days)) - default: - Panic(col.Config, fmt.Sprintf("Unsupported value: %v for column type: %s", value, col.ColumnType)) - } - case IcebergColumnTypeTime: - var nanoseconds int64 - if col.DatetimePrecision == 6 { - nanoseconds = int64(value.(float64)) * 1_000 - } else { - nanoseconds = int64(value.(float64)) * 1_000_000 - } - valueTime := time.Unix(0, nanoseconds).UTC() - return valueTime - case IcebergColumnTypeTimeTz: - valueString := value.(string) - if valueString == "" { - return nil - } - if strings.HasSuffix(valueString, "Z") { - valueString = strings.TrimSuffix(valueString, "Z") + "-00" - } - parsedTime, err := time.Parse("15:04:05.999999-07", valueString) - PanicIfError(col.Config, err) - return parsedTime - case IcebergColumnTypeTimestamp: - switch kind { - case reflect.String: - valueString := value.(string) - if valueString == "" { - return nil - } - valueString = strings.Replace(valueString, " ", "T", 1) // Amplitude - valueString = strings.TrimSuffix(valueString, "Z") - parsedTimestamp, err := time.Parse("2006-01-02T15:04:05.999999", valueString) - if err != nil { - parsedTimestamp, err = time.Parse("2006-01-02T15:04:05.999999-07:00", valueString) - if err != nil { - parsedTimestamp, err = time.Parse("2006-01-02T15:04:05.999999-07", valueString) - PanicIfError(col.Config, err) - } - } - return parsedTimestamp - case reflect.Float64: - valueFloat := value.(float64) - epoch := time.Unix(0, 0).UTC() - if col.DatetimePrecision == 6 { - microseconds := int64(valueFloat) - return epoch.Add(time.Duration(microseconds) * time.Microsecond) - } - milliseconds := int64(valueFloat) - return epoch.Add(time.Duration(milliseconds) * time.Millisecond) - default: - Panic(col.Config, fmt.Sprintf("Unsupported value: %v for column type: %s", value, col.ColumnType)) - } - } - - panic(fmt.Sprintf("Unsupported value: %v for column type: %s", value, col.ColumnType)) -} - -func (col *IcebergSchemaColumn) duckdbDecimal(value string) duckdb.Decimal { - scale := col.NormalizedScale() - parts := strings.Split(value, ".") - integerPart := parts[0] - - // Pad fractional part with zeros if necessary - var fractionalPart string - if len(parts) == 1 { - fractionalPart = strings.Repeat("0", scale) - } else { - fractionalPart = parts[1] - if len(fractionalPart) < scale { - fractionalPart += strings.Repeat("0", scale-len(fractionalPart)) - } - } - decimalValue := new(big.Int) - - if len(integerPart)+len(fractionalPart) > PARQUET_MAX_DECIMAL_PRECISION { - integerPart = strings.Repeat("9", PARQUET_MAX_DECIMAL_PRECISION-len(fractionalPart)) - LogWarn(col.Config, "Truncating decimal value", value, "to", integerPart+"."+fractionalPart, "in column", col.ColumnName, "to fit precision", IntToString(PARQUET_MAX_DECIMAL_PRECISION)) - } - - decimalValue.SetString(integerPart+fractionalPart, 10) - - return duckdb.Decimal{ - Width: uint8(col.NormalizedPrecision()), - Scale: uint8(scale), - Value: decimalValue, - } -} diff --git a/src/common/iceberg_table.go b/src/common/iceberg_table.go deleted file mode 100644 index 838e118..0000000 --- a/src/common/iceberg_table.go +++ /dev/null @@ -1,117 +0,0 @@ -package common - -import ( - "context" - - "github.com/google/uuid" -) - -type IcebergTable struct { - Config *CommonConfig - IcebergSchemaTable IcebergSchemaTable - IcebergCatalog *IcebergCatalog - StorageS3 *StorageS3 - DuckdbClient *DuckdbClient -} - -type CursorValue struct { - ColumnName string - StringValue string - OverrideAppendedRows bool // Override rows that have the same value as this cursor value (if new rows are added with the same value, they will be included in the next sync) -} - -func NewIcebergTable(config *CommonConfig, storageS3 *StorageS3, duckdbClient *DuckdbClient, icebergSchemaTable IcebergSchemaTable) *IcebergTable { - return &IcebergTable{ - Config: config, - IcebergSchemaTable: icebergSchemaTable, - IcebergCatalog: NewIcebergCatalog(config), - StorageS3: storageS3, - DuckdbClient: duckdbClient, - } -} - -func (table *IcebergTable) String() string { - return table.IcebergSchemaTable.String() -} - -func (table *IcebergTable) MetadataFileS3Path() string { - return table.IcebergCatalog.MetadataFileS3Path(table.IcebergSchemaTable) -} - -func (table *IcebergTable) Create(tableS3Path string, icebergSchemaColumns []*IcebergSchemaColumn) { - LogInfo(table.Config, "Creating Iceberg table:", table.IcebergSchemaTable.Table) - table.IcebergCatalog.CreateTable(table.IcebergSchemaTable, tableS3Path+"/metadata/"+ICEBERG_METADATA_INITIAL_FILE_NAME, icebergSchemaColumns) -} - -func (table *IcebergTable) ReplaceWith(callbackFunc func(syncingIcebergTable *IcebergTable)) { - originalTableName := table.IcebergSchemaTable.Table - - // Delete -syncing table - syncingIcebergSchemaTable := IcebergSchemaTable{Schema: table.IcebergSchemaTable.Schema, Table: originalTableName + TEMP_TABLE_SUFFIX_SYNCING} - syncingIcebergTable := NewIcebergTable(table.Config, table.StorageS3, table.DuckdbClient, syncingIcebergSchemaTable) - syncingIcebergTable.DropIfExists() - - // Insert into -syncing table - callbackFunc(syncingIcebergTable) - - // Delete -deleting table - deletingIcebergSchemaTable := IcebergSchemaTable{Schema: table.IcebergSchemaTable.Schema, Table: originalTableName + TEMP_TABLE_SUFFIX_DELETING} - deletingIcebergTable := NewIcebergTable(table.Config, table.StorageS3, table.DuckdbClient, deletingIcebergSchemaTable) - deletingIcebergTable.DropIfExists() - - // Rename table to -deleting - table.Rename(deletingIcebergSchemaTable.Table) - - // Rename -syncing to table - syncingIcebergTable.Rename(originalTableName) - - // Delete -deleting table - deletingIcebergTable.DropIfExists() -} - -func (table *IcebergTable) DropIfExists() { - tableS3Path := table.IcebergCatalog.TableS3Path(table.IcebergSchemaTable) - if tableS3Path == "" { - return - } - - LogInfo(table.Config, "Deleting Iceberg table:", table.IcebergSchemaTable.Table) - table.StorageS3.DeleteTableFiles(tableS3Path) - table.IcebergCatalog.DropTable(table.IcebergSchemaTable) -} - -func (table *IcebergTable) Rename(newName string) { - LogInfo(table.Config, "Renaming Iceberg table from", table.IcebergSchemaTable.Table, "to", newName) - table.IcebergCatalog.RenameTable(table.IcebergSchemaTable, newName) - table.IcebergSchemaTable.Table = newName -} - -func (table *IcebergTable) GenerateTableS3Path() string { - return "s3://" + table.Config.Aws.S3Bucket + "/iceberg/" + table.IcebergSchemaTable.Schema + "/" + table.IcebergSchemaTable.Table + "-" + uuid.New().String() -} - -func (table *IcebergTable) LastCursorValue(columnName string) CursorValue { - if columnName == "" { - Panic(table.Config, "Couldn't find cursor column for table "+table.IcebergSchemaTable.Table) - } - - metadataFileS3Path := table.MetadataFileS3Path() - if metadataFileS3Path == "" { - LogDebug(table.Config, "No S3 table path found for Iceberg table:", table.IcebergSchemaTable.Table) - return CursorValue{ColumnName: columnName} - } - - row := table.DuckdbClient.QueryRowContext( - context.Background(), - `SELECT COALESCE(CAST(max("`+columnName+`") AS VARCHAR), '') FROM iceberg_scan('`+metadataFileS3Path+`')`, - ) - if row == nil { - return CursorValue{ColumnName: columnName} - } - - var lastCursorValue string - err := row.Scan(&lastCursorValue) - PanicIfError(table.Config, err) - - return CursorValue{ColumnName: columnName, StringValue: lastCursorValue} -} diff --git a/src/common/iceberg_table_writer.go b/src/common/iceberg_table_writer.go deleted file mode 100644 index 493fa24..0000000 --- a/src/common/iceberg_table_writer.go +++ /dev/null @@ -1,707 +0,0 @@ -package common - -import ( - "context" - "database/sql/driver" - "encoding/csv" - "io" - "sort" - "strings" - - "github.com/google/uuid" -) - -const ( - MAX_LOAD_BATCH_SIZE = 1024 * 1024 * 1024 // 1 GB - MAX_PARQUET_FILE_SIZE = 100 * 1024 * 1024 // 100 MB -) - -type IcebergTableWriter struct { - Config *CommonConfig - StorageS3 *StorageS3 - DuckdbClient *DuckdbClient - IcebergTable *IcebergTable - IcebergSchemaColumns []*IcebergSchemaColumn - CompressionFactor int64 -} - -func NewIcebergTableWriter( - config *CommonConfig, - storageS3 *StorageS3, - duckdbClient *DuckdbClient, - icebergTable *IcebergTable, - icebergSchemaColumns []*IcebergSchemaColumn, - compressionFactor int64, -) *IcebergTableWriter { - return &IcebergTableWriter{ - Config: config, - StorageS3: storageS3, - DuckdbClient: duckdbClient, - IcebergTable: icebergTable, - IcebergSchemaColumns: icebergSchemaColumns, - CompressionFactor: compressionFactor, - } -} - -// Public functions ---------------------------------------------------------------------------------------------------- - -func (writer *IcebergTableWriter) InsertFromCsvCappedBuffer(cappedBuffer *CappedBuffer) { - csvReader := csv.NewReader(cappedBuffer) - _, err := csvReader.Read() // Read the header row - PanicIfError(writer.Config, err) - - writer.insertRows(func(duckdbTableName string, loadedSize int64) (int64, bool) { - return writer.loadCsvRows(duckdbTableName, csvReader, loadedSize) - }) -} - -func (writer *IcebergTableWriter) AppendFromCsvCappedBuffer(cursorValue CursorValue, cappedBuffer *CappedBuffer) { - metadataFileS3Path := writer.IcebergTable.MetadataFileS3Path() - if metadataFileS3Path == "" { // If the table does not exist, insert for the first time - writer.InsertFromCsvCappedBuffer(cappedBuffer) - return - } - - csvReader := csv.NewReader(cappedBuffer) - _, err := csvReader.Read() // Read the header row - PanicIfError(writer.Config, err) - - writer.appendRows(metadataFileS3Path, cursorValue, func(duckdbTableName string, loadedSize int64) (int64, bool) { - return writer.loadCsvRows(duckdbTableName, csvReader, loadedSize) - }) -} - -func (writer *IcebergTableWriter) InsertFromJsonCappedBuffer(cappedBuffer *CappedBuffer) { - jsonQueueReader := NewJsonQueueReader(cappedBuffer) - - writer.insertRows(func(duckdbTableName string, loadedSize int64) (int64, bool) { - return writer.loadJsonRows(duckdbTableName, jsonQueueReader, loadedSize) - }) -} - -func (writer *IcebergTableWriter) AppendFromJsonCappedBuffer(cursorValue CursorValue, cappedBuffer *CappedBuffer) { - metadataFileS3Path := writer.IcebergTable.MetadataFileS3Path() - if metadataFileS3Path == "" { // If the table does not exist, insert for the first time - writer.InsertFromJsonCappedBuffer(cappedBuffer) - return - } - - jsonQueueReader := NewJsonQueueReader(cappedBuffer) - - writer.appendRows(metadataFileS3Path, cursorValue, func(duckdbTableName string, loadedSize int64) (int64, bool) { - return writer.loadJsonRows(duckdbTableName, jsonQueueReader, loadedSize) - }) -} - -func (writer *IcebergTableWriter) UpdateFromJsonCappedBuffer(cappedBuffer *CappedBuffer) { - metadataFileS3Path := writer.IcebergTable.MetadataFileS3Path() - if metadataFileS3Path == "" { // If the table does not exist, insert for the first time - writer.InsertFromJsonCappedBuffer(cappedBuffer) - return - } - - jsonQueueReader := NewJsonQueueReader(cappedBuffer) - - uniqueIndexColumnNames := writer.UniqueIndexColumnNames() - writer.updateRows(metadataFileS3Path, uniqueIndexColumnNames, func(duckdbTableName string, loadedSize int64) (int64, bool) { - return writer.loadJsonRows(duckdbTableName, jsonQueueReader, loadedSize) - }) -} - -func (writer *IcebergTableWriter) DeleteFromJsonCappedBuffer(cappedBuffer *CappedBuffer) { - metadataFileS3Path := writer.IcebergTable.MetadataFileS3Path() - if metadataFileS3Path == "" { // If the table does not exist, do nothing - return - } - - jsonQueueReader := NewJsonQueueReader(cappedBuffer) - - uniqueIndexColumnNames := writer.UniqueIndexColumnNames() - writer.deleteRows(metadataFileS3Path, uniqueIndexColumnNames, func(duckdbTableName string, loadedSize int64) (int64, bool) { - return writer.loadJsonRows(duckdbTableName, jsonQueueReader, loadedSize) - }) -} - -func (writer *IcebergTableWriter) UniqueIndexColumnNames() []string { - uniqueIndexColumnNames := []string{} - for _, icebergSchemaColumn := range writer.IcebergSchemaColumns { - if icebergSchemaColumn.IsPartOfUniqueIndex { - uniqueIndexColumnNames = append(uniqueIndexColumnNames, icebergSchemaColumn.ColumnName) - } - } - return uniqueIndexColumnNames -} - -func (writer *IcebergTableWriter) InsertFromQuery(query string) error { - tableS3Path := writer.IcebergTable.GenerateTableS3Path() - dataS3Path := tableS3Path + "/data" - metadataS3Path := tableS3Path + "/metadata" - - tempDuckdbTableName := "temp_" + strings.ReplaceAll(uuid.New().String(), "-", "") - - loadedRowCount, icebergSchemaColumns, err := writer.insertToDuckdbTableFromQuery(tempDuckdbTableName, query) - defer writer.deleteTempDuckdbTable(tempDuckdbTableName) - if err != nil { - return err - } - - // Create parquet - parquetFile := writer.StorageS3.CreateParquet(dataS3Path, writer.DuckdbClient, tempDuckdbTableName, icebergSchemaColumns, loadedRowCount) - parquetFilesSortedAsc := []ParquetFile{parquetFile} - totalDataFileSize := parquetFile.Size - - // Create manifest - manifestFile := writer.StorageS3.CreateManifest(metadataS3Path, parquetFilesSortedAsc) - - // Create manifest list - manifestListItem := ManifestListItem{SequenceNumber: len(parquetFilesSortedAsc) + 1, ManifestFile: manifestFile} - manifestListFile := writer.StorageS3.CreateManifestList(metadataS3Path, totalDataFileSize, []ManifestListItem{manifestListItem}) - - // Create metadata - writer.StorageS3.CreateMetadata(metadataS3Path, icebergSchemaColumns, []ManifestListFile{manifestListFile}) - LogInfo(writer.Config, "Written", parquetFile.RecordCount, "records in Parquet file #"+IntToString(len(parquetFilesSortedAsc)), "("+writer.formattedParquetFileSize(parquetFile.Size)+")") - - // Create as table - writer.IcebergTable.Create(tableS3Path, icebergSchemaColumns) - - return nil -} - -// Iceberg logic ------------------------------------------------------------------------------------------------------- - -func (writer *IcebergTableWriter) insertRows(loadRowsToDuckdbTableFunc func(duckdbTableName string, loadedSize int64) (loadedRowCount int64, reachedEnd bool)) { - tableS3Path := writer.IcebergTable.GenerateTableS3Path() - dataS3Path := tableS3Path + "/data" - metadataS3Path := tableS3Path + "/metadata" - - var totalDataFileSize int64 - parquetFilesSortedAsc := []ParquetFile{} - objectsToDeleteKeys := []string{} - - var manifestFile ManifestFile - var manifestListFile ManifestListFile - for { - tempDuckdbTableName := writer.createTempDuckdbTable() - defer writer.deleteTempDuckdbTable(tempDuckdbTableName) - - loadedRowCount, reachedEnd := loadRowsToDuckdbTableFunc(tempDuckdbTableName, 0) - if loadedRowCount == 0 && len(parquetFilesSortedAsc) > 0 { - break - } - - // Create parquet - parquetFile := writer.StorageS3.CreateParquet(dataS3Path, writer.DuckdbClient, tempDuckdbTableName, writer.IcebergSchemaColumns, loadedRowCount) - parquetFilesSortedAsc = append(parquetFilesSortedAsc, parquetFile) - totalDataFileSize += parquetFile.Size - - // Replace manifest - if manifestFile.Key != "" { - objectsToDeleteKeys = append(objectsToDeleteKeys, manifestFile.Key) - } - manifestFile = writer.StorageS3.CreateManifest(metadataS3Path, parquetFilesSortedAsc) - - // Replace manifest list - if manifestListFile.Key != "" { - objectsToDeleteKeys = append(objectsToDeleteKeys, manifestListFile.Key) - } - manifestListItem := ManifestListItem{SequenceNumber: len(parquetFilesSortedAsc) + 1, ManifestFile: manifestFile} - manifestListFile = writer.StorageS3.CreateManifestList(metadataS3Path, totalDataFileSize, []ManifestListItem{manifestListItem}) - - // Create metadata - writer.StorageS3.CreateMetadata(metadataS3Path, writer.IcebergSchemaColumns, []ManifestListFile{manifestListFile}) - LogInfo(writer.Config, "Written", parquetFile.RecordCount, "records in Parquet file #"+IntToString(len(parquetFilesSortedAsc)), "("+writer.formattedParquetFileSize(parquetFile.Size)+")") - - // Create table - if len(parquetFilesSortedAsc) == 1 { - writer.IcebergTable.Create(tableS3Path, writer.IcebergSchemaColumns) - } - - // Delete old files - writer.deleteObjects(objectsToDeleteKeys) - objectsToDeleteKeys = []string{} - - if reachedEnd { - break - } - } -} - -func (writer *IcebergTableWriter) appendRows(metadataFileS3Path string, cursorValue CursorValue, loadRowsToDuckdbTableFunc func(duckdbTableName string, loadedSize int64) (loadedRowCount int64, reachedEnd bool)) { - tableS3Path := strings.Split(metadataFileS3Path, "/metadata/")[0] - metadataS3Path := tableS3Path + "/metadata" - dataS3Path := tableS3Path + "/data" - - existingManifestListFile := writer.StorageS3.LastManifestListFile(metadataFileS3Path) - existingManifestListItem := writer.StorageS3.ManifestListItems(existingManifestListFile)[0] - existingParquetFilesSortedAsc := writer.StorageS3.ParquetFiles(existingManifestListItem.ManifestFile, writer.IcebergSchemaColumns) - lastParquetFile := existingParquetFilesSortedAsc[len(existingParquetFilesSortedAsc)-1] - replaceLastExistingParquetFile := lastParquetFile.Size < MAX_PARQUET_FILE_SIZE - - objectsToDeleteKeys := []string{} - parquetFilesSortedAsc := existingParquetFilesSortedAsc - if replaceLastExistingParquetFile { - objectsToDeleteKeys = append(objectsToDeleteKeys, lastParquetFile.Key) - parquetFilesSortedAsc = existingParquetFilesSortedAsc[:len(existingParquetFilesSortedAsc)-1] // Remove last file from the list - } - var totalDataFileSize int64 - for _, parquetFile := range parquetFilesSortedAsc { - totalDataFileSize += parquetFile.Size - } - var newParquetFileCount int - - for { - tempDuckdbTableName := writer.createTempDuckdbTable() - defer writer.deleteTempDuckdbTable(tempDuckdbTableName) - - var initialLoadedSize int64 - var initialLoadedRowCount int64 - if newParquetFileCount == 0 && replaceLastExistingParquetFile { - initialLoadedRowCount = writer.insertToDuckdbTableFromParquet(tempDuckdbTableName, lastParquetFile.Path, cursorValue) - initialLoadedSize = lastParquetFile.Size * (MAX_LOAD_BATCH_SIZE * writer.CompressionFactor / MAX_PARQUET_FILE_SIZE) - } - - loadedRowCount, reachedEnd := loadRowsToDuckdbTableFunc(tempDuckdbTableName, initialLoadedSize) - if loadedRowCount == 0 { - if newParquetFileCount == 0 { - return // no rows to append in the first batch - } else { - break // no more rows to append - } - } else if loadedRowCount == 1 && cursorValue.OverrideAppendedRows && cursorValue.StringValue != "" && newParquetFileCount == 0 { - return // exit if there is a single row to append with OverrideAppendedRows (to avoid overriding the pulled cursor value) - } - - // Create parquet - newParquetFile := writer.StorageS3.CreateParquet(dataS3Path, writer.DuckdbClient, tempDuckdbTableName, writer.IcebergSchemaColumns, initialLoadedRowCount+loadedRowCount) - parquetFilesSortedAsc = append(parquetFilesSortedAsc, newParquetFile) - newParquetFileCount++ - totalDataFileSize += newParquetFile.Size - LogInfo(writer.Config, "Written", newParquetFile.RecordCount, "records in Parquet file #"+IntToString(newParquetFileCount), "("+writer.formattedParquetFileSize(newParquetFile.Size)+")") - - if reachedEnd { - break - } - } - - // Replace manifest - objectsToDeleteKeys = append(objectsToDeleteKeys, existingManifestListItem.ManifestFile.Key) - manifestFile := writer.StorageS3.CreateManifest(metadataS3Path, parquetFilesSortedAsc) - - // Replace manifest list - objectsToDeleteKeys = append(objectsToDeleteKeys, existingManifestListFile.Key) - manifestListItem := ManifestListItem{SequenceNumber: len(parquetFilesSortedAsc) + 1, ManifestFile: manifestFile} - manifestListFile := writer.StorageS3.CreateManifestList(metadataS3Path, totalDataFileSize, []ManifestListItem{manifestListItem}) - - // Create metadata - writer.StorageS3.CreateMetadata(metadataS3Path, writer.IcebergSchemaColumns, []ManifestListFile{manifestListFile}) - - // Delete old files - writer.deleteObjects(objectsToDeleteKeys) -} - -func (writer *IcebergTableWriter) updateRows(metadataFileS3Path string, uniqueIndexColumnNames []string, loadRowsToDuckdbTableFunc func(duckdbTableName string, loadedSize int64) (loadedRowCount int64, reachedEnd bool)) { - tableS3Path := strings.Split(metadataFileS3Path, "/metadata/")[0] - metadataS3Path := tableS3Path + "/metadata" - dataS3Path := tableS3Path + "/data" - - existingManifestListFile := writer.StorageS3.LastManifestListFile(metadataFileS3Path) - existingManifestListItem := writer.StorageS3.ManifestListItems(existingManifestListFile)[0] - existingParquetFilesSortedAsc := writer.StorageS3.ParquetFiles(existingManifestListItem.ManifestFile, writer.IcebergSchemaColumns) - - objectsToDeleteKeys := []string{} - parquetFilesSortedAsc := existingParquetFilesSortedAsc - for { - tempUpdatedRowsDuckdbTableName := writer.createTempDuckdbTable() - defer writer.deleteTempDuckdbTable(tempUpdatedRowsDuckdbTableName) - - loadedRowCount, reachedEnd := loadRowsToDuckdbTableFunc(tempUpdatedRowsDuckdbTableName, 0) - if loadedRowCount == 0 { - if len(objectsToDeleteKeys) == 0 { - return // no rows to update in the first batch - } else { - break // no more rows to update - } - } - - for i, parquetFile := range parquetFilesSortedAsc { - if !writer.hasOverlappingRowsInParquet(tempUpdatedRowsDuckdbTableName, parquetFile.Path, uniqueIndexColumnNames) { - continue - } - - tempDuckdbTableName := writer.createTempDuckdbTable() - defer writer.deleteTempDuckdbTable(tempDuckdbTableName) - - var loadedRowCount int64 - loadedRowCount += writer.insertToDuckdbTableFromParquetWithoutOverlappingDuckdbTableRows(tempDuckdbTableName, tempUpdatedRowsDuckdbTableName, parquetFile.Path, uniqueIndexColumnNames) - loadedRowCount += writer.insertToDuckdbTableFromDuckdbTableThatOverlapWithParquetRows(tempDuckdbTableName, tempUpdatedRowsDuckdbTableName, parquetFile.Path, uniqueIndexColumnNames) - - // Create parquet - newParquetFile := writer.StorageS3.CreateParquet(dataS3Path, writer.DuckdbClient, tempDuckdbTableName, writer.IcebergSchemaColumns, loadedRowCount) - LogInfo(writer.Config, "Written", newParquetFile.RecordCount, "records in 'updated' Parquet file ("+writer.formattedParquetFileSize(newParquetFile.Size)+")") - - // Replace the old Parquet file with the new one - parquetFilesSortedAsc[i] = newParquetFile - objectsToDeleteKeys = append(objectsToDeleteKeys, parquetFile.Key) - } - - if reachedEnd { - break - } - } - - if len(objectsToDeleteKeys) == 0 { - return // no overlapping rows found - } - - // Replace manifest - objectsToDeleteKeys = append(objectsToDeleteKeys, existingManifestListItem.ManifestFile.Key) - manifestFile := writer.StorageS3.CreateManifest(metadataS3Path, parquetFilesSortedAsc) - - // Replace manifest list - objectsToDeleteKeys = append(objectsToDeleteKeys, existingManifestListFile.Key) - var totalDataFileSize int64 - for _, parquetFile := range parquetFilesSortedAsc { - totalDataFileSize += parquetFile.Size - } - manifestListItem := ManifestListItem{SequenceNumber: len(parquetFilesSortedAsc) + 1, ManifestFile: manifestFile} - manifestListFile := writer.StorageS3.CreateManifestList(metadataS3Path, totalDataFileSize, []ManifestListItem{manifestListItem}) - - // Create metadata - writer.StorageS3.CreateMetadata(metadataS3Path, writer.IcebergSchemaColumns, []ManifestListFile{manifestListFile}) - - // Delete old files - writer.deleteObjects(objectsToDeleteKeys) -} - -func (writer *IcebergTableWriter) deleteRows(metadataFileS3Path string, uniqueIndexColumnNames []string, loadRowsToDuckdbTableFunc func(duckdbTableName string, loadedSize int64) (loadedRowCount int64, reachedEnd bool)) { - tableS3Path := strings.Split(metadataFileS3Path, "/metadata/")[0] - metadataS3Path := tableS3Path + "/metadata" - dataS3Path := tableS3Path + "/data" - - existingManifestListFile := writer.StorageS3.LastManifestListFile(metadataFileS3Path) - existingManifestListItem := writer.StorageS3.ManifestListItems(existingManifestListFile)[0] - existingParquetFilesSortedAsc := writer.StorageS3.ParquetFiles(existingManifestListItem.ManifestFile, writer.IcebergSchemaColumns) - - objectsToDeleteKeys := []string{} - parquetFilesSortedAsc := existingParquetFilesSortedAsc - for { - tempDeletedRowsDuckdbTableName := writer.createTempDuckdbTable() - defer writer.deleteTempDuckdbTable(tempDeletedRowsDuckdbTableName) - - loadedRowCount, reachedEnd := loadRowsToDuckdbTableFunc(tempDeletedRowsDuckdbTableName, 0) - if loadedRowCount == 0 { - if len(objectsToDeleteKeys) == 0 { - return // no rows to delete in the first batch - } else { - break // no more rows to delete - } - } - - for i, parquetFile := range parquetFilesSortedAsc { - if !writer.hasOverlappingRowsInParquet(tempDeletedRowsDuckdbTableName, parquetFile.Path, uniqueIndexColumnNames) { - continue - } - - tempDuckdbTableName := writer.createTempDuckdbTable() - defer writer.deleteTempDuckdbTable(tempDuckdbTableName) - - rowCount := writer.insertToDuckdbTableFromParquetWithoutOverlappingDuckdbTableRows(tempDuckdbTableName, tempDeletedRowsDuckdbTableName, parquetFile.Path, uniqueIndexColumnNames) - - // Create parquet - newParquetFile := writer.StorageS3.CreateParquet(dataS3Path, writer.DuckdbClient, tempDuckdbTableName, writer.IcebergSchemaColumns, rowCount) - LogInfo(writer.Config, "Written", newParquetFile.RecordCount, "records in 'deleted' Parquet file ("+writer.formattedParquetFileSize(newParquetFile.Size)+")") - - // Replace the old Parquet file with the new one - parquetFilesSortedAsc[i] = newParquetFile - objectsToDeleteKeys = append(objectsToDeleteKeys, parquetFile.Key) - } - - if reachedEnd { - break - } - } - - if len(objectsToDeleteKeys) == 0 { - return // no overlapping rows found - } - - // Replace manifest - objectsToDeleteKeys = append(objectsToDeleteKeys, existingManifestListItem.ManifestFile.Key) - manifestFile := writer.StorageS3.CreateManifest(metadataS3Path, parquetFilesSortedAsc) - - // Replace manifest list - objectsToDeleteKeys = append(objectsToDeleteKeys, existingManifestListFile.Key) - var totalDataFileSize int64 - for _, parquetFile := range parquetFilesSortedAsc { - totalDataFileSize += parquetFile.Size - } - manifestListItem := ManifestListItem{SequenceNumber: len(parquetFilesSortedAsc) + 1, ManifestFile: manifestFile} - manifestListFile := writer.StorageS3.CreateManifestList(metadataS3Path, totalDataFileSize, []ManifestListItem{manifestListItem}) - - // Create metadata - writer.StorageS3.CreateMetadata(metadataS3Path, writer.IcebergSchemaColumns, []ManifestListFile{manifestListFile}) - - // Delete old files - writer.deleteObjects(objectsToDeleteKeys) -} - -// DuckDB -------------------------------------------------------------------------------------------------------------- - -func (writer *IcebergTableWriter) createTempDuckdbTable() string { - tableName := "temp_" + strings.ReplaceAll(uuid.New().String(), "-", "") - columnSchemas := make([]string, len(writer.IcebergSchemaColumns)) - for i, col := range writer.IcebergSchemaColumns { - columnSchemas[i] = col.QuotedColumnName() + " " + col.DuckdbType() - } - - _, err := writer.DuckdbClient.ExecContext(context.Background(), "CREATE TABLE "+tableName+"("+strings.Join(columnSchemas, ",")+")") - PanicIfError(writer.Config, err) - - return tableName -} - -func (writer *IcebergTableWriter) hasOverlappingRowsInParquet(duckdbTableName string, parquetFileS3Path string, uniqueIndexColumnNames []string) bool { - uniqueIndexConditions := make([]string, len(uniqueIndexColumnNames)) - for i, uniqueIndexColumnName := range uniqueIndexColumnNames { - uniqueIndexConditions[i] = `"` + uniqueIndexColumnName + `" IN (SELECT "` + uniqueIndexColumnName + `" FROM ` + duckdbTableName + ")" - } - countSql := "SELECT COUNT(*) FROM read_parquet('" + parquetFileS3Path + "') WHERE " + strings.Join(uniqueIndexConditions, " AND ") - - var count int - err := writer.DuckdbClient.QueryRowContext(context.Background(), countSql).Scan(&count) - PanicIfError(writer.Config, err) - return count > 0 -} - -func (writer *IcebergTableWriter) insertToDuckdbTableFromParquet(duckdbTableName string, parquetFileS3Path string, cursorValue CursorValue) int64 { - sql := "INSERT INTO " + duckdbTableName + " SELECT * FROM read_parquet('" + parquetFileS3Path + "')" - if cursorValue.OverrideAppendedRows { - // Exclude rows with the cursor value - sql += ` WHERE "` + cursorValue.ColumnName + `" != '` + cursorValue.StringValue + `'` - LogDebug(writer.Config, "Replacing last existing Parquet file excluding cursor value:", strings.Split(parquetFileS3Path, "/data/")[1]) - } else { - LogDebug(writer.Config, "Replacing last existing Parquet file:", strings.Split(parquetFileS3Path, "/data/")[1]) - } - - result, err := writer.DuckdbClient.ExecContext(context.Background(), sql) - PanicIfError(writer.Config, err) - - rowsAffected, err := result.RowsAffected() - PanicIfError(writer.Config, err) - - return rowsAffected -} - -func (writer *IcebergTableWriter) insertToDuckdbTableFromDuckdbTableThatOverlapWithParquetRows(insertDuckdbTableName string, sourceDuckdbTableName string, parquetFileS3Path string, uniqueIndexColumnNames []string) int64 { - uniqueIndexConditions := make([]string, len(uniqueIndexColumnNames)) - for i, uniqueIndexColumnName := range uniqueIndexColumnNames { - uniqueIndexConditions[i] = `"` + uniqueIndexColumnName + `" IN (SELECT "` + uniqueIndexColumnName + `" FROM read_parquet('` + parquetFileS3Path + "'))" - } - sql := "INSERT INTO " + insertDuckdbTableName + " SELECT * FROM " + sourceDuckdbTableName + " WHERE " + strings.Join(uniqueIndexConditions, " AND ") - result, err := writer.DuckdbClient.ExecContext(context.Background(), sql) - PanicIfError(writer.Config, err) - - rowsAffected, err := result.RowsAffected() - PanicIfError(writer.Config, err) - - return rowsAffected -} - -func (writer *IcebergTableWriter) insertToDuckdbTableFromParquetWithoutOverlappingDuckdbTableRows(insertDuckdbTableName string, overlappingDuckdbTableName string, parquetFileS3Path string, uniqueIndexColumnNames []string) int64 { - uniqueIndexConditions := make([]string, len(uniqueIndexColumnNames)) - for i, uniqueIndexColumnName := range uniqueIndexColumnNames { - uniqueIndexConditions[i] = `"` + uniqueIndexColumnName + `" NOT IN (SELECT "` + uniqueIndexColumnName + `" FROM ` + overlappingDuckdbTableName + ")" - } - sql := "INSERT INTO " + insertDuckdbTableName + " SELECT * FROM read_parquet('" + parquetFileS3Path + "') WHERE " + strings.Join(uniqueIndexConditions, " AND ") - result, err := writer.DuckdbClient.ExecContext(context.Background(), sql) - PanicIfError(writer.Config, err) - - rowsAffected, err := result.RowsAffected() - PanicIfError(writer.Config, err) - - return rowsAffected -} - -func (writer *IcebergTableWriter) insertToDuckdbTableFromQuery(duckdbTableName string, query string) (int64, []*IcebergSchemaColumn, error) { - ctx := context.Background() - - result, err := writer.DuckdbClient.ExecContext(ctx, "CREATE TABLE "+duckdbTableName+" AS "+query) - if err != nil { - return 0, nil, err - } - - rowsAffected, err := result.RowsAffected() - if err != nil { - return 0, nil, err - } - - var icebergSchemaColumns []*IcebergSchemaColumn - rows, err := writer.DuckdbClient.QueryContext( - ctx, - `SELECT - columns.column_name, - columns.data_type, - columns.is_nullable, - columns.ordinal_position, - COALESCE(columns.numeric_precision, 0), - COALESCE(columns.numeric_scale, 0), - COALESCE(columns.datetime_precision, 0), - FROM information_schema.columns - WHERE columns.table_name = '`+duckdbTableName+`'`, - ) - if err != nil { - return 0, nil, err - } - defer rows.Close() - - for rows.Next() { - duckdbSchemaColumn := &DuckdbSchemaColumn{Config: writer.Config} - err := rows.Scan( - &duckdbSchemaColumn.ColumnName, - &duckdbSchemaColumn.DataType, - &duckdbSchemaColumn.IsNullable, - &duckdbSchemaColumn.OrdinalPosition, - &duckdbSchemaColumn.NumericPrecision, - &duckdbSchemaColumn.NumericScale, - &duckdbSchemaColumn.DatetimePrecision, - ) - if err != nil { - return 0, nil, err - } - - icebergSchemaColumns = append(icebergSchemaColumns, duckdbSchemaColumn.ToIcebergSchemaColumn()) - } - - return rowsAffected, icebergSchemaColumns, nil -} - -func (writer *IcebergTableWriter) deleteTempDuckdbTable(duckdbTableName string) { - _, err := writer.DuckdbClient.ExecContext(context.Background(), "DROP TABLE IF EXISTS "+duckdbTableName) - PanicIfError(writer.Config, err) -} - -func (writer *IcebergTableWriter) deleteObjects(keys []string) { - for _, key := range keys { - writer.deleteObject(key) - } -} - -func (writer *IcebergTableWriter) deleteObject(key string) { - var fileName string - if strings.Contains(key, "/data/") { - fileName = strings.Split(key, "/data/")[1] - } else if strings.Contains(key, "/metadata/") { - fileName = strings.Split(key, "/metadata/")[1] - } - - LogDebug(writer.Config, "Deleting object:", fileName) - writer.StorageS3.S3Client.DeleteObject(key) -} - -func (writer *IcebergTableWriter) loadCsvRows(duckdbTableName string, csvReader *csv.Reader, loadedSize int64) (loadedRowCount int64, reachedEnd bool) { - appender, err := writer.DuckdbClient.Appender("", duckdbTableName) - PanicIfError(writer.Config, err) - defer appender.Close() - - for { - row, err := csvReader.Read() - if err == io.EOF { - reachedEnd = true - break - } - PanicIfError(writer.Config, err) - - duckdbRowValues := make([]driver.Value, len(writer.IcebergSchemaColumns)) - for i, icebergSchemaColumn := range writer.IcebergSchemaColumns { - duckdbRowValues[i] = icebergSchemaColumn.DuckdbValueFromCsv(row[i]) - loadedSize += int64(len(row[i])) - } - - LogTrace(writer.Config, "DuckDB appending row values:", duckdbRowValues) - err = appender.AppendRow(duckdbRowValues...) - PanicIfError(writer.Config, err) - - loadedRowCount++ - if loadedSize >= (MAX_LOAD_BATCH_SIZE * writer.CompressionFactor) { - LogDebug(writer.Config, "Reached batch size limit") - break - } - } - - LogInfo(writer.Config, "Loaded", loadedRowCount, "rows") - return loadedRowCount, reachedEnd -} - -func (writer *IcebergTableWriter) loadJsonRows(duckdbTableName string, jsonQueueReader *JsonQueueReader, loadedSize int64) (loadedRowCount int64, reachedEnd bool) { - appender, err := writer.DuckdbClient.Appender("", duckdbTableName) - PanicIfError(writer.Config, err) - defer appender.Close() - - for { - var rowValues map[string]interface{} - valueSize, err := jsonQueueReader.Read(&rowValues) - if err == io.EOF { - reachedEnd = true - break - } - PanicIfError(writer.Config, err) - loadedSize += int64(valueSize) - - duckdbRowValues := writer.jsonToDuckdbRowValues(rowValues) - - LogTrace(writer.Config, "DuckDB appending row values:", rowValues) - err = appender.AppendRow(duckdbRowValues...) - PanicIfError(writer.Config, err) - - loadedRowCount++ - if loadedSize >= (MAX_LOAD_BATCH_SIZE * writer.CompressionFactor) { - LogDebug(writer.Config, "Reached batch size limit") - break - } - } - - LogInfo(writer.Config, "Loaded", loadedRowCount, "rows") - return loadedRowCount, reachedEnd -} - -func (writer *IcebergTableWriter) jsonToDuckdbRowValues(rowValues map[string]interface{}) []driver.Value { - // Detect row column drift - rowColumnNames := []string{} - for columnName := range rowValues { - rowColumnNames = append(rowColumnNames, columnName) - } - tableColumnNames := make([]string, len(writer.IcebergSchemaColumns)) - for i, icebergSchemaColumn := range writer.IcebergSchemaColumns { - tableColumnNames[i] = icebergSchemaColumn.ColumnName - } - if len(rowColumnNames) != len(tableColumnNames) { - Panic(writer.Config, "Row column names count doesn't match table column names count: "+strings.Join(rowColumnNames, ", ")+" (row) vs "+strings.Join(tableColumnNames, ", ")+" (table)") - } - sort.Strings(rowColumnNames) - sort.Strings(tableColumnNames) - for i := range rowColumnNames { - if rowColumnNames[i] != tableColumnNames[i] { - Panic(writer.Config, "Row column names don't match table column names: "+strings.Join(rowColumnNames, ", ")+" (row) vs "+strings.Join(tableColumnNames, ", ")+" (table)") - } - } - - // Convert row values to DuckDB values - duckdbRowValues := make([]driver.Value, len(writer.IcebergSchemaColumns)) - for i, icebergSchemaColumn := range writer.IcebergSchemaColumns { - columnName := icebergSchemaColumn.ColumnName - value := rowValues[columnName] - duckdbRowValues[i] = icebergSchemaColumn.DuckdbValueFromJson(value) - } - return duckdbRowValues -} - -func (writer *IcebergTableWriter) formattedParquetFileSize(parquetFileSize int64) string { - if parquetFileSize < 1024 { - return Int64ToString(parquetFileSize) + "B" - } else if parquetFileSize < 1024*1024 { - return Int64ToString(parquetFileSize/1024) + "KB" - } else if parquetFileSize < 1024*1024*1024 { - return Int64ToString(parquetFileSize/(1024*1024)) + "MB" - } - return Int64ToString(parquetFileSize/(1024*1024*1024)) + "GB" -} diff --git a/src/common/json_queue.go b/src/common/json_queue.go deleted file mode 100644 index 8052859..0000000 --- a/src/common/json_queue.go +++ /dev/null @@ -1,80 +0,0 @@ -package common - -import ( - "encoding/binary" - "encoding/json" - "io" -) - -type JsonQueueWriter struct { - Writer io.Writer -} - -func NewJsonQueueWriter(w io.Writer) *JsonQueueWriter { - return &JsonQueueWriter{Writer: w} -} - -func (w *JsonQueueWriter) Write(value interface{}) error { - jsonData, err := json.Marshal(value) - if err != nil { - return err - } - - lenBytes := make([]byte, 4) - binary.BigEndian.PutUint32(lenBytes, uint32(len(jsonData))) - - _, err = w.Writer.Write(lenBytes) - if err != nil { - return err - } - - _, err = w.Writer.Write(jsonData) - return err -} - -func (w *JsonQueueWriter) Close() error { - if closer, ok := w.Writer.(io.Closer); ok { - return closer.Close() - } - return nil -} - -// ------------------------------------------------------------------------------------------------- - -type JsonQueueReader struct { - Reader io.Reader -} - -func NewJsonQueueReader(r io.Reader) *JsonQueueReader { - return &JsonQueueReader{Reader: r} -} - -func (r *JsonQueueReader) Read(value interface{}) (int, error) { - lenBytes := make([]byte, 4) - _, err := io.ReadFull(r.Reader, lenBytes) - if err != nil { - return 0, err // Propagate io.EOF or any other errors - } - - length := binary.BigEndian.Uint32(lenBytes) - - jsonData := make([]byte, length) - _, err = io.ReadFull(r.Reader, jsonData) - if err != nil { - return 0, err // This will return io.ErrUnexpectedEOF if the stream is closed before the full message is read. - } - - err = json.Unmarshal(jsonData, value) - if err != nil { - return 0, err - } - - return int(length), nil -} - -func (r *JsonQueueReader) Close() error { - if closer, ok := r.Reader.(io.Closer); ok { - return closer.Close() - } - return nil -} diff --git a/src/common/json_queue_test.go b/src/common/json_queue_test.go deleted file mode 100644 index 14da512..0000000 --- a/src/common/json_queue_test.go +++ /dev/null @@ -1,36 +0,0 @@ -package common - -import ( - "testing" -) - -func TestJsonQueue(t *testing.T) { - config := &CommonConfig{ - LogLevel: "DEBUG", - } - buffer := NewCappedBuffer(config, 1024) - writer := NewJsonQueueWriter(buffer) - reader := NewJsonQueueReader(buffer) - - original := map[string]interface{}{ - "name": "test", - "value": 42, - } - err := writer.Write(original) - if err != nil { - t.Fatalf("Write failed: %v", err) - } - - var result interface{} - _, err = reader.Read(&result) - if err != nil { - t.Fatalf("Read failed: %v", err) - } - - if original["name"] != result.(map[string]interface{})["name"] { - t.Errorf("Expected name %s, got %s", original["name"], result.(map[string]interface{})["name"]) - } - if float64(original["value"].(int)) != result.(map[string]interface{})["value"].(float64) { - t.Errorf("Expected value %d, got %f", original["value"], result.(map[string]interface{})["value"]) - } -} diff --git a/src/common/postgres_client.go b/src/common/postgres_client.go deleted file mode 100644 index d1d2516..0000000 --- a/src/common/postgres_client.go +++ /dev/null @@ -1,89 +0,0 @@ -package common - -import ( - "context" - "io" - "net/url" - "strings" - "time" - - "github.com/jackc/pgx/v5" - "github.com/jackc/pgx/v5/pgconn" -) - -const ( - CONNECTION_TIMEOUT = 30 * time.Second -) - -type PostgresClient struct { - Conn *pgx.Conn - Config *CommonConfig -} - -func NewPostgresClient(config *CommonConfig, databaseUrl string) *PostgresClient { - ctx, cancel := context.WithTimeout(context.Background(), CONNECTION_TIMEOUT) - defer cancel() - - conn, err := pgx.Connect(ctx, urlEncodePassword(databaseUrl)) - PanicIfError(config, err) - - return &PostgresClient{ - Config: config, - Conn: conn, - } -} - -func (client *PostgresClient) Close() { - err := client.Conn.Close(context.Background()) - PanicIfError(client.Config, err) -} - -func (client *PostgresClient) Query(ctx context.Context, query string, args ...any) (pgx.Rows, error) { - LogDebug(client.Config, "Postgres query:", query) - return client.Conn.Query(ctx, query, args...) -} - -func (client *PostgresClient) QueryRow(ctx context.Context, query string, args ...any) pgx.Row { - LogDebug(client.Config, "Postgres query:", query) - return client.Conn.QueryRow(ctx, query, args...) -} - -func (client *PostgresClient) Exec(ctx context.Context, query string, args ...any) (pgconn.CommandTag, error) { - LogDebug(client.Config, "Postgres exec:", query) - return client.Conn.Exec(ctx, query, args...) -} - -func (client *PostgresClient) Copy(writer io.Writer, query string) (pgconn.CommandTag, error) { - LogDebug(client.Config, "Postgres copy:", query) - return client.Conn.PgConn().CopyTo(context.Background(), writer, query) -} - -// Example: -// - From postgres://username:pas$:wor^d#@host:port/database -// - To postgres://username:pas%24%3Awor%5Ed%23@host:port/database -func urlEncodePassword(pgDatabaseUrl string) string { - // No credentials - if !strings.Contains(pgDatabaseUrl, "@") { - return pgDatabaseUrl - } - - password := strings.TrimPrefix(pgDatabaseUrl, "postgresql://") - password = strings.TrimPrefix(password, "postgres://") - passwordEndIndex := strings.LastIndex(password, "@") - password = password[:passwordEndIndex] - - // Credentials without password - if !strings.Contains(password, ":") { - return pgDatabaseUrl - } - - _, password, _ = strings.Cut(password, ":") - encodedPassword := url.QueryEscape(password) - - // Password is already encoded - if encodedPassword == password { - return pgDatabaseUrl - } - - return strings.Replace(pgDatabaseUrl, ":"+password+"@", ":"+encodedPassword+"@", 1) -} diff --git a/src/common/s3_client.go b/src/common/s3_client.go deleted file mode 100644 index 524f003..0000000 --- a/src/common/s3_client.go +++ /dev/null @@ -1,128 +0,0 @@ -package common - -import ( - "context" - "os" - "strings" - - "github.com/aws/aws-sdk-go-v2/aws" - awsConfig "github.com/aws/aws-sdk-go-v2/config" - "github.com/aws/aws-sdk-go-v2/credentials" - "github.com/aws/aws-sdk-go-v2/feature/s3/manager" - "github.com/aws/aws-sdk-go-v2/service/s3" - "github.com/aws/aws-sdk-go-v2/service/s3/types" -) - -type S3Client struct { - Config *CommonConfig - S3 *s3.Client -} - -func NewS3Client(Config *CommonConfig) *S3Client { - var awsConfigOptions = []func(*awsConfig.LoadOptions) error{ - awsConfig.WithRegion(Config.Aws.Region), - } - - if Config.LogLevel == LOG_LEVEL_TRACE { - awsConfigOptions = append(awsConfigOptions, awsConfig.WithClientLogMode(aws.LogRequest)) - } - - if IsLocalHost(Config.Aws.S3Endpoint) { - awsConfigOptions = append(awsConfigOptions, awsConfig.WithBaseEndpoint("http://"+Config.Aws.S3Endpoint)) - } else { - awsConfigOptions = append(awsConfigOptions, awsConfig.WithBaseEndpoint("https://"+Config.Aws.S3Endpoint)) - } - - awsCredentials := credentials.NewStaticCredentialsProvider( - Config.Aws.AccessKeyId, - Config.Aws.SecretAccessKey, - "", - ) - awsConfigOptions = append(awsConfigOptions, awsConfig.WithCredentialsProvider(awsCredentials)) - - loadedAwsConfig, err := awsConfig.LoadDefaultConfig(context.Background(), awsConfigOptions...) - PanicIfError(Config, err) - - s3 := s3.NewFromConfig(loadedAwsConfig, func(o *s3.Options) { - if Config.Aws.S3Endpoint != DEFAULT_AWS_S3_ENDPOINT { - o.UsePathStyle = true - } - }) - - return &S3Client{ - Config: Config, - S3: s3, - } -} - -func (s3Client *S3Client) BucketS3Prefix() string { - return "s3://" + s3Client.Config.Aws.S3Bucket + "/" -} - -// s3://bucket/some/path -> some/path -func (s3Client *S3Client) ObjectKey(objectPath string) string { - return strings.TrimPrefix(objectPath, s3Client.BucketS3Prefix()) -} - -func (s3Client *S3Client) HeadObject(fileKey string) *s3.HeadObjectOutput { - output, err := s3Client.S3.HeadObject(context.Background(), &s3.HeadObjectInput{ - Bucket: aws.String(s3Client.Config.Aws.S3Bucket), - Key: aws.String(fileKey), - }) - PanicIfError(s3Client.Config, err) - - return output -} - -func (s3Client *S3Client) DeleteObject(fileKey string) { - _, err := s3Client.S3.DeleteObject(context.Background(), &s3.DeleteObjectInput{ - Bucket: aws.String(s3Client.Config.Aws.S3Bucket), - Key: aws.String(fileKey), - }) - PanicIfError(s3Client.Config, err) -} - -func (s3Client *S3Client) GetObject(fileKey string) *s3.GetObjectOutput { - getObjectOutput, err := s3Client.S3.GetObject(context.Background(), &s3.GetObjectInput{ - Bucket: aws.String(s3Client.Config.Aws.S3Bucket), - Key: aws.String(fileKey), - }) - PanicIfError(s3Client.Config, err) - return getObjectOutput -} - -func (s3Client *S3Client) UploadObject(fileKey string, file *os.File) { - uploader := manager.NewUploader(s3Client.S3) - _, err := uploader.Upload(context.Background(), &s3.PutObjectInput{ - Bucket: aws.String(s3Client.Config.Aws.S3Bucket), - Key: aws.String(fileKey), - Body: file, - }) - PanicIfError(s3Client.Config, err) -} - -func (s3Client *S3Client) ListObjects(prefix string) *s3.ListObjectsV2Output { - listObjectsOutput, err := s3Client.S3.ListObjectsV2(context.Background(), &s3.ListObjectsV2Input{ - Bucket: aws.String(s3Client.Config.Aws.S3Bucket), - Prefix: aws.String(prefix), - }) - PanicIfError(s3Client.Config, err) - - return listObjectsOutput -} - -func (s3Client *S3Client) DeleteObjects(fileKeys []*string) { - objectsToDelete := make([]types.ObjectIdentifier, len(fileKeys)) - for i, fileKey := range fileKeys { - objectsToDelete[i] = types.ObjectIdentifier{Key: fileKey} - } - - _, err := s3Client.S3.DeleteObjects(context.Background(), &s3.DeleteObjectsInput{ - Bucket: aws.String(s3Client.Config.Aws.S3Bucket), - Delete: &types.Delete{ - Objects: objectsToDelete, - Quiet: aws.Bool(true), - }, - }) - PanicIfError(s3Client.Config, err) -} diff --git a/src/common/storage_s3.go b/src/common/storage_s3.go deleted file mode 100644 index 1d6085c..0000000 --- a/src/common/storage_s3.go +++ /dev/null @@ -1,247 +0,0 @@ -package common - -import ( - "context" - "fmt" - "io" - "os" - "strings" - "time" - - "github.com/google/uuid" - "github.com/xitongsys/parquet-go-source/s3v2" -) - -const ( - UUID_LENGTH = 36 -) - -type StorageS3 struct { - S3Client *S3Client - Config *CommonConfig - StorageUtils *StorageUtils -} - -type ParquetFileStats struct { - ColumnSizes map[int]int64 - ValueCounts map[int]int64 - NullValueCounts map[int]int64 - LowerBounds map[int][]byte - UpperBounds map[int][]byte - SplitOffsets []int64 -} - -type ParquetFile struct { - Key string - Path string // With s3://bucket/ prefix - Size int64 - RecordCount int64 - Stats ParquetFileStats -} - -type ManifestFile struct { - Key string - Path string // With s3://bucket/ prefix - Size int64 - TotalRecordCount int64 - TotalDataFileCount int32 - RecordsDeleted bool -} - -type ManifestListItem struct { - SequenceNumber int - ManifestFile ManifestFile -} - -type ManifestListFile struct { - SequenceNumber int - SnapshotId int64 - TimestampMs int64 - Key string - Path string // With s3://bucket/ prefix - Operation string - TotalFilesSize int64 - TotalDataFiles int64 - TotalRecords int64 -} - -type MetadataFile struct { - Version int64 - Key string -} - -func NewStorageS3(Config *CommonConfig) *StorageS3 { - return &StorageS3{ - S3Client: NewS3Client(Config), - Config: Config, - StorageUtils: NewStorageUtils(Config), - } -} - -// Write --------------------------------------------------------------------------------------------------------------- - -func (storage *StorageS3) CreateParquet(dataS3Path string, duckdbClient *DuckdbClient, tempDuckdbTableName string, icebergSchemaColumns []*IcebergSchemaColumn, rowCount int64) ParquetFile { - ctx := context.Background() - fileName := storage.generateTimestampString() + "_" + uuid.New().String() + ".parquet" - fileS3Path := dataS3Path + "/" + fileName - fileS3Key := storage.S3Client.ObjectKey(fileS3Path) - - storage.StorageUtils.WriteParquetFile(fileS3Path, duckdbClient, tempDuckdbTableName, icebergSchemaColumns) - - headObjectOutput := storage.S3Client.HeadObject(fileS3Key) - fileSize := *headObjectOutput.ContentLength - - fileReader, err := s3v2.NewS3FileReaderWithClient(ctx, storage.S3Client.S3, storage.Config.Aws.S3Bucket, fileS3Key) - PanicIfError(storage.Config, err) - parquetStats := storage.StorageUtils.ReadParquetStats(fileReader, icebergSchemaColumns) - - return ParquetFile{ - Key: fileS3Key, - Path: dataS3Path + "/" + fileName, - Size: fileSize, - RecordCount: rowCount, - Stats: parquetStats, - } -} - -func (storage *StorageS3) CreateManifest(metadataS3Path string, parquetFilesSortedAsc []ParquetFile) (manifestFile ManifestFile) { - fileName := storage.generateTimestampString() + "_" + uuid.New().String() + "-m0.avro" - fileS3Key := storage.S3Client.ObjectKey(metadataS3Path) + "/" + fileName - - var fileSize int64 - storage.uploadTemporaryFile("manifest", fileS3Key, func(tempFile *os.File) { - var err error - fileSize, err = storage.StorageUtils.WriteManifestFile(tempFile.Name(), parquetFilesSortedAsc) - PanicIfError(storage.Config, err) - }) - LogDebug(storage.Config, "Manifest file created at:", fileS3Key) - - var totalRecordCount int64 - for _, parquetFile := range parquetFilesSortedAsc { - totalRecordCount += parquetFile.RecordCount - } - - return ManifestFile{ - Key: fileS3Key, - Path: metadataS3Path + "/" + fileName, - Size: fileSize, - TotalDataFileCount: int32(len(parquetFilesSortedAsc)), - TotalRecordCount: totalRecordCount, - RecordsDeleted: false, - } -} - -func (storage *StorageS3) CreateManifestList(metadataS3Path string, totalDataFileSize int64, manifestListItemsSortedDesc []ManifestListItem) (manifestListFile ManifestListFile) { - fileName := "snap-" + storage.generateTimestampString() + "_" + uuid.New().String() + ".avro" - fileS3Key := storage.S3Client.ObjectKey(metadataS3Path) + "/" + fileName - - storage.uploadTemporaryFile("manifest-list", fileS3Key, func(tempFile *os.File) { - var err error - manifestListFile, err = storage.StorageUtils.WriteManifestListFile(tempFile.Name(), totalDataFileSize, manifestListItemsSortedDesc) - PanicIfError(storage.Config, err) - }) - - LogDebug(storage.Config, "Manifest list file created at:", fileS3Key) - manifestListFile.Key = fileS3Key - manifestListFile.Path = metadataS3Path + "/" + fileName - return manifestListFile -} - -func (storage *StorageS3) CreateMetadata(metadataS3Path string, icebergSchemaColumns []*IcebergSchemaColumn, manifestListFilesSortedAsc []ManifestListFile) (metadataFile MetadataFile) { - fileS3Key := storage.S3Client.ObjectKey(metadataS3Path) + "/" + ICEBERG_METADATA_INITIAL_FILE_NAME - - storage.uploadTemporaryFile("metadata", fileS3Key, func(tempFile *os.File) { - tableS3Path := strings.TrimSuffix(metadataS3Path, "/metadata") - err := storage.StorageUtils.WriteMetadataFile(tableS3Path, tempFile.Name(), icebergSchemaColumns, manifestListFilesSortedAsc) - PanicIfError(storage.Config, err) - }) - - LogDebug(storage.Config, "Metadata file created at:", fileS3Key) - return MetadataFile{Version: 1, Key: fileS3Key} -} - -func (storage *StorageS3) DeleteTableFiles(tableS3Path string) { - tableS3Key := storage.S3Client.ObjectKey(tableS3Path) - storage.deleteNestedObjects(tableS3Key) -} - -// Read ---------------------------------------------------------------------------------------------------------------- - -func (storage *StorageS3) LastManifestListFile(metadataS3Path string) ManifestListFile { - metadataContent := storage.readObjectContent(metadataS3Path) - return storage.StorageUtils.ParseLastManifestListFile(storage.S3Client.BucketS3Prefix(), metadataContent) -} - -func (storage *StorageS3) ManifestListItems(manifestListFile ManifestListFile) []ManifestListItem { - manifestListContent := storage.readObjectContent(manifestListFile.Path) - return storage.StorageUtils.ParseManifestListItems(storage.S3Client.BucketS3Prefix(), manifestListContent) -} - -func (storage *StorageS3) ParquetFiles(manifestFile ManifestFile, icebergSchemaColumns []*IcebergSchemaColumn) []ParquetFile { - ctx := context.Background() - manifestContent := storage.readObjectContent(manifestFile.Path) - parquetFilesSortedAsc := storage.StorageUtils.ParseParquetFiles(manifestContent) - - for i, parquetFile := range parquetFilesSortedAsc { - fileS3Key := storage.S3Client.ObjectKey(parquetFile.Path) - - fileReader, err := s3v2.NewS3FileReaderWithClient(ctx, storage.S3Client.S3, storage.Config.Aws.S3Bucket, fileS3Key) - PanicIfError(storage.Config, err) - parquetStats := storage.StorageUtils.ReadParquetStats(fileReader, icebergSchemaColumns) - - parquetFilesSortedAsc[i].Key = fileS3Key - parquetFilesSortedAsc[i].Stats = parquetStats - } - - return parquetFilesSortedAsc -} - -// --------------------------------------------------------------------------------------------------------------------- - -func (storage *StorageS3) generateTimestampString() string { - now := time.Now() - return fmt.Sprintf("%s_%06d", now.Format("20060102_150405"), now.Nanosecond()/1000) -} - -func (storage *StorageS3) uploadTemporaryFile(tempFilePattern string, uploadFileS3Key string, writeTempFileFunc func(*os.File)) { - tempFile, err := os.CreateTemp("", tempFilePattern) - PanicIfError(storage.Config, err) - - defer func() { - os.Remove(tempFile.Name()) - }() - - writeTempFileFunc(tempFile) - - storage.S3Client.UploadObject(uploadFileS3Key, tempFile) - - err = tempFile.Close() - PanicIfError(storage.Config, err) -} - -func (storage *StorageS3) readObjectContent(fileS3Path string) []byte { - fileS3Key := storage.S3Client.ObjectKey(fileS3Path) - getObjectResponse := storage.S3Client.GetObject(fileS3Key) - - fileContent, err := io.ReadAll(getObjectResponse.Body) - PanicIfError(storage.Config, err) - - return fileContent -} - -func (storage *StorageS3) deleteNestedObjects(prefixS3Key string) { - listResponse := storage.S3Client.ListObjects(prefixS3Key) - - var fileS3Keys []*string - for _, obj := range listResponse.Contents { - LogDebug(storage.Config, "Object to delete:", *obj.Key) - fileS3Keys = append(fileS3Keys, obj.Key) - } - - if len(fileS3Keys) > 0 { - storage.S3Client.DeleteObjects(fileS3Keys) - LogDebug(storage.Config, "Deleted", len(fileS3Keys), "object(s).") - } else { - LogDebug(storage.Config, "No objects to delete.") - } -} diff --git a/src/common/storage_utils.go b/src/common/storage_utils.go deleted file mode 100644 index cd9eb2a..0000000 --- a/src/common/storage_utils.go +++ /dev/null @@ -1,898 +0,0 @@ -package common - -import ( - "bytes" - "context" - "encoding/json" - "fmt" - "os" - "strings" - "time" - - "github.com/google/uuid" - "github.com/linkedin/goavro" - "github.com/xitongsys/parquet-go/reader" - "github.com/xitongsys/parquet-go/source" -) - -const ( - ICEBERG_MANIFEST_STATUS_EXISTING = 0 - ICEBERG_MANIFEST_STATUS_ADDED = 1 - ICEBERG_MANIFEST_STATUS_DELETED = 2 - - ICEBERG_MANIFEST_LIST_OPERATION_REPLACE = "replace" - ICEBERG_MANIFEST_LIST_OPERATION_APPEND = "append" - ICEBERG_MANIFEST_LIST_OPERATION_OVERWRITE = "overwrite" - ICEBERG_MANIFEST_LIST_OPERATION_DELETE = "delete" - - ICEBERG_METADATA_INITIAL_FILE_NAME = "v1.metadata.json" -) - -type MetadataJson struct { - Schemas []struct { - Fields []struct { - ID int `json:"id"` - Name string `json:"name"` - Type interface{} `json:"type"` - Required bool `json:"required"` - } `json:"fields"` - } `json:"schemas"` -} - -type ManifestListsJson struct { - Snapshots []struct { - SequenceNumber int `json:"sequence-number"` - SnapshotId int64 `json:"snapshot-id"` - TimestampMs int64 `json:"timestamp-ms"` - Path string `json:"manifest-list"` - Summary struct { - Operation string `json:"operation"` - TotalDataFiles string `json:"total-data-files"` - TotalFilesSize string `json:"total-files-size"` - TotalRecords string `json:"total-records"` - } `json:"summary"` - } `json:"snapshots"` -} - -type ManifestListSequenceStats struct { - TotalFilesSize int64 - TotalDataFiles int64 - TotalRecords int64 -} - -type StorageUtils struct { - Config *CommonConfig -} - -func NewStorageUtils(config *CommonConfig) *StorageUtils { - return &StorageUtils{ - Config: config, - } -} - -// Write --------------------------------------------------------------------------------------------------------------- - -func (utils *StorageUtils) WriteParquetFile(fileS3Path string, duckdbClient *DuckdbClient, tempDuckdbTableName string, icebergSchemaColumns []*IcebergSchemaColumn) { - fieldIds := make([]string, len(icebergSchemaColumns)) - for i, col := range icebergSchemaColumns { - if col.IsList { - fieldIds[i] = col.QuotedColumnName() + ":{__duckdb_field_id: " + IntToString(col.Position) + ", element: " + IntToString(PARQUET_NESTED_FIELD_ID_PREFIX+col.Position) + "}" - } else { - fieldIds[i] = col.QuotedColumnName() + ":" + IntToString(col.Position) - } - } - - copyQuery := "COPY " + tempDuckdbTableName + " TO '$fileS3Path' (FORMAT PARQUET, COMPRESSION 'ZSTD', FIELD_IDS {$fieldIds})" - _, err := duckdbClient.ExecContext(context.Background(), copyQuery, map[string]string{ - "fileS3Path": fileS3Path, - "fieldIds": strings.Join(fieldIds, ","), - }) - PanicIfError(utils.Config, err) -} - -func (utils *StorageUtils) ReadParquetStats(fileReader source.ParquetFile, icebergSchemaColumns []*IcebergSchemaColumn) (parquetStats ParquetFileStats) { - defer fileReader.Close() - - pr, err := reader.NewParquetReader(fileReader, nil, 1) - PanicIfError(utils.Config, err) - defer pr.ReadStop() - - parquetStats = ParquetFileStats{ - ColumnSizes: make(map[int]int64), - ValueCounts: make(map[int]int64), - NullValueCounts: make(map[int]int64), - LowerBounds: make(map[int][]byte), - UpperBounds: make(map[int][]byte), - SplitOffsets: []int64{}, - } - - stringColumnNames := NewSet[string]() - fieldIdByColumnName := make(map[string]int) - for _, column := range icebergSchemaColumns { - columnName := strings.ToLower(column.NormalizedColumnName()) - - if column.IsList { - fieldIdByColumnName[columnName] = PARQUET_NESTED_FIELD_ID_PREFIX + column.Position - } else { - fieldIdByColumnName[columnName] = column.Position - } - - if column.ColumnType == IcebergColumnTypeString { - stringColumnNames.Add(columnName) - } - } - - for _, rowGroup := range pr.Footer.RowGroups { - if rowGroup.FileOffset != nil { - parquetStats.SplitOffsets = append(parquetStats.SplitOffsets, *rowGroup.FileOffset) - } - - for _, columnChunk := range rowGroup.Columns { - columnMetaData := columnChunk.MetaData - columnName := strings.ToLower(columnMetaData.PathInSchema[0]) // Parquet column names look like Timemscolumn instead of timeMsColumn - fieldId, ok := fieldIdByColumnName[columnName] - if !ok { - continue - } - parquetStats.ColumnSizes[fieldId] += columnMetaData.TotalCompressedSize - parquetStats.ValueCounts[fieldId] += int64(columnMetaData.NumValues) - if columnMetaData.Statistics != nil && columnMetaData.Statistics.NullCount != nil { - parquetStats.NullValueCounts[fieldId] += *columnMetaData.Statistics.NullCount - } else { - parquetStats.NullValueCounts[fieldId] += 0 - } - - if columnMetaData.Statistics != nil && fieldId <= PARQUET_NESTED_FIELD_ID_PREFIX { // Not a nested field - minValue := columnMetaData.Statistics.Min - maxValue := columnMetaData.Statistics.Max - - // Ignore empty values for non-string columns - if (stringColumnNames.Contains(columnName) || len(minValue) > 0) && (parquetStats.LowerBounds[fieldId] == nil || bytes.Compare(parquetStats.LowerBounds[fieldId], minValue) > 0) { - parquetStats.LowerBounds[fieldId] = minValue - } - if (stringColumnNames.Contains(columnName) || len(maxValue) > 0) && (parquetStats.UpperBounds[fieldId] == nil || bytes.Compare(parquetStats.UpperBounds[fieldId], maxValue) < 0) { - parquetStats.UpperBounds[fieldId] = maxValue - } - } - } - } - - return parquetStats -} -func (utils *StorageUtils) WriteManifestFile(filePath string, parquetFilesSortedAsc []ParquetFile) (int64, error) { - manifestEntries := make([]map[string]interface{}, len(parquetFilesSortedAsc)) - - for i, parquetFile := range parquetFilesSortedAsc { - snapshotId := time.Now().UnixNano() - - columnSizesArr := []interface{}{} - for fieldId, size := range parquetFile.Stats.ColumnSizes { - columnSizesArr = append(columnSizesArr, map[string]interface{}{ - "key": fieldId, - "value": size, - }) - } - - valueCountsArr := []interface{}{} - for fieldId, count := range parquetFile.Stats.ValueCounts { - valueCountsArr = append(valueCountsArr, map[string]interface{}{ - "key": fieldId, - "value": count, - }) - } - - nullValueCountsArr := []interface{}{} - for fieldId, count := range parquetFile.Stats.NullValueCounts { - nullValueCountsArr = append(nullValueCountsArr, map[string]interface{}{ - "key": fieldId, - "value": count, - }) - } - - lowerBoundsArr := []interface{}{} - for fieldId, value := range parquetFile.Stats.LowerBounds { - lowerBoundsArr = append(lowerBoundsArr, map[string]interface{}{ - "key": fieldId, - "value": value, - }) - } - - upperBoundsArr := []interface{}{} - for fieldId, value := range parquetFile.Stats.UpperBounds { - upperBoundsArr = append(upperBoundsArr, map[string]interface{}{ - "key": fieldId, - "value": value, - }) - } - - dataFile := map[string]interface{}{ - "content": 0, // 0: DATA, 1: POSITION DELETES, 2: EQUALITY DELETES - "file_path": parquetFile.Path, - "file_format": "PARQUET", - "partition": map[string]interface{}{}, - "record_count": parquetFile.RecordCount, - "file_size_in_bytes": parquetFile.Size, - "column_sizes": map[string]interface{}{ - "array": columnSizesArr, - }, - "value_counts": map[string]interface{}{ - "array": valueCountsArr, - }, - "null_value_counts": map[string]interface{}{ - "array": nullValueCountsArr, - }, - "nan_value_counts": map[string]interface{}{ - "array": []interface{}{}, - }, - "lower_bounds": map[string]interface{}{ - "array": lowerBoundsArr, - }, - "upper_bounds": map[string]interface{}{ - "array": upperBoundsArr, - }, - "key_metadata": nil, - "split_offsets": map[string]interface{}{ - "array": parquetFile.Stats.SplitOffsets, - }, - "equality_ids": nil, - "sort_order_id": map[string]interface{}{ - "int": 0, - }, - } - - manifestEntries[i] = map[string]interface{}{ - "status": ICEBERG_MANIFEST_STATUS_EXISTING, - "snapshot_id": map[string]interface{}{"long": snapshotId}, - "sequence_number": map[string]interface{}{"long": i + 1}, - "file_sequence_number": map[string]interface{}{"long": i + 1}, - "data_file": dataFile, - } - } - - avroFile, err := os.Create(filePath) - if err != nil { - return 0, fmt.Errorf("failed to create manifest file: %v", err) - } - defer avroFile.Close() - - codec, err := goavro.NewCodec(MANIFEST_SCHEMA) - if err != nil { - return 0, fmt.Errorf("failed to create Avro codec: %v", err) - } - - ocfWriter, err := goavro.NewOCFWriter(goavro.OCFConfig{ - W: avroFile, - Codec: codec, - Schema: MANIFEST_SCHEMA, - }) - if err != nil { - return 0, fmt.Errorf("failed to create Avro OCF writer: %v", err) - } - - err = ocfWriter.Append(manifestEntries) - if err != nil { - return 0, fmt.Errorf("failed to write to manifest file: %v", err) - } - - fileInfo, err := os.Stat(filePath) - if err != nil { - return 0, fmt.Errorf("failed to get manifest file info: %v", err) - } - fileSize := fileInfo.Size() - - return fileSize, nil -} - -func (utils *StorageUtils) WriteManifestListFile(filePath string, totalDataFileSize int64, manifestListItemsSortedDesc []ManifestListItem) (ManifestListFile, error) { - snapshotId := time.Now().UnixNano() - manifestListEntries := make([]map[string]interface{}, len(manifestListItemsSortedDesc)) - statsBySequenceNumber := make(map[string]ManifestListSequenceStats) - - for i, manifestListItem := range manifestListItemsSortedDesc { - sequenceNumber := manifestListItem.SequenceNumber - sequenceStats := statsBySequenceNumber[IntToString(sequenceNumber)] - manifestFile := manifestListItem.ManifestFile - - manifestListRecord := map[string]interface{}{ - "added_snapshot_id": snapshotId, - "manifest_length": manifestFile.Size, - "manifest_path": manifestFile.Path, - "min_sequence_number": 1, - "sequence_number": sequenceNumber, - "content": 0, - "deleted_files_count": 0, - "deleted_rows_count": 0, - "existing_files_count": manifestFile.TotalDataFileCount, - "existing_rows_count": manifestFile.TotalRecordCount, - "key_metadata": nil, - "partition_spec_id": 0, - "partitions": map[string]interface{}{"array": []string{}}, - } - - if manifestFile.RecordsDeleted { - manifestListRecord["added_files_count"] = 0 - manifestListRecord["added_rows_count"] = 0 - manifestListRecord["deleted_files_count"] = 1 - manifestListRecord["deleted_rows_count"] = manifestFile.TotalRecordCount - } else { - manifestListRecord["added_files_count"] = 0 - manifestListRecord["added_rows_count"] = 0 - manifestListRecord["deleted_files_count"] = 0 - manifestListRecord["deleted_rows_count"] = 0 - sequenceStats.TotalFilesSize += totalDataFileSize - sequenceStats.TotalDataFiles += int64(manifestFile.TotalDataFileCount) - sequenceStats.TotalRecords += manifestFile.TotalRecordCount - } - - statsBySequenceNumber[IntToString(sequenceNumber)] = sequenceStats - manifestListEntries[i] = manifestListRecord - } - - codec, err := goavro.NewCodec(MANIFEST_LIST_SCHEMA) - if err != nil { - return ManifestListFile{}, fmt.Errorf("failed to create Avro codec for manifest list: %v", err) - } - - avroFile, err := os.Create(filePath) - if err != nil { - return ManifestListFile{}, fmt.Errorf("failed to create manifest list file: %v", err) - } - defer avroFile.Close() - - ocfWriter, err := goavro.NewOCFWriter(goavro.OCFConfig{ - W: avroFile, - Codec: codec, - Schema: MANIFEST_LIST_SCHEMA, - }) - if err != nil { - return ManifestListFile{}, fmt.Errorf("failed to create OCF writer for manifest list: %v", err) - } - - err = ocfWriter.Append(manifestListEntries) - if err != nil { - return ManifestListFile{}, fmt.Errorf("failed to write manifest list record: %v", err) - } - - lastManifestListItem := manifestListItemsSortedDesc[0] - lastSequenceStats := statsBySequenceNumber[IntToString(lastManifestListItem.SequenceNumber)] - - manifestListFile := ManifestListFile{ - SequenceNumber: lastManifestListItem.SequenceNumber, - SnapshotId: snapshotId, - TimestampMs: time.Now().UnixNano() / int64(time.Millisecond), - Operation: ICEBERG_MANIFEST_LIST_OPERATION_REPLACE, - TotalFilesSize: lastSequenceStats.TotalFilesSize, - TotalDataFiles: lastSequenceStats.TotalDataFiles, - TotalRecords: lastSequenceStats.TotalRecords, - } - return manifestListFile, nil -} - -func (utils *StorageUtils) WriteMetadataFile(s3TablePath string, filePath string, icebergSchemaColumns []*IcebergSchemaColumn, manifestListFilesSortedAsc []ManifestListFile) (err error) { - tableUuid := uuid.New().String() - snapshotId := time.Now().UnixNano() - - lastColumnId := 0 - for _, col := range icebergSchemaColumns { - if col.IsList { - columnId := PARQUET_NESTED_FIELD_ID_PREFIX + col.Position - if columnId > lastColumnId { - lastColumnId = columnId - } - } else if col.Position > lastColumnId { - lastColumnId = col.Position - } - } - - catalogTableColumns := make([]interface{}, len(icebergSchemaColumns)) - for i, icebergSchemaColumn := range icebergSchemaColumns { - catalogTableColumns[i] = icebergSchemaColumn.CatalogTableColumn().ToMetadataFieldMap() - } - - snapshots := make([]map[string]interface{}, len(manifestListFilesSortedAsc)) - snapshotLog := make([]map[string]interface{}, len(manifestListFilesSortedAsc)) - - var totalDataFiles, totalFilesSize, totalRecords int64 - - for i, manifestListFile := range manifestListFilesSortedAsc { - totalDataFiles += manifestListFile.TotalDataFiles - totalFilesSize += manifestListFile.TotalFilesSize - totalRecords += manifestListFile.TotalRecords - - snapshot := map[string]interface{}{ - "schema-id": 0, - "snapshot-id": snapshotId, - "sequence-number": manifestListFile.SequenceNumber, - "timestamp-ms": manifestListFile.TimestampMs, - "manifest-list": manifestListFile.Path, - "summary": map[string]interface{}{ - "changed-partition-count": "0", - "manifests-kept": "0", - "manifests-replaced": "0", - "manifests-created": "1", - "entries-processed": Int64ToString(totalDataFiles), - "operation": manifestListFile.Operation, - "total-data-files": Int64ToString(totalDataFiles), - "total-files-size": Int64ToString(totalFilesSize), - "total-records": Int64ToString(totalRecords), - "total-delete-files": "0", - "total-equality-deletes": "0", - "total-position-deletes": "0", - }, - } - if i != 0 { - snapshot["parent-snapshot-id"] = manifestListFilesSortedAsc[i-1].SnapshotId - } - snapshots[i] = snapshot - - snapshotLog[i] = map[string]interface{}{ - "snapshot-id": snapshotId, - "timestamp-ms": manifestListFile.TimestampMs, - } - } - - lastManifestListFile := manifestListFilesSortedAsc[len(manifestListFilesSortedAsc)-1] - metadata := map[string]interface{}{ - "format-version": 2, - "table-uuid": tableUuid, - "statistics": []interface{}{}, - "location": s3TablePath, - "last-sequence-number": lastManifestListFile.SequenceNumber, - "last-updated-ms": lastManifestListFile.TimestampMs, - "last-column-id": lastColumnId, - "schemas": []interface{}{ - map[string]interface{}{ - "type": "struct", - "schema-id": 0, - "fields": catalogTableColumns, - "identifier-field-ids": []interface{}{}, - }, - }, - "current-schema-id": 0, - "partition-specs": []interface{}{ - map[string]interface{}{ - "spec-id": 0, - "fields": []interface{}{}, - }, - }, - "default-spec-id": 0, - "default-sort-order-id": 0, - "last-partition-id": 999, // Assuming no partitions; set to a placeholder - "properties": map[string]string{}, - "current-snapshot-id": snapshotId, - "refs": map[string]interface{}{ - "main": map[string]interface{}{ - "snapshot-id": snapshotId, - "type": "branch", - }, - }, - "snapshots": snapshots, - "snapshot-log": snapshotLog, - "metadata-log": []interface{}{}, - "sort-orders": []interface{}{ - map[string]interface{}{ - "order-id": 0, - "fields": []interface{}{}, - }, - }, - } - - file, err := os.Create(filePath) - if err != nil { - return fmt.Errorf("failed to create metadata file: %v", err) - } - defer file.Close() - - encoder := json.NewEncoder(file) - encoder.SetIndent("", " ") - err = encoder.Encode(metadata) - if err != nil { - return fmt.Errorf("failed to write metadata to file: %v", err) - } - - return nil -} - -// Read --------------------------------------------------------------------------------------------------------------- - -func (utils *StorageUtils) ParseLastManifestListFile(bucketS3Prefix string, metadataContent []byte) ManifestListFile { - var manifestListsJson ManifestListsJson - err := json.Unmarshal(metadataContent, &manifestListsJson) - PanicIfError(utils.Config, err) - - snapshot := manifestListsJson.Snapshots[len(manifestListsJson.Snapshots)-1] - - return ManifestListFile{ - SequenceNumber: snapshot.SequenceNumber, - SnapshotId: snapshot.SnapshotId, - TimestampMs: snapshot.TimestampMs, - Key: strings.TrimPrefix(snapshot.Path, bucketS3Prefix), - Path: snapshot.Path, - Operation: snapshot.Summary.Operation, - TotalFilesSize: StringToInt64(snapshot.Summary.TotalFilesSize), - TotalDataFiles: StringToInt64(snapshot.Summary.TotalDataFiles), - TotalRecords: StringToInt64(snapshot.Summary.TotalRecords), - } -} - -func (utils *StorageUtils) ParseManifestListItems(bucketS3Prefix string, manifestListFileContent []byte) []ManifestListItem { - ocfReader, err := goavro.NewOCFReader(strings.NewReader(string(manifestListFileContent))) - PanicIfError(utils.Config, err) - - manifestListItemsSortedDesc := []ManifestListItem{} - - for ocfReader.Scan() { - record, err := ocfReader.Read() - PanicIfError(utils.Config, err) - - recordMap := record.(map[string]interface{}) - - manifestListItemsSortedDesc = append(manifestListItemsSortedDesc, ManifestListItem{ - ManifestFile: ManifestFile{ - Key: strings.TrimPrefix(recordMap["manifest_path"].(string), bucketS3Prefix), - Path: recordMap["manifest_path"].(string), - Size: recordMap["manifest_length"].(int64), - TotalRecordCount: recordMap["added_rows_count"].(int64), - TotalDataFileCount: recordMap["existing_files_count"].(int32), - RecordsDeleted: false, - }, - SequenceNumber: int(recordMap["sequence_number"].(int64)), - }) - } - - return manifestListItemsSortedDesc -} - -func (utils *StorageUtils) ParseParquetFiles(manifestContent []byte) []ParquetFile { - ocfReader, err := goavro.NewOCFReader(strings.NewReader(string(manifestContent))) - PanicIfError(utils.Config, err) - - parquetFilesSortedAsc := []ParquetFile{} - - for ocfReader.Scan() { - record, err := ocfReader.Read() - PanicIfError(utils.Config, err) - - recordMap := record.(map[string]interface{}) - dataFile := recordMap["data_file"].(map[string]interface{}) - - parquetFilesSortedAsc = append(parquetFilesSortedAsc, ParquetFile{ - Path: dataFile["file_path"].(string), - Size: dataFile["file_size_in_bytes"].(int64), - RecordCount: dataFile["record_count"].(int64), - }) - } - - return parquetFilesSortedAsc -} - -// --------------------------------------------------------------------------------------------------------------------- - -const ( - MANIFEST_SCHEMA = `{ - "type" : "record", - "name" : "manifest_entry", - "fields" : [ { - "name" : "status", - "type" : "int", - "field-id" : 0 - }, { - "name" : "snapshot_id", - "type" : [ "null", "long" ], - "default" : null, - "field-id" : 1 - }, { - "name" : "sequence_number", - "type" : [ "null", "long" ], - "default" : null, - "field-id" : 3 - }, { - "name" : "file_sequence_number", - "type" : [ "null", "long" ], - "default" : null, - "field-id" : 4 - }, { - "name" : "data_file", - "type" : { - "type" : "record", - "name" : "r2", - "fields" : [ { - "name" : "content", - "type" : "int", - "doc" : "File format name: avro, orc, or parquet", - "field-id" : 134 - }, { - "name" : "file_path", - "type" : "string", - "doc" : "Location URI with FS scheme", - "field-id" : 100 - }, { - "name" : "file_format", - "type" : "string", - "doc" : "File format name: avro, orc, or parquet", - "field-id" : 101 - }, { - "name" : "partition", - "type" : { - "type" : "map", - "values" : [ "null", "string" ], - "key-id" : 10001, - "value-id" : 10002 - }, - "doc" : "Partition values tuple, schema based on the partition spec", - "field-id" : 102 - }, { - "name" : "record_count", - "type" : "long", - "doc" : "Number of records in the file", - "field-id" : 103 - }, { - "name" : "file_size_in_bytes", - "type" : "long", - "doc" : "Total file size in bytes", - "field-id" : 104 - }, { - "name" : "column_sizes", - "type" : [ "null", { - "type" : "array", - "items" : { - "type" : "record", - "name" : "k117_v118", - "fields" : [ { - "name" : "key", - "type" : "int", - "field-id" : 117 - }, { - "name" : "value", - "type" : "long", - "field-id" : 118 - } ] - }, - "logicalType" : "map" - } ], - "doc" : "Map of column id to total size on disk", - "default" : null, - "field-id" : 108 - }, { - "name" : "value_counts", - "type" : [ "null", { - "type" : "array", - "items" : { - "type" : "record", - "name" : "k119_v120", - "fields" : [ { - "name" : "key", - "type" : "int", - "field-id" : 119 - }, { - "name" : "value", - "type" : "long", - "field-id" : 120 - } ] - }, - "logicalType" : "map" - } ], - "doc" : "Map of column id to total count, including null and NaN", - "default" : null, - "field-id" : 109 - }, { - "name" : "null_value_counts", - "type" : [ "null", { - "type" : "array", - "items" : { - "type" : "record", - "name" : "k121_v122", - "fields" : [ { - "name" : "key", - "type" : "int", - "field-id" : 121 - }, { - "name" : "value", - "type" : "long", - "field-id" : 122 - } ] - }, - "logicalType" : "map" - } ], - "doc" : "Map of column id to null value count", - "default" : null, - "field-id" : 110 - }, { - "name" : "nan_value_counts", - "type" : [ "null", { - "type" : "array", - "items" : { - "type" : "record", - "name" : "k138_v139", - "fields" : [ { - "name" : "key", - "type" : "int", - "field-id" : 138 - }, { - "name" : "value", - "type" : "long", - "field-id" : 139 - } ] - }, - "logicalType" : "map" - } ], - "doc" : "Map of column id to number of NaN values in the column", - "default" : null, - "field-id" : 137 - }, { - "name" : "lower_bounds", - "type" : [ "null", { - "type" : "array", - "items" : { - "type" : "record", - "name" : "k126_v127", - "fields" : [ { - "name" : "key", - "type" : "int", - "field-id" : 126 - }, { - "name" : "value", - "type" : "bytes", - "field-id" : 127 - } ] - }, - "logicalType" : "map" - } ], - "doc" : "Map of column id to lower bound", - "default" : null, - "field-id" : 125 - }, { - "name" : "upper_bounds", - "type" : [ "null", { - "type" : "array", - "items" : { - "type" : "record", - "name" : "k129_v130", - "fields" : [ { - "name" : "key", - "type" : "int", - "field-id" : 129 - }, { - "name" : "value", - "type" : "bytes", - "field-id" : 130 - } ] - }, - "logicalType" : "map" - } ], - "doc" : "Map of column id to upper bound", - "default" : null, - "field-id" : 128 - }, { - "name" : "key_metadata", - "type" : [ "null", "bytes" ], - "doc" : "Encryption key metadata blob", - "default" : null, - "field-id" : 131 - }, { - "name" : "split_offsets", - "type" : [ "null", { - "type" : "array", - "items" : "long", - "element-id" : 133 - } ], - "doc" : "Splittable offsets", - "default" : null, - "field-id" : 132 - }, { - "name" : "equality_ids", - "type" : [ "null", { - "type" : "array", - "items" : "long", - "element-id" : 136 - } ], - "doc" : "Field ids used to determine row equality in equality delete files.", - "default" : null, - "field-id" : 135 - }, { - "name" : "sort_order_id", - "type" : [ "null", "int" ], - "doc" : "ID representing sort order for this file", - "default" : null, - "field-id" : 140 - } ] - }, - "field-id" : 2 - } ] - }` - MANIFEST_LIST_SCHEMA = `{ - "type" : "record", - "name" : "manifest_file", - "fields" : [ { - "name" : "manifest_path", - "type" : "string", - "doc" : "Location URI with FS scheme", - "field-id" : 500 - }, { - "name" : "manifest_length", - "type" : "long", - "field-id" : 501 - }, { - "name" : "partition_spec_id", - "type" : "int", - "field-id" : 502 - }, { - "name" : "content", - "type" : "int", - "field-id" : 517 - }, { - "name" : "sequence_number", - "type" : "long", - "field-id" : 515 - }, { - "name" : "min_sequence_number", - "type" : "long", - "field-id" : 516 - }, { - "name" : "added_snapshot_id", - "type" : "long", - "field-id" : 503 - }, { - "name" : "added_files_count", - "type" : "int", - "field-id" : 504 - }, { - "name" : "existing_files_count", - "type" : "int", - "field-id" : 505 - }, { - "name" : "deleted_files_count", - "type" : "int", - "field-id" : 506 - }, { - "name" : "added_rows_count", - "type" : "long", - "field-id" : 512 - }, { - "name" : "existing_rows_count", - "type" : "long", - "field-id" : 513 - }, { - "name" : "deleted_rows_count", - "type" : "long", - "field-id" : 514 - }, { - "name" : "partitions", - "type" : [ "null", { - "type" : "array", - "items" : { - "type" : "record", - "name" : "r508", - "fields" : [ { - "name" : "contains_null", - "type" : "boolean", - "field-id" : 509 - }, { - "name" : "contains_nan", - "type" : [ "null", "boolean" ], - "default" : null, - "field-id" : 518 - }, { - "name" : "lower_bound", - "type" : [ "null", "bytes" ], - "default" : null, - "field-id" : 510 - }, { - "name" : "upper_bound", - "type" : [ "null", "bytes" ], - "default" : null, - "field-id" : 511 - } ] - }, - "element-id" : 508 - } ], - "default" : null, - "field-id" : 507 - }, { - "name" : "key_metadata", - "type" : [ "null", "bytes" ], - "default" : null, - "field-id" : 519 - } ] - }` -) diff --git a/src/common/utils.go b/src/common/utils.go deleted file mode 100644 index 611616f..0000000 --- a/src/common/utils.go +++ /dev/null @@ -1,136 +0,0 @@ -package common - -import ( - "bytes" - "encoding/base64" - "encoding/hex" - "encoding/json" - "net/http" - "runtime" - "strconv" - "strings" - "time" -) - -func IntToString(i int) string { - return strconv.Itoa(i) -} - -func IsLocalHost(host string) bool { - return strings.HasPrefix(host, "127.0.0.1") || strings.HasPrefix(host, "localhost") -} - -func Int64ToString(i int64) string { - return strconv.FormatInt(i, 10) -} - -func Float64ToString(i float64) string { - return strconv.FormatFloat(i, 'f', -1, 64) -} - -func StringToInt(s string) int { - int, err := strconv.Atoi(s) - if err != nil { - panic(err) - } - - return int -} - -func StringToInt64(s string) int64 { - int64Value, err := strconv.ParseInt(s, 10, 64) - if err != nil { - panic(err) - } - - return int64Value -} - -func StringToFloat64(s string) float64 { - floatValue, err := strconv.ParseFloat(s, 64) - if err != nil { - panic(err) - } - - return floatValue -} - -func StringDateToTime(str string) time.Time { - // Golang's time.Parse() function does not support parsing dates with 5+ digit years - // So we need to handle this case manually by parsing the year separately - var nonStandardYear int - parts := strings.Split(str, "-") - if len(parts) == 3 && len(parts[0]) > 4 { - nonStandardYear = StringToInt(parts[0]) - str = str[len(parts[0])-4:] // Remove the prefix from str leaving only the standard 10 characters (YYYY-MM-DD) - } - - // Parse the date string as a standard date - parsedTime, err := time.Parse("2006-01-02", str) - - // If the year is non-standard, add the year difference to the parsed time after parsing - if err == nil && nonStandardYear != 0 { - parsedTime = parsedTime.AddDate(nonStandardYear-parsedTime.Year(), 0, 0) - return parsedTime - } - - return parsedTime -} - -func HexToString(s string) (string, error) { - decoded, err := hex.DecodeString(s) - if err != nil { - return "", err - } - return string(decoded), nil -} - -func Base64ToHex(s string) string { - decoded, err := base64.StdEncoding.DecodeString(s) - if err != nil { - panic(err) - } - return strings.ToUpper(hex.EncodeToString(decoded)) -} - -func TimeToUtcStringMs(t time.Time) string { - return t.UTC().Format("2006-01-02 15:04:05.999999") -} - -func StringMsToUtcTime(s string) time.Time { - t, err := time.Parse("2006-01-02 15:04:05.999999", s) - if err != nil { - panic(err) - } - return t.UTC() -} - -type AnonymousAnalyticsData struct { - Command string `json:"command"` - OsName string `json:"osName"` - Version string `json:"version"` - S3Bucket string `json:"s3Bucket"` - Name string `json:"name"` -} - -func SendAnonymousAnalytics(config *CommonConfig, command string, name string) { - if config.DisableAnonymousAnalytics { - return - } - - data := AnonymousAnalyticsData{ - Command: command, - OsName: runtime.GOOS + "-" + runtime.GOARCH, - Version: VERSION, - S3Bucket: config.Aws.S3Endpoint + "/" + config.Aws.S3Bucket, - Name: name, - } - - jsonData, err := json.Marshal(data) - if err != nil { - return - } - - client := http.Client{Timeout: 5 * time.Second} - _, _ = client.Post("https://api.bemidb.com/api/analytics", "application/json", bytes.NewBuffer(jsonData)) -} diff --git a/src/server/config.go b/src/server/config.go deleted file mode 100644 index 86d5f25..0000000 --- a/src/server/config.go +++ /dev/null @@ -1,111 +0,0 @@ -package main - -import ( - "flag" - "os" - "slices" - "strings" - - "github.com/BemiHQ/BemiDB/src/common" -) - -const ( - ENV_PORT = "BEMIDB_PORT" - ENV_DATABASE = "BEMIDB_DATABASE" - ENV_USER = "BEMIDB_USER" - ENV_PASSWORD = "BEMIDB_PASSWORD" - ENV_HOST = "BEMIDB_HOST" - - DEFAULT_LOG_LEVEL = "INFO" - DEFAULT_HOST = "0.0.0.0" - DEFAULT_PORT = "54321" - DEFAULT_DATABASE = "bemidb" - DEFAULT_AWS_S3_ENDPOINT = "s3.amazonaws.com" -) - -type Config struct { - CommonConfig *common.CommonConfig - Host string - Port string - Database string - User string - EncryptedPassword string -} - -type configParseValues struct { - password string -} - -var _config Config -var _configParseValues configParseValues - -func init() { - registerFlags() -} - -func registerFlags() { - _config.CommonConfig = &common.CommonConfig{} - - flag.StringVar(&_config.CommonConfig.LogLevel, "log-level", os.Getenv(common.ENV_LOG_LEVEL), `Log level: "ERROR", "WARN", "INFO", "DEBUG", "TRACE". Default: "`+common.DEFAULT_LOG_LEVEL+`"`) - flag.StringVar(&_config.CommonConfig.CatalogDatabaseUrl, "catalog-database-url", os.Getenv(common.ENV_CATALOG_DATABASE_URL), "Catalog database URL") - flag.StringVar(&_config.CommonConfig.Aws.Region, "aws-region", os.Getenv(common.ENV_AWS_REGION), "AWS region") - flag.StringVar(&_config.CommonConfig.Aws.S3Endpoint, "aws-s3-endpoint", os.Getenv(common.ENV_AWS_S3_ENDPOINT), "AWS S3 endpoint. Default: \""+common.DEFAULT_AWS_S3_ENDPOINT+`"`) - flag.StringVar(&_config.CommonConfig.Aws.S3Bucket, "aws-s3-bucket", os.Getenv(common.ENV_AWS_S3_BUCKET), "AWS S3 bucket name") - flag.StringVar(&_config.CommonConfig.Aws.AccessKeyId, "aws-access-key-id", os.Getenv(common.ENV_AWS_ACCESS_KEY_ID), "AWS access key ID") - flag.StringVar(&_config.CommonConfig.Aws.SecretAccessKey, "aws-secret-access-key", os.Getenv(common.ENV_AWS_SECRET_ACCESS_KEY), "AWS secret access key") - flag.BoolVar(&_config.CommonConfig.DisableAnonymousAnalytics, "disable-anonymous-analytics", os.Getenv(common.ENV_DISABLE_ANONYMOUS_ANALYTICS) == "true", "Disable anonymous analytics collection") - - flag.StringVar(&_config.Host, "host", os.Getenv(ENV_HOST), "Host for BemiDB to listen on") - flag.StringVar(&_config.Port, "port", os.Getenv(ENV_PORT), "Port for BemiDB to listen on") - flag.StringVar(&_config.Database, "database", os.Getenv(ENV_DATABASE), "Database name") - flag.StringVar(&_config.User, "user", os.Getenv(ENV_USER), "Database user") - flag.StringVar(&_configParseValues.password, "password", os.Getenv(ENV_PASSWORD), "Database password") -} - -func parseFlags() { - flag.Parse() - - if _config.CommonConfig.LogLevel == "" { - _config.CommonConfig.LogLevel = common.DEFAULT_LOG_LEVEL - } else if !slices.Contains(common.LOG_LEVELS, _config.CommonConfig.LogLevel) { - panic("Invalid log level " + _config.CommonConfig.LogLevel + ". Must be one of " + strings.Join(common.LOG_LEVELS, ", ")) - } - if _config.CommonConfig.CatalogDatabaseUrl == "" { - panic("Catalog database URL is required") - } - if _config.CommonConfig.Aws.Region == "" { - panic("AWS region is required") - } - if _config.CommonConfig.Aws.S3Endpoint == "" { - _config.CommonConfig.Aws.S3Endpoint = common.DEFAULT_AWS_S3_ENDPOINT - } - if _config.CommonConfig.Aws.S3Bucket == "" { - panic("AWS S3 bucket name is required") - } - if _config.CommonConfig.Aws.AccessKeyId != "" && _config.CommonConfig.Aws.SecretAccessKey == "" { - panic("AWS secret access key is required") - } - if _config.CommonConfig.Aws.AccessKeyId == "" && _config.CommonConfig.Aws.SecretAccessKey != "" { - panic("AWS access key ID is required") - } - - if _config.Host == "" { - _config.Host = DEFAULT_HOST - } - if _config.Port == "" { - _config.Port = DEFAULT_PORT - } - if _config.Database == "" { - _config.Database = DEFAULT_DATABASE - } - if _configParseValues.password != "" { - _config.EncryptedPassword = StringToScramSha256(_configParseValues.password) - } - - _configParseValues = configParseValues{} -} - -func LoadConfig() *Config { - parseFlags() - return &_config -} diff --git a/src/server/go.mod b/src/server/go.mod deleted file mode 100644 index b4748ff..0000000 --- a/src/server/go.mod +++ /dev/null @@ -1,68 +0,0 @@ -module github.com/BemiHQ/BemiDB/src/server - -go 1.24.4 - -require ( - github.com/BemiHQ/BemiDB/src/common v0.0.1 - github.com/google/uuid v1.6.0 - github.com/jackc/pgx/v5 v5.7.5 - github.com/marcboeker/go-duckdb/v2 v2.3.2 - github.com/pganalyze/pg_query_go/v6 v6.1.0 - golang.org/x/crypto v0.37.0 -) - -replace github.com/BemiHQ/BemiDB/src/common => ../common - -require ( - github.com/apache/arrow-go/v18 v18.4.0 // indirect - github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 // indirect - github.com/apache/thrift v0.22.0 // indirect - github.com/aws/aws-sdk-go-v2 v1.37.0 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 // indirect - github.com/aws/aws-sdk-go-v2/config v1.30.1 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.18.1 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0 // indirect - github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.26.0 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.35.0 // indirect - github.com/aws/smithy-go v1.22.5 // indirect - github.com/duckdb/duckdb-go-bindings v0.1.16 // indirect - github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11 // indirect - github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11 // indirect - github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11 // indirect - github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11 // indirect - github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11 // indirect - github.com/go-viper/mapstructure/v2 v2.3.0 // indirect - github.com/goccy/go-json v0.10.5 // indirect - github.com/golang/snappy v1.0.0 // indirect - github.com/google/flatbuffers v25.2.10+incompatible // indirect - github.com/jackc/pgpassfile v1.0.0 // indirect - github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect - github.com/klauspost/compress v1.18.0 // indirect - github.com/klauspost/cpuid/v2 v2.2.11 // indirect - github.com/linkedin/goavro v2.1.0+incompatible // indirect - github.com/marcboeker/go-duckdb/arrowmapping v0.0.9 // indirect - github.com/marcboeker/go-duckdb/mapping v0.0.10 // indirect - github.com/pierrec/lz4/v4 v4.1.22 // indirect - github.com/xitongsys/parquet-go v1.6.2 // indirect - github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b // indirect - github.com/zeebo/xxh3 v1.0.2 // indirect - golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect - golang.org/x/mod v0.25.0 // indirect - golang.org/x/sync v0.15.0 // indirect - golang.org/x/sys v0.33.0 // indirect - golang.org/x/text v0.26.0 // indirect - golang.org/x/tools v0.34.0 // indirect - golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect - google.golang.org/protobuf v1.36.6 // indirect -) diff --git a/src/server/go.sum b/src/server/go.sum deleted file mode 100644 index d27f4e3..0000000 --- a/src/server/go.sum +++ /dev/null @@ -1,1165 +0,0 @@ -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.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.66.0/go.mod h1:dgqGAjKCDxyhGTtC9dAREQGUJpkceNm1yt590Qno0Ko= -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.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.82.0/go.mod h1:vlKccHJGuFBFufnAnuB08dfEH9Y3H7dzDzRECFdC2TA= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= -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 v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.2.0/go.mod h1:xlogom/6gr8RJGBe7nT2eGsQYAFUbbv8dbC29qE3Xmw= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -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/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= -cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= -cloud.google.com/go/iam v0.1.1/go.mod h1:CKqrcnI/suGpybEHxZ7BMehL0oA4LpdyJdUlTl9jVMw= -cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= -cloud.google.com/go/kms v1.1.0/go.mod h1:WdbppnCDMDpOvoYBMn1+gNmOeEoZYqAv+HeuKARGCXI= -cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= -cloud.google.com/go/monitoring v1.1.0/go.mod h1:L81pzz7HKn14QCMaCs6NTQkdBnE87TElyanS95vIcl4= -cloud.google.com/go/monitoring v1.4.0/go.mod h1:y6xnxfwI3hTFWOdkOaD7nfJVlwuC3/mS/5kvtT131p4= -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/pubsub v1.19.0/go.mod h1:/O9kmSe9bb9KRnIAWkzmqhPjHo6LtzGOBYd/kr06XSs= -cloud.google.com/go/secretmanager v1.3.0/go.mod h1:+oLTkouyiYiabAQNugCeTS3PAArGiMJuBqvJnJsyH+U= -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.12.0/go.mod h1:fFLk2dp2oAhDz8QFKwqrjdJvxSp/W2g7nillojlL5Ho= -cloud.google.com/go/storage v1.21.0/go.mod h1:XmRlxkgPjlBONznT2dDUU/5XlpU2OjMnKuqnZI01LAA= -cloud.google.com/go/trace v1.0.0/go.mod h1:4iErSByzxkyHWzzlAj63/Gmjz0NH1ASqhJguHpGcr6A= -cloud.google.com/go/trace v1.2.0/go.mod h1:Wc8y/uYyOhPy12KEnXG9XGrvfMz5F5SrYecQlbW1rwM= -contrib.go.opencensus.io/exporter/aws v0.0.0-20200617204711-c478e41e60e9/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= -contrib.go.opencensus.io/exporter/stackdriver v0.13.10/go.mod h1:I5htMbyta491eUxufwwZPQdcKvvgzMB4O9ni41YnIM8= -contrib.go.opencensus.io/integrations/ocsql v0.1.7/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/azure-amqp-common-go/v3 v3.2.1/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= -github.com/Azure/azure-amqp-common-go/v3 v3.2.2/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= -github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k= -github.com/Azure/azure-sdk-for-go v51.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v59.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.0.0/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.0.0/go.mod h1:+6sju8gk8FRmSajX3Oz4G5Gm7P+mbqE9FVaXXFYTkCM= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U= -github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.0.0/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.0.0/go.mod h1:ceIuwmxDWptoW3eCqSXlnPsZFKh4X+R38dWPv7GS9Vs= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.0.0/go.mod h1:s1tW/At+xHqjNFvWU4G0c0Qv33KOhvbGNj0RCTQDV8s= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.2.0/go.mod h1:c+Lifp3EDEamAkPVzMooRNOK6CZjNSdEnf1A7jsI9u4= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.1.0/go.mod h1:7QJP7dr2wznCMeqIrhMgWGf7XpAQnVrJqDm9nvV3Cu4= -github.com/Azure/azure-service-bus-go v0.11.5/go.mod h1:MI6ge2CuQWBVq+ly456MY7XqNLJip5LO1iSFodbNLbU= -github.com/Azure/azure-storage-blob-go v0.14.0/go.mod h1:SMqIBi+SuiQH32bvyjngEewEeXoPfKMgWlBDaYf6fck= -github.com/Azure/go-amqp v0.16.0/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= -github.com/Azure/go-amqp v0.16.4/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest v0.11.19/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest v0.11.22/go.mod h1:BAWYUWGPEtKPzjVkp0Q6an0MJcJDsoh5Z1BFAEFs4Xs= -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/adal v0.9.14/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/adal v0.9.17/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= -github.com/Azure/go-autorest/autorest/azure/auth v0.5.9/go.mod h1:hg3/1yw0Bq87O3KvvnJoAh34/0zbP7SFizX/qN5JvjU= -github.com/Azure/go-autorest/autorest/azure/cli v0.4.2/go.mod h1:7qkJkT+j6b+hIpzMOwPChJhTqS8VbsqqgULzMNRugoM= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= -github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/AzureAD/microsoft-authentication-library-for-go v0.4.0/go.mod h1:Vt9sXTKwMyGcOxSmLDMnGPgqsUg7m8pe215qMLrDXw4= -github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/GoogleCloudPlatform/cloudsql-proxy v1.29.0/go.mod h1:spvB9eLJH9dutlbPSRmHvSXXHOwGRyeXh1jVdquA2G8= -github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= -github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/apache/arrow-go/v18 v18.4.0 h1:/RvkGqH517iY8bZKc4FD5/kkdwXJGjxf28JIXbJ/oB0= -github.com/apache/arrow-go/v18 v18.4.0/go.mod h1:Aawvwhj8x2jURIzD9Moy72cF0FyJXOpkYpdmGRHcw14= -github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 h1:byKBBF2CKWBjjA4J1ZL2JXttJULvWSl50LegTyRZ728= -github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516/go.mod h1:QNYViu/X0HXDHw7m3KXzWSVXIbfUvJqBFe6Gj8/pYA0= -github.com/apache/thrift v0.0.0-20181112125854-24918abba929/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.14.2/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.22.0 h1:r7mTJdj51TMDe6RtcmNdQxgn9XcyfGDOzegMDRg47uc= -github.com/apache/thrift v0.22.0/go.mod h1:1e7J/O1Ae6ZQMTYdy9xa3w9k+XHWPfRvdPyJeynQ+/g= -github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= -github.com/aws/aws-sdk-go v1.30.19/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= -github.com/aws/aws-sdk-go v1.37.0/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go v1.43.31 h1:yJZIr8nMV1hXjAvvOLUFqZRJcHV7udPQBfhJqawDzI0= -github.com/aws/aws-sdk-go v1.43.31/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= -github.com/aws/aws-sdk-go-v2 v1.16.2/go.mod h1:ytwTPBG6fXTZLxxeeCCWj2/EMYp/xDUgX+OET6TLNNU= -github.com/aws/aws-sdk-go-v2 v1.23.0/go.mod h1:i1XDttT4rnf6vxc9AuskLc6s7XBee8rlLilKlc03uAA= -github.com/aws/aws-sdk-go-v2 v1.37.0 h1:YtCOESR/pN4j5oA7cVHSfOwIcuh/KwHC4DOSXFbv5F0= -github.com/aws/aws-sdk-go-v2 v1.37.0/go.mod h1:9Q0OoGQoboYIAJyslFyF1f5K1Ryddop8gqMhWx/n4Wg= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.1/go.mod h1:n8Bs1ElDD2wJ9kCRTczA83gYbBmjSwZp3umc6zF4EeM= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.1/go.mod h1:t8PYl/6LzdAqsU4/9tz28V/kU+asFePvpOMkdul0gEQ= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 h1:6GMWV6CNpA/6fbFHnoAjrv4+LGfyTqZz2LtCHnspgDg= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0/go.mod h1:/mXlTIVG9jbxkqDnr5UQNQxW1HRYxeGklkM9vAFeabg= -github.com/aws/aws-sdk-go-v2/config v1.15.3/go.mod h1:9YL3v07Xc/ohTsxFXzan9ZpFpdTOFl4X65BAKYaz8jg= -github.com/aws/aws-sdk-go-v2/config v1.25.3/go.mod h1:tAByZy03nH5jcq0vZmkcVoo6tRzRHEwSFx3QW4NmDw8= -github.com/aws/aws-sdk-go-v2/config v1.30.1 h1:sHL8g/+9tcZATeV2tEkEfxZeaNokDtKsSjGMGHD49qA= -github.com/aws/aws-sdk-go-v2/config v1.30.1/go.mod h1:wkibEyFfxXRyTSzRU4bbF5IUsSXyE4xQ4ZjkGmi5tFo= -github.com/aws/aws-sdk-go-v2/credentials v1.11.2/go.mod h1:j8YsY9TXTm31k4eFhspiQicfXPLZ0gYXA50i4gxPE8g= -github.com/aws/aws-sdk-go-v2/credentials v1.16.2/go.mod h1:sDdvGhXrSVT5yzBDR7qXz+rhbpiMpUYfF3vJ01QSdrc= -github.com/aws/aws-sdk-go-v2/credentials v1.18.1 h1:E55xvOqlX7CvB66Z7rSM9usCrFU1ryUIUHqiXsEzVoE= -github.com/aws/aws-sdk-go-v2/credentials v1.18.1/go.mod h1:iobSQfR5MkvILxssGOvi/P1jjOhrRzfTiCPCzku0vx4= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.3/go.mod h1:uk1vhHHERfSVCUnqSqz8O48LBYDSC+k6brng09jcMOk= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.4/go.mod h1:t4i+yGHMCcUNIX1x7YVYa6bH/Do7civ5I6cG/6PMfyA= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0 h1:9sBTeKQwAvmJUWKIACIoiFSnxxl+sS++YDfr17/ngq0= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0/go.mod h1:LW9/PxQD1SYFC7pnWcgqPhoyZprhjEdg5hBK6qYPLW8= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.3/go.mod h1:0dHuD2HZZSiwfJSy1FO5bX1hQ1TxVV1QXXjpn3XUE44= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.14.0/go.mod h1:UcgIwJ9KHquYxs6Q5skC9qXjhYMK+JASDYcXQ4X7JZE= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1 h1:aAjA/1JZ1xH/F9XvxJu9cXZyp7BqVXtHpztyZ6p799E= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1/go.mod h1:ia9HASsPba/7o84sp6iE4wZPdNTJ0oicBe5sWQQk+Ys= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.9/go.mod h1:AnVH5pvai0pAF4lXRq0bmhbes1u9R8wTE+g+183bZNM= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.3/go.mod h1:7sGSz1JCKHWWBHq98m6sMtWQikmYPpxjqOydDemiVoM= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0 h1:H2iZoqW/v2Jnrh1FnU725Bq6KJ0k2uP63yH+DcY+HUI= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0/go.mod h1:L0FqLbwMXHvNC/7crWV1iIxUlOKYZUE8KuTIA+TozAI= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.3/go.mod h1:ssOhaLpRlh88H3UmEcsBoVKq309quMvm3Ds8e9d4eJM= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.3/go.mod h1:ify42Rb7nKeDDPkFjKn7q1bPscVPu/+gmHH8d2c+anU= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0 h1:EDped/rNzAhFPhVY0sDGbtD16OKqksfA8OjF/kLEgw8= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0/go.mod h1:uUI335jvzpZRPpjYx6ODc/wg1qH+NnoSTK/FwVeK0C0= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.10/go.mod h1:8DcYQcz0+ZJaSxANlHIsbbi6S+zMwjwdDqwW3r9AzaE= -github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.3/go.mod h1:5yzAuE9i2RkVAttBl8yxZgQr5OCq4D5yDnG7j9x2L0U= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0 h1:iLvW/zOkHGU3BDU5thWnj+UZ9pjhuVhv1loLj7yVtBw= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0/go.mod h1:Fn3gvhdF1x5Rs9nUoCy/fJT1ms8f8dO7RqM9lJHuazQ= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.1/go.mod h1:GeUru+8VzrTXV/83XyMJ80KpH8xO89VPoUileyNQ+tc= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1/go.mod h1:l9ymW25HOqymeU2m1gbUQ3rUIsTwKs8gYHXkqDQUhiI= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 h1:6+lZi2JeGKtCraAj1rpoZfKqnQ9SptseRZioejfUOLM= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0/go.mod h1:eb3gfbVIxIoGgJsi9pGne19dhCBpK6opTYpQqAmdy44= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.3/go.mod h1:Seb8KNmD6kVTjwRjVEgOT5hPin6sq+v4C2ycJQDwuH8= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.3/go.mod h1:R+/S1O4TYpcktbVwddeOYg+uwUfLhADP2S/x4QwsCTM= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0 h1:qGyLBQPphYzUf+IIlb5tHnvg1U2Vc5hXPcP7oRSQfy0= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0/go.mod h1:g+dzKSLXiR/8ATkPXmLhPOI6rDdjLP3tngeo3FvDcIw= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.3/go.mod h1:wlY6SVjuwvh3TVRpTqdy4I1JpBFLX4UGeKZdWntaocw= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.3/go.mod h1:Owv1I59vaghv1Ax8zz8ELY8DN7/Y0rGS+WWAmjgi950= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0 h1:eRhU3Sh8dGbaniI6B+I48XJMrTPRkK4DKo+vqIxziOU= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0/go.mod h1:paNLV18DZ6FnWE/bd06RIKPDIFpjuvCkGKWTG/GDBeM= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.3/go.mod h1:Bm/v2IaN6rZ+Op7zX+bOUMdL4fsrYZiD0dsjLhNKwZc= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.3/go.mod h1:KZgs2ny8HsxRIRbDwgvJcHHBZPOzQr/+NtGwnP+w2ec= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0 h1:6jusT+XCcvnD+Elxvm7bUf5sCMTpZEp3AKjYQ4tWJSo= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0/go.mod h1:LimGpdIF/sTBdgqwOEkrArXLCoTamK/9L9x8IKBFTIc= -github.com/aws/aws-sdk-go-v2/service/kms v1.16.3/go.mod h1:QuiHPBqlOFCi4LqdSskYYAWpQlx3PKmohy+rE2F+o5g= -github.com/aws/aws-sdk-go-v2/service/s3 v1.26.3/go.mod h1:g1qvDuRsJY+XghsV6zg00Z4KJ7DtFFCx8fJD2a491Ak= -github.com/aws/aws-sdk-go-v2/service/s3 v1.43.0/go.mod h1:NXRKkiRF+erX2hnybnVU660cYT5/KChRD4iUgJ97cI8= -github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0 h1:gAV4NEp4A+JOrIdoXkAeyy6IOo7+X2s/jRuaHKYiMaU= -github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0/go.mod h1:JIQwK8sZ5MuKGm5rrFwp9MHUcyYEsQNpVixuPDlnwaU= -github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.15.4/go.mod h1:PJc8s+lxyU8rrre0/4a0pn2wgwiDvOEzoOjcJUBr67o= -github.com/aws/aws-sdk-go-v2/service/sns v1.17.4/go.mod h1:kElt+uCcXxcqFyc+bQqZPFD9DME/eC6oHBXvFzQ9Bcw= -github.com/aws/aws-sdk-go-v2/service/sqs v1.18.3/go.mod h1:skmQo0UPvsjsuYYSYMVmrPc1HWCbHUJyrCEp+ZaLzqM= -github.com/aws/aws-sdk-go-v2/service/ssm v1.24.1/go.mod h1:NR/xoKjdbRJ+qx0pMR4mI+N/H1I1ynHwXnO6FowXJc0= -github.com/aws/aws-sdk-go-v2/service/sso v1.11.3/go.mod h1:7UQ/e69kU7LDPtY40OyoHYgRmgfGM4mgsLYtcObdveU= -github.com/aws/aws-sdk-go-v2/service/sso v1.17.2/go.mod h1:/pE21vno3q1h4bbhUOEi+6Zu/aT26UK2WKkDXd+TssQ= -github.com/aws/aws-sdk-go-v2/service/sso v1.26.0 h1:cuFWHH87GP1NBGXXfMicUbE7Oty5KpPxN6w4JpmuxYc= -github.com/aws/aws-sdk-go-v2/service/sso v1.26.0/go.mod h1:aJBemdlbCKyOXEXdXBqS7E+8S9XTDcOTaoOjtng54hA= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.20.0/go.mod h1:dWqm5G767qwKPuayKfzm4rjzFmVjiBFbOJrpSPnAMDs= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0 h1:t2va+wewPOYIqC6XyJ4MGjiGKkczMAPsgq5W4FtL9ME= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0/go.mod h1:ExCTcqYqN0hYYRsDlBVU8+68grqlWdgX9/nZJwQW4aY= -github.com/aws/aws-sdk-go-v2/service/sts v1.16.3/go.mod h1:bfBj0iVmsUyUg4weDB4NxktD9rDGeKSVWnjTnwbx9b8= -github.com/aws/aws-sdk-go-v2/service/sts v1.25.3/go.mod h1:4EqRHDCKP78hq3zOnmFXu5k0j4bXbRFfCh/zQ6KnEfQ= -github.com/aws/aws-sdk-go-v2/service/sts v1.35.0 h1:FD9agdG4CeOGS3ORLByJk56YIXDS7mxFpmZyCtpqExc= -github.com/aws/aws-sdk-go-v2/service/sts v1.35.0/go.mod h1:NDzDPbBF1xtSTZUMuZx0w3hIfWzcL7X2AQ0Tr9becIQ= -github.com/aws/smithy-go v1.11.2/go.mod h1:3xHYmszWVx2c0kIwQeEVf9uSm4fYZt67FBJnwub1bgM= -github.com/aws/smithy-go v1.17.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= -github.com/aws/smithy-go v1.22.5 h1:P9ATCXPMb2mPjYBgueqJNCA5S9UfktsW0tTxi+a7eqw= -github.com/aws/smithy-go v1.22.5/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/bobg/gcsobj v0.1.2/go.mod h1:vS49EQ1A1Ib8FgrL58C8xXYZyOCR2TgzAdopy6/ipa8= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -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/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/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= -github.com/colinmarc/hdfs/v2 v2.1.1/go.mod h1:M3x+k8UKKmxtFu++uAZ0OtDU8jR3jnaZIAc6yK4Ue0c= -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/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU= -github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= -github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= -github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= -github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= -github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/duckdb/duckdb-go-bindings v0.1.16 h1:XPCk9hzP06PoWIxDPVU3gAy0m1XmLaZHTzLggNx/U9k= -github.com/duckdb/duckdb-go-bindings v0.1.16/go.mod h1:pBnfviMzANT/9hi4bg+zW4ykRZZPCXlVuvBWEcZofkc= -github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11 h1:GXQkG4HmEbwPtqCSabJTp9wZQQ7Gqr3KveLNesQWQOs= -github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11/go.mod h1:Ezo7IbAfB8NP7CqPIN8XEHKUg5xdRRQhcPPlCXImXYA= -github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11 h1:ATJMSBIDA/YAm/6CKeBDRtGK1OOwqfTZbWg9Y5fAc9E= -github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11/go.mod h1:eS7m/mLnPQgVF4za1+xTyorKRBuK0/BA44Oy6DgrGXI= -github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11 h1:AjvnGst1avyOECYiykthyHR4DTYTaqNDPr5W/0t5j0k= -github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11/go.mod h1:1GOuk1PixiESxLaCGFhag+oFi7aP+9W8byymRAvunBk= -github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11 h1:j3B1biawuhtxe2Chkiqcwf1Kxe8VJc8lLVmjBIcJrkI= -github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11/go.mod h1:o7crKMpT2eOIi5/FY6HPqaXcvieeLSqdXXaXbruGX7w= -github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11 h1:xR3vRE8y+48U6xDNkUlOfbl7/OTA7FVcDXJ+5vETuHU= -github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11/go.mod h1:IlOhJdVKUJCAPj3QsDszUo8DVdvp1nBFp4TUJVdw99s= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -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/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= -github.com/gin-gonic/gin v1.7.3/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= -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-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= -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-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= -github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-viper/mapstructure/v2 v2.3.0 h1:27XbWsHIqhbdR5TIC911OfYvgSaW93HM+dX7970Q7jk= -github.com/go-viper/mapstructure/v2 v2.3.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= -github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= -github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.4.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= -github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188/go.mod h1:vXjM/+wXQnTPR4KqTKDgJukSZ6amVRtWMPEjE6sQoK8= -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/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/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -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.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= -github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -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/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/flatbuffers v25.2.10+incompatible h1:F3vclr7C3HpB1k9mxCGRMXq6FdUalZ6H/pNX4FP1v0Q= -github.com/google/flatbuffers v25.2.10+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -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.6/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.8/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/go-replayers/grpcreplay v1.1.0/go.mod h1:qzAvJ8/wi57zq7gWqaE6AwLM6miiXUQwP1S+I9icmhk= -github.com/google/go-replayers/httpreplay v1.1.1/go.mod h1:gN9GeLIs7l6NUoVaSSnv2RiqK1NiwAmD0MrKeC9IIks= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+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/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -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-20200905233945-acf8798be1f7/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-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210506205249-923b5ab0fc1a/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.2.0/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.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= -github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/wire v0.5.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU= -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.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hanwen/go-fuse v1.0.0/go.mod h1:unqXarDXqzAk0rt98O2tVndEPIpUgLD9+rwFisZH3Ok= -github.com/hanwen/go-fuse/v2 v2.1.0/go.mod h1:oRyA5eK+pvJyv5otpO/DgccS8y/RvYMaO00GgRLGryc= -github.com/hashicorp/go-uuid v0.0.0-20180228145832-27454136f036/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -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/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/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.11.0/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= -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/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.2.0/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-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= -github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/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.10.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.15.0/go.mod h1:D/zyOyXiaM1TmVWnOM18p0xdDtdakRBa0RsVGI3U3bw= -github.com/jackc/pgx/v5 v5.7.5 h1:JHGfMnQY+IEtGM63d+NGMjoRpysB2JBwDr5fsngwmJs= -github.com/jackc/pgx/v5 v5.7.5/go.mod h1:aruU7o91Tc2q2cFp5h4uP3f6ztExVpyVv88Xl/8Vl8M= -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.2.1 h1:gI8os0wpRXFd4FiAY2dWiqRK037tjj3t7rKFeO4X5iw= -github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= -github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= -github.com/jcmturner/gofork v0.0.0-20180107083740-2aebee971930/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= -github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= -github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -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/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= -github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= -github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.13.1/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= -github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= -github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= -github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= -github.com/klauspost/cpuid/v2 v2.2.11 h1:0OwqZRYI2rFrjS4kvkDnqJkKHdHaRnCm68/DY4OxRzU= -github.com/klauspost/cpuid/v2 v2.2.11/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= -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/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -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/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -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.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/linkedin/goavro v2.1.0+incompatible h1:DV2aUlj2xZiuxQyvag8Dy7zjY69ENjS66bWkSfdpddY= -github.com/linkedin/goavro v2.1.0+incompatible/go.mod h1:bBCwI2eGYpUI/4820s67MElg9tdeLbINjLjiM2xZFYM= -github.com/marcboeker/go-duckdb/arrowmapping v0.0.9 h1:xj+kFOqR2gH3Mcxx9LmAVHebSnCiPm303N+uxfkWVmY= -github.com/marcboeker/go-duckdb/arrowmapping v0.0.9/go.mod h1:o56AqVS90v5bpxhPnOK9La7AfNTOrMORiqTQrlRbdPQ= -github.com/marcboeker/go-duckdb/mapping v0.0.10 h1:b/y2W8/hNlD0Dwjq0mCqIlLXpjQMnWy0WqDV9b9lHQQ= -github.com/marcboeker/go-duckdb/mapping v0.0.10/go.mod h1:Ro6Tw6sGG50O8S0daZsA8TrQJz/DvGrzGvMD7Jihirw= -github.com/marcboeker/go-duckdb/v2 v2.3.2 h1:96zG2JPyIhCFjHdBjjSpOdhzJzehoGTdl7LskkuMUTs= -github.com/marcboeker/go-duckdb/v2 v2.3.2/go.mod h1:VeXz9ZM6klNvICHrXEUzaHSgNqBeTdyMxr4CICw/UaY= -github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= -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.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs= -github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= -github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI= -github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= -github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= -github.com/minio/minio-go/v7 v7.0.34/go.mod h1:nCrRzjoSUQh8hgKKtu3Y708OLvRLtuASMg2/nvmbarw= -github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= -github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= -github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= -github.com/ncw/swift v1.0.52/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -github.com/pborman/getopt v0.0.0-20180729010549-6fdd0a2c7117/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= -github.com/pganalyze/pg_query_go/v6 v6.1.0 h1:jG5ZLhcVgL1FAw4C/0VNQaVmX1SUJx71wBGdtTtBvls= -github.com/pganalyze/pg_query_go/v6 v6.1.0/go.mod h1:nvTHIuoud6e1SfrUaFwHqT0i4b5Nr+1rPWVds3B5+50= -github.com/pierrec/lz4/v4 v4.1.8/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= -github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= -github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= -github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= -github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -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/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -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/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.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -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/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -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.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -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.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/xitongsys/parquet-go v1.5.1/go.mod h1:xUxwM8ELydxh4edHGegYq1pA8NnMKDx0K/GyB0o2bww= -github.com/xitongsys/parquet-go v1.6.2 h1:MhCaXii4eqceKPu9BwrjLqyK10oX9WF+xGhwvwbw7xM= -github.com/xitongsys/parquet-go v1.6.2/go.mod h1:IulAQyalCm0rPiZVNnCgm/PCL64X2tdSVGMQ/UeKqWA= -github.com/xitongsys/parquet-go-source v0.0.0-20190524061010-2b72cbee77d5/go.mod h1:xxCx7Wpym/3QCo6JhujJX51dzSXrwmb0oH6FQb39SEA= -github.com/xitongsys/parquet-go-source v0.0.0-20200817004010-026bad9b25d0/go.mod h1:HYhIKsdns7xz80OgkbgJYrtQY7FjHWHKH6cvN7+czGE= -github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b h1:zbb5qM/t3N+O33Vp5sFyG6yIcWZV1q7rfEjJM8UsRBQ= -github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b/go.mod h1:2ActxmJ4q17Cdruar9nKEkzKSOL1Ol03737Bkz10rTY= -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.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= -github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= -github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= -github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= -github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= -go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0= -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.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -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/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -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.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= -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.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= -gocloud.dev v0.26.0/go.mod h1:mkUgejbnbLotorqDyvedJO20XcZNTynmSeVSQS9btVg= -golang.org/x/crypto v0.0.0-20180723164146-c126467f60eb/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -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-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/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-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-20211115234514-b4de73f9ece8/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220511200225-c6db032c6c88/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= -golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= -golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= -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-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= -golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= -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/lint v0.0.0-20210508222113-6edffad5e616/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.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w= -golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= -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-20191112182307-2180aed22343/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-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -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-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211020060615-d418f374d309/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220401154927-543a649e0bdd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -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.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -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.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -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-20210220032951-036812b2e83c/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.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= -golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= -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-20191112214154-59a1497f0cea/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-20200828194041-157a740278f4/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-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/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-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/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-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220204135822-1c1b9b1eba6a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220330033206-e17cdc41300f/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-20220704084225-05e143d24a9e/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.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= -golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -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/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -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.5/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.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= -golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= -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/time v0.0.0-20211116232009-f0f3c7e86c11/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220224211638-0e9765cccd65/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-20190422233926-fe54fb35175b/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-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-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-20200828161849-5deb26317202/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20200915173823-2db8f0ff891c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20200918232735-d647fc253266/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -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.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo= -golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg= -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= -golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= -golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= -gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= -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.31.0/go.mod h1:CL+9IBCa2WWU6gRuBWaKqGWLFFwbEUXkfeMkHLQWYWo= -google.golang.org/api v0.32.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -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.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.46.0/go.mod h1:ceL4oozhkAiTID8XMmJBsIxID/9wMXJVVFXPg4ylg3I= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.58.0/go.mod h1:cAbP2FsxoGVNwtgNAmmn3y5G1TWAiVYRmg4yku3lv+E= -google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.64.0/go.mod h1:931CdxA8Rm4t6zqTFGSsgwbAEZ2+GMYurbndwSimebM= -google.golang.org/api v0.66.0/go.mod h1:I1dmXYpX7HGwz/ejRxwQp2qj5bFAz93HiCU1C1oYd9M= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.68.0/go.mod h1:sOM8pTpwgflXRhz+oC8H2Dr+UcbMqkPPWNJo88Q7TH8= -google.golang.org/api v0.69.0/go.mod h1:boanBiw+h5c3s+tBPgEzLDRHfFLWV0qXxRHz3ws7C80= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -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/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-20200513103714-09dca8ec2884/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-20200831141814-d751682dd103/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-20200914193844-75d14daec038/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200921151605-7abf4a1a14d5/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-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210429181445-86c259c2b4ab/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210517163617-5e0236093d7a/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210921142501-181ce0d877f6/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211018162055-cf77aa76bad2/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211223182754-3ac035c7e7cb/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220111164026-67b88f271998/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220114231437-d2e6a121cae0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220201184016-50beb8ab5c44/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220204002441-d6cc3cc0770e/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220211171837-173942840c17/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220216160803-4663080d8bc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220401170504-314d38edb7de/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -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.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -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.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= -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.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= -google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= -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-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= -gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= -gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q= -gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mNfM5bm88whjWx4= -gopkg.in/jcmturner/gokrb5.v7 v7.3.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= -gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8= -gopkg.in/linkedin/goavro.v1 v1.0.5 h1:BJa69CDh0awSsLUmZ9+BowBdokpduDZSM9Zk8oKHfN4= -gopkg.in/linkedin/goavro.v1 v1.0.5/go.mod h1:Aw5GdAbizjOEl0kAMHV9iHmA8reZzW/OKuJAl4Hb9F0= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/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/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= -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= -nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= -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/src/server/iceberg_reader.go b/src/server/iceberg_reader.go deleted file mode 100644 index 563d55a..0000000 --- a/src/server/iceberg_reader.go +++ /dev/null @@ -1,37 +0,0 @@ -package main - -import ( - "github.com/BemiHQ/BemiDB/src/common" -) - -type IcebergReader struct { - Config *Config - IcebergCatalog *common.IcebergCatalog -} - -func NewIcebergReader(config *Config, icebergCatalog *common.IcebergCatalog) *IcebergReader { - return &IcebergReader{ - Config: config, - IcebergCatalog: icebergCatalog, - } -} - -func (reader *IcebergReader) SchemaTables() (icebergSchemaTables common.Set[common.IcebergSchemaTable], err error) { - return reader.IcebergCatalog.SchemaTables() -} - -func (reader *IcebergReader) MaterializedViews() (icebergSchemaTables []common.IcebergMaterializedView, err error) { - return reader.IcebergCatalog.MaterializedViews() -} - -func (reader *IcebergReader) MaterializedView(icebergSchemaTable common.IcebergSchemaTable) (icebergMaterializedView common.IcebergMaterializedView, err error) { - return reader.IcebergCatalog.MaterializedView(icebergSchemaTable) -} - -func (reader *IcebergReader) TableColumns(icebergSchemaTable common.IcebergSchemaTable) (catalogTableColumns []common.CatalogTableColumn, err error) { - return reader.IcebergCatalog.TableColumns(icebergSchemaTable) -} - -func (reader *IcebergReader) MetadataFileS3Path(icebergSchemaTable common.IcebergSchemaTable) string { - return reader.IcebergCatalog.MetadataFileS3Path(icebergSchemaTable) -} diff --git a/src/server/iceberg_writer.go b/src/server/iceberg_writer.go deleted file mode 100644 index 3e817bb..0000000 --- a/src/server/iceberg_writer.go +++ /dev/null @@ -1,86 +0,0 @@ -package main - -import ( - "github.com/BemiHQ/BemiDB/src/common" -) - -type IcebergWriter struct { - Config *Config - StorageS3 *common.StorageS3 - ServerDuckdbClient *common.DuckdbClient - IcebergCatalog *common.IcebergCatalog -} - -func NewIcebergWriter(config *Config, storageS3 *common.StorageS3, serverDuckdbClient *common.DuckdbClient, icebergCatalog *common.IcebergCatalog) *IcebergWriter { - return &IcebergWriter{ - Config: config, - StorageS3: storageS3, - ServerDuckdbClient: serverDuckdbClient, - IcebergCatalog: icebergCatalog, - } -} - -func (writer *IcebergWriter) CreateMaterializedView(icebergSchemaTable common.IcebergSchemaTable, remappedDefinitionQuery string, ifNotExists bool) error { - return writer.IcebergCatalog.CreateMaterializedView(icebergSchemaTable, remappedDefinitionQuery, ifNotExists) -} - -func (writer *IcebergWriter) RenameMaterializedView(icebergSchemaTable common.IcebergSchemaTable, newName string, missingOk bool) error { - err := writer.IcebergCatalog.RenameMaterializedView(icebergSchemaTable, newName, missingOk) - if err != nil { - return err - } - - icebergTable := common.NewIcebergTable(writer.Config.CommonConfig, writer.StorageS3, writer.ServerDuckdbClient, icebergSchemaTable) - icebergTable.Rename(newName) - return nil -} - -func (writer *IcebergWriter) RefreshMaterializedView(icebergSchemaTable common.IcebergSchemaTable, remappedDefinitionQuery string) error { - // Delete -syncing table - syncingIcebergSchemaTable := common.IcebergSchemaTable{Schema: icebergSchemaTable.Schema, Table: icebergSchemaTable.Table + common.TEMP_TABLE_SUFFIX_SYNCING} - syncingIcebergTable := common.NewIcebergTable(writer.Config.CommonConfig, writer.StorageS3, writer.ServerDuckdbClient, syncingIcebergSchemaTable) - syncingIcebergTable.DropIfExists() - - // Insert and create -syncing table - icebergTableWriter := common.NewIcebergTableWriter( - writer.Config.CommonConfig, - writer.StorageS3, - writer.ServerDuckdbClient, - syncingIcebergTable, - []*common.IcebergSchemaColumn{}, - 1, - ) - err := icebergTableWriter.InsertFromQuery(remappedDefinitionQuery) - if err != nil { - return err - } - - // Delete -deleting table - deletingIcebergSchemaTable := common.IcebergSchemaTable{Schema: icebergSchemaTable.Schema, Table: icebergSchemaTable.Table + common.TEMP_TABLE_SUFFIX_DELETING} - deletingIcebergTable := common.NewIcebergTable(writer.Config.CommonConfig, writer.StorageS3, writer.ServerDuckdbClient, deletingIcebergSchemaTable) - deletingIcebergTable.DropIfExists() - - // Rename table to -deleting - icebergTable := common.NewIcebergTable(writer.Config.CommonConfig, writer.StorageS3, writer.ServerDuckdbClient, icebergSchemaTable) - icebergTable.Rename(deletingIcebergSchemaTable.Table) - - // Rename -syncing to table - syncingIcebergTable.Rename(icebergSchemaTable.Table) - - // Delete -deleting table - deletingIcebergTable.DropIfExists() - - return nil -} - -func (writer *IcebergWriter) DropMaterializedView(icebergSchemaTable common.IcebergSchemaTable, missingOk bool) error { - err := writer.IcebergCatalog.DropMaterializedView(icebergSchemaTable, missingOk) - if err != nil { - return err - } - - icebergTable := common.NewIcebergTable(writer.Config.CommonConfig, writer.StorageS3, writer.ServerDuckdbClient, icebergSchemaTable) - icebergTable.DropIfExists() - - return nil -} diff --git a/src/server/main.go b/src/server/main.go deleted file mode 100644 index c5d1180..0000000 --- a/src/server/main.go +++ /dev/null @@ -1,88 +0,0 @@ -package main - -import ( - "log" - "net/http" - _ "net/http/pprof" - "slices" - "sync/atomic" - - "github.com/BemiHQ/BemiDB/src/common" -) - -const ( - COMMAND_START = "start" - COMMAND_VERSION = "version" - - DUCKDB_SCHEMA_MAIN = "main" -) - -func main() { - config := LoadConfig() - defer common.HandleUnexpectedPanic(config.CommonConfig) - - if config.CommonConfig.LogLevel == common.LOG_LEVEL_TRACE { - go enableProfiling() - } - - tcpListener := NewTcpListener(config) - common.LogInfo(config.CommonConfig, "BemiDB: Listening on", tcpListener.Addr()) - - duckdbClient := common.NewDuckdbClient(config.CommonConfig, duckdbBootQueris(config)) - common.LogInfo(config.CommonConfig, "DuckDB: Connected") - defer duckdbClient.Close() - - queryHandler := NewQueryHandler(config, duckdbClient) - - var connectionCount int64 = 0 - for { - conn := AcceptConnection(config, tcpListener) - atomic.AddInt64(&connectionCount, 1) - common.LogInfo(config.CommonConfig, "BemiDB: Accepted", common.Int64ToString(atomic.LoadInt64(&connectionCount))+"th", "connection from", conn.RemoteAddr()) - server := NewPostgresServer(config, &conn) - - go func() { - server.Run(queryHandler) - defer server.Close() - common.LogInfo(config.CommonConfig, "BemiDB: Closed", common.Int64ToString(atomic.LoadInt64(&connectionCount))+"th", "connection from", conn.RemoteAddr()) - atomic.AddInt64(&connectionCount, -1) - }() - } -} - -func duckdbBootQueris(config *Config) []string { - return slices.Concat( - []string{ - // Set up Iceberg - "INSTALL iceberg", - "LOAD iceberg", - // Set up vector similarity search - "INSTALL vss", - "LOAD vss", - - // Set up schemas - "SELECT oid FROM pg_catalog.pg_namespace", - "CREATE SCHEMA " + PG_SCHEMA_PUBLIC, - - // Configure DuckDB - "SET memory_limit='3GB'", - "SET threads=2", - "SET scalar_subquery_error_on_multiple_rows=false", - }, - - // Create pg-compatible functions - CreatePgCatalogMacroQueries(config), - CreateInformationSchemaMacroQueries(config), - - // Create pg-compatible tables and views - CreatePgCatalogTableQueries(config), - CreateInformationSchemaTableQueries(config), - - // Use the public schema - []string{"USE " + PG_SCHEMA_PUBLIC}, - ) -} - -func enableProfiling() { - func() { log.Println(http.ListenAndServe(":6060", nil)) }() -} diff --git a/src/server/query_handler.go b/src/server/query_handler.go deleted file mode 100644 index df64f0d..0000000 --- a/src/server/query_handler.go +++ /dev/null @@ -1,369 +0,0 @@ -package main - -import ( - "context" - "database/sql" - "encoding/binary" - "fmt" - "strings" - "time" - - "github.com/google/uuid" - "github.com/jackc/pgx/v5/pgproto3" - "github.com/jackc/pgx/v5/pgtype" - - "github.com/BemiHQ/BemiDB/src/common" -) - -const ( - FALLBACK_SQL_QUERY = "SELECT 1" - PREPARE_STATEMENT_TIMEOUT = 30 * time.Second -) - -type QueryHandler struct { - Config *Config - ServerDuckdbClient *common.DuckdbClient - QueryRemapper *QueryRemapper - ResponseHandler *ResponseHandler -} - -type PreparedStatement struct { - // Parse - Name string - OriginalQuery string - Query string - Statement *sql.Stmt - ParameterOIDs []uint32 - - // Bind - Bound bool - Variables []interface{} - Portal string - - // Describe - Described bool - - // Describe/Execute - Rows *sql.Rows -} - -func NewQueryHandler(config *Config, serverDuckdbClient *common.DuckdbClient) *QueryHandler { - storageS3 := common.NewStorageS3(config.CommonConfig) - icebergCatalog := common.NewIcebergCatalog(config.CommonConfig) - icebergReader := NewIcebergReader(config, icebergCatalog) - icebergWriter := NewIcebergWriter(config, storageS3, serverDuckdbClient, icebergCatalog) - - queryHandler := &QueryHandler{ - Config: config, - ServerDuckdbClient: serverDuckdbClient, - QueryRemapper: NewQueryRemapper(config, icebergReader, icebergWriter, serverDuckdbClient), - ResponseHandler: NewResponseHandler(config), - } - - return queryHandler -} - -func (queryHandler *QueryHandler) HandleSimpleQuery(originalQuery string) ([]pgproto3.Message, error) { - queryStatements, originalQueryStatements, err := queryHandler.QueryRemapper.ParseAndRemapQuery(originalQuery) - if err != nil { - return nil, err - } - if len(queryStatements) == 0 { - return []pgproto3.Message{&pgproto3.EmptyQueryResponse{}}, nil - } - - var queriesMessages []pgproto3.Message - - for i, queryStatement := range queryStatements { - rows, err := queryHandler.ServerDuckdbClient.QueryContext(context.Background(), queryStatement) - if err != nil { - errorMessage := err.Error() - if errorMessage == "Binder Error: UNNEST requires a single list as input" { - // https://github.com/duckdbClient/duckdb/issues/11693 - common.LogWarn(queryHandler.Config.CommonConfig, "Couldn't handle query via DuckDB:", queryStatement+"\n"+err.Error()) - queriesMsgs, err := queryHandler.HandleSimpleQuery(FALLBACK_SQL_QUERY) // self-recursion - if err != nil { - return nil, err - } - queriesMessages = append(queriesMessages, queriesMsgs...) - continue - } else { - return nil, err - } - } - defer rows.Close() - - var queryMessages []pgproto3.Message - descriptionMessages, err := queryHandler.rowsToDescriptionMessages(rows, originalQueryStatements[i]) - if err != nil { - return nil, err - } - queryMessages = append(queryMessages, descriptionMessages...) - dataMessages, err := queryHandler.rowsToDataMessages(rows, originalQueryStatements[i]) - if err != nil { - return nil, err - } - queryMessages = append(queryMessages, dataMessages...) - - queriesMessages = append(queriesMessages, queryMessages...) - } - - return queriesMessages, nil -} - -func (queryHandler *QueryHandler) HandleParseQuery(message *pgproto3.Parse) ([]pgproto3.Message, *PreparedStatement, error) { - originalQuery := string(message.Query) - queryStatements, _, err := queryHandler.QueryRemapper.ParseAndRemapQuery(originalQuery) - if err != nil { - return nil, nil, err - } - if len(queryStatements) > 1 { - return nil, nil, fmt.Errorf("multiple queries in a single parse message are not supported: %s", originalQuery) - } - - preparedStatement := &PreparedStatement{ - Name: message.Name, - OriginalQuery: originalQuery, - ParameterOIDs: message.ParameterOIDs, - } - if len(queryStatements) == 0 { - return []pgproto3.Message{&pgproto3.ParseComplete{}}, preparedStatement, nil - } - - query := queryStatements[0] - preparedStatement.Query = query - statement, err := queryHandler.prepareContextWithTimeout(query) - preparedStatement.Statement = statement - if err != nil { - return nil, nil, err - } - - return []pgproto3.Message{&pgproto3.ParseComplete{}}, preparedStatement, nil -} - -func (queryHandler *QueryHandler) prepareContextWithTimeout(query string) (*sql.Stmt, error) { - ctx := context.Background() - timeoutCtx, cancel := context.WithTimeout(ctx, PREPARE_STATEMENT_TIMEOUT) - defer cancel() - - type result struct { - statement *sql.Stmt - err error - } - resultChan := make(chan result, 1) - - go func() { - statement, err := queryHandler.ServerDuckdbClient.PrepareContext(timeoutCtx, query) - resultChan <- result{statement, err} - }() - - select { - case res := <-resultChan: - return res.statement, res.err - case <-timeoutCtx.Done(): - common.LogWarn(queryHandler.Config.CommonConfig, "PrepareContext timed out, recreating DuckDB connection") - queryHandler.ServerDuckdbClient.RecreateDb() - queryHandler.QueryRemapper.remapperTable.Reset() - return queryHandler.ServerDuckdbClient.PrepareContext(ctx, query) - } -} - -func (queryHandler *QueryHandler) HandleBindQuery(message *pgproto3.Bind, preparedStatement *PreparedStatement) ([]pgproto3.Message, *PreparedStatement, error) { - if message.PreparedStatement != preparedStatement.Name { - return nil, nil, fmt.Errorf("prepared statement mismatch, %s instead of %s: %s", message.PreparedStatement, preparedStatement.Name, preparedStatement.OriginalQuery) - } - - var variables []interface{} - paramFormatCodes := message.ParameterFormatCodes - - for i, param := range message.Parameters { - if param == nil { - continue - } - - textFormat := true - if len(paramFormatCodes) == 1 { - textFormat = paramFormatCodes[0] == 0 - } else if len(paramFormatCodes) > 1 { - textFormat = paramFormatCodes[i] == 0 - } - - if textFormat { - variables = append(variables, string(param)) - } else if len(param) == 4 { - variables = append(variables, int32(binary.BigEndian.Uint32(param))) - } else if len(param) == 8 { - variables = append(variables, int64(binary.BigEndian.Uint64(param))) - } else if len(param) == 16 { - variables = append(variables, uuid.UUID(param).String()) - } else { - return nil, nil, fmt.Errorf("unsupported parameter format: %v (length %d). Original query: %s", param, len(param), preparedStatement.OriginalQuery) - } - } - - common.LogDebug(queryHandler.Config.CommonConfig, "Bound variables:", variables) - preparedStatement.Bound = true - preparedStatement.Variables = variables - preparedStatement.Portal = message.DestinationPortal - - messages := []pgproto3.Message{&pgproto3.BindComplete{}} - - return messages, preparedStatement, nil -} - -func (queryHandler *QueryHandler) HandleDescribeQuery(message *pgproto3.Describe, preparedStatement *PreparedStatement) ([]pgproto3.Message, *PreparedStatement, error) { - switch message.ObjectType { - case 'S': // Statement - if message.Name != preparedStatement.Name { - return nil, nil, fmt.Errorf("statement mismatch, %s instead of %s: %s", message.Name, preparedStatement.Name, preparedStatement.OriginalQuery) - } - case 'P': // Portal - if message.Name != preparedStatement.Portal { - return nil, nil, fmt.Errorf("portal mismatch, %s instead of %s: %s", message.Name, preparedStatement.Portal, preparedStatement.OriginalQuery) - } - default: - return nil, nil, fmt.Errorf("unsupported describe object type: %c. Original query: %s", message.ObjectType, preparedStatement.OriginalQuery) - } - - preparedStatement.Described = true - if preparedStatement.Query == "" || !preparedStatement.Bound { // Empty query or Parse->[No Bind]->Describe - return []pgproto3.Message{&pgproto3.NoData{}}, preparedStatement, nil - } - - rows, err := preparedStatement.Statement.QueryContext(context.Background(), preparedStatement.Variables...) - if err != nil { - return nil, nil, fmt.Errorf("couldn't execute statement: %w. Original query: %s", err, preparedStatement.OriginalQuery) - } - preparedStatement.Rows = rows - - messages, err := queryHandler.rowsToDescriptionMessages(preparedStatement.Rows, preparedStatement.OriginalQuery) - if err != nil { - return nil, nil, err - } - return messages, preparedStatement, nil -} - -func (queryHandler *QueryHandler) HandleExecuteQuery(message *pgproto3.Execute, preparedStatement *PreparedStatement) ([]pgproto3.Message, error) { - if message.Portal != preparedStatement.Portal { - return nil, fmt.Errorf("portal mismatch, %s instead of %s: %s", message.Portal, preparedStatement.Portal, preparedStatement.OriginalQuery) - } - - if preparedStatement.Query == "" { - return []pgproto3.Message{&pgproto3.EmptyQueryResponse{}}, nil - } - - if preparedStatement.Rows == nil { // Parse->[No Bind]->Describe->Execute or Parse->Bind->[No Describe]->Execute - rows, err := preparedStatement.Statement.QueryContext(context.Background(), preparedStatement.Variables...) - if err != nil { - return nil, err - } - preparedStatement.Rows = rows - } - - defer preparedStatement.Rows.Close() - - return queryHandler.rowsToDataMessages(preparedStatement.Rows, preparedStatement.OriginalQuery) -} - -func (queryHandler *QueryHandler) rowsToDescriptionMessages(rows *sql.Rows, originalQuery string) ([]pgproto3.Message, error) { - cols, err := rows.ColumnTypes() - if err != nil { - return nil, fmt.Errorf("couldn't get column types: %w. Original query: %s", err, originalQuery) - } - - var messages []pgproto3.Message - - rowDescription := queryHandler.generateRowDescription(cols) - if rowDescription != nil { - messages = append(messages, rowDescription) - } - - return messages, nil -} - -func (queryHandler *QueryHandler) rowsToDataMessages(rows *sql.Rows, originalQuery string) ([]pgproto3.Message, error) { - cols, err := rows.ColumnTypes() - if err != nil { - return nil, fmt.Errorf("couldn't get column types: %w. Original query: %s", err, originalQuery) - } - - var messages []pgproto3.Message - for rows.Next() { - dataRow, err := queryHandler.generateDataRow(rows, cols) - if err != nil { - return nil, fmt.Errorf("couldn't get data row: %w. Original query: %s", err, originalQuery) - } - messages = append(messages, dataRow) - } - - commandTag := FALLBACK_SQL_QUERY - upperOriginalQueryStatement := strings.ToUpper(originalQuery) - switch { - case strings.HasPrefix(upperOriginalQueryStatement, "SET "): - commandTag = "SET" - case strings.HasPrefix(upperOriginalQueryStatement, "SHOW "): - commandTag = "SHOW" - case strings.HasPrefix(upperOriginalQueryStatement, "DISCARD ALL"): - commandTag = "DISCARD ALL" - case strings.HasPrefix(upperOriginalQueryStatement, "BEGIN"): - commandTag = "BEGIN" - case strings.HasPrefix(upperOriginalQueryStatement, "COMMIT"): - commandTag = "COMMIT" - case strings.HasPrefix(upperOriginalQueryStatement, "CREATE MATERIALIZED VIEW "): - commandTag = "CREATE MATERIALIZED VIEW" - case strings.HasPrefix(upperOriginalQueryStatement, "DROP MATERIALIZED VIEW "): - commandTag = "DROP MATERIALIZED VIEW" - case strings.HasPrefix(upperOriginalQueryStatement, "REFRESH MATERIALIZED VIEW "): - commandTag = "REFRESH MATERIALIZED VIEW" - default: - // Fallback to SELECT from FALLBACK_SQL_QUERY - } - - messages = append(messages, &pgproto3.CommandComplete{CommandTag: []byte(commandTag)}) - return messages, nil -} - -func (queryHandler *QueryHandler) generateRowDescription(cols []*sql.ColumnType) *pgproto3.RowDescription { - description := pgproto3.RowDescription{Fields: []pgproto3.FieldDescription{}} - - for _, col := range cols { - typeIod := queryHandler.ResponseHandler.ColumnDescriptionTypeOid(col) - - if col.Name() == "Success" && typeIod == pgtype.BoolOID && len(cols) == 1 { - // Skip the "Success" DuckDBClient column returned from SET ... commands - return nil - } - - description.Fields = append(description.Fields, pgproto3.FieldDescription{ - Name: []byte(col.Name()), - TableOID: 0, - TableAttributeNumber: 0, - DataTypeOID: typeIod, - DataTypeSize: -1, - TypeModifier: -1, - Format: 0, - }) - } - return &description -} - -func (queryHandler *QueryHandler) generateDataRow(rows *sql.Rows, cols []*sql.ColumnType) (*pgproto3.DataRow, error) { - valuePointers := make([]interface{}, len(cols)) - for i, col := range cols { - valuePointers[i] = queryHandler.ResponseHandler.RowValuePointer(col) - } - - err := rows.Scan(valuePointers...) - if err != nil { - return nil, err - } - - var values [][]byte - for i, valuePointer := range valuePointers { - value := queryHandler.ResponseHandler.RowValueBytes(valuePointer, cols[i]) - values = append(values, value) - } - dataRow := pgproto3.DataRow{Values: values} - - return &dataRow, nil -} diff --git a/src/server/query_handler_test.go b/src/server/query_handler_test.go deleted file mode 100644 index 140a0f7..0000000 --- a/src/server/query_handler_test.go +++ /dev/null @@ -1,2016 +0,0 @@ -package main - -import ( - "encoding/binary" - "flag" - "os" - "reflect" - "strconv" - "strings" - "testing" - - "github.com/google/uuid" - "github.com/jackc/pgx/v5/pgproto3" - "github.com/jackc/pgx/v5/pgtype" - - "github.com/BemiHQ/BemiDB/src/common" -) - -func TestHandleQuery(t *testing.T) { - queryHandler := initQueryHandler() - defer queryHandler.ServerDuckdbClient.Close() - - t.Run("PG functions", func(t *testing.T) { - testResponseByQuery(t, queryHandler, map[string]map[string][]string{ - "SELECT VERSION()": { - "description": {"version"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"PostgreSQL 17.0, compiled by BemiDB"}, - }, - "SELECT pg_catalog.pg_get_userbyid(p.proowner) AS owner, 'Foo' AS foo FROM pg_catalog.pg_proc p LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace LIMIT 1": { - "description": {"owner", "foo"}, - "types": {uint32ToString(pgtype.TextOID), uint32ToString(pgtype.TextOID)}, - "values": {"user", "Foo"}, - }, - "SELECT QUOTE_IDENT('fooBar') AS quote_ident": { - "description": {"quote_ident"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"\"fooBar\""}, - }, - "SELECT setting from pg_show_all_settings() WHERE name = 'default_null_order'": { - "description": {"setting"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"nulls_last"}, - }, - "SELECT setting from pg_catalog.pg_show_all_settings() WHERE name = 'default_null_order'": { - "description": {"setting"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"nulls_last"}, - }, - "SELECT pg_catalog.pg_get_partkeydef(c.oid) AS pg_get_partkeydef FROM pg_catalog.pg_class c LIMIT 1": { - "description": {"pg_get_partkeydef"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {""}, - }, - "SELECT pg_tablespace_location(t.oid) loc FROM pg_catalog.pg_tablespace": { - "description": {"loc"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {""}, - }, - "SELECT pg_catalog.pg_get_expr(adbin, drelid) AS def_value FROM pg_catalog.pg_attrdef": { - "description": {"def_value"}, - }, - "SELECT pg_catalog.pg_get_expr(adbin, drelid, TRUE) AS def_value FROM pg_catalog.pg_attrdef": { - "description": {"def_value"}, - }, - "SELECT pg_catalog.pg_get_viewdef(NULL, TRUE) AS viewdef": { - "description": {"viewdef"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {""}, - }, - "SELECT set_config('bytea_output', 'hex', false) AS set_config": { - "description": {"set_config"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"hex"}, - }, - "SELECT pg_catalog.pg_encoding_to_char(6) AS pg_encoding_to_char": { - "description": {"pg_encoding_to_char"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"UTF8"}, - }, - "SELECT pg_backend_pid() AS pg_backend_pid": { - "description": {"pg_backend_pid"}, - "types": {uint32ToString(pgtype.Int4OID)}, - "values": {"0"}, - }, - "SELECT pg_cancel_backend(12345) AS pg_cancel_backend": { - "description": {"pg_cancel_backend"}, - "types": {uint32ToString(pgtype.BoolOID)}, - "values": {"t"}, - }, - "SELECT * from pg_is_in_recovery()": { - "description": {"pg_is_in_recovery"}, - "types": {uint32ToString(pgtype.BoolOID)}, - "values": {"f"}, - }, - "SELECT row_to_json(t) AS row_to_json FROM (SELECT usename FROM pg_shadow WHERE usename='user') t": { - "description": {"row_to_json"}, - "types": {uint32ToString(pgtype.JSONOID)}, - "values": {`{"usename":"user"}`}, - }, - "SELECT current_setting('default_tablespace') AS current_setting": { - "description": {"current_setting"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {""}, - }, - "SELECT main.array_to_string('[1, 2, 3]', '') as str": { - "description": {"str"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"123"}, - }, - "SELECT pg_catalog.array_to_string('[1, 2, 3]', '') as str": { - "description": {"str"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"123"}, - }, - "SELECT array_to_string('[1, 2, 3]', '') as str": { - "description": {"str"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"123"}, - }, - "SELECT * FROM pg_catalog.generate_series(1, 1)": { - "description": {"generate_series"}, - "types": {uint32ToString(pgtype.Int8OID)}, - "values": {"1"}, - }, - "SELECT pg_catalog.aclexplode(db.datacl) AS d FROM pg_catalog.pg_database db": { - "description": {"d"}, - "types": {uint32ToString(pgtype.JSONOID)}, - "values": {""}, - }, - "SELECT TRIM (BOTH '\"' FROM pg_catalog.pg_get_indexdef(1, 1, false)) AS trim": { - "description": {"trim"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {""}, - }, - "SELECT (d).grantee AS grantee, (d).grantor AS grantor, (d).is_grantable AS is_grantable, (d).privilege_type AS privilege_type FROM (SELECT pg_catalog.aclexplode(db.datacl) AS d FROM pg_catalog.pg_database db WHERE db.oid = 16388::OID) a": { - "description": {"grantee", "grantor", "is_grantable", "privilege_type"}, - "types": {uint32ToString(pgtype.JSONOID), uint32ToString(pgtype.JSONOID), uint32ToString(pgtype.JSONOID), uint32ToString(pgtype.JSONOID)}, - "values": {"", "", "", ""}, - }, - "SELECT format('Hello %s, %s, %1$s', 'World', 'Earth') AS str": { - "description": {"str"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"Hello World, Earth, World"}, - }, - "SELECT format('%s', \"postgres\".\"test_table\".\"varchar_column\") AS str FROM postgres.test_table WHERE varchar_column IS NOT NULL": { - "description": {"str"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"varchar"}, - }, - "SELECT jsonb_extract_path_text(json_column, 'key') AS jsonb_extract_path_text FROM postgres.test_table WHERE json_column IS NOT NULL": { - "description": {"jsonb_extract_path_text"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"value"}, - }, - "SELECT jsonb_extract_path_text(json_column, VARIADIC ARRAY['key']) AS jsonb_extract_path_text FROM postgres.test_table WHERE json_column IS NOT NULL": { - "description": {"jsonb_extract_path_text"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"value"}, - }, - "SELECT encode(sha256('foo'), 'hex'::text) AS encode": { - "description": {"encode"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae"}, - }, - "SELECT JSONB_AGG(jsonb_column->'key') FILTER (WHERE jsonb_column->'key' IS NOT NULL) as nested_objects FROM postgres.test_table": { - "description": {"nested_objects"}, - "types": {uint32ToString(pgtype.JSONOID)}, - "values": {"[\"value\"]"}, - }, - "SELECT string_agg(jsonb_column->'key') FILTER (WHERE jsonb_column->'key' IS NOT NULL) FROM postgres.test_table;": { - "description": {"string_agg"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"\"value\""}, - }, - "SELECT jsonb_object_agg('key', 'value')": { - "description": {"jsonb_object_agg"}, - "types": {uint32ToString(pgtype.JSONOID)}, - "values": {"{\"key\":\"value\"}"}, - }, - "SELECT json_build_object('min', 1, 'max', 2) AS json_build_object": { - "description": {"json_build_object"}, - "types": {uint32ToString(pgtype.JSONOID)}, - "values": {"{\"max\":2,\"min\":1}"}, - }, - "SELECT pg_catalog.pg_get_statisticsobjdef_columns(1) AS pg_get_statisticsobjdef_columns": { - "description": {"pg_get_statisticsobjdef_columns"}, - "types": {uint32ToString(pgtype.Int4OID)}, - "values": {""}, - }, - "SELECT pg_catalog.pg_relation_is_publishable('1') AS pg_relation_is_publishable": { - "description": {"pg_relation_is_publishable"}, - "types": {uint32ToString(pgtype.Int4OID)}, - "values": {""}, - }, - "SELECT jsonb_array_length('[1, 2, 3]'::jsonb)": { - "description": {"jsonb_array_length"}, - "types": {uint32ToString(pgtype.Int4OID)}, - "values": {"3"}, - }, - "SELECT jsonb_pretty('{\"key\": \"value\"}'::JSONB)": { - "description": {"jsonb_pretty"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"{\n \"key\": \"value\"\n}"}, - }, - "SELECT json_array_elements('[{\"key\": \"value1\"}]')": { - "description": {"json_array_elements"}, - "types": {uint32ToString(pgtype.JSONOID)}, - "values": {"{\"key\":\"value1\"}"}, - }, - "SELECT value FROM json_array_elements('[{\"key\": \"value1\"}]')": { - "description": {"value"}, - "types": {uint32ToString(pgtype.JSONOID)}, - "values": {"{\"key\":\"value1\"}"}, - }, - "SELECT foo FROM jsonb_array_elements('[{\"key\": \"value1\"}]') AS foo": { - "description": {"foo"}, - "types": {uint32ToString(pgtype.JSONOID)}, - "values": {"{\"key\":\"value1\"}"}, - }, - "SELECT TO_CHAR('2024-01-15 14:30:00'::timestamp, 'YYYY-MM-DD')": { - "description": {"to_char"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"2024-01-15"}, - }, - }) - }) - - t.Run("PG system tables", func(t *testing.T) { - testResponseByQuery(t, queryHandler, map[string]map[string][]string{ - "SELECT oid, typname AS typename FROM pg_type WHERE typname='geometry' OR typname='geography'": { - "description": {"oid", "typename"}, - "types": {uint32ToString(pgtype.OIDOID), uint32ToString(pgtype.TextOID)}, - "values": {}, - }, - "SELECT relname FROM pg_catalog.pg_class WHERE relnamespace = (SELECT oid FROM pg_catalog.pg_namespace WHERE nspname = 'postgres' LIMIT 1) ORDER BY relname DESC LIMIT 1": { - "description": {"relname"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"test_table"}, - }, - "SELECT oid FROM pg_catalog.pg_extension": { - "description": {"oid"}, - "types": {uint32ToString(pgtype.OIDOID)}, - "values": {"13823"}, - }, - "SELECT slot_name FROM pg_replication_slots": { - "description": {"slot_name"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {}, - }, - "SELECT oid, datname, datdba FROM pg_catalog.pg_database where oid = 16388": { - "description": {"oid", "datname", "datdba"}, - "types": {uint32ToString(pgtype.OIDOID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.Int8OID)}, - "values": {"16388", "bemidb", "10"}, - }, - "SELECT COALESCE(NULL, (SELECT datname FROM pg_database WHERE datname = 'bemidb')) AS datname": { - "description": {"datname"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"bemidb"}, - }, - "SELECT COALESCE(NULL, '[]'::jsonb) AS json_value": { - "description": {"json_value"}, - "types": {uint32ToString(pgtype.JSONOID)}, - "values": {"[]"}, - }, - "SELECT jsonb_array_length(COALESCE('[]'::jsonb, '{}'::jsonb)) AS length": { - "description": {"length"}, - "types": {uint32ToString(pgtype.Int4OID)}, - "values": {"0"}, - }, - "SELECT * FROM pg_catalog.pg_stat_gssapi": { - "description": {"pid", "gss_authenticated", "principal", "encrypted", "credentials_delegated"}, - "types": {uint32ToString(pgtype.Int4OID), uint32ToString(pgtype.BoolOID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.BoolOID), uint32ToString(pgtype.BoolOID)}, - "values": {}, - }, - "SELECT * FROM pg_catalog.pg_user": { - "description": {"usename", "usesysid", "usecreatedb", "usesuper", "userepl", "usebypassrls", "passwd", "valuntil", "useconfig"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"user", "10", "t", "t", "t", "t", "", "", ""}, - }, - "SELECT datid FROM pg_catalog.pg_stat_activity": { - "description": {"datid"}, - "types": {uint32ToString(pgtype.Int8OID)}, - "values": {}, - }, - "SELECT schemaname, matviewname AS objectname FROM pg_catalog.pg_matviews": { - "description": {"schemaname", "objectname"}, - "types": {uint32ToString(pgtype.TextOID), uint32ToString(pgtype.TextOID)}, - "values": {}, - }, - "SELECT * FROM pg_catalog.pg_views": { - "description": {"schemaname", "viewname", "viewowner", "definition"}, - "types": {uint32ToString(pgtype.TextOID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.TextOID)}, - }, - "SELECT oid FROM pg_collation": { - "description": {"oid"}, - "types": {uint32ToString(pgtype.OIDOID)}, - "values": {"100"}, - }, - "SELECT * FROM pg_opclass": { - "description": {"oid", "opcmethod", "opcname", "opcnamespace", "opcowner", "opcfamily", "opcintype", "opcdefault", "opckeytype"}, - "types": {uint32ToString(pgtype.OIDOID), uint32ToString(pgtype.Int8OID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.Int8OID), uint32ToString(pgtype.Int8OID), uint32ToString(pgtype.Int8OID), uint32ToString(pgtype.Int8OID), uint32ToString(pgtype.BoolOID), uint32ToString(pgtype.Int8OID)}, - }, - "SELECT schemaname, relname, n_live_tup FROM pg_stat_user_tables WHERE schemaname = 'postgres' ORDER BY relname DESC LIMIT 1": { - "description": {"schemaname", "relname", "n_live_tup"}, - "types": {uint32ToString(pgtype.TextOID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.Int8OID)}, - "values": {"postgres", "test_table", "1"}, - }, - "SELECT DISTINCT(nspname) FROM pg_catalog.pg_namespace WHERE nspname != 'information_schema' AND nspname != 'pg_catalog' ORDER BY nspname LIMIT 1": { - "description": {"nspname"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"postgres"}, - }, - "SELECT nspname FROM pg_catalog.pg_namespace WHERE nspname == 'main'": { - "description": {"nspname"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {}, - }, - "SELECT n.nspname FROM pg_catalog.pg_namespace n LEFT OUTER JOIN pg_catalog.pg_description d ON d.objoid = n.oid ORDER BY n.nspname LIMIT 1": { - "description": {"nspname"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"postgres"}, - }, - "SELECT rel.oid FROM pg_class rel LEFT JOIN pg_extension ON rel.oid = pg_extension.oid ORDER BY rel.oid LIMIT 1;": { - "description": {"oid"}, - "types": {uint32ToString(pgtype.OIDOID)}, - "values": {"1988"}, - }, - "SELECT pg_total_relation_size(relid) AS total_size FROM pg_catalog.pg_statio_user_tables WHERE schemaname = 'postgres'": { - "description": {"total_size"}, - "types": {uint32ToString(pgtype.Int4OID)}, - }, - "SELECT pg_total_relation_size(relid) AS total_size FROM pg_catalog.pg_statio_user_tables WHERE schemaname = 'postgres' UNION SELECT NULL AS total_size FROM pg_catalog.pg_proc p LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace WHERE n.nspname = 'postgres'": { - "description": {"total_size"}, - "types": {uint32ToString(pgtype.Int4OID)}, - }, - "SELECT * FROM pg_catalog.pg_shdescription": { - "description": {"objoid", "classoid", "description"}, - "types": {uint32ToString(pgtype.OIDOID), uint32ToString(pgtype.OIDOID), uint32ToString(pgtype.TextOID)}, - }, - "SELECT * FROM pg_catalog.pg_roles": { - "description": {"oid", "rolname", "rolsuper", "rolinherit", "rolcreaterole", "rolcreatedb", "rolcanlogin", "rolreplication", "rolconnlimit", "rolpassword", "rolvaliduntil", "rolbypassrls", "rolconfig"}, - "types": { - uint32ToString(pgtype.OIDOID), - uint32ToString(pgtype.TextOID), - uint32ToString(pgtype.BoolOID), - uint32ToString(pgtype.BoolOID), - uint32ToString(pgtype.BoolOID), - uint32ToString(pgtype.BoolOID), - uint32ToString(pgtype.BoolOID), - uint32ToString(pgtype.BoolOID), - uint32ToString(pgtype.Int4OID), - uint32ToString(pgtype.TextOID), - uint32ToString(pgtype.TimestampOID), - uint32ToString(pgtype.BoolOID), - uint32ToString(pgtype.TextArrayOID), - }, - "values": {"10", "user", "t", "t", "t", "t", "t", "f", "-1", "", "", "f", ""}, - }, - "SELECT * FROM pg_catalog.pg_inherits": { - "description": {"inhrelid", "inhparent", "inhseqno", "inhdetachpending"}, - }, - "SELECT * FROM pg_auth_members": { - "description": {"oid", "roleid", "member", "grantor", "admin_option", "inherit_option", "set_option"}, - }, - "SELECT ARRAY(select pg_get_indexdef(indexrelid, attnum, true) FROM pg_attribute WHERE attrelid = indexrelid ORDER BY attnum) AS expressions FROM pg_index": { - "description": {"expressions"}, - "types": {uint32ToString(pgtype.TextArrayOID)}, - "values": {}, - }, - "SELECT indnullsnotdistinct FROM pg_index": { - "description": {"indnullsnotdistinct"}, - "types": {uint32ToString(pgtype.BoolOID)}, - }, - "SELECT n.nspname, c.relname FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relname OPERATOR(pg_catalog.~) '^(test_table)$' COLLATE pg_catalog.default AND n.nspname OPERATOR(pg_catalog.~) '^(postgres)$' COLLATE pg_catalog.default": { - "description": {"nspname", "relname"}, - "types": {uint32ToString(pgtype.TextOID), uint32ToString(pgtype.TextOID)}, - "values": {"postgres", "test_table"}, - }, - "SELECT * FROM pg_catalog.pg_policy": { - "description": {"oid", "polname", "polrelid", "polcmd", "polpermissive", "polroles", "polqual", "polwithcheck"}, - "types": {uint32ToString(pgtype.OIDOID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.Int8OID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.BoolOID), uint32ToString(pgtype.Int8OID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.TextOID)}, - }, - "SELECT * FROM pg_catalog.pg_statistic_ext": { - "description": {"oid", "stxrelid", "stxname", "stxnamespace", "stxowner", "stxstattarget", "stxkeys", "stxkind", "stxexprs"}, - "types": {uint32ToString(pgtype.OIDOID), uint32ToString(pgtype.Int8OID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.Int8OID), uint32ToString(pgtype.Int8OID), uint32ToString(pgtype.Int4OID), uint32ToString(pgtype.Int8OID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.TextOID)}, - }, - "SELECT * FROM pg_catalog.pg_publication": { - "description": {"oid", "pubname", "pubowner", "puballtables", "pubinsert", "pubupdate", "pubdelete", "pubtruncate", "pubviaroot"}, - "types": {uint32ToString(pgtype.OIDOID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.Int8OID), uint32ToString(pgtype.BoolOID), uint32ToString(pgtype.BoolOID), uint32ToString(pgtype.BoolOID), uint32ToString(pgtype.BoolOID), uint32ToString(pgtype.BoolOID), uint32ToString(pgtype.BoolOID)}, - }, - "SELECT * FROM pg_catalog.pg_publication_rel": { - "description": {"oid", "prpubid", "prrelid", "prqual", "prattrs"}, - "types": {uint32ToString(pgtype.OIDOID), uint32ToString(pgtype.Int8OID), uint32ToString(pgtype.Int8OID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.TextOID)}, - }, - "SELECT * FROM pg_catalog.pg_publication_namespace": { - "description": {"oid", "pnpubid", "pnnspid"}, - "types": {uint32ToString(pgtype.OIDOID), uint32ToString(pgtype.Int8OID), uint32ToString(pgtype.Int8OID)}, - }, - "SELECT * FROM pg_catalog.pg_rewrite": { - "description": {"oid", "rulename", "ev_class", "ev_type", "ev_enabled", "is_instead", "ev_qual", "ev_action"}, - "types": {uint32ToString(pgtype.OIDOID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.Int8OID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.BoolOID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.TextOID)}, - }, - "SELECT pubname, NULL, NULL FROM pg_catalog.pg_publication p JOIN pg_catalog.pg_publication_namespace pn ON p.oid = pn.pnpubid JOIN pg_catalog.pg_class pc ON pc.relnamespace = pn.pnnspid UNION SELECT pubname, pg_get_expr(pr.prqual, c.oid), (CASE WHEN pr.prattrs IS NOT NULL THEN (SELECT string_agg(attname, ', ') FROM pg_catalog.generate_series(0, pg_catalog.array_upper(pr.prattrs::pg_catalog.int2[], 1)) s, pg_catalog.pg_attribute WHERE attrelid = pr.prrelid AND attnum = prattrs[s]) ELSE NULL END) FROM pg_catalog.pg_publication p JOIN pg_catalog.pg_publication_rel pr ON p.oid = pr.prpubid JOIN pg_catalog.pg_class c ON c.oid = pr.prrelid UNION SELECT pubname, NULL, NULL FROM pg_catalog.pg_publication p ORDER BY 1": { - "description": {"pubname", "NULL", "NULL"}, - "types": {uint32ToString(pgtype.TextOID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.TextOID)}, - }, - "SELECT * FROM user": { - "description": {"user"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"user"}, - }, - "SELECT oid FROM pg_type WHERE typname = 'text'": { - "description": {"oid"}, - "types": {uint32ToString(pgtype.OIDOID)}, - "values": {"25"}, - }, - "SELECT DISTINCT ON(typlen) oid FROM pg_type ORDER BY oid LIMIT 1": { - "description": {"oid"}, - "types": {uint32ToString(pgtype.OIDOID)}, - "values": {"16"}, - }, - }) - }) - - t.Run("Information schema", func(t *testing.T) { - testResponseByQuery(t, queryHandler, map[string]map[string][]string{ - "SELECT * FROM information_schema.tables WHERE table_schema = 'postgres' ORDER BY table_name DESC LIMIT 1": { - "description": {"table_catalog", "table_schema", "table_name", "table_type", "self_referencing_column_name", "reference_generation", "user_defined_type_catalog", "user_defined_type_schema", "user_defined_type_name", "is_insertable_into", "is_typed", "commit_action"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"memory", "postgres", "test_table", "BASE TABLE", "", "", "", "", "", "YES", "NO", ""}, - }, - "SELECT * FROM information_schema.tables WHERE table_schema = 'postgres' /*BEMIDB_PERMISSIONS {\"postgres.test_table\": [\"id\"]} BEMIDB_PERMISSIONS*/": { - "description": {"table_catalog", "table_schema", "table_name", "table_type", "self_referencing_column_name", "reference_generation", "user_defined_type_catalog", "user_defined_type_schema", "user_defined_type_name", "is_insertable_into", "is_typed", "commit_action"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"memory", "postgres", "test_table", "BASE TABLE", "", "", "", "", "", "YES", "NO", ""}, - }, - // information_schema.columns - "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'id'": { - "description": {"udt_name"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"int4"}, - }, - "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'bit_column'": { - "description": {"udt_name"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"int4"}, - }, - "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'bool_column'": { - "description": {"udt_name"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"bool"}, - }, - "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'bpchar_column'": { - "description": {"udt_name"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"text"}, - }, - "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'varchar_column'": { - "description": {"udt_name"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"text"}, - }, - "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'text_column'": { - "description": {"udt_name"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"text"}, - }, - "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'int2_column'": { - "description": {"udt_name"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"int4"}, - }, - "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'int4_column'": { - "description": {"udt_name"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"int4"}, - }, - "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'int8_column'": { - "description": {"udt_name"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"numeric"}, - }, - "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'hugeint_column'": { - "description": {"udt_name"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"numeric"}, - }, - "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'xid_column'": { - "description": {"udt_name"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"int8"}, - }, - "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'xid8_column'": { - "description": {"udt_name"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"numeric"}, - }, - "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'float4_column'": { - "description": {"udt_name"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"float4"}, - }, - "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'float8_column'": { - "description": {"udt_name"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"float8"}, - }, - "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'numeric_column'": { - "description": {"udt_name"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"numeric"}, - }, - "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'numeric_column_without_precision'": { - "description": {"udt_name"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"numeric"}, - }, - "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'date_column'": { - "description": {"udt_name"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"date"}, - }, - "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'time_column'": { - "description": {"udt_name"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"time"}, - }, - "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'timeMsColumn'": { - "description": {"udt_name"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"time"}, - }, - "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'timetz_column'": { - "description": {"udt_name"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"time"}, - }, - "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'timetz_ms_column'": { - "description": {"udt_name"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"time"}, - }, - "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'timestamp_column'": { - "description": {"udt_name"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"timestamp"}, - }, - "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'timestamp_ms_column'": { - "description": {"udt_name"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"timestamp"}, - }, - "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'timestamptz_column'": { - "description": {"udt_name"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"timestamp"}, - }, - "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'timestamptz_ms_column'": { - "description": {"udt_name"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"timestamp"}, - }, - "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'uuid_column'": { - "description": {"udt_name"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"text"}, - }, - "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'bytea_column'": { - "description": {"udt_name"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"bytea"}, - }, - "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'interval_column'": { - "description": {"udt_name"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"numeric"}, - }, - "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'point_column'": { - "description": {"udt_name"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"text"}, - }, - "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'inet_column'": { - "description": {"udt_name"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"text"}, - }, - "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'json_column'": { - "description": {"udt_name"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"json"}, - }, - "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'jsonb_column'": { - "description": {"udt_name"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"json"}, - }, - "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'tsvector_column'": { - "description": {"udt_name"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"text"}, - }, - "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'xml_column'": { - "description": {"udt_name"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"text"}, - }, - "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'pg_snapshot_column'": { - "description": {"udt_name"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"text"}, - }, - "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'array_text_column'": { - "description": {"udt_name"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"_text"}, - }, - "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'array_int_column'": { - "description": {"udt_name"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"_int4"}, - }, - "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'array_jsonb_column'": { - "description": {"udt_name"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"_json"}, - }, - "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'array_ltree_column'": { - "description": {"udt_name"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"_text"}, - }, - "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' AND column_name = 'user_defined_column'": { - "description": {"udt_name"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"text"}, - }, - "SELECT udt_name FROM information_schema.columns WHERE table_schema = 'postgres' AND table_name = 'test_table' /*BEMIDB_PERMISSIONS {\"postgres.test_table\": [\"id\"]} BEMIDB_PERMISSIONS*/": { - "description": {"udt_name"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"int4"}, - }, - }) - }) - - t.Run("SHOW", func(t *testing.T) { - testResponseByQuery(t, queryHandler, map[string]map[string][]string{ - "SHOW search_path": { - "description": {"search_path"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {`"$user", public`}, - }, - "SHOW timezone": { - "description": {"timezone"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"UTC"}, - }, - }) - }) - - t.Run("Iceberg tables", func(t *testing.T) { - testResponseByQuery(t, queryHandler, map[string]map[string][]string{ - "SELECT COUNT(*) AS count FROM postgres.test_table": { - "description": {"count"}, - "types": {uint32ToString(pgtype.Int8OID)}, - "values": {"2"}, - }, - "SELECT COUNT(DISTINCT postgres.test_table.id) AS count FROM postgres.test_table": { - "description": {"count"}, - "types": {uint32ToString(pgtype.Int8OID)}, - "values": {"2"}, - }, - "SELECT x.id FROM postgres.test_table x WHERE x.id = 1": { - "description": {"id"}, - "types": {uint32ToString(pgtype.Int4OID)}, - "values": {"1"}, - }, - "SELECT postgres.test_table.id FROM postgres.test_table WHERE postgres.test_table.id = 1": { - "description": {"id"}, - "types": {uint32ToString(pgtype.Int4OID)}, - "values": {"1"}, - }, - "SELECT postgres.test_empty_table.id FROM postgres.test_empty_table": { - "description": {"id"}, - "types": {uint32ToString(pgtype.Int4OID)}, - }, - "SELECT postgres.test_table.id FROM postgres.test_table WHERE id = 1": { - "description": {"id"}, - "types": {uint32ToString(pgtype.Int4OID)}, - "values": {"1"}, - }, - // TODO: add support for partitioned tables - // "SELECT COUNT(*) FROM postgres.partitioned_table": { - // "description": {"count"}, - // "types": {uint32ToString(pgtype.Int8OID)}, - // "values": {"3"}, - // }, - }) - }) - - t.Run("Column types", func(t *testing.T) { - testResponseByQuery(t, queryHandler, map[string]map[string][]string{ - "SELECT bit_column FROM postgres.test_table WHERE bit_column IS NOT NULL": { - "description": {"bit_column"}, - "types": {uint32ToString(pgtype.Int4OID)}, - "values": {"1"}, - }, - "SELECT bit_column FROM postgres.test_table WHERE bit_column IS NULL": { - "description": {"bit_column"}, - "types": {uint32ToString(pgtype.Int4OID)}, - "values": {""}, - }, - "SELECT bool_column FROM postgres.test_table WHERE bool_column = TRUE": { - "description": {"bool_column"}, - "types": {uint32ToString(pgtype.BoolOID)}, - "values": {"t"}, - }, - "SELECT bool_column FROM postgres.test_table WHERE bool_column = FALSE": { - "description": {"bool_column"}, - "types": {uint32ToString(pgtype.BoolOID)}, - "values": {"f"}, - }, - "SELECT bpchar_column FROM postgres.test_table WHERE bool_column = TRUE": { - "description": {"bpchar_column"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"bpchar"}, - }, - "SELECT bpchar_column FROM postgres.test_table WHERE bool_column = FALSE": { - "description": {"bpchar_column"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {""}, - }, - "SELECT varchar_column FROM postgres.test_table WHERE varchar_column IS NOT NULL": { - "description": {"varchar_column"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"varchar"}, - }, - "SELECT varchar_column FROM postgres.test_table WHERE varchar_column IS NULL": { - "description": {"varchar_column"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {""}, - }, - "SELECT text_column FROM postgres.test_table WHERE bool_column = TRUE": { - "description": {"text_column"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"text"}, - }, - "SELECT text_column FROM postgres.test_table WHERE bool_column = FALSE": { - "description": {"text_column"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {""}, - }, - "SELECT int2_column FROM postgres.test_table WHERE bool_column = TRUE": { - "description": {"int2_column"}, - "types": {uint32ToString(pgtype.Int4OID)}, - "values": {"32767"}, - }, - "SELECT int2_column FROM postgres.test_table WHERE bool_column = FALSE": { - "description": {"int2_column"}, - "types": {uint32ToString(pgtype.Int4OID)}, - "values": {"-32767"}, - }, - "SELECT int4_column FROM postgres.test_table WHERE int4_column IS NOT NULL": { - "description": {"int4_column"}, - "types": {uint32ToString(pgtype.Int4OID)}, - "values": {"2147483647"}, - }, - "SELECT int4_column FROM postgres.test_table WHERE int4_column IS NULL": { - "description": {"int4_column"}, - "types": {uint32ToString(pgtype.Int4OID)}, - "values": {""}, - }, - "SELECT int8_column FROM postgres.test_table WHERE bool_column = TRUE": { - "description": {"int8_column"}, - "types": {uint32ToString(pgtype.NumericOID)}, - "values": {"9.223372036854776e+18"}, - }, - "SELECT int8_column FROM postgres.test_table WHERE bool_column = FALSE": { - "description": {"int8_column"}, - "types": {uint32ToString(pgtype.NumericOID)}, - "values": {"-9.223372036854776e+18"}, - }, - "SELECT hugeint_column FROM postgres.test_table WHERE hugeint_column IS NOT NULL": { - "description": {"hugeint_column"}, - "types": {uint32ToString(pgtype.NumericOID)}, - "values": {"1e+19"}, - }, - "SELECT hugeint_column FROM postgres.test_table WHERE hugeint_column IS NULL": { - "description": {"hugeint_column"}, - "types": {uint32ToString(pgtype.NumericOID)}, - "values": {""}, - }, - "SELECT xid_column FROM postgres.test_table WHERE xid_column IS NOT NULL": { - "description": {"xid_column"}, - "types": {uint32ToString(pgtype.Int8OID)}, - "values": {"4294967295"}, - }, - "SELECT xid_column FROM postgres.test_table WHERE xid_column IS NULL": { - "description": {"xid_column"}, - "types": {uint32ToString(pgtype.Int8OID)}, - "values": {""}, - }, - "SELECT xid8_column FROM postgres.test_table WHERE xid8_column IS NOT NULL": { - "description": {"xid8_column"}, - "types": {uint32ToString(pgtype.NumericOID)}, - "values": {"1.8446744073709552e+19"}, - }, - "SELECT xid8_column FROM postgres.test_table WHERE xid8_column IS NULL": { - "description": {"xid8_column"}, - "types": {uint32ToString(pgtype.NumericOID)}, - "values": {""}, - }, - "SELECT float4_column FROM postgres.test_table WHERE float4_column = 3.14": { - "description": {"float4_column"}, - "types": {uint32ToString(pgtype.Float4OID)}, - "values": {"3.14"}, - }, - "SELECT float4_column FROM postgres.test_table WHERE float4_column != 3.14": { - "description": {"float4_column"}, - "types": {uint32ToString(pgtype.Float4OID)}, - "values": {"0"}, - }, - "SELECT float8_column FROM postgres.test_table WHERE bool_column = TRUE": { - "description": {"float8_column"}, - "types": {uint32ToString(pgtype.Float8OID)}, - "values": {"3.141592653589793"}, - }, - "SELECT float8_column FROM postgres.test_table WHERE bool_column = FALSE": { - "description": {"float8_column"}, - "types": {uint32ToString(pgtype.Float8OID)}, - "values": {"-3.141592653589793"}, - }, - "SELECT numeric_column FROM postgres.test_table WHERE bool_column = TRUE": { - "description": {"numeric_column"}, - "types": {uint32ToString(pgtype.NumericOID)}, - "values": {"12345.67"}, - }, - "SELECT numeric_column FROM postgres.test_table WHERE bool_column = FALSE": { - "description": {"numeric_column"}, - "types": {uint32ToString(pgtype.NumericOID)}, - "values": {"-12345"}, - }, - "SELECT numeric_column_without_precision FROM postgres.test_table WHERE numeric_column_without_precision IS NOT NULL": { - "description": {"numeric_column_without_precision"}, - "types": {uint32ToString(pgtype.NumericOID)}, - "values": {"12345.67"}, - }, - "SELECT numeric_column_without_precision FROM postgres.test_table WHERE numeric_column_without_precision IS NULL": { - "description": {"numeric_column_without_precision"}, - "types": {uint32ToString(pgtype.NumericOID)}, - "values": {""}, - }, - "SELECT date_column FROM postgres.test_table ORDER BY date_column LIMIT 1": { - "description": {"date_column"}, - "types": {uint32ToString(pgtype.DateOID)}, - "values": {"2024-01-01"}, - }, - "SELECT date_column FROM postgres.test_table ORDER BY date_column LIMIT 1 OFFSET 1": { - "description": {"date_column"}, - "types": {uint32ToString(pgtype.DateOID)}, - "values": {"20025-11-12"}, - }, - "SELECT time_column FROM postgres.test_table WHERE bool_column = TRUE": { - "description": {"time_column"}, - "types": {uint32ToString(pgtype.TimeOID)}, - "values": {"12:00:00.123456"}, - }, - "SELECT time_column FROM postgres.test_table WHERE bool_column = FALSE": { - "description": {"time_column"}, - "types": {uint32ToString(pgtype.TimeOID)}, - "values": {"12:00:00.123"}, - }, - "SELECT timeMsColumn FROM postgres.test_table WHERE timeMsColumn IS NOT NULL": { - "description": {"timeMsColumn"}, - "types": {uint32ToString(pgtype.TimeOID)}, - "values": {"12:00:00.123"}, - }, - "SELECT timeMsColumn FROM postgres.test_table WHERE timeMsColumn IS NULL": { - "description": {"timeMsColumn"}, - "types": {uint32ToString(pgtype.TimeOID)}, - "values": {""}, - }, - "SELECT timetz_column FROM postgres.test_table WHERE bool_column = TRUE": { - "description": {"timetz_column"}, - "types": {uint32ToString(pgtype.TimeOID)}, - "values": {"17:00:00.123456"}, - }, - "SELECT timetz_column FROM postgres.test_table WHERE bool_column = FALSE": { - "description": {"timetz_column"}, - "types": {uint32ToString(pgtype.TimeOID)}, - "values": {"07:00:00.123"}, - }, - "SELECT timestamp_column FROM postgres.test_table WHERE bool_column = TRUE": { - "description": {"timestamp_column"}, - "types": {uint32ToString(pgtype.TimestampOID)}, - "values": {"2024-01-01 12:00:00.123456"}, - }, - "SELECT timestamp_column FROM postgres.test_table WHERE bool_column = FALSE": { - "description": {"timestamp_column"}, - "types": {uint32ToString(pgtype.TimestampOID)}, - "values": {"2024-01-01 12:00:00"}, - }, - "SELECT timestamp_ms_column FROM postgres.test_table WHERE timestamp_ms_column IS NOT NULL": { - "description": {"timestamp_ms_column"}, - "types": {uint32ToString(pgtype.TimestampOID)}, - "values": {"2024-01-01 12:00:00.123"}, - }, - "SELECT timestamp_ms_column FROM postgres.test_table WHERE timestamp_ms_column IS NULL": { - "description": {"timestamp_ms_column"}, - "types": {uint32ToString(pgtype.TimestampOID)}, - "values": {""}, - }, - "SELECT timestamptz_column FROM postgres.test_table WHERE bool_column = TRUE": { - "description": {"timestamptz_column"}, - "types": {uint32ToString(pgtype.TimestampOID)}, - "values": {"2024-01-01 17:00:00.123456"}, - }, - "SELECT timestamptz_column FROM postgres.test_table WHERE bool_column = FALSE": { - "description": {"timestamptz_column"}, - "types": {uint32ToString(pgtype.TimestampOID)}, - "values": {"2024-01-01 06:30:00.000123"}, - }, - "SELECT timestamptz_ms_column FROM postgres.test_table WHERE bool_column = TRUE": { - "description": {"timestamptz_ms_column"}, - "types": {uint32ToString(pgtype.TimestampOID)}, - "values": {"2024-01-01 17:00:00.123"}, - }, - "SELECT timestamptz_ms_column FROM postgres.test_table WHERE bool_column = FALSE": { - "description": {"timestamptz_ms_column"}, - "types": {uint32ToString(pgtype.TimestampOID)}, - "values": {"2024-01-01 07:00:00.12"}, - }, - "SELECT uuid_column FROM postgres.test_table WHERE uuid_column = '58a7c845-af77-44b2-8664-7ca613d92f04'": { - "description": {"uuid_column"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"58a7c845-af77-44b2-8664-7ca613d92f04"}, - }, - "SELECT uuid_column FROM postgres.test_table WHERE uuid_column IS NULL": { - "description": {"uuid_column"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {""}, - }, - "SELECT bytea_column FROM postgres.test_table WHERE bytea_column IS NOT NULL": { - "description": {"bytea_column"}, - "types": {uint32ToString(pgtype.ByteaOID)}, - "values": {"\\x48656c6c6f"}, - }, - "SELECT bytea_column FROM postgres.test_table WHERE bytea_column IS NULL": { - "description": {"bytea_column"}, - "types": {uint32ToString(pgtype.ByteaOID)}, - "values": {""}, - }, - "SELECT interval_column FROM postgres.test_table WHERE interval_column IS NOT NULL": { - "description": {"interval_column"}, - "types": {uint32ToString(pgtype.NumericOID)}, - "values": {"2.806201000001e+12"}, - }, - "SELECT interval_column FROM postgres.test_table WHERE interval_column IS NULL": { - "description": {"interval_column"}, - "types": {uint32ToString(pgtype.NumericOID)}, - "values": {""}, - }, - "SELECT json_column FROM postgres.test_table WHERE json_column IS NOT NULL": { - "description": {"json_column"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"{\"key\": \"value\"}"}, - }, - "SELECT json_column FROM postgres.test_table WHERE json_column IS NULL": { - "description": {"json_column"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {""}, - }, - "SELECT jsonb_column FROM postgres.test_table WHERE bool_column = TRUE": { - "description": {"jsonb_column"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"{\"key\": \"value\", \"nestedKey\": { \"key\": \"value\" }}"}, - }, - "SELECT jsonb_column->'key' FROM postgres.test_table WHERE jsonb_column->'nestedKey'->>'key' = 'value'": { - "description": {"jsonb_column_key"}, - "types": {uint32ToString(pgtype.JSONOID)}, - "values": {"\"value\""}, - }, - "SELECT json_column->>'key' FROM postgres.test_table WHERE id = 1 AND json_column::json->>'key' IN ('value')": { - "description": {"json_column_key"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"value"}, - }, - "SELECT json_column ? 'key' AS exists FROM postgres.test_table WHERE id = 1": { - "description": {"exists"}, - "types": {uint32ToString(pgtype.BoolOID)}, - "values": {"t"}, - }, - "SELECT jsonb_column FROM postgres.test_table WHERE bool_column = FALSE": { - "description": {"jsonb_column"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"{}"}, - }, - "SELECT tsvector_column FROM postgres.test_table WHERE tsvector_column IS NOT NULL": { - "description": {"tsvector_column"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"'sampl':1 'text':2 'tsvector':4"}, - }, - "SELECT tsvector_column FROM postgres.test_table WHERE tsvector_column IS NULL": { - "description": {"tsvector_column"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {""}, - }, - "SELECT xml_column FROM postgres.test_table WHERE xml_column IS NOT NULL": { - "description": {"xml_column"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"text"}, - }, - "SELECT xml_column FROM postgres.test_table WHERE xml_column IS NULL": { - "description": {"xml_column"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {""}, - }, - "SELECT pg_snapshot_column FROM postgres.test_table WHERE pg_snapshot_column IS NOT NULL": { - "description": {"pg_snapshot_column"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"1896:1896:"}, - }, - "SELECT pg_snapshot_column FROM postgres.test_table WHERE pg_snapshot_column IS NULL": { - "description": {"pg_snapshot_column"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {""}, - }, - "SELECT point_column FROM postgres.test_table WHERE point_column IS NOT NULL": { - "description": {"point_column"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"(37.347301483154,45.002101898193)"}, - }, - "SELECT point_column FROM postgres.test_table WHERE point_column IS NULL": { - "description": {"point_column"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {""}, - }, - "SELECT inet_column FROM postgres.test_table WHERE inet_column IS NOT NULL": { - "description": {"inet_column"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"192.168.0.1"}, - }, - "SELECT inet_column FROM postgres.test_table WHERE inet_column IS NULL": { - "description": {"inet_column"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {""}, - }, - "SELECT array_text_column FROM postgres.test_table WHERE array_text_column IS NOT NULL": { - "description": {"array_text_column"}, - "types": {uint32ToString(pgtype.TextArrayOID)}, - "values": {"{one,two,three}"}, - }, - "SELECT array_text_column FROM postgres.test_table WHERE array_text_column IS NULL": { - "description": {"array_text_column"}, - "types": {uint32ToString(pgtype.TextArrayOID)}, - "values": {""}, - }, - "SELECT array_int_column FROM postgres.test_table WHERE bool_column = TRUE": { - "description": {"array_int_column"}, - "types": {uint32ToString(pgtype.Int4ArrayOID)}, - "values": {"{1,2,3}"}, - }, - "SELECT array_int_column FROM postgres.test_table WHERE bool_column = FALSE": { - "description": {"array_int_column"}, - "types": {uint32ToString(pgtype.Int4ArrayOID)}, - "values": {"{}"}, - }, - "SELECT array_jsonb_column FROM postgres.test_table WHERE array_jsonb_column IS NOT NULL": { - "description": {"array_jsonb_column"}, - "types": {uint32ToString(pgtype.TextArrayOID)}, - "values": {`{"{""key"": ""value1""}","{""key"": ""value2""}"}`}, - }, - "SELECT array_jsonb_column FROM postgres.test_table WHERE array_jsonb_column IS NULL": { - "description": {"array_jsonb_column"}, - "types": {uint32ToString(pgtype.TextArrayOID)}, - "values": {""}, - }, - "SELECT array_ltree_column FROM postgres.test_table WHERE array_ltree_column IS NOT NULL": { - "description": {"array_ltree_column"}, - "types": {uint32ToString(pgtype.TextArrayOID)}, - "values": {"{a.b,c.d}"}, - }, - "SELECT array_ltree_column FROM postgres.test_table WHERE array_ltree_column IS NULL": { - "description": {"array_ltree_column"}, - "types": {uint32ToString(pgtype.TextArrayOID)}, - "values": {""}, - }, - "SELECT user_defined_column FROM postgres.test_table WHERE user_defined_column IS NOT NULL": { - "description": {"user_defined_column"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"(Toronto)"}, - }, - "SELECT user_defined_column FROM postgres.test_table WHERE user_defined_column IS NULL": { - "description": {"user_defined_column"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {""}, - }, - "SELECT relforcerowsecurity FROM pg_catalog.pg_class LIMIT 1": { - "description": {"relforcerowsecurity"}, - "types": {uint32ToString(pgtype.BoolOID)}, - "values": {"f"}, - }, - }) - }) - - t.Run("Type casts", func(t *testing.T) { - testResponseByQuery(t, queryHandler, map[string]map[string][]string{ - "SELECT '\"postgres\".\"test_table\"'::regclass::oid > 0 AS oid": { - "description": {"oid"}, - "types": {uint32ToString(pgtype.BoolOID)}, - "values": {"t"}, - }, - "SELECT FORMAT('%I.%I', 'postgres', 'test_table')::regclass::oid > 0 AS oid": { // NOTE: ::regclass::oid on non-constants is not fully supported yet - "description": {"oid"}, - "types": {uint32ToString(pgtype.BoolOID)}, - "values": {""}, - }, - "SELECT attrelid > 0 AS attrelid FROM pg_attribute WHERE attrelid = '\"postgres\".\"test_table\"'::regclass LIMIT 1": { - "description": {"attrelid"}, - "types": {uint32ToString(pgtype.BoolOID)}, - "values": {"t"}, - }, - "SELECT COUNT(*) AS count FROM pg_attribute WHERE attrelid = '\"postgres\".\"test_table\"'::regclass": { - "description": {"count"}, - "types": {uint32ToString(pgtype.Int8OID)}, - "values": {"40"}, - }, - "SELECT objoid, classoid, objsubid, description FROM pg_description WHERE classoid = 'pg_class'::regclass": { - "description": {"objoid", "classoid", "objsubid", "description"}, - "types": {uint32ToString(pgtype.OIDOID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.Int4OID), uint32ToString(pgtype.TextOID)}, - "values": {}, - }, - "SELECT d.objoid, d.classoid, c.relname, d.description FROM pg_description d JOIN pg_class c ON d.classoid = 'pg_class'::regclass": { - "description": {"objoid", "classoid", "relname", "description"}, - "types": {uint32ToString(pgtype.OIDOID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.TextOID)}, - "values": {}, - }, - "SELECT objoid, classoid, objsubid, description FROM (SELECT * FROM pg_description WHERE classoid = 'pg_class'::regclass) d": { - "description": {"objoid", "classoid", "objsubid", "description"}, - "types": {uint32ToString(pgtype.OIDOID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.Int4OID), uint32ToString(pgtype.TextOID)}, - "values": {}, - }, - "SELECT objoid, classoid, objsubid, description FROM pg_description WHERE (classoid = 'pg_class'::regclass AND objsubid = 0) OR classoid = 'pg_type'::regclass": { - "description": {"objoid", "classoid", "objsubid", "description"}, - "types": {uint32ToString(pgtype.OIDOID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.Int4OID), uint32ToString(pgtype.TextOID)}, - "values": {}, - }, - "SELECT objoid, classoid, objsubid, description FROM pg_description WHERE classoid IN ('pg_class'::regclass, 'pg_type'::regclass)": { - "description": {"objoid", "classoid", "objsubid", "description"}, - "types": {uint32ToString(pgtype.OIDOID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.Int4OID), uint32ToString(pgtype.TextOID)}, - "values": {}, - }, - "SELECT objoid FROM pg_description WHERE classoid = CASE WHEN true THEN 'pg_class'::regclass ELSE 'pg_type'::regclass END": { - "description": {"objoid"}, - "types": {uint32ToString(pgtype.OIDOID)}, - "values": {}, - }, - "SELECT word FROM (VALUES ('abort', 'U', 't', 'unreserved', 'can be bare label')) t(word, catcode, barelabel, catdesc, baredesc) WHERE word <> ALL('{a,abs,absolute,action}'::text[])": { - "description": {"word"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"abort"}, - }, - "SELECT NULL::text AS word": { - "description": {"word"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {""}, - }, - "SELECT t.x FROM (VALUES (1::int2, 'pg_type'::regclass)) t(x, y)": { - "description": {"x"}, - "types": {uint32ToString(pgtype.Int2OID)}, - "values": {"1"}, - }, - "SELECT 'pg_catalog.array_in'::regproc AS regproc": { - "description": {"regproc"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"array_in"}, - }, - "SELECT uuid_column FROM postgres.test_table WHERE uuid_column IN ('58a7c845-af77-44b2-8664-7ca613d92f04'::uuid)": { - "description": {"uuid_column"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"58a7c845-af77-44b2-8664-7ca613d92f04"}, - }, - "SELECT '1 week'::INTERVAL AS interval": { - "description": {"interval"}, - "types": {uint32ToString(pgtype.IntervalOID)}, - "values": {"0 months 7 days 0 microseconds"}, - }, - "SELECT '{\"key\": \"value\"}'::JSONB AS jsonb": { - "description": {"jsonb"}, - "types": {uint32ToString(pgtype.JSONOID)}, - "values": {"{\"key\":\"value\"}"}, - }, - "SELECT date_trunc('month', '2025-02-24 15:58:23-05'::timestamptz + '-1 month'::interval) AS date": { - "description": {"date"}, - "types": {uint32ToString(pgtype.TimestamptzOID)}, - "values": {"2025-01-01 00:00:00+00:00"}, - }, - "SELECT 'foo'::pg_catalog.text AS text": { - "description": {"text"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"foo"}, - }, - "SELECT 1::pg_catalog.regtype::pg_catalog.text AS text": { - "description": {"text"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"1"}, - }, - "SELECT 1 AS value ORDER BY 1::pg_catalog.regclass::pg_catalog.text": { - "description": {"value"}, - "types": {uint32ToString(pgtype.Int4OID)}, - "values": {"1"}, - }, - "SELECT stxnamespace::pg_catalog.regnamespace::pg_catalog.text AS text FROM pg_catalog.pg_statistic_ext": { - "description": {"text"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {}, - }, - "SELECT relname FROM pg_catalog.pg_namespace, pg_catalog.pg_class LEFT JOIN pg_catalog.pg_description d ON (d.classoid = 'pg_class'::regclass) WHERE relname = 'test_table' AND nspname = 'postgres'": { - "description": {"relname"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"test_table"}, - }, - }) - }) - - t.Run("FROM function()", func(t *testing.T) { - testResponseByQuery(t, queryHandler, map[string]map[string][]string{ - "SELECT * FROM pg_catalog.pg_get_keywords() LIMIT 1": { - "description": {"word", "catcode", "barelabel", "catdesc", "baredesc"}, - "types": {uint32ToString(pgtype.TextOID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.BoolOID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.TextOID)}, - "values": {"abort", "U", "t", "unreserved", "can be bare label"}, - }, - "SELECT pg_get_keywords.word FROM pg_catalog.pg_get_keywords() LIMIT 1": { - "description": {"word"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"abort"}, - }, - "SELECT * FROM generate_series(1, 2) AS series(index) LIMIT 1": { - "description": {"index"}, - "types": {uint32ToString(pgtype.Int8OID)}, - "values": {"1"}, - }, - "SELECT * FROM generate_series(1, array_upper(current_schemas(FALSE), 1)) AS series(index) LIMIT 1": { - "description": {"index"}, - "types": {uint32ToString(pgtype.Int8OID)}, - "values": {"1"}, - }, - "SELECT (information_schema._pg_expandarray(ARRAY[10])).n": { - "description": {"n"}, - "types": {uint32ToString(pgtype.Int8OID)}, - "values": {"1"}, - }, - "SELECT (information_schema._pg_expandarray(ARRAY[10])).x AS value": { - "description": {"value"}, - "types": {uint32ToString(pgtype.Int4OID)}, - "values": {"10"}, - }, - }) - }) - - t.Run("JOIN", func(t *testing.T) { - testResponseByQuery(t, queryHandler, map[string]map[string][]string{ - "SELECT s.usename, r.rolconfig FROM pg_catalog.pg_shadow s LEFT JOIN pg_catalog.pg_roles r ON s.usename = r.rolname": { - "description": {"usename", "rolconfig"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"user", ""}, - }, - "SELECT a.oid, pd.description FROM pg_catalog.pg_roles a LEFT JOIN pg_catalog.pg_shdescription pd ON a.oid = pd.objoid": { - "description": {"oid", "description"}, - "types": {uint32ToString(pgtype.OIDOID), uint32ToString(pgtype.TextOID)}, - "values": {"10", ""}, - }, - "SELECT (SELECT 1 FROM (SELECT 1 AS inner_val) JOIN (SELECT NULL) ON inner_val = indclass[1]) AS test FROM pg_index": { - "description": {"test"}, - "types": {uint32ToString(pgtype.Int4OID)}, - }, - }) - }) - - t.Run("CASE", func(t *testing.T) { - testResponseByQuery(t, queryHandler, map[string]map[string][]string{ - "SELECT CASE WHEN true THEN 'yes' ELSE 'no' END AS case": { - "description": {"case"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"yes"}, - }, - "SELECT CASE WHEN false THEN 'yes' ELSE 'no' END AS case": { - "description": {"case"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"no"}, - }, - "SELECT CASE WHEN true THEN 'one' WHEN false THEN 'two' ELSE 'three' END AS case": { - "description": {"case"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"one"}, - }, - "SELECT CASE WHEN (SELECT count(extname) FROM pg_catalog.pg_extension WHERE extname = 'bdr') > 0 THEN 'pgd' WHEN (SELECT count(*) FROM pg_replication_slots) > 0 THEN 'log' ELSE NULL END AS type": { - "description": {"type"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {""}, - }, - "SELECT roles.oid AS id, roles.rolname AS name, roles.rolsuper AS is_superuser, CASE WHEN roles.rolsuper THEN true ELSE false END AS can_create_role FROM pg_catalog.pg_roles roles WHERE rolname = current_user": { - "description": {"id", "name", "is_superuser", "can_create_role"}, - "types": {uint32ToString(pgtype.Int8OID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.BoolOID), uint32ToString(pgtype.BoolOID)}, - "values": {}, - }, - "SELECT roles.oid AS id, roles.rolname AS name, roles.rolsuper AS is_superuser, CASE WHEN roles.rolsuper THEN true ELSE roles.rolcreaterole END AS can_create_role FROM pg_catalog.pg_roles roles WHERE rolname = current_user": { - "description": {"id", "name", "is_superuser", "can_create_role"}, - "types": {uint32ToString(pgtype.Int8OID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.BoolOID), uint32ToString(pgtype.BoolOID)}, - "values": {}, - }, - "SELECT CASE WHEN TRUE THEN pg_catalog.pg_is_in_recovery() END AS CASE": { - "description": {"case"}, - "types": {uint32ToString(pgtype.BoolOID)}, - "values": {"f"}, - }, - "SELECT CASE WHEN FALSE THEN true ELSE pg_catalog.pg_is_in_recovery() END AS CASE": { - "description": {"case"}, - "types": {uint32ToString(pgtype.BoolOID)}, - "values": {"f"}, - }, - "SELECT CASE WHEN nsp.nspname = ANY('{information_schema}') THEN false ELSE true END AS db_support FROM pg_catalog.pg_namespace nsp LIMIT 1": { - "description": {"db_support"}, - "types": {uint32ToString(pgtype.BoolOID)}, - "values": {"t"}, - }, - "SELECT CASE WHEN FORMAT('%s', postgres.test_table.varchar_column) = 'varchar' THEN 1 ELSE 2 END AS test_case FROM postgres.test_table WHERE varchar_column = 'varchar'": { - "description": {"test_case"}, - "types": {uint32ToString(pgtype.Int4OID)}, - "values": {"1"}, - }, - }) - }) - - t.Run("WHERE pg_function()", func(t *testing.T) { - testResponseByQuery(t, queryHandler, map[string]map[string][]string{ - "SELECT gss_authenticated, encrypted FROM (SELECT false, false, false, false, false WHERE false) t(pid, gss_authenticated, principal, encrypted, credentials_delegated) WHERE pid = pg_backend_pid()": { - "description": {"gss_authenticated", "encrypted"}, - "types": {uint32ToString(pgtype.BoolOID), uint32ToString(pgtype.BoolOID)}, - "values": {}, - }, - }) - }) - - t.Run("WHERE with nested SELECT", func(t *testing.T) { - testResponseByQuery(t, queryHandler, map[string]map[string][]string{ - "SELECT int2_column FROM postgres.test_table WHERE int2_column > 0 AND int2_column = (SELECT int2_column FROM postgres.test_table WHERE int2_column = 32767)": { - "description": {"int2_column"}, - "types": {uint32ToString(pgtype.Int4OID)}, - "values": {"32767"}, - }, - }) - }) - - t.Run("WHERE ANY(column reference)", func(t *testing.T) { - testResponseByQuery(t, queryHandler, map[string]map[string][]string{ - "SELECT id FROM postgres.test_table WHERE 'one' = ANY(array_text_column)": { - "description": {"id"}, - "types": {uint32ToString(pgtype.Int4OID)}, - "values": {"1"}, - }, - }) - }) - - t.Run("WITH", func(t *testing.T) { - testResponseByQuery(t, queryHandler, map[string]map[string][]string{ - "WITH RECURSIVE simple_cte AS (SELECT oid, rolname FROM pg_roles WHERE rolname = 'postgres' UNION ALL SELECT oid, rolname FROM pg_roles) SELECT * FROM simple_cte": { - "description": {"oid", "rolname"}, - "types": {uint32ToString(pgtype.OIDOID), uint32ToString(pgtype.TextOID)}, - "values": {"10", "user"}, - }, - }) - }) - - t.Run("ORDER BY", func(t *testing.T) { - testResponseByQuery(t, queryHandler, map[string]map[string][]string{ - "SELECT ARRAY(SELECT 1 FROM pg_enum ORDER BY enumsortorder) AS array": { - "description": {"array"}, - "types": {uint32ToString(pgtype.Int4ArrayOID)}, - "values": {"{}"}, - }, - "SELECT postgres.test_table.id FROM postgres.test_table ORDER BY postgres.test_table.id DESC LIMIT 1": { - "description": {"id"}, - "types": {uint32ToString(pgtype.Int4OID)}, - "values": {"2"}, - }, - }) - }) - - t.Run("GROUP BY", func(t *testing.T) { - testResponseByQuery(t, queryHandler, map[string]map[string][]string{ - "SELECT MAX(id) AS max FROM postgres.test_table GROUP BY postgres.test_table.id ORDER BY max LIMIT 1": { - "description": {"max"}, - "types": {uint32ToString(pgtype.Int4OID)}, - "values": {"1"}, - }, - `WITH schema AS (SELECT pg_namespace.nspname AS name FROM pg_namespace WHERE nspname != 'information_schema' AND nspname NOT LIKE 'pg\_%') SELECT schema.name AS schema FROM schema GROUP BY schema ORDER BY schema LIMIT 1`: { - "description": {"schema_"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"postgres"}, - }, - }) - }) - - t.Run("FROM table alias", func(t *testing.T) { - testResponseByQuery(t, queryHandler, map[string]map[string][]string{ - "SELECT pg_shadow.usename FROM pg_shadow": { - "description": {"usename"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"user"}, - }, - "SELECT pg_roles.rolname FROM pg_roles": { - "description": {"rolname"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"user"}, - }, - "SELECT pg_extension.extname FROM pg_extension": { - "description": {"extname"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"plpgsql"}, - }, - "SELECT pg_database.datname FROM pg_database": { - "description": {"datname"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {"bemidb"}, - }, - "SELECT pg_inherits.inhrelid FROM pg_inherits": { - "description": {"inhrelid"}, - "types": {uint32ToString(pgtype.Int8OID)}, - "values": {}, - }, - "SELECT pg_shdescription.objoid FROM pg_shdescription": { - "description": {"objoid"}, - "types": {uint32ToString(pgtype.OIDOID)}, - "values": {}, - }, - "SELECT pg_statio_user_tables.relid FROM pg_statio_user_tables": { - "description": {"relid"}, - "types": {uint32ToString(pgtype.Int8OID)}, - "values": {}, - }, - "SELECT pg_replication_slots.slot_name FROM pg_replication_slots": { - "description": {"slot_name"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {}, - }, - "SELECT pg_stat_gssapi.pid FROM pg_stat_gssapi": { - "description": {"pid"}, - "types": {uint32ToString(pgtype.Int4OID)}, - "values": {}, - }, - "SELECT pg_auth_members.oid FROM pg_auth_members": { - "description": {"oid"}, - "types": {uint32ToString(pgtype.TextOID)}, - "values": {}, - }, - }) - }) - - t.Run("Sublink", func(t *testing.T) { - testResponseByQuery(t, queryHandler, map[string]map[string][]string{ - "SELECT x.usename, (SELECT split_part(passwd, ':', 1) FROM pg_shadow WHERE usename = x.usename) as password FROM pg_shadow x WHERE x.usename = 'user'": { - "description": {"usename", "password"}, - "types": {uint32ToString(pgtype.TextOID), uint32ToString(pgtype.TextOID)}, - "values": {"user", "SCRAM-SHA-256$4096"}, - }, - }) - }) - - t.Run("Type comparisons", func(t *testing.T) { - testResponseByQuery(t, queryHandler, map[string]map[string][]string{ - "SELECT db.oid AS did, db.datname AS name, ta.spcname AS spcname, db.datallowconn, db.datistemplate AS is_template, pg_catalog.has_database_privilege(db.oid, 'CREATE') AS cancreate, datdba AS owner, descr.description FROM pg_catalog.pg_database db LEFT OUTER JOIN pg_catalog.pg_tablespace ta ON db.dattablespace = ta.oid LEFT OUTER JOIN pg_catalog.pg_shdescription descr ON (db.oid = descr.objoid AND descr.classoid = 'pg_database'::regclass) WHERE db.oid > 1145::OID OR db.datname IN ('postgres', 'edb') ORDER BY datname": { - "description": {"did", "name", "spcname", "datallowconn", "is_template", "cancreate", "owner", "description"}, - "types": { - uint32ToString(pgtype.OIDOID), - uint32ToString(pgtype.TextOID), - uint32ToString(pgtype.TextOID), - uint32ToString(pgtype.BoolOID), - uint32ToString(pgtype.BoolOID), - uint32ToString(pgtype.BoolOID), - uint32ToString(pgtype.Int8OID), - uint32ToString(pgtype.TextOID), - }, - "values": {"16388", "bemidb", "", "t", "f", "t", "10", ""}, - }, - }) - }) - - t.Run("Returns an error if a table does not exist", func(t *testing.T) { - _, err := queryHandler.HandleSimpleQuery("SELECT * FROM non_existent_table") - - if err == nil { - t.Errorf("Expected an error, got nil") - } - - expectedErrorMessage := strings.Join([]string{ - "Catalog Error: Table with name non_existent_table does not exist!", - "Did you mean \"pg_statio_user_tables\"?", - "", - "LINE 1: SELECT * FROM non_existent_table", - " ^", - }, "\n") - if err.Error() != expectedErrorMessage { - t.Errorf("Expected the error to be '"+expectedErrorMessage+"', got %v", err.Error()) - } - }) - - t.Run("Returns an error if permission for a column is denied", func(t *testing.T) { - _, err := queryHandler.HandleSimpleQuery("SELECT id, bit_column FROM postgres.test_table /*BEMIDB_PERMISSIONS {\"postgres.test_table\": [\"id\"]} BEMIDB_PERMISSIONS*/") - - if err == nil { - t.Errorf("Expected an error, got nil") - } - - expectedErrorMessage := strings.Join([]string{ - "Binder Error: Referenced column \"bit_column\" not found in FROM clause!", - "Candidate bindings: \"id\"", - "", - "LINE 1: SELECT id, bit_column FROM (SELECT id FROM iceberg_scan('s3://bemidb...", - " ^", - }, "\n") - if err.Error() != expectedErrorMessage { - t.Errorf("Expected the error to be '"+expectedErrorMessage+"', got %v", err.Error()) - } - }) - - t.Run("Returns a result without a row description for SET queries", func(t *testing.T) { - messages, err := queryHandler.HandleSimpleQuery("SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL READ UNCOMMITTED") - - testNoError(t, err) - testMessageTypes(t, messages, []pgproto3.Message{ - &pgproto3.CommandComplete{}, - }) - testCommandCompleteTag(t, messages[0], "SET") - }) - - t.Run("Allows setting and querying timezone", func(t *testing.T) { - queryHandler.HandleSimpleQuery("SET timezone = 'UTC'") - - messages, err := queryHandler.HandleSimpleQuery("show timezone") - - testNoError(t, err) - testMessageTypes(t, messages, []pgproto3.Message{ - &pgproto3.RowDescription{}, - &pgproto3.DataRow{}, - &pgproto3.CommandComplete{}, - }) - testRowDescription(t, messages[0], []string{"timezone"}, []string{uint32ToString(pgtype.TextOID)}) - testDataRowValues(t, messages[1], []string{"UTC"}) - testCommandCompleteTag(t, messages[2], "SHOW") - }) - - t.Run("Handles an empty query", func(t *testing.T) { - messages, err := queryHandler.HandleSimpleQuery("-- ping") - - testNoError(t, err) - testMessageTypes(t, messages, []pgproto3.Message{ - &pgproto3.EmptyQueryResponse{}, - }) - }) - - t.Run("Handles a DISCARD ALL query", func(t *testing.T) { - messages, err := queryHandler.HandleSimpleQuery("DISCARD ALL") - - testNoError(t, err) - testMessageTypes(t, messages, []pgproto3.Message{ - &pgproto3.CommandComplete{}, - }) - testCommandCompleteTag(t, messages[0], "DISCARD ALL") - }) - - t.Run("Handles a BEGIN query", func(t *testing.T) { - messages, err := queryHandler.HandleSimpleQuery("BEGIN") - - testNoError(t, err) - testMessageTypes(t, messages, []pgproto3.Message{ - &pgproto3.CommandComplete{}, - }) - testCommandCompleteTag(t, messages[0], "BEGIN") - }) -} - -func TestHandleParseQuery(t *testing.T) { - queryHandler := initQueryHandler() - defer queryHandler.ServerDuckdbClient.Close() - - t.Run("Handles PARSE extended query step", func(t *testing.T) { - query := "SELECT usename, passwd FROM pg_shadow WHERE usename=$1" - message := &pgproto3.Parse{Query: query} - - messages, preparedStatement, err := queryHandler.HandleParseQuery(message) - - testNoError(t, err) - testMessageTypes(t, messages, []pgproto3.Message{ - &pgproto3.ParseComplete{}, - }) - - remappedQuery := "SELECT usename, passwd FROM main.pg_shadow WHERE usename = $1" - if preparedStatement.Query != remappedQuery { - t.Errorf("Expected the prepared statement query to be %v, got %v", remappedQuery, preparedStatement.Query) - } - if preparedStatement.Statement == nil { - t.Errorf("Expected the prepared statement to have a statement") - } - }) - - t.Run("Handles PARSE extended query step if query is empty", func(t *testing.T) { - message := &pgproto3.Parse{Query: ""} - - messages, preparedStatement, err := queryHandler.HandleParseQuery(message) - - testNoError(t, err) - testMessageTypes(t, messages, []pgproto3.Message{ - &pgproto3.ParseComplete{}, - }) - - if preparedStatement.Query != "" { - t.Errorf("Expected the prepared statement query to be empty, got %v", preparedStatement.Query) - } - if preparedStatement.Statement != nil { - t.Errorf("Expected the prepared statement not to have a statement, got %v", preparedStatement.Statement) - } - }) -} - -func TestHandleBindQuery(t *testing.T) { - queryHandler := initQueryHandler() - defer queryHandler.ServerDuckdbClient.Close() - - t.Run("Handles BIND extended query step with text format parameter", func(t *testing.T) { - parseMessage := &pgproto3.Parse{Query: "SELECT usename, passwd FROM pg_shadow WHERE usename=$1"} - _, preparedStatement, err := queryHandler.HandleParseQuery(parseMessage) - testNoError(t, err) - - bindMessage := &pgproto3.Bind{ - Parameters: [][]byte{[]byte("user")}, - ParameterFormatCodes: []int16{0}, // Text format - } - messages, preparedStatement, err := queryHandler.HandleBindQuery(bindMessage, preparedStatement) - - testNoError(t, err) - testMessageTypes(t, messages, []pgproto3.Message{ - &pgproto3.BindComplete{}, - }) - if len(preparedStatement.Variables) != 1 { - t.Errorf("Expected the prepared statement to have 1 variable, got %v", len(preparedStatement.Variables)) - } - if preparedStatement.Variables[0] != "user" { - t.Errorf("Expected the prepared statement variable to be 'user', got %v", preparedStatement.Variables[0]) - } - }) - - t.Run("Handles BIND extended query step with binary format 4-byte parameter", func(t *testing.T) { - parseMessage := &pgproto3.Parse{Query: "SELECT c.oid FROM pg_catalog.pg_class c WHERE c.relnamespace = $1"} - _, preparedStatement, err := queryHandler.HandleParseQuery(parseMessage) - testNoError(t, err) - - paramValue := int32(2200) - paramBytes := make([]byte, 4) - binary.BigEndian.PutUint32(paramBytes, uint32(paramValue)) - - bindMessage := &pgproto3.Bind{ - Parameters: [][]byte{paramBytes}, - ParameterFormatCodes: []int16{1}, // Binary format - } - messages, preparedStatement, err := queryHandler.HandleBindQuery(bindMessage, preparedStatement) - - testNoError(t, err) - testMessageTypes(t, messages, []pgproto3.Message{ - &pgproto3.BindComplete{}, - }) - if len(preparedStatement.Variables) != 1 { - t.Errorf("Expected the prepared statement to have 1 variable, got %v", len(preparedStatement.Variables)) - } - if preparedStatement.Variables[0] != paramValue { - t.Errorf("Expected the prepared statement variable to be %v, got %v", paramValue, preparedStatement.Variables[0]) - } - }) - - t.Run("Handles BIND extended query step with binary format 8-byte parameter", func(t *testing.T) { - parseMessage := &pgproto3.Parse{Query: "SELECT c.oid FROM pg_catalog.pg_class c WHERE c.relnamespace = $1"} - _, preparedStatement, err := queryHandler.HandleParseQuery(parseMessage) - testNoError(t, err) - - paramValue := int64(2200) - paramBytes := make([]byte, 8) - binary.BigEndian.PutUint64(paramBytes, uint64(paramValue)) - - bindMessage := &pgproto3.Bind{ - Parameters: [][]byte{paramBytes}, - ParameterFormatCodes: []int16{1}, // Binary format - } - messages, preparedStatement, err := queryHandler.HandleBindQuery(bindMessage, preparedStatement) - - testNoError(t, err) - testMessageTypes(t, messages, []pgproto3.Message{ - &pgproto3.BindComplete{}, - }) - if len(preparedStatement.Variables) != 1 { - t.Errorf("Expected the prepared statement to have 1 variable, got %v", len(preparedStatement.Variables)) - } - if preparedStatement.Variables[0] != paramValue { - t.Errorf("Expected the prepared statement variable to be %v, got %v", paramValue, preparedStatement.Variables[0]) - } - }) - - t.Run("Handles BIND extended query step with binary format 16-byte (uuid) parameter", func(t *testing.T) { - parseMessage := &pgproto3.Parse{Query: "SELECT uuid_column FROM postgres.test_table WHERE uuid_column = $1"} - _, preparedStatement, err := queryHandler.HandleParseQuery(parseMessage) - testNoError(t, err) - - uuidParam := "58a7c845-af77-44b2-8664-7ca613d92f04" - paramBytes, _ := uuid.Must(uuid.Parse(uuidParam)).MarshalBinary() - - bindMessage := &pgproto3.Bind{ - Parameters: [][]byte{paramBytes}, - ParameterFormatCodes: []int16{1}, // Binary format - } - messages, preparedStatement, err := queryHandler.HandleBindQuery(bindMessage, preparedStatement) - - testNoError(t, err) - testMessageTypes(t, messages, []pgproto3.Message{ - &pgproto3.BindComplete{}, - }) - if len(preparedStatement.Variables) != 1 { - t.Errorf("Expected the prepared statement to have 1 variable, got %v", len(preparedStatement.Variables)) - } - if preparedStatement.Variables[0] != uuidParam { - t.Errorf("Expected the prepared statement variable to be %v, got %v", uuidParam, preparedStatement.Variables[0]) - } - }) -} - -func TestHandleDescribeQuery(t *testing.T) { - queryHandler := initQueryHandler() - defer queryHandler.ServerDuckdbClient.Close() - - t.Run("Handles DESCRIBE extended query step", func(t *testing.T) { - query := "SELECT usename, passwd FROM pg_shadow WHERE usename=$1" - parseMessage := &pgproto3.Parse{Query: query} - _, preparedStatement, _ := queryHandler.HandleParseQuery(parseMessage) - bindMessage := &pgproto3.Bind{Parameters: [][]byte{[]byte("user")}} - _, preparedStatement, _ = queryHandler.HandleBindQuery(bindMessage, preparedStatement) - message := &pgproto3.Describe{ObjectType: 'P'} - - messages, preparedStatement, err := queryHandler.HandleDescribeQuery(message, preparedStatement) - - testNoError(t, err) - testMessageTypes(t, messages, []pgproto3.Message{ - &pgproto3.RowDescription{}, - }) - testRowDescription(t, messages[0], []string{"usename", "passwd"}, []string{uint32ToString(pgtype.TextOID), uint32ToString(pgtype.TextOID)}) - if preparedStatement.Rows == nil { - t.Errorf("Expected the prepared statement to have rows") - } - }) - - t.Run("Handles DESCRIBE extended query step if query is empty", func(t *testing.T) { - parseMessage := &pgproto3.Parse{Query: ""} - _, preparedStatement, _ := queryHandler.HandleParseQuery(parseMessage) - bindMessage := &pgproto3.Bind{} - _, preparedStatement, _ = queryHandler.HandleBindQuery(bindMessage, preparedStatement) - message := &pgproto3.Describe{ObjectType: 'P'} - - messages, _, err := queryHandler.HandleDescribeQuery(message, preparedStatement) - - testNoError(t, err) - testMessageTypes(t, messages, []pgproto3.Message{ - &pgproto3.NoData{}, - }) - }) - - t.Run("Handles DESCRIBE (Statement) extended query step if there was no BIND step", func(t *testing.T) { - query := "SELECT usename, passwd FROM pg_shadow WHERE usename=$1" - parseMessage := &pgproto3.Parse{Query: query, ParameterOIDs: []uint32{pgtype.TextOID}} - _, preparedStatement, _ := queryHandler.HandleParseQuery(parseMessage) - message := &pgproto3.Describe{ObjectType: 'S'} - - messages, _, err := queryHandler.HandleDescribeQuery(message, preparedStatement) - - testNoError(t, err) - testMessageTypes(t, messages, []pgproto3.Message{ - &pgproto3.NoData{}, - }) - }) -} - -func TestHandleExecuteQuery(t *testing.T) { - queryHandler := initQueryHandler() - defer queryHandler.ServerDuckdbClient.Close() - - t.Run("Handles EXECUTE extended query step", func(t *testing.T) { - query := "SELECT usename, split_part(passwd, ':', 1) FROM pg_shadow WHERE usename=$1" - parseMessage := &pgproto3.Parse{Query: query} - _, preparedStatement, _ := queryHandler.HandleParseQuery(parseMessage) - bindMessage := &pgproto3.Bind{Parameters: [][]byte{[]byte("user")}} - _, preparedStatement, _ = queryHandler.HandleBindQuery(bindMessage, preparedStatement) - describeMessage := &pgproto3.Describe{ObjectType: 'P'} - _, preparedStatement, _ = queryHandler.HandleDescribeQuery(describeMessage, preparedStatement) - message := &pgproto3.Execute{} - - messages, err := queryHandler.HandleExecuteQuery(message, preparedStatement) - - testNoError(t, err) - testMessageTypes(t, messages, []pgproto3.Message{ - &pgproto3.DataRow{}, - &pgproto3.CommandComplete{}, - }) - testDataRowValues(t, messages[0], []string{"user", "SCRAM-SHA-256$4096"}) - }) - - t.Run("Handles EXECUTE extended query step if query is empty", func(t *testing.T) { - parseMessage := &pgproto3.Parse{Query: ""} - _, preparedStatement, _ := queryHandler.HandleParseQuery(parseMessage) - bindMessage := &pgproto3.Bind{} - _, preparedStatement, _ = queryHandler.HandleBindQuery(bindMessage, preparedStatement) - describeMessage := &pgproto3.Describe{ObjectType: 'P'} - _, preparedStatement, _ = queryHandler.HandleDescribeQuery(describeMessage, preparedStatement) - message := &pgproto3.Execute{} - - messages, err := queryHandler.HandleExecuteQuery(message, preparedStatement) - - testNoError(t, err) - testMessageTypes(t, messages, []pgproto3.Message{ - &pgproto3.EmptyQueryResponse{}, - }) - }) -} - -func TestHandleMultipleQueries(t *testing.T) { - queryHandler := initQueryHandler() - defer queryHandler.ServerDuckdbClient.Close() - - t.Run("Handles multiple SET statements", func(t *testing.T) { - query := `SET client_encoding TO 'UTF8'; -SET client_min_messages TO 'warning'; -SET standard_conforming_strings = on;` - - messages, err := queryHandler.HandleSimpleQuery(query) - - testNoError(t, err) - testMessageTypes(t, messages, []pgproto3.Message{ - &pgproto3.CommandComplete{}, - &pgproto3.CommandComplete{}, - &pgproto3.CommandComplete{}, - }) - testCommandCompleteTag(t, messages[0], "SET") - testCommandCompleteTag(t, messages[1], "SET") - testCommandCompleteTag(t, messages[2], "SET") - }) - - t.Run("Handles mixed SET and SELECT statements", func(t *testing.T) { - query := `SET client_encoding TO 'UTF8'; -SELECT split_part(passwd, ':', 1) FROM pg_shadow WHERE usename='user';` - - messages, err := queryHandler.HandleSimpleQuery(query) - - testNoError(t, err) - testMessageTypes(t, messages, []pgproto3.Message{ - &pgproto3.CommandComplete{}, - &pgproto3.RowDescription{}, - &pgproto3.DataRow{}, - &pgproto3.CommandComplete{}, - }) - testCommandCompleteTag(t, messages[0], "SET") - testDataRowValues(t, messages[2], []string{"SCRAM-SHA-256$4096"}) - testCommandCompleteTag(t, messages[3], "SELECT 1") - }) - - t.Run("Handles multiple SELECT statements", func(t *testing.T) { - query := `SELECT 1; -SELECT split_part(passwd, ':', 1) FROM pg_shadow WHERE usename='user';` - - messages, err := queryHandler.HandleSimpleQuery(query) - - testNoError(t, err) - testMessageTypes(t, messages, []pgproto3.Message{ - &pgproto3.RowDescription{}, - &pgproto3.DataRow{}, - &pgproto3.CommandComplete{}, - &pgproto3.RowDescription{}, - &pgproto3.DataRow{}, - &pgproto3.CommandComplete{}, - }) - testDataRowValues(t, messages[1], []string{"1"}) - testCommandCompleteTag(t, messages[2], "SELECT 1") - testDataRowValues(t, messages[4], []string{"SCRAM-SHA-256$4096"}) - testCommandCompleteTag(t, messages[5], "SELECT 1") - }) - - t.Run("Handles error in any of multiple statements", func(t *testing.T) { - query := `SET client_encoding TO 'UTF8'; -SELECT * FROM non_existent_table; -SET standard_conforming_strings = on;` - - _, err := queryHandler.HandleSimpleQuery(query) - - if err == nil { - t.Error("Expected an error for non-existent table, got nil") - return - } - - if !strings.Contains(err.Error(), "non_existent_table") { - t.Errorf("Expected error message to contain 'non_existent_table', got: %s", err.Error()) - } - }) -} - -func initQueryHandler() *QueryHandler { - config := loadTestConfig() - serverDuckdbClient := common.NewDuckdbClient(config.CommonConfig, duckdbBootQueris(config)) - return NewQueryHandler(config, serverDuckdbClient) -} - -func loadTestConfig() *Config { - setTestArgs([]string{}) - - _config.CommonConfig.DisableAnonymousAnalytics = true - - return LoadConfig() -} - -func setTestArgs(args []string) { - os.Args = append([]string{"cmd"}, args...) - flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ExitOnError) - registerFlags() -} - -func testNoError(t *testing.T, err error) { - if err != nil { - t.Errorf("Expected no error, got %v", err) - } -} - -func testMessageTypes(t *testing.T, messages []pgproto3.Message, expectedTypes []pgproto3.Message) { - if len(messages) != len(expectedTypes) { - t.Errorf("Expected %v messages, got %v", len(expectedTypes), len(messages)) - } - - for i, expectedType := range expectedTypes { - if reflect.TypeOf(messages[i]) != reflect.TypeOf(expectedType) { - t.Errorf("Expected the %v message to be a %v", i, expectedType) - } - } -} - -func testRowDescription(t *testing.T, rowDescriptionMessage pgproto3.Message, expectedColumnNames []string, expectedColumnTypes []string) { - rowDescription := rowDescriptionMessage.(*pgproto3.RowDescription) - - if len(rowDescription.Fields) != len(expectedColumnNames) { - t.Errorf("Expected %v row description fields, got %v", len(expectedColumnNames), len(rowDescription.Fields)) - } - - for i, expectedColumnName := range expectedColumnNames { - if string(rowDescription.Fields[i].Name) != expectedColumnName { - t.Errorf("Expected the %v row description field to be %v, got %v", i, expectedColumnName, string(rowDescription.Fields[i].Name)) - } - } - - for i, expectedColumnType := range expectedColumnTypes { - if uint32ToString(rowDescription.Fields[i].DataTypeOID) != expectedColumnType { - t.Errorf("Expected the %v row description field data type to be %v, got %v", i, expectedColumnType, uint32ToString(rowDescription.Fields[i].DataTypeOID)) - } - } -} - -func testDataRowValues(t *testing.T, dataRowMessage pgproto3.Message, expectedValues []string) { - dataRow := dataRowMessage.(*pgproto3.DataRow) - - if len(dataRow.Values) != len(expectedValues) { - t.Errorf("Expected %v data row values, got %v", len(expectedValues), len(dataRow.Values)) - } - - for i, expectedValue := range expectedValues { - if string(dataRow.Values[i]) != expectedValue { - t.Errorf("Expected the %v data row value to be %v, got %v", i, expectedValue, string(dataRow.Values[i])) - } - } -} - -func testCommandCompleteTag(t *testing.T, message pgproto3.Message, expectedTag string) { - commandComplete := message.(*pgproto3.CommandComplete) - if string(commandComplete.CommandTag) != expectedTag { - t.Errorf("Expected the command tag to be %v, got %v", expectedTag, string(commandComplete.CommandTag)) - } -} - -func testResponseByQuery(t *testing.T, queryHandler *QueryHandler, responseByQuery map[string]map[string][]string) { - for query, responses := range responseByQuery { - t.Run(query, func(t *testing.T) { - messages, err := queryHandler.HandleSimpleQuery(query) - - testNoError(t, err) - testRowDescription(t, messages[0], responses["description"], responses["types"]) - - if len(responses["values"]) > 0 { - testMessageTypes(t, messages, []pgproto3.Message{ - &pgproto3.RowDescription{}, - &pgproto3.DataRow{}, - &pgproto3.CommandComplete{}, - }) - testDataRowValues(t, messages[1], responses["values"]) - } else { - testMessageTypes(t, messages, []pgproto3.Message{ - &pgproto3.RowDescription{}, - &pgproto3.CommandComplete{}, - }) - } - }) - } -} - -func uint32ToString(i uint32) string { - return strconv.FormatUint(uint64(i), 10) -} diff --git a/src/syncer-amplitude/go.mod b/src/syncer-amplitude/go.mod deleted file mode 100644 index 0cb7a1c..0000000 --- a/src/syncer-amplitude/go.mod +++ /dev/null @@ -1,69 +0,0 @@ -module github.com/BemiHQ/BemiDB/src/syncer-amplitude - -go 1.24.4 - -require ( - github.com/BemiHQ/BemiDB/src/common v0.0.0-00010101000000-000000000000 - github.com/BemiHQ/BemiDB/src/syncer-amplitude/lib v0.0.0-00010101000000-000000000000 -) - -replace github.com/BemiHQ/BemiDB/src/common => ../common - -replace github.com/BemiHQ/BemiDB/src/syncer-amplitude/lib => ./lib - -require ( - github.com/apache/arrow-go/v18 v18.4.0 // indirect - github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 // indirect - github.com/apache/thrift v0.22.0 // indirect - github.com/aws/aws-sdk-go-v2 v1.37.0 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 // indirect - github.com/aws/aws-sdk-go-v2/config v1.30.1 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.18.1 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0 // indirect - github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.26.0 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.35.0 // indirect - github.com/aws/smithy-go v1.22.5 // indirect - github.com/duckdb/duckdb-go-bindings v0.1.16 // indirect - github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11 // indirect - github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11 // indirect - github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11 // indirect - github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11 // indirect - github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11 // indirect - github.com/go-viper/mapstructure/v2 v2.3.0 // indirect - github.com/goccy/go-json v0.10.5 // indirect - github.com/golang/snappy v1.0.0 // indirect - github.com/google/flatbuffers v25.2.10+incompatible // indirect - github.com/google/uuid v1.6.0 // indirect - github.com/jackc/pgpassfile v1.0.0 // indirect - github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect - github.com/jackc/pgx/v5 v5.7.5 // indirect - github.com/klauspost/compress v1.18.0 // indirect - github.com/klauspost/cpuid/v2 v2.2.11 // indirect - github.com/linkedin/goavro v2.1.0+incompatible // indirect - github.com/marcboeker/go-duckdb/arrowmapping v0.0.9 // indirect - github.com/marcboeker/go-duckdb/mapping v0.0.10 // indirect - github.com/marcboeker/go-duckdb/v2 v2.3.2 // indirect - github.com/pierrec/lz4/v4 v4.1.22 // indirect - github.com/xitongsys/parquet-go v1.6.2 // indirect - github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b // indirect - github.com/zeebo/xxh3 v1.0.2 // indirect - golang.org/x/crypto v0.40.0 // indirect - golang.org/x/exp v0.0.0-20250718183923-645b1fa84792 // indirect - golang.org/x/mod v0.26.0 // indirect - golang.org/x/sync v0.16.0 // indirect - golang.org/x/sys v0.34.0 // indirect - golang.org/x/text v0.27.0 // indirect - golang.org/x/tools v0.35.0 // indirect - golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect -) diff --git a/src/syncer-amplitude/go.sum b/src/syncer-amplitude/go.sum deleted file mode 100644 index 79719d8..0000000 --- a/src/syncer-amplitude/go.sum +++ /dev/null @@ -1,1160 +0,0 @@ -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.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.66.0/go.mod h1:dgqGAjKCDxyhGTtC9dAREQGUJpkceNm1yt590Qno0Ko= -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.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.82.0/go.mod h1:vlKccHJGuFBFufnAnuB08dfEH9Y3H7dzDzRECFdC2TA= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= -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 v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.2.0/go.mod h1:xlogom/6gr8RJGBe7nT2eGsQYAFUbbv8dbC29qE3Xmw= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -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/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= -cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= -cloud.google.com/go/iam v0.1.1/go.mod h1:CKqrcnI/suGpybEHxZ7BMehL0oA4LpdyJdUlTl9jVMw= -cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= -cloud.google.com/go/kms v1.1.0/go.mod h1:WdbppnCDMDpOvoYBMn1+gNmOeEoZYqAv+HeuKARGCXI= -cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= -cloud.google.com/go/monitoring v1.1.0/go.mod h1:L81pzz7HKn14QCMaCs6NTQkdBnE87TElyanS95vIcl4= -cloud.google.com/go/monitoring v1.4.0/go.mod h1:y6xnxfwI3hTFWOdkOaD7nfJVlwuC3/mS/5kvtT131p4= -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/pubsub v1.19.0/go.mod h1:/O9kmSe9bb9KRnIAWkzmqhPjHo6LtzGOBYd/kr06XSs= -cloud.google.com/go/secretmanager v1.3.0/go.mod h1:+oLTkouyiYiabAQNugCeTS3PAArGiMJuBqvJnJsyH+U= -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.12.0/go.mod h1:fFLk2dp2oAhDz8QFKwqrjdJvxSp/W2g7nillojlL5Ho= -cloud.google.com/go/storage v1.21.0/go.mod h1:XmRlxkgPjlBONznT2dDUU/5XlpU2OjMnKuqnZI01LAA= -cloud.google.com/go/trace v1.0.0/go.mod h1:4iErSByzxkyHWzzlAj63/Gmjz0NH1ASqhJguHpGcr6A= -cloud.google.com/go/trace v1.2.0/go.mod h1:Wc8y/uYyOhPy12KEnXG9XGrvfMz5F5SrYecQlbW1rwM= -contrib.go.opencensus.io/exporter/aws v0.0.0-20200617204711-c478e41e60e9/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= -contrib.go.opencensus.io/exporter/stackdriver v0.13.10/go.mod h1:I5htMbyta491eUxufwwZPQdcKvvgzMB4O9ni41YnIM8= -contrib.go.opencensus.io/integrations/ocsql v0.1.7/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/azure-amqp-common-go/v3 v3.2.1/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= -github.com/Azure/azure-amqp-common-go/v3 v3.2.2/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= -github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k= -github.com/Azure/azure-sdk-for-go v51.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v59.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.0.0/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.0.0/go.mod h1:+6sju8gk8FRmSajX3Oz4G5Gm7P+mbqE9FVaXXFYTkCM= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U= -github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.0.0/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.0.0/go.mod h1:ceIuwmxDWptoW3eCqSXlnPsZFKh4X+R38dWPv7GS9Vs= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.0.0/go.mod h1:s1tW/At+xHqjNFvWU4G0c0Qv33KOhvbGNj0RCTQDV8s= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.2.0/go.mod h1:c+Lifp3EDEamAkPVzMooRNOK6CZjNSdEnf1A7jsI9u4= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.1.0/go.mod h1:7QJP7dr2wznCMeqIrhMgWGf7XpAQnVrJqDm9nvV3Cu4= -github.com/Azure/azure-service-bus-go v0.11.5/go.mod h1:MI6ge2CuQWBVq+ly456MY7XqNLJip5LO1iSFodbNLbU= -github.com/Azure/azure-storage-blob-go v0.14.0/go.mod h1:SMqIBi+SuiQH32bvyjngEewEeXoPfKMgWlBDaYf6fck= -github.com/Azure/go-amqp v0.16.0/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= -github.com/Azure/go-amqp v0.16.4/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest v0.11.19/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest v0.11.22/go.mod h1:BAWYUWGPEtKPzjVkp0Q6an0MJcJDsoh5Z1BFAEFs4Xs= -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/adal v0.9.14/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/adal v0.9.17/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= -github.com/Azure/go-autorest/autorest/azure/auth v0.5.9/go.mod h1:hg3/1yw0Bq87O3KvvnJoAh34/0zbP7SFizX/qN5JvjU= -github.com/Azure/go-autorest/autorest/azure/cli v0.4.2/go.mod h1:7qkJkT+j6b+hIpzMOwPChJhTqS8VbsqqgULzMNRugoM= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= -github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/AzureAD/microsoft-authentication-library-for-go v0.4.0/go.mod h1:Vt9sXTKwMyGcOxSmLDMnGPgqsUg7m8pe215qMLrDXw4= -github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/GoogleCloudPlatform/cloudsql-proxy v1.29.0/go.mod h1:spvB9eLJH9dutlbPSRmHvSXXHOwGRyeXh1jVdquA2G8= -github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= -github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/apache/arrow-go/v18 v18.4.0 h1:/RvkGqH517iY8bZKc4FD5/kkdwXJGjxf28JIXbJ/oB0= -github.com/apache/arrow-go/v18 v18.4.0/go.mod h1:Aawvwhj8x2jURIzD9Moy72cF0FyJXOpkYpdmGRHcw14= -github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 h1:byKBBF2CKWBjjA4J1ZL2JXttJULvWSl50LegTyRZ728= -github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516/go.mod h1:QNYViu/X0HXDHw7m3KXzWSVXIbfUvJqBFe6Gj8/pYA0= -github.com/apache/thrift v0.0.0-20181112125854-24918abba929/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.14.2/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.22.0 h1:r7mTJdj51TMDe6RtcmNdQxgn9XcyfGDOzegMDRg47uc= -github.com/apache/thrift v0.22.0/go.mod h1:1e7J/O1Ae6ZQMTYdy9xa3w9k+XHWPfRvdPyJeynQ+/g= -github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= -github.com/aws/aws-sdk-go v1.30.19/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= -github.com/aws/aws-sdk-go v1.37.0/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go v1.43.31 h1:yJZIr8nMV1hXjAvvOLUFqZRJcHV7udPQBfhJqawDzI0= -github.com/aws/aws-sdk-go v1.43.31/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= -github.com/aws/aws-sdk-go-v2 v1.16.2/go.mod h1:ytwTPBG6fXTZLxxeeCCWj2/EMYp/xDUgX+OET6TLNNU= -github.com/aws/aws-sdk-go-v2 v1.23.0/go.mod h1:i1XDttT4rnf6vxc9AuskLc6s7XBee8rlLilKlc03uAA= -github.com/aws/aws-sdk-go-v2 v1.37.0 h1:YtCOESR/pN4j5oA7cVHSfOwIcuh/KwHC4DOSXFbv5F0= -github.com/aws/aws-sdk-go-v2 v1.37.0/go.mod h1:9Q0OoGQoboYIAJyslFyF1f5K1Ryddop8gqMhWx/n4Wg= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.1/go.mod h1:n8Bs1ElDD2wJ9kCRTczA83gYbBmjSwZp3umc6zF4EeM= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.1/go.mod h1:t8PYl/6LzdAqsU4/9tz28V/kU+asFePvpOMkdul0gEQ= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 h1:6GMWV6CNpA/6fbFHnoAjrv4+LGfyTqZz2LtCHnspgDg= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0/go.mod h1:/mXlTIVG9jbxkqDnr5UQNQxW1HRYxeGklkM9vAFeabg= -github.com/aws/aws-sdk-go-v2/config v1.15.3/go.mod h1:9YL3v07Xc/ohTsxFXzan9ZpFpdTOFl4X65BAKYaz8jg= -github.com/aws/aws-sdk-go-v2/config v1.25.3/go.mod h1:tAByZy03nH5jcq0vZmkcVoo6tRzRHEwSFx3QW4NmDw8= -github.com/aws/aws-sdk-go-v2/config v1.30.1 h1:sHL8g/+9tcZATeV2tEkEfxZeaNokDtKsSjGMGHD49qA= -github.com/aws/aws-sdk-go-v2/config v1.30.1/go.mod h1:wkibEyFfxXRyTSzRU4bbF5IUsSXyE4xQ4ZjkGmi5tFo= -github.com/aws/aws-sdk-go-v2/credentials v1.11.2/go.mod h1:j8YsY9TXTm31k4eFhspiQicfXPLZ0gYXA50i4gxPE8g= -github.com/aws/aws-sdk-go-v2/credentials v1.16.2/go.mod h1:sDdvGhXrSVT5yzBDR7qXz+rhbpiMpUYfF3vJ01QSdrc= -github.com/aws/aws-sdk-go-v2/credentials v1.18.1 h1:E55xvOqlX7CvB66Z7rSM9usCrFU1ryUIUHqiXsEzVoE= -github.com/aws/aws-sdk-go-v2/credentials v1.18.1/go.mod h1:iobSQfR5MkvILxssGOvi/P1jjOhrRzfTiCPCzku0vx4= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.3/go.mod h1:uk1vhHHERfSVCUnqSqz8O48LBYDSC+k6brng09jcMOk= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.4/go.mod h1:t4i+yGHMCcUNIX1x7YVYa6bH/Do7civ5I6cG/6PMfyA= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0 h1:9sBTeKQwAvmJUWKIACIoiFSnxxl+sS++YDfr17/ngq0= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0/go.mod h1:LW9/PxQD1SYFC7pnWcgqPhoyZprhjEdg5hBK6qYPLW8= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.3/go.mod h1:0dHuD2HZZSiwfJSy1FO5bX1hQ1TxVV1QXXjpn3XUE44= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.14.0/go.mod h1:UcgIwJ9KHquYxs6Q5skC9qXjhYMK+JASDYcXQ4X7JZE= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1 h1:aAjA/1JZ1xH/F9XvxJu9cXZyp7BqVXtHpztyZ6p799E= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1/go.mod h1:ia9HASsPba/7o84sp6iE4wZPdNTJ0oicBe5sWQQk+Ys= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.9/go.mod h1:AnVH5pvai0pAF4lXRq0bmhbes1u9R8wTE+g+183bZNM= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.3/go.mod h1:7sGSz1JCKHWWBHq98m6sMtWQikmYPpxjqOydDemiVoM= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0 h1:H2iZoqW/v2Jnrh1FnU725Bq6KJ0k2uP63yH+DcY+HUI= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0/go.mod h1:L0FqLbwMXHvNC/7crWV1iIxUlOKYZUE8KuTIA+TozAI= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.3/go.mod h1:ssOhaLpRlh88H3UmEcsBoVKq309quMvm3Ds8e9d4eJM= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.3/go.mod h1:ify42Rb7nKeDDPkFjKn7q1bPscVPu/+gmHH8d2c+anU= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0 h1:EDped/rNzAhFPhVY0sDGbtD16OKqksfA8OjF/kLEgw8= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0/go.mod h1:uUI335jvzpZRPpjYx6ODc/wg1qH+NnoSTK/FwVeK0C0= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.10/go.mod h1:8DcYQcz0+ZJaSxANlHIsbbi6S+zMwjwdDqwW3r9AzaE= -github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.3/go.mod h1:5yzAuE9i2RkVAttBl8yxZgQr5OCq4D5yDnG7j9x2L0U= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0 h1:iLvW/zOkHGU3BDU5thWnj+UZ9pjhuVhv1loLj7yVtBw= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0/go.mod h1:Fn3gvhdF1x5Rs9nUoCy/fJT1ms8f8dO7RqM9lJHuazQ= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.1/go.mod h1:GeUru+8VzrTXV/83XyMJ80KpH8xO89VPoUileyNQ+tc= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1/go.mod h1:l9ymW25HOqymeU2m1gbUQ3rUIsTwKs8gYHXkqDQUhiI= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 h1:6+lZi2JeGKtCraAj1rpoZfKqnQ9SptseRZioejfUOLM= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0/go.mod h1:eb3gfbVIxIoGgJsi9pGne19dhCBpK6opTYpQqAmdy44= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.3/go.mod h1:Seb8KNmD6kVTjwRjVEgOT5hPin6sq+v4C2ycJQDwuH8= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.3/go.mod h1:R+/S1O4TYpcktbVwddeOYg+uwUfLhADP2S/x4QwsCTM= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0 h1:qGyLBQPphYzUf+IIlb5tHnvg1U2Vc5hXPcP7oRSQfy0= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0/go.mod h1:g+dzKSLXiR/8ATkPXmLhPOI6rDdjLP3tngeo3FvDcIw= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.3/go.mod h1:wlY6SVjuwvh3TVRpTqdy4I1JpBFLX4UGeKZdWntaocw= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.3/go.mod h1:Owv1I59vaghv1Ax8zz8ELY8DN7/Y0rGS+WWAmjgi950= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0 h1:eRhU3Sh8dGbaniI6B+I48XJMrTPRkK4DKo+vqIxziOU= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0/go.mod h1:paNLV18DZ6FnWE/bd06RIKPDIFpjuvCkGKWTG/GDBeM= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.3/go.mod h1:Bm/v2IaN6rZ+Op7zX+bOUMdL4fsrYZiD0dsjLhNKwZc= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.3/go.mod h1:KZgs2ny8HsxRIRbDwgvJcHHBZPOzQr/+NtGwnP+w2ec= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0 h1:6jusT+XCcvnD+Elxvm7bUf5sCMTpZEp3AKjYQ4tWJSo= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0/go.mod h1:LimGpdIF/sTBdgqwOEkrArXLCoTamK/9L9x8IKBFTIc= -github.com/aws/aws-sdk-go-v2/service/kms v1.16.3/go.mod h1:QuiHPBqlOFCi4LqdSskYYAWpQlx3PKmohy+rE2F+o5g= -github.com/aws/aws-sdk-go-v2/service/s3 v1.26.3/go.mod h1:g1qvDuRsJY+XghsV6zg00Z4KJ7DtFFCx8fJD2a491Ak= -github.com/aws/aws-sdk-go-v2/service/s3 v1.43.0/go.mod h1:NXRKkiRF+erX2hnybnVU660cYT5/KChRD4iUgJ97cI8= -github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0 h1:gAV4NEp4A+JOrIdoXkAeyy6IOo7+X2s/jRuaHKYiMaU= -github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0/go.mod h1:JIQwK8sZ5MuKGm5rrFwp9MHUcyYEsQNpVixuPDlnwaU= -github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.15.4/go.mod h1:PJc8s+lxyU8rrre0/4a0pn2wgwiDvOEzoOjcJUBr67o= -github.com/aws/aws-sdk-go-v2/service/sns v1.17.4/go.mod h1:kElt+uCcXxcqFyc+bQqZPFD9DME/eC6oHBXvFzQ9Bcw= -github.com/aws/aws-sdk-go-v2/service/sqs v1.18.3/go.mod h1:skmQo0UPvsjsuYYSYMVmrPc1HWCbHUJyrCEp+ZaLzqM= -github.com/aws/aws-sdk-go-v2/service/ssm v1.24.1/go.mod h1:NR/xoKjdbRJ+qx0pMR4mI+N/H1I1ynHwXnO6FowXJc0= -github.com/aws/aws-sdk-go-v2/service/sso v1.11.3/go.mod h1:7UQ/e69kU7LDPtY40OyoHYgRmgfGM4mgsLYtcObdveU= -github.com/aws/aws-sdk-go-v2/service/sso v1.17.2/go.mod h1:/pE21vno3q1h4bbhUOEi+6Zu/aT26UK2WKkDXd+TssQ= -github.com/aws/aws-sdk-go-v2/service/sso v1.26.0 h1:cuFWHH87GP1NBGXXfMicUbE7Oty5KpPxN6w4JpmuxYc= -github.com/aws/aws-sdk-go-v2/service/sso v1.26.0/go.mod h1:aJBemdlbCKyOXEXdXBqS7E+8S9XTDcOTaoOjtng54hA= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.20.0/go.mod h1:dWqm5G767qwKPuayKfzm4rjzFmVjiBFbOJrpSPnAMDs= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0 h1:t2va+wewPOYIqC6XyJ4MGjiGKkczMAPsgq5W4FtL9ME= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0/go.mod h1:ExCTcqYqN0hYYRsDlBVU8+68grqlWdgX9/nZJwQW4aY= -github.com/aws/aws-sdk-go-v2/service/sts v1.16.3/go.mod h1:bfBj0iVmsUyUg4weDB4NxktD9rDGeKSVWnjTnwbx9b8= -github.com/aws/aws-sdk-go-v2/service/sts v1.25.3/go.mod h1:4EqRHDCKP78hq3zOnmFXu5k0j4bXbRFfCh/zQ6KnEfQ= -github.com/aws/aws-sdk-go-v2/service/sts v1.35.0 h1:FD9agdG4CeOGS3ORLByJk56YIXDS7mxFpmZyCtpqExc= -github.com/aws/aws-sdk-go-v2/service/sts v1.35.0/go.mod h1:NDzDPbBF1xtSTZUMuZx0w3hIfWzcL7X2AQ0Tr9becIQ= -github.com/aws/smithy-go v1.11.2/go.mod h1:3xHYmszWVx2c0kIwQeEVf9uSm4fYZt67FBJnwub1bgM= -github.com/aws/smithy-go v1.17.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= -github.com/aws/smithy-go v1.22.5 h1:P9ATCXPMb2mPjYBgueqJNCA5S9UfktsW0tTxi+a7eqw= -github.com/aws/smithy-go v1.22.5/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/bobg/gcsobj v0.1.2/go.mod h1:vS49EQ1A1Ib8FgrL58C8xXYZyOCR2TgzAdopy6/ipa8= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -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/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/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= -github.com/colinmarc/hdfs/v2 v2.1.1/go.mod h1:M3x+k8UKKmxtFu++uAZ0OtDU8jR3jnaZIAc6yK4Ue0c= -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/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU= -github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= -github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= -github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= -github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= -github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/duckdb/duckdb-go-bindings v0.1.16 h1:XPCk9hzP06PoWIxDPVU3gAy0m1XmLaZHTzLggNx/U9k= -github.com/duckdb/duckdb-go-bindings v0.1.16/go.mod h1:pBnfviMzANT/9hi4bg+zW4ykRZZPCXlVuvBWEcZofkc= -github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11 h1:GXQkG4HmEbwPtqCSabJTp9wZQQ7Gqr3KveLNesQWQOs= -github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11/go.mod h1:Ezo7IbAfB8NP7CqPIN8XEHKUg5xdRRQhcPPlCXImXYA= -github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11 h1:ATJMSBIDA/YAm/6CKeBDRtGK1OOwqfTZbWg9Y5fAc9E= -github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11/go.mod h1:eS7m/mLnPQgVF4za1+xTyorKRBuK0/BA44Oy6DgrGXI= -github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11 h1:AjvnGst1avyOECYiykthyHR4DTYTaqNDPr5W/0t5j0k= -github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11/go.mod h1:1GOuk1PixiESxLaCGFhag+oFi7aP+9W8byymRAvunBk= -github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11 h1:j3B1biawuhtxe2Chkiqcwf1Kxe8VJc8lLVmjBIcJrkI= -github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11/go.mod h1:o7crKMpT2eOIi5/FY6HPqaXcvieeLSqdXXaXbruGX7w= -github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11 h1:xR3vRE8y+48U6xDNkUlOfbl7/OTA7FVcDXJ+5vETuHU= -github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11/go.mod h1:IlOhJdVKUJCAPj3QsDszUo8DVdvp1nBFp4TUJVdw99s= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -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/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= -github.com/gin-gonic/gin v1.7.3/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= -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-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= -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-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= -github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-viper/mapstructure/v2 v2.3.0 h1:27XbWsHIqhbdR5TIC911OfYvgSaW93HM+dX7970Q7jk= -github.com/go-viper/mapstructure/v2 v2.3.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= -github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= -github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.4.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= -github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188/go.mod h1:vXjM/+wXQnTPR4KqTKDgJukSZ6amVRtWMPEjE6sQoK8= -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/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/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -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.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= -github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -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/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/flatbuffers v25.2.10+incompatible h1:F3vclr7C3HpB1k9mxCGRMXq6FdUalZ6H/pNX4FP1v0Q= -github.com/google/flatbuffers v25.2.10+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -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.6/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.8/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/go-replayers/grpcreplay v1.1.0/go.mod h1:qzAvJ8/wi57zq7gWqaE6AwLM6miiXUQwP1S+I9icmhk= -github.com/google/go-replayers/httpreplay v1.1.1/go.mod h1:gN9GeLIs7l6NUoVaSSnv2RiqK1NiwAmD0MrKeC9IIks= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+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/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -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-20200905233945-acf8798be1f7/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-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210506205249-923b5ab0fc1a/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.2.0/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.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= -github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/wire v0.5.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU= -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.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hanwen/go-fuse v1.0.0/go.mod h1:unqXarDXqzAk0rt98O2tVndEPIpUgLD9+rwFisZH3Ok= -github.com/hanwen/go-fuse/v2 v2.1.0/go.mod h1:oRyA5eK+pvJyv5otpO/DgccS8y/RvYMaO00GgRLGryc= -github.com/hashicorp/go-uuid v0.0.0-20180228145832-27454136f036/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -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/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/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.11.0/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= -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/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.2.0/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-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= -github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/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.10.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.15.0/go.mod h1:D/zyOyXiaM1TmVWnOM18p0xdDtdakRBa0RsVGI3U3bw= -github.com/jackc/pgx/v5 v5.7.5 h1:JHGfMnQY+IEtGM63d+NGMjoRpysB2JBwDr5fsngwmJs= -github.com/jackc/pgx/v5 v5.7.5/go.mod h1:aruU7o91Tc2q2cFp5h4uP3f6ztExVpyVv88Xl/8Vl8M= -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.2.1 h1:gI8os0wpRXFd4FiAY2dWiqRK037tjj3t7rKFeO4X5iw= -github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= -github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= -github.com/jcmturner/gofork v0.0.0-20180107083740-2aebee971930/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= -github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= -github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -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/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= -github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= -github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.13.1/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= -github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= -github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= -github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= -github.com/klauspost/cpuid/v2 v2.2.11 h1:0OwqZRYI2rFrjS4kvkDnqJkKHdHaRnCm68/DY4OxRzU= -github.com/klauspost/cpuid/v2 v2.2.11/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= -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/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -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/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -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.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/linkedin/goavro v2.1.0+incompatible h1:DV2aUlj2xZiuxQyvag8Dy7zjY69ENjS66bWkSfdpddY= -github.com/linkedin/goavro v2.1.0+incompatible/go.mod h1:bBCwI2eGYpUI/4820s67MElg9tdeLbINjLjiM2xZFYM= -github.com/marcboeker/go-duckdb/arrowmapping v0.0.9 h1:xj+kFOqR2gH3Mcxx9LmAVHebSnCiPm303N+uxfkWVmY= -github.com/marcboeker/go-duckdb/arrowmapping v0.0.9/go.mod h1:o56AqVS90v5bpxhPnOK9La7AfNTOrMORiqTQrlRbdPQ= -github.com/marcboeker/go-duckdb/mapping v0.0.10 h1:b/y2W8/hNlD0Dwjq0mCqIlLXpjQMnWy0WqDV9b9lHQQ= -github.com/marcboeker/go-duckdb/mapping v0.0.10/go.mod h1:Ro6Tw6sGG50O8S0daZsA8TrQJz/DvGrzGvMD7Jihirw= -github.com/marcboeker/go-duckdb/v2 v2.3.2 h1:96zG2JPyIhCFjHdBjjSpOdhzJzehoGTdl7LskkuMUTs= -github.com/marcboeker/go-duckdb/v2 v2.3.2/go.mod h1:VeXz9ZM6klNvICHrXEUzaHSgNqBeTdyMxr4CICw/UaY= -github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= -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.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs= -github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= -github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI= -github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= -github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= -github.com/minio/minio-go/v7 v7.0.34/go.mod h1:nCrRzjoSUQh8hgKKtu3Y708OLvRLtuASMg2/nvmbarw= -github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= -github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= -github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= -github.com/ncw/swift v1.0.52/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -github.com/pborman/getopt v0.0.0-20180729010549-6fdd0a2c7117/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= -github.com/pierrec/lz4/v4 v4.1.8/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= -github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= -github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= -github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= -github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -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/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -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/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.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -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/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -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.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -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.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/xitongsys/parquet-go v1.5.1/go.mod h1:xUxwM8ELydxh4edHGegYq1pA8NnMKDx0K/GyB0o2bww= -github.com/xitongsys/parquet-go v1.6.2 h1:MhCaXii4eqceKPu9BwrjLqyK10oX9WF+xGhwvwbw7xM= -github.com/xitongsys/parquet-go v1.6.2/go.mod h1:IulAQyalCm0rPiZVNnCgm/PCL64X2tdSVGMQ/UeKqWA= -github.com/xitongsys/parquet-go-source v0.0.0-20190524061010-2b72cbee77d5/go.mod h1:xxCx7Wpym/3QCo6JhujJX51dzSXrwmb0oH6FQb39SEA= -github.com/xitongsys/parquet-go-source v0.0.0-20200817004010-026bad9b25d0/go.mod h1:HYhIKsdns7xz80OgkbgJYrtQY7FjHWHKH6cvN7+czGE= -github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b h1:zbb5qM/t3N+O33Vp5sFyG6yIcWZV1q7rfEjJM8UsRBQ= -github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b/go.mod h1:2ActxmJ4q17Cdruar9nKEkzKSOL1Ol03737Bkz10rTY= -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.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= -github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= -github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= -github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= -github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= -go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0= -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.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -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/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -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.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= -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.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= -gocloud.dev v0.26.0/go.mod h1:mkUgejbnbLotorqDyvedJO20XcZNTynmSeVSQS9btVg= -golang.org/x/crypto v0.0.0-20180723164146-c126467f60eb/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -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-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/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-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-20211115234514-b4de73f9ece8/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220511200225-c6db032c6c88/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= -golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM= -golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY= -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-20250718183923-645b1fa84792 h1:R9PFI6EUdfVKgwKjZef7QIwGcBKu86OEFpJ9nUEP2l4= -golang.org/x/exp v0.0.0-20250718183923-645b1fa84792/go.mod h1:A+z0yzpGtvnG90cToK5n2tu8UJVP2XUATh+r+sfOOOc= -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/lint v0.0.0-20210508222113-6edffad5e616/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.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg= -golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ= -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-20191112182307-2180aed22343/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-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -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-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211020060615-d418f374d309/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220401154927-543a649e0bdd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -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.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -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.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -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-20210220032951-036812b2e83c/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.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= -golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= -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-20191112214154-59a1497f0cea/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-20200828194041-157a740278f4/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-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/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-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/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-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220204135822-1c1b9b1eba6a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220330033206-e17cdc41300f/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-20220704084225-05e143d24a9e/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.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA= -golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -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/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -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.5/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.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4= -golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU= -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/time v0.0.0-20211116232009-f0f3c7e86c11/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220224211638-0e9765cccd65/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-20190422233926-fe54fb35175b/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-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-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-20200828161849-5deb26317202/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20200915173823-2db8f0ff891c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20200918232735-d647fc253266/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -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.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0= -golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw= -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= -golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= -golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= -gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= -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.31.0/go.mod h1:CL+9IBCa2WWU6gRuBWaKqGWLFFwbEUXkfeMkHLQWYWo= -google.golang.org/api v0.32.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -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.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.46.0/go.mod h1:ceL4oozhkAiTID8XMmJBsIxID/9wMXJVVFXPg4ylg3I= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.58.0/go.mod h1:cAbP2FsxoGVNwtgNAmmn3y5G1TWAiVYRmg4yku3lv+E= -google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.64.0/go.mod h1:931CdxA8Rm4t6zqTFGSsgwbAEZ2+GMYurbndwSimebM= -google.golang.org/api v0.66.0/go.mod h1:I1dmXYpX7HGwz/ejRxwQp2qj5bFAz93HiCU1C1oYd9M= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.68.0/go.mod h1:sOM8pTpwgflXRhz+oC8H2Dr+UcbMqkPPWNJo88Q7TH8= -google.golang.org/api v0.69.0/go.mod h1:boanBiw+h5c3s+tBPgEzLDRHfFLWV0qXxRHz3ws7C80= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -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/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-20200513103714-09dca8ec2884/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-20200831141814-d751682dd103/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-20200914193844-75d14daec038/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200921151605-7abf4a1a14d5/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-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210429181445-86c259c2b4ab/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210517163617-5e0236093d7a/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210921142501-181ce0d877f6/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211018162055-cf77aa76bad2/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211223182754-3ac035c7e7cb/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220111164026-67b88f271998/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220114231437-d2e6a121cae0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220201184016-50beb8ab5c44/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220204002441-d6cc3cc0770e/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220211171837-173942840c17/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220216160803-4663080d8bc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220401170504-314d38edb7de/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -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.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -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.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= -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.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -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-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= -gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= -gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q= -gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mNfM5bm88whjWx4= -gopkg.in/jcmturner/gokrb5.v7 v7.3.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= -gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8= -gopkg.in/linkedin/goavro.v1 v1.0.5 h1:BJa69CDh0awSsLUmZ9+BowBdokpduDZSM9Zk8oKHfN4= -gopkg.in/linkedin/goavro.v1 v1.0.5/go.mod h1:Aw5GdAbizjOEl0kAMHV9iHmA8reZzW/OKuJAl4Hb9F0= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/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/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= -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= -nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= -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/src/syncer-amplitude/lib/amplitude.go b/src/syncer-amplitude/lib/amplitude.go deleted file mode 100644 index 4406c4d..0000000 --- a/src/syncer-amplitude/lib/amplitude.go +++ /dev/null @@ -1,103 +0,0 @@ -package amplitude - -import ( - "archive/zip" - "bytes" - "compress/gzip" - "encoding/json" - "fmt" - "io" - "net/http" - "time" - - "github.com/BemiHQ/BemiDB/src/common" -) - -const ( - AMPLITUDE_API_URL = "https://amplitude.com/api/2/export" - AMPLITUDE_TIME_FORMAT = "20060102T15" -) - -type Amplitude struct { - Config *Config - HttpClient *http.Client -} - -func NewAmplitude(config *Config) *Amplitude { - return &Amplitude{ - Config: config, - HttpClient: &http.Client{Timeout: 5 * time.Minute}, - } -} - -func (amplitude *Amplitude) Export(jsonQueueWriter *common.JsonQueueWriter, startTime, endTime time.Time) error { - startString := startTime.UTC().Format(AMPLITUDE_TIME_FORMAT) - endString := endTime.UTC().Format(AMPLITUDE_TIME_FORMAT) - - req, err := http.NewRequest("GET", AMPLITUDE_API_URL, nil) - if err != nil { - return err - } - q := req.URL.Query() - q.Add("start", startString) - q.Add("end", endString) - req.URL.RawQuery = q.Encode() - req.SetBasicAuth(amplitude.Config.ApiKey, amplitude.Config.SecretKey) - - common.LogInfo(amplitude.Config.CommonConfig, "Fetching data from Amplitude from", startString, "to", endString) - resp, err := amplitude.HttpClient.Do(req) - if err != nil { - return err - } - defer resp.Body.Close() - - if resp.StatusCode != http.StatusOK { - body, _ := io.ReadAll(resp.Body) - return fmt.Errorf("amplitude API returned status %d: %s", resp.StatusCode, string(body)) - } - common.LogDebug(amplitude.Config.CommonConfig, "Received response from Amplitude:", resp.Status) - - body, err := io.ReadAll(resp.Body) - if err != nil { - return err - } - - zipReader, err := zip.NewReader(bytes.NewReader(body), int64(len(body))) - if err != nil { - return err - } - - for _, zipFile := range zipReader.File { - common.LogInfo(amplitude.Config.CommonConfig, "Processing file:", zipFile.Name) - unzippedFile, err := zipFile.Open() - if err != nil { - return err - } - defer unzippedFile.Close() - - gzipReader, err := gzip.NewReader(unzippedFile) - if err != nil { - return err - } - defer gzipReader.Close() - - decoder := json.NewDecoder(gzipReader) - for { - var event RecordEvent - err := decoder.Decode(&event) - if err != nil { - if err == io.EOF { - break // We're done - } - return err - } - - err = jsonQueueWriter.Write(event.ToMap()) - if err != nil { - return err - } - } - } - - return nil -} diff --git a/src/syncer-amplitude/lib/config.go b/src/syncer-amplitude/lib/config.go deleted file mode 100644 index d64b00e..0000000 --- a/src/syncer-amplitude/lib/config.go +++ /dev/null @@ -1,106 +0,0 @@ -package amplitude - -import ( - "flag" - "os" - "slices" - "strings" - "time" - - "github.com/BemiHQ/BemiDB/src/common" -) - -const ( - ENV_DESTINATION_SCHEMA_NAME = "DESTINATION_SCHEMA_NAME" - - ENV_API_KEY = "SOURCE_AMPLITUDE_API_KEY" - ENV_SECRET_KEY = "SOURCE_AMPLITUDE_SECRET_KEY" - ENV_START_DATE = "SOURCE_AMPLITUDE_START_DATE" - - DEFAULT_START_DATE = "2025-01-01" -) - -type Config struct { - CommonConfig *common.CommonConfig - DestinationSchemaName string - ApiKey string - SecretKey string - StartDate time.Time -} - -type configParseValues struct { - StartDate string -} - -var _config Config -var _configParseValues configParseValues - -func RegisterFlags() { - _config.CommonConfig = &common.CommonConfig{} - - flag.StringVar(&_config.CommonConfig.LogLevel, "log-level", os.Getenv(common.ENV_LOG_LEVEL), `Log level: "ERROR", "WARN", "INFO", "DEBUG", "TRACE". Default: "`+common.DEFAULT_LOG_LEVEL+`"`) - flag.StringVar(&_config.CommonConfig.CatalogDatabaseUrl, "catalog-database-url", os.Getenv(common.ENV_CATALOG_DATABASE_URL), "Catalog database URL") - flag.StringVar(&_config.CommonConfig.Aws.Region, "aws-region", os.Getenv(common.ENV_AWS_REGION), "AWS region") - flag.StringVar(&_config.CommonConfig.Aws.S3Endpoint, "aws-s3-endpoint", os.Getenv(common.ENV_AWS_S3_ENDPOINT), "AWS S3 endpoint. Default: \""+common.DEFAULT_AWS_S3_ENDPOINT+`"`) - flag.StringVar(&_config.CommonConfig.Aws.S3Bucket, "aws-s3-bucket", os.Getenv(common.ENV_AWS_S3_BUCKET), "AWS S3 bucket name") - flag.StringVar(&_config.CommonConfig.Aws.AccessKeyId, "aws-access-key-id", os.Getenv(common.ENV_AWS_ACCESS_KEY_ID), "AWS access key ID") - flag.StringVar(&_config.CommonConfig.Aws.SecretAccessKey, "aws-secret-access-key", os.Getenv(common.ENV_AWS_SECRET_ACCESS_KEY), "AWS secret access key") - flag.BoolVar(&_config.CommonConfig.DisableAnonymousAnalytics, "disable-anonymous-analytics", os.Getenv(common.ENV_DISABLE_ANONYMOUS_ANALYTICS) == "true", "Disable anonymous analytics collection") - - flag.StringVar(&_config.DestinationSchemaName, "destination-schema-name", os.Getenv(ENV_DESTINATION_SCHEMA_NAME), "Destination schema name to store the synced data") - flag.StringVar(&_config.ApiKey, "api-key", os.Getenv(ENV_API_KEY), "Amplitude API Key") - flag.StringVar(&_config.SecretKey, "secret-key", os.Getenv(ENV_SECRET_KEY), "Amplitude Secret Key") - flag.StringVar(&_configParseValues.StartDate, "start-date", os.Getenv(ENV_START_DATE), "Amplitude start date in YYYY-MM-DD format") -} - -func LoadConfig() *Config { - parseFlags() - return &_config -} - -func parseFlags() { - flag.Parse() - - if _config.CommonConfig.LogLevel == "" { - _config.CommonConfig.LogLevel = common.DEFAULT_LOG_LEVEL - } else if !slices.Contains(common.LOG_LEVELS, _config.CommonConfig.LogLevel) { - panic("Invalid log level " + _config.CommonConfig.LogLevel + ". Must be one of " + strings.Join(common.LOG_LEVELS, ", ")) - } - if _config.CommonConfig.CatalogDatabaseUrl == "" { - panic("Catalog database URL is required") - } - if _config.CommonConfig.Aws.Region == "" { - panic("AWS region is required") - } - if _config.CommonConfig.Aws.S3Endpoint == "" { - _config.CommonConfig.Aws.S3Endpoint = common.DEFAULT_AWS_S3_ENDPOINT - } - if _config.CommonConfig.Aws.S3Bucket == "" { - panic("AWS S3 bucket name is required") - } - if _config.CommonConfig.Aws.AccessKeyId != "" && _config.CommonConfig.Aws.SecretAccessKey == "" { - panic("AWS secret access key is required") - } - if _config.CommonConfig.Aws.AccessKeyId == "" && _config.CommonConfig.Aws.SecretAccessKey != "" { - panic("AWS access key ID is required") - } - - if _config.DestinationSchemaName == "" { - panic("Destination schema name is required") - } - if _config.ApiKey == "" { - panic("Amplitude API key is required") - } - if _config.SecretKey == "" { - panic("Amplitude Secret key is required") - } - - if _configParseValues.StartDate == "" { - _configParseValues.StartDate = DEFAULT_START_DATE - } - parsedStartDate, err := time.Parse("2006-01-02", _configParseValues.StartDate) - if err != nil { - panic("Invalid start date format. Expected YYYY-MM-DD, got: " + _configParseValues.StartDate) - } - _config.StartDate = parsedStartDate -} diff --git a/src/syncer-amplitude/lib/go.mod b/src/syncer-amplitude/lib/go.mod deleted file mode 100644 index 944a1c3..0000000 --- a/src/syncer-amplitude/lib/go.mod +++ /dev/null @@ -1,64 +0,0 @@ -module github.com/BemiHQ/BemiDB/src/syncer-amplitude/lib - -go 1.24.4 - -require github.com/BemiHQ/BemiDB/src/common v0.0.0-00010101000000-000000000000 - -replace github.com/BemiHQ/BemiDB/src/common => ../../common - -require ( - github.com/apache/arrow-go/v18 v18.4.0 // indirect - github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 // indirect - github.com/apache/thrift v0.22.0 // indirect - github.com/aws/aws-sdk-go-v2 v1.37.0 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 // indirect - github.com/aws/aws-sdk-go-v2/config v1.30.1 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.18.1 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0 // indirect - github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.26.0 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.35.0 // indirect - github.com/aws/smithy-go v1.22.5 // indirect - github.com/duckdb/duckdb-go-bindings v0.1.16 // indirect - github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11 // indirect - github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11 // indirect - github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11 // indirect - github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11 // indirect - github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11 // indirect - github.com/go-viper/mapstructure/v2 v2.3.0 // indirect - github.com/goccy/go-json v0.10.5 // indirect - github.com/golang/snappy v1.0.0 // indirect - github.com/google/flatbuffers v25.2.10+incompatible // indirect - github.com/google/uuid v1.6.0 // indirect - github.com/jackc/pgpassfile v1.0.0 // indirect - github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect - github.com/jackc/pgx/v5 v5.7.5 // indirect - github.com/klauspost/compress v1.18.0 // indirect - github.com/klauspost/cpuid/v2 v2.2.11 // indirect - github.com/linkedin/goavro v2.1.0+incompatible // indirect - github.com/marcboeker/go-duckdb/arrowmapping v0.0.9 // indirect - github.com/marcboeker/go-duckdb/mapping v0.0.10 // indirect - github.com/marcboeker/go-duckdb/v2 v2.3.2 // indirect - github.com/pierrec/lz4/v4 v4.1.22 // indirect - github.com/xitongsys/parquet-go v1.6.2 // indirect - github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b // indirect - github.com/zeebo/xxh3 v1.0.2 // indirect - golang.org/x/crypto v0.40.0 // indirect - golang.org/x/exp v0.0.0-20250718183923-645b1fa84792 // indirect - golang.org/x/mod v0.26.0 // indirect - golang.org/x/sync v0.16.0 // indirect - golang.org/x/sys v0.34.0 // indirect - golang.org/x/text v0.27.0 // indirect - golang.org/x/tools v0.35.0 // indirect - golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect -) diff --git a/src/syncer-amplitude/lib/go.sum b/src/syncer-amplitude/lib/go.sum deleted file mode 100644 index 79719d8..0000000 --- a/src/syncer-amplitude/lib/go.sum +++ /dev/null @@ -1,1160 +0,0 @@ -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.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.66.0/go.mod h1:dgqGAjKCDxyhGTtC9dAREQGUJpkceNm1yt590Qno0Ko= -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.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.82.0/go.mod h1:vlKccHJGuFBFufnAnuB08dfEH9Y3H7dzDzRECFdC2TA= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= -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 v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.2.0/go.mod h1:xlogom/6gr8RJGBe7nT2eGsQYAFUbbv8dbC29qE3Xmw= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -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/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= -cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= -cloud.google.com/go/iam v0.1.1/go.mod h1:CKqrcnI/suGpybEHxZ7BMehL0oA4LpdyJdUlTl9jVMw= -cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= -cloud.google.com/go/kms v1.1.0/go.mod h1:WdbppnCDMDpOvoYBMn1+gNmOeEoZYqAv+HeuKARGCXI= -cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= -cloud.google.com/go/monitoring v1.1.0/go.mod h1:L81pzz7HKn14QCMaCs6NTQkdBnE87TElyanS95vIcl4= -cloud.google.com/go/monitoring v1.4.0/go.mod h1:y6xnxfwI3hTFWOdkOaD7nfJVlwuC3/mS/5kvtT131p4= -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/pubsub v1.19.0/go.mod h1:/O9kmSe9bb9KRnIAWkzmqhPjHo6LtzGOBYd/kr06XSs= -cloud.google.com/go/secretmanager v1.3.0/go.mod h1:+oLTkouyiYiabAQNugCeTS3PAArGiMJuBqvJnJsyH+U= -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.12.0/go.mod h1:fFLk2dp2oAhDz8QFKwqrjdJvxSp/W2g7nillojlL5Ho= -cloud.google.com/go/storage v1.21.0/go.mod h1:XmRlxkgPjlBONznT2dDUU/5XlpU2OjMnKuqnZI01LAA= -cloud.google.com/go/trace v1.0.0/go.mod h1:4iErSByzxkyHWzzlAj63/Gmjz0NH1ASqhJguHpGcr6A= -cloud.google.com/go/trace v1.2.0/go.mod h1:Wc8y/uYyOhPy12KEnXG9XGrvfMz5F5SrYecQlbW1rwM= -contrib.go.opencensus.io/exporter/aws v0.0.0-20200617204711-c478e41e60e9/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= -contrib.go.opencensus.io/exporter/stackdriver v0.13.10/go.mod h1:I5htMbyta491eUxufwwZPQdcKvvgzMB4O9ni41YnIM8= -contrib.go.opencensus.io/integrations/ocsql v0.1.7/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/azure-amqp-common-go/v3 v3.2.1/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= -github.com/Azure/azure-amqp-common-go/v3 v3.2.2/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= -github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k= -github.com/Azure/azure-sdk-for-go v51.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v59.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.0.0/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.0.0/go.mod h1:+6sju8gk8FRmSajX3Oz4G5Gm7P+mbqE9FVaXXFYTkCM= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U= -github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.0.0/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.0.0/go.mod h1:ceIuwmxDWptoW3eCqSXlnPsZFKh4X+R38dWPv7GS9Vs= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.0.0/go.mod h1:s1tW/At+xHqjNFvWU4G0c0Qv33KOhvbGNj0RCTQDV8s= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.2.0/go.mod h1:c+Lifp3EDEamAkPVzMooRNOK6CZjNSdEnf1A7jsI9u4= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.1.0/go.mod h1:7QJP7dr2wznCMeqIrhMgWGf7XpAQnVrJqDm9nvV3Cu4= -github.com/Azure/azure-service-bus-go v0.11.5/go.mod h1:MI6ge2CuQWBVq+ly456MY7XqNLJip5LO1iSFodbNLbU= -github.com/Azure/azure-storage-blob-go v0.14.0/go.mod h1:SMqIBi+SuiQH32bvyjngEewEeXoPfKMgWlBDaYf6fck= -github.com/Azure/go-amqp v0.16.0/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= -github.com/Azure/go-amqp v0.16.4/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest v0.11.19/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest v0.11.22/go.mod h1:BAWYUWGPEtKPzjVkp0Q6an0MJcJDsoh5Z1BFAEFs4Xs= -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/adal v0.9.14/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/adal v0.9.17/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= -github.com/Azure/go-autorest/autorest/azure/auth v0.5.9/go.mod h1:hg3/1yw0Bq87O3KvvnJoAh34/0zbP7SFizX/qN5JvjU= -github.com/Azure/go-autorest/autorest/azure/cli v0.4.2/go.mod h1:7qkJkT+j6b+hIpzMOwPChJhTqS8VbsqqgULzMNRugoM= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= -github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/AzureAD/microsoft-authentication-library-for-go v0.4.0/go.mod h1:Vt9sXTKwMyGcOxSmLDMnGPgqsUg7m8pe215qMLrDXw4= -github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/GoogleCloudPlatform/cloudsql-proxy v1.29.0/go.mod h1:spvB9eLJH9dutlbPSRmHvSXXHOwGRyeXh1jVdquA2G8= -github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= -github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/apache/arrow-go/v18 v18.4.0 h1:/RvkGqH517iY8bZKc4FD5/kkdwXJGjxf28JIXbJ/oB0= -github.com/apache/arrow-go/v18 v18.4.0/go.mod h1:Aawvwhj8x2jURIzD9Moy72cF0FyJXOpkYpdmGRHcw14= -github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 h1:byKBBF2CKWBjjA4J1ZL2JXttJULvWSl50LegTyRZ728= -github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516/go.mod h1:QNYViu/X0HXDHw7m3KXzWSVXIbfUvJqBFe6Gj8/pYA0= -github.com/apache/thrift v0.0.0-20181112125854-24918abba929/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.14.2/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.22.0 h1:r7mTJdj51TMDe6RtcmNdQxgn9XcyfGDOzegMDRg47uc= -github.com/apache/thrift v0.22.0/go.mod h1:1e7J/O1Ae6ZQMTYdy9xa3w9k+XHWPfRvdPyJeynQ+/g= -github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= -github.com/aws/aws-sdk-go v1.30.19/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= -github.com/aws/aws-sdk-go v1.37.0/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go v1.43.31 h1:yJZIr8nMV1hXjAvvOLUFqZRJcHV7udPQBfhJqawDzI0= -github.com/aws/aws-sdk-go v1.43.31/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= -github.com/aws/aws-sdk-go-v2 v1.16.2/go.mod h1:ytwTPBG6fXTZLxxeeCCWj2/EMYp/xDUgX+OET6TLNNU= -github.com/aws/aws-sdk-go-v2 v1.23.0/go.mod h1:i1XDttT4rnf6vxc9AuskLc6s7XBee8rlLilKlc03uAA= -github.com/aws/aws-sdk-go-v2 v1.37.0 h1:YtCOESR/pN4j5oA7cVHSfOwIcuh/KwHC4DOSXFbv5F0= -github.com/aws/aws-sdk-go-v2 v1.37.0/go.mod h1:9Q0OoGQoboYIAJyslFyF1f5K1Ryddop8gqMhWx/n4Wg= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.1/go.mod h1:n8Bs1ElDD2wJ9kCRTczA83gYbBmjSwZp3umc6zF4EeM= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.1/go.mod h1:t8PYl/6LzdAqsU4/9tz28V/kU+asFePvpOMkdul0gEQ= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 h1:6GMWV6CNpA/6fbFHnoAjrv4+LGfyTqZz2LtCHnspgDg= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0/go.mod h1:/mXlTIVG9jbxkqDnr5UQNQxW1HRYxeGklkM9vAFeabg= -github.com/aws/aws-sdk-go-v2/config v1.15.3/go.mod h1:9YL3v07Xc/ohTsxFXzan9ZpFpdTOFl4X65BAKYaz8jg= -github.com/aws/aws-sdk-go-v2/config v1.25.3/go.mod h1:tAByZy03nH5jcq0vZmkcVoo6tRzRHEwSFx3QW4NmDw8= -github.com/aws/aws-sdk-go-v2/config v1.30.1 h1:sHL8g/+9tcZATeV2tEkEfxZeaNokDtKsSjGMGHD49qA= -github.com/aws/aws-sdk-go-v2/config v1.30.1/go.mod h1:wkibEyFfxXRyTSzRU4bbF5IUsSXyE4xQ4ZjkGmi5tFo= -github.com/aws/aws-sdk-go-v2/credentials v1.11.2/go.mod h1:j8YsY9TXTm31k4eFhspiQicfXPLZ0gYXA50i4gxPE8g= -github.com/aws/aws-sdk-go-v2/credentials v1.16.2/go.mod h1:sDdvGhXrSVT5yzBDR7qXz+rhbpiMpUYfF3vJ01QSdrc= -github.com/aws/aws-sdk-go-v2/credentials v1.18.1 h1:E55xvOqlX7CvB66Z7rSM9usCrFU1ryUIUHqiXsEzVoE= -github.com/aws/aws-sdk-go-v2/credentials v1.18.1/go.mod h1:iobSQfR5MkvILxssGOvi/P1jjOhrRzfTiCPCzku0vx4= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.3/go.mod h1:uk1vhHHERfSVCUnqSqz8O48LBYDSC+k6brng09jcMOk= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.4/go.mod h1:t4i+yGHMCcUNIX1x7YVYa6bH/Do7civ5I6cG/6PMfyA= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0 h1:9sBTeKQwAvmJUWKIACIoiFSnxxl+sS++YDfr17/ngq0= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0/go.mod h1:LW9/PxQD1SYFC7pnWcgqPhoyZprhjEdg5hBK6qYPLW8= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.3/go.mod h1:0dHuD2HZZSiwfJSy1FO5bX1hQ1TxVV1QXXjpn3XUE44= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.14.0/go.mod h1:UcgIwJ9KHquYxs6Q5skC9qXjhYMK+JASDYcXQ4X7JZE= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1 h1:aAjA/1JZ1xH/F9XvxJu9cXZyp7BqVXtHpztyZ6p799E= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1/go.mod h1:ia9HASsPba/7o84sp6iE4wZPdNTJ0oicBe5sWQQk+Ys= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.9/go.mod h1:AnVH5pvai0pAF4lXRq0bmhbes1u9R8wTE+g+183bZNM= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.3/go.mod h1:7sGSz1JCKHWWBHq98m6sMtWQikmYPpxjqOydDemiVoM= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0 h1:H2iZoqW/v2Jnrh1FnU725Bq6KJ0k2uP63yH+DcY+HUI= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0/go.mod h1:L0FqLbwMXHvNC/7crWV1iIxUlOKYZUE8KuTIA+TozAI= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.3/go.mod h1:ssOhaLpRlh88H3UmEcsBoVKq309quMvm3Ds8e9d4eJM= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.3/go.mod h1:ify42Rb7nKeDDPkFjKn7q1bPscVPu/+gmHH8d2c+anU= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0 h1:EDped/rNzAhFPhVY0sDGbtD16OKqksfA8OjF/kLEgw8= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0/go.mod h1:uUI335jvzpZRPpjYx6ODc/wg1qH+NnoSTK/FwVeK0C0= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.10/go.mod h1:8DcYQcz0+ZJaSxANlHIsbbi6S+zMwjwdDqwW3r9AzaE= -github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.3/go.mod h1:5yzAuE9i2RkVAttBl8yxZgQr5OCq4D5yDnG7j9x2L0U= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0 h1:iLvW/zOkHGU3BDU5thWnj+UZ9pjhuVhv1loLj7yVtBw= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0/go.mod h1:Fn3gvhdF1x5Rs9nUoCy/fJT1ms8f8dO7RqM9lJHuazQ= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.1/go.mod h1:GeUru+8VzrTXV/83XyMJ80KpH8xO89VPoUileyNQ+tc= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1/go.mod h1:l9ymW25HOqymeU2m1gbUQ3rUIsTwKs8gYHXkqDQUhiI= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 h1:6+lZi2JeGKtCraAj1rpoZfKqnQ9SptseRZioejfUOLM= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0/go.mod h1:eb3gfbVIxIoGgJsi9pGne19dhCBpK6opTYpQqAmdy44= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.3/go.mod h1:Seb8KNmD6kVTjwRjVEgOT5hPin6sq+v4C2ycJQDwuH8= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.3/go.mod h1:R+/S1O4TYpcktbVwddeOYg+uwUfLhADP2S/x4QwsCTM= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0 h1:qGyLBQPphYzUf+IIlb5tHnvg1U2Vc5hXPcP7oRSQfy0= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0/go.mod h1:g+dzKSLXiR/8ATkPXmLhPOI6rDdjLP3tngeo3FvDcIw= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.3/go.mod h1:wlY6SVjuwvh3TVRpTqdy4I1JpBFLX4UGeKZdWntaocw= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.3/go.mod h1:Owv1I59vaghv1Ax8zz8ELY8DN7/Y0rGS+WWAmjgi950= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0 h1:eRhU3Sh8dGbaniI6B+I48XJMrTPRkK4DKo+vqIxziOU= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0/go.mod h1:paNLV18DZ6FnWE/bd06RIKPDIFpjuvCkGKWTG/GDBeM= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.3/go.mod h1:Bm/v2IaN6rZ+Op7zX+bOUMdL4fsrYZiD0dsjLhNKwZc= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.3/go.mod h1:KZgs2ny8HsxRIRbDwgvJcHHBZPOzQr/+NtGwnP+w2ec= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0 h1:6jusT+XCcvnD+Elxvm7bUf5sCMTpZEp3AKjYQ4tWJSo= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0/go.mod h1:LimGpdIF/sTBdgqwOEkrArXLCoTamK/9L9x8IKBFTIc= -github.com/aws/aws-sdk-go-v2/service/kms v1.16.3/go.mod h1:QuiHPBqlOFCi4LqdSskYYAWpQlx3PKmohy+rE2F+o5g= -github.com/aws/aws-sdk-go-v2/service/s3 v1.26.3/go.mod h1:g1qvDuRsJY+XghsV6zg00Z4KJ7DtFFCx8fJD2a491Ak= -github.com/aws/aws-sdk-go-v2/service/s3 v1.43.0/go.mod h1:NXRKkiRF+erX2hnybnVU660cYT5/KChRD4iUgJ97cI8= -github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0 h1:gAV4NEp4A+JOrIdoXkAeyy6IOo7+X2s/jRuaHKYiMaU= -github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0/go.mod h1:JIQwK8sZ5MuKGm5rrFwp9MHUcyYEsQNpVixuPDlnwaU= -github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.15.4/go.mod h1:PJc8s+lxyU8rrre0/4a0pn2wgwiDvOEzoOjcJUBr67o= -github.com/aws/aws-sdk-go-v2/service/sns v1.17.4/go.mod h1:kElt+uCcXxcqFyc+bQqZPFD9DME/eC6oHBXvFzQ9Bcw= -github.com/aws/aws-sdk-go-v2/service/sqs v1.18.3/go.mod h1:skmQo0UPvsjsuYYSYMVmrPc1HWCbHUJyrCEp+ZaLzqM= -github.com/aws/aws-sdk-go-v2/service/ssm v1.24.1/go.mod h1:NR/xoKjdbRJ+qx0pMR4mI+N/H1I1ynHwXnO6FowXJc0= -github.com/aws/aws-sdk-go-v2/service/sso v1.11.3/go.mod h1:7UQ/e69kU7LDPtY40OyoHYgRmgfGM4mgsLYtcObdveU= -github.com/aws/aws-sdk-go-v2/service/sso v1.17.2/go.mod h1:/pE21vno3q1h4bbhUOEi+6Zu/aT26UK2WKkDXd+TssQ= -github.com/aws/aws-sdk-go-v2/service/sso v1.26.0 h1:cuFWHH87GP1NBGXXfMicUbE7Oty5KpPxN6w4JpmuxYc= -github.com/aws/aws-sdk-go-v2/service/sso v1.26.0/go.mod h1:aJBemdlbCKyOXEXdXBqS7E+8S9XTDcOTaoOjtng54hA= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.20.0/go.mod h1:dWqm5G767qwKPuayKfzm4rjzFmVjiBFbOJrpSPnAMDs= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0 h1:t2va+wewPOYIqC6XyJ4MGjiGKkczMAPsgq5W4FtL9ME= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0/go.mod h1:ExCTcqYqN0hYYRsDlBVU8+68grqlWdgX9/nZJwQW4aY= -github.com/aws/aws-sdk-go-v2/service/sts v1.16.3/go.mod h1:bfBj0iVmsUyUg4weDB4NxktD9rDGeKSVWnjTnwbx9b8= -github.com/aws/aws-sdk-go-v2/service/sts v1.25.3/go.mod h1:4EqRHDCKP78hq3zOnmFXu5k0j4bXbRFfCh/zQ6KnEfQ= -github.com/aws/aws-sdk-go-v2/service/sts v1.35.0 h1:FD9agdG4CeOGS3ORLByJk56YIXDS7mxFpmZyCtpqExc= -github.com/aws/aws-sdk-go-v2/service/sts v1.35.0/go.mod h1:NDzDPbBF1xtSTZUMuZx0w3hIfWzcL7X2AQ0Tr9becIQ= -github.com/aws/smithy-go v1.11.2/go.mod h1:3xHYmszWVx2c0kIwQeEVf9uSm4fYZt67FBJnwub1bgM= -github.com/aws/smithy-go v1.17.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= -github.com/aws/smithy-go v1.22.5 h1:P9ATCXPMb2mPjYBgueqJNCA5S9UfktsW0tTxi+a7eqw= -github.com/aws/smithy-go v1.22.5/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/bobg/gcsobj v0.1.2/go.mod h1:vS49EQ1A1Ib8FgrL58C8xXYZyOCR2TgzAdopy6/ipa8= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -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/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/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= -github.com/colinmarc/hdfs/v2 v2.1.1/go.mod h1:M3x+k8UKKmxtFu++uAZ0OtDU8jR3jnaZIAc6yK4Ue0c= -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/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU= -github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= -github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= -github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= -github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= -github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/duckdb/duckdb-go-bindings v0.1.16 h1:XPCk9hzP06PoWIxDPVU3gAy0m1XmLaZHTzLggNx/U9k= -github.com/duckdb/duckdb-go-bindings v0.1.16/go.mod h1:pBnfviMzANT/9hi4bg+zW4ykRZZPCXlVuvBWEcZofkc= -github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11 h1:GXQkG4HmEbwPtqCSabJTp9wZQQ7Gqr3KveLNesQWQOs= -github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11/go.mod h1:Ezo7IbAfB8NP7CqPIN8XEHKUg5xdRRQhcPPlCXImXYA= -github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11 h1:ATJMSBIDA/YAm/6CKeBDRtGK1OOwqfTZbWg9Y5fAc9E= -github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11/go.mod h1:eS7m/mLnPQgVF4za1+xTyorKRBuK0/BA44Oy6DgrGXI= -github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11 h1:AjvnGst1avyOECYiykthyHR4DTYTaqNDPr5W/0t5j0k= -github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11/go.mod h1:1GOuk1PixiESxLaCGFhag+oFi7aP+9W8byymRAvunBk= -github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11 h1:j3B1biawuhtxe2Chkiqcwf1Kxe8VJc8lLVmjBIcJrkI= -github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11/go.mod h1:o7crKMpT2eOIi5/FY6HPqaXcvieeLSqdXXaXbruGX7w= -github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11 h1:xR3vRE8y+48U6xDNkUlOfbl7/OTA7FVcDXJ+5vETuHU= -github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11/go.mod h1:IlOhJdVKUJCAPj3QsDszUo8DVdvp1nBFp4TUJVdw99s= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -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/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= -github.com/gin-gonic/gin v1.7.3/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= -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-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= -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-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= -github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-viper/mapstructure/v2 v2.3.0 h1:27XbWsHIqhbdR5TIC911OfYvgSaW93HM+dX7970Q7jk= -github.com/go-viper/mapstructure/v2 v2.3.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= -github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= -github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.4.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= -github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188/go.mod h1:vXjM/+wXQnTPR4KqTKDgJukSZ6amVRtWMPEjE6sQoK8= -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/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/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -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.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= -github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -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/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/flatbuffers v25.2.10+incompatible h1:F3vclr7C3HpB1k9mxCGRMXq6FdUalZ6H/pNX4FP1v0Q= -github.com/google/flatbuffers v25.2.10+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -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.6/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.8/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/go-replayers/grpcreplay v1.1.0/go.mod h1:qzAvJ8/wi57zq7gWqaE6AwLM6miiXUQwP1S+I9icmhk= -github.com/google/go-replayers/httpreplay v1.1.1/go.mod h1:gN9GeLIs7l6NUoVaSSnv2RiqK1NiwAmD0MrKeC9IIks= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+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/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -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-20200905233945-acf8798be1f7/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-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210506205249-923b5ab0fc1a/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.2.0/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.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= -github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/wire v0.5.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU= -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.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hanwen/go-fuse v1.0.0/go.mod h1:unqXarDXqzAk0rt98O2tVndEPIpUgLD9+rwFisZH3Ok= -github.com/hanwen/go-fuse/v2 v2.1.0/go.mod h1:oRyA5eK+pvJyv5otpO/DgccS8y/RvYMaO00GgRLGryc= -github.com/hashicorp/go-uuid v0.0.0-20180228145832-27454136f036/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -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/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/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.11.0/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= -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/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.2.0/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-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= -github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/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.10.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.15.0/go.mod h1:D/zyOyXiaM1TmVWnOM18p0xdDtdakRBa0RsVGI3U3bw= -github.com/jackc/pgx/v5 v5.7.5 h1:JHGfMnQY+IEtGM63d+NGMjoRpysB2JBwDr5fsngwmJs= -github.com/jackc/pgx/v5 v5.7.5/go.mod h1:aruU7o91Tc2q2cFp5h4uP3f6ztExVpyVv88Xl/8Vl8M= -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.2.1 h1:gI8os0wpRXFd4FiAY2dWiqRK037tjj3t7rKFeO4X5iw= -github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= -github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= -github.com/jcmturner/gofork v0.0.0-20180107083740-2aebee971930/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= -github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= -github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -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/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= -github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= -github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.13.1/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= -github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= -github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= -github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= -github.com/klauspost/cpuid/v2 v2.2.11 h1:0OwqZRYI2rFrjS4kvkDnqJkKHdHaRnCm68/DY4OxRzU= -github.com/klauspost/cpuid/v2 v2.2.11/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= -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/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -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/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -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.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/linkedin/goavro v2.1.0+incompatible h1:DV2aUlj2xZiuxQyvag8Dy7zjY69ENjS66bWkSfdpddY= -github.com/linkedin/goavro v2.1.0+incompatible/go.mod h1:bBCwI2eGYpUI/4820s67MElg9tdeLbINjLjiM2xZFYM= -github.com/marcboeker/go-duckdb/arrowmapping v0.0.9 h1:xj+kFOqR2gH3Mcxx9LmAVHebSnCiPm303N+uxfkWVmY= -github.com/marcboeker/go-duckdb/arrowmapping v0.0.9/go.mod h1:o56AqVS90v5bpxhPnOK9La7AfNTOrMORiqTQrlRbdPQ= -github.com/marcboeker/go-duckdb/mapping v0.0.10 h1:b/y2W8/hNlD0Dwjq0mCqIlLXpjQMnWy0WqDV9b9lHQQ= -github.com/marcboeker/go-duckdb/mapping v0.0.10/go.mod h1:Ro6Tw6sGG50O8S0daZsA8TrQJz/DvGrzGvMD7Jihirw= -github.com/marcboeker/go-duckdb/v2 v2.3.2 h1:96zG2JPyIhCFjHdBjjSpOdhzJzehoGTdl7LskkuMUTs= -github.com/marcboeker/go-duckdb/v2 v2.3.2/go.mod h1:VeXz9ZM6klNvICHrXEUzaHSgNqBeTdyMxr4CICw/UaY= -github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= -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.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs= -github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= -github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI= -github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= -github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= -github.com/minio/minio-go/v7 v7.0.34/go.mod h1:nCrRzjoSUQh8hgKKtu3Y708OLvRLtuASMg2/nvmbarw= -github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= -github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= -github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= -github.com/ncw/swift v1.0.52/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -github.com/pborman/getopt v0.0.0-20180729010549-6fdd0a2c7117/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= -github.com/pierrec/lz4/v4 v4.1.8/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= -github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= -github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= -github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= -github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -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/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -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/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.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -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/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -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.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -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.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/xitongsys/parquet-go v1.5.1/go.mod h1:xUxwM8ELydxh4edHGegYq1pA8NnMKDx0K/GyB0o2bww= -github.com/xitongsys/parquet-go v1.6.2 h1:MhCaXii4eqceKPu9BwrjLqyK10oX9WF+xGhwvwbw7xM= -github.com/xitongsys/parquet-go v1.6.2/go.mod h1:IulAQyalCm0rPiZVNnCgm/PCL64X2tdSVGMQ/UeKqWA= -github.com/xitongsys/parquet-go-source v0.0.0-20190524061010-2b72cbee77d5/go.mod h1:xxCx7Wpym/3QCo6JhujJX51dzSXrwmb0oH6FQb39SEA= -github.com/xitongsys/parquet-go-source v0.0.0-20200817004010-026bad9b25d0/go.mod h1:HYhIKsdns7xz80OgkbgJYrtQY7FjHWHKH6cvN7+czGE= -github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b h1:zbb5qM/t3N+O33Vp5sFyG6yIcWZV1q7rfEjJM8UsRBQ= -github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b/go.mod h1:2ActxmJ4q17Cdruar9nKEkzKSOL1Ol03737Bkz10rTY= -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.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= -github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= -github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= -github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= -github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= -go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0= -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.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -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/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -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.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= -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.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= -gocloud.dev v0.26.0/go.mod h1:mkUgejbnbLotorqDyvedJO20XcZNTynmSeVSQS9btVg= -golang.org/x/crypto v0.0.0-20180723164146-c126467f60eb/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -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-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/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-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-20211115234514-b4de73f9ece8/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220511200225-c6db032c6c88/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= -golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM= -golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY= -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-20250718183923-645b1fa84792 h1:R9PFI6EUdfVKgwKjZef7QIwGcBKu86OEFpJ9nUEP2l4= -golang.org/x/exp v0.0.0-20250718183923-645b1fa84792/go.mod h1:A+z0yzpGtvnG90cToK5n2tu8UJVP2XUATh+r+sfOOOc= -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/lint v0.0.0-20210508222113-6edffad5e616/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.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg= -golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ= -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-20191112182307-2180aed22343/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-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -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-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211020060615-d418f374d309/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220401154927-543a649e0bdd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -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.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -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.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -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-20210220032951-036812b2e83c/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.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= -golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= -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-20191112214154-59a1497f0cea/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-20200828194041-157a740278f4/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-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/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-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/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-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220204135822-1c1b9b1eba6a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220330033206-e17cdc41300f/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-20220704084225-05e143d24a9e/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.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA= -golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -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/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -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.5/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.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4= -golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU= -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/time v0.0.0-20211116232009-f0f3c7e86c11/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220224211638-0e9765cccd65/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-20190422233926-fe54fb35175b/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-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-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-20200828161849-5deb26317202/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20200915173823-2db8f0ff891c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20200918232735-d647fc253266/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -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.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0= -golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw= -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= -golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= -golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= -gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= -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.31.0/go.mod h1:CL+9IBCa2WWU6gRuBWaKqGWLFFwbEUXkfeMkHLQWYWo= -google.golang.org/api v0.32.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -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.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.46.0/go.mod h1:ceL4oozhkAiTID8XMmJBsIxID/9wMXJVVFXPg4ylg3I= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.58.0/go.mod h1:cAbP2FsxoGVNwtgNAmmn3y5G1TWAiVYRmg4yku3lv+E= -google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.64.0/go.mod h1:931CdxA8Rm4t6zqTFGSsgwbAEZ2+GMYurbndwSimebM= -google.golang.org/api v0.66.0/go.mod h1:I1dmXYpX7HGwz/ejRxwQp2qj5bFAz93HiCU1C1oYd9M= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.68.0/go.mod h1:sOM8pTpwgflXRhz+oC8H2Dr+UcbMqkPPWNJo88Q7TH8= -google.golang.org/api v0.69.0/go.mod h1:boanBiw+h5c3s+tBPgEzLDRHfFLWV0qXxRHz3ws7C80= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -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/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-20200513103714-09dca8ec2884/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-20200831141814-d751682dd103/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-20200914193844-75d14daec038/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200921151605-7abf4a1a14d5/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-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210429181445-86c259c2b4ab/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210517163617-5e0236093d7a/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210921142501-181ce0d877f6/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211018162055-cf77aa76bad2/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211223182754-3ac035c7e7cb/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220111164026-67b88f271998/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220114231437-d2e6a121cae0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220201184016-50beb8ab5c44/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220204002441-d6cc3cc0770e/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220211171837-173942840c17/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220216160803-4663080d8bc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220401170504-314d38edb7de/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -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.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -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.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= -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.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -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-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= -gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= -gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q= -gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mNfM5bm88whjWx4= -gopkg.in/jcmturner/gokrb5.v7 v7.3.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= -gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8= -gopkg.in/linkedin/goavro.v1 v1.0.5 h1:BJa69CDh0awSsLUmZ9+BowBdokpduDZSM9Zk8oKHfN4= -gopkg.in/linkedin/goavro.v1 v1.0.5/go.mod h1:Aw5GdAbizjOEl0kAMHV9iHmA8reZzW/OKuJAl4Hb9F0= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/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/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= -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= -nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= -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/src/syncer-amplitude/lib/record_event.go b/src/syncer-amplitude/lib/record_event.go deleted file mode 100644 index 6103788..0000000 --- a/src/syncer-amplitude/lib/record_event.go +++ /dev/null @@ -1,189 +0,0 @@ -package amplitude - -import ( - "github.com/BemiHQ/BemiDB/src/common" -) - -const ( - EVENTS_TABLE_NAME = "events" -) - -// https://amplitude.com/docs/apis/analytics/export -type RecordEvent struct { - Adid string `json:"adid"` - AmplitudeAttributionIDs string `json:"amplitude_attribution_ids"` - AmplitudeEventType string `json:"amplitude_event_type"` - AmplitudeID int64 `json:"amplitude_id"` - App int `json:"app"` - City string `json:"city"` - ClientEventTime string `json:"client_event_time"` - ClientUploadTime string `json:"client_upload_time"` - Country string `json:"country"` - Data map[string]interface{} `json:"data"` - DataType string `json:"data_type"` - DeviceBrand string `json:"device_brand"` - DeviceCarrier string `json:"device_carrier"` - DeviceFamily string `json:"device_family"` - DeviceID string `json:"device_id"` - DeviceManufacturer string `json:"device_manufacturer"` - DeviceModel string `json:"device_model"` - DeviceType string `json:"device_type"` - DMA string `json:"dma"` - EventID int `json:"event_id"` - EventProperties map[string]interface{} `json:"event_properties"` - EventTime string `json:"event_time"` - EventType string `json:"event_type"` - GlobalUserProperties map[string]interface{} `json:"global_user_properties"` - GroupProperties map[string]interface{} `json:"group_properties"` - Groups map[string]interface{} `json:"groups"` - IDFA string `json:"idfa"` - InsertID string `json:"$insert_id"` - InsertKey string `json:"$insert_key"` - IPAddress string `json:"ip_address"` - IsAttributionEvent bool `json:"is_attribution_event"` - Language string `json:"language"` - Library string `json:"library"` - LocationLat float64 `json:"location_lat"` - LocationLng float64 `json:"location_lng"` - OSName string `json:"os_name"` - OSVersion string `json:"os_version"` - PartnerID string `json:"partner_id"` - Paying string `json:"paying"` - Plan map[string]interface{} `json:"plan"` - Platform string `json:"platform"` - ProcessedTime string `json:"processed_time"` - Region string `json:"region"` - SampleRate float64 `json:"sample_rate"` - Schema string `json:"$schema"` - ServerReceivedTime string `json:"server_received_time"` - ServerUploadTime string `json:"server_upload_time"` - SessionID int64 `json:"session_id"` - SourceID string `json:"source_id"` - StartVersion string `json:"start_version"` - UserCreationTime string `json:"user_creation_time"` - UserID string `json:"user_id"` - UserProperties map[string]interface{} `json:"user_properties"` - UUID string `json:"uuid"` - VersionName string `json:"version_name"` -} - -// Normalize $insert_id -> insert_id, $insert_key -> insert_key, $schema -> schema -func (event *RecordEvent) ToMap() map[string]interface{} { - result := make(map[string]interface{}) - result["adid"] = event.Adid - result["amplitude_attribution_ids"] = event.AmplitudeAttributionIDs - result["amplitude_event_type"] = event.AmplitudeEventType - result["amplitude_id"] = event.AmplitudeID - result["app"] = event.App - result["city"] = event.City - result["client_event_time"] = event.ClientEventTime - result["client_upload_time"] = event.ClientUploadTime - result["country"] = event.Country - result["data"] = event.Data - result["data_type"] = event.DataType - result["device_brand"] = event.DeviceBrand - result["device_carrier"] = event.DeviceCarrier - result["device_family"] = event.DeviceFamily - result["device_id"] = event.DeviceID - result["device_manufacturer"] = event.DeviceManufacturer - result["device_model"] = event.DeviceModel - result["device_type"] = event.DeviceType - result["dma"] = event.DMA - result["event_id"] = event.EventID - result["event_properties"] = event.EventProperties - result["event_time"] = event.EventTime - result["event_type"] = event.EventType - result["global_user_properties"] = event.GlobalUserProperties - result["group_properties"] = event.GroupProperties - result["groups"] = event.Groups - result["idfa"] = event.IDFA - result["insert_id"] = event.InsertID - result["insert_key"] = event.InsertKey - result["ip_address"] = event.IPAddress - result["is_attribution_event"] = event.IsAttributionEvent - result["language"] = event.Language - result["library"] = event.Library - result["location_lat"] = event.LocationLat - result["location_lng"] = event.LocationLng - result["os_name"] = event.OSName - result["os_version"] = event.OSVersion - result["partner_id"] = event.PartnerID - result["paying"] = event.Paying - result["plan"] = event.Plan - result["platform"] = event.Platform - result["processed_time"] = event.ProcessedTime - result["region"] = event.Region - result["sample_rate"] = event.SampleRate - result["schema"] = event.Schema - result["server_received_time"] = event.ServerReceivedTime - result["server_upload_time"] = event.ServerUploadTime - result["session_id"] = event.SessionID - result["source_id"] = event.SourceID - result["start_version"] = event.StartVersion - result["user_creation_time"] = event.UserCreationTime - result["user_id"] = event.UserID - result["user_properties"] = event.UserProperties - result["uuid"] = event.UUID - result["version_name"] = event.VersionName - return result -} - -func EventsIcebergSchemaColumns(config *common.CommonConfig) []*common.IcebergSchemaColumn { - return []*common.IcebergSchemaColumn{ - {Config: config, ColumnName: "adid", ColumnType: common.IcebergColumnTypeString, Position: 1}, - {Config: config, ColumnName: "amplitude_attribution_ids", ColumnType: common.IcebergColumnTypeString, Position: 2}, - {Config: config, ColumnName: "amplitude_event_type", ColumnType: common.IcebergColumnTypeString, Position: 3}, - {Config: config, ColumnName: "amplitude_id", ColumnType: common.IcebergColumnTypeLong, Position: 4}, - {Config: config, ColumnName: "app", ColumnType: common.IcebergColumnTypeInteger, Position: 5}, - {Config: config, ColumnName: "city", ColumnType: common.IcebergColumnTypeString, Position: 6}, - {Config: config, ColumnName: "client_event_time", ColumnType: common.IcebergColumnTypeTimestamp, Position: 7}, - {Config: config, ColumnName: "client_upload_time", ColumnType: common.IcebergColumnTypeTimestamp, Position: 8}, - {Config: config, ColumnName: "country", ColumnType: common.IcebergColumnTypeString, Position: 9}, - {Config: config, ColumnName: "data", ColumnType: common.IcebergColumnTypeString, Position: 10, LogicalColumnType: common.IcebergLogicalColumnTypeJson}, - {Config: config, ColumnName: "data_type", ColumnType: common.IcebergColumnTypeString, Position: 11}, - {Config: config, ColumnName: "device_brand", ColumnType: common.IcebergColumnTypeString, Position: 12}, - {Config: config, ColumnName: "device_carrier", ColumnType: common.IcebergColumnTypeString, Position: 13}, - {Config: config, ColumnName: "device_family", ColumnType: common.IcebergColumnTypeString, Position: 14}, - {Config: config, ColumnName: "device_id", ColumnType: common.IcebergColumnTypeString, Position: 15}, - {Config: config, ColumnName: "device_manufacturer", ColumnType: common.IcebergColumnTypeString, Position: 16}, - {Config: config, ColumnName: "device_model", ColumnType: common.IcebergColumnTypeString, Position: 17}, - {Config: config, ColumnName: "device_type", ColumnType: common.IcebergColumnTypeString, Position: 18}, - {Config: config, ColumnName: "dma", ColumnType: common.IcebergColumnTypeString, Position: 19}, - {Config: config, ColumnName: "event_id", ColumnType: common.IcebergColumnTypeInteger, Position: 20}, - {Config: config, ColumnName: "event_properties", ColumnType: common.IcebergColumnTypeString, Position: 21, LogicalColumnType: common.IcebergLogicalColumnTypeJson}, - {Config: config, ColumnName: "event_time", ColumnType: common.IcebergColumnTypeTimestamp, Position: 22}, - {Config: config, ColumnName: "event_type", ColumnType: common.IcebergColumnTypeString, Position: 23}, - {Config: config, ColumnName: "global_user_properties", ColumnType: common.IcebergColumnTypeString, Position: 24, LogicalColumnType: common.IcebergLogicalColumnTypeJson}, - {Config: config, ColumnName: "group_properties", ColumnType: common.IcebergColumnTypeString, Position: 25, LogicalColumnType: common.IcebergLogicalColumnTypeJson}, - {Config: config, ColumnName: "groups", ColumnType: common.IcebergColumnTypeString, Position: 26, LogicalColumnType: common.IcebergLogicalColumnTypeJson}, - {Config: config, ColumnName: "idfa", ColumnType: common.IcebergColumnTypeString, Position: 27}, - {Config: config, ColumnName: "insert_id", ColumnType: common.IcebergColumnTypeString, Position: 28}, - {Config: config, ColumnName: "insert_key", ColumnType: common.IcebergColumnTypeString, Position: 29}, - {Config: config, ColumnName: "ip_address", ColumnType: common.IcebergColumnTypeString, Position: 30}, - {Config: config, ColumnName: "is_attribution_event", ColumnType: common.IcebergColumnTypeBoolean, Position: 31}, - {Config: config, ColumnName: "language", ColumnType: common.IcebergColumnTypeString, Position: 32}, - {Config: config, ColumnName: "library", ColumnType: common.IcebergColumnTypeString, Position: 33}, - {Config: config, ColumnName: "location_lat", ColumnType: common.IcebergColumnTypeFloat, Position: 34}, - {Config: config, ColumnName: "location_lng", ColumnType: common.IcebergColumnTypeFloat, Position: 35}, - {Config: config, ColumnName: "os_name", ColumnType: common.IcebergColumnTypeString, Position: 36}, - {Config: config, ColumnName: "os_version", ColumnType: common.IcebergColumnTypeString, Position: 37}, - {Config: config, ColumnName: "partner_id", ColumnType: common.IcebergColumnTypeString, Position: 38}, - {Config: config, ColumnName: "paying", ColumnType: common.IcebergColumnTypeBoolean, Position: 39}, - {Config: config, ColumnName: "plan", ColumnType: common.IcebergColumnTypeString, Position: 40, LogicalColumnType: common.IcebergLogicalColumnTypeJson}, - {Config: config, ColumnName: "platform", ColumnType: common.IcebergColumnTypeString, Position: 41}, - {Config: config, ColumnName: "processed_time", ColumnType: common.IcebergColumnTypeTimestamp, Position: 42}, - {Config: config, ColumnName: "region", ColumnType: common.IcebergColumnTypeString, Position: 43}, - {Config: config, ColumnName: "sample_rate", ColumnType: common.IcebergColumnTypeFloat, Position: 44}, - {Config: config, ColumnName: "schema", ColumnType: common.IcebergColumnTypeString, Position: 45}, - {Config: config, ColumnName: "server_received_time", ColumnType: common.IcebergColumnTypeTimestamp, Position: 46}, - {Config: config, ColumnName: "server_upload_time", ColumnType: common.IcebergColumnTypeTimestamp, Position: 47}, - {Config: config, ColumnName: "session_id", ColumnType: common.IcebergColumnTypeLong, Position: 48}, - {Config: config, ColumnName: "source_id", ColumnType: common.IcebergColumnTypeString, Position: 49}, - {Config: config, ColumnName: "start_version", ColumnType: common.IcebergColumnTypeString, Position: 50}, - {Config: config, ColumnName: "user_creation_time", ColumnType: common.IcebergColumnTypeTimestamp, Position: 51}, - {Config: config, ColumnName: "user_id", ColumnType: common.IcebergColumnTypeString, Position: 52}, - {Config: config, ColumnName: "user_properties", ColumnType: common.IcebergColumnTypeString, Position: 53, LogicalColumnType: common.IcebergLogicalColumnTypeJson}, - {Config: config, ColumnName: "uuid", ColumnType: common.IcebergColumnTypeString, Position: 54}, - {Config: config, ColumnName: "version_name", ColumnType: common.IcebergColumnTypeString, Position: 55}, - } -} diff --git a/src/syncer-amplitude/lib/syncer.go b/src/syncer-amplitude/lib/syncer.go deleted file mode 100644 index 936d19d..0000000 --- a/src/syncer-amplitude/lib/syncer.go +++ /dev/null @@ -1,85 +0,0 @@ -package amplitude - -import ( - "strings" - "time" - - "github.com/BemiHQ/BemiDB/src/common" -) - -const ( - PAGINATION_TIME_INTERVAL = time.Hour - AMPLITUDE_DATA_DELAY = time.Hour // Amplitude data is available for export after an up to 2-hour delay (1 full hour + truncated). https://amplitude.com/docs/apis/analytics/export - - CURSOR_COLUMN_NAME = "server_upload_time" - - COMPRESSION_FACTOR = 2 // 1 GB uncompressed data x 2 = ~90MB compressed data -) - -type Syncer struct { - Config *Config - Amplitude *Amplitude - StorageS3 *common.StorageS3 - DuckdbClient *common.DuckdbClient -} - -func NewSyncer(config *Config, storageS3 *common.StorageS3, duckdbClient *common.DuckdbClient) *Syncer { - return &Syncer{ - Config: config, - Amplitude: NewAmplitude(config), - StorageS3: storageS3, - DuckdbClient: duckdbClient, - } -} - -func (syncer *Syncer) Sync() { - common.SendAnonymousAnalytics(syncer.Config.CommonConfig, "syncer-amplitude-start", syncer.name()) - - cappedBuffer := common.NewCappedBuffer(syncer.Config.CommonConfig, common.DEFAULT_CAPPED_BUFFER_SIZE) - jsonQueueWriter := common.NewJsonQueueWriter(cappedBuffer) - - icebergSchemaTable := common.IcebergSchemaTable{Schema: syncer.Config.DestinationSchemaName, Table: EVENTS_TABLE_NAME} - icebergTable := common.NewIcebergTable(syncer.Config.CommonConfig, syncer.StorageS3, syncer.DuckdbClient, icebergSchemaTable) - cursorValue := icebergTable.LastCursorValue(CURSOR_COLUMN_NAME) - - lastSyncedTime := syncer.Config.StartDate - if cursorValue.StringValue != "" { - lastSyncedTime = common.StringMsToUtcTime(cursorValue.StringValue).Truncate(time.Hour).Add(time.Hour) // add 1 hour to ensure we don't overlap - } - now := time.Now().UTC() - endOfSyncWindow := now.Add(-AMPLITUDE_DATA_DELAY).Truncate(time.Hour) - common.LogInfo(syncer.Config.CommonConfig, "Starting incremental sync from", lastSyncedTime, "to", endOfSyncWindow) - - // Copy from Amplitude to cappedBuffer in a separate goroutine in parallel - go func() { - for t := lastSyncedTime; t.Before(endOfSyncWindow); t = t.Add(PAGINATION_TIME_INTERVAL) { - startTime := t - endTime := t.Add(PAGINATION_TIME_INTERVAL - time.Hour) // -1 hour to ensure we don't overlap (Amplitude uses an inclusive end time) - - err := syncer.Amplitude.Export(jsonQueueWriter, startTime, endTime) - if err != nil { - if strings.Contains(err.Error(), "Raw data files were not found.") || strings.Contains(err.Error(), "404: Not Found") { - common.LogInfo(syncer.Config.CommonConfig, "No data found for the time range", startTime, "to", endTime, "- will retry later.") - break - } - } - common.PanicIfError(syncer.Config.CommonConfig, err) - } - common.LogInfo(syncer.Config.CommonConfig, "Finished exporting data from Amplitude.") - jsonQueueWriter.Close() - }() - - syncer.WriteToIceberg(icebergTable, cursorValue, cappedBuffer) - - common.SendAnonymousAnalytics(syncer.Config.CommonConfig, "syncer-amplitude-finish", syncer.name()) -} - -func (syncer *Syncer) WriteToIceberg(icebergTable *common.IcebergTable, cursorValue common.CursorValue, cappedBuffer *common.CappedBuffer) { - icebergSchemaColumns := EventsIcebergSchemaColumns(syncer.Config.CommonConfig) - icebergTableWriter := common.NewIcebergTableWriter(syncer.Config.CommonConfig, syncer.StorageS3, syncer.DuckdbClient, icebergTable, icebergSchemaColumns, COMPRESSION_FACTOR) - icebergTableWriter.AppendFromJsonCappedBuffer(cursorValue, cappedBuffer) -} - -func (syncer *Syncer) name() string { - return syncer.Config.ApiKey[:5] + "..." -} diff --git a/src/syncer-amplitude/main.go b/src/syncer-amplitude/main.go deleted file mode 100644 index 9b54235..0000000 --- a/src/syncer-amplitude/main.go +++ /dev/null @@ -1,20 +0,0 @@ -package main - -import ( - "github.com/BemiHQ/BemiDB/src/common" - "github.com/BemiHQ/BemiDB/src/syncer-amplitude/lib" -) - -func init() { - amplitude.RegisterFlags() -} - -func main() { - config := amplitude.LoadConfig() - defer common.HandleUnexpectedPanic(config.CommonConfig) - - storageS3 := common.NewStorageS3(config.CommonConfig) - duckdbClient := common.NewDuckdbClient(config.CommonConfig, common.SYNCER_DUCKDB_BOOT_QUERIES) - syncer := amplitude.NewSyncer(config, storageS3, duckdbClient) - syncer.Sync() -} diff --git a/src/syncer-attio/go.mod b/src/syncer-attio/go.mod deleted file mode 100644 index fcd7ff5..0000000 --- a/src/syncer-attio/go.mod +++ /dev/null @@ -1,69 +0,0 @@ -module github.com/BemiHQ/BemiDB/src/syncer-attio - -go 1.24.4 - -require ( - github.com/BemiHQ/BemiDB/src/common v0.0.0-00010101000000-000000000000 - github.com/BemiHQ/BemiDB/src/syncer-attio/lib v0.0.0-00010101000000-000000000000 -) - -replace github.com/BemiHQ/BemiDB/src/common => ../common - -replace github.com/BemiHQ/BemiDB/src/syncer-attio/lib => ./lib - -require ( - github.com/apache/arrow-go/v18 v18.4.0 // indirect - github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 // indirect - github.com/apache/thrift v0.22.0 // indirect - github.com/aws/aws-sdk-go-v2 v1.37.0 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 // indirect - github.com/aws/aws-sdk-go-v2/config v1.30.1 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.18.1 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0 // indirect - github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.26.0 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.35.0 // indirect - github.com/aws/smithy-go v1.22.5 // indirect - github.com/duckdb/duckdb-go-bindings v0.1.16 // indirect - github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11 // indirect - github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11 // indirect - github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11 // indirect - github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11 // indirect - github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11 // indirect - github.com/go-viper/mapstructure/v2 v2.3.0 // indirect - github.com/goccy/go-json v0.10.5 // indirect - github.com/golang/snappy v1.0.0 // indirect - github.com/google/flatbuffers v25.2.10+incompatible // indirect - github.com/google/uuid v1.6.0 // indirect - github.com/jackc/pgpassfile v1.0.0 // indirect - github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect - github.com/jackc/pgx/v5 v5.7.5 // indirect - github.com/klauspost/compress v1.18.0 // indirect - github.com/klauspost/cpuid/v2 v2.2.11 // indirect - github.com/linkedin/goavro v2.1.0+incompatible // indirect - github.com/marcboeker/go-duckdb/arrowmapping v0.0.9 // indirect - github.com/marcboeker/go-duckdb/mapping v0.0.10 // indirect - github.com/marcboeker/go-duckdb/v2 v2.3.2 // indirect - github.com/pierrec/lz4/v4 v4.1.22 // indirect - github.com/xitongsys/parquet-go v1.6.2 // indirect - github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b // indirect - github.com/zeebo/xxh3 v1.0.2 // indirect - golang.org/x/crypto v0.37.0 // indirect - golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect - golang.org/x/mod v0.25.0 // indirect - golang.org/x/sync v0.15.0 // indirect - golang.org/x/sys v0.33.0 // indirect - golang.org/x/text v0.26.0 // indirect - golang.org/x/tools v0.34.0 // indirect - golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect -) diff --git a/src/syncer-attio/go.sum b/src/syncer-attio/go.sum deleted file mode 100644 index 74c3ead..0000000 --- a/src/syncer-attio/go.sum +++ /dev/null @@ -1,1160 +0,0 @@ -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.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.66.0/go.mod h1:dgqGAjKCDxyhGTtC9dAREQGUJpkceNm1yt590Qno0Ko= -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.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.82.0/go.mod h1:vlKccHJGuFBFufnAnuB08dfEH9Y3H7dzDzRECFdC2TA= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= -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 v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.2.0/go.mod h1:xlogom/6gr8RJGBe7nT2eGsQYAFUbbv8dbC29qE3Xmw= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -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/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= -cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= -cloud.google.com/go/iam v0.1.1/go.mod h1:CKqrcnI/suGpybEHxZ7BMehL0oA4LpdyJdUlTl9jVMw= -cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= -cloud.google.com/go/kms v1.1.0/go.mod h1:WdbppnCDMDpOvoYBMn1+gNmOeEoZYqAv+HeuKARGCXI= -cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= -cloud.google.com/go/monitoring v1.1.0/go.mod h1:L81pzz7HKn14QCMaCs6NTQkdBnE87TElyanS95vIcl4= -cloud.google.com/go/monitoring v1.4.0/go.mod h1:y6xnxfwI3hTFWOdkOaD7nfJVlwuC3/mS/5kvtT131p4= -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/pubsub v1.19.0/go.mod h1:/O9kmSe9bb9KRnIAWkzmqhPjHo6LtzGOBYd/kr06XSs= -cloud.google.com/go/secretmanager v1.3.0/go.mod h1:+oLTkouyiYiabAQNugCeTS3PAArGiMJuBqvJnJsyH+U= -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.12.0/go.mod h1:fFLk2dp2oAhDz8QFKwqrjdJvxSp/W2g7nillojlL5Ho= -cloud.google.com/go/storage v1.21.0/go.mod h1:XmRlxkgPjlBONznT2dDUU/5XlpU2OjMnKuqnZI01LAA= -cloud.google.com/go/trace v1.0.0/go.mod h1:4iErSByzxkyHWzzlAj63/Gmjz0NH1ASqhJguHpGcr6A= -cloud.google.com/go/trace v1.2.0/go.mod h1:Wc8y/uYyOhPy12KEnXG9XGrvfMz5F5SrYecQlbW1rwM= -contrib.go.opencensus.io/exporter/aws v0.0.0-20200617204711-c478e41e60e9/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= -contrib.go.opencensus.io/exporter/stackdriver v0.13.10/go.mod h1:I5htMbyta491eUxufwwZPQdcKvvgzMB4O9ni41YnIM8= -contrib.go.opencensus.io/integrations/ocsql v0.1.7/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/azure-amqp-common-go/v3 v3.2.1/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= -github.com/Azure/azure-amqp-common-go/v3 v3.2.2/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= -github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k= -github.com/Azure/azure-sdk-for-go v51.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v59.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.0.0/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.0.0/go.mod h1:+6sju8gk8FRmSajX3Oz4G5Gm7P+mbqE9FVaXXFYTkCM= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U= -github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.0.0/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.0.0/go.mod h1:ceIuwmxDWptoW3eCqSXlnPsZFKh4X+R38dWPv7GS9Vs= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.0.0/go.mod h1:s1tW/At+xHqjNFvWU4G0c0Qv33KOhvbGNj0RCTQDV8s= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.2.0/go.mod h1:c+Lifp3EDEamAkPVzMooRNOK6CZjNSdEnf1A7jsI9u4= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.1.0/go.mod h1:7QJP7dr2wznCMeqIrhMgWGf7XpAQnVrJqDm9nvV3Cu4= -github.com/Azure/azure-service-bus-go v0.11.5/go.mod h1:MI6ge2CuQWBVq+ly456MY7XqNLJip5LO1iSFodbNLbU= -github.com/Azure/azure-storage-blob-go v0.14.0/go.mod h1:SMqIBi+SuiQH32bvyjngEewEeXoPfKMgWlBDaYf6fck= -github.com/Azure/go-amqp v0.16.0/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= -github.com/Azure/go-amqp v0.16.4/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest v0.11.19/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest v0.11.22/go.mod h1:BAWYUWGPEtKPzjVkp0Q6an0MJcJDsoh5Z1BFAEFs4Xs= -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/adal v0.9.14/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/adal v0.9.17/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= -github.com/Azure/go-autorest/autorest/azure/auth v0.5.9/go.mod h1:hg3/1yw0Bq87O3KvvnJoAh34/0zbP7SFizX/qN5JvjU= -github.com/Azure/go-autorest/autorest/azure/cli v0.4.2/go.mod h1:7qkJkT+j6b+hIpzMOwPChJhTqS8VbsqqgULzMNRugoM= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= -github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/AzureAD/microsoft-authentication-library-for-go v0.4.0/go.mod h1:Vt9sXTKwMyGcOxSmLDMnGPgqsUg7m8pe215qMLrDXw4= -github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/GoogleCloudPlatform/cloudsql-proxy v1.29.0/go.mod h1:spvB9eLJH9dutlbPSRmHvSXXHOwGRyeXh1jVdquA2G8= -github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= -github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/apache/arrow-go/v18 v18.4.0 h1:/RvkGqH517iY8bZKc4FD5/kkdwXJGjxf28JIXbJ/oB0= -github.com/apache/arrow-go/v18 v18.4.0/go.mod h1:Aawvwhj8x2jURIzD9Moy72cF0FyJXOpkYpdmGRHcw14= -github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 h1:byKBBF2CKWBjjA4J1ZL2JXttJULvWSl50LegTyRZ728= -github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516/go.mod h1:QNYViu/X0HXDHw7m3KXzWSVXIbfUvJqBFe6Gj8/pYA0= -github.com/apache/thrift v0.0.0-20181112125854-24918abba929/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.14.2/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.22.0 h1:r7mTJdj51TMDe6RtcmNdQxgn9XcyfGDOzegMDRg47uc= -github.com/apache/thrift v0.22.0/go.mod h1:1e7J/O1Ae6ZQMTYdy9xa3w9k+XHWPfRvdPyJeynQ+/g= -github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= -github.com/aws/aws-sdk-go v1.30.19/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= -github.com/aws/aws-sdk-go v1.37.0/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go v1.43.31 h1:yJZIr8nMV1hXjAvvOLUFqZRJcHV7udPQBfhJqawDzI0= -github.com/aws/aws-sdk-go v1.43.31/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= -github.com/aws/aws-sdk-go-v2 v1.16.2/go.mod h1:ytwTPBG6fXTZLxxeeCCWj2/EMYp/xDUgX+OET6TLNNU= -github.com/aws/aws-sdk-go-v2 v1.23.0/go.mod h1:i1XDttT4rnf6vxc9AuskLc6s7XBee8rlLilKlc03uAA= -github.com/aws/aws-sdk-go-v2 v1.37.0 h1:YtCOESR/pN4j5oA7cVHSfOwIcuh/KwHC4DOSXFbv5F0= -github.com/aws/aws-sdk-go-v2 v1.37.0/go.mod h1:9Q0OoGQoboYIAJyslFyF1f5K1Ryddop8gqMhWx/n4Wg= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.1/go.mod h1:n8Bs1ElDD2wJ9kCRTczA83gYbBmjSwZp3umc6zF4EeM= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.1/go.mod h1:t8PYl/6LzdAqsU4/9tz28V/kU+asFePvpOMkdul0gEQ= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 h1:6GMWV6CNpA/6fbFHnoAjrv4+LGfyTqZz2LtCHnspgDg= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0/go.mod h1:/mXlTIVG9jbxkqDnr5UQNQxW1HRYxeGklkM9vAFeabg= -github.com/aws/aws-sdk-go-v2/config v1.15.3/go.mod h1:9YL3v07Xc/ohTsxFXzan9ZpFpdTOFl4X65BAKYaz8jg= -github.com/aws/aws-sdk-go-v2/config v1.25.3/go.mod h1:tAByZy03nH5jcq0vZmkcVoo6tRzRHEwSFx3QW4NmDw8= -github.com/aws/aws-sdk-go-v2/config v1.30.1 h1:sHL8g/+9tcZATeV2tEkEfxZeaNokDtKsSjGMGHD49qA= -github.com/aws/aws-sdk-go-v2/config v1.30.1/go.mod h1:wkibEyFfxXRyTSzRU4bbF5IUsSXyE4xQ4ZjkGmi5tFo= -github.com/aws/aws-sdk-go-v2/credentials v1.11.2/go.mod h1:j8YsY9TXTm31k4eFhspiQicfXPLZ0gYXA50i4gxPE8g= -github.com/aws/aws-sdk-go-v2/credentials v1.16.2/go.mod h1:sDdvGhXrSVT5yzBDR7qXz+rhbpiMpUYfF3vJ01QSdrc= -github.com/aws/aws-sdk-go-v2/credentials v1.18.1 h1:E55xvOqlX7CvB66Z7rSM9usCrFU1ryUIUHqiXsEzVoE= -github.com/aws/aws-sdk-go-v2/credentials v1.18.1/go.mod h1:iobSQfR5MkvILxssGOvi/P1jjOhrRzfTiCPCzku0vx4= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.3/go.mod h1:uk1vhHHERfSVCUnqSqz8O48LBYDSC+k6brng09jcMOk= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.4/go.mod h1:t4i+yGHMCcUNIX1x7YVYa6bH/Do7civ5I6cG/6PMfyA= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0 h1:9sBTeKQwAvmJUWKIACIoiFSnxxl+sS++YDfr17/ngq0= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0/go.mod h1:LW9/PxQD1SYFC7pnWcgqPhoyZprhjEdg5hBK6qYPLW8= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.3/go.mod h1:0dHuD2HZZSiwfJSy1FO5bX1hQ1TxVV1QXXjpn3XUE44= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.14.0/go.mod h1:UcgIwJ9KHquYxs6Q5skC9qXjhYMK+JASDYcXQ4X7JZE= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1 h1:aAjA/1JZ1xH/F9XvxJu9cXZyp7BqVXtHpztyZ6p799E= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1/go.mod h1:ia9HASsPba/7o84sp6iE4wZPdNTJ0oicBe5sWQQk+Ys= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.9/go.mod h1:AnVH5pvai0pAF4lXRq0bmhbes1u9R8wTE+g+183bZNM= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.3/go.mod h1:7sGSz1JCKHWWBHq98m6sMtWQikmYPpxjqOydDemiVoM= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0 h1:H2iZoqW/v2Jnrh1FnU725Bq6KJ0k2uP63yH+DcY+HUI= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0/go.mod h1:L0FqLbwMXHvNC/7crWV1iIxUlOKYZUE8KuTIA+TozAI= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.3/go.mod h1:ssOhaLpRlh88H3UmEcsBoVKq309quMvm3Ds8e9d4eJM= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.3/go.mod h1:ify42Rb7nKeDDPkFjKn7q1bPscVPu/+gmHH8d2c+anU= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0 h1:EDped/rNzAhFPhVY0sDGbtD16OKqksfA8OjF/kLEgw8= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0/go.mod h1:uUI335jvzpZRPpjYx6ODc/wg1qH+NnoSTK/FwVeK0C0= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.10/go.mod h1:8DcYQcz0+ZJaSxANlHIsbbi6S+zMwjwdDqwW3r9AzaE= -github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.3/go.mod h1:5yzAuE9i2RkVAttBl8yxZgQr5OCq4D5yDnG7j9x2L0U= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0 h1:iLvW/zOkHGU3BDU5thWnj+UZ9pjhuVhv1loLj7yVtBw= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0/go.mod h1:Fn3gvhdF1x5Rs9nUoCy/fJT1ms8f8dO7RqM9lJHuazQ= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.1/go.mod h1:GeUru+8VzrTXV/83XyMJ80KpH8xO89VPoUileyNQ+tc= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1/go.mod h1:l9ymW25HOqymeU2m1gbUQ3rUIsTwKs8gYHXkqDQUhiI= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 h1:6+lZi2JeGKtCraAj1rpoZfKqnQ9SptseRZioejfUOLM= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0/go.mod h1:eb3gfbVIxIoGgJsi9pGne19dhCBpK6opTYpQqAmdy44= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.3/go.mod h1:Seb8KNmD6kVTjwRjVEgOT5hPin6sq+v4C2ycJQDwuH8= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.3/go.mod h1:R+/S1O4TYpcktbVwddeOYg+uwUfLhADP2S/x4QwsCTM= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0 h1:qGyLBQPphYzUf+IIlb5tHnvg1U2Vc5hXPcP7oRSQfy0= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0/go.mod h1:g+dzKSLXiR/8ATkPXmLhPOI6rDdjLP3tngeo3FvDcIw= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.3/go.mod h1:wlY6SVjuwvh3TVRpTqdy4I1JpBFLX4UGeKZdWntaocw= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.3/go.mod h1:Owv1I59vaghv1Ax8zz8ELY8DN7/Y0rGS+WWAmjgi950= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0 h1:eRhU3Sh8dGbaniI6B+I48XJMrTPRkK4DKo+vqIxziOU= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0/go.mod h1:paNLV18DZ6FnWE/bd06RIKPDIFpjuvCkGKWTG/GDBeM= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.3/go.mod h1:Bm/v2IaN6rZ+Op7zX+bOUMdL4fsrYZiD0dsjLhNKwZc= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.3/go.mod h1:KZgs2ny8HsxRIRbDwgvJcHHBZPOzQr/+NtGwnP+w2ec= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0 h1:6jusT+XCcvnD+Elxvm7bUf5sCMTpZEp3AKjYQ4tWJSo= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0/go.mod h1:LimGpdIF/sTBdgqwOEkrArXLCoTamK/9L9x8IKBFTIc= -github.com/aws/aws-sdk-go-v2/service/kms v1.16.3/go.mod h1:QuiHPBqlOFCi4LqdSskYYAWpQlx3PKmohy+rE2F+o5g= -github.com/aws/aws-sdk-go-v2/service/s3 v1.26.3/go.mod h1:g1qvDuRsJY+XghsV6zg00Z4KJ7DtFFCx8fJD2a491Ak= -github.com/aws/aws-sdk-go-v2/service/s3 v1.43.0/go.mod h1:NXRKkiRF+erX2hnybnVU660cYT5/KChRD4iUgJ97cI8= -github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0 h1:gAV4NEp4A+JOrIdoXkAeyy6IOo7+X2s/jRuaHKYiMaU= -github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0/go.mod h1:JIQwK8sZ5MuKGm5rrFwp9MHUcyYEsQNpVixuPDlnwaU= -github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.15.4/go.mod h1:PJc8s+lxyU8rrre0/4a0pn2wgwiDvOEzoOjcJUBr67o= -github.com/aws/aws-sdk-go-v2/service/sns v1.17.4/go.mod h1:kElt+uCcXxcqFyc+bQqZPFD9DME/eC6oHBXvFzQ9Bcw= -github.com/aws/aws-sdk-go-v2/service/sqs v1.18.3/go.mod h1:skmQo0UPvsjsuYYSYMVmrPc1HWCbHUJyrCEp+ZaLzqM= -github.com/aws/aws-sdk-go-v2/service/ssm v1.24.1/go.mod h1:NR/xoKjdbRJ+qx0pMR4mI+N/H1I1ynHwXnO6FowXJc0= -github.com/aws/aws-sdk-go-v2/service/sso v1.11.3/go.mod h1:7UQ/e69kU7LDPtY40OyoHYgRmgfGM4mgsLYtcObdveU= -github.com/aws/aws-sdk-go-v2/service/sso v1.17.2/go.mod h1:/pE21vno3q1h4bbhUOEi+6Zu/aT26UK2WKkDXd+TssQ= -github.com/aws/aws-sdk-go-v2/service/sso v1.26.0 h1:cuFWHH87GP1NBGXXfMicUbE7Oty5KpPxN6w4JpmuxYc= -github.com/aws/aws-sdk-go-v2/service/sso v1.26.0/go.mod h1:aJBemdlbCKyOXEXdXBqS7E+8S9XTDcOTaoOjtng54hA= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.20.0/go.mod h1:dWqm5G767qwKPuayKfzm4rjzFmVjiBFbOJrpSPnAMDs= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0 h1:t2va+wewPOYIqC6XyJ4MGjiGKkczMAPsgq5W4FtL9ME= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0/go.mod h1:ExCTcqYqN0hYYRsDlBVU8+68grqlWdgX9/nZJwQW4aY= -github.com/aws/aws-sdk-go-v2/service/sts v1.16.3/go.mod h1:bfBj0iVmsUyUg4weDB4NxktD9rDGeKSVWnjTnwbx9b8= -github.com/aws/aws-sdk-go-v2/service/sts v1.25.3/go.mod h1:4EqRHDCKP78hq3zOnmFXu5k0j4bXbRFfCh/zQ6KnEfQ= -github.com/aws/aws-sdk-go-v2/service/sts v1.35.0 h1:FD9agdG4CeOGS3ORLByJk56YIXDS7mxFpmZyCtpqExc= -github.com/aws/aws-sdk-go-v2/service/sts v1.35.0/go.mod h1:NDzDPbBF1xtSTZUMuZx0w3hIfWzcL7X2AQ0Tr9becIQ= -github.com/aws/smithy-go v1.11.2/go.mod h1:3xHYmszWVx2c0kIwQeEVf9uSm4fYZt67FBJnwub1bgM= -github.com/aws/smithy-go v1.17.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= -github.com/aws/smithy-go v1.22.5 h1:P9ATCXPMb2mPjYBgueqJNCA5S9UfktsW0tTxi+a7eqw= -github.com/aws/smithy-go v1.22.5/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/bobg/gcsobj v0.1.2/go.mod h1:vS49EQ1A1Ib8FgrL58C8xXYZyOCR2TgzAdopy6/ipa8= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -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/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/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= -github.com/colinmarc/hdfs/v2 v2.1.1/go.mod h1:M3x+k8UKKmxtFu++uAZ0OtDU8jR3jnaZIAc6yK4Ue0c= -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/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU= -github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= -github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= -github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= -github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= -github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/duckdb/duckdb-go-bindings v0.1.16 h1:XPCk9hzP06PoWIxDPVU3gAy0m1XmLaZHTzLggNx/U9k= -github.com/duckdb/duckdb-go-bindings v0.1.16/go.mod h1:pBnfviMzANT/9hi4bg+zW4ykRZZPCXlVuvBWEcZofkc= -github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11 h1:GXQkG4HmEbwPtqCSabJTp9wZQQ7Gqr3KveLNesQWQOs= -github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11/go.mod h1:Ezo7IbAfB8NP7CqPIN8XEHKUg5xdRRQhcPPlCXImXYA= -github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11 h1:ATJMSBIDA/YAm/6CKeBDRtGK1OOwqfTZbWg9Y5fAc9E= -github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11/go.mod h1:eS7m/mLnPQgVF4za1+xTyorKRBuK0/BA44Oy6DgrGXI= -github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11 h1:AjvnGst1avyOECYiykthyHR4DTYTaqNDPr5W/0t5j0k= -github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11/go.mod h1:1GOuk1PixiESxLaCGFhag+oFi7aP+9W8byymRAvunBk= -github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11 h1:j3B1biawuhtxe2Chkiqcwf1Kxe8VJc8lLVmjBIcJrkI= -github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11/go.mod h1:o7crKMpT2eOIi5/FY6HPqaXcvieeLSqdXXaXbruGX7w= -github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11 h1:xR3vRE8y+48U6xDNkUlOfbl7/OTA7FVcDXJ+5vETuHU= -github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11/go.mod h1:IlOhJdVKUJCAPj3QsDszUo8DVdvp1nBFp4TUJVdw99s= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -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/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= -github.com/gin-gonic/gin v1.7.3/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= -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-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= -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-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= -github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-viper/mapstructure/v2 v2.3.0 h1:27XbWsHIqhbdR5TIC911OfYvgSaW93HM+dX7970Q7jk= -github.com/go-viper/mapstructure/v2 v2.3.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= -github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= -github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.4.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= -github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188/go.mod h1:vXjM/+wXQnTPR4KqTKDgJukSZ6amVRtWMPEjE6sQoK8= -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/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/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -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.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= -github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -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/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/flatbuffers v25.2.10+incompatible h1:F3vclr7C3HpB1k9mxCGRMXq6FdUalZ6H/pNX4FP1v0Q= -github.com/google/flatbuffers v25.2.10+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -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.6/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.8/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/go-replayers/grpcreplay v1.1.0/go.mod h1:qzAvJ8/wi57zq7gWqaE6AwLM6miiXUQwP1S+I9icmhk= -github.com/google/go-replayers/httpreplay v1.1.1/go.mod h1:gN9GeLIs7l6NUoVaSSnv2RiqK1NiwAmD0MrKeC9IIks= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+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/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -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-20200905233945-acf8798be1f7/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-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210506205249-923b5ab0fc1a/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.2.0/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.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= -github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/wire v0.5.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU= -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.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hanwen/go-fuse v1.0.0/go.mod h1:unqXarDXqzAk0rt98O2tVndEPIpUgLD9+rwFisZH3Ok= -github.com/hanwen/go-fuse/v2 v2.1.0/go.mod h1:oRyA5eK+pvJyv5otpO/DgccS8y/RvYMaO00GgRLGryc= -github.com/hashicorp/go-uuid v0.0.0-20180228145832-27454136f036/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -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/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/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.11.0/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= -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/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.2.0/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-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= -github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/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.10.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.15.0/go.mod h1:D/zyOyXiaM1TmVWnOM18p0xdDtdakRBa0RsVGI3U3bw= -github.com/jackc/pgx/v5 v5.7.5 h1:JHGfMnQY+IEtGM63d+NGMjoRpysB2JBwDr5fsngwmJs= -github.com/jackc/pgx/v5 v5.7.5/go.mod h1:aruU7o91Tc2q2cFp5h4uP3f6ztExVpyVv88Xl/8Vl8M= -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.2.1 h1:gI8os0wpRXFd4FiAY2dWiqRK037tjj3t7rKFeO4X5iw= -github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= -github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= -github.com/jcmturner/gofork v0.0.0-20180107083740-2aebee971930/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= -github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= -github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -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/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= -github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= -github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.13.1/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= -github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= -github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= -github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= -github.com/klauspost/cpuid/v2 v2.2.11 h1:0OwqZRYI2rFrjS4kvkDnqJkKHdHaRnCm68/DY4OxRzU= -github.com/klauspost/cpuid/v2 v2.2.11/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= -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/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -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/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -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.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/linkedin/goavro v2.1.0+incompatible h1:DV2aUlj2xZiuxQyvag8Dy7zjY69ENjS66bWkSfdpddY= -github.com/linkedin/goavro v2.1.0+incompatible/go.mod h1:bBCwI2eGYpUI/4820s67MElg9tdeLbINjLjiM2xZFYM= -github.com/marcboeker/go-duckdb/arrowmapping v0.0.9 h1:xj+kFOqR2gH3Mcxx9LmAVHebSnCiPm303N+uxfkWVmY= -github.com/marcboeker/go-duckdb/arrowmapping v0.0.9/go.mod h1:o56AqVS90v5bpxhPnOK9La7AfNTOrMORiqTQrlRbdPQ= -github.com/marcboeker/go-duckdb/mapping v0.0.10 h1:b/y2W8/hNlD0Dwjq0mCqIlLXpjQMnWy0WqDV9b9lHQQ= -github.com/marcboeker/go-duckdb/mapping v0.0.10/go.mod h1:Ro6Tw6sGG50O8S0daZsA8TrQJz/DvGrzGvMD7Jihirw= -github.com/marcboeker/go-duckdb/v2 v2.3.2 h1:96zG2JPyIhCFjHdBjjSpOdhzJzehoGTdl7LskkuMUTs= -github.com/marcboeker/go-duckdb/v2 v2.3.2/go.mod h1:VeXz9ZM6klNvICHrXEUzaHSgNqBeTdyMxr4CICw/UaY= -github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= -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.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs= -github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= -github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI= -github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= -github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= -github.com/minio/minio-go/v7 v7.0.34/go.mod h1:nCrRzjoSUQh8hgKKtu3Y708OLvRLtuASMg2/nvmbarw= -github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= -github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= -github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= -github.com/ncw/swift v1.0.52/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -github.com/pborman/getopt v0.0.0-20180729010549-6fdd0a2c7117/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= -github.com/pierrec/lz4/v4 v4.1.8/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= -github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= -github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= -github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= -github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -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/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -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/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.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -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/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -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.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -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.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/xitongsys/parquet-go v1.5.1/go.mod h1:xUxwM8ELydxh4edHGegYq1pA8NnMKDx0K/GyB0o2bww= -github.com/xitongsys/parquet-go v1.6.2 h1:MhCaXii4eqceKPu9BwrjLqyK10oX9WF+xGhwvwbw7xM= -github.com/xitongsys/parquet-go v1.6.2/go.mod h1:IulAQyalCm0rPiZVNnCgm/PCL64X2tdSVGMQ/UeKqWA= -github.com/xitongsys/parquet-go-source v0.0.0-20190524061010-2b72cbee77d5/go.mod h1:xxCx7Wpym/3QCo6JhujJX51dzSXrwmb0oH6FQb39SEA= -github.com/xitongsys/parquet-go-source v0.0.0-20200817004010-026bad9b25d0/go.mod h1:HYhIKsdns7xz80OgkbgJYrtQY7FjHWHKH6cvN7+czGE= -github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b h1:zbb5qM/t3N+O33Vp5sFyG6yIcWZV1q7rfEjJM8UsRBQ= -github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b/go.mod h1:2ActxmJ4q17Cdruar9nKEkzKSOL1Ol03737Bkz10rTY= -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.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= -github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= -github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= -github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= -github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= -go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0= -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.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -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/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -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.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= -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.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= -gocloud.dev v0.26.0/go.mod h1:mkUgejbnbLotorqDyvedJO20XcZNTynmSeVSQS9btVg= -golang.org/x/crypto v0.0.0-20180723164146-c126467f60eb/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -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-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/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-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-20211115234514-b4de73f9ece8/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220511200225-c6db032c6c88/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= -golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= -golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= -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-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= -golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= -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/lint v0.0.0-20210508222113-6edffad5e616/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.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w= -golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= -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-20191112182307-2180aed22343/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-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -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-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211020060615-d418f374d309/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220401154927-543a649e0bdd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -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.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -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.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -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-20210220032951-036812b2e83c/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.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= -golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= -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-20191112214154-59a1497f0cea/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-20200828194041-157a740278f4/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-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/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-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/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-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220204135822-1c1b9b1eba6a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220330033206-e17cdc41300f/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-20220704084225-05e143d24a9e/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.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= -golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -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/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -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.5/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.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= -golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= -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/time v0.0.0-20211116232009-f0f3c7e86c11/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220224211638-0e9765cccd65/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-20190422233926-fe54fb35175b/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-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-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-20200828161849-5deb26317202/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20200915173823-2db8f0ff891c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20200918232735-d647fc253266/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -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.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo= -golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg= -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= -golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= -golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= -gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= -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.31.0/go.mod h1:CL+9IBCa2WWU6gRuBWaKqGWLFFwbEUXkfeMkHLQWYWo= -google.golang.org/api v0.32.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -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.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.46.0/go.mod h1:ceL4oozhkAiTID8XMmJBsIxID/9wMXJVVFXPg4ylg3I= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.58.0/go.mod h1:cAbP2FsxoGVNwtgNAmmn3y5G1TWAiVYRmg4yku3lv+E= -google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.64.0/go.mod h1:931CdxA8Rm4t6zqTFGSsgwbAEZ2+GMYurbndwSimebM= -google.golang.org/api v0.66.0/go.mod h1:I1dmXYpX7HGwz/ejRxwQp2qj5bFAz93HiCU1C1oYd9M= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.68.0/go.mod h1:sOM8pTpwgflXRhz+oC8H2Dr+UcbMqkPPWNJo88Q7TH8= -google.golang.org/api v0.69.0/go.mod h1:boanBiw+h5c3s+tBPgEzLDRHfFLWV0qXxRHz3ws7C80= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -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/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-20200513103714-09dca8ec2884/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-20200831141814-d751682dd103/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-20200914193844-75d14daec038/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200921151605-7abf4a1a14d5/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-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210429181445-86c259c2b4ab/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210517163617-5e0236093d7a/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210921142501-181ce0d877f6/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211018162055-cf77aa76bad2/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211223182754-3ac035c7e7cb/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220111164026-67b88f271998/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220114231437-d2e6a121cae0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220201184016-50beb8ab5c44/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220204002441-d6cc3cc0770e/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220211171837-173942840c17/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220216160803-4663080d8bc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220401170504-314d38edb7de/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -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.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -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.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= -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.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -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-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= -gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= -gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q= -gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mNfM5bm88whjWx4= -gopkg.in/jcmturner/gokrb5.v7 v7.3.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= -gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8= -gopkg.in/linkedin/goavro.v1 v1.0.5 h1:BJa69CDh0awSsLUmZ9+BowBdokpduDZSM9Zk8oKHfN4= -gopkg.in/linkedin/goavro.v1 v1.0.5/go.mod h1:Aw5GdAbizjOEl0kAMHV9iHmA8reZzW/OKuJAl4Hb9F0= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/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/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= -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= -nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= -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/src/syncer-attio/lib/attio.go b/src/syncer-attio/lib/attio.go deleted file mode 100644 index 58b6dbb..0000000 --- a/src/syncer-attio/lib/attio.go +++ /dev/null @@ -1,126 +0,0 @@ -package attio - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "net/http" - "time" - - "github.com/BemiHQ/BemiDB/src/common" -) - -const ( - ATTIO_API_URL = "https://api.attio.com/v2" - ATTIO_API_LIMIT = 500 - - ATTIO_OBJECT_COMPANIES = "companies" - ATTIO_OBJECT_DEALS = "deals" - ATTIO_OBJECT_PEOPLE = "people" -) - -type Attio struct { - Config *Config - HttpClient *http.Client - Parser *Parser -} - -func NewAttio(config *Config) *Attio { - return &Attio{ - Config: config, - HttpClient: &http.Client{Timeout: 30 * time.Second}, - Parser: NewParser(config), - } -} - -type ListRecordsResponse struct { - Data []json.RawMessage `json:"data"` -} - -func (attio *Attio) Load(object string, jsonQueueWriter *common.JsonQueueWriter) error { - offset := 0 - for { - jsonBody, err := json.Marshal(map[string]interface{}{"limit": ATTIO_API_LIMIT, "offset": offset}) - if err != nil { - return err - } - req, err := http.NewRequest("POST", ATTIO_API_URL+"/objects/"+object+"/records/query", bytes.NewBuffer(jsonBody)) - if err != nil { - return err - } - req.Header.Set("Authorization", "Bearer "+attio.Config.ApiAccessToken) - req.Header.Set("Content-Type", "application/json") - - common.LogInfo(attio.Config.CommonConfig, "Sending request to Attio:", req.URL.String(), "with body:", string(jsonBody)) - resp, err := attio.HttpClient.Do(req) - if err != nil { - return err - } - - common.LogDebug(attio.Config.CommonConfig, "Received response from Attio:", resp.Status) - if resp.StatusCode != http.StatusOK { - body, _ := io.ReadAll(resp.Body) - resp.Body.Close() - return fmt.Errorf("failed to list Attio records for object '%s': status %d, body: %s", object, resp.StatusCode, string(body)) - } - - var response ListRecordsResponse - err = json.NewDecoder(resp.Body).Decode(&response) - resp.Body.Close() - if err != nil { - return err - } - - switch object { - case ATTIO_OBJECT_COMPANIES: - for _, rawCompany := range response.Data { - var record RecordCompany - err = json.Unmarshal(rawCompany, &record) - if err != nil { - return err - } - parsedMap := record.ToMap(attio.Parser) - err = jsonQueueWriter.Write(parsedMap) - if err != nil { - return err - } - } - case ATTIO_OBJECT_DEALS: - for _, rawDeal := range response.Data { - var record RecordDeal - err = json.Unmarshal(rawDeal, &record) - if err != nil { - return err - } - parsedMap := record.ToMap(attio.Parser) - err = jsonQueueWriter.Write(parsedMap) - if err != nil { - return err - } - } - case ATTIO_OBJECT_PEOPLE: - for _, rawPerson := range response.Data { - var person RecordPerson - err = json.Unmarshal(rawPerson, &person) - if err != nil { - return err - } - parsedMap := person.ToMap(attio.Parser) - err = jsonQueueWriter.Write(parsedMap) - if err != nil { - return err - } - } - default: - return fmt.Errorf("unknown Attio object type: %s", object) - } - - if len(response.Data) < ATTIO_API_LIMIT { - break - } - offset += ATTIO_API_LIMIT - } - - return nil -} diff --git a/src/syncer-attio/lib/config.go b/src/syncer-attio/lib/config.go deleted file mode 100644 index c2d6385..0000000 --- a/src/syncer-attio/lib/config.go +++ /dev/null @@ -1,79 +0,0 @@ -package attio - -import ( - "flag" - "os" - "slices" - "strings" - - "github.com/BemiHQ/BemiDB/src/common" -) - -const ( - ENV_DESTINATION_SCHEMA_NAME = "DESTINATION_SCHEMA_NAME" - ENV_API_ACCESS_TOKEN = "SOURCE_ATTIO_API_ACCESS_TOKEN" -) - -type Config struct { - CommonConfig *common.CommonConfig - DestinationSchemaName string - ApiAccessToken string -} - -var _config Config - -func RegisterFlags() { - _config.CommonConfig = &common.CommonConfig{} - - flag.StringVar(&_config.CommonConfig.LogLevel, "log-level", os.Getenv(common.ENV_LOG_LEVEL), `Log level: "ERROR", "WARN", "INFO", "DEBUG", "TRACE". Default: "`+common.DEFAULT_LOG_LEVEL+`"`) - flag.StringVar(&_config.CommonConfig.CatalogDatabaseUrl, "catalog-database-url", os.Getenv(common.ENV_CATALOG_DATABASE_URL), "Catalog database URL") - flag.StringVar(&_config.CommonConfig.Aws.Region, "aws-region", os.Getenv(common.ENV_AWS_REGION), "AWS region") - flag.StringVar(&_config.CommonConfig.Aws.S3Endpoint, "aws-s3-endpoint", os.Getenv(common.ENV_AWS_S3_ENDPOINT), "AWS S3 endpoint. Default: \""+common.DEFAULT_AWS_S3_ENDPOINT+`"`) - flag.StringVar(&_config.CommonConfig.Aws.S3Bucket, "aws-s3-bucket", os.Getenv(common.ENV_AWS_S3_BUCKET), "AWS S3 bucket name") - flag.StringVar(&_config.CommonConfig.Aws.AccessKeyId, "aws-access-key-id", os.Getenv(common.ENV_AWS_ACCESS_KEY_ID), "AWS access key ID") - flag.StringVar(&_config.CommonConfig.Aws.SecretAccessKey, "aws-secret-access-key", os.Getenv(common.ENV_AWS_SECRET_ACCESS_KEY), "AWS secret access key") - flag.BoolVar(&_config.CommonConfig.DisableAnonymousAnalytics, "disable-anonymous-analytics", os.Getenv(common.ENV_DISABLE_ANONYMOUS_ANALYTICS) == "true", "Disable anonymous analytics collection") - - flag.StringVar(&_config.DestinationSchemaName, "destination-schema-name", os.Getenv(ENV_DESTINATION_SCHEMA_NAME), "Destination schema name to store the synced data") - flag.StringVar(&_config.ApiAccessToken, "api-access-token", os.Getenv(ENV_API_ACCESS_TOKEN), "Attio API Key") -} - -func LoadConfig() *Config { - parseFlags() - return &_config -} - -func parseFlags() { - flag.Parse() - - if _config.CommonConfig.LogLevel == "" { - _config.CommonConfig.LogLevel = common.DEFAULT_LOG_LEVEL - } else if !slices.Contains(common.LOG_LEVELS, _config.CommonConfig.LogLevel) { - panic("Invalid log level " + _config.CommonConfig.LogLevel + ". Must be one of " + strings.Join(common.LOG_LEVELS, ", ")) - } - if _config.CommonConfig.CatalogDatabaseUrl == "" { - panic("Catalog database URL is required") - } - if _config.CommonConfig.Aws.Region == "" { - panic("AWS region is required") - } - if _config.CommonConfig.Aws.S3Endpoint == "" { - _config.CommonConfig.Aws.S3Endpoint = common.DEFAULT_AWS_S3_ENDPOINT - } - if _config.CommonConfig.Aws.S3Bucket == "" { - panic("AWS S3 bucket name is required") - } - if _config.CommonConfig.Aws.AccessKeyId != "" && _config.CommonConfig.Aws.SecretAccessKey == "" { - panic("AWS secret access key is required") - } - if _config.CommonConfig.Aws.AccessKeyId == "" && _config.CommonConfig.Aws.SecretAccessKey != "" { - panic("AWS access key ID is required") - } - - if _config.DestinationSchemaName == "" { - panic("Destination schema name is required") - } - if _config.ApiAccessToken == "" { - panic("Attio API key is required") - } -} diff --git a/src/syncer-attio/lib/go.mod b/src/syncer-attio/lib/go.mod deleted file mode 100644 index f4159f1..0000000 --- a/src/syncer-attio/lib/go.mod +++ /dev/null @@ -1,64 +0,0 @@ -module github.com/BemiHQ/BemiDB/src/syncer-attio/lib - -go 1.24.4 - -require github.com/BemiHQ/BemiDB/src/common v0.0.0-00010101000000-000000000000 - -replace github.com/BemiHQ/BemiDB/src/common => ../../common - -require ( - github.com/apache/arrow-go/v18 v18.4.0 // indirect - github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 // indirect - github.com/apache/thrift v0.22.0 // indirect - github.com/aws/aws-sdk-go-v2 v1.37.0 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 // indirect - github.com/aws/aws-sdk-go-v2/config v1.30.1 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.18.1 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0 // indirect - github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.26.0 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.35.0 // indirect - github.com/aws/smithy-go v1.22.5 // indirect - github.com/duckdb/duckdb-go-bindings v0.1.16 // indirect - github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11 // indirect - github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11 // indirect - github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11 // indirect - github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11 // indirect - github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11 // indirect - github.com/go-viper/mapstructure/v2 v2.3.0 // indirect - github.com/goccy/go-json v0.10.5 // indirect - github.com/golang/snappy v1.0.0 // indirect - github.com/google/flatbuffers v25.2.10+incompatible // indirect - github.com/google/uuid v1.6.0 // indirect - github.com/jackc/pgpassfile v1.0.0 // indirect - github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect - github.com/jackc/pgx/v5 v5.7.5 // indirect - github.com/klauspost/compress v1.18.0 // indirect - github.com/klauspost/cpuid/v2 v2.2.11 // indirect - github.com/linkedin/goavro v2.1.0+incompatible // indirect - github.com/marcboeker/go-duckdb/arrowmapping v0.0.9 // indirect - github.com/marcboeker/go-duckdb/mapping v0.0.10 // indirect - github.com/marcboeker/go-duckdb/v2 v2.3.2 // indirect - github.com/pierrec/lz4/v4 v4.1.22 // indirect - github.com/xitongsys/parquet-go v1.6.2 // indirect - github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b // indirect - github.com/zeebo/xxh3 v1.0.2 // indirect - golang.org/x/crypto v0.37.0 // indirect - golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect - golang.org/x/mod v0.25.0 // indirect - golang.org/x/sync v0.15.0 // indirect - golang.org/x/sys v0.33.0 // indirect - golang.org/x/text v0.26.0 // indirect - golang.org/x/tools v0.34.0 // indirect - golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect -) diff --git a/src/syncer-attio/lib/go.sum b/src/syncer-attio/lib/go.sum deleted file mode 100644 index 74c3ead..0000000 --- a/src/syncer-attio/lib/go.sum +++ /dev/null @@ -1,1160 +0,0 @@ -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.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.66.0/go.mod h1:dgqGAjKCDxyhGTtC9dAREQGUJpkceNm1yt590Qno0Ko= -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.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.82.0/go.mod h1:vlKccHJGuFBFufnAnuB08dfEH9Y3H7dzDzRECFdC2TA= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= -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 v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.2.0/go.mod h1:xlogom/6gr8RJGBe7nT2eGsQYAFUbbv8dbC29qE3Xmw= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -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/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= -cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= -cloud.google.com/go/iam v0.1.1/go.mod h1:CKqrcnI/suGpybEHxZ7BMehL0oA4LpdyJdUlTl9jVMw= -cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= -cloud.google.com/go/kms v1.1.0/go.mod h1:WdbppnCDMDpOvoYBMn1+gNmOeEoZYqAv+HeuKARGCXI= -cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= -cloud.google.com/go/monitoring v1.1.0/go.mod h1:L81pzz7HKn14QCMaCs6NTQkdBnE87TElyanS95vIcl4= -cloud.google.com/go/monitoring v1.4.0/go.mod h1:y6xnxfwI3hTFWOdkOaD7nfJVlwuC3/mS/5kvtT131p4= -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/pubsub v1.19.0/go.mod h1:/O9kmSe9bb9KRnIAWkzmqhPjHo6LtzGOBYd/kr06XSs= -cloud.google.com/go/secretmanager v1.3.0/go.mod h1:+oLTkouyiYiabAQNugCeTS3PAArGiMJuBqvJnJsyH+U= -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.12.0/go.mod h1:fFLk2dp2oAhDz8QFKwqrjdJvxSp/W2g7nillojlL5Ho= -cloud.google.com/go/storage v1.21.0/go.mod h1:XmRlxkgPjlBONznT2dDUU/5XlpU2OjMnKuqnZI01LAA= -cloud.google.com/go/trace v1.0.0/go.mod h1:4iErSByzxkyHWzzlAj63/Gmjz0NH1ASqhJguHpGcr6A= -cloud.google.com/go/trace v1.2.0/go.mod h1:Wc8y/uYyOhPy12KEnXG9XGrvfMz5F5SrYecQlbW1rwM= -contrib.go.opencensus.io/exporter/aws v0.0.0-20200617204711-c478e41e60e9/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= -contrib.go.opencensus.io/exporter/stackdriver v0.13.10/go.mod h1:I5htMbyta491eUxufwwZPQdcKvvgzMB4O9ni41YnIM8= -contrib.go.opencensus.io/integrations/ocsql v0.1.7/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/azure-amqp-common-go/v3 v3.2.1/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= -github.com/Azure/azure-amqp-common-go/v3 v3.2.2/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= -github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k= -github.com/Azure/azure-sdk-for-go v51.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v59.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.0.0/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.0.0/go.mod h1:+6sju8gk8FRmSajX3Oz4G5Gm7P+mbqE9FVaXXFYTkCM= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U= -github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.0.0/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.0.0/go.mod h1:ceIuwmxDWptoW3eCqSXlnPsZFKh4X+R38dWPv7GS9Vs= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.0.0/go.mod h1:s1tW/At+xHqjNFvWU4G0c0Qv33KOhvbGNj0RCTQDV8s= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.2.0/go.mod h1:c+Lifp3EDEamAkPVzMooRNOK6CZjNSdEnf1A7jsI9u4= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.1.0/go.mod h1:7QJP7dr2wznCMeqIrhMgWGf7XpAQnVrJqDm9nvV3Cu4= -github.com/Azure/azure-service-bus-go v0.11.5/go.mod h1:MI6ge2CuQWBVq+ly456MY7XqNLJip5LO1iSFodbNLbU= -github.com/Azure/azure-storage-blob-go v0.14.0/go.mod h1:SMqIBi+SuiQH32bvyjngEewEeXoPfKMgWlBDaYf6fck= -github.com/Azure/go-amqp v0.16.0/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= -github.com/Azure/go-amqp v0.16.4/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest v0.11.19/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest v0.11.22/go.mod h1:BAWYUWGPEtKPzjVkp0Q6an0MJcJDsoh5Z1BFAEFs4Xs= -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/adal v0.9.14/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/adal v0.9.17/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= -github.com/Azure/go-autorest/autorest/azure/auth v0.5.9/go.mod h1:hg3/1yw0Bq87O3KvvnJoAh34/0zbP7SFizX/qN5JvjU= -github.com/Azure/go-autorest/autorest/azure/cli v0.4.2/go.mod h1:7qkJkT+j6b+hIpzMOwPChJhTqS8VbsqqgULzMNRugoM= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= -github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/AzureAD/microsoft-authentication-library-for-go v0.4.0/go.mod h1:Vt9sXTKwMyGcOxSmLDMnGPgqsUg7m8pe215qMLrDXw4= -github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/GoogleCloudPlatform/cloudsql-proxy v1.29.0/go.mod h1:spvB9eLJH9dutlbPSRmHvSXXHOwGRyeXh1jVdquA2G8= -github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= -github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/apache/arrow-go/v18 v18.4.0 h1:/RvkGqH517iY8bZKc4FD5/kkdwXJGjxf28JIXbJ/oB0= -github.com/apache/arrow-go/v18 v18.4.0/go.mod h1:Aawvwhj8x2jURIzD9Moy72cF0FyJXOpkYpdmGRHcw14= -github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 h1:byKBBF2CKWBjjA4J1ZL2JXttJULvWSl50LegTyRZ728= -github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516/go.mod h1:QNYViu/X0HXDHw7m3KXzWSVXIbfUvJqBFe6Gj8/pYA0= -github.com/apache/thrift v0.0.0-20181112125854-24918abba929/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.14.2/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.22.0 h1:r7mTJdj51TMDe6RtcmNdQxgn9XcyfGDOzegMDRg47uc= -github.com/apache/thrift v0.22.0/go.mod h1:1e7J/O1Ae6ZQMTYdy9xa3w9k+XHWPfRvdPyJeynQ+/g= -github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= -github.com/aws/aws-sdk-go v1.30.19/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= -github.com/aws/aws-sdk-go v1.37.0/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go v1.43.31 h1:yJZIr8nMV1hXjAvvOLUFqZRJcHV7udPQBfhJqawDzI0= -github.com/aws/aws-sdk-go v1.43.31/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= -github.com/aws/aws-sdk-go-v2 v1.16.2/go.mod h1:ytwTPBG6fXTZLxxeeCCWj2/EMYp/xDUgX+OET6TLNNU= -github.com/aws/aws-sdk-go-v2 v1.23.0/go.mod h1:i1XDttT4rnf6vxc9AuskLc6s7XBee8rlLilKlc03uAA= -github.com/aws/aws-sdk-go-v2 v1.37.0 h1:YtCOESR/pN4j5oA7cVHSfOwIcuh/KwHC4DOSXFbv5F0= -github.com/aws/aws-sdk-go-v2 v1.37.0/go.mod h1:9Q0OoGQoboYIAJyslFyF1f5K1Ryddop8gqMhWx/n4Wg= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.1/go.mod h1:n8Bs1ElDD2wJ9kCRTczA83gYbBmjSwZp3umc6zF4EeM= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.1/go.mod h1:t8PYl/6LzdAqsU4/9tz28V/kU+asFePvpOMkdul0gEQ= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 h1:6GMWV6CNpA/6fbFHnoAjrv4+LGfyTqZz2LtCHnspgDg= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0/go.mod h1:/mXlTIVG9jbxkqDnr5UQNQxW1HRYxeGklkM9vAFeabg= -github.com/aws/aws-sdk-go-v2/config v1.15.3/go.mod h1:9YL3v07Xc/ohTsxFXzan9ZpFpdTOFl4X65BAKYaz8jg= -github.com/aws/aws-sdk-go-v2/config v1.25.3/go.mod h1:tAByZy03nH5jcq0vZmkcVoo6tRzRHEwSFx3QW4NmDw8= -github.com/aws/aws-sdk-go-v2/config v1.30.1 h1:sHL8g/+9tcZATeV2tEkEfxZeaNokDtKsSjGMGHD49qA= -github.com/aws/aws-sdk-go-v2/config v1.30.1/go.mod h1:wkibEyFfxXRyTSzRU4bbF5IUsSXyE4xQ4ZjkGmi5tFo= -github.com/aws/aws-sdk-go-v2/credentials v1.11.2/go.mod h1:j8YsY9TXTm31k4eFhspiQicfXPLZ0gYXA50i4gxPE8g= -github.com/aws/aws-sdk-go-v2/credentials v1.16.2/go.mod h1:sDdvGhXrSVT5yzBDR7qXz+rhbpiMpUYfF3vJ01QSdrc= -github.com/aws/aws-sdk-go-v2/credentials v1.18.1 h1:E55xvOqlX7CvB66Z7rSM9usCrFU1ryUIUHqiXsEzVoE= -github.com/aws/aws-sdk-go-v2/credentials v1.18.1/go.mod h1:iobSQfR5MkvILxssGOvi/P1jjOhrRzfTiCPCzku0vx4= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.3/go.mod h1:uk1vhHHERfSVCUnqSqz8O48LBYDSC+k6brng09jcMOk= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.4/go.mod h1:t4i+yGHMCcUNIX1x7YVYa6bH/Do7civ5I6cG/6PMfyA= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0 h1:9sBTeKQwAvmJUWKIACIoiFSnxxl+sS++YDfr17/ngq0= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0/go.mod h1:LW9/PxQD1SYFC7pnWcgqPhoyZprhjEdg5hBK6qYPLW8= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.3/go.mod h1:0dHuD2HZZSiwfJSy1FO5bX1hQ1TxVV1QXXjpn3XUE44= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.14.0/go.mod h1:UcgIwJ9KHquYxs6Q5skC9qXjhYMK+JASDYcXQ4X7JZE= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1 h1:aAjA/1JZ1xH/F9XvxJu9cXZyp7BqVXtHpztyZ6p799E= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1/go.mod h1:ia9HASsPba/7o84sp6iE4wZPdNTJ0oicBe5sWQQk+Ys= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.9/go.mod h1:AnVH5pvai0pAF4lXRq0bmhbes1u9R8wTE+g+183bZNM= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.3/go.mod h1:7sGSz1JCKHWWBHq98m6sMtWQikmYPpxjqOydDemiVoM= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0 h1:H2iZoqW/v2Jnrh1FnU725Bq6KJ0k2uP63yH+DcY+HUI= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0/go.mod h1:L0FqLbwMXHvNC/7crWV1iIxUlOKYZUE8KuTIA+TozAI= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.3/go.mod h1:ssOhaLpRlh88H3UmEcsBoVKq309quMvm3Ds8e9d4eJM= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.3/go.mod h1:ify42Rb7nKeDDPkFjKn7q1bPscVPu/+gmHH8d2c+anU= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0 h1:EDped/rNzAhFPhVY0sDGbtD16OKqksfA8OjF/kLEgw8= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0/go.mod h1:uUI335jvzpZRPpjYx6ODc/wg1qH+NnoSTK/FwVeK0C0= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.10/go.mod h1:8DcYQcz0+ZJaSxANlHIsbbi6S+zMwjwdDqwW3r9AzaE= -github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.3/go.mod h1:5yzAuE9i2RkVAttBl8yxZgQr5OCq4D5yDnG7j9x2L0U= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0 h1:iLvW/zOkHGU3BDU5thWnj+UZ9pjhuVhv1loLj7yVtBw= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0/go.mod h1:Fn3gvhdF1x5Rs9nUoCy/fJT1ms8f8dO7RqM9lJHuazQ= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.1/go.mod h1:GeUru+8VzrTXV/83XyMJ80KpH8xO89VPoUileyNQ+tc= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1/go.mod h1:l9ymW25HOqymeU2m1gbUQ3rUIsTwKs8gYHXkqDQUhiI= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 h1:6+lZi2JeGKtCraAj1rpoZfKqnQ9SptseRZioejfUOLM= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0/go.mod h1:eb3gfbVIxIoGgJsi9pGne19dhCBpK6opTYpQqAmdy44= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.3/go.mod h1:Seb8KNmD6kVTjwRjVEgOT5hPin6sq+v4C2ycJQDwuH8= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.3/go.mod h1:R+/S1O4TYpcktbVwddeOYg+uwUfLhADP2S/x4QwsCTM= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0 h1:qGyLBQPphYzUf+IIlb5tHnvg1U2Vc5hXPcP7oRSQfy0= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0/go.mod h1:g+dzKSLXiR/8ATkPXmLhPOI6rDdjLP3tngeo3FvDcIw= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.3/go.mod h1:wlY6SVjuwvh3TVRpTqdy4I1JpBFLX4UGeKZdWntaocw= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.3/go.mod h1:Owv1I59vaghv1Ax8zz8ELY8DN7/Y0rGS+WWAmjgi950= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0 h1:eRhU3Sh8dGbaniI6B+I48XJMrTPRkK4DKo+vqIxziOU= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0/go.mod h1:paNLV18DZ6FnWE/bd06RIKPDIFpjuvCkGKWTG/GDBeM= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.3/go.mod h1:Bm/v2IaN6rZ+Op7zX+bOUMdL4fsrYZiD0dsjLhNKwZc= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.3/go.mod h1:KZgs2ny8HsxRIRbDwgvJcHHBZPOzQr/+NtGwnP+w2ec= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0 h1:6jusT+XCcvnD+Elxvm7bUf5sCMTpZEp3AKjYQ4tWJSo= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0/go.mod h1:LimGpdIF/sTBdgqwOEkrArXLCoTamK/9L9x8IKBFTIc= -github.com/aws/aws-sdk-go-v2/service/kms v1.16.3/go.mod h1:QuiHPBqlOFCi4LqdSskYYAWpQlx3PKmohy+rE2F+o5g= -github.com/aws/aws-sdk-go-v2/service/s3 v1.26.3/go.mod h1:g1qvDuRsJY+XghsV6zg00Z4KJ7DtFFCx8fJD2a491Ak= -github.com/aws/aws-sdk-go-v2/service/s3 v1.43.0/go.mod h1:NXRKkiRF+erX2hnybnVU660cYT5/KChRD4iUgJ97cI8= -github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0 h1:gAV4NEp4A+JOrIdoXkAeyy6IOo7+X2s/jRuaHKYiMaU= -github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0/go.mod h1:JIQwK8sZ5MuKGm5rrFwp9MHUcyYEsQNpVixuPDlnwaU= -github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.15.4/go.mod h1:PJc8s+lxyU8rrre0/4a0pn2wgwiDvOEzoOjcJUBr67o= -github.com/aws/aws-sdk-go-v2/service/sns v1.17.4/go.mod h1:kElt+uCcXxcqFyc+bQqZPFD9DME/eC6oHBXvFzQ9Bcw= -github.com/aws/aws-sdk-go-v2/service/sqs v1.18.3/go.mod h1:skmQo0UPvsjsuYYSYMVmrPc1HWCbHUJyrCEp+ZaLzqM= -github.com/aws/aws-sdk-go-v2/service/ssm v1.24.1/go.mod h1:NR/xoKjdbRJ+qx0pMR4mI+N/H1I1ynHwXnO6FowXJc0= -github.com/aws/aws-sdk-go-v2/service/sso v1.11.3/go.mod h1:7UQ/e69kU7LDPtY40OyoHYgRmgfGM4mgsLYtcObdveU= -github.com/aws/aws-sdk-go-v2/service/sso v1.17.2/go.mod h1:/pE21vno3q1h4bbhUOEi+6Zu/aT26UK2WKkDXd+TssQ= -github.com/aws/aws-sdk-go-v2/service/sso v1.26.0 h1:cuFWHH87GP1NBGXXfMicUbE7Oty5KpPxN6w4JpmuxYc= -github.com/aws/aws-sdk-go-v2/service/sso v1.26.0/go.mod h1:aJBemdlbCKyOXEXdXBqS7E+8S9XTDcOTaoOjtng54hA= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.20.0/go.mod h1:dWqm5G767qwKPuayKfzm4rjzFmVjiBFbOJrpSPnAMDs= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0 h1:t2va+wewPOYIqC6XyJ4MGjiGKkczMAPsgq5W4FtL9ME= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0/go.mod h1:ExCTcqYqN0hYYRsDlBVU8+68grqlWdgX9/nZJwQW4aY= -github.com/aws/aws-sdk-go-v2/service/sts v1.16.3/go.mod h1:bfBj0iVmsUyUg4weDB4NxktD9rDGeKSVWnjTnwbx9b8= -github.com/aws/aws-sdk-go-v2/service/sts v1.25.3/go.mod h1:4EqRHDCKP78hq3zOnmFXu5k0j4bXbRFfCh/zQ6KnEfQ= -github.com/aws/aws-sdk-go-v2/service/sts v1.35.0 h1:FD9agdG4CeOGS3ORLByJk56YIXDS7mxFpmZyCtpqExc= -github.com/aws/aws-sdk-go-v2/service/sts v1.35.0/go.mod h1:NDzDPbBF1xtSTZUMuZx0w3hIfWzcL7X2AQ0Tr9becIQ= -github.com/aws/smithy-go v1.11.2/go.mod h1:3xHYmszWVx2c0kIwQeEVf9uSm4fYZt67FBJnwub1bgM= -github.com/aws/smithy-go v1.17.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= -github.com/aws/smithy-go v1.22.5 h1:P9ATCXPMb2mPjYBgueqJNCA5S9UfktsW0tTxi+a7eqw= -github.com/aws/smithy-go v1.22.5/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/bobg/gcsobj v0.1.2/go.mod h1:vS49EQ1A1Ib8FgrL58C8xXYZyOCR2TgzAdopy6/ipa8= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -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/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/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= -github.com/colinmarc/hdfs/v2 v2.1.1/go.mod h1:M3x+k8UKKmxtFu++uAZ0OtDU8jR3jnaZIAc6yK4Ue0c= -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/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU= -github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= -github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= -github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= -github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= -github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/duckdb/duckdb-go-bindings v0.1.16 h1:XPCk9hzP06PoWIxDPVU3gAy0m1XmLaZHTzLggNx/U9k= -github.com/duckdb/duckdb-go-bindings v0.1.16/go.mod h1:pBnfviMzANT/9hi4bg+zW4ykRZZPCXlVuvBWEcZofkc= -github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11 h1:GXQkG4HmEbwPtqCSabJTp9wZQQ7Gqr3KveLNesQWQOs= -github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11/go.mod h1:Ezo7IbAfB8NP7CqPIN8XEHKUg5xdRRQhcPPlCXImXYA= -github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11 h1:ATJMSBIDA/YAm/6CKeBDRtGK1OOwqfTZbWg9Y5fAc9E= -github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11/go.mod h1:eS7m/mLnPQgVF4za1+xTyorKRBuK0/BA44Oy6DgrGXI= -github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11 h1:AjvnGst1avyOECYiykthyHR4DTYTaqNDPr5W/0t5j0k= -github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11/go.mod h1:1GOuk1PixiESxLaCGFhag+oFi7aP+9W8byymRAvunBk= -github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11 h1:j3B1biawuhtxe2Chkiqcwf1Kxe8VJc8lLVmjBIcJrkI= -github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11/go.mod h1:o7crKMpT2eOIi5/FY6HPqaXcvieeLSqdXXaXbruGX7w= -github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11 h1:xR3vRE8y+48U6xDNkUlOfbl7/OTA7FVcDXJ+5vETuHU= -github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11/go.mod h1:IlOhJdVKUJCAPj3QsDszUo8DVdvp1nBFp4TUJVdw99s= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -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/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= -github.com/gin-gonic/gin v1.7.3/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= -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-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= -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-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= -github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-viper/mapstructure/v2 v2.3.0 h1:27XbWsHIqhbdR5TIC911OfYvgSaW93HM+dX7970Q7jk= -github.com/go-viper/mapstructure/v2 v2.3.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= -github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= -github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.4.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= -github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188/go.mod h1:vXjM/+wXQnTPR4KqTKDgJukSZ6amVRtWMPEjE6sQoK8= -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/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/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -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.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= -github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -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/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/flatbuffers v25.2.10+incompatible h1:F3vclr7C3HpB1k9mxCGRMXq6FdUalZ6H/pNX4FP1v0Q= -github.com/google/flatbuffers v25.2.10+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -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.6/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.8/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/go-replayers/grpcreplay v1.1.0/go.mod h1:qzAvJ8/wi57zq7gWqaE6AwLM6miiXUQwP1S+I9icmhk= -github.com/google/go-replayers/httpreplay v1.1.1/go.mod h1:gN9GeLIs7l6NUoVaSSnv2RiqK1NiwAmD0MrKeC9IIks= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+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/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -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-20200905233945-acf8798be1f7/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-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210506205249-923b5ab0fc1a/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.2.0/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.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= -github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/wire v0.5.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU= -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.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hanwen/go-fuse v1.0.0/go.mod h1:unqXarDXqzAk0rt98O2tVndEPIpUgLD9+rwFisZH3Ok= -github.com/hanwen/go-fuse/v2 v2.1.0/go.mod h1:oRyA5eK+pvJyv5otpO/DgccS8y/RvYMaO00GgRLGryc= -github.com/hashicorp/go-uuid v0.0.0-20180228145832-27454136f036/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -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/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/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.11.0/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= -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/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.2.0/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-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= -github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/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.10.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.15.0/go.mod h1:D/zyOyXiaM1TmVWnOM18p0xdDtdakRBa0RsVGI3U3bw= -github.com/jackc/pgx/v5 v5.7.5 h1:JHGfMnQY+IEtGM63d+NGMjoRpysB2JBwDr5fsngwmJs= -github.com/jackc/pgx/v5 v5.7.5/go.mod h1:aruU7o91Tc2q2cFp5h4uP3f6ztExVpyVv88Xl/8Vl8M= -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.2.1 h1:gI8os0wpRXFd4FiAY2dWiqRK037tjj3t7rKFeO4X5iw= -github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= -github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= -github.com/jcmturner/gofork v0.0.0-20180107083740-2aebee971930/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= -github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= -github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -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/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= -github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= -github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.13.1/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= -github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= -github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= -github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= -github.com/klauspost/cpuid/v2 v2.2.11 h1:0OwqZRYI2rFrjS4kvkDnqJkKHdHaRnCm68/DY4OxRzU= -github.com/klauspost/cpuid/v2 v2.2.11/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= -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/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -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/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -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.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/linkedin/goavro v2.1.0+incompatible h1:DV2aUlj2xZiuxQyvag8Dy7zjY69ENjS66bWkSfdpddY= -github.com/linkedin/goavro v2.1.0+incompatible/go.mod h1:bBCwI2eGYpUI/4820s67MElg9tdeLbINjLjiM2xZFYM= -github.com/marcboeker/go-duckdb/arrowmapping v0.0.9 h1:xj+kFOqR2gH3Mcxx9LmAVHebSnCiPm303N+uxfkWVmY= -github.com/marcboeker/go-duckdb/arrowmapping v0.0.9/go.mod h1:o56AqVS90v5bpxhPnOK9La7AfNTOrMORiqTQrlRbdPQ= -github.com/marcboeker/go-duckdb/mapping v0.0.10 h1:b/y2W8/hNlD0Dwjq0mCqIlLXpjQMnWy0WqDV9b9lHQQ= -github.com/marcboeker/go-duckdb/mapping v0.0.10/go.mod h1:Ro6Tw6sGG50O8S0daZsA8TrQJz/DvGrzGvMD7Jihirw= -github.com/marcboeker/go-duckdb/v2 v2.3.2 h1:96zG2JPyIhCFjHdBjjSpOdhzJzehoGTdl7LskkuMUTs= -github.com/marcboeker/go-duckdb/v2 v2.3.2/go.mod h1:VeXz9ZM6klNvICHrXEUzaHSgNqBeTdyMxr4CICw/UaY= -github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= -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.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs= -github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= -github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI= -github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= -github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= -github.com/minio/minio-go/v7 v7.0.34/go.mod h1:nCrRzjoSUQh8hgKKtu3Y708OLvRLtuASMg2/nvmbarw= -github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= -github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= -github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= -github.com/ncw/swift v1.0.52/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -github.com/pborman/getopt v0.0.0-20180729010549-6fdd0a2c7117/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= -github.com/pierrec/lz4/v4 v4.1.8/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= -github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= -github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= -github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= -github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -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/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -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/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.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -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/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -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.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -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.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/xitongsys/parquet-go v1.5.1/go.mod h1:xUxwM8ELydxh4edHGegYq1pA8NnMKDx0K/GyB0o2bww= -github.com/xitongsys/parquet-go v1.6.2 h1:MhCaXii4eqceKPu9BwrjLqyK10oX9WF+xGhwvwbw7xM= -github.com/xitongsys/parquet-go v1.6.2/go.mod h1:IulAQyalCm0rPiZVNnCgm/PCL64X2tdSVGMQ/UeKqWA= -github.com/xitongsys/parquet-go-source v0.0.0-20190524061010-2b72cbee77d5/go.mod h1:xxCx7Wpym/3QCo6JhujJX51dzSXrwmb0oH6FQb39SEA= -github.com/xitongsys/parquet-go-source v0.0.0-20200817004010-026bad9b25d0/go.mod h1:HYhIKsdns7xz80OgkbgJYrtQY7FjHWHKH6cvN7+czGE= -github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b h1:zbb5qM/t3N+O33Vp5sFyG6yIcWZV1q7rfEjJM8UsRBQ= -github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b/go.mod h1:2ActxmJ4q17Cdruar9nKEkzKSOL1Ol03737Bkz10rTY= -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.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= -github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= -github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= -github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= -github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= -go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0= -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.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -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/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -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.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= -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.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= -gocloud.dev v0.26.0/go.mod h1:mkUgejbnbLotorqDyvedJO20XcZNTynmSeVSQS9btVg= -golang.org/x/crypto v0.0.0-20180723164146-c126467f60eb/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -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-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/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-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-20211115234514-b4de73f9ece8/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220511200225-c6db032c6c88/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= -golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= -golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= -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-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= -golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= -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/lint v0.0.0-20210508222113-6edffad5e616/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.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w= -golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= -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-20191112182307-2180aed22343/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-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -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-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211020060615-d418f374d309/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220401154927-543a649e0bdd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -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.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -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.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -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-20210220032951-036812b2e83c/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.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= -golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= -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-20191112214154-59a1497f0cea/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-20200828194041-157a740278f4/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-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/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-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/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-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220204135822-1c1b9b1eba6a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220330033206-e17cdc41300f/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-20220704084225-05e143d24a9e/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.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= -golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -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/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -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.5/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.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= -golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= -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/time v0.0.0-20211116232009-f0f3c7e86c11/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220224211638-0e9765cccd65/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-20190422233926-fe54fb35175b/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-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-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-20200828161849-5deb26317202/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20200915173823-2db8f0ff891c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20200918232735-d647fc253266/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -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.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo= -golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg= -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= -golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= -golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= -gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= -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.31.0/go.mod h1:CL+9IBCa2WWU6gRuBWaKqGWLFFwbEUXkfeMkHLQWYWo= -google.golang.org/api v0.32.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -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.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.46.0/go.mod h1:ceL4oozhkAiTID8XMmJBsIxID/9wMXJVVFXPg4ylg3I= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.58.0/go.mod h1:cAbP2FsxoGVNwtgNAmmn3y5G1TWAiVYRmg4yku3lv+E= -google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.64.0/go.mod h1:931CdxA8Rm4t6zqTFGSsgwbAEZ2+GMYurbndwSimebM= -google.golang.org/api v0.66.0/go.mod h1:I1dmXYpX7HGwz/ejRxwQp2qj5bFAz93HiCU1C1oYd9M= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.68.0/go.mod h1:sOM8pTpwgflXRhz+oC8H2Dr+UcbMqkPPWNJo88Q7TH8= -google.golang.org/api v0.69.0/go.mod h1:boanBiw+h5c3s+tBPgEzLDRHfFLWV0qXxRHz3ws7C80= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -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/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-20200513103714-09dca8ec2884/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-20200831141814-d751682dd103/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-20200914193844-75d14daec038/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200921151605-7abf4a1a14d5/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-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210429181445-86c259c2b4ab/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210517163617-5e0236093d7a/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210921142501-181ce0d877f6/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211018162055-cf77aa76bad2/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211223182754-3ac035c7e7cb/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220111164026-67b88f271998/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220114231437-d2e6a121cae0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220201184016-50beb8ab5c44/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220204002441-d6cc3cc0770e/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220211171837-173942840c17/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220216160803-4663080d8bc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220401170504-314d38edb7de/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -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.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -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.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= -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.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -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-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= -gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= -gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q= -gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mNfM5bm88whjWx4= -gopkg.in/jcmturner/gokrb5.v7 v7.3.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= -gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8= -gopkg.in/linkedin/goavro.v1 v1.0.5 h1:BJa69CDh0awSsLUmZ9+BowBdokpduDZSM9Zk8oKHfN4= -gopkg.in/linkedin/goavro.v1 v1.0.5/go.mod h1:Aw5GdAbizjOEl0kAMHV9iHmA8reZzW/OKuJAl4Hb9F0= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/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/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= -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= -nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= -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/src/syncer-attio/lib/parser.go b/src/syncer-attio/lib/parser.go deleted file mode 100644 index 4df57de..0000000 --- a/src/syncer-attio/lib/parser.go +++ /dev/null @@ -1,193 +0,0 @@ -package attio - -import ( - "strings" -) - -type Value struct { - Value interface{} `json:"value"` -} -type DomainValue struct { - Value string `json:"domain"` -} -type RelationshipValue struct { - Value string `json:"target_record_id"` -} -type SelectValue struct { - Option struct { - Value string `json:"title"` - } `json:"option"` -} -type CurrencyValue struct { - Value float64 `json:"currency_value"` -} -type InteractionValue struct { - Value string `json:"interacted_at"` -} -type UserValue struct { - Value string `json:"referenced_actor_id"` -} -type StatusValue struct { - Status struct { - Value string `json:"title"` - } `json:"status"` -} -type PhoneNumberValue struct { - Value string `json:"phone_number"` -} -type EmailValue struct { - Value string `json:"email_address"` -} -type NameValue struct { - Value string `json:"full_name"` -} - -type LocationValue struct { - Line1 string `json:"line_1"` - Line2 string `json:"line_2"` - Line3 string `json:"line_3"` - Line4 string `json:"line_4"` - Locality string `json:"locality"` - Region string `json:"region"` - Postcode string `json:"postcode"` - Country string `json:"country_code"` -} - -type Parser struct { - Config *Config -} - -func NewParser(config *Config) *Parser { - return &Parser{ - Config: config, - } -} - -func (parser *Parser) FirstValue(values []Value) interface{} { - if len(values) > 0 { - return values[0].Value - } - return nil -} - -func (parser *Parser) FirstCurrencyValue(values []CurrencyValue) interface{} { - if len(values) > 0 { - return values[0].Value - } - return nil -} - -func (parser *Parser) FirstInteractionValue(values []InteractionValue) interface{} { - if len(values) > 0 { - return values[0].Value - } - return nil -} - -func (parser *Parser) FirstUserValue(values []UserValue) interface{} { - if len(values) > 0 { - return values[0].Value - } - return nil -} - -func (parser *Parser) FirstSelectValue(values []SelectValue) interface{} { - if len(values) > 0 { - return values[0].Option.Value - } - return nil -} - -func (parser *Parser) FirstStatusValue(values []StatusValue) interface{} { - if len(values) > 0 { - return values[0].Status.Value - } - return nil -} - -func (parser *Parser) FirstRelationshipId(values []RelationshipValue) interface{} { - if len(values) > 0 { - return values[0].Value - } - return nil -} - -func (parser *Parser) FirstNameValue(values []NameValue) interface{} { - if len(values) > 0 { - return values[0].Value - } - return nil -} - -func (parser *Parser) FirstLocationValue(values []LocationValue) interface{} { - if len(values) > 0 { - location := values[0] - parts := []string{} - if location.Line1 != "" { - parts = append(parts, location.Line1) - } - if location.Line2 != "" { - parts = append(parts, location.Line2) - } - if location.Line3 != "" { - parts = append(parts, location.Line3) - } - if location.Line4 != "" { - parts = append(parts, location.Line4) - } - if location.Locality != "" { - parts = append(parts, location.Locality) - } - if location.Region != "" { - parts = append(parts, location.Region) - } - if location.Postcode != "" { - parts = append(parts, location.Postcode) - } - if location.Country != "" { - parts = append(parts, location.Country) - } - return strings.Join(parts, ", ") - } - return nil -} - -func (parser *Parser) AllDomainValues(values []DomainValue) []string { - domains := []string{} - for _, value := range values { - domains = append(domains, value.Value) - } - return domains -} - -func (parser *Parser) AllRelationshipIds(values []RelationshipValue) []string { - ids := []string{} - for _, value := range values { - ids = append(ids, value.Value) - } - return ids -} - -func (parser *Parser) AllSelectValues(values []SelectValue) []string { - options := []string{} - for _, value := range values { - options = append(options, value.Option.Value) - } - return options -} - -func (parser *Parser) AllEmailValues(values []EmailValue) []string { - emails := []string{} - for _, value := range values { - emails = append(emails, value.Value) - } - return emails -} - -func (parser *Parser) AllPhoneNumberValues(values []PhoneNumberValue) []string { - phones := []string{} - for _, value := range values { - phones = append(phones, value.Value) - } - return phones -} diff --git a/src/syncer-attio/lib/record_company.go b/src/syncer-attio/lib/record_company.go deleted file mode 100644 index 5528611..0000000 --- a/src/syncer-attio/lib/record_company.go +++ /dev/null @@ -1,121 +0,0 @@ -package attio - -import ( - "github.com/BemiHQ/BemiDB/src/common" -) - -type RecordCompany struct { - Values struct { - Id []Value `json:"record_id"` - Name []Value `json:"name"` - Description []Value `json:"description"` - Domains []DomainValue `json:"domains"` - Team []RelationshipValue `json:"team"` - Categories []SelectValue `json:"categories"` - PrimaryLocation []LocationValue `json:"primary_location"` - LogoUrl []Value `json:"logo_url"` - Angellist []Value `json:"angellist"` - Facebook []Value `json:"facebook"` - Instagram []Value `json:"instagram"` - Linkedin []Value `json:"linkedin"` - Twitter []Value `json:"twitter"` - TwitterFollowerCount []Value `json:"twitter_follower_count"` - EstimatedArrUsd []SelectValue `json:"estimated_arr_usd"` - FundingRaisedUsd []CurrencyValue `json:"funding_raised_usd"` - FoundationDate []Value `json:"foundation_date"` - EmployeeRange []SelectValue `json:"employee_range"` - FirstCalendarInteraction []InteractionValue `json:"first_calendar_interaction"` - LastCalendarInteraction []InteractionValue `json:"last_calendar_interaction"` - NextCalendarInteraction []InteractionValue `json:"next_calendar_interaction"` - FirstEmailInteraction []InteractionValue `json:"first_email_interaction"` - LastEmailInteraction []InteractionValue `json:"last_email_interaction"` - FirstInteraction []InteractionValue `json:"first_interaction"` - LastInteraction []InteractionValue `json:"last_interaction"` - NextInteraction []InteractionValue `json:"next_interaction"` - StrongestConnectionStrengthLegacy []Value `json:"strongest_connection_strength_legacy"` - StrongestConnectionStrength []SelectValue `json:"strongest_connection_strength"` - StrongestConnectionUser []UserValue `json:"strongest_connection_user"` - AssociatedDeals []RelationshipValue `json:"associated_deals"` - AssociatedWorkspaces []RelationshipValue `json:"associated_workspaces"` - CreatedAt []Value `json:"created_at"` - CreatedBy []UserValue `json:"created_by"` - } `json:"values"` -} - -func (record *RecordCompany) ToMap(parser *Parser) map[string]interface{} { - result := make(map[string]interface{}) - - result["id"] = parser.FirstValue(record.Values.Id) - result["name"] = parser.FirstValue(record.Values.Name) - result["description"] = parser.FirstValue(record.Values.Description) - result["domains"] = parser.AllDomainValues(record.Values.Domains) - result["team"] = parser.AllRelationshipIds(record.Values.Team) - result["categories"] = parser.AllSelectValues(record.Values.Categories) - result["primary_location"] = parser.FirstLocationValue(record.Values.PrimaryLocation) - result["logo_url"] = parser.FirstValue(record.Values.LogoUrl) - result["angellist"] = parser.FirstValue(record.Values.Angellist) - result["facebook"] = parser.FirstValue(record.Values.Facebook) - result["instagram"] = parser.FirstValue(record.Values.Instagram) - result["linkedin"] = parser.FirstValue(record.Values.Linkedin) - result["twitter"] = parser.FirstValue(record.Values.Twitter) - result["twitter_follower_count"] = parser.FirstValue(record.Values.TwitterFollowerCount) - result["estimated_arr_usd"] = parser.FirstSelectValue(record.Values.EstimatedArrUsd) - result["funding_raised_usd"] = parser.FirstCurrencyValue(record.Values.FundingRaisedUsd) - result["foundation_date"] = parser.FirstValue(record.Values.FoundationDate) - result["employee_range"] = parser.FirstSelectValue(record.Values.EmployeeRange) - result["first_calendar_interaction"] = parser.FirstInteractionValue(record.Values.FirstCalendarInteraction) - result["last_calendar_interaction"] = parser.FirstInteractionValue(record.Values.LastCalendarInteraction) - result["next_calendar_interaction"] = parser.FirstInteractionValue(record.Values.NextCalendarInteraction) - result["first_email_interaction"] = parser.FirstInteractionValue(record.Values.FirstEmailInteraction) - result["last_email_interaction"] = parser.FirstInteractionValue(record.Values.LastEmailInteraction) - result["first_interaction"] = parser.FirstInteractionValue(record.Values.FirstInteraction) - result["last_interaction"] = parser.FirstInteractionValue(record.Values.LastInteraction) - result["next_interaction"] = parser.FirstInteractionValue(record.Values.NextInteraction) - result["strongest_connection_strength_legacy"] = parser.FirstValue(record.Values.StrongestConnectionStrengthLegacy) - result["strongest_connection_strength"] = parser.FirstSelectValue(record.Values.StrongestConnectionStrength) - result["strongest_connection_user"] = parser.FirstUserValue(record.Values.StrongestConnectionUser) - result["associated_deals"] = parser.AllRelationshipIds(record.Values.AssociatedDeals) - result["associated_workspaces"] = parser.AllRelationshipIds(record.Values.AssociatedWorkspaces) - result["created_at"] = parser.FirstValue(record.Values.CreatedAt) - result["created_by"] = parser.FirstUserValue(record.Values.CreatedBy) - - return result -} - -func CompaniesIcebergSchemaColumns(config *common.CommonConfig) []*common.IcebergSchemaColumn { - return []*common.IcebergSchemaColumn{ - {Config: config, ColumnName: "id", ColumnType: common.IcebergColumnTypeString, Position: 1}, - {Config: config, ColumnName: "name", ColumnType: common.IcebergColumnTypeString, Position: 2}, - {Config: config, ColumnName: "description", ColumnType: common.IcebergColumnTypeString, Position: 3}, - {Config: config, ColumnName: "domains", ColumnType: common.IcebergColumnTypeString, IsList: true, Position: 4}, - {Config: config, ColumnName: "team", ColumnType: common.IcebergColumnTypeString, IsList: true, Position: 5}, - {Config: config, ColumnName: "categories", ColumnType: common.IcebergColumnTypeString, IsList: true, Position: 6}, - {Config: config, ColumnName: "primary_location", ColumnType: common.IcebergColumnTypeString, Position: 7}, - {Config: config, ColumnName: "logo_url", ColumnType: common.IcebergColumnTypeString, Position: 8}, - {Config: config, ColumnName: "angellist", ColumnType: common.IcebergColumnTypeString, Position: 9}, - {Config: config, ColumnName: "facebook", ColumnType: common.IcebergColumnTypeString, Position: 10}, - {Config: config, ColumnName: "instagram", ColumnType: common.IcebergColumnTypeString, Position: 11}, - {Config: config, ColumnName: "linkedin", ColumnType: common.IcebergColumnTypeString, Position: 12}, - {Config: config, ColumnName: "twitter", ColumnType: common.IcebergColumnTypeString, Position: 13}, - {Config: config, ColumnName: "twitter_follower_count", ColumnType: common.IcebergColumnTypeInteger, Position: 14}, - {Config: config, ColumnName: "estimated_arr_usd", ColumnType: common.IcebergColumnTypeString, Position: 15}, - {Config: config, ColumnName: "funding_raised_usd", ColumnType: common.IcebergColumnTypeFloat, Position: 16}, - {Config: config, ColumnName: "foundation_date", ColumnType: common.IcebergColumnTypeDate, Position: 17}, - {Config: config, ColumnName: "employee_range", ColumnType: common.IcebergColumnTypeString, Position: 18}, - {Config: config, ColumnName: "first_calendar_interaction", ColumnType: common.IcebergColumnTypeTimestamp, Position: 19}, - {Config: config, ColumnName: "last_calendar_interaction", ColumnType: common.IcebergColumnTypeTimestamp, Position: 20}, - {Config: config, ColumnName: "next_calendar_interaction", ColumnType: common.IcebergColumnTypeTimestamp, Position: 21}, - {Config: config, ColumnName: "first_email_interaction", ColumnType: common.IcebergColumnTypeTimestamp, Position: 22}, - {Config: config, ColumnName: "last_email_interaction", ColumnType: common.IcebergColumnTypeTimestamp, Position: 23}, - {Config: config, ColumnName: "first_interaction", ColumnType: common.IcebergColumnTypeTimestamp, Position: 24}, - {Config: config, ColumnName: "last_interaction", ColumnType: common.IcebergColumnTypeTimestamp, Position: 25}, - {Config: config, ColumnName: "next_interaction", ColumnType: common.IcebergColumnTypeTimestamp, Position: 26}, - {Config: config, ColumnName: "strongest_connection_strength_legacy", ColumnType: common.IcebergColumnTypeInteger, Position: 27}, - {Config: config, ColumnName: "strongest_connection_strength", ColumnType: common.IcebergColumnTypeString, Position: 28}, - {Config: config, ColumnName: "strongest_connection_user", ColumnType: common.IcebergColumnTypeString, Position: 29}, - {Config: config, ColumnName: "associated_deals", ColumnType: common.IcebergColumnTypeString, IsList: true, Position: 30}, - {Config: config, ColumnName: "associated_workspaces", ColumnType: common.IcebergColumnTypeString, IsList: true, Position: 31}, - {Config: config, ColumnName: "created_at", ColumnType: common.IcebergColumnTypeTimestamp, Position: 32}, - {Config: config, ColumnName: "created_by", ColumnType: common.IcebergColumnTypeString, Position: 33}, - } -} diff --git a/src/syncer-attio/lib/record_deal.go b/src/syncer-attio/lib/record_deal.go deleted file mode 100644 index e959e15..0000000 --- a/src/syncer-attio/lib/record_deal.go +++ /dev/null @@ -1,49 +0,0 @@ -package attio - -import ( - "github.com/BemiHQ/BemiDB/src/common" -) - -type RecordDeal struct { - Values struct { - Id []Value `json:"record_id"` - Name []Value `json:"name"` - Stage []StatusValue `json:"stage"` - Owner []UserValue `json:"owner"` - Value []CurrencyValue `json:"value"` - AssociatedPeople []RelationshipValue `json:"associated_people"` - AssociatedCompany []RelationshipValue `json:"associated_company"` - CreatedAt []Value `json:"created_at"` - CreatedBy []UserValue `json:"created_by"` - } `json:"values"` -} - -func (record *RecordDeal) ToMap(parser *Parser) map[string]interface{} { - result := make(map[string]interface{}) - - result["id"] = parser.FirstValue(record.Values.Id) - result["name"] = parser.FirstValue(record.Values.Name) - result["stage"] = parser.FirstStatusValue(record.Values.Stage) - result["owner"] = parser.FirstUserValue(record.Values.Owner) - result["value"] = parser.FirstCurrencyValue(record.Values.Value) - result["associated_people"] = parser.AllRelationshipIds(record.Values.AssociatedPeople) - result["associated_company"] = parser.FirstRelationshipId(record.Values.AssociatedCompany) - result["created_at"] = parser.FirstValue(record.Values.CreatedAt) - result["created_by"] = parser.FirstUserValue(record.Values.CreatedBy) - - return result -} - -func DealsIcebergSchemaColumns(config *common.CommonConfig) []*common.IcebergSchemaColumn { - return []*common.IcebergSchemaColumn{ - {Config: config, ColumnName: "id", ColumnType: common.IcebergColumnTypeString, Position: 1}, - {Config: config, ColumnName: "name", ColumnType: common.IcebergColumnTypeString, Position: 2}, - {Config: config, ColumnName: "stage", ColumnType: common.IcebergColumnTypeString, Position: 3}, - {Config: config, ColumnName: "owner", ColumnType: common.IcebergColumnTypeString, Position: 4}, - {Config: config, ColumnName: "value", ColumnType: common.IcebergColumnTypeFloat, Position: 5}, - {Config: config, ColumnName: "associated_people", ColumnType: common.IcebergColumnTypeString, IsList: true, Position: 6}, - {Config: config, ColumnName: "associated_company", ColumnType: common.IcebergColumnTypeString, Position: 7}, - {Config: config, ColumnName: "created_at", ColumnType: common.IcebergColumnTypeTimestamp, Position: 8}, - {Config: config, ColumnName: "created_by", ColumnType: common.IcebergColumnTypeString, Position: 9}, - } -} diff --git a/src/syncer-attio/lib/record_person.go b/src/syncer-attio/lib/record_person.go deleted file mode 100644 index a67fbde..0000000 --- a/src/syncer-attio/lib/record_person.go +++ /dev/null @@ -1,112 +0,0 @@ -package attio - -import ( - "github.com/BemiHQ/BemiDB/src/common" -) - -type RecordPerson struct { - Values struct { - Id []Value `json:"record_id"` - Name []NameValue `json:"name"` - Description []Value `json:"description"` - EmailAddresses []EmailValue `json:"email_addresses"` - Company []RelationshipValue `json:"company"` - JobTitle []Value `json:"job_title"` - AvatarUrl []Value `json:"avatar_url"` - PhoneNumbers []PhoneNumberValue `json:"phone_numbers"` - PrimaryLocation []LocationValue `json:"primary_location"` - Angellist []Value `json:"angellist"` - Facebook []Value `json:"facebook"` - Instagram []Value `json:"instagram"` - Linkedin []Value `json:"linkedin"` - Twitter []Value `json:"twitter"` - TwitterFollowerCount []Value `json:"twitter_follower_count"` - FirstCalendarInteraction []InteractionValue `json:"first_calendar_interaction"` - LastCalendarInteraction []InteractionValue `json:"last_calendar_interaction"` - NextCalendarInteraction []InteractionValue `json:"next_calendar_interaction"` - FirstEmailInteraction []InteractionValue `json:"first_email_interaction"` - LastEmailInteraction []InteractionValue `json:"last_email_interaction"` - FirstInteraction []InteractionValue `json:"first_interaction"` - LastInteraction []InteractionValue `json:"last_interaction"` - NextInteraction []InteractionValue `json:"next_interaction"` - StrongestConnectionStrengthLegacy []Value `json:"strongest_connection_strength_legacy"` - StrongestConnectionStrength []SelectValue `json:"strongest_connection_strength"` - StrongestConnectionUser []UserValue `json:"strongest_connection_user"` - AssociatedDeals []RelationshipValue `json:"associated_deals"` - AssociatedUsers []RelationshipValue `json:"associated_users"` - CreatedAt []Value `json:"created_at"` - CreatedBy []UserValue `json:"created_by"` - } `json:"values"` -} - -func (record *RecordPerson) ToMap(parser *Parser) map[string]interface{} { - result := make(map[string]interface{}) - - result["id"] = parser.FirstValue(record.Values.Id) - result["name"] = parser.FirstNameValue(record.Values.Name) - result["description"] = parser.FirstValue(record.Values.Description) - result["email_addresses"] = parser.AllEmailValues(record.Values.EmailAddresses) - result["company"] = parser.FirstRelationshipId(record.Values.Company) - result["job_title"] = parser.FirstValue(record.Values.JobTitle) - result["avatar_url"] = parser.FirstValue(record.Values.AvatarUrl) - result["phone_numbers"] = parser.AllPhoneNumberValues(record.Values.PhoneNumbers) - result["primary_location"] = parser.FirstLocationValue(record.Values.PrimaryLocation) - result["angellist"] = parser.FirstValue(record.Values.Angellist) - result["facebook"] = parser.FirstValue(record.Values.Facebook) - result["instagram"] = parser.FirstValue(record.Values.Instagram) - result["linkedin"] = parser.FirstValue(record.Values.Linkedin) - result["twitter"] = parser.FirstValue(record.Values.Twitter) - result["twitter_follower_count"] = parser.FirstValue(record.Values.TwitterFollowerCount) - result["first_calendar_interaction"] = parser.FirstInteractionValue(record.Values.FirstCalendarInteraction) - result["last_calendar_interaction"] = parser.FirstInteractionValue(record.Values.LastCalendarInteraction) - result["next_calendar_interaction"] = parser.FirstInteractionValue(record.Values.NextCalendarInteraction) - result["first_email_interaction"] = parser.FirstInteractionValue(record.Values.FirstEmailInteraction) - result["last_email_interaction"] = parser.FirstInteractionValue(record.Values.LastEmailInteraction) - result["first_interaction"] = parser.FirstInteractionValue(record.Values.FirstInteraction) - result["last_interaction"] = parser.FirstInteractionValue(record.Values.LastInteraction) - result["next_interaction"] = parser.FirstInteractionValue(record.Values.NextInteraction) - result["strongest_connection_strength_legacy"] = parser.FirstValue(record.Values.StrongestConnectionStrengthLegacy) - result["strongest_connection_strength"] = parser.FirstSelectValue(record.Values.StrongestConnectionStrength) - result["strongest_connection_user"] = parser.FirstUserValue(record.Values.StrongestConnectionUser) - result["associated_deals"] = parser.AllRelationshipIds(record.Values.AssociatedDeals) - result["associated_users"] = parser.AllRelationshipIds(record.Values.AssociatedUsers) - result["created_at"] = parser.FirstValue(record.Values.CreatedAt) - result["created_by"] = parser.FirstUserValue(record.Values.CreatedBy) - - return result -} - -func PeopleIcebergSchemaColumns(config *common.CommonConfig) []*common.IcebergSchemaColumn { - return []*common.IcebergSchemaColumn{ - {Config: config, ColumnName: "id", ColumnType: common.IcebergColumnTypeString, Position: 1}, - {Config: config, ColumnName: "name", ColumnType: common.IcebergColumnTypeString, Position: 2}, - {Config: config, ColumnName: "description", ColumnType: common.IcebergColumnTypeString, Position: 3}, - {Config: config, ColumnName: "email_addresses", ColumnType: common.IcebergColumnTypeString, IsList: true, Position: 4}, - {Config: config, ColumnName: "company", ColumnType: common.IcebergColumnTypeString, Position: 5}, - {Config: config, ColumnName: "job_title", ColumnType: common.IcebergColumnTypeString, Position: 6}, - {Config: config, ColumnName: "avatar_url", ColumnType: common.IcebergColumnTypeString, Position: 7}, - {Config: config, ColumnName: "phone_numbers", ColumnType: common.IcebergColumnTypeString, IsList: true, Position: 8}, - {Config: config, ColumnName: "primary_location", ColumnType: common.IcebergColumnTypeString, Position: 9}, - {Config: config, ColumnName: "angellist", ColumnType: common.IcebergColumnTypeString, Position: 10}, - {Config: config, ColumnName: "facebook", ColumnType: common.IcebergColumnTypeString, Position: 11}, - {Config: config, ColumnName: "instagram", ColumnType: common.IcebergColumnTypeString, Position: 12}, - {Config: config, ColumnName: "linkedin", ColumnType: common.IcebergColumnTypeString, Position: 13}, - {Config: config, ColumnName: "twitter", ColumnType: common.IcebergColumnTypeString, Position: 14}, - {Config: config, ColumnName: "twitter_follower_count", ColumnType: common.IcebergColumnTypeInteger, Position: 15}, - {Config: config, ColumnName: "first_calendar_interaction", ColumnType: common.IcebergColumnTypeTimestamp, Position: 16}, - {Config: config, ColumnName: "last_calendar_interaction", ColumnType: common.IcebergColumnTypeTimestamp, Position: 17}, - {Config: config, ColumnName: "next_calendar_interaction", ColumnType: common.IcebergColumnTypeTimestamp, Position: 18}, - {Config: config, ColumnName: "first_email_interaction", ColumnType: common.IcebergColumnTypeTimestamp, Position: 19}, - {Config: config, ColumnName: "last_email_interaction", ColumnType: common.IcebergColumnTypeTimestamp, Position: 20}, - {Config: config, ColumnName: "first_interaction", ColumnType: common.IcebergColumnTypeTimestamp, Position: 21}, - {Config: config, ColumnName: "last_interaction", ColumnType: common.IcebergColumnTypeTimestamp, Position: 22}, - {Config: config, ColumnName: "next_interaction", ColumnType: common.IcebergColumnTypeTimestamp, Position: 23}, - {Config: config, ColumnName: "strongest_connection_strength_legacy", ColumnType: common.IcebergColumnTypeInteger, Position: 24}, - {Config: config, ColumnName: "strongest_connection_strength", ColumnType: common.IcebergColumnTypeString, Position: 25}, - {Config: config, ColumnName: "strongest_connection_user", ColumnType: common.IcebergColumnTypeString, Position: 26}, - {Config: config, ColumnName: "associated_deals", ColumnType: common.IcebergColumnTypeString, IsList: true, Position: 27}, - {Config: config, ColumnName: "associated_users", ColumnType: common.IcebergColumnTypeString, IsList: true, Position: 28}, - {Config: config, ColumnName: "created_at", ColumnType: common.IcebergColumnTypeTimestamp, Position: 29}, - {Config: config, ColumnName: "created_by", ColumnType: common.IcebergColumnTypeString, Position: 30}, - } -} diff --git a/src/syncer-attio/lib/syncer.go b/src/syncer-attio/lib/syncer.go deleted file mode 100644 index 814def9..0000000 --- a/src/syncer-attio/lib/syncer.go +++ /dev/null @@ -1,70 +0,0 @@ -package attio - -import ( - "github.com/BemiHQ/BemiDB/src/common" -) - -type Syncer struct { - Config *Config - Attio *Attio - StorageS3 *common.StorageS3 - DuckdbClient *common.DuckdbClient -} - -func NewSyncer(config *Config, storageS3 *common.StorageS3, duckdbClient *common.DuckdbClient) *Syncer { - return &Syncer{ - Config: config, - Attio: NewAttio(config), - StorageS3: storageS3, - DuckdbClient: duckdbClient, - } -} - -func (syncer *Syncer) Sync() { - common.SendAnonymousAnalytics(syncer.Config.CommonConfig, "syncer-attio-start", syncer.name()) - - for _, object := range []string{ATTIO_OBJECT_COMPANIES, ATTIO_OBJECT_DEALS, ATTIO_OBJECT_PEOPLE} { - cappedBuffer := common.NewCappedBuffer(syncer.Config.CommonConfig, common.DEFAULT_CAPPED_BUFFER_SIZE) - jsonQueueWriter := common.NewJsonQueueWriter(cappedBuffer) - - // Copy from Attio to cappedBuffer in a separate goroutine in parallel - go func() { - err := syncer.Attio.Load(object, jsonQueueWriter) - common.PanicIfError(syncer.Config.CommonConfig, err) - - common.LogInfo(syncer.Config.CommonConfig, "Finished exporting data from Attio.") - jsonQueueWriter.Close() - }() - - syncer.WriteToIceberg(object, cappedBuffer) - } - - common.SendAnonymousAnalytics(syncer.Config.CommonConfig, "syncer-attio-finish", syncer.name()) -} - -func (syncer *Syncer) WriteToIceberg(object string, cappedBuffer *common.CappedBuffer) { - icebergSchemaTable := common.IcebergSchemaTable{Schema: syncer.Config.DestinationSchemaName, Table: object} - icebergTable := common.NewIcebergTable(syncer.Config.CommonConfig, syncer.StorageS3, syncer.DuckdbClient, icebergSchemaTable) - icebergTable.ReplaceWith(func(syncingIcebergTable *common.IcebergTable) { - var icebergSchemaColumns []*common.IcebergSchemaColumn - - switch object { - case ATTIO_OBJECT_COMPANIES: - icebergSchemaColumns = CompaniesIcebergSchemaColumns(syncer.Config.CommonConfig) - case ATTIO_OBJECT_DEALS: - icebergSchemaColumns = DealsIcebergSchemaColumns(syncer.Config.CommonConfig) - case ATTIO_OBJECT_PEOPLE: - icebergSchemaColumns = PeopleIcebergSchemaColumns(syncer.Config.CommonConfig) - default: - common.Panic(syncer.Config.CommonConfig, "Unknown object: "+object) - } - - // Read from cappedBuffer and write to Iceberg - icebergTableWriter := common.NewIcebergTableWriter(syncer.Config.CommonConfig, syncer.StorageS3, syncer.DuckdbClient, syncingIcebergTable, icebergSchemaColumns, 1) - icebergTableWriter.InsertFromJsonCappedBuffer(cappedBuffer) - }) -} - -func (syncer *Syncer) name() string { - return syncer.Config.ApiAccessToken[:5] + "..." -} diff --git a/src/syncer-attio/main.go b/src/syncer-attio/main.go deleted file mode 100644 index aae97b4..0000000 --- a/src/syncer-attio/main.go +++ /dev/null @@ -1,20 +0,0 @@ -package main - -import ( - "github.com/BemiHQ/BemiDB/src/common" - "github.com/BemiHQ/BemiDB/src/syncer-attio/lib" -) - -func init() { - attio.RegisterFlags() -} - -func main() { - config := attio.LoadConfig() - defer common.HandleUnexpectedPanic(config.CommonConfig) - - storageS3 := common.NewStorageS3(config.CommonConfig) - duckdbClient := common.NewDuckdbClient(config.CommonConfig, common.SYNCER_DUCKDB_BOOT_QUERIES) - syncer := attio.NewSyncer(config, storageS3, duckdbClient) - syncer.Sync() -} diff --git a/src/syncer-dialpad/go.mod b/src/syncer-dialpad/go.mod deleted file mode 100644 index 6817158..0000000 --- a/src/syncer-dialpad/go.mod +++ /dev/null @@ -1,72 +0,0 @@ -module github.com/BemiHQ/BemiDB/src/syncer-dialpad - -go 1.24.4 - -require ( - github.com/BemiHQ/BemiDB/src/common v0.0.0-00010101000000-000000000000 - github.com/BemiHQ/BemiDB/src/syncer-dialpad/lib v0.0.0-00010101000000-000000000000 -) - -replace github.com/BemiHQ/BemiDB/src/common => ../common - -replace github.com/BemiHQ/BemiDB/src/syncer-dialpad/lib => ./lib - -require ( - github.com/apache/arrow-go/v18 v18.4.0 // indirect - github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 // indirect - github.com/apache/thrift v0.22.0 // indirect - github.com/aws/aws-sdk-go-v2 v1.37.0 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 // indirect - github.com/aws/aws-sdk-go-v2/config v1.30.1 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.18.1 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0 // indirect - github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.26.0 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.35.0 // indirect - github.com/aws/smithy-go v1.22.5 // indirect - github.com/duckdb/duckdb-go-bindings v0.1.16 // indirect - github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11 // indirect - github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11 // indirect - github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11 // indirect - github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11 // indirect - github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11 // indirect - github.com/go-viper/mapstructure/v2 v2.3.0 // indirect - github.com/goccy/go-json v0.10.5 // indirect - github.com/golang/snappy v1.0.0 // indirect - github.com/google/flatbuffers v25.2.10+incompatible // indirect - github.com/google/uuid v1.6.0 // indirect - github.com/jackc/pgpassfile v1.0.0 // indirect - github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect - github.com/jackc/pgx/v5 v5.7.5 // indirect - github.com/klauspost/compress v1.18.0 // indirect - github.com/klauspost/cpuid/v2 v2.2.11 // indirect - github.com/linkedin/goavro v2.1.0+incompatible // indirect - github.com/marcboeker/go-duckdb/arrowmapping v0.0.9 // indirect - github.com/marcboeker/go-duckdb/mapping v0.0.10 // indirect - github.com/marcboeker/go-duckdb/v2 v2.3.2 // indirect - github.com/nats-io/nats.go v1.47.0 // indirect - github.com/nats-io/nkeys v0.4.11 // indirect - github.com/nats-io/nuid v1.0.1 // indirect - github.com/pierrec/lz4/v4 v4.1.22 // indirect - github.com/xitongsys/parquet-go v1.6.2 // indirect - github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b // indirect - github.com/zeebo/xxh3 v1.0.2 // indirect - golang.org/x/crypto v0.37.0 // indirect - golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect - golang.org/x/mod v0.25.0 // indirect - golang.org/x/sync v0.15.0 // indirect - golang.org/x/sys v0.33.0 // indirect - golang.org/x/text v0.26.0 // indirect - golang.org/x/tools v0.34.0 // indirect - golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect -) diff --git a/src/syncer-dialpad/go.sum b/src/syncer-dialpad/go.sum deleted file mode 100644 index eedb340..0000000 --- a/src/syncer-dialpad/go.sum +++ /dev/null @@ -1,1166 +0,0 @@ -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.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.66.0/go.mod h1:dgqGAjKCDxyhGTtC9dAREQGUJpkceNm1yt590Qno0Ko= -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.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.82.0/go.mod h1:vlKccHJGuFBFufnAnuB08dfEH9Y3H7dzDzRECFdC2TA= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= -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 v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.2.0/go.mod h1:xlogom/6gr8RJGBe7nT2eGsQYAFUbbv8dbC29qE3Xmw= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -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/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= -cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= -cloud.google.com/go/iam v0.1.1/go.mod h1:CKqrcnI/suGpybEHxZ7BMehL0oA4LpdyJdUlTl9jVMw= -cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= -cloud.google.com/go/kms v1.1.0/go.mod h1:WdbppnCDMDpOvoYBMn1+gNmOeEoZYqAv+HeuKARGCXI= -cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= -cloud.google.com/go/monitoring v1.1.0/go.mod h1:L81pzz7HKn14QCMaCs6NTQkdBnE87TElyanS95vIcl4= -cloud.google.com/go/monitoring v1.4.0/go.mod h1:y6xnxfwI3hTFWOdkOaD7nfJVlwuC3/mS/5kvtT131p4= -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/pubsub v1.19.0/go.mod h1:/O9kmSe9bb9KRnIAWkzmqhPjHo6LtzGOBYd/kr06XSs= -cloud.google.com/go/secretmanager v1.3.0/go.mod h1:+oLTkouyiYiabAQNugCeTS3PAArGiMJuBqvJnJsyH+U= -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.12.0/go.mod h1:fFLk2dp2oAhDz8QFKwqrjdJvxSp/W2g7nillojlL5Ho= -cloud.google.com/go/storage v1.21.0/go.mod h1:XmRlxkgPjlBONznT2dDUU/5XlpU2OjMnKuqnZI01LAA= -cloud.google.com/go/trace v1.0.0/go.mod h1:4iErSByzxkyHWzzlAj63/Gmjz0NH1ASqhJguHpGcr6A= -cloud.google.com/go/trace v1.2.0/go.mod h1:Wc8y/uYyOhPy12KEnXG9XGrvfMz5F5SrYecQlbW1rwM= -contrib.go.opencensus.io/exporter/aws v0.0.0-20200617204711-c478e41e60e9/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= -contrib.go.opencensus.io/exporter/stackdriver v0.13.10/go.mod h1:I5htMbyta491eUxufwwZPQdcKvvgzMB4O9ni41YnIM8= -contrib.go.opencensus.io/integrations/ocsql v0.1.7/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/azure-amqp-common-go/v3 v3.2.1/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= -github.com/Azure/azure-amqp-common-go/v3 v3.2.2/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= -github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k= -github.com/Azure/azure-sdk-for-go v51.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v59.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.0.0/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.0.0/go.mod h1:+6sju8gk8FRmSajX3Oz4G5Gm7P+mbqE9FVaXXFYTkCM= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U= -github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.0.0/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.0.0/go.mod h1:ceIuwmxDWptoW3eCqSXlnPsZFKh4X+R38dWPv7GS9Vs= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.0.0/go.mod h1:s1tW/At+xHqjNFvWU4G0c0Qv33KOhvbGNj0RCTQDV8s= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.2.0/go.mod h1:c+Lifp3EDEamAkPVzMooRNOK6CZjNSdEnf1A7jsI9u4= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.1.0/go.mod h1:7QJP7dr2wznCMeqIrhMgWGf7XpAQnVrJqDm9nvV3Cu4= -github.com/Azure/azure-service-bus-go v0.11.5/go.mod h1:MI6ge2CuQWBVq+ly456MY7XqNLJip5LO1iSFodbNLbU= -github.com/Azure/azure-storage-blob-go v0.14.0/go.mod h1:SMqIBi+SuiQH32bvyjngEewEeXoPfKMgWlBDaYf6fck= -github.com/Azure/go-amqp v0.16.0/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= -github.com/Azure/go-amqp v0.16.4/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest v0.11.19/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest v0.11.22/go.mod h1:BAWYUWGPEtKPzjVkp0Q6an0MJcJDsoh5Z1BFAEFs4Xs= -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/adal v0.9.14/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/adal v0.9.17/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= -github.com/Azure/go-autorest/autorest/azure/auth v0.5.9/go.mod h1:hg3/1yw0Bq87O3KvvnJoAh34/0zbP7SFizX/qN5JvjU= -github.com/Azure/go-autorest/autorest/azure/cli v0.4.2/go.mod h1:7qkJkT+j6b+hIpzMOwPChJhTqS8VbsqqgULzMNRugoM= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= -github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/AzureAD/microsoft-authentication-library-for-go v0.4.0/go.mod h1:Vt9sXTKwMyGcOxSmLDMnGPgqsUg7m8pe215qMLrDXw4= -github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/GoogleCloudPlatform/cloudsql-proxy v1.29.0/go.mod h1:spvB9eLJH9dutlbPSRmHvSXXHOwGRyeXh1jVdquA2G8= -github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= -github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/apache/arrow-go/v18 v18.4.0 h1:/RvkGqH517iY8bZKc4FD5/kkdwXJGjxf28JIXbJ/oB0= -github.com/apache/arrow-go/v18 v18.4.0/go.mod h1:Aawvwhj8x2jURIzD9Moy72cF0FyJXOpkYpdmGRHcw14= -github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 h1:byKBBF2CKWBjjA4J1ZL2JXttJULvWSl50LegTyRZ728= -github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516/go.mod h1:QNYViu/X0HXDHw7m3KXzWSVXIbfUvJqBFe6Gj8/pYA0= -github.com/apache/thrift v0.0.0-20181112125854-24918abba929/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.14.2/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.22.0 h1:r7mTJdj51TMDe6RtcmNdQxgn9XcyfGDOzegMDRg47uc= -github.com/apache/thrift v0.22.0/go.mod h1:1e7J/O1Ae6ZQMTYdy9xa3w9k+XHWPfRvdPyJeynQ+/g= -github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= -github.com/aws/aws-sdk-go v1.30.19/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= -github.com/aws/aws-sdk-go v1.37.0/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go v1.43.31 h1:yJZIr8nMV1hXjAvvOLUFqZRJcHV7udPQBfhJqawDzI0= -github.com/aws/aws-sdk-go v1.43.31/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= -github.com/aws/aws-sdk-go-v2 v1.16.2/go.mod h1:ytwTPBG6fXTZLxxeeCCWj2/EMYp/xDUgX+OET6TLNNU= -github.com/aws/aws-sdk-go-v2 v1.23.0/go.mod h1:i1XDttT4rnf6vxc9AuskLc6s7XBee8rlLilKlc03uAA= -github.com/aws/aws-sdk-go-v2 v1.37.0 h1:YtCOESR/pN4j5oA7cVHSfOwIcuh/KwHC4DOSXFbv5F0= -github.com/aws/aws-sdk-go-v2 v1.37.0/go.mod h1:9Q0OoGQoboYIAJyslFyF1f5K1Ryddop8gqMhWx/n4Wg= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.1/go.mod h1:n8Bs1ElDD2wJ9kCRTczA83gYbBmjSwZp3umc6zF4EeM= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.1/go.mod h1:t8PYl/6LzdAqsU4/9tz28V/kU+asFePvpOMkdul0gEQ= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 h1:6GMWV6CNpA/6fbFHnoAjrv4+LGfyTqZz2LtCHnspgDg= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0/go.mod h1:/mXlTIVG9jbxkqDnr5UQNQxW1HRYxeGklkM9vAFeabg= -github.com/aws/aws-sdk-go-v2/config v1.15.3/go.mod h1:9YL3v07Xc/ohTsxFXzan9ZpFpdTOFl4X65BAKYaz8jg= -github.com/aws/aws-sdk-go-v2/config v1.25.3/go.mod h1:tAByZy03nH5jcq0vZmkcVoo6tRzRHEwSFx3QW4NmDw8= -github.com/aws/aws-sdk-go-v2/config v1.30.1 h1:sHL8g/+9tcZATeV2tEkEfxZeaNokDtKsSjGMGHD49qA= -github.com/aws/aws-sdk-go-v2/config v1.30.1/go.mod h1:wkibEyFfxXRyTSzRU4bbF5IUsSXyE4xQ4ZjkGmi5tFo= -github.com/aws/aws-sdk-go-v2/credentials v1.11.2/go.mod h1:j8YsY9TXTm31k4eFhspiQicfXPLZ0gYXA50i4gxPE8g= -github.com/aws/aws-sdk-go-v2/credentials v1.16.2/go.mod h1:sDdvGhXrSVT5yzBDR7qXz+rhbpiMpUYfF3vJ01QSdrc= -github.com/aws/aws-sdk-go-v2/credentials v1.18.1 h1:E55xvOqlX7CvB66Z7rSM9usCrFU1ryUIUHqiXsEzVoE= -github.com/aws/aws-sdk-go-v2/credentials v1.18.1/go.mod h1:iobSQfR5MkvILxssGOvi/P1jjOhrRzfTiCPCzku0vx4= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.3/go.mod h1:uk1vhHHERfSVCUnqSqz8O48LBYDSC+k6brng09jcMOk= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.4/go.mod h1:t4i+yGHMCcUNIX1x7YVYa6bH/Do7civ5I6cG/6PMfyA= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0 h1:9sBTeKQwAvmJUWKIACIoiFSnxxl+sS++YDfr17/ngq0= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0/go.mod h1:LW9/PxQD1SYFC7pnWcgqPhoyZprhjEdg5hBK6qYPLW8= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.3/go.mod h1:0dHuD2HZZSiwfJSy1FO5bX1hQ1TxVV1QXXjpn3XUE44= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.14.0/go.mod h1:UcgIwJ9KHquYxs6Q5skC9qXjhYMK+JASDYcXQ4X7JZE= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1 h1:aAjA/1JZ1xH/F9XvxJu9cXZyp7BqVXtHpztyZ6p799E= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1/go.mod h1:ia9HASsPba/7o84sp6iE4wZPdNTJ0oicBe5sWQQk+Ys= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.9/go.mod h1:AnVH5pvai0pAF4lXRq0bmhbes1u9R8wTE+g+183bZNM= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.3/go.mod h1:7sGSz1JCKHWWBHq98m6sMtWQikmYPpxjqOydDemiVoM= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0 h1:H2iZoqW/v2Jnrh1FnU725Bq6KJ0k2uP63yH+DcY+HUI= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0/go.mod h1:L0FqLbwMXHvNC/7crWV1iIxUlOKYZUE8KuTIA+TozAI= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.3/go.mod h1:ssOhaLpRlh88H3UmEcsBoVKq309quMvm3Ds8e9d4eJM= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.3/go.mod h1:ify42Rb7nKeDDPkFjKn7q1bPscVPu/+gmHH8d2c+anU= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0 h1:EDped/rNzAhFPhVY0sDGbtD16OKqksfA8OjF/kLEgw8= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0/go.mod h1:uUI335jvzpZRPpjYx6ODc/wg1qH+NnoSTK/FwVeK0C0= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.10/go.mod h1:8DcYQcz0+ZJaSxANlHIsbbi6S+zMwjwdDqwW3r9AzaE= -github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.3/go.mod h1:5yzAuE9i2RkVAttBl8yxZgQr5OCq4D5yDnG7j9x2L0U= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0 h1:iLvW/zOkHGU3BDU5thWnj+UZ9pjhuVhv1loLj7yVtBw= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0/go.mod h1:Fn3gvhdF1x5Rs9nUoCy/fJT1ms8f8dO7RqM9lJHuazQ= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.1/go.mod h1:GeUru+8VzrTXV/83XyMJ80KpH8xO89VPoUileyNQ+tc= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1/go.mod h1:l9ymW25HOqymeU2m1gbUQ3rUIsTwKs8gYHXkqDQUhiI= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 h1:6+lZi2JeGKtCraAj1rpoZfKqnQ9SptseRZioejfUOLM= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0/go.mod h1:eb3gfbVIxIoGgJsi9pGne19dhCBpK6opTYpQqAmdy44= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.3/go.mod h1:Seb8KNmD6kVTjwRjVEgOT5hPin6sq+v4C2ycJQDwuH8= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.3/go.mod h1:R+/S1O4TYpcktbVwddeOYg+uwUfLhADP2S/x4QwsCTM= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0 h1:qGyLBQPphYzUf+IIlb5tHnvg1U2Vc5hXPcP7oRSQfy0= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0/go.mod h1:g+dzKSLXiR/8ATkPXmLhPOI6rDdjLP3tngeo3FvDcIw= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.3/go.mod h1:wlY6SVjuwvh3TVRpTqdy4I1JpBFLX4UGeKZdWntaocw= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.3/go.mod h1:Owv1I59vaghv1Ax8zz8ELY8DN7/Y0rGS+WWAmjgi950= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0 h1:eRhU3Sh8dGbaniI6B+I48XJMrTPRkK4DKo+vqIxziOU= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0/go.mod h1:paNLV18DZ6FnWE/bd06RIKPDIFpjuvCkGKWTG/GDBeM= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.3/go.mod h1:Bm/v2IaN6rZ+Op7zX+bOUMdL4fsrYZiD0dsjLhNKwZc= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.3/go.mod h1:KZgs2ny8HsxRIRbDwgvJcHHBZPOzQr/+NtGwnP+w2ec= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0 h1:6jusT+XCcvnD+Elxvm7bUf5sCMTpZEp3AKjYQ4tWJSo= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0/go.mod h1:LimGpdIF/sTBdgqwOEkrArXLCoTamK/9L9x8IKBFTIc= -github.com/aws/aws-sdk-go-v2/service/kms v1.16.3/go.mod h1:QuiHPBqlOFCi4LqdSskYYAWpQlx3PKmohy+rE2F+o5g= -github.com/aws/aws-sdk-go-v2/service/s3 v1.26.3/go.mod h1:g1qvDuRsJY+XghsV6zg00Z4KJ7DtFFCx8fJD2a491Ak= -github.com/aws/aws-sdk-go-v2/service/s3 v1.43.0/go.mod h1:NXRKkiRF+erX2hnybnVU660cYT5/KChRD4iUgJ97cI8= -github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0 h1:gAV4NEp4A+JOrIdoXkAeyy6IOo7+X2s/jRuaHKYiMaU= -github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0/go.mod h1:JIQwK8sZ5MuKGm5rrFwp9MHUcyYEsQNpVixuPDlnwaU= -github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.15.4/go.mod h1:PJc8s+lxyU8rrre0/4a0pn2wgwiDvOEzoOjcJUBr67o= -github.com/aws/aws-sdk-go-v2/service/sns v1.17.4/go.mod h1:kElt+uCcXxcqFyc+bQqZPFD9DME/eC6oHBXvFzQ9Bcw= -github.com/aws/aws-sdk-go-v2/service/sqs v1.18.3/go.mod h1:skmQo0UPvsjsuYYSYMVmrPc1HWCbHUJyrCEp+ZaLzqM= -github.com/aws/aws-sdk-go-v2/service/ssm v1.24.1/go.mod h1:NR/xoKjdbRJ+qx0pMR4mI+N/H1I1ynHwXnO6FowXJc0= -github.com/aws/aws-sdk-go-v2/service/sso v1.11.3/go.mod h1:7UQ/e69kU7LDPtY40OyoHYgRmgfGM4mgsLYtcObdveU= -github.com/aws/aws-sdk-go-v2/service/sso v1.17.2/go.mod h1:/pE21vno3q1h4bbhUOEi+6Zu/aT26UK2WKkDXd+TssQ= -github.com/aws/aws-sdk-go-v2/service/sso v1.26.0 h1:cuFWHH87GP1NBGXXfMicUbE7Oty5KpPxN6w4JpmuxYc= -github.com/aws/aws-sdk-go-v2/service/sso v1.26.0/go.mod h1:aJBemdlbCKyOXEXdXBqS7E+8S9XTDcOTaoOjtng54hA= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.20.0/go.mod h1:dWqm5G767qwKPuayKfzm4rjzFmVjiBFbOJrpSPnAMDs= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0 h1:t2va+wewPOYIqC6XyJ4MGjiGKkczMAPsgq5W4FtL9ME= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0/go.mod h1:ExCTcqYqN0hYYRsDlBVU8+68grqlWdgX9/nZJwQW4aY= -github.com/aws/aws-sdk-go-v2/service/sts v1.16.3/go.mod h1:bfBj0iVmsUyUg4weDB4NxktD9rDGeKSVWnjTnwbx9b8= -github.com/aws/aws-sdk-go-v2/service/sts v1.25.3/go.mod h1:4EqRHDCKP78hq3zOnmFXu5k0j4bXbRFfCh/zQ6KnEfQ= -github.com/aws/aws-sdk-go-v2/service/sts v1.35.0 h1:FD9agdG4CeOGS3ORLByJk56YIXDS7mxFpmZyCtpqExc= -github.com/aws/aws-sdk-go-v2/service/sts v1.35.0/go.mod h1:NDzDPbBF1xtSTZUMuZx0w3hIfWzcL7X2AQ0Tr9becIQ= -github.com/aws/smithy-go v1.11.2/go.mod h1:3xHYmszWVx2c0kIwQeEVf9uSm4fYZt67FBJnwub1bgM= -github.com/aws/smithy-go v1.17.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= -github.com/aws/smithy-go v1.22.5 h1:P9ATCXPMb2mPjYBgueqJNCA5S9UfktsW0tTxi+a7eqw= -github.com/aws/smithy-go v1.22.5/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/bobg/gcsobj v0.1.2/go.mod h1:vS49EQ1A1Ib8FgrL58C8xXYZyOCR2TgzAdopy6/ipa8= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -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/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/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= -github.com/colinmarc/hdfs/v2 v2.1.1/go.mod h1:M3x+k8UKKmxtFu++uAZ0OtDU8jR3jnaZIAc6yK4Ue0c= -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/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU= -github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= -github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= -github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= -github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= -github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/duckdb/duckdb-go-bindings v0.1.16 h1:XPCk9hzP06PoWIxDPVU3gAy0m1XmLaZHTzLggNx/U9k= -github.com/duckdb/duckdb-go-bindings v0.1.16/go.mod h1:pBnfviMzANT/9hi4bg+zW4ykRZZPCXlVuvBWEcZofkc= -github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11 h1:GXQkG4HmEbwPtqCSabJTp9wZQQ7Gqr3KveLNesQWQOs= -github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11/go.mod h1:Ezo7IbAfB8NP7CqPIN8XEHKUg5xdRRQhcPPlCXImXYA= -github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11 h1:ATJMSBIDA/YAm/6CKeBDRtGK1OOwqfTZbWg9Y5fAc9E= -github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11/go.mod h1:eS7m/mLnPQgVF4za1+xTyorKRBuK0/BA44Oy6DgrGXI= -github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11 h1:AjvnGst1avyOECYiykthyHR4DTYTaqNDPr5W/0t5j0k= -github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11/go.mod h1:1GOuk1PixiESxLaCGFhag+oFi7aP+9W8byymRAvunBk= -github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11 h1:j3B1biawuhtxe2Chkiqcwf1Kxe8VJc8lLVmjBIcJrkI= -github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11/go.mod h1:o7crKMpT2eOIi5/FY6HPqaXcvieeLSqdXXaXbruGX7w= -github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11 h1:xR3vRE8y+48U6xDNkUlOfbl7/OTA7FVcDXJ+5vETuHU= -github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11/go.mod h1:IlOhJdVKUJCAPj3QsDszUo8DVdvp1nBFp4TUJVdw99s= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -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/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= -github.com/gin-gonic/gin v1.7.3/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= -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-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= -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-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= -github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-viper/mapstructure/v2 v2.3.0 h1:27XbWsHIqhbdR5TIC911OfYvgSaW93HM+dX7970Q7jk= -github.com/go-viper/mapstructure/v2 v2.3.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= -github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= -github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.4.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= -github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188/go.mod h1:vXjM/+wXQnTPR4KqTKDgJukSZ6amVRtWMPEjE6sQoK8= -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/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/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -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.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= -github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -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/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/flatbuffers v25.2.10+incompatible h1:F3vclr7C3HpB1k9mxCGRMXq6FdUalZ6H/pNX4FP1v0Q= -github.com/google/flatbuffers v25.2.10+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -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.6/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.8/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/go-replayers/grpcreplay v1.1.0/go.mod h1:qzAvJ8/wi57zq7gWqaE6AwLM6miiXUQwP1S+I9icmhk= -github.com/google/go-replayers/httpreplay v1.1.1/go.mod h1:gN9GeLIs7l6NUoVaSSnv2RiqK1NiwAmD0MrKeC9IIks= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+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/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -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-20200905233945-acf8798be1f7/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-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210506205249-923b5ab0fc1a/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.2.0/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.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= -github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/wire v0.5.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU= -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.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hanwen/go-fuse v1.0.0/go.mod h1:unqXarDXqzAk0rt98O2tVndEPIpUgLD9+rwFisZH3Ok= -github.com/hanwen/go-fuse/v2 v2.1.0/go.mod h1:oRyA5eK+pvJyv5otpO/DgccS8y/RvYMaO00GgRLGryc= -github.com/hashicorp/go-uuid v0.0.0-20180228145832-27454136f036/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -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/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/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.11.0/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= -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/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.2.0/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-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= -github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/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.10.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.15.0/go.mod h1:D/zyOyXiaM1TmVWnOM18p0xdDtdakRBa0RsVGI3U3bw= -github.com/jackc/pgx/v5 v5.7.5 h1:JHGfMnQY+IEtGM63d+NGMjoRpysB2JBwDr5fsngwmJs= -github.com/jackc/pgx/v5 v5.7.5/go.mod h1:aruU7o91Tc2q2cFp5h4uP3f6ztExVpyVv88Xl/8Vl8M= -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.2.1 h1:gI8os0wpRXFd4FiAY2dWiqRK037tjj3t7rKFeO4X5iw= -github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= -github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= -github.com/jcmturner/gofork v0.0.0-20180107083740-2aebee971930/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= -github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= -github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -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/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= -github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= -github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.13.1/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= -github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= -github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= -github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= -github.com/klauspost/cpuid/v2 v2.2.11 h1:0OwqZRYI2rFrjS4kvkDnqJkKHdHaRnCm68/DY4OxRzU= -github.com/klauspost/cpuid/v2 v2.2.11/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= -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/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -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/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -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.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/linkedin/goavro v2.1.0+incompatible h1:DV2aUlj2xZiuxQyvag8Dy7zjY69ENjS66bWkSfdpddY= -github.com/linkedin/goavro v2.1.0+incompatible/go.mod h1:bBCwI2eGYpUI/4820s67MElg9tdeLbINjLjiM2xZFYM= -github.com/marcboeker/go-duckdb/arrowmapping v0.0.9 h1:xj+kFOqR2gH3Mcxx9LmAVHebSnCiPm303N+uxfkWVmY= -github.com/marcboeker/go-duckdb/arrowmapping v0.0.9/go.mod h1:o56AqVS90v5bpxhPnOK9La7AfNTOrMORiqTQrlRbdPQ= -github.com/marcboeker/go-duckdb/mapping v0.0.10 h1:b/y2W8/hNlD0Dwjq0mCqIlLXpjQMnWy0WqDV9b9lHQQ= -github.com/marcboeker/go-duckdb/mapping v0.0.10/go.mod h1:Ro6Tw6sGG50O8S0daZsA8TrQJz/DvGrzGvMD7Jihirw= -github.com/marcboeker/go-duckdb/v2 v2.3.2 h1:96zG2JPyIhCFjHdBjjSpOdhzJzehoGTdl7LskkuMUTs= -github.com/marcboeker/go-duckdb/v2 v2.3.2/go.mod h1:VeXz9ZM6klNvICHrXEUzaHSgNqBeTdyMxr4CICw/UaY= -github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= -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.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs= -github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= -github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI= -github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= -github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= -github.com/minio/minio-go/v7 v7.0.34/go.mod h1:nCrRzjoSUQh8hgKKtu3Y708OLvRLtuASMg2/nvmbarw= -github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= -github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= -github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= -github.com/nats-io/nats.go v1.47.0 h1:YQdADw6J/UfGUd2Oy6tn4Hq6YHxCaJrVKayxxFqYrgM= -github.com/nats-io/nats.go v1.47.0/go.mod h1:iRWIPokVIFbVijxuMQq4y9ttaBTMe0SFdlZfMDd+33g= -github.com/nats-io/nkeys v0.4.11 h1:q44qGV008kYd9W1b1nEBkNzvnWxtRSQ7A8BoqRrcfa0= -github.com/nats-io/nkeys v0.4.11/go.mod h1:szDimtgmfOi9n25JpfIdGw12tZFYXqhGxjhVxsatHVE= -github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= -github.com/ncw/swift v1.0.52/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -github.com/pborman/getopt v0.0.0-20180729010549-6fdd0a2c7117/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= -github.com/pierrec/lz4/v4 v4.1.8/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= -github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= -github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= -github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= -github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -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/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -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/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.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -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/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -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.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -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.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/xitongsys/parquet-go v1.5.1/go.mod h1:xUxwM8ELydxh4edHGegYq1pA8NnMKDx0K/GyB0o2bww= -github.com/xitongsys/parquet-go v1.6.2 h1:MhCaXii4eqceKPu9BwrjLqyK10oX9WF+xGhwvwbw7xM= -github.com/xitongsys/parquet-go v1.6.2/go.mod h1:IulAQyalCm0rPiZVNnCgm/PCL64X2tdSVGMQ/UeKqWA= -github.com/xitongsys/parquet-go-source v0.0.0-20190524061010-2b72cbee77d5/go.mod h1:xxCx7Wpym/3QCo6JhujJX51dzSXrwmb0oH6FQb39SEA= -github.com/xitongsys/parquet-go-source v0.0.0-20200817004010-026bad9b25d0/go.mod h1:HYhIKsdns7xz80OgkbgJYrtQY7FjHWHKH6cvN7+czGE= -github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b h1:zbb5qM/t3N+O33Vp5sFyG6yIcWZV1q7rfEjJM8UsRBQ= -github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b/go.mod h1:2ActxmJ4q17Cdruar9nKEkzKSOL1Ol03737Bkz10rTY= -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.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= -github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= -github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= -github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= -github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= -go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0= -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.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -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/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -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.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= -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.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= -gocloud.dev v0.26.0/go.mod h1:mkUgejbnbLotorqDyvedJO20XcZNTynmSeVSQS9btVg= -golang.org/x/crypto v0.0.0-20180723164146-c126467f60eb/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -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-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/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-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-20211115234514-b4de73f9ece8/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220511200225-c6db032c6c88/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= -golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= -golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= -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-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= -golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= -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/lint v0.0.0-20210508222113-6edffad5e616/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.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w= -golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= -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-20191112182307-2180aed22343/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-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -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-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211020060615-d418f374d309/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220401154927-543a649e0bdd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -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.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -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.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -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-20210220032951-036812b2e83c/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.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= -golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= -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-20191112214154-59a1497f0cea/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-20200828194041-157a740278f4/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-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/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-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/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-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220204135822-1c1b9b1eba6a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220330033206-e17cdc41300f/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-20220704084225-05e143d24a9e/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.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= -golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -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/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -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.5/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.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= -golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= -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/time v0.0.0-20211116232009-f0f3c7e86c11/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220224211638-0e9765cccd65/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-20190422233926-fe54fb35175b/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-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-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-20200828161849-5deb26317202/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20200915173823-2db8f0ff891c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20200918232735-d647fc253266/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -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.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo= -golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg= -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= -golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= -golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= -gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= -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.31.0/go.mod h1:CL+9IBCa2WWU6gRuBWaKqGWLFFwbEUXkfeMkHLQWYWo= -google.golang.org/api v0.32.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -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.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.46.0/go.mod h1:ceL4oozhkAiTID8XMmJBsIxID/9wMXJVVFXPg4ylg3I= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.58.0/go.mod h1:cAbP2FsxoGVNwtgNAmmn3y5G1TWAiVYRmg4yku3lv+E= -google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.64.0/go.mod h1:931CdxA8Rm4t6zqTFGSsgwbAEZ2+GMYurbndwSimebM= -google.golang.org/api v0.66.0/go.mod h1:I1dmXYpX7HGwz/ejRxwQp2qj5bFAz93HiCU1C1oYd9M= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.68.0/go.mod h1:sOM8pTpwgflXRhz+oC8H2Dr+UcbMqkPPWNJo88Q7TH8= -google.golang.org/api v0.69.0/go.mod h1:boanBiw+h5c3s+tBPgEzLDRHfFLWV0qXxRHz3ws7C80= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -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/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-20200513103714-09dca8ec2884/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-20200831141814-d751682dd103/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-20200914193844-75d14daec038/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200921151605-7abf4a1a14d5/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-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210429181445-86c259c2b4ab/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210517163617-5e0236093d7a/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210921142501-181ce0d877f6/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211018162055-cf77aa76bad2/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211223182754-3ac035c7e7cb/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220111164026-67b88f271998/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220114231437-d2e6a121cae0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220201184016-50beb8ab5c44/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220204002441-d6cc3cc0770e/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220211171837-173942840c17/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220216160803-4663080d8bc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220401170504-314d38edb7de/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -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.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -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.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= -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.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -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-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= -gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= -gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q= -gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mNfM5bm88whjWx4= -gopkg.in/jcmturner/gokrb5.v7 v7.3.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= -gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8= -gopkg.in/linkedin/goavro.v1 v1.0.5 h1:BJa69CDh0awSsLUmZ9+BowBdokpduDZSM9Zk8oKHfN4= -gopkg.in/linkedin/goavro.v1 v1.0.5/go.mod h1:Aw5GdAbizjOEl0kAMHV9iHmA8reZzW/OKuJAl4Hb9F0= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/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/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= -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= -nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= -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/src/syncer-dialpad/lib/config.go b/src/syncer-dialpad/lib/config.go deleted file mode 100644 index 6adc7f3..0000000 --- a/src/syncer-dialpad/lib/config.go +++ /dev/null @@ -1,116 +0,0 @@ -package dialpad - -import ( - "flag" - "os" - "slices" - "strings" - - "github.com/BemiHQ/BemiDB/src/common" -) - -const ( - ENV_DESTINATION_SCHEMA_NAME = "DESTINATION_SCHEMA_NAME" - - ENV_NATS_URL = "NATS_URL" - ENV_NATS_STREAM = "NATS_JETSTREAM_STREAM" - ENV_NATS_SUBJECT = "NATS_JETSTREAM_SUBJECT" - ENV_NATS_CONSUMER_NAME = "NATS_JETSTREAM_CONSUMER_NAME" - ENV_NATS_FETCH_TIMEOUT_SECONDS = "NATS_FETCH_TIMEOUT_SECONDS" - - DEFAULT_NATS_FETCH_TIMEOUT_SECONDS = 30 -) - -type NatsConfig struct { - Url string - Stream string - Subject string - ConsumerName string - FetchTimeoutSeconds int -} - -type Config struct { - CommonConfig *common.CommonConfig - DestinationSchemaName string - Nats NatsConfig -} - -var _config Config - -func RegisterFlags() { - _config.CommonConfig = &common.CommonConfig{} - - flag.StringVar(&_config.CommonConfig.LogLevel, "log-level", os.Getenv(common.ENV_LOG_LEVEL), `Log level: "ERROR", "WARN", "INFO", "DEBUG", "TRACE". Default: "`+common.DEFAULT_LOG_LEVEL+`"`) - flag.StringVar(&_config.CommonConfig.CatalogDatabaseUrl, "catalog-database-url", os.Getenv(common.ENV_CATALOG_DATABASE_URL), "Catalog database URL") - flag.StringVar(&_config.CommonConfig.Aws.Region, "aws-region", os.Getenv(common.ENV_AWS_REGION), "AWS region") - flag.StringVar(&_config.CommonConfig.Aws.S3Endpoint, "aws-s3-endpoint", os.Getenv(common.ENV_AWS_S3_ENDPOINT), "AWS S3 endpoint. Default: \""+common.DEFAULT_AWS_S3_ENDPOINT+`"`) - flag.StringVar(&_config.CommonConfig.Aws.S3Bucket, "aws-s3-bucket", os.Getenv(common.ENV_AWS_S3_BUCKET), "AWS S3 bucket name") - flag.StringVar(&_config.CommonConfig.Aws.AccessKeyId, "aws-access-key-id", os.Getenv(common.ENV_AWS_ACCESS_KEY_ID), "AWS access key ID") - flag.StringVar(&_config.CommonConfig.Aws.SecretAccessKey, "aws-secret-access-key", os.Getenv(common.ENV_AWS_SECRET_ACCESS_KEY), "AWS secret access key") - flag.BoolVar(&_config.CommonConfig.DisableAnonymousAnalytics, "disable-anonymous-analytics", os.Getenv(common.ENV_DISABLE_ANONYMOUS_ANALYTICS) == "true", "Disable anonymous analytics collection") - - flag.StringVar(&_config.DestinationSchemaName, "destination-schema-name", os.Getenv(ENV_DESTINATION_SCHEMA_NAME), "Destination schema name to store the synced data") - - flag.StringVar(&_config.Nats.Url, "nats-url", os.Getenv(ENV_NATS_URL), "NATS URL") - flag.StringVar(&_config.Nats.Stream, "nats-stream", os.Getenv(ENV_NATS_STREAM), "NATS stream to read from") - flag.StringVar(&_config.Nats.Subject, "nats-subject", os.Getenv(ENV_NATS_SUBJECT), "NATS subject to read from") - flag.StringVar(&_config.Nats.ConsumerName, "nats-consumer-name", os.Getenv(ENV_NATS_CONSUMER_NAME), "NATS consumer name for the JetStream consumer") - flag.IntVar(&_config.Nats.FetchTimeoutSeconds, "nats-fetch-timeout-seconds", DEFAULT_NATS_FETCH_TIMEOUT_SECONDS, "NATS fetch timeout in seconds") - fetchTimeoutSeconds := os.Getenv(ENV_NATS_FETCH_TIMEOUT_SECONDS) - if fetchTimeoutSeconds != "" { - _config.Nats.FetchTimeoutSeconds = common.StringToInt(fetchTimeoutSeconds) - } -} - -func LoadConfig() *Config { - parseFlags() - return &_config -} - -func parseFlags() { - flag.Parse() - - if _config.CommonConfig.LogLevel == "" { - _config.CommonConfig.LogLevel = common.DEFAULT_LOG_LEVEL - } else if !slices.Contains(common.LOG_LEVELS, _config.CommonConfig.LogLevel) { - panic("Invalid log level " + _config.CommonConfig.LogLevel + ". Must be one of " + strings.Join(common.LOG_LEVELS, ", ")) - } - if _config.CommonConfig.CatalogDatabaseUrl == "" { - panic("Catalog database URL is required") - } - if _config.CommonConfig.Aws.Region == "" { - panic("AWS region is required") - } - if _config.CommonConfig.Aws.S3Endpoint == "" { - _config.CommonConfig.Aws.S3Endpoint = common.DEFAULT_AWS_S3_ENDPOINT - } - if _config.CommonConfig.Aws.S3Bucket == "" { - panic("AWS S3 bucket name is required") - } - if _config.CommonConfig.Aws.AccessKeyId != "" && _config.CommonConfig.Aws.SecretAccessKey == "" { - panic("AWS secret access key is required") - } - if _config.CommonConfig.Aws.AccessKeyId == "" && _config.CommonConfig.Aws.SecretAccessKey != "" { - panic("AWS access key ID is required") - } - - if _config.DestinationSchemaName == "" { - panic("Destination schema name is required") - } - - if _config.Nats.Url == "" { - panic("NATS URL is required") - } - if _config.Nats.Stream == "" { - panic("NATS stream is required") - } - if _config.Nats.Subject == "" { - panic("NATS subject is required") - } - if _config.Nats.ConsumerName == "" { - panic("NATS consumer name is required") - } - if _config.Nats.FetchTimeoutSeconds <= 0 { - panic("NATS fetch timeout must be greater than 0") - } -} diff --git a/src/syncer-dialpad/lib/go.mod b/src/syncer-dialpad/lib/go.mod deleted file mode 100644 index d510090..0000000 --- a/src/syncer-dialpad/lib/go.mod +++ /dev/null @@ -1,69 +0,0 @@ -module github.com/BemiHQ/BemiDB/src/syncer-dialpad/lib - -go 1.24.4 - -require ( - github.com/BemiHQ/BemiDB/src/common v0.0.0-00010101000000-000000000000 - github.com/nats-io/nats.go v1.47.0 -) - -replace github.com/BemiHQ/BemiDB/src/common => ../../common - -require ( - github.com/apache/arrow-go/v18 v18.4.0 // indirect - github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 // indirect - github.com/apache/thrift v0.22.0 // indirect - github.com/aws/aws-sdk-go-v2 v1.37.0 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 // indirect - github.com/aws/aws-sdk-go-v2/config v1.30.1 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.18.1 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0 // indirect - github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.26.0 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.35.0 // indirect - github.com/aws/smithy-go v1.22.5 // indirect - github.com/duckdb/duckdb-go-bindings v0.1.16 // indirect - github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11 // indirect - github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11 // indirect - github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11 // indirect - github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11 // indirect - github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11 // indirect - github.com/go-viper/mapstructure/v2 v2.3.0 // indirect - github.com/goccy/go-json v0.10.5 // indirect - github.com/golang/snappy v1.0.0 // indirect - github.com/google/flatbuffers v25.2.10+incompatible // indirect - github.com/google/uuid v1.6.0 // indirect - github.com/jackc/pgpassfile v1.0.0 // indirect - github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect - github.com/jackc/pgx/v5 v5.7.5 // indirect - github.com/klauspost/compress v1.18.0 // indirect - github.com/klauspost/cpuid/v2 v2.2.11 // indirect - github.com/linkedin/goavro v2.1.0+incompatible // indirect - github.com/marcboeker/go-duckdb/arrowmapping v0.0.9 // indirect - github.com/marcboeker/go-duckdb/mapping v0.0.10 // indirect - github.com/marcboeker/go-duckdb/v2 v2.3.2 // indirect - github.com/nats-io/nkeys v0.4.11 // indirect - github.com/nats-io/nuid v1.0.1 // indirect - github.com/pierrec/lz4/v4 v4.1.22 // indirect - github.com/xitongsys/parquet-go v1.6.2 // indirect - github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b // indirect - github.com/zeebo/xxh3 v1.0.2 // indirect - golang.org/x/crypto v0.37.0 // indirect - golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect - golang.org/x/mod v0.25.0 // indirect - golang.org/x/sync v0.15.0 // indirect - golang.org/x/sys v0.33.0 // indirect - golang.org/x/text v0.26.0 // indirect - golang.org/x/tools v0.34.0 // indirect - golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect -) diff --git a/src/syncer-dialpad/lib/go.sum b/src/syncer-dialpad/lib/go.sum deleted file mode 100644 index eedb340..0000000 --- a/src/syncer-dialpad/lib/go.sum +++ /dev/null @@ -1,1166 +0,0 @@ -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.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.66.0/go.mod h1:dgqGAjKCDxyhGTtC9dAREQGUJpkceNm1yt590Qno0Ko= -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.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.82.0/go.mod h1:vlKccHJGuFBFufnAnuB08dfEH9Y3H7dzDzRECFdC2TA= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= -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 v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.2.0/go.mod h1:xlogom/6gr8RJGBe7nT2eGsQYAFUbbv8dbC29qE3Xmw= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -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/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= -cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= -cloud.google.com/go/iam v0.1.1/go.mod h1:CKqrcnI/suGpybEHxZ7BMehL0oA4LpdyJdUlTl9jVMw= -cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= -cloud.google.com/go/kms v1.1.0/go.mod h1:WdbppnCDMDpOvoYBMn1+gNmOeEoZYqAv+HeuKARGCXI= -cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= -cloud.google.com/go/monitoring v1.1.0/go.mod h1:L81pzz7HKn14QCMaCs6NTQkdBnE87TElyanS95vIcl4= -cloud.google.com/go/monitoring v1.4.0/go.mod h1:y6xnxfwI3hTFWOdkOaD7nfJVlwuC3/mS/5kvtT131p4= -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/pubsub v1.19.0/go.mod h1:/O9kmSe9bb9KRnIAWkzmqhPjHo6LtzGOBYd/kr06XSs= -cloud.google.com/go/secretmanager v1.3.0/go.mod h1:+oLTkouyiYiabAQNugCeTS3PAArGiMJuBqvJnJsyH+U= -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.12.0/go.mod h1:fFLk2dp2oAhDz8QFKwqrjdJvxSp/W2g7nillojlL5Ho= -cloud.google.com/go/storage v1.21.0/go.mod h1:XmRlxkgPjlBONznT2dDUU/5XlpU2OjMnKuqnZI01LAA= -cloud.google.com/go/trace v1.0.0/go.mod h1:4iErSByzxkyHWzzlAj63/Gmjz0NH1ASqhJguHpGcr6A= -cloud.google.com/go/trace v1.2.0/go.mod h1:Wc8y/uYyOhPy12KEnXG9XGrvfMz5F5SrYecQlbW1rwM= -contrib.go.opencensus.io/exporter/aws v0.0.0-20200617204711-c478e41e60e9/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= -contrib.go.opencensus.io/exporter/stackdriver v0.13.10/go.mod h1:I5htMbyta491eUxufwwZPQdcKvvgzMB4O9ni41YnIM8= -contrib.go.opencensus.io/integrations/ocsql v0.1.7/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/azure-amqp-common-go/v3 v3.2.1/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= -github.com/Azure/azure-amqp-common-go/v3 v3.2.2/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= -github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k= -github.com/Azure/azure-sdk-for-go v51.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v59.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.0.0/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.0.0/go.mod h1:+6sju8gk8FRmSajX3Oz4G5Gm7P+mbqE9FVaXXFYTkCM= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U= -github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.0.0/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.0.0/go.mod h1:ceIuwmxDWptoW3eCqSXlnPsZFKh4X+R38dWPv7GS9Vs= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.0.0/go.mod h1:s1tW/At+xHqjNFvWU4G0c0Qv33KOhvbGNj0RCTQDV8s= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.2.0/go.mod h1:c+Lifp3EDEamAkPVzMooRNOK6CZjNSdEnf1A7jsI9u4= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.1.0/go.mod h1:7QJP7dr2wznCMeqIrhMgWGf7XpAQnVrJqDm9nvV3Cu4= -github.com/Azure/azure-service-bus-go v0.11.5/go.mod h1:MI6ge2CuQWBVq+ly456MY7XqNLJip5LO1iSFodbNLbU= -github.com/Azure/azure-storage-blob-go v0.14.0/go.mod h1:SMqIBi+SuiQH32bvyjngEewEeXoPfKMgWlBDaYf6fck= -github.com/Azure/go-amqp v0.16.0/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= -github.com/Azure/go-amqp v0.16.4/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest v0.11.19/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest v0.11.22/go.mod h1:BAWYUWGPEtKPzjVkp0Q6an0MJcJDsoh5Z1BFAEFs4Xs= -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/adal v0.9.14/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/adal v0.9.17/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= -github.com/Azure/go-autorest/autorest/azure/auth v0.5.9/go.mod h1:hg3/1yw0Bq87O3KvvnJoAh34/0zbP7SFizX/qN5JvjU= -github.com/Azure/go-autorest/autorest/azure/cli v0.4.2/go.mod h1:7qkJkT+j6b+hIpzMOwPChJhTqS8VbsqqgULzMNRugoM= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= -github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/AzureAD/microsoft-authentication-library-for-go v0.4.0/go.mod h1:Vt9sXTKwMyGcOxSmLDMnGPgqsUg7m8pe215qMLrDXw4= -github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/GoogleCloudPlatform/cloudsql-proxy v1.29.0/go.mod h1:spvB9eLJH9dutlbPSRmHvSXXHOwGRyeXh1jVdquA2G8= -github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= -github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/apache/arrow-go/v18 v18.4.0 h1:/RvkGqH517iY8bZKc4FD5/kkdwXJGjxf28JIXbJ/oB0= -github.com/apache/arrow-go/v18 v18.4.0/go.mod h1:Aawvwhj8x2jURIzD9Moy72cF0FyJXOpkYpdmGRHcw14= -github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 h1:byKBBF2CKWBjjA4J1ZL2JXttJULvWSl50LegTyRZ728= -github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516/go.mod h1:QNYViu/X0HXDHw7m3KXzWSVXIbfUvJqBFe6Gj8/pYA0= -github.com/apache/thrift v0.0.0-20181112125854-24918abba929/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.14.2/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.22.0 h1:r7mTJdj51TMDe6RtcmNdQxgn9XcyfGDOzegMDRg47uc= -github.com/apache/thrift v0.22.0/go.mod h1:1e7J/O1Ae6ZQMTYdy9xa3w9k+XHWPfRvdPyJeynQ+/g= -github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= -github.com/aws/aws-sdk-go v1.30.19/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= -github.com/aws/aws-sdk-go v1.37.0/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go v1.43.31 h1:yJZIr8nMV1hXjAvvOLUFqZRJcHV7udPQBfhJqawDzI0= -github.com/aws/aws-sdk-go v1.43.31/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= -github.com/aws/aws-sdk-go-v2 v1.16.2/go.mod h1:ytwTPBG6fXTZLxxeeCCWj2/EMYp/xDUgX+OET6TLNNU= -github.com/aws/aws-sdk-go-v2 v1.23.0/go.mod h1:i1XDttT4rnf6vxc9AuskLc6s7XBee8rlLilKlc03uAA= -github.com/aws/aws-sdk-go-v2 v1.37.0 h1:YtCOESR/pN4j5oA7cVHSfOwIcuh/KwHC4DOSXFbv5F0= -github.com/aws/aws-sdk-go-v2 v1.37.0/go.mod h1:9Q0OoGQoboYIAJyslFyF1f5K1Ryddop8gqMhWx/n4Wg= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.1/go.mod h1:n8Bs1ElDD2wJ9kCRTczA83gYbBmjSwZp3umc6zF4EeM= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.1/go.mod h1:t8PYl/6LzdAqsU4/9tz28V/kU+asFePvpOMkdul0gEQ= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 h1:6GMWV6CNpA/6fbFHnoAjrv4+LGfyTqZz2LtCHnspgDg= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0/go.mod h1:/mXlTIVG9jbxkqDnr5UQNQxW1HRYxeGklkM9vAFeabg= -github.com/aws/aws-sdk-go-v2/config v1.15.3/go.mod h1:9YL3v07Xc/ohTsxFXzan9ZpFpdTOFl4X65BAKYaz8jg= -github.com/aws/aws-sdk-go-v2/config v1.25.3/go.mod h1:tAByZy03nH5jcq0vZmkcVoo6tRzRHEwSFx3QW4NmDw8= -github.com/aws/aws-sdk-go-v2/config v1.30.1 h1:sHL8g/+9tcZATeV2tEkEfxZeaNokDtKsSjGMGHD49qA= -github.com/aws/aws-sdk-go-v2/config v1.30.1/go.mod h1:wkibEyFfxXRyTSzRU4bbF5IUsSXyE4xQ4ZjkGmi5tFo= -github.com/aws/aws-sdk-go-v2/credentials v1.11.2/go.mod h1:j8YsY9TXTm31k4eFhspiQicfXPLZ0gYXA50i4gxPE8g= -github.com/aws/aws-sdk-go-v2/credentials v1.16.2/go.mod h1:sDdvGhXrSVT5yzBDR7qXz+rhbpiMpUYfF3vJ01QSdrc= -github.com/aws/aws-sdk-go-v2/credentials v1.18.1 h1:E55xvOqlX7CvB66Z7rSM9usCrFU1ryUIUHqiXsEzVoE= -github.com/aws/aws-sdk-go-v2/credentials v1.18.1/go.mod h1:iobSQfR5MkvILxssGOvi/P1jjOhrRzfTiCPCzku0vx4= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.3/go.mod h1:uk1vhHHERfSVCUnqSqz8O48LBYDSC+k6brng09jcMOk= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.4/go.mod h1:t4i+yGHMCcUNIX1x7YVYa6bH/Do7civ5I6cG/6PMfyA= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0 h1:9sBTeKQwAvmJUWKIACIoiFSnxxl+sS++YDfr17/ngq0= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0/go.mod h1:LW9/PxQD1SYFC7pnWcgqPhoyZprhjEdg5hBK6qYPLW8= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.3/go.mod h1:0dHuD2HZZSiwfJSy1FO5bX1hQ1TxVV1QXXjpn3XUE44= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.14.0/go.mod h1:UcgIwJ9KHquYxs6Q5skC9qXjhYMK+JASDYcXQ4X7JZE= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1 h1:aAjA/1JZ1xH/F9XvxJu9cXZyp7BqVXtHpztyZ6p799E= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1/go.mod h1:ia9HASsPba/7o84sp6iE4wZPdNTJ0oicBe5sWQQk+Ys= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.9/go.mod h1:AnVH5pvai0pAF4lXRq0bmhbes1u9R8wTE+g+183bZNM= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.3/go.mod h1:7sGSz1JCKHWWBHq98m6sMtWQikmYPpxjqOydDemiVoM= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0 h1:H2iZoqW/v2Jnrh1FnU725Bq6KJ0k2uP63yH+DcY+HUI= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0/go.mod h1:L0FqLbwMXHvNC/7crWV1iIxUlOKYZUE8KuTIA+TozAI= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.3/go.mod h1:ssOhaLpRlh88H3UmEcsBoVKq309quMvm3Ds8e9d4eJM= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.3/go.mod h1:ify42Rb7nKeDDPkFjKn7q1bPscVPu/+gmHH8d2c+anU= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0 h1:EDped/rNzAhFPhVY0sDGbtD16OKqksfA8OjF/kLEgw8= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0/go.mod h1:uUI335jvzpZRPpjYx6ODc/wg1qH+NnoSTK/FwVeK0C0= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.10/go.mod h1:8DcYQcz0+ZJaSxANlHIsbbi6S+zMwjwdDqwW3r9AzaE= -github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.3/go.mod h1:5yzAuE9i2RkVAttBl8yxZgQr5OCq4D5yDnG7j9x2L0U= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0 h1:iLvW/zOkHGU3BDU5thWnj+UZ9pjhuVhv1loLj7yVtBw= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0/go.mod h1:Fn3gvhdF1x5Rs9nUoCy/fJT1ms8f8dO7RqM9lJHuazQ= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.1/go.mod h1:GeUru+8VzrTXV/83XyMJ80KpH8xO89VPoUileyNQ+tc= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1/go.mod h1:l9ymW25HOqymeU2m1gbUQ3rUIsTwKs8gYHXkqDQUhiI= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 h1:6+lZi2JeGKtCraAj1rpoZfKqnQ9SptseRZioejfUOLM= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0/go.mod h1:eb3gfbVIxIoGgJsi9pGne19dhCBpK6opTYpQqAmdy44= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.3/go.mod h1:Seb8KNmD6kVTjwRjVEgOT5hPin6sq+v4C2ycJQDwuH8= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.3/go.mod h1:R+/S1O4TYpcktbVwddeOYg+uwUfLhADP2S/x4QwsCTM= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0 h1:qGyLBQPphYzUf+IIlb5tHnvg1U2Vc5hXPcP7oRSQfy0= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0/go.mod h1:g+dzKSLXiR/8ATkPXmLhPOI6rDdjLP3tngeo3FvDcIw= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.3/go.mod h1:wlY6SVjuwvh3TVRpTqdy4I1JpBFLX4UGeKZdWntaocw= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.3/go.mod h1:Owv1I59vaghv1Ax8zz8ELY8DN7/Y0rGS+WWAmjgi950= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0 h1:eRhU3Sh8dGbaniI6B+I48XJMrTPRkK4DKo+vqIxziOU= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0/go.mod h1:paNLV18DZ6FnWE/bd06RIKPDIFpjuvCkGKWTG/GDBeM= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.3/go.mod h1:Bm/v2IaN6rZ+Op7zX+bOUMdL4fsrYZiD0dsjLhNKwZc= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.3/go.mod h1:KZgs2ny8HsxRIRbDwgvJcHHBZPOzQr/+NtGwnP+w2ec= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0 h1:6jusT+XCcvnD+Elxvm7bUf5sCMTpZEp3AKjYQ4tWJSo= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0/go.mod h1:LimGpdIF/sTBdgqwOEkrArXLCoTamK/9L9x8IKBFTIc= -github.com/aws/aws-sdk-go-v2/service/kms v1.16.3/go.mod h1:QuiHPBqlOFCi4LqdSskYYAWpQlx3PKmohy+rE2F+o5g= -github.com/aws/aws-sdk-go-v2/service/s3 v1.26.3/go.mod h1:g1qvDuRsJY+XghsV6zg00Z4KJ7DtFFCx8fJD2a491Ak= -github.com/aws/aws-sdk-go-v2/service/s3 v1.43.0/go.mod h1:NXRKkiRF+erX2hnybnVU660cYT5/KChRD4iUgJ97cI8= -github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0 h1:gAV4NEp4A+JOrIdoXkAeyy6IOo7+X2s/jRuaHKYiMaU= -github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0/go.mod h1:JIQwK8sZ5MuKGm5rrFwp9MHUcyYEsQNpVixuPDlnwaU= -github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.15.4/go.mod h1:PJc8s+lxyU8rrre0/4a0pn2wgwiDvOEzoOjcJUBr67o= -github.com/aws/aws-sdk-go-v2/service/sns v1.17.4/go.mod h1:kElt+uCcXxcqFyc+bQqZPFD9DME/eC6oHBXvFzQ9Bcw= -github.com/aws/aws-sdk-go-v2/service/sqs v1.18.3/go.mod h1:skmQo0UPvsjsuYYSYMVmrPc1HWCbHUJyrCEp+ZaLzqM= -github.com/aws/aws-sdk-go-v2/service/ssm v1.24.1/go.mod h1:NR/xoKjdbRJ+qx0pMR4mI+N/H1I1ynHwXnO6FowXJc0= -github.com/aws/aws-sdk-go-v2/service/sso v1.11.3/go.mod h1:7UQ/e69kU7LDPtY40OyoHYgRmgfGM4mgsLYtcObdveU= -github.com/aws/aws-sdk-go-v2/service/sso v1.17.2/go.mod h1:/pE21vno3q1h4bbhUOEi+6Zu/aT26UK2WKkDXd+TssQ= -github.com/aws/aws-sdk-go-v2/service/sso v1.26.0 h1:cuFWHH87GP1NBGXXfMicUbE7Oty5KpPxN6w4JpmuxYc= -github.com/aws/aws-sdk-go-v2/service/sso v1.26.0/go.mod h1:aJBemdlbCKyOXEXdXBqS7E+8S9XTDcOTaoOjtng54hA= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.20.0/go.mod h1:dWqm5G767qwKPuayKfzm4rjzFmVjiBFbOJrpSPnAMDs= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0 h1:t2va+wewPOYIqC6XyJ4MGjiGKkczMAPsgq5W4FtL9ME= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0/go.mod h1:ExCTcqYqN0hYYRsDlBVU8+68grqlWdgX9/nZJwQW4aY= -github.com/aws/aws-sdk-go-v2/service/sts v1.16.3/go.mod h1:bfBj0iVmsUyUg4weDB4NxktD9rDGeKSVWnjTnwbx9b8= -github.com/aws/aws-sdk-go-v2/service/sts v1.25.3/go.mod h1:4EqRHDCKP78hq3zOnmFXu5k0j4bXbRFfCh/zQ6KnEfQ= -github.com/aws/aws-sdk-go-v2/service/sts v1.35.0 h1:FD9agdG4CeOGS3ORLByJk56YIXDS7mxFpmZyCtpqExc= -github.com/aws/aws-sdk-go-v2/service/sts v1.35.0/go.mod h1:NDzDPbBF1xtSTZUMuZx0w3hIfWzcL7X2AQ0Tr9becIQ= -github.com/aws/smithy-go v1.11.2/go.mod h1:3xHYmszWVx2c0kIwQeEVf9uSm4fYZt67FBJnwub1bgM= -github.com/aws/smithy-go v1.17.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= -github.com/aws/smithy-go v1.22.5 h1:P9ATCXPMb2mPjYBgueqJNCA5S9UfktsW0tTxi+a7eqw= -github.com/aws/smithy-go v1.22.5/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/bobg/gcsobj v0.1.2/go.mod h1:vS49EQ1A1Ib8FgrL58C8xXYZyOCR2TgzAdopy6/ipa8= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -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/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/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= -github.com/colinmarc/hdfs/v2 v2.1.1/go.mod h1:M3x+k8UKKmxtFu++uAZ0OtDU8jR3jnaZIAc6yK4Ue0c= -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/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU= -github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= -github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= -github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= -github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= -github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/duckdb/duckdb-go-bindings v0.1.16 h1:XPCk9hzP06PoWIxDPVU3gAy0m1XmLaZHTzLggNx/U9k= -github.com/duckdb/duckdb-go-bindings v0.1.16/go.mod h1:pBnfviMzANT/9hi4bg+zW4ykRZZPCXlVuvBWEcZofkc= -github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11 h1:GXQkG4HmEbwPtqCSabJTp9wZQQ7Gqr3KveLNesQWQOs= -github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11/go.mod h1:Ezo7IbAfB8NP7CqPIN8XEHKUg5xdRRQhcPPlCXImXYA= -github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11 h1:ATJMSBIDA/YAm/6CKeBDRtGK1OOwqfTZbWg9Y5fAc9E= -github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11/go.mod h1:eS7m/mLnPQgVF4za1+xTyorKRBuK0/BA44Oy6DgrGXI= -github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11 h1:AjvnGst1avyOECYiykthyHR4DTYTaqNDPr5W/0t5j0k= -github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11/go.mod h1:1GOuk1PixiESxLaCGFhag+oFi7aP+9W8byymRAvunBk= -github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11 h1:j3B1biawuhtxe2Chkiqcwf1Kxe8VJc8lLVmjBIcJrkI= -github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11/go.mod h1:o7crKMpT2eOIi5/FY6HPqaXcvieeLSqdXXaXbruGX7w= -github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11 h1:xR3vRE8y+48U6xDNkUlOfbl7/OTA7FVcDXJ+5vETuHU= -github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11/go.mod h1:IlOhJdVKUJCAPj3QsDszUo8DVdvp1nBFp4TUJVdw99s= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -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/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= -github.com/gin-gonic/gin v1.7.3/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= -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-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= -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-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= -github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-viper/mapstructure/v2 v2.3.0 h1:27XbWsHIqhbdR5TIC911OfYvgSaW93HM+dX7970Q7jk= -github.com/go-viper/mapstructure/v2 v2.3.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= -github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= -github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.4.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= -github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188/go.mod h1:vXjM/+wXQnTPR4KqTKDgJukSZ6amVRtWMPEjE6sQoK8= -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/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/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -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.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= -github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -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/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/flatbuffers v25.2.10+incompatible h1:F3vclr7C3HpB1k9mxCGRMXq6FdUalZ6H/pNX4FP1v0Q= -github.com/google/flatbuffers v25.2.10+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -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.6/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.8/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/go-replayers/grpcreplay v1.1.0/go.mod h1:qzAvJ8/wi57zq7gWqaE6AwLM6miiXUQwP1S+I9icmhk= -github.com/google/go-replayers/httpreplay v1.1.1/go.mod h1:gN9GeLIs7l6NUoVaSSnv2RiqK1NiwAmD0MrKeC9IIks= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+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/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -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-20200905233945-acf8798be1f7/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-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210506205249-923b5ab0fc1a/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.2.0/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.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= -github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/wire v0.5.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU= -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.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hanwen/go-fuse v1.0.0/go.mod h1:unqXarDXqzAk0rt98O2tVndEPIpUgLD9+rwFisZH3Ok= -github.com/hanwen/go-fuse/v2 v2.1.0/go.mod h1:oRyA5eK+pvJyv5otpO/DgccS8y/RvYMaO00GgRLGryc= -github.com/hashicorp/go-uuid v0.0.0-20180228145832-27454136f036/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -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/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/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.11.0/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= -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/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.2.0/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-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= -github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/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.10.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.15.0/go.mod h1:D/zyOyXiaM1TmVWnOM18p0xdDtdakRBa0RsVGI3U3bw= -github.com/jackc/pgx/v5 v5.7.5 h1:JHGfMnQY+IEtGM63d+NGMjoRpysB2JBwDr5fsngwmJs= -github.com/jackc/pgx/v5 v5.7.5/go.mod h1:aruU7o91Tc2q2cFp5h4uP3f6ztExVpyVv88Xl/8Vl8M= -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.2.1 h1:gI8os0wpRXFd4FiAY2dWiqRK037tjj3t7rKFeO4X5iw= -github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= -github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= -github.com/jcmturner/gofork v0.0.0-20180107083740-2aebee971930/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= -github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= -github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -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/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= -github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= -github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.13.1/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= -github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= -github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= -github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= -github.com/klauspost/cpuid/v2 v2.2.11 h1:0OwqZRYI2rFrjS4kvkDnqJkKHdHaRnCm68/DY4OxRzU= -github.com/klauspost/cpuid/v2 v2.2.11/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= -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/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -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/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -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.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/linkedin/goavro v2.1.0+incompatible h1:DV2aUlj2xZiuxQyvag8Dy7zjY69ENjS66bWkSfdpddY= -github.com/linkedin/goavro v2.1.0+incompatible/go.mod h1:bBCwI2eGYpUI/4820s67MElg9tdeLbINjLjiM2xZFYM= -github.com/marcboeker/go-duckdb/arrowmapping v0.0.9 h1:xj+kFOqR2gH3Mcxx9LmAVHebSnCiPm303N+uxfkWVmY= -github.com/marcboeker/go-duckdb/arrowmapping v0.0.9/go.mod h1:o56AqVS90v5bpxhPnOK9La7AfNTOrMORiqTQrlRbdPQ= -github.com/marcboeker/go-duckdb/mapping v0.0.10 h1:b/y2W8/hNlD0Dwjq0mCqIlLXpjQMnWy0WqDV9b9lHQQ= -github.com/marcboeker/go-duckdb/mapping v0.0.10/go.mod h1:Ro6Tw6sGG50O8S0daZsA8TrQJz/DvGrzGvMD7Jihirw= -github.com/marcboeker/go-duckdb/v2 v2.3.2 h1:96zG2JPyIhCFjHdBjjSpOdhzJzehoGTdl7LskkuMUTs= -github.com/marcboeker/go-duckdb/v2 v2.3.2/go.mod h1:VeXz9ZM6klNvICHrXEUzaHSgNqBeTdyMxr4CICw/UaY= -github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= -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.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs= -github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= -github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI= -github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= -github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= -github.com/minio/minio-go/v7 v7.0.34/go.mod h1:nCrRzjoSUQh8hgKKtu3Y708OLvRLtuASMg2/nvmbarw= -github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= -github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= -github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= -github.com/nats-io/nats.go v1.47.0 h1:YQdADw6J/UfGUd2Oy6tn4Hq6YHxCaJrVKayxxFqYrgM= -github.com/nats-io/nats.go v1.47.0/go.mod h1:iRWIPokVIFbVijxuMQq4y9ttaBTMe0SFdlZfMDd+33g= -github.com/nats-io/nkeys v0.4.11 h1:q44qGV008kYd9W1b1nEBkNzvnWxtRSQ7A8BoqRrcfa0= -github.com/nats-io/nkeys v0.4.11/go.mod h1:szDimtgmfOi9n25JpfIdGw12tZFYXqhGxjhVxsatHVE= -github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= -github.com/ncw/swift v1.0.52/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -github.com/pborman/getopt v0.0.0-20180729010549-6fdd0a2c7117/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= -github.com/pierrec/lz4/v4 v4.1.8/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= -github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= -github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= -github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= -github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -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/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -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/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.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -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/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -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.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -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.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/xitongsys/parquet-go v1.5.1/go.mod h1:xUxwM8ELydxh4edHGegYq1pA8NnMKDx0K/GyB0o2bww= -github.com/xitongsys/parquet-go v1.6.2 h1:MhCaXii4eqceKPu9BwrjLqyK10oX9WF+xGhwvwbw7xM= -github.com/xitongsys/parquet-go v1.6.2/go.mod h1:IulAQyalCm0rPiZVNnCgm/PCL64X2tdSVGMQ/UeKqWA= -github.com/xitongsys/parquet-go-source v0.0.0-20190524061010-2b72cbee77d5/go.mod h1:xxCx7Wpym/3QCo6JhujJX51dzSXrwmb0oH6FQb39SEA= -github.com/xitongsys/parquet-go-source v0.0.0-20200817004010-026bad9b25d0/go.mod h1:HYhIKsdns7xz80OgkbgJYrtQY7FjHWHKH6cvN7+czGE= -github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b h1:zbb5qM/t3N+O33Vp5sFyG6yIcWZV1q7rfEjJM8UsRBQ= -github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b/go.mod h1:2ActxmJ4q17Cdruar9nKEkzKSOL1Ol03737Bkz10rTY= -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.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= -github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= -github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= -github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= -github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= -go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0= -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.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -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/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -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.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= -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.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= -gocloud.dev v0.26.0/go.mod h1:mkUgejbnbLotorqDyvedJO20XcZNTynmSeVSQS9btVg= -golang.org/x/crypto v0.0.0-20180723164146-c126467f60eb/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -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-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/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-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-20211115234514-b4de73f9ece8/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220511200225-c6db032c6c88/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= -golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= -golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= -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-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= -golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= -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/lint v0.0.0-20210508222113-6edffad5e616/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.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w= -golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= -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-20191112182307-2180aed22343/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-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -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-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211020060615-d418f374d309/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220401154927-543a649e0bdd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -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.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -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.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -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-20210220032951-036812b2e83c/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.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= -golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= -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-20191112214154-59a1497f0cea/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-20200828194041-157a740278f4/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-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/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-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/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-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220204135822-1c1b9b1eba6a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220330033206-e17cdc41300f/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-20220704084225-05e143d24a9e/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.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= -golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -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/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -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.5/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.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= -golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= -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/time v0.0.0-20211116232009-f0f3c7e86c11/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220224211638-0e9765cccd65/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-20190422233926-fe54fb35175b/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-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-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-20200828161849-5deb26317202/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20200915173823-2db8f0ff891c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20200918232735-d647fc253266/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -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.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo= -golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg= -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= -golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= -golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= -gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= -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.31.0/go.mod h1:CL+9IBCa2WWU6gRuBWaKqGWLFFwbEUXkfeMkHLQWYWo= -google.golang.org/api v0.32.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -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.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.46.0/go.mod h1:ceL4oozhkAiTID8XMmJBsIxID/9wMXJVVFXPg4ylg3I= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.58.0/go.mod h1:cAbP2FsxoGVNwtgNAmmn3y5G1TWAiVYRmg4yku3lv+E= -google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.64.0/go.mod h1:931CdxA8Rm4t6zqTFGSsgwbAEZ2+GMYurbndwSimebM= -google.golang.org/api v0.66.0/go.mod h1:I1dmXYpX7HGwz/ejRxwQp2qj5bFAz93HiCU1C1oYd9M= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.68.0/go.mod h1:sOM8pTpwgflXRhz+oC8H2Dr+UcbMqkPPWNJo88Q7TH8= -google.golang.org/api v0.69.0/go.mod h1:boanBiw+h5c3s+tBPgEzLDRHfFLWV0qXxRHz3ws7C80= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -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/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-20200513103714-09dca8ec2884/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-20200831141814-d751682dd103/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-20200914193844-75d14daec038/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200921151605-7abf4a1a14d5/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-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210429181445-86c259c2b4ab/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210517163617-5e0236093d7a/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210921142501-181ce0d877f6/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211018162055-cf77aa76bad2/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211223182754-3ac035c7e7cb/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220111164026-67b88f271998/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220114231437-d2e6a121cae0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220201184016-50beb8ab5c44/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220204002441-d6cc3cc0770e/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220211171837-173942840c17/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220216160803-4663080d8bc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220401170504-314d38edb7de/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -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.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -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.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= -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.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -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-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= -gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= -gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q= -gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mNfM5bm88whjWx4= -gopkg.in/jcmturner/gokrb5.v7 v7.3.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= -gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8= -gopkg.in/linkedin/goavro.v1 v1.0.5 h1:BJa69CDh0awSsLUmZ9+BowBdokpduDZSM9Zk8oKHfN4= -gopkg.in/linkedin/goavro.v1 v1.0.5/go.mod h1:Aw5GdAbizjOEl0kAMHV9iHmA8reZzW/OKuJAl4Hb9F0= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/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/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= -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= -nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= -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/src/syncer-dialpad/lib/nats.go b/src/syncer-dialpad/lib/nats.go deleted file mode 100644 index 993a4d4..0000000 --- a/src/syncer-dialpad/lib/nats.go +++ /dev/null @@ -1,37 +0,0 @@ -package dialpad - -import ( - "context" - - nts "github.com/nats-io/nats.go" - js "github.com/nats-io/nats.go/jetstream" - - "github.com/BemiHQ/BemiDB/src/common" -) - -const () - -type Nats struct { - Config *Config -} - -func NewNats(config *Config) *Nats { - return &Nats{ - Config: config, - } -} - -func (nats *Nats) Stream(ctx context.Context) js.Stream { - jetstream := nats.newJetstream() - stream, err := jetstream.Stream(ctx, nats.Config.Nats.Stream) - common.PanicIfError(nats.Config.CommonConfig, err) - return stream -} - -func (nats *Nats) newJetstream() js.JetStream { - nc, err := nts.Connect(nats.Config.Nats.Url) - common.PanicIfError(nats.Config.CommonConfig, err) - jetstream, err := js.New(nc) - common.PanicIfError(nats.Config.CommonConfig, err) - return jetstream -} diff --git a/src/syncer-dialpad/lib/record_sms_message.go b/src/syncer-dialpad/lib/record_sms_message.go deleted file mode 100644 index 361abc1..0000000 --- a/src/syncer-dialpad/lib/record_sms_message.go +++ /dev/null @@ -1,124 +0,0 @@ -package dialpad - -import ( - "encoding/json" - - "github.com/BemiHQ/BemiDB/src/common" -) - -type RecordUser struct { - Id int64 `json:"id"` - Type string `json:"type"` - Email string `json:"email"` - Phone string `json:"phone"` - PhoneNumber string `json:"phone_number"` - Name string `json:"name"` - OfficeId int64 `json:"office_id"` -} - -func (record *RecordUser) ToMap() map[string]interface{} { - result := make(map[string]interface{}) - - result["id"] = record.Id - result["type"] = record.Type - result["name"] = record.Name - result["phone"] = record.Phone - result["phone_display"] = record.PhoneNumber - result["email"] = record.Email - result["office_id"] = record.OfficeId - - return result -} - -type RecordContact struct { - Id int64 `json:"id"` - Type string `json:"type"` - Email string `json:"email"` - Phone string `json:"phone"` - PhoneNumber string `json:"phone_number"` - Name string `json:"name"` -} - -func (record *RecordContact) ToMap() map[string]interface{} { - result := make(map[string]interface{}) - - result["id"] = record.Id - result["type"] = record.Type - result["name"] = record.Name - result["phone"] = record.Phone - result["phone_display"] = record.PhoneNumber - result["email"] = record.Email - - return result -} - -// --------------------------------------------------------------------------------------------------------------------- - -type RecordSmsMessage struct { - Id int64 `json:"id"` - CreatedDate int64 `json:"created_date"` - Direction string `json:"direction"` - EventTimestamp int64 `json:"event_timestamp"` - FromNumber string `json:"from_number"` - ToNumber []string `json:"to_number"` - Text string `json:"text"` - Mms bool `json:"mms"` - MmsUrl *string `json:"mms_url"` - IsInternal bool `json:"is_internal"` - MessageStatus string `json:"message_status"` - Contact RecordContact `json:"contact"` - Target RecordUser `json:"target"` - Admins []RecordUser `json:"admins"` -} - -func (record *RecordSmsMessage) ToMap() map[string]interface{} { - result := make(map[string]interface{}) - - result["id"] = record.Id - result["created_at"] = record.CreatedDate - result["emitted_at"] = record.EventTimestamp - result["direction"] = record.Direction - result["from"] = record.FromNumber - result["to"] = record.ToNumber - result["text"] = record.Text - result["message_status"] = record.MessageStatus - result["is_internal"] = record.IsInternal - result["mms"] = record.Mms - result["mms_url"] = record.MmsUrl - result["contact"] = ToJson(record.Contact.ToMap()) - result["target"] = ToJson(record.Target.ToMap()) - admins := []map[string]interface{}{} - for _, admin := range record.Admins { - admins = append(admins, admin.ToMap()) - } - result["admins"] = ToJson(admins) - - return result -} - -func SmsMessagesIcebergSchemaColumns(config *common.CommonConfig) []*common.IcebergSchemaColumn { - return []*common.IcebergSchemaColumn{ - {Config: config, ColumnName: "id", ColumnType: common.IcebergColumnTypeLong, Position: 1}, - {Config: config, ColumnName: "created_at", ColumnType: common.IcebergColumnTypeTimestamp, Position: 2, DatetimePrecision: 3}, - {Config: config, ColumnName: "emitted_at", ColumnType: common.IcebergColumnTypeTimestamp, Position: 3, DatetimePrecision: 3}, - {Config: config, ColumnName: "direction", ColumnType: common.IcebergColumnTypeString, Position: 4}, - {Config: config, ColumnName: "from", ColumnType: common.IcebergColumnTypeString, Position: 5}, - {Config: config, ColumnName: "to", ColumnType: common.IcebergColumnTypeString, Position: 6, IsList: true}, - {Config: config, ColumnName: "text", ColumnType: common.IcebergColumnTypeString, Position: 7}, - {Config: config, ColumnName: "message_status", ColumnType: common.IcebergColumnTypeString, Position: 8}, - {Config: config, ColumnName: "is_internal", ColumnType: common.IcebergColumnTypeBoolean, Position: 9}, - {Config: config, ColumnName: "mms", ColumnType: common.IcebergColumnTypeBoolean, Position: 10}, - {Config: config, ColumnName: "mms_url", ColumnType: common.IcebergColumnTypeString, Position: 11}, - {Config: config, ColumnName: "contact", ColumnType: common.IcebergColumnTypeString, Position: 12, LogicalColumnType: common.IcebergLogicalColumnTypeJson}, - {Config: config, ColumnName: "target", ColumnType: common.IcebergColumnTypeString, Position: 13, LogicalColumnType: common.IcebergLogicalColumnTypeJson}, - {Config: config, ColumnName: "admins", ColumnType: common.IcebergColumnTypeString, Position: 14, LogicalColumnType: common.IcebergLogicalColumnTypeJson}, - } -} - -func ToJson(data interface{}) string { - jsonData, err := json.Marshal(data) - if err != nil { - panic(err) - } - return string(jsonData) -} diff --git a/src/syncer-dialpad/lib/syncer.go b/src/syncer-dialpad/lib/syncer.go deleted file mode 100644 index a775a77..0000000 --- a/src/syncer-dialpad/lib/syncer.go +++ /dev/null @@ -1,113 +0,0 @@ -package dialpad - -import ( - "context" - "encoding/json" - "time" - - js "github.com/nats-io/nats.go/jetstream" - - "github.com/BemiHQ/BemiDB/src/common" -) - -const ( - TABLE_SMS_MESSAGES = "sms_messages" - - NATS_TIMEOUT = 30 * time.Second - NATS_FETCH_BATCH_SIZE = 100 -) - -type Syncer struct { - Config *Config - StorageS3 *common.StorageS3 - DuckdbClient *common.DuckdbClient -} - -func NewSyncer(config *Config, storageS3 *common.StorageS3, duckdbClient *common.DuckdbClient) *Syncer { - return &Syncer{ - Config: config, - StorageS3: storageS3, - DuckdbClient: duckdbClient, - } -} - -func (syncer *Syncer) Sync() { - common.SendAnonymousAnalytics(syncer.Config.CommonConfig, "syncer-dialpad-start", syncer.name()) - - natsCtx, cancel := context.WithTimeout(context.Background(), NATS_TIMEOUT) - defer cancel() - natsConsumer := syncer.natsConsumer(natsCtx) - natsFetchTimeout := time.Duration(syncer.Config.Nats.FetchTimeoutSeconds) * time.Second - - icebergTable := common.NewIcebergTable(syncer.Config.CommonConfig, syncer.StorageS3, syncer.DuckdbClient, common.IcebergSchemaTable{ - Schema: syncer.Config.DestinationSchemaName, - Table: TABLE_SMS_MESSAGES, - }) - icebergSchemaColumns := SmsMessagesIcebergSchemaColumns(syncer.Config.CommonConfig) - - for { - // Fetch messages from NATS - common.LogInfo(syncer.Config.CommonConfig, "Fetching messages from NATS with", natsFetchTimeout, "timeout...") - messagesBatch, err := natsConsumer.Fetch(NATS_FETCH_BATCH_SIZE, js.FetchMaxWait(natsFetchTimeout)) - common.PanicIfError(syncer.Config.CommonConfig, err) - var messages []js.Msg - var messagesBytes [][]byte - for message := range messagesBatch.Messages() { - messages = append(messages, message) - messagesBytes = append(messagesBytes, message.Data()) - } - common.LogInfo(syncer.Config.CommonConfig, "Fetched", len(messagesBytes), "messages from NATS") - - // Write messages to Iceberg - syncer.WriteToIceberg(messagesBytes, icebergTable, icebergSchemaColumns) - - // Acknowledge messages - for _, message := range messages { - err := message.Ack() - common.PanicIfError(syncer.Config.CommonConfig, err) - } - } -} - -func (syncer *Syncer) WriteToIceberg(messagesBytes [][]byte, icebergTable *common.IcebergTable, icebergSchemaColumns []*common.IcebergSchemaColumn) { - cappedBuffer := common.NewCappedBuffer(syncer.Config.CommonConfig, common.DEFAULT_CAPPED_BUFFER_SIZE) - jsonQueueWriter := common.NewJsonQueueWriter(cappedBuffer) - for _, messageBytes := range messagesBytes { - common.LogDebug(syncer.Config.CommonConfig, string(messageBytes)) - - var smsMessage RecordSmsMessage - err := json.Unmarshal(messageBytes, &smsMessage) - common.PanicIfError(syncer.Config.CommonConfig, err) - - err = jsonQueueWriter.Write(smsMessage.ToMap()) - common.PanicIfError(syncer.Config.CommonConfig, err) - } - jsonQueueWriter.Close() - - icebergTableWriter := common.NewIcebergTableWriter(syncer.Config.CommonConfig, syncer.StorageS3, syncer.DuckdbClient, icebergTable, icebergSchemaColumns, 1) - icebergTableWriter.AppendFromJsonCappedBuffer(common.CursorValue{}, cappedBuffer) -} - -func (syncer *Syncer) natsConsumer(natsCtx context.Context) js.Consumer { - nats := NewNats(syncer.Config) - - natsStream := nats.Stream(natsCtx) - common.LogInfo(syncer.Config.CommonConfig, "Creating a consumer for subject:", syncer.Config.Nats.Subject) - - natsConsumer, err := natsStream.CreateOrUpdateConsumer(natsCtx, js.ConsumerConfig{ - Durable: syncer.Config.Nats.ConsumerName, - FilterSubject: syncer.Config.Nats.Subject, - MaxAckPending: -1, // Instead of default 1000 - AckPolicy: js.AckExplicitPolicy, // Default - DeliverPolicy: js.DeliverAllPolicy, // Default - AckWait: 30 * time.Second, // Default (30 seconds) - MaxDeliver: -1, // Default (re-deliver forever until acked) - }) - common.PanicIfError(syncer.Config.CommonConfig, err) - - return natsConsumer -} - -func (syncer *Syncer) name() string { - return "dialpad" -} diff --git a/src/syncer-dialpad/main.go b/src/syncer-dialpad/main.go deleted file mode 100644 index f249333..0000000 --- a/src/syncer-dialpad/main.go +++ /dev/null @@ -1,20 +0,0 @@ -package main - -import ( - "github.com/BemiHQ/BemiDB/src/common" - "github.com/BemiHQ/BemiDB/src/syncer-dialpad/lib" -) - -func init() { - dialpad.RegisterFlags() -} - -func main() { - config := dialpad.LoadConfig() - defer common.HandleUnexpectedPanic(config.CommonConfig) - - storageS3 := common.NewStorageS3(config.CommonConfig) - duckdbClient := common.NewDuckdbClient(config.CommonConfig, common.SYNCER_DUCKDB_BOOT_QUERIES) - syncer := dialpad.NewSyncer(config, storageS3, duckdbClient) - syncer.Sync() -} diff --git a/src/syncer-postgres/go.mod b/src/syncer-postgres/go.mod deleted file mode 100644 index 95ecdb2..0000000 --- a/src/syncer-postgres/go.mod +++ /dev/null @@ -1,72 +0,0 @@ -module github.com/BemiHQ/BemiDB/src/syncer-postgres - -go 1.24.4 - -require ( - github.com/BemiHQ/BemiDB/src/common v0.0.0-00010101000000-000000000000 - github.com/BemiHQ/BemiDB/src/syncer-postgres/lib v0.0.0-00010101000000-000000000000 -) - -replace github.com/BemiHQ/BemiDB/src/common => ../common - -replace github.com/BemiHQ/BemiDB/src/syncer-postgres/lib => ./lib - -require ( - github.com/apache/arrow-go/v18 v18.4.0 // indirect - github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 // indirect - github.com/apache/thrift v0.22.0 // indirect - github.com/aws/aws-sdk-go-v2 v1.37.0 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 // indirect - github.com/aws/aws-sdk-go-v2/config v1.30.1 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.18.1 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0 // indirect - github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.26.0 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.35.0 // indirect - github.com/aws/smithy-go v1.22.5 // indirect - github.com/duckdb/duckdb-go-bindings v0.1.16 // indirect - github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11 // indirect - github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11 // indirect - github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11 // indirect - github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11 // indirect - github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11 // indirect - github.com/go-viper/mapstructure/v2 v2.3.0 // indirect - github.com/goccy/go-json v0.10.5 // indirect - github.com/golang/snappy v1.0.0 // indirect - github.com/google/flatbuffers v25.2.10+incompatible // indirect - github.com/google/uuid v1.6.0 // indirect - github.com/jackc/pgpassfile v1.0.0 // indirect - github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect - github.com/jackc/pgx/v5 v5.7.5 // indirect - github.com/klauspost/compress v1.18.0 // indirect - github.com/klauspost/cpuid/v2 v2.2.11 // indirect - github.com/linkedin/goavro v2.1.0+incompatible // indirect - github.com/marcboeker/go-duckdb/arrowmapping v0.0.9 // indirect - github.com/marcboeker/go-duckdb/mapping v0.0.10 // indirect - github.com/marcboeker/go-duckdb/v2 v2.3.2 // indirect - github.com/nats-io/nats.go v1.43.0 // indirect - github.com/nats-io/nkeys v0.4.11 // indirect - github.com/nats-io/nuid v1.0.1 // indirect - github.com/pierrec/lz4/v4 v4.1.22 // indirect - github.com/xitongsys/parquet-go v1.6.2 // indirect - github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b // indirect - github.com/zeebo/xxh3 v1.0.2 // indirect - golang.org/x/crypto v0.40.0 // indirect - golang.org/x/exp v0.0.0-20250718183923-645b1fa84792 // indirect - golang.org/x/mod v0.26.0 // indirect - golang.org/x/sync v0.16.0 // indirect - golang.org/x/sys v0.34.0 // indirect - golang.org/x/text v0.27.0 // indirect - golang.org/x/tools v0.35.0 // indirect - golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect -) diff --git a/src/syncer-postgres/go.sum b/src/syncer-postgres/go.sum deleted file mode 100644 index d27554a..0000000 --- a/src/syncer-postgres/go.sum +++ /dev/null @@ -1,1166 +0,0 @@ -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.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.66.0/go.mod h1:dgqGAjKCDxyhGTtC9dAREQGUJpkceNm1yt590Qno0Ko= -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.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.82.0/go.mod h1:vlKccHJGuFBFufnAnuB08dfEH9Y3H7dzDzRECFdC2TA= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= -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 v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.2.0/go.mod h1:xlogom/6gr8RJGBe7nT2eGsQYAFUbbv8dbC29qE3Xmw= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -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/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= -cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= -cloud.google.com/go/iam v0.1.1/go.mod h1:CKqrcnI/suGpybEHxZ7BMehL0oA4LpdyJdUlTl9jVMw= -cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= -cloud.google.com/go/kms v1.1.0/go.mod h1:WdbppnCDMDpOvoYBMn1+gNmOeEoZYqAv+HeuKARGCXI= -cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= -cloud.google.com/go/monitoring v1.1.0/go.mod h1:L81pzz7HKn14QCMaCs6NTQkdBnE87TElyanS95vIcl4= -cloud.google.com/go/monitoring v1.4.0/go.mod h1:y6xnxfwI3hTFWOdkOaD7nfJVlwuC3/mS/5kvtT131p4= -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/pubsub v1.19.0/go.mod h1:/O9kmSe9bb9KRnIAWkzmqhPjHo6LtzGOBYd/kr06XSs= -cloud.google.com/go/secretmanager v1.3.0/go.mod h1:+oLTkouyiYiabAQNugCeTS3PAArGiMJuBqvJnJsyH+U= -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.12.0/go.mod h1:fFLk2dp2oAhDz8QFKwqrjdJvxSp/W2g7nillojlL5Ho= -cloud.google.com/go/storage v1.21.0/go.mod h1:XmRlxkgPjlBONznT2dDUU/5XlpU2OjMnKuqnZI01LAA= -cloud.google.com/go/trace v1.0.0/go.mod h1:4iErSByzxkyHWzzlAj63/Gmjz0NH1ASqhJguHpGcr6A= -cloud.google.com/go/trace v1.2.0/go.mod h1:Wc8y/uYyOhPy12KEnXG9XGrvfMz5F5SrYecQlbW1rwM= -contrib.go.opencensus.io/exporter/aws v0.0.0-20200617204711-c478e41e60e9/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= -contrib.go.opencensus.io/exporter/stackdriver v0.13.10/go.mod h1:I5htMbyta491eUxufwwZPQdcKvvgzMB4O9ni41YnIM8= -contrib.go.opencensus.io/integrations/ocsql v0.1.7/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/azure-amqp-common-go/v3 v3.2.1/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= -github.com/Azure/azure-amqp-common-go/v3 v3.2.2/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= -github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k= -github.com/Azure/azure-sdk-for-go v51.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v59.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.0.0/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.0.0/go.mod h1:+6sju8gk8FRmSajX3Oz4G5Gm7P+mbqE9FVaXXFYTkCM= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U= -github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.0.0/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.0.0/go.mod h1:ceIuwmxDWptoW3eCqSXlnPsZFKh4X+R38dWPv7GS9Vs= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.0.0/go.mod h1:s1tW/At+xHqjNFvWU4G0c0Qv33KOhvbGNj0RCTQDV8s= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.2.0/go.mod h1:c+Lifp3EDEamAkPVzMooRNOK6CZjNSdEnf1A7jsI9u4= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.1.0/go.mod h1:7QJP7dr2wznCMeqIrhMgWGf7XpAQnVrJqDm9nvV3Cu4= -github.com/Azure/azure-service-bus-go v0.11.5/go.mod h1:MI6ge2CuQWBVq+ly456MY7XqNLJip5LO1iSFodbNLbU= -github.com/Azure/azure-storage-blob-go v0.14.0/go.mod h1:SMqIBi+SuiQH32bvyjngEewEeXoPfKMgWlBDaYf6fck= -github.com/Azure/go-amqp v0.16.0/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= -github.com/Azure/go-amqp v0.16.4/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest v0.11.19/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest v0.11.22/go.mod h1:BAWYUWGPEtKPzjVkp0Q6an0MJcJDsoh5Z1BFAEFs4Xs= -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/adal v0.9.14/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/adal v0.9.17/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= -github.com/Azure/go-autorest/autorest/azure/auth v0.5.9/go.mod h1:hg3/1yw0Bq87O3KvvnJoAh34/0zbP7SFizX/qN5JvjU= -github.com/Azure/go-autorest/autorest/azure/cli v0.4.2/go.mod h1:7qkJkT+j6b+hIpzMOwPChJhTqS8VbsqqgULzMNRugoM= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= -github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/AzureAD/microsoft-authentication-library-for-go v0.4.0/go.mod h1:Vt9sXTKwMyGcOxSmLDMnGPgqsUg7m8pe215qMLrDXw4= -github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/GoogleCloudPlatform/cloudsql-proxy v1.29.0/go.mod h1:spvB9eLJH9dutlbPSRmHvSXXHOwGRyeXh1jVdquA2G8= -github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= -github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/apache/arrow-go/v18 v18.4.0 h1:/RvkGqH517iY8bZKc4FD5/kkdwXJGjxf28JIXbJ/oB0= -github.com/apache/arrow-go/v18 v18.4.0/go.mod h1:Aawvwhj8x2jURIzD9Moy72cF0FyJXOpkYpdmGRHcw14= -github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 h1:byKBBF2CKWBjjA4J1ZL2JXttJULvWSl50LegTyRZ728= -github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516/go.mod h1:QNYViu/X0HXDHw7m3KXzWSVXIbfUvJqBFe6Gj8/pYA0= -github.com/apache/thrift v0.0.0-20181112125854-24918abba929/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.14.2/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.22.0 h1:r7mTJdj51TMDe6RtcmNdQxgn9XcyfGDOzegMDRg47uc= -github.com/apache/thrift v0.22.0/go.mod h1:1e7J/O1Ae6ZQMTYdy9xa3w9k+XHWPfRvdPyJeynQ+/g= -github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= -github.com/aws/aws-sdk-go v1.30.19/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= -github.com/aws/aws-sdk-go v1.37.0/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go v1.43.31 h1:yJZIr8nMV1hXjAvvOLUFqZRJcHV7udPQBfhJqawDzI0= -github.com/aws/aws-sdk-go v1.43.31/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= -github.com/aws/aws-sdk-go-v2 v1.16.2/go.mod h1:ytwTPBG6fXTZLxxeeCCWj2/EMYp/xDUgX+OET6TLNNU= -github.com/aws/aws-sdk-go-v2 v1.23.0/go.mod h1:i1XDttT4rnf6vxc9AuskLc6s7XBee8rlLilKlc03uAA= -github.com/aws/aws-sdk-go-v2 v1.37.0 h1:YtCOESR/pN4j5oA7cVHSfOwIcuh/KwHC4DOSXFbv5F0= -github.com/aws/aws-sdk-go-v2 v1.37.0/go.mod h1:9Q0OoGQoboYIAJyslFyF1f5K1Ryddop8gqMhWx/n4Wg= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.1/go.mod h1:n8Bs1ElDD2wJ9kCRTczA83gYbBmjSwZp3umc6zF4EeM= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.1/go.mod h1:t8PYl/6LzdAqsU4/9tz28V/kU+asFePvpOMkdul0gEQ= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 h1:6GMWV6CNpA/6fbFHnoAjrv4+LGfyTqZz2LtCHnspgDg= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0/go.mod h1:/mXlTIVG9jbxkqDnr5UQNQxW1HRYxeGklkM9vAFeabg= -github.com/aws/aws-sdk-go-v2/config v1.15.3/go.mod h1:9YL3v07Xc/ohTsxFXzan9ZpFpdTOFl4X65BAKYaz8jg= -github.com/aws/aws-sdk-go-v2/config v1.25.3/go.mod h1:tAByZy03nH5jcq0vZmkcVoo6tRzRHEwSFx3QW4NmDw8= -github.com/aws/aws-sdk-go-v2/config v1.30.1 h1:sHL8g/+9tcZATeV2tEkEfxZeaNokDtKsSjGMGHD49qA= -github.com/aws/aws-sdk-go-v2/config v1.30.1/go.mod h1:wkibEyFfxXRyTSzRU4bbF5IUsSXyE4xQ4ZjkGmi5tFo= -github.com/aws/aws-sdk-go-v2/credentials v1.11.2/go.mod h1:j8YsY9TXTm31k4eFhspiQicfXPLZ0gYXA50i4gxPE8g= -github.com/aws/aws-sdk-go-v2/credentials v1.16.2/go.mod h1:sDdvGhXrSVT5yzBDR7qXz+rhbpiMpUYfF3vJ01QSdrc= -github.com/aws/aws-sdk-go-v2/credentials v1.18.1 h1:E55xvOqlX7CvB66Z7rSM9usCrFU1ryUIUHqiXsEzVoE= -github.com/aws/aws-sdk-go-v2/credentials v1.18.1/go.mod h1:iobSQfR5MkvILxssGOvi/P1jjOhrRzfTiCPCzku0vx4= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.3/go.mod h1:uk1vhHHERfSVCUnqSqz8O48LBYDSC+k6brng09jcMOk= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.4/go.mod h1:t4i+yGHMCcUNIX1x7YVYa6bH/Do7civ5I6cG/6PMfyA= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0 h1:9sBTeKQwAvmJUWKIACIoiFSnxxl+sS++YDfr17/ngq0= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0/go.mod h1:LW9/PxQD1SYFC7pnWcgqPhoyZprhjEdg5hBK6qYPLW8= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.3/go.mod h1:0dHuD2HZZSiwfJSy1FO5bX1hQ1TxVV1QXXjpn3XUE44= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.14.0/go.mod h1:UcgIwJ9KHquYxs6Q5skC9qXjhYMK+JASDYcXQ4X7JZE= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1 h1:aAjA/1JZ1xH/F9XvxJu9cXZyp7BqVXtHpztyZ6p799E= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1/go.mod h1:ia9HASsPba/7o84sp6iE4wZPdNTJ0oicBe5sWQQk+Ys= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.9/go.mod h1:AnVH5pvai0pAF4lXRq0bmhbes1u9R8wTE+g+183bZNM= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.3/go.mod h1:7sGSz1JCKHWWBHq98m6sMtWQikmYPpxjqOydDemiVoM= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0 h1:H2iZoqW/v2Jnrh1FnU725Bq6KJ0k2uP63yH+DcY+HUI= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0/go.mod h1:L0FqLbwMXHvNC/7crWV1iIxUlOKYZUE8KuTIA+TozAI= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.3/go.mod h1:ssOhaLpRlh88H3UmEcsBoVKq309quMvm3Ds8e9d4eJM= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.3/go.mod h1:ify42Rb7nKeDDPkFjKn7q1bPscVPu/+gmHH8d2c+anU= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0 h1:EDped/rNzAhFPhVY0sDGbtD16OKqksfA8OjF/kLEgw8= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0/go.mod h1:uUI335jvzpZRPpjYx6ODc/wg1qH+NnoSTK/FwVeK0C0= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.10/go.mod h1:8DcYQcz0+ZJaSxANlHIsbbi6S+zMwjwdDqwW3r9AzaE= -github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.3/go.mod h1:5yzAuE9i2RkVAttBl8yxZgQr5OCq4D5yDnG7j9x2L0U= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0 h1:iLvW/zOkHGU3BDU5thWnj+UZ9pjhuVhv1loLj7yVtBw= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0/go.mod h1:Fn3gvhdF1x5Rs9nUoCy/fJT1ms8f8dO7RqM9lJHuazQ= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.1/go.mod h1:GeUru+8VzrTXV/83XyMJ80KpH8xO89VPoUileyNQ+tc= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1/go.mod h1:l9ymW25HOqymeU2m1gbUQ3rUIsTwKs8gYHXkqDQUhiI= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 h1:6+lZi2JeGKtCraAj1rpoZfKqnQ9SptseRZioejfUOLM= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0/go.mod h1:eb3gfbVIxIoGgJsi9pGne19dhCBpK6opTYpQqAmdy44= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.3/go.mod h1:Seb8KNmD6kVTjwRjVEgOT5hPin6sq+v4C2ycJQDwuH8= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.3/go.mod h1:R+/S1O4TYpcktbVwddeOYg+uwUfLhADP2S/x4QwsCTM= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0 h1:qGyLBQPphYzUf+IIlb5tHnvg1U2Vc5hXPcP7oRSQfy0= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0/go.mod h1:g+dzKSLXiR/8ATkPXmLhPOI6rDdjLP3tngeo3FvDcIw= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.3/go.mod h1:wlY6SVjuwvh3TVRpTqdy4I1JpBFLX4UGeKZdWntaocw= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.3/go.mod h1:Owv1I59vaghv1Ax8zz8ELY8DN7/Y0rGS+WWAmjgi950= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0 h1:eRhU3Sh8dGbaniI6B+I48XJMrTPRkK4DKo+vqIxziOU= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0/go.mod h1:paNLV18DZ6FnWE/bd06RIKPDIFpjuvCkGKWTG/GDBeM= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.3/go.mod h1:Bm/v2IaN6rZ+Op7zX+bOUMdL4fsrYZiD0dsjLhNKwZc= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.3/go.mod h1:KZgs2ny8HsxRIRbDwgvJcHHBZPOzQr/+NtGwnP+w2ec= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0 h1:6jusT+XCcvnD+Elxvm7bUf5sCMTpZEp3AKjYQ4tWJSo= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0/go.mod h1:LimGpdIF/sTBdgqwOEkrArXLCoTamK/9L9x8IKBFTIc= -github.com/aws/aws-sdk-go-v2/service/kms v1.16.3/go.mod h1:QuiHPBqlOFCi4LqdSskYYAWpQlx3PKmohy+rE2F+o5g= -github.com/aws/aws-sdk-go-v2/service/s3 v1.26.3/go.mod h1:g1qvDuRsJY+XghsV6zg00Z4KJ7DtFFCx8fJD2a491Ak= -github.com/aws/aws-sdk-go-v2/service/s3 v1.43.0/go.mod h1:NXRKkiRF+erX2hnybnVU660cYT5/KChRD4iUgJ97cI8= -github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0 h1:gAV4NEp4A+JOrIdoXkAeyy6IOo7+X2s/jRuaHKYiMaU= -github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0/go.mod h1:JIQwK8sZ5MuKGm5rrFwp9MHUcyYEsQNpVixuPDlnwaU= -github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.15.4/go.mod h1:PJc8s+lxyU8rrre0/4a0pn2wgwiDvOEzoOjcJUBr67o= -github.com/aws/aws-sdk-go-v2/service/sns v1.17.4/go.mod h1:kElt+uCcXxcqFyc+bQqZPFD9DME/eC6oHBXvFzQ9Bcw= -github.com/aws/aws-sdk-go-v2/service/sqs v1.18.3/go.mod h1:skmQo0UPvsjsuYYSYMVmrPc1HWCbHUJyrCEp+ZaLzqM= -github.com/aws/aws-sdk-go-v2/service/ssm v1.24.1/go.mod h1:NR/xoKjdbRJ+qx0pMR4mI+N/H1I1ynHwXnO6FowXJc0= -github.com/aws/aws-sdk-go-v2/service/sso v1.11.3/go.mod h1:7UQ/e69kU7LDPtY40OyoHYgRmgfGM4mgsLYtcObdveU= -github.com/aws/aws-sdk-go-v2/service/sso v1.17.2/go.mod h1:/pE21vno3q1h4bbhUOEi+6Zu/aT26UK2WKkDXd+TssQ= -github.com/aws/aws-sdk-go-v2/service/sso v1.26.0 h1:cuFWHH87GP1NBGXXfMicUbE7Oty5KpPxN6w4JpmuxYc= -github.com/aws/aws-sdk-go-v2/service/sso v1.26.0/go.mod h1:aJBemdlbCKyOXEXdXBqS7E+8S9XTDcOTaoOjtng54hA= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.20.0/go.mod h1:dWqm5G767qwKPuayKfzm4rjzFmVjiBFbOJrpSPnAMDs= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0 h1:t2va+wewPOYIqC6XyJ4MGjiGKkczMAPsgq5W4FtL9ME= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0/go.mod h1:ExCTcqYqN0hYYRsDlBVU8+68grqlWdgX9/nZJwQW4aY= -github.com/aws/aws-sdk-go-v2/service/sts v1.16.3/go.mod h1:bfBj0iVmsUyUg4weDB4NxktD9rDGeKSVWnjTnwbx9b8= -github.com/aws/aws-sdk-go-v2/service/sts v1.25.3/go.mod h1:4EqRHDCKP78hq3zOnmFXu5k0j4bXbRFfCh/zQ6KnEfQ= -github.com/aws/aws-sdk-go-v2/service/sts v1.35.0 h1:FD9agdG4CeOGS3ORLByJk56YIXDS7mxFpmZyCtpqExc= -github.com/aws/aws-sdk-go-v2/service/sts v1.35.0/go.mod h1:NDzDPbBF1xtSTZUMuZx0w3hIfWzcL7X2AQ0Tr9becIQ= -github.com/aws/smithy-go v1.11.2/go.mod h1:3xHYmszWVx2c0kIwQeEVf9uSm4fYZt67FBJnwub1bgM= -github.com/aws/smithy-go v1.17.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= -github.com/aws/smithy-go v1.22.5 h1:P9ATCXPMb2mPjYBgueqJNCA5S9UfktsW0tTxi+a7eqw= -github.com/aws/smithy-go v1.22.5/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/bobg/gcsobj v0.1.2/go.mod h1:vS49EQ1A1Ib8FgrL58C8xXYZyOCR2TgzAdopy6/ipa8= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -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/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/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= -github.com/colinmarc/hdfs/v2 v2.1.1/go.mod h1:M3x+k8UKKmxtFu++uAZ0OtDU8jR3jnaZIAc6yK4Ue0c= -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/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU= -github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= -github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= -github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= -github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= -github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/duckdb/duckdb-go-bindings v0.1.16 h1:XPCk9hzP06PoWIxDPVU3gAy0m1XmLaZHTzLggNx/U9k= -github.com/duckdb/duckdb-go-bindings v0.1.16/go.mod h1:pBnfviMzANT/9hi4bg+zW4ykRZZPCXlVuvBWEcZofkc= -github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11 h1:GXQkG4HmEbwPtqCSabJTp9wZQQ7Gqr3KveLNesQWQOs= -github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11/go.mod h1:Ezo7IbAfB8NP7CqPIN8XEHKUg5xdRRQhcPPlCXImXYA= -github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11 h1:ATJMSBIDA/YAm/6CKeBDRtGK1OOwqfTZbWg9Y5fAc9E= -github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11/go.mod h1:eS7m/mLnPQgVF4za1+xTyorKRBuK0/BA44Oy6DgrGXI= -github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11 h1:AjvnGst1avyOECYiykthyHR4DTYTaqNDPr5W/0t5j0k= -github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11/go.mod h1:1GOuk1PixiESxLaCGFhag+oFi7aP+9W8byymRAvunBk= -github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11 h1:j3B1biawuhtxe2Chkiqcwf1Kxe8VJc8lLVmjBIcJrkI= -github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11/go.mod h1:o7crKMpT2eOIi5/FY6HPqaXcvieeLSqdXXaXbruGX7w= -github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11 h1:xR3vRE8y+48U6xDNkUlOfbl7/OTA7FVcDXJ+5vETuHU= -github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11/go.mod h1:IlOhJdVKUJCAPj3QsDszUo8DVdvp1nBFp4TUJVdw99s= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -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/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= -github.com/gin-gonic/gin v1.7.3/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= -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-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= -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-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= -github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-viper/mapstructure/v2 v2.3.0 h1:27XbWsHIqhbdR5TIC911OfYvgSaW93HM+dX7970Q7jk= -github.com/go-viper/mapstructure/v2 v2.3.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= -github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= -github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.4.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= -github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188/go.mod h1:vXjM/+wXQnTPR4KqTKDgJukSZ6amVRtWMPEjE6sQoK8= -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/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/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -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.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= -github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -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/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/flatbuffers v25.2.10+incompatible h1:F3vclr7C3HpB1k9mxCGRMXq6FdUalZ6H/pNX4FP1v0Q= -github.com/google/flatbuffers v25.2.10+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -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.6/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.8/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/go-replayers/grpcreplay v1.1.0/go.mod h1:qzAvJ8/wi57zq7gWqaE6AwLM6miiXUQwP1S+I9icmhk= -github.com/google/go-replayers/httpreplay v1.1.1/go.mod h1:gN9GeLIs7l6NUoVaSSnv2RiqK1NiwAmD0MrKeC9IIks= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+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/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -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-20200905233945-acf8798be1f7/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-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210506205249-923b5ab0fc1a/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.2.0/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.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= -github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/wire v0.5.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU= -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.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hanwen/go-fuse v1.0.0/go.mod h1:unqXarDXqzAk0rt98O2tVndEPIpUgLD9+rwFisZH3Ok= -github.com/hanwen/go-fuse/v2 v2.1.0/go.mod h1:oRyA5eK+pvJyv5otpO/DgccS8y/RvYMaO00GgRLGryc= -github.com/hashicorp/go-uuid v0.0.0-20180228145832-27454136f036/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -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/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/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.11.0/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= -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/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.2.0/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-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= -github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/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.10.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.15.0/go.mod h1:D/zyOyXiaM1TmVWnOM18p0xdDtdakRBa0RsVGI3U3bw= -github.com/jackc/pgx/v5 v5.7.5 h1:JHGfMnQY+IEtGM63d+NGMjoRpysB2JBwDr5fsngwmJs= -github.com/jackc/pgx/v5 v5.7.5/go.mod h1:aruU7o91Tc2q2cFp5h4uP3f6ztExVpyVv88Xl/8Vl8M= -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.2.1 h1:gI8os0wpRXFd4FiAY2dWiqRK037tjj3t7rKFeO4X5iw= -github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= -github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= -github.com/jcmturner/gofork v0.0.0-20180107083740-2aebee971930/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= -github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= -github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -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/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= -github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= -github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.13.1/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= -github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= -github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= -github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= -github.com/klauspost/cpuid/v2 v2.2.11 h1:0OwqZRYI2rFrjS4kvkDnqJkKHdHaRnCm68/DY4OxRzU= -github.com/klauspost/cpuid/v2 v2.2.11/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= -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/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -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/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -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.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/linkedin/goavro v2.1.0+incompatible h1:DV2aUlj2xZiuxQyvag8Dy7zjY69ENjS66bWkSfdpddY= -github.com/linkedin/goavro v2.1.0+incompatible/go.mod h1:bBCwI2eGYpUI/4820s67MElg9tdeLbINjLjiM2xZFYM= -github.com/marcboeker/go-duckdb/arrowmapping v0.0.9 h1:xj+kFOqR2gH3Mcxx9LmAVHebSnCiPm303N+uxfkWVmY= -github.com/marcboeker/go-duckdb/arrowmapping v0.0.9/go.mod h1:o56AqVS90v5bpxhPnOK9La7AfNTOrMORiqTQrlRbdPQ= -github.com/marcboeker/go-duckdb/mapping v0.0.10 h1:b/y2W8/hNlD0Dwjq0mCqIlLXpjQMnWy0WqDV9b9lHQQ= -github.com/marcboeker/go-duckdb/mapping v0.0.10/go.mod h1:Ro6Tw6sGG50O8S0daZsA8TrQJz/DvGrzGvMD7Jihirw= -github.com/marcboeker/go-duckdb/v2 v2.3.2 h1:96zG2JPyIhCFjHdBjjSpOdhzJzehoGTdl7LskkuMUTs= -github.com/marcboeker/go-duckdb/v2 v2.3.2/go.mod h1:VeXz9ZM6klNvICHrXEUzaHSgNqBeTdyMxr4CICw/UaY= -github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= -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.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs= -github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= -github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI= -github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= -github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= -github.com/minio/minio-go/v7 v7.0.34/go.mod h1:nCrRzjoSUQh8hgKKtu3Y708OLvRLtuASMg2/nvmbarw= -github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= -github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= -github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= -github.com/nats-io/nats.go v1.43.0 h1:uRFZ2FEoRvP64+UUhaTokyS18XBCR/xM2vQZKO4i8ug= -github.com/nats-io/nats.go v1.43.0/go.mod h1:iRWIPokVIFbVijxuMQq4y9ttaBTMe0SFdlZfMDd+33g= -github.com/nats-io/nkeys v0.4.11 h1:q44qGV008kYd9W1b1nEBkNzvnWxtRSQ7A8BoqRrcfa0= -github.com/nats-io/nkeys v0.4.11/go.mod h1:szDimtgmfOi9n25JpfIdGw12tZFYXqhGxjhVxsatHVE= -github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= -github.com/ncw/swift v1.0.52/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -github.com/pborman/getopt v0.0.0-20180729010549-6fdd0a2c7117/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= -github.com/pierrec/lz4/v4 v4.1.8/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= -github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= -github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= -github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= -github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -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/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -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/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.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -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/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -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.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -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.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/xitongsys/parquet-go v1.5.1/go.mod h1:xUxwM8ELydxh4edHGegYq1pA8NnMKDx0K/GyB0o2bww= -github.com/xitongsys/parquet-go v1.6.2 h1:MhCaXii4eqceKPu9BwrjLqyK10oX9WF+xGhwvwbw7xM= -github.com/xitongsys/parquet-go v1.6.2/go.mod h1:IulAQyalCm0rPiZVNnCgm/PCL64X2tdSVGMQ/UeKqWA= -github.com/xitongsys/parquet-go-source v0.0.0-20190524061010-2b72cbee77d5/go.mod h1:xxCx7Wpym/3QCo6JhujJX51dzSXrwmb0oH6FQb39SEA= -github.com/xitongsys/parquet-go-source v0.0.0-20200817004010-026bad9b25d0/go.mod h1:HYhIKsdns7xz80OgkbgJYrtQY7FjHWHKH6cvN7+czGE= -github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b h1:zbb5qM/t3N+O33Vp5sFyG6yIcWZV1q7rfEjJM8UsRBQ= -github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b/go.mod h1:2ActxmJ4q17Cdruar9nKEkzKSOL1Ol03737Bkz10rTY= -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.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= -github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= -github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= -github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= -github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= -go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0= -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.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -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/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -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.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= -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.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= -gocloud.dev v0.26.0/go.mod h1:mkUgejbnbLotorqDyvedJO20XcZNTynmSeVSQS9btVg= -golang.org/x/crypto v0.0.0-20180723164146-c126467f60eb/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -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-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/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-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-20211115234514-b4de73f9ece8/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220511200225-c6db032c6c88/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= -golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM= -golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY= -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-20250718183923-645b1fa84792 h1:R9PFI6EUdfVKgwKjZef7QIwGcBKu86OEFpJ9nUEP2l4= -golang.org/x/exp v0.0.0-20250718183923-645b1fa84792/go.mod h1:A+z0yzpGtvnG90cToK5n2tu8UJVP2XUATh+r+sfOOOc= -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/lint v0.0.0-20210508222113-6edffad5e616/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.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg= -golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ= -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-20191112182307-2180aed22343/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-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -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-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211020060615-d418f374d309/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220401154927-543a649e0bdd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -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.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -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.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -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-20210220032951-036812b2e83c/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.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= -golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= -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-20191112214154-59a1497f0cea/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-20200828194041-157a740278f4/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-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/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-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/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-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220204135822-1c1b9b1eba6a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220330033206-e17cdc41300f/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-20220704084225-05e143d24a9e/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.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA= -golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -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/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -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.5/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.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4= -golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU= -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/time v0.0.0-20211116232009-f0f3c7e86c11/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220224211638-0e9765cccd65/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-20190422233926-fe54fb35175b/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-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-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-20200828161849-5deb26317202/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20200915173823-2db8f0ff891c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20200918232735-d647fc253266/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -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.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0= -golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw= -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= -golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= -golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= -gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= -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.31.0/go.mod h1:CL+9IBCa2WWU6gRuBWaKqGWLFFwbEUXkfeMkHLQWYWo= -google.golang.org/api v0.32.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -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.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.46.0/go.mod h1:ceL4oozhkAiTID8XMmJBsIxID/9wMXJVVFXPg4ylg3I= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.58.0/go.mod h1:cAbP2FsxoGVNwtgNAmmn3y5G1TWAiVYRmg4yku3lv+E= -google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.64.0/go.mod h1:931CdxA8Rm4t6zqTFGSsgwbAEZ2+GMYurbndwSimebM= -google.golang.org/api v0.66.0/go.mod h1:I1dmXYpX7HGwz/ejRxwQp2qj5bFAz93HiCU1C1oYd9M= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.68.0/go.mod h1:sOM8pTpwgflXRhz+oC8H2Dr+UcbMqkPPWNJo88Q7TH8= -google.golang.org/api v0.69.0/go.mod h1:boanBiw+h5c3s+tBPgEzLDRHfFLWV0qXxRHz3ws7C80= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -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/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-20200513103714-09dca8ec2884/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-20200831141814-d751682dd103/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-20200914193844-75d14daec038/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200921151605-7abf4a1a14d5/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-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210429181445-86c259c2b4ab/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210517163617-5e0236093d7a/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210921142501-181ce0d877f6/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211018162055-cf77aa76bad2/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211223182754-3ac035c7e7cb/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220111164026-67b88f271998/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220114231437-d2e6a121cae0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220201184016-50beb8ab5c44/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220204002441-d6cc3cc0770e/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220211171837-173942840c17/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220216160803-4663080d8bc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220401170504-314d38edb7de/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -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.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -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.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= -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.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -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-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= -gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= -gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q= -gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mNfM5bm88whjWx4= -gopkg.in/jcmturner/gokrb5.v7 v7.3.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= -gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8= -gopkg.in/linkedin/goavro.v1 v1.0.5 h1:BJa69CDh0awSsLUmZ9+BowBdokpduDZSM9Zk8oKHfN4= -gopkg.in/linkedin/goavro.v1 v1.0.5/go.mod h1:Aw5GdAbizjOEl0kAMHV9iHmA8reZzW/OKuJAl4Hb9F0= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/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/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= -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= -nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= -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/src/syncer-postgres/lib/config.go b/src/syncer-postgres/lib/config.go deleted file mode 100644 index 916a92b..0000000 --- a/src/syncer-postgres/lib/config.go +++ /dev/null @@ -1,194 +0,0 @@ -package postgres - -import ( - "flag" - "os" - "slices" - "strings" - - "github.com/BemiHQ/BemiDB/src/common" -) - -type SyncMode string - -const ( - SyncModeFullRefresh SyncMode = "FULL_REFRESH" - SyncModeCDC SyncMode = "CDC" - SyncModeIncremental SyncMode = "INCREMENTAL" - - ENV_DESTINATION_SCHEMA_NAME = "DESTINATION_SCHEMA_NAME" - - ENV_DATABASE_URL = "SOURCE_POSTGRES_DATABASE_URL" - ENV_SYNC_MODE = "SOURCE_POSTGRES_SYNC_MODE" - ENV_INCLUDE_TABLES = "SOURCE_POSTGRES_INCLUDE_TABLES" - ENV_EXCLUDE_TABLES = "SOURCE_POSTGRES_EXCLUDE_TABLES" - ENV_CURSOR_COLUMNS = "SOURCE_POSTGRES_CURSOR_COLUMNS" // Incremental sync - ENV_REPLICATION_SLOT = "SOURCE_POSTGRES_REPLICATION_SLOT" // CDC sync - ENV_IGNORE_UPDATE_COLUMNS = "SOURCE_POSTGRES_IGNORE_UPDATE_COLUMNS" // CDC sync - - // CDC sync - ENV_NATS_URL = "NATS_URL" - ENV_NATS_STREAM = "NATS_JETSTREAM_STREAM" - ENV_NATS_SUBJECT = "NATS_JETSTREAM_SUBJECT" - ENV_NATS_CONSUMER_NAME = "NATS_JETSTREAM_CONSUMER_NAME" - ENV_NATS_FETCH_TIMEOUT_SECONDS = "NATS_FETCH_TIMEOUT_SECONDS" - - DEFAULT_NATS_FETCH_TIMEOUT_SECONDS = 30 -) - -type NatsConfig struct { - Url string - Stream string - Subject string - ConsumerName string - FetchTimeoutSeconds int -} - -type Config struct { - CommonConfig *common.CommonConfig - DestinationSchemaName string - - SyncMode SyncMode - DatabaseUrl string - IncludeTables common.Set[string] - ExcludeTables common.Set[string] - CursorColumnNameByTableName map[string]string // Incremental sync - ReplicationSlot string // CDC sync - IgnoreUpdateColumns common.Set[string] // CDC sync - Nats NatsConfig // CDC sync -} - -type configParseValues struct { - IncludeTables string - ExcludeTables string - IgnoreUpdateColumns string - CursorColumns string -} - -var _config Config -var _configParseValues configParseValues - -func RegisterFlags() { - _config.CommonConfig = &common.CommonConfig{} - - flag.StringVar(&_config.CommonConfig.LogLevel, "log-level", os.Getenv(common.ENV_LOG_LEVEL), `Log level: "ERROR", "WARN", "INFO", "DEBUG", "TRACE". Default: "`+common.DEFAULT_LOG_LEVEL+`"`) - flag.StringVar(&_config.CommonConfig.CatalogDatabaseUrl, "catalog-database-url", os.Getenv(common.ENV_CATALOG_DATABASE_URL), "Catalog database URL") - flag.StringVar(&_config.CommonConfig.Aws.Region, "aws-region", os.Getenv(common.ENV_AWS_REGION), "AWS region") - flag.StringVar(&_config.CommonConfig.Aws.S3Endpoint, "aws-s3-endpoint", os.Getenv(common.ENV_AWS_S3_ENDPOINT), "AWS S3 endpoint. Default: \""+common.DEFAULT_AWS_S3_ENDPOINT+`"`) - flag.StringVar(&_config.CommonConfig.Aws.S3Bucket, "aws-s3-bucket", os.Getenv(common.ENV_AWS_S3_BUCKET), "AWS S3 bucket name") - flag.StringVar(&_config.CommonConfig.Aws.AccessKeyId, "aws-access-key-id", os.Getenv(common.ENV_AWS_ACCESS_KEY_ID), "AWS access key ID") - flag.StringVar(&_config.CommonConfig.Aws.SecretAccessKey, "aws-secret-access-key", os.Getenv(common.ENV_AWS_SECRET_ACCESS_KEY), "AWS secret access key") - flag.BoolVar(&_config.CommonConfig.DisableAnonymousAnalytics, "disable-anonymous-analytics", os.Getenv(common.ENV_DISABLE_ANONYMOUS_ANALYTICS) == "true", "Disable anonymous analytics collection") - - flag.StringVar(&_config.DestinationSchemaName, "destination-schema-name", os.Getenv(ENV_DESTINATION_SCHEMA_NAME), "Destination schema name to store the synced data") - flag.StringVar(&_config.DatabaseUrl, "database-url", os.Getenv(ENV_DATABASE_URL), "PostgreSQL database URL") - flag.StringVar((*string)(&_config.SyncMode), "sync-mode", os.Getenv(ENV_SYNC_MODE), `Sync mode: "FULL_REFRESH", "CDC", or "INCREMENTAL"`) - flag.StringVar(&_configParseValues.IncludeTables, "include-tables", os.Getenv(ENV_INCLUDE_TABLES), "Comma-separated list of tables to include in the sync. Default: all tables included") - flag.StringVar(&_configParseValues.ExcludeTables, "exclude-tables", os.Getenv(ENV_EXCLUDE_TABLES), "Comma-separated list of tables to exclude from the sync. Default: no tables excluded") - flag.StringVar(&_configParseValues.CursorColumns, "cursor-columns", os.Getenv(ENV_CURSOR_COLUMNS), "Cursor columns to use for incremental sync. Format: schema.table=column,schema2.table2=column2. Default: no cursor columns specified") - flag.StringVar(&_config.ReplicationSlot, "replication-slot", os.Getenv(ENV_REPLICATION_SLOT), "Replication slot name for CDC sync") - flag.StringVar(&_configParseValues.IgnoreUpdateColumns, "ignore-update-columns", os.Getenv(ENV_IGNORE_UPDATE_COLUMNS), "Comma-separated list of columns to ignore for updates in CDC mode. Default: no columns ignored") - flag.StringVar(&_config.Nats.Url, "nats-url", os.Getenv(ENV_NATS_URL), "NATS URL") - flag.StringVar(&_config.Nats.Stream, "nats-stream", os.Getenv(ENV_NATS_STREAM), "NATS stream to read from") - flag.StringVar(&_config.Nats.Subject, "nats-subject", os.Getenv(ENV_NATS_SUBJECT), "NATS subject to read from") - flag.StringVar(&_config.Nats.ConsumerName, "nats-consumer-name", os.Getenv(ENV_NATS_CONSUMER_NAME), "NATS consumer name for the JetStream consumer") - flag.IntVar(&_config.Nats.FetchTimeoutSeconds, "nats-fetch-timeout-seconds", DEFAULT_NATS_FETCH_TIMEOUT_SECONDS, "NATS fetch timeout in seconds") - fetchTimeoutSeconds := os.Getenv(ENV_NATS_FETCH_TIMEOUT_SECONDS) - if fetchTimeoutSeconds != "" { - _config.Nats.FetchTimeoutSeconds = common.StringToInt(fetchTimeoutSeconds) - } -} - -func LoadConfig() *Config { - parseFlags() - return &_config -} - -func parseFlags() { - flag.Parse() - - if _config.CommonConfig.LogLevel == "" { - _config.CommonConfig.LogLevel = common.DEFAULT_LOG_LEVEL - } else if !slices.Contains(common.LOG_LEVELS, _config.CommonConfig.LogLevel) { - panic("Invalid log level " + _config.CommonConfig.LogLevel + ". Must be one of " + strings.Join(common.LOG_LEVELS, ", ")) - } - if _config.CommonConfig.CatalogDatabaseUrl == "" { - panic("Catalog database URL is required") - } - if _config.CommonConfig.Aws.Region == "" { - panic("AWS region is required") - } - if _config.CommonConfig.Aws.S3Endpoint == "" { - _config.CommonConfig.Aws.S3Endpoint = common.DEFAULT_AWS_S3_ENDPOINT - } - if _config.CommonConfig.Aws.S3Bucket == "" { - panic("AWS S3 bucket name is required") - } - if _config.CommonConfig.Aws.AccessKeyId != "" && _config.CommonConfig.Aws.SecretAccessKey == "" { - panic("AWS secret access key is required") - } - if _config.CommonConfig.Aws.AccessKeyId == "" && _config.CommonConfig.Aws.SecretAccessKey != "" { - panic("AWS access key ID is required") - } - - if _config.DestinationSchemaName == "" { - panic("Destination schema name is required") - } - if _configParseValues.IncludeTables != "" && _configParseValues.ExcludeTables != "" { - panic("Cannot specify both include-tables and exclude-tables. Please use one or the other.") - } - if _configParseValues.IncludeTables != "" { - _config.IncludeTables = common.NewSet[string]().AddAll(strings.Split(_configParseValues.IncludeTables, ",")) - } - if _configParseValues.ExcludeTables != "" { - _config.ExcludeTables = common.NewSet[string]().AddAll(strings.Split(_configParseValues.ExcludeTables, ",")) - } - - if _config.SyncMode == "" { - panic("Sync mode is required") - } else if _config.SyncMode != SyncModeFullRefresh && _config.SyncMode != SyncModeCDC && _config.SyncMode != SyncModeIncremental { - panic("Invalid sync mode " + string(_config.SyncMode) + ". Must be one of FULL_REFRESH, CDC, or INCREMENTAL") - } - - switch _config.SyncMode { - case SyncModeCDC: - if _config.ReplicationSlot == "" { - panic("Replication slot name is required for CDC sync") - } - if _configParseValues.IgnoreUpdateColumns != "" { - _config.IgnoreUpdateColumns = common.NewSet[string]().AddAll(strings.Split(_configParseValues.IgnoreUpdateColumns, ",")) - } - - if _config.Nats.Url == "" { - panic("NATS URL is required") - } - if _config.Nats.Stream == "" { - panic("NATS stream is required") - } - if _config.Nats.Subject == "" { - panic("NATS subject is required") - } - if _config.Nats.ConsumerName == "" { - panic("NATS consumer name is required") - } - if _config.Nats.FetchTimeoutSeconds <= 0 { - panic("NATS fetch timeout must be greater than 0") - } - case SyncModeIncremental: - if _configParseValues.CursorColumns != "" { - _config.CursorColumnNameByTableName = make(map[string]string) - cursorColumns := strings.Split(_configParseValues.CursorColumns, ",") - for _, cursorColumn := range cursorColumns { - parts := strings.Split(cursorColumn, "=") - if len(parts) != 2 { - panic("Invalid cursor column format. Expected schema.table=column, got: " + cursorColumn) - } - _config.CursorColumnNameByTableName[parts[0]] = parts[1] - } - } - } - - if _config.DatabaseUrl == "" { - panic("Source PostgreSQL database URL is required") - } -} diff --git a/src/syncer-postgres/lib/debezium.go b/src/syncer-postgres/lib/debezium.go deleted file mode 100644 index 41f0962..0000000 --- a/src/syncer-postgres/lib/debezium.go +++ /dev/null @@ -1,29 +0,0 @@ -package postgres - -type DebeziumData struct { - Operation string `json:"op"` -} - -type DebeziumOperation string - -const ( - InsertOperation DebeziumOperation = "c" - UpdateOperation DebeziumOperation = "u" - DeleteOperation DebeziumOperation = "d" - MessageOperation DebeziumOperation = "m" - SnapshotOperation DebeziumOperation = "r" -) - -type DebeziumRowSource struct { - Schema string `json:"schema"` - Table string `json:"table"` - CommittedAtNs int64 `json:"ts_ns"` - Position int64 `json:"lsn"` -} - -type DebeziumRowData struct { - Operation string `json:"op"` - Before map[string]interface{} `json:"before"` - After map[string]interface{} `json:"after"` - Source DebeziumRowSource `json:"source"` -} diff --git a/src/syncer-postgres/lib/go.mod b/src/syncer-postgres/lib/go.mod deleted file mode 100644 index 91f0960..0000000 --- a/src/syncer-postgres/lib/go.mod +++ /dev/null @@ -1,69 +0,0 @@ -module github.com/BemiHQ/BemiDB/src/syncer-postgres/lib - -go 1.24.4 - -require ( - github.com/BemiHQ/BemiDB/src/common v0.0.0-00010101000000-000000000000 - github.com/nats-io/nats.go v1.43.0 -) - -replace github.com/BemiHQ/BemiDB/src/common => ../../common - -require ( - github.com/apache/arrow-go/v18 v18.4.0 // indirect - github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 // indirect - github.com/apache/thrift v0.22.0 // indirect - github.com/aws/aws-sdk-go-v2 v1.37.0 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 // indirect - github.com/aws/aws-sdk-go-v2/config v1.30.1 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.18.1 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0 // indirect - github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.26.0 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.35.0 // indirect - github.com/aws/smithy-go v1.22.5 // indirect - github.com/duckdb/duckdb-go-bindings v0.1.16 // indirect - github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11 // indirect - github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11 // indirect - github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11 // indirect - github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11 // indirect - github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11 // indirect - github.com/go-viper/mapstructure/v2 v2.3.0 // indirect - github.com/goccy/go-json v0.10.5 // indirect - github.com/golang/snappy v1.0.0 // indirect - github.com/google/flatbuffers v25.2.10+incompatible // indirect - github.com/google/uuid v1.6.0 // indirect - github.com/jackc/pgpassfile v1.0.0 // indirect - github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect - github.com/jackc/pgx/v5 v5.7.5 // indirect - github.com/klauspost/compress v1.18.0 // indirect - github.com/klauspost/cpuid/v2 v2.2.11 // indirect - github.com/linkedin/goavro v2.1.0+incompatible // indirect - github.com/marcboeker/go-duckdb/arrowmapping v0.0.9 // indirect - github.com/marcboeker/go-duckdb/mapping v0.0.10 // indirect - github.com/marcboeker/go-duckdb/v2 v2.3.2 // indirect - github.com/nats-io/nkeys v0.4.11 // indirect - github.com/nats-io/nuid v1.0.1 // indirect - github.com/pierrec/lz4/v4 v4.1.22 // indirect - github.com/xitongsys/parquet-go v1.6.2 // indirect - github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b // indirect - github.com/zeebo/xxh3 v1.0.2 // indirect - golang.org/x/crypto v0.40.0 // indirect - golang.org/x/exp v0.0.0-20250718183923-645b1fa84792 // indirect - golang.org/x/mod v0.26.0 // indirect - golang.org/x/sync v0.16.0 // indirect - golang.org/x/sys v0.34.0 // indirect - golang.org/x/text v0.27.0 // indirect - golang.org/x/tools v0.35.0 // indirect - golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect -) diff --git a/src/syncer-postgres/lib/go.sum b/src/syncer-postgres/lib/go.sum deleted file mode 100644 index d27554a..0000000 --- a/src/syncer-postgres/lib/go.sum +++ /dev/null @@ -1,1166 +0,0 @@ -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.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.66.0/go.mod h1:dgqGAjKCDxyhGTtC9dAREQGUJpkceNm1yt590Qno0Ko= -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.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.82.0/go.mod h1:vlKccHJGuFBFufnAnuB08dfEH9Y3H7dzDzRECFdC2TA= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= -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 v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.2.0/go.mod h1:xlogom/6gr8RJGBe7nT2eGsQYAFUbbv8dbC29qE3Xmw= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -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/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= -cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= -cloud.google.com/go/iam v0.1.1/go.mod h1:CKqrcnI/suGpybEHxZ7BMehL0oA4LpdyJdUlTl9jVMw= -cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= -cloud.google.com/go/kms v1.1.0/go.mod h1:WdbppnCDMDpOvoYBMn1+gNmOeEoZYqAv+HeuKARGCXI= -cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= -cloud.google.com/go/monitoring v1.1.0/go.mod h1:L81pzz7HKn14QCMaCs6NTQkdBnE87TElyanS95vIcl4= -cloud.google.com/go/monitoring v1.4.0/go.mod h1:y6xnxfwI3hTFWOdkOaD7nfJVlwuC3/mS/5kvtT131p4= -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/pubsub v1.19.0/go.mod h1:/O9kmSe9bb9KRnIAWkzmqhPjHo6LtzGOBYd/kr06XSs= -cloud.google.com/go/secretmanager v1.3.0/go.mod h1:+oLTkouyiYiabAQNugCeTS3PAArGiMJuBqvJnJsyH+U= -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.12.0/go.mod h1:fFLk2dp2oAhDz8QFKwqrjdJvxSp/W2g7nillojlL5Ho= -cloud.google.com/go/storage v1.21.0/go.mod h1:XmRlxkgPjlBONznT2dDUU/5XlpU2OjMnKuqnZI01LAA= -cloud.google.com/go/trace v1.0.0/go.mod h1:4iErSByzxkyHWzzlAj63/Gmjz0NH1ASqhJguHpGcr6A= -cloud.google.com/go/trace v1.2.0/go.mod h1:Wc8y/uYyOhPy12KEnXG9XGrvfMz5F5SrYecQlbW1rwM= -contrib.go.opencensus.io/exporter/aws v0.0.0-20200617204711-c478e41e60e9/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= -contrib.go.opencensus.io/exporter/stackdriver v0.13.10/go.mod h1:I5htMbyta491eUxufwwZPQdcKvvgzMB4O9ni41YnIM8= -contrib.go.opencensus.io/integrations/ocsql v0.1.7/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/azure-amqp-common-go/v3 v3.2.1/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= -github.com/Azure/azure-amqp-common-go/v3 v3.2.2/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= -github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k= -github.com/Azure/azure-sdk-for-go v51.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v59.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.0.0/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.0.0/go.mod h1:+6sju8gk8FRmSajX3Oz4G5Gm7P+mbqE9FVaXXFYTkCM= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U= -github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.0.0/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.0.0/go.mod h1:ceIuwmxDWptoW3eCqSXlnPsZFKh4X+R38dWPv7GS9Vs= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.0.0/go.mod h1:s1tW/At+xHqjNFvWU4G0c0Qv33KOhvbGNj0RCTQDV8s= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.2.0/go.mod h1:c+Lifp3EDEamAkPVzMooRNOK6CZjNSdEnf1A7jsI9u4= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.1.0/go.mod h1:7QJP7dr2wznCMeqIrhMgWGf7XpAQnVrJqDm9nvV3Cu4= -github.com/Azure/azure-service-bus-go v0.11.5/go.mod h1:MI6ge2CuQWBVq+ly456MY7XqNLJip5LO1iSFodbNLbU= -github.com/Azure/azure-storage-blob-go v0.14.0/go.mod h1:SMqIBi+SuiQH32bvyjngEewEeXoPfKMgWlBDaYf6fck= -github.com/Azure/go-amqp v0.16.0/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= -github.com/Azure/go-amqp v0.16.4/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest v0.11.19/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest v0.11.22/go.mod h1:BAWYUWGPEtKPzjVkp0Q6an0MJcJDsoh5Z1BFAEFs4Xs= -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/adal v0.9.14/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/adal v0.9.17/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= -github.com/Azure/go-autorest/autorest/azure/auth v0.5.9/go.mod h1:hg3/1yw0Bq87O3KvvnJoAh34/0zbP7SFizX/qN5JvjU= -github.com/Azure/go-autorest/autorest/azure/cli v0.4.2/go.mod h1:7qkJkT+j6b+hIpzMOwPChJhTqS8VbsqqgULzMNRugoM= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= -github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/AzureAD/microsoft-authentication-library-for-go v0.4.0/go.mod h1:Vt9sXTKwMyGcOxSmLDMnGPgqsUg7m8pe215qMLrDXw4= -github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/GoogleCloudPlatform/cloudsql-proxy v1.29.0/go.mod h1:spvB9eLJH9dutlbPSRmHvSXXHOwGRyeXh1jVdquA2G8= -github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= -github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/apache/arrow-go/v18 v18.4.0 h1:/RvkGqH517iY8bZKc4FD5/kkdwXJGjxf28JIXbJ/oB0= -github.com/apache/arrow-go/v18 v18.4.0/go.mod h1:Aawvwhj8x2jURIzD9Moy72cF0FyJXOpkYpdmGRHcw14= -github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516 h1:byKBBF2CKWBjjA4J1ZL2JXttJULvWSl50LegTyRZ728= -github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516/go.mod h1:QNYViu/X0HXDHw7m3KXzWSVXIbfUvJqBFe6Gj8/pYA0= -github.com/apache/thrift v0.0.0-20181112125854-24918abba929/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.14.2/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.22.0 h1:r7mTJdj51TMDe6RtcmNdQxgn9XcyfGDOzegMDRg47uc= -github.com/apache/thrift v0.22.0/go.mod h1:1e7J/O1Ae6ZQMTYdy9xa3w9k+XHWPfRvdPyJeynQ+/g= -github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= -github.com/aws/aws-sdk-go v1.30.19/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= -github.com/aws/aws-sdk-go v1.37.0/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go v1.43.31 h1:yJZIr8nMV1hXjAvvOLUFqZRJcHV7udPQBfhJqawDzI0= -github.com/aws/aws-sdk-go v1.43.31/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= -github.com/aws/aws-sdk-go-v2 v1.16.2/go.mod h1:ytwTPBG6fXTZLxxeeCCWj2/EMYp/xDUgX+OET6TLNNU= -github.com/aws/aws-sdk-go-v2 v1.23.0/go.mod h1:i1XDttT4rnf6vxc9AuskLc6s7XBee8rlLilKlc03uAA= -github.com/aws/aws-sdk-go-v2 v1.37.0 h1:YtCOESR/pN4j5oA7cVHSfOwIcuh/KwHC4DOSXFbv5F0= -github.com/aws/aws-sdk-go-v2 v1.37.0/go.mod h1:9Q0OoGQoboYIAJyslFyF1f5K1Ryddop8gqMhWx/n4Wg= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.1/go.mod h1:n8Bs1ElDD2wJ9kCRTczA83gYbBmjSwZp3umc6zF4EeM= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.1/go.mod h1:t8PYl/6LzdAqsU4/9tz28V/kU+asFePvpOMkdul0gEQ= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 h1:6GMWV6CNpA/6fbFHnoAjrv4+LGfyTqZz2LtCHnspgDg= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0/go.mod h1:/mXlTIVG9jbxkqDnr5UQNQxW1HRYxeGklkM9vAFeabg= -github.com/aws/aws-sdk-go-v2/config v1.15.3/go.mod h1:9YL3v07Xc/ohTsxFXzan9ZpFpdTOFl4X65BAKYaz8jg= -github.com/aws/aws-sdk-go-v2/config v1.25.3/go.mod h1:tAByZy03nH5jcq0vZmkcVoo6tRzRHEwSFx3QW4NmDw8= -github.com/aws/aws-sdk-go-v2/config v1.30.1 h1:sHL8g/+9tcZATeV2tEkEfxZeaNokDtKsSjGMGHD49qA= -github.com/aws/aws-sdk-go-v2/config v1.30.1/go.mod h1:wkibEyFfxXRyTSzRU4bbF5IUsSXyE4xQ4ZjkGmi5tFo= -github.com/aws/aws-sdk-go-v2/credentials v1.11.2/go.mod h1:j8YsY9TXTm31k4eFhspiQicfXPLZ0gYXA50i4gxPE8g= -github.com/aws/aws-sdk-go-v2/credentials v1.16.2/go.mod h1:sDdvGhXrSVT5yzBDR7qXz+rhbpiMpUYfF3vJ01QSdrc= -github.com/aws/aws-sdk-go-v2/credentials v1.18.1 h1:E55xvOqlX7CvB66Z7rSM9usCrFU1ryUIUHqiXsEzVoE= -github.com/aws/aws-sdk-go-v2/credentials v1.18.1/go.mod h1:iobSQfR5MkvILxssGOvi/P1jjOhrRzfTiCPCzku0vx4= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.3/go.mod h1:uk1vhHHERfSVCUnqSqz8O48LBYDSC+k6brng09jcMOk= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.4/go.mod h1:t4i+yGHMCcUNIX1x7YVYa6bH/Do7civ5I6cG/6PMfyA= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0 h1:9sBTeKQwAvmJUWKIACIoiFSnxxl+sS++YDfr17/ngq0= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.0/go.mod h1:LW9/PxQD1SYFC7pnWcgqPhoyZprhjEdg5hBK6qYPLW8= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.3/go.mod h1:0dHuD2HZZSiwfJSy1FO5bX1hQ1TxVV1QXXjpn3XUE44= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.14.0/go.mod h1:UcgIwJ9KHquYxs6Q5skC9qXjhYMK+JASDYcXQ4X7JZE= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1 h1:aAjA/1JZ1xH/F9XvxJu9cXZyp7BqVXtHpztyZ6p799E= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.18.1/go.mod h1:ia9HASsPba/7o84sp6iE4wZPdNTJ0oicBe5sWQQk+Ys= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.9/go.mod h1:AnVH5pvai0pAF4lXRq0bmhbes1u9R8wTE+g+183bZNM= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.3/go.mod h1:7sGSz1JCKHWWBHq98m6sMtWQikmYPpxjqOydDemiVoM= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0 h1:H2iZoqW/v2Jnrh1FnU725Bq6KJ0k2uP63yH+DcY+HUI= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0/go.mod h1:L0FqLbwMXHvNC/7crWV1iIxUlOKYZUE8KuTIA+TozAI= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.3/go.mod h1:ssOhaLpRlh88H3UmEcsBoVKq309quMvm3Ds8e9d4eJM= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.3/go.mod h1:ify42Rb7nKeDDPkFjKn7q1bPscVPu/+gmHH8d2c+anU= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0 h1:EDped/rNzAhFPhVY0sDGbtD16OKqksfA8OjF/kLEgw8= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0/go.mod h1:uUI335jvzpZRPpjYx6ODc/wg1qH+NnoSTK/FwVeK0C0= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.10/go.mod h1:8DcYQcz0+ZJaSxANlHIsbbi6S+zMwjwdDqwW3r9AzaE= -github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.3/go.mod h1:5yzAuE9i2RkVAttBl8yxZgQr5OCq4D5yDnG7j9x2L0U= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0 h1:iLvW/zOkHGU3BDU5thWnj+UZ9pjhuVhv1loLj7yVtBw= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.0/go.mod h1:Fn3gvhdF1x5Rs9nUoCy/fJT1ms8f8dO7RqM9lJHuazQ= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.1/go.mod h1:GeUru+8VzrTXV/83XyMJ80KpH8xO89VPoUileyNQ+tc= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1/go.mod h1:l9ymW25HOqymeU2m1gbUQ3rUIsTwKs8gYHXkqDQUhiI= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 h1:6+lZi2JeGKtCraAj1rpoZfKqnQ9SptseRZioejfUOLM= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0/go.mod h1:eb3gfbVIxIoGgJsi9pGne19dhCBpK6opTYpQqAmdy44= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.3/go.mod h1:Seb8KNmD6kVTjwRjVEgOT5hPin6sq+v4C2ycJQDwuH8= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.3/go.mod h1:R+/S1O4TYpcktbVwddeOYg+uwUfLhADP2S/x4QwsCTM= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0 h1:qGyLBQPphYzUf+IIlb5tHnvg1U2Vc5hXPcP7oRSQfy0= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.0/go.mod h1:g+dzKSLXiR/8ATkPXmLhPOI6rDdjLP3tngeo3FvDcIw= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.3/go.mod h1:wlY6SVjuwvh3TVRpTqdy4I1JpBFLX4UGeKZdWntaocw= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.3/go.mod h1:Owv1I59vaghv1Ax8zz8ELY8DN7/Y0rGS+WWAmjgi950= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0 h1:eRhU3Sh8dGbaniI6B+I48XJMrTPRkK4DKo+vqIxziOU= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0/go.mod h1:paNLV18DZ6FnWE/bd06RIKPDIFpjuvCkGKWTG/GDBeM= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.3/go.mod h1:Bm/v2IaN6rZ+Op7zX+bOUMdL4fsrYZiD0dsjLhNKwZc= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.3/go.mod h1:KZgs2ny8HsxRIRbDwgvJcHHBZPOzQr/+NtGwnP+w2ec= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0 h1:6jusT+XCcvnD+Elxvm7bUf5sCMTpZEp3AKjYQ4tWJSo= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.0/go.mod h1:LimGpdIF/sTBdgqwOEkrArXLCoTamK/9L9x8IKBFTIc= -github.com/aws/aws-sdk-go-v2/service/kms v1.16.3/go.mod h1:QuiHPBqlOFCi4LqdSskYYAWpQlx3PKmohy+rE2F+o5g= -github.com/aws/aws-sdk-go-v2/service/s3 v1.26.3/go.mod h1:g1qvDuRsJY+XghsV6zg00Z4KJ7DtFFCx8fJD2a491Ak= -github.com/aws/aws-sdk-go-v2/service/s3 v1.43.0/go.mod h1:NXRKkiRF+erX2hnybnVU660cYT5/KChRD4iUgJ97cI8= -github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0 h1:gAV4NEp4A+JOrIdoXkAeyy6IOo7+X2s/jRuaHKYiMaU= -github.com/aws/aws-sdk-go-v2/service/s3 v1.85.0/go.mod h1:JIQwK8sZ5MuKGm5rrFwp9MHUcyYEsQNpVixuPDlnwaU= -github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.15.4/go.mod h1:PJc8s+lxyU8rrre0/4a0pn2wgwiDvOEzoOjcJUBr67o= -github.com/aws/aws-sdk-go-v2/service/sns v1.17.4/go.mod h1:kElt+uCcXxcqFyc+bQqZPFD9DME/eC6oHBXvFzQ9Bcw= -github.com/aws/aws-sdk-go-v2/service/sqs v1.18.3/go.mod h1:skmQo0UPvsjsuYYSYMVmrPc1HWCbHUJyrCEp+ZaLzqM= -github.com/aws/aws-sdk-go-v2/service/ssm v1.24.1/go.mod h1:NR/xoKjdbRJ+qx0pMR4mI+N/H1I1ynHwXnO6FowXJc0= -github.com/aws/aws-sdk-go-v2/service/sso v1.11.3/go.mod h1:7UQ/e69kU7LDPtY40OyoHYgRmgfGM4mgsLYtcObdveU= -github.com/aws/aws-sdk-go-v2/service/sso v1.17.2/go.mod h1:/pE21vno3q1h4bbhUOEi+6Zu/aT26UK2WKkDXd+TssQ= -github.com/aws/aws-sdk-go-v2/service/sso v1.26.0 h1:cuFWHH87GP1NBGXXfMicUbE7Oty5KpPxN6w4JpmuxYc= -github.com/aws/aws-sdk-go-v2/service/sso v1.26.0/go.mod h1:aJBemdlbCKyOXEXdXBqS7E+8S9XTDcOTaoOjtng54hA= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.20.0/go.mod h1:dWqm5G767qwKPuayKfzm4rjzFmVjiBFbOJrpSPnAMDs= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0 h1:t2va+wewPOYIqC6XyJ4MGjiGKkczMAPsgq5W4FtL9ME= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.0/go.mod h1:ExCTcqYqN0hYYRsDlBVU8+68grqlWdgX9/nZJwQW4aY= -github.com/aws/aws-sdk-go-v2/service/sts v1.16.3/go.mod h1:bfBj0iVmsUyUg4weDB4NxktD9rDGeKSVWnjTnwbx9b8= -github.com/aws/aws-sdk-go-v2/service/sts v1.25.3/go.mod h1:4EqRHDCKP78hq3zOnmFXu5k0j4bXbRFfCh/zQ6KnEfQ= -github.com/aws/aws-sdk-go-v2/service/sts v1.35.0 h1:FD9agdG4CeOGS3ORLByJk56YIXDS7mxFpmZyCtpqExc= -github.com/aws/aws-sdk-go-v2/service/sts v1.35.0/go.mod h1:NDzDPbBF1xtSTZUMuZx0w3hIfWzcL7X2AQ0Tr9becIQ= -github.com/aws/smithy-go v1.11.2/go.mod h1:3xHYmszWVx2c0kIwQeEVf9uSm4fYZt67FBJnwub1bgM= -github.com/aws/smithy-go v1.17.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= -github.com/aws/smithy-go v1.22.5 h1:P9ATCXPMb2mPjYBgueqJNCA5S9UfktsW0tTxi+a7eqw= -github.com/aws/smithy-go v1.22.5/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/bobg/gcsobj v0.1.2/go.mod h1:vS49EQ1A1Ib8FgrL58C8xXYZyOCR2TgzAdopy6/ipa8= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -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/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/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= -github.com/colinmarc/hdfs/v2 v2.1.1/go.mod h1:M3x+k8UKKmxtFu++uAZ0OtDU8jR3jnaZIAc6yK4Ue0c= -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/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU= -github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= -github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= -github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= -github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= -github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/duckdb/duckdb-go-bindings v0.1.16 h1:XPCk9hzP06PoWIxDPVU3gAy0m1XmLaZHTzLggNx/U9k= -github.com/duckdb/duckdb-go-bindings v0.1.16/go.mod h1:pBnfviMzANT/9hi4bg+zW4ykRZZPCXlVuvBWEcZofkc= -github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11 h1:GXQkG4HmEbwPtqCSabJTp9wZQQ7Gqr3KveLNesQWQOs= -github.com/duckdb/duckdb-go-bindings/darwin-amd64 v0.1.11/go.mod h1:Ezo7IbAfB8NP7CqPIN8XEHKUg5xdRRQhcPPlCXImXYA= -github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11 h1:ATJMSBIDA/YAm/6CKeBDRtGK1OOwqfTZbWg9Y5fAc9E= -github.com/duckdb/duckdb-go-bindings/darwin-arm64 v0.1.11/go.mod h1:eS7m/mLnPQgVF4za1+xTyorKRBuK0/BA44Oy6DgrGXI= -github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11 h1:AjvnGst1avyOECYiykthyHR4DTYTaqNDPr5W/0t5j0k= -github.com/duckdb/duckdb-go-bindings/linux-amd64 v0.1.11/go.mod h1:1GOuk1PixiESxLaCGFhag+oFi7aP+9W8byymRAvunBk= -github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11 h1:j3B1biawuhtxe2Chkiqcwf1Kxe8VJc8lLVmjBIcJrkI= -github.com/duckdb/duckdb-go-bindings/linux-arm64 v0.1.11/go.mod h1:o7crKMpT2eOIi5/FY6HPqaXcvieeLSqdXXaXbruGX7w= -github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11 h1:xR3vRE8y+48U6xDNkUlOfbl7/OTA7FVcDXJ+5vETuHU= -github.com/duckdb/duckdb-go-bindings/windows-amd64 v0.1.11/go.mod h1:IlOhJdVKUJCAPj3QsDszUo8DVdvp1nBFp4TUJVdw99s= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -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/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= -github.com/gin-gonic/gin v1.7.3/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= -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-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= -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-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= -github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-viper/mapstructure/v2 v2.3.0 h1:27XbWsHIqhbdR5TIC911OfYvgSaW93HM+dX7970Q7jk= -github.com/go-viper/mapstructure/v2 v2.3.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= -github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= -github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.4.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= -github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188/go.mod h1:vXjM/+wXQnTPR4KqTKDgJukSZ6amVRtWMPEjE6sQoK8= -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/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/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -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.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= -github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -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/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/flatbuffers v25.2.10+incompatible h1:F3vclr7C3HpB1k9mxCGRMXq6FdUalZ6H/pNX4FP1v0Q= -github.com/google/flatbuffers v25.2.10+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -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.6/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.8/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/go-replayers/grpcreplay v1.1.0/go.mod h1:qzAvJ8/wi57zq7gWqaE6AwLM6miiXUQwP1S+I9icmhk= -github.com/google/go-replayers/httpreplay v1.1.1/go.mod h1:gN9GeLIs7l6NUoVaSSnv2RiqK1NiwAmD0MrKeC9IIks= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+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/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -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-20200905233945-acf8798be1f7/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-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210506205249-923b5ab0fc1a/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.2.0/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.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= -github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/wire v0.5.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU= -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.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hanwen/go-fuse v1.0.0/go.mod h1:unqXarDXqzAk0rt98O2tVndEPIpUgLD9+rwFisZH3Ok= -github.com/hanwen/go-fuse/v2 v2.1.0/go.mod h1:oRyA5eK+pvJyv5otpO/DgccS8y/RvYMaO00GgRLGryc= -github.com/hashicorp/go-uuid v0.0.0-20180228145832-27454136f036/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -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/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/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.11.0/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= -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/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.2.0/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-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= -github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/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.10.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.15.0/go.mod h1:D/zyOyXiaM1TmVWnOM18p0xdDtdakRBa0RsVGI3U3bw= -github.com/jackc/pgx/v5 v5.7.5 h1:JHGfMnQY+IEtGM63d+NGMjoRpysB2JBwDr5fsngwmJs= -github.com/jackc/pgx/v5 v5.7.5/go.mod h1:aruU7o91Tc2q2cFp5h4uP3f6ztExVpyVv88Xl/8Vl8M= -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.2.1 h1:gI8os0wpRXFd4FiAY2dWiqRK037tjj3t7rKFeO4X5iw= -github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= -github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= -github.com/jcmturner/gofork v0.0.0-20180107083740-2aebee971930/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= -github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= -github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -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/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= -github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= -github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.13.1/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= -github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= -github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= -github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= -github.com/klauspost/cpuid/v2 v2.2.11 h1:0OwqZRYI2rFrjS4kvkDnqJkKHdHaRnCm68/DY4OxRzU= -github.com/klauspost/cpuid/v2 v2.2.11/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= -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/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -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/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -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.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/linkedin/goavro v2.1.0+incompatible h1:DV2aUlj2xZiuxQyvag8Dy7zjY69ENjS66bWkSfdpddY= -github.com/linkedin/goavro v2.1.0+incompatible/go.mod h1:bBCwI2eGYpUI/4820s67MElg9tdeLbINjLjiM2xZFYM= -github.com/marcboeker/go-duckdb/arrowmapping v0.0.9 h1:xj+kFOqR2gH3Mcxx9LmAVHebSnCiPm303N+uxfkWVmY= -github.com/marcboeker/go-duckdb/arrowmapping v0.0.9/go.mod h1:o56AqVS90v5bpxhPnOK9La7AfNTOrMORiqTQrlRbdPQ= -github.com/marcboeker/go-duckdb/mapping v0.0.10 h1:b/y2W8/hNlD0Dwjq0mCqIlLXpjQMnWy0WqDV9b9lHQQ= -github.com/marcboeker/go-duckdb/mapping v0.0.10/go.mod h1:Ro6Tw6sGG50O8S0daZsA8TrQJz/DvGrzGvMD7Jihirw= -github.com/marcboeker/go-duckdb/v2 v2.3.2 h1:96zG2JPyIhCFjHdBjjSpOdhzJzehoGTdl7LskkuMUTs= -github.com/marcboeker/go-duckdb/v2 v2.3.2/go.mod h1:VeXz9ZM6klNvICHrXEUzaHSgNqBeTdyMxr4CICw/UaY= -github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= -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.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs= -github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= -github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI= -github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= -github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= -github.com/minio/minio-go/v7 v7.0.34/go.mod h1:nCrRzjoSUQh8hgKKtu3Y708OLvRLtuASMg2/nvmbarw= -github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= -github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= -github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= -github.com/nats-io/nats.go v1.43.0 h1:uRFZ2FEoRvP64+UUhaTokyS18XBCR/xM2vQZKO4i8ug= -github.com/nats-io/nats.go v1.43.0/go.mod h1:iRWIPokVIFbVijxuMQq4y9ttaBTMe0SFdlZfMDd+33g= -github.com/nats-io/nkeys v0.4.11 h1:q44qGV008kYd9W1b1nEBkNzvnWxtRSQ7A8BoqRrcfa0= -github.com/nats-io/nkeys v0.4.11/go.mod h1:szDimtgmfOi9n25JpfIdGw12tZFYXqhGxjhVxsatHVE= -github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= -github.com/ncw/swift v1.0.52/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -github.com/pborman/getopt v0.0.0-20180729010549-6fdd0a2c7117/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= -github.com/pierrec/lz4/v4 v4.1.8/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= -github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= -github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= -github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= -github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -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/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -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/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.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -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/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -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.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -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.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/xitongsys/parquet-go v1.5.1/go.mod h1:xUxwM8ELydxh4edHGegYq1pA8NnMKDx0K/GyB0o2bww= -github.com/xitongsys/parquet-go v1.6.2 h1:MhCaXii4eqceKPu9BwrjLqyK10oX9WF+xGhwvwbw7xM= -github.com/xitongsys/parquet-go v1.6.2/go.mod h1:IulAQyalCm0rPiZVNnCgm/PCL64X2tdSVGMQ/UeKqWA= -github.com/xitongsys/parquet-go-source v0.0.0-20190524061010-2b72cbee77d5/go.mod h1:xxCx7Wpym/3QCo6JhujJX51dzSXrwmb0oH6FQb39SEA= -github.com/xitongsys/parquet-go-source v0.0.0-20200817004010-026bad9b25d0/go.mod h1:HYhIKsdns7xz80OgkbgJYrtQY7FjHWHKH6cvN7+czGE= -github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b h1:zbb5qM/t3N+O33Vp5sFyG6yIcWZV1q7rfEjJM8UsRBQ= -github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b/go.mod h1:2ActxmJ4q17Cdruar9nKEkzKSOL1Ol03737Bkz10rTY= -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.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= -github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= -github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= -github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= -github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= -go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0= -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.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -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/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -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.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= -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.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= -gocloud.dev v0.26.0/go.mod h1:mkUgejbnbLotorqDyvedJO20XcZNTynmSeVSQS9btVg= -golang.org/x/crypto v0.0.0-20180723164146-c126467f60eb/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -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-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/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-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-20211115234514-b4de73f9ece8/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220511200225-c6db032c6c88/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= -golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM= -golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY= -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-20250718183923-645b1fa84792 h1:R9PFI6EUdfVKgwKjZef7QIwGcBKu86OEFpJ9nUEP2l4= -golang.org/x/exp v0.0.0-20250718183923-645b1fa84792/go.mod h1:A+z0yzpGtvnG90cToK5n2tu8UJVP2XUATh+r+sfOOOc= -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/lint v0.0.0-20210508222113-6edffad5e616/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.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg= -golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ= -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-20191112182307-2180aed22343/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-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -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-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211020060615-d418f374d309/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220401154927-543a649e0bdd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -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.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -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.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -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-20210220032951-036812b2e83c/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.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= -golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= -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-20191112214154-59a1497f0cea/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-20200828194041-157a740278f4/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-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/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-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/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-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220204135822-1c1b9b1eba6a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220330033206-e17cdc41300f/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-20220704084225-05e143d24a9e/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.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA= -golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -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/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -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.5/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.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4= -golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU= -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/time v0.0.0-20211116232009-f0f3c7e86c11/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220224211638-0e9765cccd65/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-20190422233926-fe54fb35175b/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-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-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-20200828161849-5deb26317202/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20200915173823-2db8f0ff891c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20200918232735-d647fc253266/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -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.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0= -golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw= -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= -golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= -golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= -gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= -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.31.0/go.mod h1:CL+9IBCa2WWU6gRuBWaKqGWLFFwbEUXkfeMkHLQWYWo= -google.golang.org/api v0.32.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -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.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.46.0/go.mod h1:ceL4oozhkAiTID8XMmJBsIxID/9wMXJVVFXPg4ylg3I= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.58.0/go.mod h1:cAbP2FsxoGVNwtgNAmmn3y5G1TWAiVYRmg4yku3lv+E= -google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.64.0/go.mod h1:931CdxA8Rm4t6zqTFGSsgwbAEZ2+GMYurbndwSimebM= -google.golang.org/api v0.66.0/go.mod h1:I1dmXYpX7HGwz/ejRxwQp2qj5bFAz93HiCU1C1oYd9M= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.68.0/go.mod h1:sOM8pTpwgflXRhz+oC8H2Dr+UcbMqkPPWNJo88Q7TH8= -google.golang.org/api v0.69.0/go.mod h1:boanBiw+h5c3s+tBPgEzLDRHfFLWV0qXxRHz3ws7C80= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -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/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-20200513103714-09dca8ec2884/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-20200831141814-d751682dd103/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-20200914193844-75d14daec038/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200921151605-7abf4a1a14d5/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-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210429181445-86c259c2b4ab/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210517163617-5e0236093d7a/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210921142501-181ce0d877f6/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211018162055-cf77aa76bad2/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211223182754-3ac035c7e7cb/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220111164026-67b88f271998/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220114231437-d2e6a121cae0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220201184016-50beb8ab5c44/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220204002441-d6cc3cc0770e/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220211171837-173942840c17/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220216160803-4663080d8bc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220401170504-314d38edb7de/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -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.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -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.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= -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.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -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-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= -gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= -gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q= -gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mNfM5bm88whjWx4= -gopkg.in/jcmturner/gokrb5.v7 v7.3.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= -gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8= -gopkg.in/linkedin/goavro.v1 v1.0.5 h1:BJa69CDh0awSsLUmZ9+BowBdokpduDZSM9Zk8oKHfN4= -gopkg.in/linkedin/goavro.v1 v1.0.5/go.mod h1:Aw5GdAbizjOEl0kAMHV9iHmA8reZzW/OKuJAl4Hb9F0= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/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/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= -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= -nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= -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/src/syncer-postgres/lib/init_test.go b/src/syncer-postgres/lib/init_test.go deleted file mode 100644 index f85cb53..0000000 --- a/src/syncer-postgres/lib/init_test.go +++ /dev/null @@ -1,471 +0,0 @@ -package postgres - -import ( - "encoding/csv" - "flag" - "os" - - "github.com/BemiHQ/BemiDB/src/common" -) - -var PG_SCHEMA_COLUMNS_TEST_TABLE = []PgSchemaColumn{ - { - ColumnName: "id", - DataType: "integer", - UdtName: "int4", - IsNullable: "NO", - NumericPrecision: "32", - Namespace: "pg_catalog", - IsPartOfUniqueIndex: true, - }, - { - ColumnName: "bit_column", - DataType: "bit", - UdtName: "bit", - Namespace: "pg_catalog", - }, - { - ColumnName: "bool_column", - DataType: "boolean", - UdtName: "bool", - Namespace: "pg_catalog", - }, - { - ColumnName: "bpchar_column", - DataType: "character", - UdtName: "bpchar", - Namespace: "pg_catalog", - }, - { - ColumnName: "varchar_column", - DataType: "character varying", - UdtName: "varchar", - Namespace: "pg_catalog", - }, - { - ColumnName: "text_column", - DataType: "text", - UdtName: "text", - Namespace: "pg_catalog", - }, - { - ColumnName: "int2_column", - DataType: "smallint", - UdtName: "int2", - NumericPrecision: "16", - Namespace: "pg_catalog", - }, - { - ColumnName: "int4_column", - DataType: "integer", - UdtName: "int4", - NumericPrecision: "32", - Namespace: "pg_catalog", - }, - { - ColumnName: "int8_column", - DataType: "bigint", - UdtName: "int8", - NumericPrecision: "64", - Namespace: "pg_catalog", - }, - { - ColumnName: "hugeint_column", - DataType: "numeric", - UdtName: "numeric", - NumericPrecision: "20", // Will be capped to 38 - Namespace: "pg_catalog", - }, - { - ColumnName: "xid_column", - DataType: "xid", - UdtName: "xid", - Namespace: "pg_catalog", - }, - { - ColumnName: "xid8_column", - DataType: "xid8", - UdtName: "xid8", - Namespace: "pg_catalog", - }, - { - ColumnName: "float4_column", - DataType: "real", - UdtName: "float4", - NumericPrecision: "24", - Namespace: "pg_catalog", - }, - { - ColumnName: "float8_column", - DataType: "double precision", - UdtName: "float8", - NumericPrecision: "53", - Namespace: "pg_catalog", - }, - { - ColumnName: "numeric_column", - DataType: "numeric", - UdtName: "numeric", - NumericPrecision: "40", // Will be capped to 38 - NumericScale: "2", - Namespace: "pg_catalog", - }, - { - ColumnName: "numeric_column_without_precision", - DataType: "numeric", - UdtName: "numeric", - NumericPrecision: "0", // Will be changed to 19 - NumericScale: "0", // Will be changed to 19 - Namespace: "pg_catalog", - }, - { - ColumnName: "date_column", - DataType: "date", - UdtName: "date", - DatetimePrecision: "0", - Namespace: "pg_catalog", - }, - { - ColumnName: "time_column", - DataType: "time without time zone", - UdtName: "time", - DatetimePrecision: "6", - Namespace: "pg_catalog", - }, - { - ColumnName: "timeMsColumn", - DataType: "time without time zone", - UdtName: "time", - DatetimePrecision: "3", - Namespace: "pg_catalog", - }, - { - ColumnName: "timetz_column", - DataType: "time with time zone", - UdtName: "timetz", - DatetimePrecision: "6", - Namespace: "pg_catalog", - }, - { - ColumnName: "timetz_ms_column", - DataType: "time with time zone", - UdtName: "timetz", - DatetimePrecision: "3", - Namespace: "pg_catalog", - }, - { - ColumnName: "timestamp_column", - DataType: "timestamp without time zone", - UdtName: "timestamp", - DatetimePrecision: "6", - Namespace: "pg_catalog", - }, - { - ColumnName: "timestamp_ms_column", - DataType: "timestamp without time zone", - UdtName: "timestamp", - DatetimePrecision: "3", - Namespace: "pg_catalog", - }, - { - ColumnName: "timestamptz_column", - DataType: "timestamp with time zone", - UdtName: "timestamptz", - DatetimePrecision: "6", - Namespace: "pg_catalog", - }, - { - ColumnName: "timestamptz_ms_column", - DataType: "timestamp with time zone", - UdtName: "timestamptz", - DatetimePrecision: "3", - Namespace: "pg_catalog", - }, - { - ColumnName: "uuid_column", - DataType: "uuid", - UdtName: "uuid", - Namespace: "pg_catalog", - }, - { - ColumnName: "bytea_column", - DataType: "bytea", - UdtName: "bytea", - Namespace: "pg_catalog", - }, - { - ColumnName: "interval_column", - DataType: "interval", - UdtName: "interval", - DatetimePrecision: "6", - Namespace: "pg_catalog", - }, - { - ColumnName: "tsvector_column", - DataType: "tsvector", - UdtName: "tsvector", - Namespace: "pg_catalog", - }, - { - ColumnName: "xml_column", - DataType: "xml", - UdtName: "xml", - Namespace: "pg_catalog", - }, - { - ColumnName: "pg_snapshot_column", - DataType: "pg_snapshot", - UdtName: "pg_snapshot", - Namespace: "pg_catalog", - }, - { - ColumnName: "point_column", - DataType: "point", - UdtName: "point", - Namespace: "pg_catalog", - }, - { - ColumnName: "inet_column", - DataType: "inet", - UdtName: "inet", - Namespace: "pg_catalog", - }, - { - ColumnName: "json_column", - DataType: "json", - UdtName: "json", - Namespace: "pg_catalog", - }, - { - ColumnName: "jsonb_column", - DataType: "jsonb", - UdtName: "jsonb", - Namespace: "pg_catalog", - }, - { - ColumnName: "array_text_column", - DataType: "ARRAY", - UdtName: "_text", - Namespace: "pg_catalog", - }, - { - ColumnName: "array_int_column", - DataType: "ARRAY", - UdtName: "_int4", - Namespace: "pg_catalog", - }, - { - ColumnName: "array_jsonb_column", - DataType: "ARRAY", - UdtName: "_jsonb", - Namespace: "pg_catalog", - }, - { - ColumnName: "array_ltree_column", - DataType: "ARRAY", - UdtName: "_ltree", - Namespace: "public", - }, - { - ColumnName: "user_defined_column", - DataType: "USER-DEFINED", - UdtName: "address", - Namespace: "public", - }, -} -var PG_SCHEMA_COLUMNS_PARTITIONED_TABLE = []PgSchemaColumn{ - { - ColumnName: "timestamp_column", - DataType: "timestamp without time zone", - UdtName: "timestamp", - IsNullable: "NO", - OrdinalPosition: "1", - NumericPrecision: "0", - NumericScale: "0", - DatetimePrecision: "6", - Namespace: "pg_catalog", - IsPartOfUniqueIndex: true, - }, -} -var PG_SCHEMA_COLUMNS_EMPTY_TABLE = []PgSchemaColumn{ - { - ColumnName: "id", - DataType: "integer", - UdtName: "int4", - IsNullable: "NO", - OrdinalPosition: "1", - NumericPrecision: "32", - NumericScale: "0", - DatetimePrecision: "0", - Namespace: "pg_catalog", - IsPartOfUniqueIndex: true, - }, -} - -var CSV_ROWS_TEST_TABLE = [][]string{ - { - "1", // id - "1", // bit_column - "t", // bool_column - "bpchar", // bpchar_column - "varchar", // varchar_column - "text", // text_column - "32767", // int2_column - "2147483647", // int4_column - "9223372036854775807", // int8_column - "10000000000000000000", // hugeint_column - "4294967295", // xid_column - "18446744073709551615", // xid8_column - "3.14", // float4_column - "3.141592653589793", // float8_column - "12345.67", // numeric_column - "12345.67", // numeric_column_without_precision - "2024-01-01", // date_column - "12:00:00.123456", // time_column - "12:00:00.123", // timeMsColumn - "12:00:00.123456-05", // timetz_column - "12:00:00.123-05", // timetz_ms_column - "2024-01-01 12:00:00.123456", // timestamp_column - "2024-01-01 12:00:00.123", // timestamp_ms_column - "2024-01-01 12:00:00.123456-05", // timestamptz_column - "2024-01-01 12:00:00.123-05", // timestamptz_ms_column - "58a7c845-af77-44b2-8664-7ca613d92f04", // uuid_column - "\\x48656c6c6f", // bytea_column - "1 mon 2 days 01:00:01.000001", // interval_column - "'sampl':1 'text':2 'tsvector':4", // tsvector_column - "text", // xml_column - "1896:1896:", // pg_snapshot_column - "(37.347301483154,45.002101898193)", // point_column - "192.168.0.1", // inet_column - "{\"key\": \"value\"}", // json_column - "{\"key\": \"value\", \"nestedKey\": { \"key\": \"value\" }}", // jsonb_column - "{one,two,three}", // array_text_column - "{1,2,3}", // array_int_column - `{"{\"key\": \"value1\"}","{\"key\": \"value2\"}"}`, // array_jsonb_column - "{\"a.b\",\"c.d\"}", // array_ltree_column - "(Toronto)", // user_defined_column - }, - { - "2", // id - common.BEMIDB_NULL_STRING, // bit_column - "f", // bool_column - "", // bpchar_column - common.BEMIDB_NULL_STRING, // varchar_column - "", // text_column - "-32767", // int2_column - common.BEMIDB_NULL_STRING, // int4_column - "-9223372036854775807", // int8_column - common.BEMIDB_NULL_STRING, // hugeint_column - common.BEMIDB_NULL_STRING, // xid_column - common.BEMIDB_NULL_STRING, // xid8_column - "NaN", // float4_column - "-3.141592653589793", // float8_column - "-12345.00", // numeric_column - common.BEMIDB_NULL_STRING, // numeric_column_without_precision - "20025-11-12", // date_column - "12:00:00.123", // time_column - common.BEMIDB_NULL_STRING, // timeMsColumn - "12:00:00.12300+05", // timetz_column - "12:00:00.1+05", // timetz_ms_column - "2024-01-01 12:00:00", // timestamp_column - common.BEMIDB_NULL_STRING, // timestamp_ms_column - "2024-01-01 12:00:00.000123+05:30", // timestamptz_column - "2024-01-01 12:00:00.12+05", // timestamptz_ms_column - common.BEMIDB_NULL_STRING, // uuid_column - common.BEMIDB_NULL_STRING, // bytea_column - common.BEMIDB_NULL_STRING, // interval_column - common.BEMIDB_NULL_STRING, // tsvector_column - common.BEMIDB_NULL_STRING, // xml_column - common.BEMIDB_NULL_STRING, // pg_snapshot_column - common.BEMIDB_NULL_STRING, // point_column - common.BEMIDB_NULL_STRING, // inet_column - common.BEMIDB_NULL_STRING, // json_column - "{}", // jsonb_column - common.BEMIDB_NULL_STRING, // array_text_column - "{}", // array_int_column - common.BEMIDB_NULL_STRING, // array_jsonb_column - common.BEMIDB_NULL_STRING, // array_ltree_column - common.BEMIDB_NULL_STRING, // user_defined_column - }, -} -var CSV_ROWS_PARTITIONED_TABLE1 = [][]string{{"2024-01-01 01:02:03.123456"}} -var CSV_ROWS_PARTITIONED_TABLE2 = [][]string{{"2024-02-12 11:12:13"}} -var CSV_ROWS_PARTITIONED_TABLE3 = [][]string{{"2024-03-30 23:59:59"}} - -func init() { - config := loadTestConfig() - - storageS3 := common.NewStorageS3(config.CommonConfig) - duckdbClient := common.NewDuckdbClient(config.CommonConfig) - utils := NewSyncerUtils(config, storageS3, duckdbClient) - - // Prepare PgSchemaColumns - for i := range PG_SCHEMA_COLUMNS_TEST_TABLE { - PG_SCHEMA_COLUMNS_TEST_TABLE[i].OrdinalPosition = common.IntToString(i + 1) - if PG_SCHEMA_COLUMNS_TEST_TABLE[i].IsNullable == "" { - PG_SCHEMA_COLUMNS_TEST_TABLE[i].IsNullable = "YES" - } - if PG_SCHEMA_COLUMNS_TEST_TABLE[i].NumericPrecision == "" { - PG_SCHEMA_COLUMNS_TEST_TABLE[i].NumericPrecision = "0" - } - if PG_SCHEMA_COLUMNS_TEST_TABLE[i].NumericScale == "" { - PG_SCHEMA_COLUMNS_TEST_TABLE[i].NumericScale = "0" - } - if PG_SCHEMA_COLUMNS_TEST_TABLE[i].DatetimePrecision == "" { - PG_SCHEMA_COLUMNS_TEST_TABLE[i].DatetimePrecision = "0" - } - PG_SCHEMA_COLUMNS_TEST_TABLE[i].Config = config - } - for i := range PG_SCHEMA_COLUMNS_PARTITIONED_TABLE { - PG_SCHEMA_COLUMNS_PARTITIONED_TABLE[i].Config = config - } - for i := range PG_SCHEMA_COLUMNS_EMPTY_TABLE { - PG_SCHEMA_COLUMNS_EMPTY_TABLE[i].Config = config - } - - switch config.SyncMode { - case SyncModeFullRefresh: - syncer := NewSyncerFullRefresh(config, utils, storageS3, duckdbClient) - createTestTableViaFullRefresh(syncer, PgSchemaTable{Schema: "public", Table: "test_table"}, PG_SCHEMA_COLUMNS_TEST_TABLE, CSV_ROWS_TEST_TABLE) - createTestTableViaFullRefresh(syncer, PgSchemaTable{Schema: "public", Table: "partitioned_table1"}, PG_SCHEMA_COLUMNS_PARTITIONED_TABLE, CSV_ROWS_PARTITIONED_TABLE1) - createTestTableViaFullRefresh(syncer, PgSchemaTable{Schema: "public", Table: "partitioned_table2"}, PG_SCHEMA_COLUMNS_PARTITIONED_TABLE, CSV_ROWS_PARTITIONED_TABLE2) - createTestTableViaFullRefresh(syncer, PgSchemaTable{Schema: "public", Table: "partitioned_table3"}, PG_SCHEMA_COLUMNS_PARTITIONED_TABLE, CSV_ROWS_PARTITIONED_TABLE3) - createTestTableViaFullRefresh(syncer, PgSchemaTable{Schema: "test", Table: "empty_table"}, PG_SCHEMA_COLUMNS_EMPTY_TABLE, [][]string{}) - default: - common.Panic(config.CommonConfig, "Unsupported sync mode: "+string(config.SyncMode)) - } -} - -func loadTestConfig() *Config { - setTestArgs([]string{}) - _config.DatabaseUrl = "postgres://test:test@localhost:5432/dummy" - return LoadConfig() -} - -func setTestArgs(args []string) { - os.Args = append([]string{"cmd"}, args...) - flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ExitOnError) - RegisterFlags() -} - -func createTestTableViaFullRefresh(syncer *SyncerFullRefresh, pgSchemaTable PgSchemaTable, pgSchemaColumns []PgSchemaColumn, rows [][]string) { - cappedBuffer := common.NewCappedBuffer(syncer.Config.CommonConfig, common.DEFAULT_CAPPED_BUFFER_SIZE) - writer := csv.NewWriter(cappedBuffer) - - headerRow := []string{} - for _, pgSchemaColumn := range pgSchemaColumns { - headerRow = append(headerRow, pgSchemaColumn.ColumnName) - } - err := writer.Write(headerRow) - common.PanicIfError(syncer.Config.CommonConfig, err) - - for _, row := range rows { - err := writer.Write(row) - common.PanicIfError(syncer.Config.CommonConfig, err) - } - - writer.Flush() - cappedBuffer.Close() - - syncer.writeToIceberg(pgSchemaTable, pgSchemaColumns, cappedBuffer) -} diff --git a/src/syncer-postgres/lib/nats.go b/src/syncer-postgres/lib/nats.go deleted file mode 100644 index cf97889..0000000 --- a/src/syncer-postgres/lib/nats.go +++ /dev/null @@ -1,37 +0,0 @@ -package postgres - -import ( - "context" - - nts "github.com/nats-io/nats.go" - js "github.com/nats-io/nats.go/jetstream" - - "github.com/BemiHQ/BemiDB/src/common" -) - -const () - -type Nats struct { - Config *Config -} - -func NewNats(config *Config) *Nats { - return &Nats{ - Config: config, - } -} - -func (nats *Nats) Stream(ctx context.Context) js.Stream { - jetstream := nats.newJetstream() - stream, err := jetstream.Stream(ctx, nats.Config.Nats.Stream) - common.PanicIfError(nats.Config.CommonConfig, err) - return stream -} - -func (nats *Nats) newJetstream() js.JetStream { - nc, err := nts.Connect(nats.Config.Nats.Url) - common.PanicIfError(nats.Config.CommonConfig, err) - jetstream, err := js.New(nc) - common.PanicIfError(nats.Config.CommonConfig, err) - return jetstream -} diff --git a/src/syncer-postgres/lib/pg_schema_column.go b/src/syncer-postgres/lib/pg_schema_column.go deleted file mode 100644 index 9b80abf..0000000 --- a/src/syncer-postgres/lib/pg_schema_column.go +++ /dev/null @@ -1,102 +0,0 @@ -package postgres - -import ( - "strings" - - "github.com/BemiHQ/BemiDB/src/common" -) - -const ( - PG_TRUE = "YES" - PG_DATA_TYPE_ARRAY = "ARRAY" -) - -type PgSchemaColumn struct { - ColumnName string - DataType string - UdtName string - IsNullable string - OrdinalPosition string - NumericPrecision string - NumericScale string - DatetimePrecision string - Namespace string - IsPartOfUniqueIndex bool - Config *Config -} - -func NewPgSchemaColumn(config *Config) *PgSchemaColumn { - return &PgSchemaColumn{ - Config: config, - } -} - -func (pgSchemaColumn *PgSchemaColumn) ToIcebergSchemaColumn() *common.IcebergSchemaColumn { - pgPrimitiveColumnType := strings.TrimLeft(pgSchemaColumn.UdtName, "_") - - icebergSchemaColumn := &common.IcebergSchemaColumn{ - Config: pgSchemaColumn.Config.CommonConfig, - ColumnName: pgSchemaColumn.ColumnName, - Position: common.StringToInt(pgSchemaColumn.OrdinalPosition), - NumericPrecision: common.StringToInt(pgSchemaColumn.NumericPrecision), - NumericScale: common.StringToInt(pgSchemaColumn.NumericScale), - IsList: pgSchemaColumn.DataType == PG_DATA_TYPE_ARRAY, - IsRequired: pgSchemaColumn.IsNullable != PG_TRUE, - IsPartOfUniqueIndex: pgSchemaColumn.IsPartOfUniqueIndex, - DatetimePrecision: common.StringToInt(pgSchemaColumn.DatetimePrecision), - } - - switch pgPrimitiveColumnType { - case "bool": - icebergSchemaColumn.ColumnType = common.IcebergColumnTypeBoolean - case "bit", "int2", "int4": - icebergSchemaColumn.ColumnType = common.IcebergColumnTypeInteger - case "xid": - icebergSchemaColumn.ColumnType = common.IcebergColumnTypeLong - case "int8", "xid8": - icebergSchemaColumn.ColumnType = common.IcebergColumnTypeDecimal - case "interval": - icebergSchemaColumn.ColumnType = common.IcebergColumnTypeDecimal - icebergSchemaColumn.LogicalColumnType = common.IcebergLogicalColumnTypeInterval - case "float4": - icebergSchemaColumn.ColumnType = common.IcebergColumnTypeFloat - case "float8": - icebergSchemaColumn.ColumnType = common.IcebergColumnTypeDouble - case "numeric": - icebergSchemaColumn.ColumnType = common.IcebergColumnTypeDecimal - case "date": - icebergSchemaColumn.ColumnType = common.IcebergColumnTypeDate - case "time": - icebergSchemaColumn.ColumnType = common.IcebergColumnTypeTime - case "timetz": - icebergSchemaColumn.ColumnType = common.IcebergColumnTypeTimeTz - case "timestamp", "timestamptz": - icebergSchemaColumn.ColumnType = common.IcebergColumnTypeTimestamp - case "jsonb", "json": - icebergSchemaColumn.ColumnType = common.IcebergColumnTypeString - icebergSchemaColumn.LogicalColumnType = common.IcebergLogicalColumnTypeJson - case "bpchar": - icebergSchemaColumn.ColumnType = common.IcebergColumnTypeString - icebergSchemaColumn.LogicalColumnType = common.IcebergLogicalColumnTypeBpchar - case "point": - icebergSchemaColumn.ColumnType = common.IcebergColumnTypeString - icebergSchemaColumn.LogicalColumnType = common.IcebergLogicalColumnTypePoint - case "varchar", "char", "text", "uuid", - "line", "lseg", "box", "path", "polygon", "circle", - "cidr", "inet", "macaddr", "macaddr8", - "ltree", "tsvector", "xml", "pg_snapshot": - icebergSchemaColumn.ColumnType = common.IcebergColumnTypeString - case "bytea": - icebergSchemaColumn.ColumnType = common.IcebergColumnTypeBinary - default: - // User-defined types -> VARCHAR - if pgSchemaColumn.Namespace != PG_SCHEMA_PG_CATALOG { - icebergSchemaColumn.ColumnType = common.IcebergColumnTypeString - icebergSchemaColumn.LogicalColumnType = common.IcebergLogicalColumnTypeUserDefined - } else { - panic("Unsupported PostgreSQL type: " + pgSchemaColumn.UdtName) - } - } - - return icebergSchemaColumn -} diff --git a/src/syncer-postgres/lib/pg_schema_table.go b/src/syncer-postgres/lib/pg_schema_table.go deleted file mode 100644 index 951caf8..0000000 --- a/src/syncer-postgres/lib/pg_schema_table.go +++ /dev/null @@ -1,35 +0,0 @@ -package postgres - -import ( - "fmt" -) - -type PgSchemaTable struct { - Schema string - Table string - ParentPartitionedTable string -} - -func (pgSchemaTable PgSchemaTable) String() string { - return fmt.Sprintf(`"%s"."%s"`, pgSchemaTable.Schema, pgSchemaTable.Table) -} - -func (pgSchemaTable PgSchemaTable) ToConfigArg() string { - return fmt.Sprintf(`%s.%s`, pgSchemaTable.Schema, pgSchemaTable.Table) -} - -// public.table -> table -// CustomSchema.TableName -> CustomSchemaTableName -func (pgSchemaTable PgSchemaTable) IcebergTableName() string { - if pgSchemaTable.Schema != PG_SCHEMA_PUBLIC { - return pgSchemaTable.Schema + "_" + pgSchemaTable.Table - } - return pgSchemaTable.Table -} - -func (pgSchemaTable PgSchemaTable) IcebergParentPartitionedTableName() string { - if pgSchemaTable.Schema != PG_SCHEMA_PUBLIC { - return pgSchemaTable.Schema + "_" + pgSchemaTable.ParentPartitionedTable - } - return pgSchemaTable.ParentPartitionedTable -} diff --git a/src/syncer-postgres/lib/postgres.go b/src/syncer-postgres/lib/postgres.go deleted file mode 100644 index fbfacec..0000000 --- a/src/syncer-postgres/lib/postgres.go +++ /dev/null @@ -1,223 +0,0 @@ -package postgres - -import ( - "context" - "strings" - "time" - - "github.com/BemiHQ/BemiDB/src/common" -) - -const ( - PG_SCHEMA_PUBLIC = "public" - PG_SCHEMA_PG_CATALOG = "pg_catalog" - - PG_CONNECTION_TIMEOUT = 30 * time.Second - PG_SESSION_TIMEOUT = "2h" - - POSTGRES_MAX_RETRY_COUNT = 1 -) - -type Postgres struct { - PostgresClient *common.PostgresClient - Config *Config -} - -func NewPostgres(config *Config) *Postgres { - postgres := Postgres{Config: config} - postgres.Reconnect() - return &postgres -} - -func (postgres *Postgres) Close() { - postgres.PostgresClient.Close() -} - -func (postgres *Postgres) ReplicationSlotExists(slotName string) bool { - var slotExists bool - err := postgres.PostgresClient.QueryRow(context.Background(), "SELECT TRUE FROM pg_replication_slots WHERE slot_name = '"+slotName+"'").Scan(&slotExists) - if err != nil && err.Error() == "no rows in result set" { - return false - } - common.PanicIfError(postgres.Config.CommonConfig, err) - return slotExists -} - -func (postgres *Postgres) CreateReplicationSlot(slotName string) { - _, err := postgres.PostgresClient.Exec(context.Background(), "SELECT pg_create_logical_replication_slot($1, 'pgoutput')", slotName) - common.PanicIfError(postgres.Config.CommonConfig, err) -} - -func (postgres *Postgres) Schemas() []string { - var schemas []string - - schemasRows, err := postgres.PostgresClient.Query( - context.Background(), - `SELECT schema_name - FROM information_schema.schemata - WHERE - schema_name NOT IN ('pg_catalog', 'pg_toast', 'information_schema') AND - has_schema_privilege(current_user, schema_name, 'USAGE')`, - ) - common.PanicIfError(postgres.Config.CommonConfig, err) - defer schemasRows.Close() - - for schemasRows.Next() { - var schema string - err = schemasRows.Scan(&schema) - common.PanicIfError(postgres.Config.CommonConfig, err) - schemas = append(schemas, schema) - } - - return schemas -} - -func (postgres *Postgres) SchemaTables(schema string) []PgSchemaTable { - var pgSchemaTables []PgSchemaTable - - tablesRows, err := postgres.PostgresClient.Query( - context.Background(), - ` - SELECT pg_class.relname AS table, COALESCE(parent.relname, '') AS parent_partitioned_table - FROM pg_class - JOIN pg_namespace ON pg_namespace.oid = pg_class.relnamespace - LEFT JOIN pg_inherits ON pg_inherits.inhrelid = pg_class.oid - LEFT JOIN pg_class AS parent ON pg_inherits.inhparent = parent.oid - WHERE - pg_namespace.nspname = $1 AND - pg_class.relkind = 'r' AND - has_table_privilege(pg_class.oid, 'SELECT') - `, - schema, - ) - common.PanicIfError(postgres.Config.CommonConfig, err) - defer tablesRows.Close() - - for tablesRows.Next() { - pgSchemaTable := PgSchemaTable{Schema: schema} - err = tablesRows.Scan(&pgSchemaTable.Table, &pgSchemaTable.ParentPartitionedTable) - common.PanicIfError(postgres.Config.CommonConfig, err) - pgSchemaTables = append(pgSchemaTables, pgSchemaTable) - } - - return pgSchemaTables -} - -func (postgres *Postgres) PgSchemaColumns(pgSchemaTable PgSchemaTable, retryCount ...int) []PgSchemaColumn { - var pgSchemaColumns []PgSchemaColumn - - rows, err := postgres.PostgresClient.Query( - context.Background(), - `SELECT - columns.column_name, - columns.data_type, - columns.udt_name, - columns.is_nullable, - columns.ordinal_position, - COALESCE(columns.numeric_precision, 0), - COALESCE(columns.numeric_scale, 0), - COALESCE(columns.datetime_precision, 0), - pg_namespace.nspname - FROM information_schema.columns - JOIN pg_type ON pg_type.typname = columns.udt_name - JOIN pg_namespace ON pg_namespace.oid = pg_type.typnamespace - WHERE columns.table_schema = $1 AND columns.table_name = $2 - ORDER BY columns.ordinal_position`, - pgSchemaTable.Schema, - pgSchemaTable.Table, - ) - common.PanicIfError(postgres.Config.CommonConfig, err) - defer rows.Close() - - for rows.Next() { - pgSchemaColumn := NewPgSchemaColumn(postgres.Config) - err = rows.Scan( - &pgSchemaColumn.ColumnName, - &pgSchemaColumn.DataType, - &pgSchemaColumn.UdtName, - &pgSchemaColumn.IsNullable, - &pgSchemaColumn.OrdinalPosition, - &pgSchemaColumn.NumericPrecision, - &pgSchemaColumn.NumericScale, - &pgSchemaColumn.DatetimePrecision, - &pgSchemaColumn.Namespace, - ) - common.PanicIfError(postgres.Config.CommonConfig, err) - pgSchemaColumns = append(pgSchemaColumns, *pgSchemaColumn) - } - - var joinedUniqueColumnNames string - err = postgres.PostgresClient.QueryRow( - context.Background(), - `SELECT array_to_string(array_agg(a.attname), ',') as columns - FROM pg_class t - JOIN pg_index ix ON t.oid = ix.indrelid - JOIN unnest(ix.indkey) WITH ORDINALITY AS c(colnum, ordinality) ON true - JOIN pg_attribute a ON t.oid = a.attrelid AND a.attnum = c.colnum - WHERE ix.indisunique = true AND t.relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = $1) AND t.relname = $2 - GROUP BY t.relname, ix.indexrelid - ORDER BY - array_length(array_agg(a.attname), 1), - CASE WHEN array_to_string(array_agg(a.attname), ', ') ILIKE '%id' THEN 0 ELSE 1 END, - array_to_string(array_agg(a.attname), ',')`, - pgSchemaTable.Schema, - pgSchemaTable.Table, - ).Scan(&joinedUniqueColumnNames) - if err != nil { - if err.Error() == "no rows in result set" { - joinedUniqueColumnNames = "" - } else { - if strings.Contains(err.Error(), "terminating connection due to conflict with recovery (SQLSTATE 40001)") || - strings.Contains(err.Error(), "current transaction is aborted, commands ignored until end of transaction block (SQLSTATE 25P02)") || - strings.Contains(err.Error(), "failed to deallocate cached statement(s): conn closed") { - currentRetryCount := 0 - if len(retryCount) > 0 { - currentRetryCount = retryCount[0] - } - - if currentRetryCount < POSTGRES_MAX_RETRY_COUNT { - common.LogWarn(postgres.Config.CommonConfig, "Retrying PgSchemaColumns() for table "+pgSchemaTable.String()+" due to failure:", err) - postgres.Reconnect() - return postgres.PgSchemaColumns(pgSchemaTable, currentRetryCount+1) - } - } - common.PanicIfError(postgres.Config.CommonConfig, err) - } - } - - uniqueColumnNames := common.NewSet[string]() - uniqueColumnNames.AddAll(strings.Split(joinedUniqueColumnNames, ",")) - if uniqueColumnNames.IsEmpty() { - common.Panic(postgres.Config.CommonConfig, "No unique columns found for table "+pgSchemaTable.String()) - } else { - common.LogInfo(postgres.Config.CommonConfig, "Unique columns for table "+pgSchemaTable.String()+":", joinedUniqueColumnNames) - } - - for i := range pgSchemaColumns { - pgSchemaColumns[i].IsPartOfUniqueIndex = uniqueColumnNames.Contains(pgSchemaColumns[i].ColumnName) - } - - return pgSchemaColumns -} - -func (postgres *Postgres) Reconnect() { - if postgres.PostgresClient != nil { - postgres.Close() - } - postgres.PostgresClient = common.NewPostgresClient(postgres.Config.CommonConfig, postgres.Config.DatabaseUrl) - - _, err := postgres.PostgresClient.Exec(context.Background(), "SET SESSION statement_timeout = '"+PG_SESSION_TIMEOUT+"'") - common.PanicIfError(postgres.Config.CommonConfig, err) - - var isStandby bool - err = postgres.PostgresClient.QueryRow(context.Background(), "SELECT pg_is_in_recovery()").Scan(&isStandby) - common.PanicIfError(postgres.Config.CommonConfig, err) - - if isStandby { - _, err = postgres.PostgresClient.Exec(context.Background(), "BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ READ ONLY") - common.PanicIfError(postgres.Config.CommonConfig, err) - } else { - _, err = postgres.PostgresClient.Exec(context.Background(), "BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE READ ONLY DEFERRABLE") - common.PanicIfError(postgres.Config.CommonConfig, err) - } -} diff --git a/src/syncer-postgres/lib/syncer.go b/src/syncer-postgres/lib/syncer.go deleted file mode 100644 index 1b507da..0000000 --- a/src/syncer-postgres/lib/syncer.go +++ /dev/null @@ -1,73 +0,0 @@ -package postgres - -import ( - "net/url" - - "github.com/BemiHQ/BemiDB/src/common" -) - -type Syncer struct { - Config *Config - Utils *SyncerUtils - StorageS3 *common.StorageS3 - DuckdbClient *common.DuckdbClient -} - -func NewSyncer(config *Config) *Syncer { - storageS3 := common.NewStorageS3(config.CommonConfig) - duckdbClient := common.NewDuckdbClient(config.CommonConfig, common.SYNCER_DUCKDB_BOOT_QUERIES) - - return &Syncer{ - Config: config, - Utils: NewSyncerUtils(config, storageS3, duckdbClient), - StorageS3: storageS3, - DuckdbClient: duckdbClient, - } -} - -func (syncer *Syncer) Sync() { - common.SendAnonymousAnalytics(syncer.Config.CommonConfig, "syncer-postgres-start", syncer.name()) - - postgres := NewPostgres(syncer.Config) - defer postgres.Close() - - pgSchemaTables := syncer.pgSchemaTables(postgres) - - switch syncer.Config.SyncMode { - case SyncModeCDC: - common.LogInfo(syncer.Config.CommonConfig, "Starting CDC sync...") - panic("CDC is not supported") - case SyncModeIncremental: - common.LogInfo(syncer.Config.CommonConfig, "Starting incremental sync...") - panic("Incremental sync is not supported") - case SyncModeFullRefresh: - common.LogInfo(syncer.Config.CommonConfig, "Starting full-refresh sync...") - NewSyncerFullRefresh(syncer.Config, syncer.Utils, syncer.StorageS3, syncer.DuckdbClient).Sync(postgres, pgSchemaTables) - default: - common.Panic(syncer.Config.CommonConfig, "Unsupported sync mode: "+string(syncer.Config.SyncMode)) - } - - common.SendAnonymousAnalytics(syncer.Config.CommonConfig, "syncer-postgres-finish", syncer.name()) -} - -func (syncer *Syncer) pgSchemaTables(postgres *Postgres) []PgSchemaTable { - pgSchemaTables := make([]PgSchemaTable, 0) - for _, schema := range postgres.Schemas() { - for _, pgSchemaTable := range postgres.SchemaTables(schema) { - if !syncer.Utils.ShouldSyncTable(pgSchemaTable) { - continue - } - pgSchemaTables = append(pgSchemaTables, pgSchemaTable) - } - } - return pgSchemaTables -} - -func (syncer *Syncer) name() string { - url, err := url.Parse(syncer.Config.DatabaseUrl) - if err != nil { - return "" - } - - return url.Hostname() -} diff --git a/src/syncer-postgres/lib/syncer_full_refresh.go b/src/syncer-postgres/lib/syncer_full_refresh.go deleted file mode 100644 index 2c505af..0000000 --- a/src/syncer-postgres/lib/syncer_full_refresh.go +++ /dev/null @@ -1,72 +0,0 @@ -package postgres - -import ( - "github.com/BemiHQ/BemiDB/src/common" -) - -type SyncerFullRefresh struct { - Config *Config - Utils *SyncerUtils - StorageS3 *common.StorageS3 - DuckdbClient *common.DuckdbClient -} - -func NewSyncerFullRefresh(config *Config, utils *SyncerUtils, storageS3 *common.StorageS3, duckdbClient *common.DuckdbClient) *SyncerFullRefresh { - return &SyncerFullRefresh{ - Config: config, - Utils: utils, - StorageS3: storageS3, - DuckdbClient: duckdbClient, - } -} - -func (syncer *SyncerFullRefresh) Sync(postgres *Postgres, pgSchemaTables []PgSchemaTable) { - icebergTableNames := common.NewSet[string]() - - for _, pgSchemaTable := range pgSchemaTables { - pgSchemaColumns := postgres.PgSchemaColumns(pgSchemaTable) - - common.LogInfo(syncer.Config.CommonConfig, "Syncing table:", pgSchemaTable.String()+"...") - syncer.syncTable(postgres, pgSchemaTable, pgSchemaColumns) - - icebergTableNames.Add(pgSchemaTable.IcebergTableName()) - } - - syncer.Utils.DeleteOldTables(icebergTableNames) -} - -func (syncer *SyncerFullRefresh) syncTable(postgres *Postgres, pgSchemaTable PgSchemaTable, pgSchemaColumns []PgSchemaColumn) { - // Create a capped buffer read and written in parallel - cappedBuffer := common.NewCappedBuffer(syncer.Config.CommonConfig, common.DEFAULT_CAPPED_BUFFER_SIZE) - - // Copy from PG to cappedBuffer in a separate goroutine in parallel - go func() { - syncer.copyFromPgTable(postgres, pgSchemaTable, cappedBuffer) - }() - - // Read from cappedBuffer and write to Iceberg - syncer.writeToIceberg(pgSchemaTable, pgSchemaColumns, cappedBuffer) -} - -func (syncer *SyncerFullRefresh) writeToIceberg(pgSchemaTable PgSchemaTable, pgSchemaColumns []PgSchemaColumn, cappedBuffer *common.CappedBuffer) { - icebergSchemaTable := common.IcebergSchemaTable{Schema: syncer.Config.DestinationSchemaName, Table: pgSchemaTable.IcebergTableName()} - icebergTable := common.NewIcebergTable(syncer.Config.CommonConfig, syncer.StorageS3, syncer.DuckdbClient, icebergSchemaTable) - - icebergTable.ReplaceWith(func(syncingIcebergTable *common.IcebergTable) { - icebergSchemaColumns := make([]*common.IcebergSchemaColumn, len(pgSchemaColumns)) - for i, pgSchemaColumn := range pgSchemaColumns { - icebergSchemaColumns[i] = pgSchemaColumn.ToIcebergSchemaColumn() - } - icebergTableWriter := common.NewIcebergTableWriter(syncer.Config.CommonConfig, syncer.StorageS3, syncer.DuckdbClient, syncingIcebergTable, icebergSchemaColumns, 1) - icebergTableWriter.InsertFromCsvCappedBuffer(cappedBuffer) - }) -} - -func (syncer *SyncerFullRefresh) copyFromPgTable(postgres *Postgres, pgSchemaTable PgSchemaTable, cappedBuffer *common.CappedBuffer) { - copySql := "COPY (SELECT * FROM " + pgSchemaTable.String() + ") TO STDOUT WITH CSV HEADER NULL '" + common.BEMIDB_NULL_STRING + "'" - result, err := postgres.PostgresClient.Copy(cappedBuffer, copySql) - common.PanicIfError(syncer.Config.CommonConfig, err) - - common.LogInfo(syncer.Config.CommonConfig, "Copied", result.RowsAffected(), "rows from", pgSchemaTable.String()) - cappedBuffer.Close() -} diff --git a/src/syncer-postgres/lib/syncer_utils.go b/src/syncer-postgres/lib/syncer_utils.go deleted file mode 100644 index fc31827..0000000 --- a/src/syncer-postgres/lib/syncer_utils.go +++ /dev/null @@ -1,47 +0,0 @@ -package postgres - -import ( - "github.com/BemiHQ/BemiDB/src/common" -) - -type SyncerUtils struct { - Config *Config - StorageS3 *common.StorageS3 - DuckdbClient *common.DuckdbClient -} - -func NewSyncerUtils(config *Config, storageS3 *common.StorageS3, duckdbClient *common.DuckdbClient) *SyncerUtils { - return &SyncerUtils{ - Config: config, - StorageS3: storageS3, - DuckdbClient: duckdbClient, - } -} - -func (utils *SyncerUtils) ShouldSyncTable(pgSchemaTable PgSchemaTable) bool { - if utils.Config.IncludeTables != nil && !utils.Config.IncludeTables.Contains(pgSchemaTable.ToConfigArg()) { - return false - } - - if utils.Config.ExcludeTables != nil && utils.Config.ExcludeTables.Contains(pgSchemaTable.ToConfigArg()) { - return false - } - - return true -} - -func (utils *SyncerUtils) DeleteOldTables(keepIcebergTableNames common.Set[string]) { - icebergCatalog := common.NewIcebergCatalog(utils.Config.CommonConfig) - icebergTableNames := icebergCatalog.SchemaTableNames(utils.Config.DestinationSchemaName) - - for _, icebergTableName := range icebergTableNames.Values() { - if keepIcebergTableNames.Contains(icebergTableName) { - continue - } - - common.LogInfo(utils.Config.CommonConfig, "Deleting old Iceberg table: "+icebergTableName) - icebergSchemaTable := common.IcebergSchemaTable{Schema: utils.Config.DestinationSchemaName, Table: icebergTableName} - icebergTable := common.NewIcebergTable(utils.Config.CommonConfig, utils.StorageS3, utils.DuckdbClient, icebergSchemaTable) - icebergTable.DropIfExists() - } -} diff --git a/src/syncer-postgres/main.go b/src/syncer-postgres/main.go deleted file mode 100644 index b5239ea..0000000 --- a/src/syncer-postgres/main.go +++ /dev/null @@ -1,18 +0,0 @@ -package main - -import ( - "github.com/BemiHQ/BemiDB/src/common" - "github.com/BemiHQ/BemiDB/src/syncer-postgres/lib" -) - -func init() { - postgres.RegisterFlags() -} - -func main() { - config := postgres.LoadConfig() - defer common.HandleUnexpectedPanic(config.CommonConfig) - - syncer := postgres.NewSyncer(config) - syncer.Sync() -} diff --git a/test_local_config.py b/test_local_config.py new file mode 100644 index 0000000..62c4c86 --- /dev/null +++ b/test_local_config.py @@ -0,0 +1,137 @@ +import tempfile +import unittest +from pathlib import Path + +from local_config import load_config, normalize_config + +TABLE = {"name": "public.products", "indexColumns": ["description"], "storeColumns": ["id", "description"]} + + +class LocalConfigTest(unittest.TestCase): + def test_audit_only_default(self): + self.assertEqual(normalize_config({}), {"audit": {"enabled": True}, "search": {"enabled": False, "tables": []}}) + + def test_search_only_and_both(self): + for audit in (True, False): + result = normalize_config({"audit": {"enabled": audit}, "search": {"enabled": True, "tables": [TABLE]}}) + self.assertEqual(result["audit"]["enabled"], audit) + self.assertEqual(result["search"]["tables"], [TABLE]) + + def test_invalid_configuration(self): + for config in ( + {"audit": {"enabled": False}}, + {"audit": {"enabled": "false"}}, + {"audti": {}}, + {"search": {"enabled": True}}, + {"search": {"tables": [TABLE]}}, + {"search": {"enabled": True, "tables": [TABLE, TABLE]}}, + {"search": {"enabled": True, "tables": [{**TABLE, "name": "public.products,other.table"}]}}, + {"search": {"enabled": True, "tables": [{**TABLE, "indexColumns": []}]}}, + {"search": {"enabled": True, "tables": [{**TABLE, "storeColumns": ["id", "id"]}]}}, + ): + with self.subTest(config=config), self.assertRaises(ValueError): + normalize_config(config) + + def test_yaml_loading_and_duplicate_keys(self): + with tempfile.TemporaryDirectory() as directory: + path = Path(directory) / "pgstack.yaml" + self.assertTrue(load_config(path)["audit"]["enabled"]) + path.write_text("audit:\n enabled: true\nsearch:\n enabled: false\n") + self.assertEqual(load_config(path), normalize_config({})) + path.write_text("audit: {}\naudit: {}\n") + with self.assertRaises(ValueError): + load_config(path) + + def test_unsafe_yaml_rejected(self): + with tempfile.TemporaryDirectory() as directory: + path = Path(directory) / "pgstack.yaml" + path.write_text("!!python/object/apply:os.system ['false']") + import yaml + with self.assertRaises(yaml.YAMLError): + load_config(path) + + +class EntrypointTest(unittest.TestCase): + """Exercise startup and cleanup with fake services; no database is touched.""" + + def run_entrypoint(self, audit, search, fail_prepare, api_key="test-not-sent", password="test-password"): + import json + import os + import shlex + import shutil + import subprocess + import sys + import yaml + + package = Path(__file__).resolve().parent + entrypoint = package / "local-entrypoint.sh" + if not entrypoint.exists(): + entrypoint = package.parent / "local-entrypoint.sh" + with tempfile.TemporaryDirectory() as directory: + root = Path(directory) + binaries = root / "bin" + binaries.mkdir() + shutil.copy(package / "local_config.py", root / "local_config.py") + (root / "pgstack.yaml").write_text(yaml.safe_dump({ + "audit": {"enabled": audit}, + "search": {"enabled": search, "tables": [TABLE] if search else []}, + })) + script = entrypoint.read_text().replace('/var/lib/pgstack', str(root / 'data')).replace('/app/', str(root) + '/').replace('/tmp/pgstack-local-nats.conf', str(root / 'nats.conf')) + (root / "entrypoint.sh").write_text(script) + stubs = { + "python3": f"#!/bin/sh\nexec {shlex.quote(sys.executable)} \"$@\"\n", + "psql": f"#!{sys.executable}\n" + '''import json, os, sys +keys = ('AUDIT_ENABLED', 'AUDIT_EXCLUDED_TABLES', 'AUDIT_INCLUDED_TABLES', 'SEARCH_SNAPSHOT', 'SEARCH_TABLES', 'SEARCH_TABLES_JSON') +with open(os.environ['CALLS'], 'a') as output: + output.write(json.dumps({'args': sys.argv[1:], 'env': {key: os.environ.get(key) for key in keys}}) + '\\n') +sys.exit(int(os.environ['FAIL_PREPARE'])) +''', + "nats": "#!/bin/sh\nexit 1\n", + "nats-server": "#!/bin/sh\nexit 0\n", + "sleep": "#!/bin/sh\nexit 0\n", + } + for name, content in stubs.items(): + path = binaries / name + path.write_text(content) + path.chmod(0o755) + env = { + **os.environ, + "PATH": str(binaries) + os.pathsep + os.environ["PATH"], + "DATABASE_URL": "postgres://unused/test", + "PGSTACK_PASSWORD": password, + "OPENAI_API_KEY": api_key, + "CALLS": str(root / "calls.jsonl"), + "FAIL_PREPARE": "1" if fail_prepare else "0", + # The wrapper must clear conflicting inherited service settings. + "AUDIT_INCLUDED_TABLES": "private.table", + "AUDIT_EXCLUDED_TABLES": "private.table", + } + result = subprocess.run(["bash", str(root / "entrypoint.sh")], env=env, text=True, capture_output=True, timeout=20) + self.assertNotEqual(result.returncode, 0) + self.assertTrue((root / "calls.jsonl").exists(), result.stderr) + return [json.loads(line) for line in (root / "calls.jsonl").read_text().splitlines()] + + def test_feature_modes_and_failed_setup_do_not_cleanup(self): + import json + for audit, search in ((True, False), (False, True), (True, True)): + with self.subTest(audit=audit, search=search): + calls = self.run_entrypoint(audit, search, True) + self.assertEqual(len(calls), 1, "failed setup must not drop a replication slot") + env = calls[0]["env"] + self.assertEqual(env["AUDIT_ENABLED"], str(audit).lower()) + self.assertEqual(env["AUDIT_EXCLUDED_TABLES"], "" if audit else None) + self.assertIsNone(env["AUDIT_INCLUDED_TABLES"]) + self.assertEqual(env["SEARCH_SNAPSHOT"], str(search).lower()) + self.assertEqual(json.loads(env["SEARCH_TABLES_JSON"]), [TABLE] if search else []) + self.assertEqual(env["SEARCH_TABLES"], TABLE["name"] if search else "") + + def test_passwordless_keyword_only_search(self): + import json + calls = self.run_entrypoint(False, True, True, api_key="", password="") + tables = json.loads(calls[0]["env"]["SEARCH_TABLES_JSON"]) + self.assertEqual(tables, [{**TABLE, "keywordOnly": True}]) + + def test_failure_after_source_setup_cleans_up(self): + calls = self.run_entrypoint(True, False, False) + self.assertEqual(len(calls), 3) + self.assertTrue(any("pg_drop_replication_slot" in arg for arg in calls[-1]["args"])) diff --git a/tests/smoke.sh b/tests/smoke.sh new file mode 100755 index 0000000..d24415f --- /dev/null +++ b/tests/smoke.sh @@ -0,0 +1,102 @@ +#!/usr/bin/env bash +set -Eeuo pipefail +trap 'echo "Smoke test failed at line ${LINENO}: ${BASH_COMMAND}" >&2' ERR +IMAGE="${1:-pgstack:test}" +NAME="pgstack-smoke-${RANDOM}-${RANDOM}" +SOURCE="${NAME}-source" +APP="${NAME}-app" +CONFIG="$(mktemp)" +PASSWORD=smoke +docker network create "$NAME" >/dev/null +# Invoked by the EXIT trap. +# shellcheck disable=SC2329 +cleanup() { + local result=$? + if (( result != 0 )); then docker logs "$APP" 2>&1 || true; fi + docker rm -f "$APP" "$SOURCE" >/dev/null 2>&1 || true + docker network rm "$NAME" >/dev/null 2>&1 || true + rm -f "$CONFIG" +} +trap 'cleanup' EXIT + +docker run -d --name "$SOURCE" --network "$NAME" \ + -e POSTGRES_PASSWORD=smoke postgres:17 -c wal_level=logical >/dev/null +for _ in {1..60}; do + if docker exec "$SOURCE" pg_isready -U postgres >/dev/null 2>&1; then break; fi + sleep 1 +done +docker exec "$SOURCE" psql -U postgres -v ON_ERROR_STOP=1 \ + -c 'CREATE TABLE products (id int PRIMARY KEY, name text)' >/dev/null + +docker run -d --name "$APP" --network "$NAME" \ + -e DATABASE_URL="postgres://postgres:smoke@${SOURCE}:5432/postgres" \ + -e PGSTACK_PASSWORD=smoke "$IMAGE" >/dev/null +query() { + docker exec -e PGPASSWORD="$PASSWORD" -e PGCONNECT_TIMEOUT=3 "$SOURCE" \ + psql -X -At -h "$APP" -p 54321 -U reader -d pgstack -v ON_ERROR_STOP=1 -c "$1" +} +for _ in {1..120}; do + if query 'SELECT 1' >/dev/null 2>&1; then break; fi + sleep 1 +done +[[ "$(query 'SELECT 1')" == 1 ]] +if docker exec -e PGPASSWORD=wrong "$SOURCE" \ + psql -X -h "$APP" -p 54321 -U reader -d pgstack -c 'SELECT 1' >/dev/null 2>&1; then + echo 'Incorrect password was accepted' >&2 + exit 1 +fi +for _ in {1..60}; do + if [[ "$(docker exec "$SOURCE" psql -U postgres -At -c "SELECT active FROM pg_replication_slots WHERE slot_name='pgstack_local'")" == t ]]; then break; fi + sleep 1 +done +docker exec "$SOURCE" psql -U postgres -v ON_ERROR_STOP=1 \ + -c "INSERT INTO products VALUES (1, 'smoke jacket')" >/dev/null +AUDIT_CAPTURED=false +for _ in {1..90}; do + if [[ "$(query "SELECT after->>'name' FROM audit.changes WHERE \"table\"='products'" 2>/dev/null || true)" == 'smoke jacket' ]]; then + AUDIT_CAPTURED=true + break + fi + sleep 1 +done +[[ "$AUDIT_CAPTURED" == true ]] || { echo 'Audit record did not arrive' >&2; exit 1; } +docker stop -t 30 "$APP" >/dev/null +[[ "$(docker exec "$SOURCE" psql -U postgres -At -c "SELECT count(*) FROM pg_replication_slots WHERE slot_name='pgstack_local'")" == 0 ]] +docker rm "$APP" >/dev/null + +# Search-only quickstart: no query password and no embedding API key. +cat >"$CONFIG" <<'YAML' +audit: + enabled: false +search: + enabled: true + tables: + - name: public.products + indexColumns: [name] + storeColumns: [id, name] +YAML +chmod 644 "$CONFIG" +PASSWORD="" +docker run -d --name "$APP" --network "$NAME" \ + -e DATABASE_URL="postgres://postgres:smoke@${SOURCE}:5432/postgres" \ + --mount "type=bind,src=$CONFIG,dst=/app/pgstack.yaml,readonly" "$IMAGE" >/dev/null +for _ in {1..120}; do + if [[ "$(query "SELECT name FROM search.public_products ORDER BY keyword_rank('jacket') LIMIT 1" 2>/dev/null || true)" == 'smoke jacket' ]]; then break; fi + sleep 1 +done +[[ "$(query "SELECT name FROM search.public_products ORDER BY keyword_rank('jacket') LIMIT 1")" == 'smoke jacket' ]] +[[ "$(docker exec "$APP" psql -X -At -c 'SELECT 1')" == 1 ]] +if query "SELECT name FROM search.public_products ORDER BY semantic_rank('jacket') LIMIT 1" >/dev/null 2>&1; then + echo 'Semantic search unexpectedly accepted a keyword-only index' >&2 + exit 1 +fi +docker exec "$SOURCE" psql -U postgres -v ON_ERROR_STOP=1 \ + -c "UPDATE products SET name='smoke boots' WHERE id=1" >/dev/null +for _ in {1..90}; do + if [[ "$(query "SELECT name FROM search.public_products ORDER BY keyword_rank('boots') LIMIT 1" 2>/dev/null || true)" == 'smoke boots' ]]; then break; fi + sleep 1 +done +[[ "$(query "SELECT name FROM search.public_products ORDER BY keyword_rank('boots') LIMIT 1")" == 'smoke boots' ]] +docker stop -t 30 "$APP" >/dev/null +[[ "$(docker exec "$SOURCE" psql -U postgres -At -c "SELECT count(*) FROM pg_replication_slots WHERE slot_name='pgstack_local'")" == 0 ]] +echo 'Container smoke test passed: SCRAM, passwordless local SQL, Audit, keyword-only Search, updates, slot cleanup'

    j!I3g?wt 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 g?|R*0Ns5twP@Y5XoUy^As; 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'nDS{7=te%CL0l`)30oZJNX%LAGOi#r0O zxX}yTU<}-VfpBafcH6IoxrsO8saI)-{pf;J`Kf;tCfdanA?0lqrKgsbQ$iS2^hDww z*smQqyixQ8d5J(A*{F#|p-t40_qlcqwLyE!H-RG60&gPZx+uOPTGoo+sJbsKmzQhf z>N-QQ4`Pm@cuvG1T;pU7cJd&wprwH?vSA`%-BEsi7&GKTcTp+-#1n%Mdn2Sf#G&IZ z2Z&`s_RBcpJ5k2f#ELsM2m%Z! z|H*FbgA-oj72;;KS>l4~lciXy6(($u>T`?+w=k9rC(OcPcAF7{jJMXKtT!bn2j$c@ zv7JwDXu2<%AR1CB0v!v{cFg)JYSTaFQITclLK@F@kYZ@m5<;c~eqjNP8N*2uw7@qb zCPjM1IKp29<_iXAzYwPR%FSS8%nZ=PFP53JmM>mTburpvSC^y7EvOb|_C^v4G+JGA zD#)1)0&`-RGX`cS*FZ5g2}_7_T?nQ)%8fSogbT*N4aLP>^$VmYQ*sP0sq-mK2Eq)k zBjGA%4Z;AmWCAv(!+>iGIiw?K(^xvBBZ08EJT5iJM$~qSlN8l3Df(JB@1x>m|0RiX zg>?aXHid%W){)aR0+H`MQj7L_aw3`B+|-<`D&~4Ol}FSGM{O{Aqv9kCO0euWgY1xn zP`u7xHp@8PPOoCJ)@@th>`cU%WL{-i!DKnNQVSvIC=cwF&;m-fMgwza{vS%Jsa@1; z%%k^;UBF7n(ZwYx!gk^8F1Kxr#_Vof$MuW7c@4~94XSS<5)Psy<5bfc1(hasPo~FI ztghW!-g~p4xqHuRBHu?%Mc0wp%l^EfUQia=hyq@p=dO|6dUo(`;R&ZSPQisg2<(m= zATv3gi{y4VsK2FGvdUj7h}<$dkX!_C{>)Y#SY>j!_h(IEbQ`tL9sb_ZVYfN{Afmhc@mk8b4F*5T-*9j?<93#!Sp9zS-_T3Lwn(8`~!n9 zOv8T;4@N{tk>Zzs7Y}}M!;zw$i(fu|EefdO5@8;FyyP%>>T-Hq4cOUaoXuOu5Ts z%9t~gwOrBim!zL(?xguevEqS$r4CfxHO$b64h0&Ny?UiqrX+8m7%Ze5X<`a@Z-y$ zzxK-(jg$A%lxy*RMJ`drHxYdV7Wm#5UVKK{Y615qJthr$EBVL4X+Yh#`T*5y*TH8Yt$NWR^)$7xs0*MPW3dnP7lx zdBIu#CiA}Z8TT771#t+)L|(1_zvc#v$)WjgPo1ranJ!HLu9XQmGT%1`MO?<16xFUs;t;I_GS(8p}oH9|Y^2Alj`Cg}yuAgQE#u{*~F-Amd#7og( z3{4cqL}oC%p0(Z@xY)Z)H!WDwb%84wMSnt8?tbj1iy*pCJMA@P;w}c5!S%{U8&Iby zmG8Ymo-MDSAc}{!M-qSM>b$$TDw9mcb=Tyod^cGnc}ik9T~JQVYWQ%AlYCN-j^Apx zu0`p3*5v^vZmin5&THOA0RaFZ`2+<80RI3i000R9AOmLs00{p8{|OvOu%N+%2oow? z$grWqhY%x5j99AF#ETd+YTU@NqsNaRLy8fFh*r_Y}pT?utHP}M(DK$9w6%CxD|r%fL*?)j+?o2-0P!$|&E%h!ZPb%-E?bSfc)^B1QQi zaLyI0wy0k-Av_wI+C@b^7n4(l$G)=pcpFj0_n4lJNYD3 zWQy}dNF6!&;UWuB!@;78jXhRr<&{`w^ol?RUii;F0x3DriUyrXB7RINGf-rzNSWoE zaK;HIDW*_K&U7N-B3WS;eJ1ChfCdVplIuk1&Ob#$gwKmHa#_)akCNhscEW+ zqNg|8$b*kS?zGq#)QYn^a{9$)XH?|IDLLKmBm@pg{I%b?cDyU^(sb`VTU|Ts+)AqGY)7%PB5>~fO zc4`iUi<1S7D-e`1C$03Kp3UqRFxpi2sYubb$mu}#P56&8(d2T}h;l70_SkV2M@lP^ znLps6lY&KO#&wxBSB|t%!wZ zI!C(^GR9^Cu~E}12AR)kBX`{RMmhf+R+D^`D_5!Fl`~#L84)6+6tT16ZEV&Gn?a*d z8W-{`JNQ@Vmt#XuOP{}mq31owFTisd(A>f*d8-J913K3W1J$6V6i?| z45k)Kj8Hk0q_b~u0~*xGMKD^y9;BcmY<&}B9v71-_V{Tw%Ak-pwnGkobWkTnvd|I@ z0x!R4Zj$}cPYQpiq;lx&AMNOeJgVc2FE;XQRkR~24?{aql+QhX3Cs`c$1s5yv50W{ z2Rj-SjV}%a7+-{s8T+=&+j!?6e*DK0S9A|^;lmxTY)3lQK@DnjZ#J$g1@pjI&9oGz zAQo|jD0uTD7Yc-8K_iH|bh7`?yH#gdZOfZOB-KvSG|e-u0N_7>qa-0gOPK|c$1^?{ z3^p02GY5HRLDjMhwO!GAmmrKy@mIh}zF7t#eORH97Hau`Xq zZe>HVzy)x+p^RNgh#Nn%&o-{ZF31hlC+yG%IV@C=$>Qf~1OWyk4VxH`5~MhTxrf`F zby+3Z$8`3A2A5ulww?bDCpiL4PUa*@+M2A>A^H4As!Ajea>&CQb}Ptbfg&b^T=0U* zfX29Bq0U}8vA1A>ml_G;i4O{78eS?#gUCeJB)P*}`*_edo*`Q&!2+r|v=Nnli(Q?R zaUnnCERnwCu#sJ`DG!TKcI06wT^Yn={j2X@pzVK9ICT|v|bkyUR z=n_aj3Y?wg{^b9g|8QJFDomos)~9<0L7tbjLR0pHjV{5^=0B=|GrPLkAQh&wK-xh+ z!4%n}_uaEfiZh-%o)%toxsH9zq_vV{$`Dx~wGhZN zfZ+^al=B(fZ&#g@c2v063E4-Bli8JhQzk71?jiHXM(KfU30eB=|+SU_v3H)qaOV@^g)hU zkbFc)ANl`alsUOn(cawXA4aPPwE{uHp$!p| z4>WcgR$~ws6hjt)eF0b!e(^=ffDGG!Qp&VJ`H*1*7iUCtfZFqc`;t2Pa(nuMHL7J! zNi||FM@<6z%g#sP#s!iD_kdK(L#b4 z@M-p?1&nK?mYC-4|!Kks{A05bMwm?XX#(MG$%- zLt6L}*|8!KVjtAdXmOT0^MHfvmL!V9BHxf>2$3&RC=lr&Uc&Yd!4M3-@L~Uu9B2O{ zDL?0fKj(;0l32*CN~TN;;T>)zDW@@`fv63V}uq^3XE^5e&~TQB-Ih zDK!x0bRFh057br;*P&P3a2-j)VmbE@D`#8+HV}*08n8D{NZ|^RXo?1bPC(XuE>;`i z*9|6Ofz?qV%yMP(VSxgD2(4l4bQN01wm}lgO0BF3={TZ1u;=8Hw_cz z3*{J&gi{K~;f)GW5iMg7YN8F9)GmuNa2seE_`o>%Vjrkd5Oe{2{wNWX(TcvHh>BPc zz4wa5rjOGgb@b*XE2odN$PF<{ObP$F92Q6r zNfl^NR3kG95(5$p;CKo|d6aHZjs<~{hG*I$aNWkmR@mY#gt*46;rBLBWKr@96?j!aW5SPm9P*D6cdh$WQxtaDj0zge^^G5K?&xdQx_nhKPIV7Wzn=AS4$xMG9=vjR9jLMDc=J zNEx`53YWJ=IM^WbkRpkP5YreDFG3Znqa@RL5Iy$~(|`>3@|dYP5i$RfAyA@I*yIYP z0418iA75h-xPUEaBpK&P3j`DxHWC-HKpDLe6Qpo z*hCQH@fwz68~`MlL0Jk-M4R^b512_;Vd5nd5{p>lp!tG>c(aodk$C&!4iO?f335F- z=@1W-bM{eE1|fn80bbxp3(feU8zGT?CsQzI5cKsrzA||<*+fB!Hi!ru-~}VrGo%H9 z4fd#xB!M~yD5V6~nF*4K0uiMWkzf)5FJ0=T7=fmS$`jxb8Swwoo$XheFGXe-Vy9uH z5Skr{9og}aS^6%{l&GxA7px&@xYrHxA&gHMJ!?3N z646oxu@0H_5Qp+(r#cW5MIR6Or2nuERyq;Xz*%y7a|+>PVA`tEniVs%s_Xa=l)4b8 zim5CXi2Fkw{DU3rh*S*`j4pBzjZ&)uk*y0sinvgy(;BaAF|M)}3?F$i5WzjXBB%+$ zIt(E_2SKj{!K~GDsp#5h+n}xv5tp$5aq{}GXdw$IBoMvFlN6hnjQCx>7gNFd5!LaB z1+jktyQ2u9u(;}6C#w-jE)7re*hPJc$efn-R-8AJjsy z=sJ%?J2^g+vLJyB!Qf0b1As64v{Yd^`oxG+)3ka~W5vs$Jn0QU?%ixB2C zN&`{2zKO9Q!HyD3ARFQdet}DkI1mySx0ve{lj5{tG`BDp81D&r2ho~|RX#6-3%T%= zTDuU1ix6m=xC@a~T>BPI0z;%A3phe)?3uZ|D;l>nTBFrH{aF;N$uh6tD; zSa$5WY)UJv1Yxr*mz&^`m7_Icy}P}*F+P=>5aR!lDVgGO`sNp=peMO7fnKw^?l~C6 zk!-#MoQ-*TmnR&9p_|PcXo(dUE&52&%Dn)L7zFeWTe2T8L|AKLGo|pjY^X?Gq_<0J zlvXPdTY_h_HMNWc7zGg-P8Pr(OdI+k3zF2D;4zn%cQ(lA7jQu_dlw6rN1`p0DUAq_ z456k7aW?GXOEWtgLh->qTpH|gyaxeEL#(rcvA{U;IxKS$cMjfpil&!U$Mu2{8Zn2$cq0gHa6q1i~Put9LbWr6rD54mb@`Sp-}>% z$(P*8u;L1v;WC`;$)p@Bk%p+HoXV=a%B(D(d(z6VTq%wm%d}j}w!9REe9OAL%l5^~ zM<#Qtg34+|$i7@qefM%VJjV+(%f(zxl@>z;JX3AVLtjHsP9t5!`ZNMTkX`gvu3!{=_l)d( z&jg(olL8EC(jevVL+w>|xjaJdT+rZ?WCl@IeN~9p6NRfc&6m5(ySo#{fgHjt(E(B% z%md0ML<`g54+h#|u#~X1peM5tDZBrqOApNv!a@q)$wz#Y%_MCeeXN+s{6ezuG1il4 zpRx{ixWv+|n9964P<7KC@h%$j(}6M@&~plXbse?>Z&s57!7S#~O`BK{&*u)Dg}5K)C)^U-?h`vIl&uYV+mu4LA2u8G zAztOsRpjt|q9u}4*3!?>+mTNvT{AFALJp`?PS}{;@%Dc4YGCE^6ea+VHlBt z(B(GC%d7RZ(zQ4M)F;ptHs znHHx9k>L%Jfegb@r1Az^;4Tu5z4SHUN=%|i|nOKu+ z%`x-T7lEXYeksUE5K{Sy1OZ;lif&1Dm;zyMC}@mTNa%gTR&4#(mcr{0@w%rTDcK8Hsh|q6a8}XGWtg_VP^cxP{=>Y{W#9vx zOs^wGF<9pz;hB5rs8GQ+5o=083$;KCDFYl{4|`xg_FV7vVQ=aS4fF`I!F?n$P)}zxe{u`JX@fq3`)lKmZDG0IUBGtFHk6!1}Qd`>Zef zwNLx6Kl{3W`?GKRxWD_YpZfw(1&J^bj4%nupZt^X56Z9n%#Zy4@CgHf{M63~bO8GZ zApsYl{oMaw5Zu503Gw|BKoHx10SX`owE&r<{`E6Bu;9Uj1Pvk-XmFoDIRpk6#F$azMvfgle$*IXKmY-PayJtnAVLc7}O)#XT1F-BOpVg9yl8 zJhD{r;pfs@sFf9Wr=rRAcr*NYI?CtwYO6Od>~mkW&!6?yAirDUd@auSlwa%Z$8Mf| z|NP>@)LTE9YSfcN==iomzv!vWxc3hSe(jz6`^zLFk>T4?TzAUhZMM`E$>n0hyDR#; zJv(;|A_m1XH6_v{-F>4MEWl#ccy?~YT+_8&q#K?jpk9wxb|WLwq&s)EZO!89KUkw; z)}wDe&h4zsK&3n=I*pE>n(0T$^7MwPFRlluo2R_`r%ug>!kMB+NJlWnFCdhNLw>Q_ zcGrSz+vjC06K>s=1O7O$rd$&`*>Uu({?C}B_+LIwB`L+tcqgOrpnFaxpB*J`2{|D0 zyZ*(8Enf4J4zs-x^Z1GSitz3=cI#RXZoJ|Vt1(EsSmj^3(LzN8RU%0nE^ zv;*n`U-WO9|J}HHp;&J*-(IP`{_txZm{XmQO8;Gh%HKa>o_W9LwC?FU5G9-gGDe+r zo0@CViO{Uz2Omt1JE-=U$1I<|Vw3-9@rJuJA{`YeO#kkJe7$^nUn?uuUKO+P{hsxO zy%BZa6nz1kYWn<#A&dNdz6&}4X-ZWgCbQ?LV66q%%&lY<2k{cf(7gPa+<^2;iusKuUxoi=eol#ZpuSh%;hO;{ z7rBYmiNzsOGs)%KUu6B(H|FwlA9lFV@=f*?ESUNYHot}&B{2KI3ZPY;ub*jk(@V9f z2l{U3BRJD1#bzaBz;e8`#Eqc-bn~`7*5(8Sso-N4_P|{oRe$5w{52;JfwX6lq@jiD zM@d8HiyppmxG855b+r#2wmuOo{;|(3c3?DYU)z)bqs40<2MUF36m5O_U`F7N-EfaC-?pI5h@) zPYSrif>o^cdb+a+&JaSDVZL$NO4TPQJG9=Oqk27+sF=~?SH;dVik!lOcQ12 z2_uIdEL#5un^XD4)3no1>$)GQrF~NHV?S_X@EJCA02ubw74Qj=4bdW~RG(l0k(gqD zHJ}=bAQTY>>&mqHBH!ZeclKOUZKxO_))T1WdfR@_Ga44#m7}Y}%z0%Ra*Ao6F9Kob zsXfYb00*%w&D+pQlwK&RoP;!IQq3J}#4@5l=t5!!1+OGhlE45-7DCCmKp2w=mcz{m zDFpRdq9M{NQIFgjjYn_wOg2Q7AbR|Qj`|p;=2#Xd_Qo_R3ynv;QLBFh`!8V*jWz$8 zIopvF>va_MvtOuT^F9JI6Ci)*4Meqr1xq$($-Lj!aCxTws zh7GSt|NEikyl_=It4GHJ{#;46{!#*WMlU`(cWUOls5vDS6N?q$YYUVxC)>&Ekoovv zoWjaMKH%@MhdaV)27(){fZdQQ8una~A{7GIpq-!W3jiQD1yK4ld&Om{)Kl~3*Q6~s zNzKwHpP$Ng?zv*hUkX^slb~k#<2^RAy{A`(o1ae(6)YUOl5s-$YxYi@xW&W)*`dxc z!=0J?=l(V+izXUJArZ!&d-arV=h~FbA*i6b+s9x}CaO{Kf|Lkie#F-0hD# zN^4}xsk-FWUF*WzopDBj_bsY(`*uy7kh&^w}inl5@$ z4FF7NzEam$EE$u2p?e_`bMU`a5}Ww?@On*EyFgD?pKZv+OG^g4n25UO<-r#^kR1{3 zZXI%*d}E;eUfvngZ;GEYKiPgtOr=C9OS~i4>L%6XS%XQ1u#9JjkJRo zdj;WxQ)>K6BMO+Rz>Jyb2$79(OAkQ4T!B+3yBDQ6TEj4;q~3o!kqWA+h9(ZqfIfB+ za1bK(C09@4vOzz>tJ(^D>3>5NdeAzb>V#V-FT9MJb9R_fhP zXfpT9nlPhWsvA-)t^e2c>P25=ACqg&tVh{JvGsGdWvBDoE9%59vG{b2W9-k*3p(dQ z2z<{bZ1MD>EMEu%NtbnyHPQ+%yZBus)0Cy%S+2n!!~=-|WU~Ngi_&z%r;f*x3u1m- z+x*#+pNRVxcjMAClQ0-bz6F+c1lODc7YLLN*gbuv{Sw{WmnKpa)T8{5JSEzK25D^B z;ocrj)qYBZ2Sw3w7p`4U1JFEg>!lrQGGQOAxrAYXtMaZe(+4W9+#_3DpveE*&OkUI z>MLrL0vdes7_TI&Z`XRl>iZJrEQa;&_I~9*OMSff0TMO=wUO&pHqUwt zmy{O}TN%teA6tUNih;a{c{u>uBv_qXnM=-1@w$J}O*l&2C`lf0@oz@;6-6l@eR8Ox zn#$u-fQ;a+`+ggYlqQH~OZKa-T;3Tg5g4Ujwy<8D3PN|4hR+ojx%K#aSLmBbgthdQ z2EA;U?N09JkI+gpd)X697Wf+_{1bca;si8IR$g4MD3^*5l{{ioUqlQjaky2IAbgWA zlY04)pzEm@`KHR-?V3ahwi~3109_Qfv(-_B^OpQsC7JPEs*ipivS%e3S%SG6U#mJ|O1$ z#p>_Eo*2#xjzslb&3gT=TkzWVH-nvU;agYI+Fq;A3T0g3XB7%HY)NFy!D8&$kBZ@{ zxixoUvk#2Geny-7RvLRfdc*6i7g(hWzTIIOAl^#MzBUHFofm$4@jaaLS|o)F2H+0$ z?PL`7JEMo*6)e3Qe(iiYyKPOyWo_i0G6HhSTdche7sD;rBlZomq;!U)ZZ1i|2;y}F z=P&avO`-4h>TT=$3VR9A`MA+Y_B^Y>xhAGNs~$Mjxg zI_nw9R%gA`gYmRpmKsfGYWEiS1ss7@g00YKTmd4ym^E{=f5`!?mU4B0lC@wEsG8Amt zlzPyfCX0umLdTO|crpMWZ+zMXtF$1a%;0HPx|COfkXOBFPS^`rc!Ni4rkm?-Mn;|& z?+zj3%>C?$JolIvFfezl;MYXqf=4vpc(KU%St(CX8vt;^Gq>OKYMf^-YrG=TvwSxr zp3l}jAl=7CC8My&7qCK<_r196bE@7Ce|ek@{t$<1xOD$xW!{JUCht57 z5LGxH+?K8;+n`xKj&1sIZ4`L#Xfx~7q@doF3&$rL=u_ZFMH!h6m9!Jq!CqOBBN@M7 zEe#`%eAC%$BiRetd@@4h7kH`C^+I!)6xqzu7 zOWq9b=t-M2V3o;yqC2R)&QU9NaC}lsEP^(k*EaOzKZp+sd#l1SOHd zBxZ)~B{$~6nvp_1cJ$Yj?c4PHwt&rs3Hf}%J5uhszs5R^0B{N?cOp#-C!Qba2Z;he z+DZzZX1k*(A0oZ?k)AzIr}LQJeyw!lrqp0cx()6Ywv7gR#!x;A0~pKZ>sfk_QwW)VZ_vc@MF_5rrq&_lS-5%7~q zm{g*d+wF!7TPowH)MyYU^;Tr6Ez@oL(#Zk7X?bX11d8H)XjBW3;n(J#|Erh6f_gR8 zV#;Rs^89epo-rtIfar%0_q}^H5aTH_juAVv^Vnb0iCx@KLq$mx#BfG!`V?b%I@yb%~ z8h8IlXAg5mT4~E%L;rh=c+pg&8Q(&Wcf0(t@6xTD=i}d{2lYdnrA8yVsJ2}}vCJ=y z&%Q)Zk7*RnCwYL+!%w=}@E__TpN~3bgiCitrG_~{sm@TNLXfmAzpDq>^}5%lQ}DlO zb>+THKLF4jMb)y;P?n`aWT}_GTYKSO09atd32O_0rx_PQmjl@K)BlTysKuwIP|~zu zp2ez^OHTvyI9J0azyffHM-yH5c&ej4n0F%(V$(!-jH1hCj_;E;9jN;b{uFg8MPYDU zurJM0O}Fl>KoA+aa#=H&2|ehM&DWA1hewF#8?3f62xSvQouHP+jCf}#AIAMoWUBSp zi4Mij#6tS{L55n}>CTVne=$;kHHs?Bus-dAbSlM3Yd-_&eF3IfZCY?{KfPl>;d2=h7TsgMAmb>G4SgB z5Csb4QUX-H4X9wxIL+eca4UrD!Qo5%hHgPID_V zeq{Iz(!!d|E5@2NH~7g>ApOFeR{oXdyR(9#&~e;}m3(M86&^qE@2`u5r4FBDncMBd z)Thu)wJ+D;wST_dFgwrxw&tkX0<$C{k2|PbpW)x3cI?{DnOHr!qWoh^HC8t>3Lizt zR|+3#vaP#TlqA~x($=M*FOy%a_P~SlH)%{!LeMtkgHO$8H}u;cVZDuSvU!7h{%`8xstfkCmWNY3~-xPtTk%&+x- zpA~rmwCVMst6mv-lnK#qu2EYGj|`1Pe~bdRz7R3IBc;dq{u-`~G<)7V`}Bl+vs;tz z`#X{UjMo`|_oiR3{WIC%axx@z&+a6gIrp^4;N0Qlcn#P4^FdZycU2B)Bz2&c5@x2J z=Zw47{kz)o_j$wuqV{-sOLE+n#_OIh6^Cnn{aKl=(@nX2$mQ@Zq!cKCi5js?*trK& zD?V`@(<>n_kk2_dDTpm7;Jh&d4prrZv(!pDv#mwfRFQLz~n#(>wX4k)mmlA{DeTg+;&OwO+ukGl`Nf9+!KbjVhP#D72h4+}=mnO% z&&hKIN^O5RWfsiN^Dnjbw8mVd#Hqt#=*nodwSN3Dha6mcn~<+Yrv=CwRn^83z`6N| zNUPs13|tt#V+K|?^vgM9{2{nF)y8Li_*x38zA8{yE zWcSf3IpxsrkgJa*3{M^e3+uF{evsE38m&A%br~J;XDa3{Kb|AJW{nQN{O`$N94`;o zrum;7Bi=Mz+79XQDD=dGx-m<0GGB_yEQlW=-?9fJKBG|7E$Bre7}x>G5eI$(%jUP6 zMCCC6I3Xz$5{@4daMb!H$s^1EZd6zMng%!e)r1v2->-9e$5yhfP2zfA-Lqc{Z_PIj zif~qyO|DNlxo#?y)FgF0XT)mx$()h`k>VeXEMY_*GQl7lsQky>)Z9)3<dFBcqRP7f}qQ0jp*CtMuQ5BV8geKMdD!CyVzob>IIdXfCmoFXEa%~UoGn4I#ieBM%x>rjyElPmR-)# zq2PBrb|?@{$aA((a(LNl!>umMxpM>ku2RkROXt(vm`)>wL*oX`KoPmU9=QQ48_n?V znI;yqh>9%-j3NR?ezS?uDb>L36=m7&Fd7f9g*m1Cc%Q6&AlD9kurg$&h9KRQ7!>|MzL-l{Vv`F07zU zTL<>d3qjnx+LO=IS$dhS-6vs7n8V)RJQ~@#Wc(aveB*^-KO*n-F^2pEv(MNRA*}YZ z{9V~@#trS)rwAt7Xm%UX`NCBJvq2^4g`NPd6YN>pe;mmfeVgr=N2(IM5XC>TK_Xv) zD+7yjSD!`O8YL`!K)-K9Zpj+mPBWNfESX9-hDM_IfI`>T>-o|NP_0E!L|k{y1bZvX zJoeIR5Wj--n~->XRqNNV7N}fH0x3?c_)O%{8HqF>3YqJzr2&N^ z{0a=~qhDyi4)7DIW~Ex;HU}nUzZN|S8EqnloObY6kROXu5Y!z%>``Y}I>weO-1-kJ z$OXv+eHi3%QEYKa z1c&~`XMB^c>*j5xDRL<}0n`uEUu}$x=c6MAwNA;cOhApe^CGUBGlIN+8^dPW9|l}v z0QOv@CypC6g7Y#$`5*7KDH5CxzAJf$3$f-cu(Iq%Kre*d&6Wxn{e$OAkh^4&mSC@( z<2$a7ZJ4z8f4Ra|ofyHs`+tdzGnrcTGq4I)k8-1E&K>beDYrj-`W7@{J5#DuegeoC zLrbnaDpS2)b=9hQlRjKp33rs z@pMD-@o&ZYJDBLLi<1@%6RzjQLk!MS-$*>N_7+r~%n{!K%C`|AwM0or?w?yPwY4UN zoctr){8!_s$ZisLgcDkVS*~WHyL04R2t1PiGZ69}Td75twvI7|2Nbq!4&vZ3NVe9kf zFe{g8XM7u7cM7CR<|skIpkdpdhQ1L~4isrElu3Z^Fkm}YLJp zs?{60;pJ+mu_NQa4p;}*!!*j!>b)MB2-1=yf(i5?Ie94nO@d4pjHr+Z0)hK!#6;`} z9;md$1E><-wjqHM&)5Rp`^Xxg>QWuOn+@5ZiHV~0TSoZyQe$rs_`7KkN8sNDAhJVY za+{5@rmF~pKR)`1DFKT~O&C*pjGL?)R(th#zy|h=&nRo|!GUlpBsClz zL#3NUD4$XJG`rh7vIFERCkT}T_^gRyWR_(=L1>VrY&fCaM%q^dBHu_I=l~rEnsIBM zbqV4iV06#gzFMQn`RK{4TO_TiK>iV;PN$o8Cn#S-*>9}D??Ji&T%s!TM0BB~NFe(C z2cSNLt*qjw#-f7!WIyw zK$IyPQ6(A|t|~D?(`_U95z9xWNZ;Z{y^eVGI{9X0`F<#*YjnXk`q?XdbS;Z9%g~p; zpBDU->Qd<*6)k1@jy*Ga876z+_U(NiVh%W&7VS!cO$Z*?szZ)cA(xcBo)M)x7A3Yg z3K)>2b&q7r5~3cci~)^w1NYA>5@VI~3^?ko@Ia3@Z@EcCr-oqhYz5Y0aej3dD)lS} zh_dBiwi-XK%{WsSCge(~WTK=N>1kSznj^=u7g(tX;U-#{$x<#ox@v+$nuRvmD_UP) z3F9nlTsWb$c%Nli2oT-@%kL1eG1R2PbX`1Mbc=)!BFPUfo!2fkY++sAiRzCqJt()S>^i#Qfg9bi~%X((!Y(KLQ&}=6c$2-u3Hb3 zFl7h6BFfAFB<9uqXntCb{;(p>fe3&415I_Do33=Ri*&|eH|c9#++S`z&1{Ztv9BTP zWskhw-D57gzf?m_o!pZ+qTDG+}=yw2NWoK%)C^B5j4$7{3eN z?;rw`{U)YE&aN~nZV^$JIgg)BM?tONom8P!Yq3ti75Q1qDc}8wU_A0_HNr|aw)}M> zIPb8PTEEJt7jhgC-pw1DicEis5QHXPWxIT0MY|ga6$YO9@kPNgxOI?-XW`oWiGoy) zM+XSiM!mU0#l%Y8dN%u{gsydLKv)riYg@^4m!>9YV?pbY4HlJZmgj#$nu+jci z+c&bu&;l^97`icwzF&q~dJ)TjU@>gHha>pk9^+r%IR~uD{YU5iDKY+WbVE(8_QKN) zAUDIPe}vrVb6M;p&EF|D=ts13K^0C+v< zWZn%}W}usRj&2YgLt)i7vK6Lo>Mkkk53XyQ(!5S+<~0&y6=_I-ZYUKrai6Z4{OOnd zf46_P;JQJ+`GddvzPogh-oMhryM82Y4Bo`r*_R6FRFN<{r`&64%6O2xaECH7#$7E2 z1&>ia$Wc}ZN6m9p&_68k`pObNum?NTJbx&?rdex7x%W{GcTY{Y-uh6D(iP_DdT}O; zt|~4zSP(!0vS)xhU@4@v0Dz?5O;0RjJ~v-C7^Iny>Fqd@5`^)}g0X(AM-@rJ_utVS zWE(15DVYL|aUj)X@bz7dIa&*Be?kM9ir8TwWE%wFi$r+K^@hf;$J!+acz0x`IYIGK z%A6(bDGnl2)LT$DjJfckFh`3^QtKoQoEXs{b29UCP$rvUJEc~~UH<6XnQSN+;jFSf zg5~RhaxJ#tSvfkY%APh-%J5~al`YKaM010eHrN1JB#5q5&6fduwFHBX@Oa@|DdA9>eb!!R}{K+4v-gLIcwtF^iUY9 zl*T1^Xs}wWUh59n=tla1YpTDm{>5_ zqeFG0tFpQe(N}gDmaCA%n+(f0zrzNNBj$RXyMH@xG9tb_uyj-o@BVGLVti$b;G`Rd zwHTM|CW5}DD(D~G_mWbLrJKq!OiMf!pP`KUtt30C?}n&S<^0DF{yM*IZD`tK!o@4& zNOlV64J#dVWA97Y8GL$5j4h@qSy;*U&pRjl3=>v8POs&&28uwslEjaq>~kc9fy!GX zR03QXPZHd3u_hH_+Bo!&N7V4ZZ^t+SZz3#vW~qS#G-;B6#$6njGw_VOo!b@d78yF= zV9EVmUPwaywSxD@fo7{N*R(B7M3_QF_8)T`#&3ZY+nb z-~H$-_b~woVZTiqPdFII0Qz%m&QD3DD`~X|ontKgAe!y;oAkd^#Dh#6t>mekLxVt7 z*3}x?x`}6S(jJ(fMWCTmVT1;^#gd!xUeF{>T(_IEc7$`>gzwCkMtur3Ux;u+L}!Gv zs9~knwnFR#>EOTJj}VZbvz@8Vx;c}8p8;)A=A5k`+yno&sl*>H!*2`#pZV8w<)M`& zfn$2pw*4~gA@5l5+kG2j#>y%XJ;ftg&i9;UZFTb?y4&C{NQiDJ!_qz^&f!+$1=0$ATBxn4A?ND$54`X>M=l0c^9cLBYO-s%0cm`HRxI*tJd&Af*6D-w$tp_)U${oI zZSQW6uJpNUdpJ~?68Zv~hA z8ZJpRtY;kL_UMjUm3-TmLiHF1aa0XY=`R1ath#Rb#>#T@>Ena#n~(Q}tw05FeAi2H ziA~`4sNtuwtEz5vHEX)57Z0R6h2YCb#(O2hGf9($+&-SQKorLeGHxqy(_a3{YxSyX z5#|%=^4A6R!-?i+3umu&%|eg;o4{#1JlGIaC@}^o;zvmBH|VtDr{{!Q_h(*z+C49K z1M5d!RNCq>Z(&%rfj-_%7s4bS?6ex{V2BJj?>huLFEN0B8HcU64RXzJIFe-x1Mv94 z^Bdd6@d^PNgs$uQgr=I~Zzk~myuIz2(X5JwkiKkoQOUax4=6m}?!Py4EA=Ul09eWG zyVlCVADgkg#xe7+Qa+w|9Q0DZT!d`k-ND)ZHs*Z8lJ@S63cqYiN&{WZ{Z)tLaD(z~ zo7Qyg_l7Y{l@V9y8V}tW{_5-@Qhc+!)-lWAtXQ?5VLlJf&GeNXysG0D?t8=h_LHmU zPCico{;M7r3os1oQdIq+eiw~5)PYN9(eK$8VcK?DD@|N(JUdjeQ~D&~wx`(<-f!IF z3@3Ovc`s>g=3d4zHJeY6?`HF_(P*`_ee{AsgXo3{>)+1n_cse!DSeqzJ@Yq@sXLTi zK2*?kbGkFMik>+sn0LZ3nAf#%#N${{miMC)*MI8I@7kbDz~Dv0&L&OwZSa*_@FLXUt9m*Umv59j_@H(u^4&kXr@rzZ z?0d!joVca76LZbsW{TIcK$DFPUGi8eGS5xLS#4ptXp9`)P~vvXRZq99sisfiWYQ04 ziRk=bpWNx%TOso2&Mx2Ty}_hORfbN8kB&b6~@Y#Zr`kqU#A@_4CQ_QPlhO7Q;$y34+s)FIUH<_AWjvP6(vZ` zSRu$=%WEcOf;{YbK>-+r?nob138`PbthadM=eZUpK<$=e8XUGYLc~n-5!iI$LeInl0KA;`(uj|3!O`vrpvxx*BNt@oRiE&T)i zLoX3l4=N(+F`euT-;@V6%0;K08yJS>50*p3Jc@n)yQ+3+RsEHQZq3|{(`T16#4yeZ z8U^OmOdw1>5Rjx|c#}*}QL33q+yTTY#M;6Bq(ra|C2&*zy9J&u;Mr{z z#RB|kqStsgxM-AGra%8u&U62Zs}FBJyEv62_B=7Q`|7i#A~gW1-bA!UwXAUr+Ki0% znrTF)m=fDiXZOvW4mjsdf9R$iH85 z1Cb79w-p4gdU$4FRPSKL0y9a7Rh* zMFJI^%0(-LQWd5r=qAR5{KFprN4c5*nLTdL6InW?z{@N&{aaL!n0yLm@m=f$ZdlTp z#yi=u*&*KT)}vq$kYU*sEtK3+hu;3$)Ah=={E4Zu#K0CDAB50^-6_^NsVtr0C3n=j z&qa4=5Q-BdmSb{z5jnyjb;a*gr9!ZXjjRKrwn#LY+k;xZ)@RT)RB&ONA@6on#?W9s z=XB>O>D*9$v%Pk)(8kv${bqrPE5~65yUJ!fT(4x+k~Dm$7x*)lYQLIQmxEC02K6E21i1*g$>fDDkq&VMj`h zs?qfb4I`%%|1g(N6BSMj^%c`9-}h-t4i#u44PY#cW?g3U)#^Pf{rQQa^kJ#d0Bn$= z&O*3BT~f|b$1`3bm6fcn&MHz92I@#9V0%X%$9Ejh`o4MEmq(kf551t45ck?wYy*-i z$ppj?_VG9TF3=7Ii;KZ3DTio+J*2i~t)c%8PqDM(@e(PpzyFzU0C`7KmzLxzCZLnH zl@vbRa`u_m@3nO@MGTQY5emB*%ERB&4!&yAFOSX;zA=P{==_#SUvEUjh5{$ZqQL~V z#6p`De7z`NiHdJy&5I0smj}FLlqjKOsh~q`nf`;*XFXy<6|b(Q1uh!P$xJo*f9$Mc zd*`NJ@ETw`cm^mkxNg}hwCN|tZ9Njb52wTzOLr0dw8`o1yeP5Yx!$L>^t;J^-_hRj zA&M;tu7{?I@^?l9>VGQ=%mAcC5Kns*BKrgae$QNuER5xqp@tu}#b5mPWT4aFS698R zZ>*S0l$m~EKo?%_6J2{g)DG3qtBTY6?ij>DWx=3_#b-n>Y%=_r+jhkvMVT+3D9>Hp zvVBIH&M?OVKzGheE0|+whpU*s&JpafOv3q8Eea453RLtcoK92&Ktxzz*l%x7Gt*fC zetZX}3119BVkNxo0e2BUTvov!f#4{8k|LlYagZhYhifg=LgC{al++gpwxnD-Mr~Gz zZ5z5AcDQ#+D5VR$x;q^&bdfCsiUNS6qzN@LXR#8=^mMJrUjG)|E~3Hj_4Spvv@ufS zr&ev2Q<<-$pX4c&f2t2o`Fl1OI7m^jcSQ5n+22LA5V3*M+%yy6L3DAij1H|AquZ;` zmidd7g%ElD?7k8h2!!R^BLefeh!rXTzF3WC!pB}cZte&ANAeLcTOry)O&h>)?VQX3 z^k1N4)c~-OEptcri6}s9hbEkPRvpQObpXbHXaalB)cCR_C_z^{*?eUYDvB(@J)rEC zwE`#r><<*Trl`-0?f3%3^TXAo_4c^8rB1MGy>5Y>^51XVe%>F1+97s1gMZl08Y+H+ z8=e+(c2yyNM=w#+Ln1%{Men>cHGXJIUumeL&wzgh%jdqdRROm>$d%d*@O5jeliY|x zib(1Qh}*Ux^Ii4yY2vsV7Eh-}UFR-J5=$XOQf$AVRRExQX50u9EXx!-#$1RPsLs@S zk}C{RB*@A$xAuTy&1dx47!R2?MKVON~!?H)Fw((VA;? z&G&D>R&$CL--W33nZ=L_W99Yq1{7>gL4W2mC-b5}04jD<>pw0R(x(#i)YC#aFOyOCf=h>)3My3eXuW2Vv*r3Ns~FfOPKiAXABkMR?Z&Eq;hK zuLDm2#DxREm>TK58U7Nip!E{ElP#IV+^^luTDd?fTY?G{$Yx4!^-9p0z*T^(w1b>4 z!S>GCXKwRqR|CL&11Oy{^R{=??Uiu@;*x(C)R(yMG3|iJ#j)k4T$b{2CQy5edtJ|6@w1^dKA}Bz=32|e&okRs;px|W|JeMG} zJ|ia2f)CTgK}2N}YPZsnXCuc+_B6@PcQ{i)>_iRHHyhLK{%>EYWW@+&FEG8Hz>K zVg%Q*@<*cfcA|uKfO1|m31rbkcmNon4yUjsi~;*E8PfeT7TFlo1V9-xS|G?h(N=?8 zq=4V#Kmh-V9F}?}_|=*Wl(MEtC;dX(21v)&$l2D&h1AG(c*utk<*xxFUUc!vY&=QdM`4ekA~qEII19(mERf!C(yn617S2c`9N9 zv!qhoZ9XdDNKvqk-?iqL z#YXJ0CiLAEf-taGH6N-xCUL!%ZZ#UAGvXn{Gn=H~#W|b4-{|=o6vm6Lo)GcKL9v&Q zq1S~zRYb*1Lmq?PANCXv7LIT2A zaY^6&*V=&|6h1{l{J_L@QLgVi6C*=8r4G0tfuZ&`9gX`Vy*?uXqB?dH`Es?6Xt04u zB3c%RaFm$fymkhvqnfygO`tfAqP}4WU%cybh6dT_L~ad=tj{2lU%}c+n2c=&n+`tElE_ppaw zien*mCo-vGyr$)!OUCjDrPw|8aCWI`p?lggf%iivGAKd4+sWrlSJhi@()D9+cZf1- z*oZ|&#yVajyogD!nhfu;5V!!K;rs3DTxnV0;qMqF zBEY|ULx6kFNNy%x0}BZ{u7nCV-NnKOxvq5uE45Tix$a+d=Nwm?VEZB(T^X3-;(k+y-Lo{*SdW|FQ(xO|^{zPg2hVTagZ|i9~Mg?!C zXjkC1GJU}+cOIk7yF@pL^Ud*+HnWBi4AI|IsrN~hk1C}82B5r*J{1Ok;%ui4Y}eY( z-{Jj=wAps5)+NfoL5i1^6jx_R+!@p-8ahfzagVJi?sHuafW-r1c>x`EbfA*YpN<1U z+1#y!JN74A?Y%iU9YS~P4?elxlq;w&vP-1gySv!d^e;Y7^yL|$)JZ|DW6r;7;N&u8 zY_y6}G}Bi+Soym%s(EE~#2KYoOJ6JkK=!3mw=`;GLIcdbl~6kY(jzpwx6+CF0P#2O zDpeJ$N$hJhj`8q`Ge+^c|uKXGVUD_zuBQ6nrwkn;HQ2wr{h=MF|&_Du0zzU>FK$mhgJ^3((kcI4S+J<~AqmRL zm;xoNYsDjW(MrT|UX8dlNg`^WyG@+9bZI>Csdz3*LJ2#rSMz~qH1ok|1|4x|vT_%F z{i#INp>Z3ISO{ky8YKHFKz`-1_MV*^wB+s3w6rP?|H)TIhs^@}w11nD_fkT_{|#JP zXxk==OR}H@nOJNY!kLOFr1i)VE*KvC*A&GEr(ADq%QZZ7XFcrBVz{98Wzm5R%vZq| zDb7wllcK%rgT8VGtC-^I*8h0KuYg{uJ#2U-Nj(10B%)R#iuCbxtwiV^y3OxP0+9Rm82sJ)dqjQmy6VQ$0UnKQSG%^hfB(}a0<pHOp)AYGV?QXp|U#boM+x3`KTK!0nuxFq_4N0xgAlJA2UNpepI{` zpuqtuu3vt)2K;2lVcXERg$}MS_z!;ETk{4f&eA^bUIM9o6!6kRd;)+}6lOfbM)XLJ z{(C)|IQ4os(A0AoL8AUwD`QKOaelrCR2qIxKmPCq z^(<<>01v-JE=>0|in%DebBZ!YrKbo;OXe?Oh_f%U6?E+*wxR?2OVoYJav#MkW(q-5 zqqdnWMrLi=r0_0_fja^Aeoa?>9cz7@7kXu1l_jMe#J=Wm&Fee5ue>{VH#|OBwmXCu z(waAZhS_;~WzQA8wd%b|yGMBYmp>fS#M(3KR!VVuI)Zg-kz73TD<#g zcX#LC-Fn-1Dpxb_k7$C;8pPe4w3YJ@@mLZ(G2K#ogEGc9{Ap=gu|3DdA~?AJe}>L8 z9_l}U<8HXY;q0@|9vNq3C7ivplZvzVNXX{SIwQ`W*_&i1MfM6I6_V^wilY35`+IUv ze^2iB`u<*@@8|vgyzz5cV!UNz5SqiJ@~3|&T@bp6L4p|759#<=F${>uK^Oe}IKunm zO*JY`j426AD=LsdKGze-q`wZ|R@dBDoCT6mJEg|dTIeygpm8&p#M4CuSIHL$aH{NN zMC`n}*9HHy+JI3lZP3CAgBxZa-9D|hXcRjw|BClFogZ22ovYz;QXU-J?)+<4tzae7 zr8?Jc-#p@uMyzr8)^03aO~vHsjQT?N^T)E=5i0 z)42CjH;#7sCgS}rf6rX^Jh0_6r>FFCNTTW|;_pYjFQ?$iKD8nr0CWX-hmF?%ASI2q zXajw$Q|J>=B8zC9{P0WjUk>OVRr`g7SywXVfX^VcB2iqycrBN-~GtV0GTBl0({-SVsUYV|X@SwpX{0uN1_zpB}L8p2eVKHN-Pjj3`kdUzOQaO@iOhSk0 z%_H=H`oJ;aUIV^a;V3O=_il+{!_2iGk>GrdJaNh z;yxTN8_fkOn_dTDe3zgpFzPyIymr<`^92g^bt2FbTGiGuq4($t6qLY4I#2qdu!eRc%QVObav z{`q0xmK-RSoA3timJKmIC2$s?#lYruAU3`%v|7x7S|0`I+9Ge{Bp6ToL?7wIv>9jt z8;~4&V~m*$79P|LPJT~IPqqws^;hKl*t??mpvf)#@6uoKO!mH%x2m=Q z>Bmz}o!f_rk`OsX*YSo-db3%XTwZ2Kl&48(6x1YgRsHJ!mZTAlP@j2Hd8# zzWa-n(sY9ctQWh9F=cf$_kD>aAlf=%-dR zGNFht0xnLOQ-dKEHA1VeOM04{h8jK9-J|vH!Mnfjr?i7B2p&zl4=1wg4Sfk;l%|U) zrW1UdKPq?GkU2Cj?LzOt_?P>dtn!EY8*6|se+QjrJ;Y@?zq&tLXU z8jBbJLiLc2F7BkyKs}ZWwN{VSl%pc%&VrKAY3kL)JV`F#ooq|VHB1j81-P7 zxEO>~fEdiXjxlJe9`O7-)K#$IlR>_nYmub?qh=97%^Lgc#+T3qSqyvjuf34vg=YD8 zJM`lP9a5D&ro-<^f@!sSE@DpqktANqurycw!+woIwt3h4IzKHE^9e<+2T}}qN>jl4 z4ilt`4+p;+G*8=`Cdkidx!qtCnzaBJY}aImr`P;*waTH^#>aG>lkO<+ zI{aE)zgquttYAwDP)KoDFxd>DsJG7JfBKlldlt-RR6*m921XZ^QRq+I`)YhTMtO`$ zb&yl+=bcY5oFum{7wxhOor#R8U6q;X-_9xX#V-A^6qhA{7leEq|NM=(GmASO;)y;^ z>Uc`?xBCs3d;R^VVYcD$P9w@Y6!+l1&+s{qI>Lo$1Co-bHp&LuwY8Blyuqz+D7enG ze@ShzNRzQjsHUsrM^AUKGlSN53Qx7~Beo;`)AG26^+epGL8KWCPQDR_u6YD1^>8i!+iLMSFt=q{()h@Q3ys3 zDR`=ZZ*|T83rfJjjG1A}6mThut6!Kq8XQak*FOZA;b0Xw7^Wqhgr<541u5Ia>AKrt zTPTCqAd_e+4K$T48k}%QM>?dtzZQ2BM@c#a;V9tGa8L~##Ns+K@14|5uyXB?yBZEG z;1)pkw|6|DyJiZCJPe@uaD_m_7j(g;YY*{t&{%&!rfKAw?!!$t>oyj?OHetp#0Jjr+m0_!2xB5^s)US$j5)k~79!trwO0cTL{dHSw_IkXoV>D0Az`3$ z%4fo0jYG;SkMU$bnb>{kLwcAs3)WDG0$WE>y`#lf(IqeN{41l&g2fzvq*nHbxj7MC(Vdms zo%LHGdR|?$U0u8#$<>a5D|co$%_Fias0qk>WK52g67}UQ9i0d{<^G;*y}vful&X4` z=fKV9pDA7L25rb!ae8ULnq%IrgzGtc;@txL>qzynSxD$_x~Ucz)hr!<^+VT=X*?cMt&^LGO7YHLydR(_3vjmCIp;fR`Y z2=XuLR!cF1{5St|mqW!ltKF#HaUzp5b74|Hro(6mHghpCH(s9&2RN+B5c6Kd3dbgwX4v1>J=X16gfWKR#H)admr#uzs5 zBpp95f!IWAveo?-&NlE!g1EyoX5obx>iL$sCzw*wWF3o{d`3)tB?%71*XJFIZ1o2p zx0Y3giFT~>d_zCFJaqcidUF8-_e7K7xrZFr=o`y1jqU98uX!2BWsTe&jncf0vg`5z zSXQkV=$kV9I+|7)={nRwh_a?G8>2EFfpj7vmZVsdJZf*Gl{FHqtXI(J29ex#tw2IH zU}-V_Zl7TA+x;Mm#Yzn%C8K>md_!6Be&J0x?BBcLMs965U&X z;tIuGn5bL~%m)K|g{BOnfWD@HhT*8$Z&-X52&4i*ef(=^M=@#nbj{;D|6=I+Fxh+h zNP==*Zazb{dCB?nlHRt``B~~${>WEl*(x0H53|$-Xn5#Qsn$QbjQ-L*5`2}!Q$^Kj z_RsVLXO_4IzB&ZeTgV!=MV)uQb>64$x_6gRGp19O0<74=58?%o%lN&n@kh0GMdPn7 z+%+B;A{TQsLT)fJ;y{`$dHMZ$_3C!agS68%L$q@;E^~zJnvYVhvt` zK|VxR-+;k70MwvR5JeR544L-}w!co1<`P$C{-&SiyWHXq-KR{TxH?k0AIPGDL^TbtzS2-Yg4oXK#MK8x zTNrpEK&rR_R+RxBPI`Akq+?1aIi^dU)Jev5fv`iWFj5WrRztGOiw2G|m_Ni&;C6sHfMRWJB&Q};P!Q-{%}Hf66B?laX@#(_g~el9@Hwj44l-^ z2{dQ*JCCqgkJX}Hodu7rMuw#qPqzKrLYKMkDIqVBx8yipf1S2m>d%7j(Z#bld6>E()+Xf|2|CK+qh3 zd^jcb0Hoj#M9l)kG1KA$KvfcuD+VCkKP5#EQZOBqqX#LL0i|aFqO)N0veMkyVLpAZ z)*95JSmP0rYNMvMkyB1U4pM#HA3^SaJ2pF2!V2reK+Tdx_d6dDbLU3TP`?@K)#GihllX>h%a zjkZoyuz`pefQSmCFa>xWOZ$ZcS2g`0SUi~R@ARdg%ETWio0W;iu z-x;KlAc0pIab7ehQxx=NO)pzu3>3ie{k(fBv++9NWVG80b;_DDnjfBFM(q#K6kawi zS4R}pnAtKD8i->CW3L2r7%F8jrZCnT(q#>DEhb4Cskh3c$^Am= zB;ZalL&_!O%dGH949yRUJ)v|_=`x`B;k3Ie;VUib_6934oZ=SReJ3c4o_?-k!}7@! zV>PhW&?R*i1*PR7-Hm=&JVx20)7o&0{9XTxvSixvyR;{ImvnW>bgvJt`YALENE$+O z$IaH#*@5VSGFV_gSTtt(KQ4Mziea$B-yr+xoqN;qcGJm{)AHY^RQvzFJs(K4-;Fo< zi&TAh|;(`qLAWfGd*;fh)K()`)4Zls~@@)F+k5l&q)U! zIHakVq4`2OV*Gj3*+ujD5b-8r7mWY)tWw2P>0B!|M-mfE!z5z7l9N9lP~#g{I3WQN;2Fz-*jD*NH2JqLhs~2CA4}z{Vz}I zix!DjJ5AtDrgLxfyYUBdOY_@?`O+>7fjTto!=AE1KUV7f>|aD*(gxx1PJAgGTp|bj z-A_v^XcYvmtZidoUi&PZ-&b~!-hiVAJ~;gQdceWPB^J_r@knDp4MrBgpvToUuy6)% z7|aYg`WlT7@86{#)*BeqA)Mb(IkiuZ#<0kis2sJdk43YAR5=4=Qt9bK=sT|W1nx!G zG5=~iNx$y(@u>r2#FOPfpLt6A=eehb^Hss#{B{?&n?DN}E8neXSw-c_`X^smzt-rJ(+u>BXRpff!miTiR*v)9*&m2@Z(mE&WqwC>CJ zT4Z!~SFeJ@@sO7hu>B%FY46ol=dwZ>y~ze>q~D4=*d0ovM4)kHvC(=FyOIQfe)V$Z z+XA8l0!{!1V)F<*;zjvoOY3F^I`>03E?e<0Y!X&t4Y3EkBFmJR- zBriMThhi_y9MIm>=7ti9HjBZ$%!(@?)E+XLr<5`F9hlya?R%1|6*lp0&2F!zDA?Xp zsW|s@)Gc>CUWGdchjEOU{9|6^r~NWzVzXef?VseqHB#W=KrMH+?FmZYSXq^+FWpf7 zj%nJ*Jz(wxN}a#U zGSL#mU!Rr!UZ}S;s`>l%_6orgnIxSPi=$`{IFfV~Os2AQvAW z8paW;d^Yg4?`X$CG>igr=q$j9{`v~Q<2>sC^v>d%*?)B7fZ6*IgFtc7J!a`dZ$nCj z*|P3oLFVWB29(nNpGx%VNXpfwCf6+2ivvG$w+v|ARt~iQzjPgV#n$An*lnX!*ZSD+ zbWk0#luecz$J2N=@zZZwz-Yzea(pO`f@Bxqn#K9AFPKeJ?ru4F0utE`iTBgGgjvruL0g5by zP(cE%GB}E35Uc%E3f%*Jo!QT5Pj?ew+)}MV zLw0G^+>Pb@21wT0)h7itC30#wIF1yLCr2SHZ;m+J*M9%dEIwP4`@|IYcKo3P8a0Gs0>WMn4Zw^2VFuzeUJ`;sY7Bt#cHS*WL>ZXpY}2g3#>ntMu}ipTn zn7o%ld!t&D4ddC z*8O|dT&-_68dDi~k~8N% zL98q0Hr%x|d)aHG_3Dtoss~-8D$om|%IinYXk!U^cSG(JUkQd0o^?o%OBt0E64(MSdtMy?;n~F$AgT+v7xgJfM zS=VQ0gi{0E6z>pwLk66#)g z!k=@eV<6&Xcx|#KDDJW!x@PPi;)PpfU+b?taRyNPufch{3z{EA`p5k&xMMWl-}2TQ zPgLjJ02e5ZP*>oCHMKTIE_M6ap6sT-313bA@TeDF;rHnG-7jQ5-Tx;4n+D{M-P@5( zSDL&g$q-$NSYt>G>AOD@5LzVgwdqypm`j`Q*>{y4n!gmt1&wcUMgD2Q@*xZOBzb!^ z042jmMXWPz*0b>YyoV*QB`M!OiA|h)3`wC{?zF#+D>?ZBzVag%!7pR>v?UE&|22B`B z7dUeN8)0bjGibWKc1q6epQcLhpRYVzKR(n()%N~8X!cV1Hz-WLze)`}l(~(YX%kj6 zBG_{;e&gor84WsbwfI;6++Luo7DkO)J$ho;>v`j4(zsIAH6rNVjnQx2xs6>dDM@N6 z{Zo~y*_$y`Td(HJZ_Kp!@4Qo!n!G_zl4Z8Z6P2x0Hj{D6XruMWI?#vJ{UeUcSWp0ebL`Hyt0#+x=*hU^hv1UCrxv0-*Alf zH&j!;sgT^&0djO~F+{0zC?jl0x|k>>hmVF0$yvhKL^KJenu@7JMN1fiNcKZU1(j?~ zc}`8a)FjqA0Nr{1D@_31Vy-~8u)&A49MTzVA zYK?_8je2M6CuqF&MF+9A05koh(DUB7M%s)iB+N@ToUDA z>%;iF<8cb4s_2l|iO_rl-q^h1qGa?aKlwC~p8^<<&yp=jGjJd%6UAg~VftcMn!9+r zT}snB5SoZLq8E?SK+p779Me^|N^PL!`2B@p%8Q^(@2IKL_UBX8YtakwX9 zEN%h(3uTUoQg$VOdCioi_+tdXOd>$C8|%U=D^h6XQ|&bQkPiBL|GEl z7f9n%nISszWKICxEZ|vxXX;k@`B5USJ01t4QthX(KTI4snlKtqr@e}+d5MJ;AYl=x zA1>Z)H!&Q2jRyuH2NqC;f+EM8?jFXM>46uqlPx%rQs*nF8}uA`>ufki>&lO&Zlwz2 zRHb-Z21~fP$kuGeZW{#sHy+173n1#h)p6i4fF-!i68%CTzPnIfjZr4_2cy&XL<+)P zSaR?#G?BO&4neB#H@(v+s4Gxd8z5q+0<$GDWmy?d5q5;>7b=I_m)Eyf33z zjD}f9_8_@jJ}{kH+M@{F^DX7s05PK8%tBh&@pRl2K2FQ{aU@Jq@LkxjPA+-c{MU)` z{M2aB@Kj(iEc0Mq{QA_ji=`N?r7^9gg8n;?r@s_je^+*3pH%mS)V-L9#Koi62pAmE zbm6fJHNXxBzPzGfY(?W??27UjtB$ibzU69#GN-o*I810d ztJdF33s?LU4$lbAU=;juk5#m^HPXs7<_UZp9JxEkgmRQQgj$m^D>!0?8-#@!iv|9bom{oO@>9F>_x8rkE_eG} zd}@ozJpk1A$`a39v8 zPr{uf;0`HG*CbL}Z{3N!g+D1*2$|vCEeX&QO-^IxBj-YmdWxcv?1lHn6-i6N0@{nHKweC-i)DY0BkOlU-8( zQWD1NY4Fsy3;RdkJ!eAKpe4laTv+!9xFJh+EGM8w}Y9n{Wqfp%J?@it_H|Tw0@^=@~gSsINSxy&}>wwl5)m@4}qbDN* ztDs0+ftjG4;vTnwI>eil7>TyBZFM`kS`;Mne$es<`sG7qVklCN*5zLS5>@Bof(RXD z%E{Y!wh*0#Eep`h7<-+c7W19UsCUB5cjP;DA21m=LdF`qJg4ORy{drmf&Lb0cj7I_ z%AU?!?ieE;ZF7a-J9CLu&Hk%Rcn5BrLze{+Yy$S39@o+(Uo5KjdWl+DYUMmo6M(bR zF%20lt1BS{^#~k8g!e;vpK5HOwvMvFgm;8b+v9IEaJ2+KWJgC3`Wi-&^%`q!DvEANRPk0#EKtVpVO zEm(2@EIm9v#z-&mrhioxQe5!)?dy_MeOHwRWuP1q7{3eP?++T!*C}B>ias4`zf6P+ zB}LxTox3+yXY$ASnWy;Uea|Z3IOfmQOY~FQpXx8$J+}uxt>*21+B>kga^(^4-zGBh zSgH#CWmEY3kTogj)StL6k`GT;ElKP(@n?TB^=tTEyv~#D!*E z{YY+HN!X@%M(0xKHh9}15I3ORQSD&Ry z3o-2m8|a-~9Afnh07^E+TDffRXsnom1A-@Dx&`rCXlnz^NkAP4-p#5sD;z_H>P*ho z_2aaTJKvZQ1@s7n{_uEpAhG4-o?EK7FpNJx*fLnx<<_5A6+IVSduKP@EcXcCM3_6B zE|mN)S{-yx7w04Txkau?@*nmz&--tOxK3~o(7js8?zb%@8O zs~K=n1=qcMo0mq57(b;B-gvC98lZlXqE{&u`<=QjE-=b{ScmkZ(x&4teiw7phMHto*F>5r4GI~LfQ%6p zX4C@w4l}3|4oX#{{Sr=>KmNSi7rnX~C$-QPOP7;$&IKHhxHS5GOG<}w6AZ~-V@wSm z=j0pU{Z4xKM&j+c1+5PI^)Vpz+vC_NiQepomQ+_KLcMRL&S`zdr9zQL0yFr zIkF4nZSo?R1DmO;y{DF8ouf%xey69dwkIPOOs87xuZbwF*mr;$abAr}^$E0*=xR&W zG=n7vwV*QJz}vJ+w=XRcY01O00InbemQU&JiU$0a==*XmLFu!rEt_n`IRLGXjI)jswDaKh1>%^ zz5fy#rcLkXFuN%{>tgdTzhJ8?@uoO%D=`d>cPoow5fdr(7N2A0C@_v}e?LHevTga+ z)Z@(ZBe?ev=w&Y}_@~B7sfWqub~}w2GjG*wa0P8?4Ax*>nkjZwVfdgzM^*+qOD__% zGEgtwy$DF7{k(`BmR{_)N1*hgm?51E9Gahn5zqJ4V(n*+;Nsv*IyQW%KQN^RYVyp2 z=4sejI@g!AfQc|a6H|n^=_+#L1>?lOQNz&jzlQB5On=RD)0-8j83X$V>!;s;{%gqe zetBoF^MgdmO5J|1S&?7x$<28$Nn<$+jlVCBEiCxycU{bW>(^aG7N+mJ*@b>ktGM-4 zA{xlK=2syU$1ma%2A-OxneCwG^e5_ZcqAug2M`z~D51kI@eqj+;BW!ilc1Gpepsw= zWBI=t*Ph>x{}xtaCm)-{-r7Uy+6^l4t*a+^SKzSu^U~Zpq!49qv_&x#yKzDi(MTEb<|7>j1f5R36PK*%ZTEuA0nsKPetOLoh7l#fW-0u=(x)%{w` zZJCkI#;3&X8s&~T(R-E)7dmV?Rcyu{x`sfGOthMHk4)}UXG@D3$eXhZ&B&N}1C+uY zW~DCr{D;Samccqk06u_(Lji%R>d};&hHT-yrNyb<2v{&*5KbN~wh-}S$<_G$Otv?5 zS=?`8Qe`B)c=vpR&RW0j{o*az-atX6b^TnsW7Vac>jARHCmc-LM|-tzS{UHR=X|ASd2gzYGOtw!R+npe%4IhD!F#qQm0o8W z+V%zJFB{$}Mn$Z~pYFHj!P-)BJsn z?tdSdRqKzTjTxSIB+umV!GWoX27*#96WLfL!KN5Tmm5<11tPCx=M!O;Iy65q$EThhO zgKmO+UZbeJu7cB>#)_PhV*y)^(p;0fgI1mG-}m3i-!PnQz5>E8ylq^SuiGtmRLFPk zy1ZZ$v-r^QOz=G;Cx~M)a(S*T^CVkcp^{lH4%f5%`6}*LZ{p?Df-P=cGyKHPESnH7 zSN(+1`l-Q8@ULf{W-)FC@WF)Oje5^&{I-sM!*a+>PH)kH=iQ$Zc5kV~JWPyRd>?wO zHgliW9yiq)UjMYbDv9b~S*;LN80vuExZNFlf_P+zU_QOnthAAnPPrRlDprOqGKw@{ z;QlU`{42PIKS*NUKV=!@mTlT}J)00daWA7r{`Dl2hca2e=X&>KUKENyC>Lgfpz1% zTh|LZk53WFj}MaPn6A`1h1I1ls`o_X5y76{?l;E3nGJ2)SSOk;_M>lbZOg2FtpD0^ z%r+FZ&B6FW?*2*L{jYcDiJ2jN9G&%dU)SBSNff(v&5p|ZdgHp>Yqn0V%Xa7A2D-e6 zm-6>)CRtk4Ns`Ea`S_@0=3fd4(IEip8M|awSX+FJ`?{zB>4CJzxon>6LTY=jr{qc8 zo1~ibD$@@}*>6K|#<4-B4fm;RvtKOp#K}`x@n7@%>P$9-kn=uF^s_|R28nNJ zdl3GL)yZ*0^iOm?^IQtsOR`m5=BrH(?980Xs#MuN|54DI*S63Y3P9lesaVR4Eu{iK zrLC_{GQYwk6n~_r{%ALe>iW#&#vi$B`JcV(?Z&zK&i4yn&!4%5U;Io_IO$_&3GigN zr&jyXdMpp1XseyF^(>0M3$(hS`MZ9YHpIwJ~x?H})oB!)WiXS5=C;S%SRW@+EX$=@x0){@&?S|GfOdao~<8 z$mxw#d_hp#RSQ^sIj@g;pZ1({gFdVMiJklLQrpc>YQ@-3#RF{TD{l+17J&n-C@u^C zfws9-3uiQTs`%T*(18^WcxC|&EBk(8HlJfN6FSfqiY?VHV_Pg{i@=s%fX=s*&elHX zOWY&BD7qZ@-mxR_u>US7TE)w z=dpVa@Ej3%j&se@Ih=*oni`Q8r5w)@QN-atKn7k8v3O(I#Bpp_*kL};d3;g-!I!*) z%ve#>+!m`vQ#M7e4Q#Zai`Vg%L8D*gztImdbcNu%dI-+oZbHAKr-_F7(%_a)zpH+%-zUX`&G4zSJRz{%?t z+2wmD1*n8|RN6Y*<%U$x0Gk*;yW|L4H-6*E06TJ+OLAmpf=7Jsa}nj;wxoM92W)0O zMSPOl{F9?f3>E<8jZ&YIV)r8HD6Bvf9-*;$bAAnzyKYXg2_AKj_vJsFHZQf|q8Iw| z?8W>mpU)DVPnNKYPbrsH@r?eRnIe}%}jCt&?o>I<0XhB0t5F>v!;t}!Vo_bqWY zQQkDyb5&~=khS|NEx#!hT8*QIB*{CYn5z-Id&b8Z!y{u1@tVsiU zru}kG53XfD+YPtgahd!|G7xo79e|kZS3B-cM_{RaJz2xVZcA1g$kYU;Z8>XD%ISDo z*zi5s*~!&$4Nb0poaPoWxs$gnl0Uy?LMVTt!~e{#;)zB>sbqtN zQrJhR!Tm#BYH$_T)>d+%$L+LQ)vL7`SFs-_ZqEr`-E9feCv55ranJx!>mME=I!-d4 zUU_GmddZMZK9Sx+(F(%0cfz*unNxdTgKw~4%h@ig={1v{Z}#k-?71RNzBS2wbq=22 zNHY8xv>t;Do8M_cz-M8!Xm526CIOh8)W6#3OTsQ}_4HnVOz(AB;16NAdaKfL?Me-;%|=Qyc2l z3b)>yxH@&Y$F{k7r-@+I2Q7#|aTQ955P~ofhz$W+#7VsAIrubqV7cq&=vqCqU!%+Z z?W3(vs*INmw*;GcBkF8_T*ik$<@H5*w|GM&oc2dAOY_`*Q-AVqWlf#j#zFg_i0f+I zu!dM5!;f$Xp||;|NdDlpm;*Hm4Nh-wOCnGre^9NCaIG6Cc@C0@^U5Ce`LQo)rBxAS zCvlrlM}B1MXlYaXT2f-|58E>;Up87lQiE89j&SR;yCH*j|GxWN559NV>xr1pzz?x4 zTR)s+!}jXIAd?M-Bo9r6QzQ1K8vhT~@l)^1kDew0>*I|%qr}#&ugP7F1^)pCg%e;`ME3MO7 z;REt1%MW|`r*G39aDu+=Q@NIgJ(Jt;Xf;2`|FaQm>vbSG@~r{*eV(w#B6DS2K4`0T zc6@f?T62)#V|681ZZ zl4Mss_&O@H9))?_(Av<@vPKY-^!s_u$^R`u8uC)+ow9#8trT&!&L|8ZpC;a$)_hO{ z6dTsCIBv6y`2I&sym$VZI3mE1Q2)N)K``aFVrc_hCY~WYAimI{uAyOLrcS1((JReE zvNj-1%x~e36KW;^;dVG*(F*;x51|vE->7HHs#15u{55bxy>m|~6!6{gYH0TV1PmaH zbpx>^2`m`Ms^fFn_QSmCU@yT(5A;hdL<6lSrqpD;=G(XyeqnBVvAq?r)Vwa^`*Z&+ zK#ld=Nulselwh%P>#}RdwM9v6{&iX@ZO)aar;;Pg*-vdtI}heh)SNr+Lp@x5KiRYg z+W))m9)eArJhu4W0SLH;^~X*{qPsHez z>)r9-79y?JU0JDOhM#V4qzBGC|4d4!UW)fS9zE^>T+OEF@XKJwH86;y`(zMV@>Jde zB%2!C?n{mpckU2BmtPWlbTA4OUjs^XYmC`prq{WB<@W5o6c|DG`I84wL~KanZwqfc z3dP0J!i`PEqVn;XKLYSOb)tsym|vB@l#f`Qj?AIQ@RUEXz;7QUN3PSgjI#sLa`E_o zhd%$j|MYap-)@$4^847;8eAj2p4=qd4_sQ7l%xPzY7JRX#L9|O9zYZ<;^f3Apfe6m&@;}e)%825+1C%x}t6zm@|U$WRQ03!LH=U{nG2_JN{(a*FXP3{ubzJ ze@YG=mx(WqR_bKw=IvKH-~Z3c9fYkKQghe5ajax{b8FOpLsWsj#Yt<9NYfp)bC?6-wo|V za%|__m$r|(Wsq^54{toT7%7#d?3Nu76(12*zsh$BJr9BCmVZ4QgcnlUU54@PQrhBr zf3+2~#b0&bukHTs8j`?aU6=BZ6*tiKL})8AolUO#>Fd!9M#h1EY~%}hO8rI&i&sC* zi5hyE8fk_jw;CFDKVNeZ-p{s>QtPXe)TAtU-fU4v2)xyfuaqO7VLlZS0yZ@sN>NsT zKra~Mda`wWvSZ~D7o~KON=B5u9E1EFFYzFt0Xdfbr<6SV5&N1H`@Y`?`$*2R4!qjn zj34EFH%0$zzfv^+ewXk0&Tfs0_~xj2F7Qa4pl0pxk71G_r^qmVL?NCv`#I24#e(#7 zl^iLm@=}CJ!Ha^xg;KnbQ4}9)bGALOSANZddf<+kCeeLPmV}^o7N%w}Ubx zi4qklka@VkvSiR+d=!~e#N({1C(27I*2{ZW zZA4Tg%yJ8eE!LRHQj}Czd;R-H;J5SDM^*4qW$8|CFA){XS5ghpVg9dr?W2ENo}QZ{ z!hD=x`glAqW`kL3M6fjgzrigv+{%`D;t8vi{=&y5D z*Rp~F`S8^a&4tHLiVUG*K4+Ho^G_t*f-Q7tP%XA(qYDdWYUYMms6&pGBBPIOr`J+f z&_5PmTeAmyA3DQXe`?<%X$}0c{Oe~o5DRCOk67G54HL)@MgQH-sNC!!>A|%cjoDnM z-OcD#D6d&HL`QyQmjUl~480SODiN&nEW2h?aW*Ix^{i|8!s?_{z z5wiQ`@m^loGyP7!4Dn2FG|qp35@qXOPFXO*$z;?z2n;7_^vu|7Vz>QyTLwq8=*PQL zcJ^B|^)5HO%IAax%p^<@4o@XNeJ^xMi{2qt>U5$u;>sRpzpSg+S@0C*>Ok_j596Cr z?lhQJ6q`JVPgK%c9V;;Yv}+qAnY!q>vke~1z;|+5y^MXUx6(byvm>7UZm&tzDrX=q za^ED3%0#BzfXd|J{FSU)${PQEZ{c^8Z0*@E+3Y^`pF{7`&VfP64S18I-HL#Yxf)L6 z&U$L&TUti~EqY|7A!?RS%NqzPa-s2i8&+Gh4_)(fJ0EO~IVB`+HK?S17}@AI7j%R_ z4XU9x3^mjlXtv2Llg>>gp(QUxK~kJ9p1XW}4sMAn+nFF>_Bi)7|J^{Wh_sqYb#=BIQ>~vF6Kf+vdZ4|0rL+<|pVUjAC+8 zb1s$~`Mc;Oqq6ar~P0aRn@$)pG=VN+Ib7LRYt| z;EsI>%#$Zw&r_)33v~8}eFx25$Uu~YZ<=rn6WqK3nCR?7E;is@fBP70`io9)12)Wo z7fg%+-WyVGHpk4$hrSg#qFf1i2Z%WgG5)(H0*C039pQY zM?C4P3+=t091w0DV3HInDkmsCgx?0a?D%d<+0Ayyk(jVzu!+sls`50YvWGVsxUwQ> zYw!{{-WoL~H4VdQrFOPr%~Mc&{eya!KT@eQzY5CO>dbOwLp*ztkt6|v;Gt2o--p-x zwJ+J)w}PT+Gwfc5GUvKTirM_IkOzD;cyS>bggsPa838b0(N8n5XY+(^7rZnuFvNAI z{B)tB*zX2^?7y#CUUNs7G1$(1>|q7diXEH{%mo{nV%)6z|#6&*Feiy*mq>`Hw! zI_U})d_#28R1&m7wz?&SM2-4)$h!%4@VjQ#3^j4NPQ-KzGwxw^rM9EUj%Mp(DgKE9 zuW34eHJ#f7RemJGrS+A&U{aOV zV5etP#PNoFA-|~s(a%_vB3C=mu+8JCA2&nvn1ITWpGH_Kx8w1d!sm8P|NfedL>R2d zFOUrWwN!U)W~2D>XAmc|E;J|jc=1aw{t0t5Sir%|*rkr#F7ZP9&KsoKO>JV9^x73qV19!VZG0*W9b*42CN=NW_h|sV%3m88a54O zE;5G&B{@QWFn4ok zWs4ynp~hub$S-7EoWN_f)Z!TByF#=u?`fxWaiZ*T>Z-679k+b0nR<`5$d;EG;zfIj ztfp$aGx{17@?8@m_*wGl@C(Lq0arRGU!~wJrz2ph{K%kRJ^yy7fHtR_Dr$y;uy?W{nW&;+5`G3wY1jd7U^1j+qNN(@tx+- zz=0GmA9L=;nU;t{uDk4`RzC-j5|M)M{Ah!klh}(k5FU$0PHD@b9L(Kz9zoyoXIMiv z2k;tm$SKfM`xEcgR~FGIw}Tt+bAJ?y^|g3i$DfC_=}Py-XFpy6?H)%hitgX*VqU_Y zB`^a55B27~AFPV%{8yuBMJBB<^HnJ?oL+IY-zjZk*3rrM5!v2(r20rudztia?QTi- zKZ8RSSgPc}E^(2M49sFZ>bKZas`CCzV(eCMXy^M{Rp7a)Fsa)h2Nq|#^FC0g^s8Ne zDhkf{?$(0oNdHoom|4-;CWhhNi>txxTW^4*_pq4&jBOt3?X&sqc&VfpWvs+Ke6$@v z@QkP;FV@Rw-rJUWe2jXwXD?8+AM_@ow}a`MFDU{3tU1hU?0{nqMaNsPMn7 z-z`&=>QC1ki#t+2$B9%eFNj=CamRnk5Tk>M?qJ^oN6ErkUcIY5iTd>_>H`qd5&@|# za`3I4Nf$I5?=WFmalOgL{3#LF(r0D4pB1v-1;jxSYX)3FP~*VjtTA^ zp4e{ylp%Ur-2q=BzROc0DOM8z5$}&nN$++PYAAkIEgw`ZwNFaCLKn29gZ z$syt~xpQ zM4XYfwFIXxwCqM%8JaE@B;+S%xf8_y4!|hB;Sbgg9MKg@+1Q&L27Vjn*J^MG{AEH# zPW#tA$}E&uCKuzMJ}muxntg<3OaC8lMn|Y_2e)Ck$)52kEw>Jz1_MqNlF({1VPt|q zuEf#b(O_>$g+>P(VoCjsE0W>>>Zv*4Gsp&&Sx5c23-!L1WG{s{WJUs#vTN5S(qneZ z*|apYLu_uZ1=%h(Gb+^ajQRfbUUT+oj9nt#&YZS(~0JmStW zQRjFn&MP?sxjEALGUUb?QbHLb?mb|{*^$98)VKCq1*u{9eO5&T#Lcdj1`t1dnczJl zsk)X&M-D_gkX^dOGo|{AwrWy!_dPTkE*DAI%NcNV6 z-Ojc!+&x6jSmw3IUTdIchmpZ3xnpJnx1|VXd|3ZS1%V&x9@DUA@~*?|+n}8ux$rYq z?E#$+#*Y`0WKKxj3B}>OC?FkbgVw0puxXAre;`q1|HgG18qcVVR5HqBN9uchjO=w6 z(vY|YTE4ld>8et7h}Ikuu8RD_<=|?x%OJ@aE~*gD-{2|yTwnIq9HaXm(U*qmfeWrqLhi-XoGVciUh6XjcS3^I*!9Ij}%SO4Sjo zf+=e(MXOq`))_T6U|rtVDHSRjYSw%_H&zlRU~V_3Hu!15x1xBfxW~;nze*aBF+jmC z5N>8)RXf)%6}Q~h8Hhbx&B!s)_}7NsH5wH>4XFRYIL2rS>MD`Q7ehoy-0Qfynq&Mp zubR%&P)ZUN)gxolQ)P4@dzy+#3r}=kXcdq<&{XVn$lUtkWT356D>oYC?XoV-#P^dh zfKY71J!53~}Q=H?g-;$;~UZh9x6_q)5U!yXNO z4zL`j`Da+@kQ=;KvudVupNeXrD3UMZ) zaU=;jsagI|4Z*k#8~*JtSnn!CVU<+6sH`_Co6!ae?298~x&gL7+d{SK`Q~I;PRU#m zD=hc7eeU0tvI)!=Q=3X>HjOBJJ3wB+4)$K<=3jREWJK+1Ff2-UC{8selk}ajZ`^LM zh#N(Tlv{sb>W)8wdpEn^c93;;AecT#RO08GR>KNFYK<>M1r!3bJR8CleoEAHBTj#K zu~soL!Cly!47oInORUA~>P0nNt)JsoJ-2|Fk?g-yc=9gzr)jy4ePk$YhIy{0eNCUKD?own{IR zr_=KwHCF4O@LV?pSi?WMH=o8ID?upZ*}?y z4c-fmPt^6G>PD#@c?FI4Q9g6=r*LQMP50ezZ8TnJkGFZKxtB*O|7{ z^HC4;u8_NvednOgxFx2icpJ{<_svBDpq!Cwgb-~0gHM&i1I-4iEYB@XHe7+h^6x>wJBv1HI1yxg{ z=ZiW3u5|JaMz z=1%;>h#n6SQG9+ys47#Kqi%g~`A<_3_>(Wyjc{1gFklqHB8I3B;WpIGJE!gv(sHj0 zLhF0i8T%L52pRFG)!0y*+@k?~tB}aJrLk0~dG*d|mfOxV^MMWd@0En>JT<+MwLHr$ z|LdZ7(ViXRs|cN51+#lJI5CF(7uQ1N;r_rUkp%qXu53+~64f?`++${4_-9VPo>MnzU58-;<(gzYRNO%{jks%#3gnY7c z9WAC8jGzuAd_Us1xno4VU%Q{y*G z?&KpWdWtE7R<~pRF>d714Kgzf*4yWeiN|Rre8Dyk3j{2yS^AiX_MTgab$YwdOd2fu z^~yL5&QseB_g-lUKBJ&=d7;8SD9A&b!yxPujGo}UD-3+lR>sphnbW*B!7t<)UC9z2 zJU7!sbcq91TZMM(HWoDHq=kL^5+3qbVP^j&Muk{lEYH zEYz+$k6-5o?hZ7@S?l7Si7vQ=yzGVpyRr#lqR-ewbL}muNIjzOuJ^_MXj&Ydrdu%I zqBA9^CHFgJRTEX`+ISJAUHB_8U7yBoV_YW2;C13C-M`^c~OnL91Nk{U|n9fn?Kz1z!u zlx3P`xK-6xTypD3RgY|L-3<$f7;mO~zrSt#zS)>!K=lQ{fQa&UKo|@(lSWUUzo#S4 z0^d=%H!T9I#uuX%fT1+iF9U~{(pE)*r4oHERKS_!5{|0jZPgw?p10P!QG*?to)@(yo0i7God&u9xN7ix9l+PJrX3*XPCw~=%E~rx+tj;~>9#g3I0k*Bgg?1$k zf=wN?4}wQTHxrka!8#IJpT)L+ZgCFfz38SYPL9qVpCF-W@_E0By6O7bNCY$Ol>hvQ zYVuzBF-8(1FdL3Rb!``Nw`<3SgWUQ`U!Eu z5ckpTm=gANd{5uxYD^@dcXLa0;lDk7>n}~c5Pkb7y@qwndojoH+W{h5PN|T$S81%h zk-SM_)&T>5uDXIGI`8=K){}lQ_Rh$QcKxFJ7xlbW@1Kc<&+*5E_<@SJ$k!KNe)+%B z3dH$Qy;_4m5h`~Jkv!FvlcXU%o-9Fep{^*{by_R>6Jhj14x_DW%;L^hO6jN1(==`Z zF_hAY(*_zDEPPjAM{`_QZh5V+OVfLy^x}m`Pi|v=f0@YUf!AHQX}cLGI$J;@+yw+b zR0rnri~1%Dnr5&*mU?J6_kIdzka+d4WZHL{)WU`5&tNgH(SK}L8FSq)Uu9FRnWcsI zz3FFFAoS~qeW{~N@C-5JpgWwS9e?&7)uDKZ7ciq*b3`luMdmjd!54 zXILt3UlW!YOlM6T4)+jgahxclel(%HjCdbzt9S%A$}y3Q`6HLhqjyU{y^#82JIXL` zH0x`AnR(R8bGDwcC-xFP%keiR#FT_0f}B#KK6+jMS9>_rWbfMEb>n7>ZQrqb-HT7F zf~04$@!yyumyfqNW3_#1I0DFh1}oe$_)gYv3|826JfrE5rWZ_?FvaBTFZl`I;ELTy z$q9*HR<=oxGPOthbWeMMax_X+-p4~(NSToL`6hZCuQzkO$S4;d+d5P06sp4yt%~kG zKo48r2c8X=-;Jr{D~~d0htfOR?P3dJ?^A1XYC5NQTR(tXH9A=w;cd~ppy+`VG?4Xr zsyGfnr^C+ph?XrC$K>0Pg64lYtSTD0zT@u_cg^BE=gXS;NPm~kW=@X$v|A0Pefv1* zXp1*Lhb_m0-bl1dx=wF=Yf0!n3*NQ#nr2URHo&B8t}^!xMAsFCQ0kPKN1~6*Oz%|g z&gTE^(fx9_7MSc}yH=oCk!khpxWGy`DY@40GsUn~6s6WRbqaG_U(YNv+a7*J3cm5{ z^{LniTa}6{S<)K-X}S1K$+lnXdrXb08Kj70(|f823gPajoKR+4 z)m6Q~2LYZGOb^ccCk{s~srTj|ejAInx))Ge#PnW;_RoUdMM&*@G}T+p+Q$bW&^)uF zE{7HszfIy4t6x6T$PG$UQF9-^R^i#+&S-RFE$-9(gC&pW;7I%*I{%VBvKOMkAA@fe zALz*-taH;Pw*z=|J!YV7G5R-ZN@Ir|)0qZmnHUx)9OI$e_rfsv?N-YxDh49tiFUK? zasOj^7gr;=)V&NIv4zKn@%mQ7)=m+81!QCZ^ck3(96$ny000yK6v&$l03!iN|L?7; z985;?=%p76%@3uq-1J=;ZL5Bpg;Gyt*KMyE%M&zjau{o`)z4sb9xv7HsC)ldF6{ft zSV#Sba(>4ipk8OgbhS>NkmGn~<7~Z2wceBKsP*}$HW9hpjI(YF&s_#nIrO`mZS&hX z5tr6Yb01#>e;t3K|6*U$tm&25TpF_Ay29{-lGA|Lx<052f=hQ51vFYYnO1&ECAM!( z6yNmo(kZDFOlU+^OD#or?9MirKP_X^cM&#iU%5)dwEq0QObpxmY?vGQCAI}|PhZZq zFepAZTG)B=mHai^Nxl&<|EWSMXmE_;LMzx_)uX;Njl^Z#`^x8Ii|gUfIzuP<$m8#q zdB#)Avj0d`)E*+K&(BBzh@gwb6>WZ@)F-OHG>Ydtv&PEQpTn~5klvY3Dt{3a%$5T6 zOCd3!B*6^=?*7Nb<-m{|Mi`7NS_eN>Crw+f^k!%DD;+ zYBSiba&Ba`frRUbf=PalmhjI``7s51Rc3{z>D%Yve>AuLD%ty~#+dr;_w3AsJIbfV z78IWG_gYi0z=h3m#rHy>odHR(=;4fBtI_sr`Vq;YO-- z)5AfTlx+V^JK@8(s4t&B+F@3CehnPaX{7mqquGxpB#cWOgr9JHLrX1=br>r)CDnYu zQ}M8ck847_Q&T%s*?!L$WN9zI`!KMvu52EglsiVA^R?;jX}@0f{Ij84pIMKhmK7_; z07iY`B*c)w3}fLR!?H7$+a|X@N6=H>o$MshmAbWg$ajC7$u%Hm&6mtX)=pC?(aE1` zlx54V1kYw95#Qb0T1zhKd9E5Kzi<{8Ghm3sOuMGJrfs@p%-lJh6F^Fpkle?;|I6%c z+#T&|{x3SWR;@kNN3%LT28h|=xcjLm#_R)Roz4dHie$81cHT5|15+C{9HLrk|ApNh zwK2ed#Lh2{EaF#;HLE_XyD+w!PjRkG=3RVNC!%J$+WNDOF#PRDQAxK2?_F|QJm#XC z1CLH~3DjHC-^t5*7^Sc7#)C@H0BQAh+^rEgt-`Wul-G z9i^rI5tYnF&RS@YyP0{vdC*dLz*?Auw0ZV9!XN+g&{!xmnM#(UiQVa+wnVy@Vj=oa zTI}iEA~-<`AM(vep4Cb|P%iu2c8Gia=@-VJu+rF?sYD_GBDK@in_$6nW3*uy6P)wX z#xo=Xr&^(ol0#DLZyH9^!KB@Cn3kdhMFS7Vy&*82RU#12EuzicGsO2mu;~VH3@_ru zliEeGDHqV};lMweeO^nGtd;u2`1|2td`%WkcrRP+s$qPh0d_r2{5ZL(GK0Cthx2sJ zOfegi%{Goo?%R>WBrYX+ zoi};8;%46XysYA`)J>Cq5l`w0-dE@PK{S!y-$Vo&xW}{~n21;~C=8C}iS^6l@30L} zlSe-l*lX}S;+0{aSkGqrLR?YpR(qd3j%P^oD-qUPPw50Cs-FW2(c}Yznh)J?%*pMj zuta5Bu)nWyr`=Tf6ZXVjXo#!kNVocX<&(g^P!uCaW`bBfhj(eKu?k!6cYT7$ZZ^FKToz)Y%-fm(-A~=34xVx>jUdaFXR&coyZzoDS zWKL%+@4M4heQQN+__MGQyMT*&eFr&pwnq*OwiKbfKQ%zn9l7s|9hM6B8x*+DJN$meJYx0%rZtjOWT71n3#i@lqQ7lq)z%;bj+#4NqqZr8) ze%Ri@`Fkx_MaxnsI%kk$sRx>vWrlb#Byi`9u=3>l{TD$Y>TGhkoJm``3XHZVT(b>Y z|H;~Cn`&C4nlDkRQ7_$VA7o|kx@ap2&Q&tDs%cL|1WYj=jC`5JvJ&__UH1t{bNEwk%WmkjGl0O%#@uYiFxt5N4QU;Uv zvMb=_h;FdLtv8j>J=wqf#igmol~JYI7&Lk`Ngdr5Ez?Quzc$Bu-qWO(S@+$sh*#pF zw6A>M59C8^^0ImKqG})G@b^wP;(`+;2Au8_)cFjxG-a!OURe{f_SMLTaa8&apNq1X ziNYI^z?X^}Y6-2Qs8Op?gCN5K9Mlwb$suPdIJKf`Dy$5=Vgv(nB73im@57wn$WDeHr>y5=j@y$ zRQq$hfE)4b^#TQ~8Ig6*SGSop6+oq~`oAXYO<`Rdi0+sVla(BK2eLQk-?^4$PT; zvnqe^ECh-#{=63JalvylgX0bZF5TBeC_=6FLi=QxKWNlP#^KsTLGIKQ|w(sDI&` zJb;iyHE(+bf3 zkl5!_uH$jk?-zsuld*qP{p|jV{dT$K^n!+o=rUyeV3R?_;fNZ_M1@)sSyPXrRb|xy zaX<8M()GTfTg4&DO~c}jq~A8@CDPf`QW4i=engmjv9P&d7U!S!*+=o%RJ&!XAvQgv zwj^*Q3C}+{0?V>m9}Z}GkyO(-aXXDznH^-HDP>a}Wj~qF^-}7{SlK7v0O#FeP!~%UDzi;=ys0ZT%+8+3(?mj1 zTB{+6QyR~{yK8RcFIcZSL%5S% zSQ3z&q3Jcnv`$f}Nkk-6hB{0T85ZU8m)rwnitjz3`rwkOT5XPMKmci}js(*!h~_WM z(;Hu8K*^{^t8b4U(R>1+nFs>&*c%dVQombm2SZGzEND4B>@G%WV`eBTj(EurdA|@+ zNe5K@tyVjNv`42juaQ)i*esB%k4Tszm^Q>-hwbbeHaS6L6ORRkh-{MtXcw3nb8osa zs!7P=s5S&Ovxr&rJ+wk}eEk4;|3MO^X)Xzs#ioliDnXjdXZ0Ydp1b7K_pw}{k$7n@K*D_LoH?eg}3orI4Gi!(}N@suSX zp#obZ0hZFF0#}QNGfAcrRnprl@vnW5gB^0KCN#lEkElrN9L#D?n?q5F`FW^AG57Ag z)yNFGbvX_Sc=p)iQ$s2%-5J9AVb6uXN^$(ND|#eQk$_{dF5xe?2n6T&QwJSs@0$q88p3!8=` zkH|3W=Nw_MluuFR3~kk1YKHOd`SLT&n8n9qWZdOau0MAINq>6k-231S>-jz8QdhXR#gX;O#ToD*T=x~Ynm4BF^wKj6+@mvBr})Ci$cat zyKgjXVl!71bdF}y+QXialL`MNYfLU|1W7j2&{EMa1T8*#?oFFS)o+(4*aDD4u8d1C zc2RG7wZc`Y@1Id0joVm1LjHJUO&mv3r_l;g7#agvqbi@XD>9*uf_|$j!gA!ZZ8azG znY4Zn(@b#vTpK`z< z&rVbye-3fcP|R{qhGXEFZI6(BQ-=K&+P>ToW?`=K|GL~NxdjuDeE7tZ^V*KDEnfH4 zrqNyGl3l=%YMPt`y2DN#ePn-}G<;LFy_K=CgQ?lB#zm3njgHQmrhEVvian!Qm(+_< ze}Qy;G2P)2vw*a2 zSXk7CoDBZ{=;w#oIXc z(S(&GKU3ok#ZiL4@FmG}G-YKp(QHKJ$7t^Dv3!TI9EY*u(y>Rc#!5>qi_%?D1FxRk z9^a-_s9Eu72=AzWHQu<+Mm0R%YQSmIAqRgTs;&_MVwrg9e?v%Z(DKiS^0<=EtBIl8 zESQ~Mg_#?^7Vq9YV091m?e8nUO5}X+@IKJrt~1{FL0g;p7WMcVmF9JySpsIzUunz# zJy`mo;gWs66jt5L@LT$%Lc(5PL0oITCN$@>AATWL|x{GUC% zSSH4+D{T)jDKLlcY4!^!PUx)SWIX8yE1^DU7q=czHa}u&X1p6N;5MmHdT62R`Hrrx z&WlZy`$LfxN$Vt&N{xP@vdWW`Je1n@Uv5EM*xQt-o;$x$<$-@h?AdP$ug-gP zShh>4eLzx=+DRNE<=g08w@+&?et*#ay+AEFl&<<(2eRlbC8sEb>{1s$H>F;w6k^pe z@0Y3vg>)(XbiUN|uaH4Xr7U@H3%4GaeF_#}9!S>t*64c7Pd@Gc?}P@yH$uZR&O%Eq zr-qay4=lR(5lZ!GJmhVvH1Y?%Rmr@lZs-a*8Ro|n;%=zG-!+bsJhlD~zexq;P73X# z1*6`d>@LOfpGet=pA~`*bT&_a@(zH%*P zlfv;TIY&vEyq!VW`sR_4pIJ6I<_~J)eqIw~3wOw%};p`4A(_6X&WT?mn1w_gI!{d)sFyX=K>-OGt?_>i+`=q z=~jqmFV`-(mqo=SlLj&&WMTuUnNWTjm$~@ur9@C0;&ZFjtV0!b-c{Tp zx_lh^W~Nbpb2p^&Tj3qXx6{6yW|U16vTjcW#{E!PHJqZQ>4%*gSwHmKVpzm2X!|Zi za(fo$-9;T;BL~C;Ed!X*50FWYKO(11Dz$?n^2zGpr|_Q(>XcP|Td$*+|0v#QP=Rx3(RanosKg)0 zlTlH2bAO0g9A2fy>PVWflKca;BV{`#$L{6~xCkHPalM&*A< zDipE@G?c*r>!4$3#j!)|vF)#8dzuqRt`i&M6KCTS_t+Cs+;NZuMf%!FFzFu(^5 zCS3e)r1IY=n!ltzSb4?Y5Mu~sFd3c7X_E6PG~|@o1euz33a&i8_T?!}V12EIpqZn0 zuD_ihV`|qZ>rJ5FFKMn?X^!HkuOvLLrhKllB^s5HPsPuhKAgAF{HqEIQonY`01RXY zG-N7({E7u&CE_#sg1-`Rgo1%lWH2%^X#WMU|AO*>W>WkTBzd`DjLa>E7H|=HNNSsn zw7-5orK~$R`+^i$KA<|UKr{!_?7JejOq|<%ocE30xtyH$BurieF@RJ6=@m#oen=|S`sx|6Mc=!z?&2jN~AeTa$N()tf2f9!1x~f+t9h|o*)05NKQAa6|!isBS9rp$e_HfDj*t-gRaKT!{ic0T+T?h=G-o& zJZ?19yDan~XB**oaaP~->eKe>;5sZA=6UBJ|r8OnZa zVUM&MnyCEVehQ_5B4BF(?YVyGxZd0&I4xHO``a7W==~s#QjM)RH@{3O6)0)xR2zX} zh@z4zLYb&kX6p@56`NU{2^8Ec@;vF2e2ka1^EoqX%?vL)^QMLMfApjcRtc|f`8>0m z`}BS{8v5bk_Z5?8_r70@aK$e4dl#6@v{1g(tEWf7T@Q$;_*b(1ARMTDx$P}}E@zuw zVIPJsu`JH1nOAh#qWGE&_DS!3%S%8f@y8vgQgRh%e@(^cy#&;_jKLypU`fbLcZ$;; z)EkVYX{23wEE6@hGMWETrSELdR=Fi=1-#(+X*X5<_A?4kQi0*zv^K|Wz$!1pvKrYO zS2Uo*jw6=Amd~E@R{FEr7*a$WfboiUgp3@);_@Fk3#AJHmwY6Kj<_=YMlZLItnu@T zOaWJlsJZHJI9^qH+Dz3??V9#4j>OYcfDhs>LGvBkC;3tFdPa@&~BCw5#L}rm{_UD_8IU0Ii$d80QQ{&ilL6(Z#?M;i=xv>iy=DwO1IB2ZCfAn&M z<2pC{{%)gC{tT@;I2fS1hKAb)4_(RPkz{fSv``(DFJJ(0Uqr>CDpf_T=_`OyPK6)N zyTXr6hQ4IH?o5tjKi~LMkJC{n%RYZAt9D9bC7tLxgM~CZG{QqS&4OtwN8OG7X3bzW z!4@uwV1+3t|Bx$^{Cqscz zWOv6+C!C?YELy;|4`cKn%SzI-9Q@7mLFR~eYNzKq+O7>>-8K)BRq`xO(awSS@E=D4a5fn#2f6aNu^hSIRwdYu}Bp4#@xr4=1rsCllkYdhNBEQmYw2u z!Ym&@X})MD&x{zYX5TfbCcT;xpjLh@$q==aQC{P!?YibuejsNd_@|%k>AS2Tpw6ID z-C>scZ4g&F0idDyolp%?A^+>50X&o-i+!~Y09N35047i?UO+C%MFUl@4loZvpwA{6 zC9L8wwS1c_F#xvpn$&n9s(3oIMKagvnQFvR9O65%k3*~pd1ApU#p?qDFRg*7{*WOJ zcdq?AG(ic8B7e09b2#gRonMEB+g+~4oP(BnPtyCZBOXPNW|SNK{EpqKgwlh?25B#S z7Q`oV*&5oZ`^|2QyE}PrE+p?Pw;Df4gOTIQZsKlCe_*~Mx+ySeX7Fs{wIdopPVH-O zBMJa*kX*dD21!QOioK5+#j>f)zLxg72dDj|XC*8RfKZR5L4Q_<$z`f4;Tpac91-}U zW~U&30u$Kp>LgkyH4Kc1;H;fnRz2gUk`Y4{h>+|7GMGw|!NEE;X^KoZVHhwzb}R*U z(cnnXq`f2n(SwP>buzDav8F_9lgV(xpGq3%xa#|h#LrcKSWR5h+l=Sn)sN|4QuEOyX$3FpBLAf@}p=K>=ifD#380 zEm1(TNk5rrZR_%yD|5}e@*+}5dMBTU(dd5}z)S``+B#R5S5iLWq5=VotD@W!z4y;tc{9RHU*&L zJ})goO`c;ka`6RsEb^IR`^NlXTY44Sr!>;;#>Tr#Z!6E&X(FTe(0_}Qdsj|yJ_aDx z7er05vcq)g(_#P?iOZ&$F-330G0wTR=T)X>W7rnQ0ewen?_SRyUzg3@Avf1MZM}S8 zRlzUgbZ$P=rXZLw;oki4RYL`X9nc<0{>AGI3~PyULxAM;ibVQ26%A*OV=f;86$kh* z3C%0{ys(UWeASj_x+q4)$u{7qX}CVLX3y7OC|MEP`{5?1o^h1#gc21#yoX4t6*{(o zCXH}EWBmn>=Xf}%^r`YkWb;?*ncW5ydq^wN=0AnZzC_CA%VikS7TFxE0$}P(MZFoS z3$6-ui@%p1@oS*|?Hakb^mg{+Zr*vaAcN<~+zxm+${U7`<53~b>%yGK8s2T;|xf^Z$^$Ju)2-PB0JYxSJhu~G029l{rh z{1vvebr5fn4Z!38FP?&d#5Lf80oQcxYABBEULy~HOd}hC3}=c<5L8C(JxHK znUatl<&@;g5)eNVnriIxvAA@^K|G=u##IcIC4iO=InFAw_&>r(nFOjYXSY52r73C# z6*|@NHuc_7OqC&J3NG0`qu_mXxjhQ{Q1IoW$H>sA=A|^%c0zx9g$nMJT8DwzWiO3# zBQdrjk@M?g7=afrSDZLq6G#s*KH?48gKygv??x*J+uS;Ff1%j`W_he!p_6-F0iy^; z^PeW)*#XJy0Gtj9((i^Ha5R^R>Dlz;!X<->;UnHSEgv+w+0J0-=p#IUp=KFLOV1!H z$$)P~GWz!uk=nZch|Sia-o9?~2C0%Lwcbh!lbMQGlX7_oQI{_hv(k9Ab7lkd6ZHJqEqy~vO?2F%WtPDfyXQTQwr0l zsa0XBAtIqW)NM!xoC`x&TuKHGUgn+`L4-?T7zZ#NWyQ)iJ&o^uYg^~UF6;+S`)C9X zVTrhu&f6(Zd~~Yv^~;dsJ)IL~anu~{)Um-pVBcf1dpW(Vs4}EMKQ0F}&c;StFf>>5 zn%G{}p^R(ot87(?$cEaY`wC$c**ht&n=r^`mRIM*bSXs?k6~3aoo#lax*X0|E#p?) zd);L^GE^LD2825RC5;*?EWKZz8^T=&(#1|CuKh_|bAWAF5H<`5(iI>DxhkB*)1vGr zpBmeCYbZX($1(K9J&`vo>ciu7@K!sMhqx490KK9C-ewIK8wJL&fag)T53S^w2FapP zc%etlj|K)GcV2Qr`ui}soXzE|ttJ4}FmK;wX@3dj+nRSgw!HJu5@QH^V@uHHyFLmR zzBv%o9Tz73Kz^-BidYbvTs-$Z3)QZ8X_FL-9qwsfV=TbhI77$0wNs>0uVS6sgwgVz z4lHbG8l?%dJf^t&diKMPDbM_@wIxA002ZT3u$4)5BDZqBggR=*8O6`xWGpn;=8{C` z{4@y+EI{tj_asjOPH~D%-~gnI1tqZnsiv&Lgzza0N(QTRRDY~OJOvJUk=Yl?8xmz! zSaMUo`Rm2z@SKlTv3w+9c{d_e;q~n8t;{=5=E+XYs}0BIQ~)|c+{tnactfkChc+IX zFeV~Mp#isYk?h%;6bnmMBqlQGkm0aGY*8S)Y;rNFkGabf*bs=JrERYo#8ahg7MUF* zSeBA+`)K~7*?R~^Fv$Z8yf+0>J6(3unU7kvP1-TVAAB@BHsy|39DcHBF+BU==X}C( zP3$PpY{MbWl5l4$J@GxFKEcAX;8T*PO=ImR9));%Vq#iAqTUqF-!@4P1tb*AN#eA}j=1ZuS+I^>4Qh2>)M}Pv z4kxiXC%PbXkf_(1J^59hIFTAs1;Hem6jz)i4s1w1uhxHkKD45*iC22vTgriATn;x8CiV;NUT_N$AI z?>F!^pTKffaDEpz-_>+aD}2RM%_*>-4PLf*VNyR{uK~v&yw;{k;5oMmV8lyptr0aL zrY;|iFO#u5bEJmkhbCp=Pd_&8w8Fl*pb8|=&cF!b{9|cyM0!319#EwFK z&re%#n_^Hn#rH}4OHLKp4iE6o_+Y>XLm2EF8axWzS0R8^l6+J!O$vZ3nYh=ePYIfK zz9;il8D0q)GbF~j`FS#q2H<@je$E>SHMC&W2B2y%P)p^TflGqo6wcFSO^q`_h`2gw z4)fyxcGQv|uB>SV&gw;uetnWM+iI`Ds%tcBZ$X%qw}kETC1_Qwll+P6{yTAQqe&j4 zwod}U+@laP%`Fr^j_+CylZK+|lC@ZHdA(b)6;RC5Xa6Y>W(p(_2v$=`&PQx$#ewW6 zAv^^@8J(nFL(6dFCt0VNSU|kkwu8jiLYpmTRTLBni?fLUNW_4hRX`#mz1l8#5f%Ux zHt?Lu56J?!tpf6&_--JvcW2A1smtZpIW!iQBt1o@wJyVFuafC299xxE(Zv=nEIm1%=5c{Am(#WK&d&UdJ}hi8A+t70m0|kvh?UC@bEeZz z(IkW%^ikR8*jA^bEz|JRb+dU})E%g!*W#nkPAH=!5?lvjQJ4^m!l@E==9#{iKzxf9 z60I_KJeHi)vJ?E{0*|^@Zfmme$pAdc2DSF> zx_1B%PPjJWbs2H8**p~cH-kQVYu0IvKTDa8gAhfb4~XjVk)x9_DPJlettcf}_-E9e zpMf<#ujTrllHRsK%?7LJ`9IN6%f41VVT^zl>ohqN||*LMWqe&we;)lRgdHo zkCc5t>c~0*i}M%U;QVW@hav={^&bypJ!MHt&I6I}iP(j?}rM zPAKsuXZZtGQH#h9lFFJP{XB)5zqPXJOSTu}W?M?UuR{CsSps4Wl=C&dP*i*cZM@501hkf&=@(s5w2T=l0Ipmu z^D_q?9q+!;gt3>oRbB@DkD)8^XTtsCyVz!9GdHu#F!u-{$1Yb<6G>8SQB)Egh+>D_ zX(S2toip|8kR+tqhDg^)MM)!-Qlcb;{rm~f>-Aip_xa;>>Y5kD>tL_Fd{qzA&YQac zTnSl!HcqC$07WZ)bJ)sMY$34wx7wC6b1)`8OK;?ljKUjNuB1%-HkXSTSs0uB zvz1mE^#u+Gzs*_#`(riOu)AC1;Hz9+GUJQfgLVG2U-fRi z=l(%wuQN?jK4(k?mYlxsdUt50b@}h#4?C63LTLHByupTDNBMvEuKAl3-}op)x$tMG z6wL=Kk!DNLfX;{3_Zp)Xpc)y%eyDmwB8MOapsyiTz+3zUVk$~+-MbG-{U=oaC3u;X)f3vrb=|3$QjxzeS}h;s@G za9~AMLy1F!Y~=2O<38GM>VKKBxgXioFVrmu*rG)Y=D{F=1nyNcSUV&uBfk=Iig3I;emo|x1Jr|y05oWLwjH|o20(r9WR*ZM= zwtd%+RdXFeb*uNDS-AW$e^Vv6EGB>fH$5v)SO_i-E6X$mJ#<r6%edj4$hy5c${uASPUzFkG#Q6tju*{0Sd;f9cDjP;nS z4HVLI?9R*Sa06wJE5zi)U~wkt=)hleAciXnuCA>q%IyS{$nZAD(3M%Hg-b$za*6xE zoLy53=;z=b6UeI6;NS9E1wYtthB?3jt5bU>SkA$bhbnYE4xY<4=_&h>Ey@oaqC|cs zdKI_!)Timbjp->_34Y>p-+kcO#^aCCC)e2j6RA7PM^VOlrO_{6yY*~MZGH2&;Qi}0 zT`UT9xyx#vSufg*Fbtd^YMWhTIUsE!?RF(Psom&spC8S8LA~sKrK*<)%h?@j)j)Ib z>o&zaI{wLH_XC3orz2N+Q4HNx@Ktb+TJxsHUqU{Xetize2oYL#)Hml7lXbK zXDd5wdIFzJbnejH?_ZzU$y)p54{&0PV z@h^0|oIU6T^VQy3BhZ!9cWLtZXijpKcf(t?ocK;{3y_?`uiSEjYI?1ol6TiQ*>b=z6Hn>yF&y}au`p=fLV@mHcPu6Dzw03)-t59B;Mp2IC zhuXF*B5MVrvvgd=Tp-JIo0o_JV`M5Y9-8X?380poZBAc!99ZxRUrDZ|oIDHw)^7%0 zTk2NPMn6$*>uoH#y_99M0j|Bxv$Le7eUI(2%K!qQ26Zf%Wy2~|^HrN--sA~pGplm^ z9IJJ~3=#2mYi0IogK+v0Ri~@O&U6AZ#7|R&`iq^F4gqQNlRLc}G#dikt1ix+@FV=% z_9CGD<)tY|m&rtqh}Wnko{jyo2^795bYK)VnURZi6KDA&1y#Dno#vKqu$=)_@UyT- zUMZS4Ze)j0Ouc*jnQr|%A(0ph(HACVHOy5Tq**Lt;%BuyH^WbJt-(2e!XlL^rCAsVgZgJm4Q%f@ww_r}+_A3bPnkE_#XA=aoN$ z?lG*^{~04lZKf9-Tw)q2DNsh!t)cXo(Ay*WHm(JS-}Vu9#NCv$Eh`H$mzqW0C-R_rq-7jCdi~G~k zJ4$*qG|Sjy{8a)yceim166hUbgJcm!K!lZ}7@(5OLvUtLVfA3$-KrLh!E2wLmBQz! zpzg96Y(8T2!n1MhBmaT#?~NjisRKg4Gm-z^bS#old=D8}Eg*mQG()Y3;KMh~`|2D~ zg?&Ew$hmCh>>lh#!*UzEb2~TNYMfzEF%}!LD*o7C{IP3fhyFwTLg?}dzs)K4Zdtm_ zWNOcjYPRYhw#Y{rKS^`9cK$nsW zZkN5ey4U5Vfv%L-mE|#taO!S-SWs_O?h$lIiF4~aSt^6CNHem`+R!w@v={YRUit*^ zC5-sUPJeixsyEZtr?K-2jmHP6n=U=tn^nzC>mOB5}D(ZT=Y%(7HbgRLcWQpzoc57HbhbFX#z8#!PU0j7$R^VBysEUcCdvW)9Sr<{K35}%7Z)3r{ceIv!- z05;8dae2aTLrH(Uyu)sVo0k!3c>Bux0q0(6ZWb0yd;){+Q{JL$FlR^cc=I1#+Rf^R z^3x1!{`fQnuZ)#IPw8Bn2OADHKzu2q_*fduNUne-SoN%Xae85HsYET<9rUGwwzvP( zjivus`Q@K>c+OfB=Z1-IqxrN)CRK`jSINuwanC_oG^rZp1O{bU55`?0WIv7uY6^N} zn$z(hRu6FcFgnAek*ea0C8+0%8HNEk6NOaMMRu?7tckuMTbp6bq2VD6HU01}7NPiA zDNkK!A7E&Q9U)8r?Uq3H`W@8xaMw~CqiN6yo3p9-?W0#0i9GCDs>~}HdSn4)MFvqI zUR|4~81ve}}=%%S^9XCh7;1?ZP}+s738G z3>(}))CN)O4XoX1KmwC|zr5iV&5!^>OF)Poy73?n8^AN^0czDqjgF3KQe~PwbVDkg zqWcyy0Mv2^;g*CMgx752#n%*YVB#E&qu%N>S6c(TlkEg((vNjwHA3SXE3*c{*V{SQ9|KNy$UEi<8_1gmylGCqp(5+e9&5zZWC{x@-tCO#)~Vu3|2UIBIZV zME=Br$1pxhBaW}a@F3f#g`3H{uxVt!@N$PzT=XrbTlT5u9Ur{f- znRWID>v;xswO!P`qsOVs^#+z*Z?di*fFwx0C{k3Z#48(M=*Tq-pc(e?HQIrG(w8>v zO8u7*?aAZa4;p0X)y~tpk59P7LMJV<2Lta%BaDO0A%e8zC_lz7`KP_1-uYYi^u(o{ zBJ{s$lM3v#>6-e2lW-6kAT=5W1u^Jm62>Mq5M!ldnFt~c(9PH+6N$|HfmFLj8hDOm z4gi`;WLhnTIXV$OUA`qN^@35z_#&I}zt1 zUGE?>nwM!dnWLMrI2WRM6vNDYG+%Xm-1IZOU!UbOeqfI8{aRoFQ8K6%m4*)6J<-O8 zKq}b93e2tZTj^Ks++rFFRIC9VShgTss#R8bftY*2uJct3QE1*`u;cnri@KrpQ=R)i zUWsQ$#LIM>jS4Tw>rIK0O=e})_9b>29fT%687aUI%Ivg-Ft-tAX~Yv1sTYf{1Cf5R zmk|k_-S77}xr0sJg^z=jG8eMxy>b1nzZQ$$5 zUusPOReOr#;2^LI9iYa5M1e>&0J=t6fRk!2F%5etw|1K`-N*v!^A94K6?SW^D#NCo zvEeo7h5D6W&xGqBMS_N_A7}yW8d=5W3;$adwk0Z087-=>OYTbE@igA815q*rc9-bQ zci!`a+&gVl!Pk~yx`1lmcS^r7Ay={W05k;vT&1ZOSR7+)n9pm~a2Y`Yv_pdJW5aoj zbME>A*pd*TE%DOkBii{UR0@OK@#Pc9@dWb%o3Z7S!Yf3_HA;qy1)Gp%9`UbF?Tk6j zp+p~>_@5yVI#7)s7-5Q~8ZHcS>rO+Yl}QUuqenb>5nwV8LiYe)H^WU?lbS6Q(*S^} z^?23|vzzb&izbE*L}sCHVeq!X{Zrt`{P0;)=LerFK^4Tp!v7stxvW_1Eb(Mn0+@s- zfpfAzhtR1zVdPvo;#mC3kV(W}+5-fNmTF-2sEbiTN)2BS}HBMO~ox17)w zU;}_!OTy&0W7V3a_941^Zr-&(PT-AoqdO5(-5(=Ju8v42S9MP z$>3Xp)zO1gD&Iu_dgoS|uLc?%F?y#b;TQfTEDahLR0@;(g+3M$M*tWgy@E z(;C2_&SGKFF%_ryU~0C&d;q9T$S`T3vL|qc19XH|1o90K2{kozhvd9%(CD5_Qvh}wcn*S^;diUFx(nJ zhGL1ATryw?gj2Z7je`1=i&&)82C#bnMJY26QWgb(yFa|1*PEM6qulh4?&B&X42ueo zX$x94glaorW-DgYxHLdNIM|+lHkPZhmV%_ZOc@RE4QZ2pOU!{K2(|{uz^-9PfK4mH zHC{&?FZ0&~uVIJX-bB8=sRjt~<5X9YAoDye0RIv$^wGB|CV8aF6Z<&yl{1BjcURIh zwRwmJI+hG(6w?fh1YNue2O86r3NoGt;ivgt({!2x!*$8pL?I+aF-UBNhkJ)n02mj! z-`MWQB52>W{zz^24BdPl+`5vO+-?4xW5}9>5Ae-y156-bbd$MN3yCfO9St?LnxKLH zWhA+bCq4dQF}T;5CBb61TlFx^Dg->v*YCn8R*fVMO7id*M z#w{|vCcrq=E@RIOuZlbDia%lHcQ##f+J4@NAx0QHpsOKkp7_b`t>$G7<5;Kgdjb#Ci5gnHyD5U^r_N!ZLGN zMSB=J6V^`DgOl$Cn#mH)=aJgk68EYJj}%|b?HsKrnN4Sv)^M=~M7-IJAB`9ubg0$h z2?$Gx?0DHv;&w$7h^!)TV8`3U5N$Fhy+nZ@61!l`KN$*eNy^>ib>2>$I+PlwYXj4D zSh)5npB-?+c$j&I|2ic-)QgRXUI52D{_8cpmMxx4`IqF{BlH^IO)S0r@E8wt6ab8{ z7VnR>&mh>rUaiX(+Gm6F0TV4fLUS?TuqRJvoPl+eZOWhVq6i(>9cu|mZebZn!$30% zXbV4bU8hzw9Aq5DaGhruK20#3mBn6h7R>?HttdPE%;~)aO)%E_9m%O$!7q-7 zLgKLW|`|0!gG5-Pt>}41tII2ItZ>8*3C1i6v06IQ7=UYA>kFw>zwCm zAkMt7qT97CfX}fvWQ0Un0Eukiw99Ww%_qcWF>`BTv@niKPm@nCYcq}PXT@R{LU zI?v2cu#Fc!_5f$q&N;ewtjUOL+-1vMMWh`3sH;`3Ibl&x4on=J-IVN$>5+Ir=%`tM z`YfR3j|4OL)vGx1^e^3qOCRGrh_ppz#yeT+k-Nt;V()ID2-i@U8vB`esw9>Kd5_z= zP$abH~aNSO~GT&J1dKb5^Zp*zA8>?OUivX=Xz2~f&lV(19=N&A+ zxn0?AEI>~fIn~LVRlqv-CE-yiMBftk3yo3x<(AP?xi@iPCl?)kug&Qgy^&uIx*U4H z>`zqGCEh3Cx#t(1S+)VX2|?uCsr2@Qd$8G?JMN{f)Wga3*)P1jb0BvRKHcZV0op1H z7|NMVbsLoWd&<&sjL)t$`PcF^cp@7`@FYFRf04G?KJxGJZ4Qs040`SEc-vBgjqM5Q zzHqQ=UvE=PG4L~f52;tRC<^)5+aRvZ;aO8pvozD1@H{vBT(*n-zD{Al_iuLEftH1= zrWH5)Djn~N1lGo3C4+1mv|>?v2d})6S&@E1>QnAU?qQXui|zBv4$|PNj5}31k1p(Q zfNXwZI6cL|)C zFZh$cq|s-7l74-`cx$(+;L|UCjO;ly&zZ&N+E#Xwy;Bx^*oD91uZY|VO2_aj0YBE8 zUQjjoT(|4{-m?r?k4YgP}Rt^LsV zpvxS8@_vzuf)7{PmR|4nyHYC}YM$vm<=b=N<9`%Rf~xv(nw2a!b@oEHae7Ln$=So( zG$)EC1Vhzr+vXmV*STG~v(e=9+nGI8qV>6UDA$!4e$L--JqtCAQZ_F;-FCuq-&tG2 zs_86NqQE0-=B^5F-YDo%9cXm+hr-F(6W`!RTiPb!8z;)H!vl)Sexz^YY@gB!sQQOD z-dOKe)p7>S((oLCv2LWdIVE2|wqnt36#CX8`adQau*cu-dPcwAp^Rl;ouJM3!@p0I zNB#QmxaTGtLk?%bTsQ2y&HF!ZI*yv@y3l8QUw)_>ypHu%ldG={r55y@8pvDsT%0{O zq4M7$ZSF){@q$tjNnp<@sw+3pj{Be|Q)jx{8U4X`tSY~N8N77e>HU0g|C#LN8yFYG zfAe3IUwDuJ*{&7&)EPgXI;o$h4r>6~5I6`&CJmrAjfVvwz(f}spqZm$19)Ub5+H&G zYdKl)&0(K48Hw{B4c>3h@={CS`!0bK=rUwGsR|jDU8U1-dvw1~haK-^W+1kG6veN< za1da!;~HC4N3a#Lw&n(`p+N@5((`m7l~zIeo7XJ@%@UVB8vL4u#w_*~uR4M8;}cb0 z4@MFDo0yvCr?d3l^>uAnW|B4GTjnEvond6G_n?K*{!Nbo?!X*Kgn1~@MBw-M+E1Vo zro3cwe=}gz|CeL2H4i}<(h1nzUwD4D1`*EA*xFR3U2#Ok!Y_zw2eh*JR|@U9GiQ9=3EHa0djHzY{*z3Ks0>$E|~w70-{%p`WBdj^NFakK>P;L6Mz=m}A*A zX!v1FX-`!8@gQ;-x)lH={1S^204Bzz{%6_03Lyt*=l~*ObN$${SMxsMvwf(O!?Ixf zhSAtwO~%>e4x^r)&NWBFm`x|lN}n`+4Kz1FTo^09>~%DAjh%hoahKIZH$|_Wl5>mU z7e7{BkWsqsEzt0&Mlad;h;J2R@K$;cSldXm*qvE#M9hb5nux|>)ZvOO{@E!^J?K~qG+6)Z3RCVm}HD8aVTc@{Y%tYo) zNKA4+o=aV=zP-yiwYC&f7*3@$c{u&p7gYYX+zlKqF7?e07z1r0RKp6gL7mt>9?7Kv zHcl}1{H&S3v(rI;vJ~n$I1`3xBq#smEx zH&4~pp{53_DaEzq=AiIbSN*eU4BljHeW{N;0YUj3r7}EP2df}J9qNFHUDI&> zJ*UpS%0AR#$8VUlnK93$nckh`F>AtXW@Bf+WON^Pu5~5=k>C-ovpp(nP_A5 zP3`i*QZYj7$bkOy?uWBM1xMLci7NnAL&8FNIz+1ZPzomF_)vdk6(7qX8N1rvIvqfO zFqJ(J*PcRH(riZ}OxkVJP?&RicnmZ46>2p;v)(M5?6GcxKXF71fKg}~)nyFYF3{FL zHk>EwJs=pC)1wLlLkN;xq_5|DfWt-~LgspRJRIA3fAK5+{A`9-GdknhoTBTl{5MNE z6Ysb~TUZ-&jmp#?dW^fjX1PebT4n!5FHrF4O4KYPhWZMMHLX#b?!Z zf4ak#ebRYVRc%8DHF49wq4Q(7F5t8LHHF!nr=ab>*qv*eM}0Ou8^hd1YnxIMasvL4 zzDeV&Jto6ouGvQ5W7$Bk>=}ei2Y?RiPiQ{9Cr?hgpu9hmC{YQO^Hf>nlL+q&lMs;~ z%blB!>H?FHIl53X;aLuA*M)c3LXb8`<1Z}}E=oAlkw#S0gg!AtTsjZ(bGNgVAGBFn z`nA{PKZ&} ze{TiZwcj894JBv`en3QE$_NiIXsboy!6jMZ0VJeR3>!Ipf2n4qQ2`94iFEDMm!x;v2|0U6$WN>jivcGi%%n@Y1>)$a&(tP~#uM7bZTQj=&@F^r1oMk!2# z?=+RZ-M^|N=!WmMK6cI82qF6`-p#l48y7##)$JYaj(CCJ53hYKUAIDO-F;*br{bA5Z)eqwvE{+;txcQ!$1sZG(0u4kJquc-> znL6wn?+1Ypvl}!8*ar+%05d9qG!7WYdlCwOgaS~ZfDd6n1Eh6fh(x4&XokYa;;!od zn-Xad5KE)#tAtJ=Uz4r?2$fhDsU~1lvmq9-1c`LmXN*@M zmWZ%$MNu20$TAlfD0`^?l)A)o1S_g;(nz4O4Zw|r*$4wyUIc8Gkj^< z!~o3fsG@0o#fhu7{`%8ppBO6}$-2B~K zsiIM!qa?@ulHG#M*^Wg3^fe~&NG|vR&0rDor-`qHBd9eKjbni70-6Db`5Kp@1<=yx z5se9aRni#DV1u@cWxxrR&7+u&v~TC)_=ZdT{GJ>&lP{YIB+}Jq?~1#aeQN%i3~DTvjn^s#XC{bBSvR0UGqsHKzEQ5FTb}6n3LSZ(ITtNEtcL;mWBWm8ygZ z@{6SJR%)wW1%ec6dK0kI+On9gy~r}cywoa|LSp#3o)WDRvReOW!_HVl^G|#gQ7c@5 zK=M^_Tzq1lZW9sZ!o{`sJzU}1%4@Vw)M#_)90{p*uyUc|jE6DOQB<86=4XylC)ocF zkF0u2A!;GVbW=vdDSVx|0oOK$iva`qm4`X;V|#9}UBr}&!JVMg{rEXx52Z@4=G*2a zzI))=OoAY5Firf@hX zh2chV?p!c=e-#dZsXNBP5ht2}XhRNSI>2aHtWpKi6A+Cb9Yajfsns;2YXF{_0ue)Z z6Doi_zOJ*x?`{)pKN0`3MmuUWaW7r3jH_M7)wOLlpoALkr5l#u16jxjVap0PHgLDvh#0JPXykCh z$O;e=b<5(ACIro~c`2r>KWaF|*HD^qn8pCG0ZOxRGk_<-j}s94AL086fJE>aB$J9J{HA-7$*PEe5Jjym}!3tlkuwP29U_ zV(c~AT}M4l9MM=|@3)qNXgca>P;x7P=)@=MviU~@mFVXJjLDcm9p7b~tDPH|Vp3(C z9jQIeH7wnTdn-+SBTe21<^U)DMGc6{%??!RW?_b`?`+& zJ#AN3md}?+eLnK5SpBM4{egh@vWBOm^ARm-3V;TwN^M}(8mh3><^dKr>TLx8Nh00a z%|KK12ihpEfCE%w0FYs#{ze7;`r!|hN_+!f6GldW2&`^I!sSYhRclOhrADSYq(rld zGzMfL4HolBem5188C;qe82|BE6Ze#wLYu>eIOx4-7Gs;mKoHRJ?oV8E>COXu^(vxq z;{WJrZ}9DfFLv^^+mCLDARhN7>QhFw=}CG(5*)Z`x>xfPB2b2WfA{2H#ozVj>Cw6A9t&sTk0KZOsI)4l0ieS?-)5eV zSI~fCW;XS8U~OJ6jq@awqxaYLJnD*wR{2`n68Md$)2PrL0YI`Z%s}`$`dq`fQJAGX zUWww&%mWO3AP`4WeeCGL##cw-!3Ik}_^gg@OtC7M-$j0*62sM)vs8;2-DL;I^v2lZ z2rvRrzn%b#A*zkptMQ};IDQvWiZ+y}S+3#fI|sITYkzJ*3yAu>(U^Nx6ZLOWcT8QC zhv4>BMou7r>h-J)BQO}*$%U?-f8#X3ErNza zZhW>y&P{8JoIlpZq6XjQn(Z8JWdcx7R)x2frZR2oqkAg7T zmgwql#vG;?FUi8XBa1E;jdwO=wGCF{A(aO6qsHHf^-5xW`J!6L|ae39+jjAT{~M*maA^>#%7+#y(A_igTDH^-4@mA&&5% zpRXk+G)8eq-vK=LEJwQ=P7=q;eZU~{DBf(;>L}f7g|ByX6z{{8AleP)jBNIDF*O`a z=?yE-%7ks1Hgmt(R z(0}LJ0rUdMw(1LGO2* zUMSBnY1_#Gqzy&^!vbL|Hi}2qHw9C`G(v)$r@JI=o&xFzD2`0`X|ssBpo30q_`_&A z%CS<*k^91gu0;ZBEkYE zA+_b6p!*I4SGIV?oCmB*ffaDvGI=^m8XagxxccLZ)y5VJY1_#2w}YSJp-oaeTKdfUD?UKF^F)kO2)}x_)Ug)$;?)$Fu;7z^Y$PuiPe)w2V7q{lvWwGXWZd>d<+)u3MdLHbap5?;}{^o4vxxC zEaLaOKk6W1Wpr$=Ve5tMgAZjm_KH=;j@IZ0R%QRLD7m1FVR*{*h*jctu<)EKQ!Z(Q3EBb!l6MrwsprVr%USgo@+|ye)b7|-sNK#xu{s9yIu50 zL$XhN4^qsf&nAM_K*6uzq0dU<-NJG_<%5+V<;&T_8PLtvuuKW*T}QC3GTJjm40E)vn#y}FXQUGCSg~&1~>Tl>}6vTT~G1w*Y=9f z+u99I2wF}4`wSd=@0I*>{%hla^~gH@v|>3mtl`^iaV!}~@$k}h2?*3czW0u8~I14JmF z4=_>V*%ivpZFmv?QF(f2zx$ClUj4I}fSrb()f;zxgJ>b02LqVT90y~62T*$;zePJy z3BTnblw0#pITv_io6Us$!#Q@pMAa|c#TI^1g+4fomwWskWT-oO$9>%7xnZOKo^$p= zO!c)V93zdq#%h`Z);Cr*1-KwA2A-N14ZeQ5ZpM$~&-fYf@v~PKyeYg~d2McE`3wQF zDPr#XwjC_Jn9CiI9Kl$hmw-Ks0;|zx*eJ$Q+p;zrTi))S+6in0$$9T4xUziPd;S!Kw(l= z6uN?-Mz46Xo_i_>f;Sbuq6wcBGF6cYoo7D@r+wblXAU#pWPsl>_p~+TyFj`+^6>wa zUfV#9ch<_mKiNilj63v=n1gGR_+t|+-aI|L=2_E>L&Xfb^9*bJpfB9@689s@fa^!^=<5amlV(ne`ahH#0tcu1QFNCbPv>c6K1g`)2 z**nti_Hez@13>(^(BF)uczo|})!jQ?>i=w-vy1Ea?qU8zC;d*%LTBDlak zHGZMM63auxb;-#k$U>oWb(!Exw&>OMG%%GY6GxhXxRJ&-z&b9T7@6kSe- znb0ZaDH)+;9`bP|sC;kJjMk&kon*{ztnUJmxNpA+D>sqyoyya6>4k778Xo#tDAMf~ z=;)OhVLF7(^P1xrd25xInWkRyv@mi9vRZG??fe7n7TVUrv*gc>@SVd6d(O>w_bOPP9~Hq)?Q(C^ z#^^P-DxSJzmH`IzY0%Jsj|LZd#(Y=5NGk2L5DRIU@ilig6?Au#Kend-5usxzG?6tj zE7KS3t0?1)kX`jp=-7|^(v7PvWHzkRU7OG64lu_X{C zm5z>Z%ZWcts#Cfc`JYZ`F4phRPl%lIl4nMYwf%_8nfGBE>8{U4H^W^Qy1Ye1sa2r z?|r%!S6{^eG2v99vkMW@-zZfVWeX0N{1)1El8eHwL?Mvb5$E$k8tvX4UZEnOR+9wc zLzQW)i~=c3T>YIL=S*X);2S1#^}0$~|o$-WT-k-G@b65 z-w;ndPFgP*Ka)0Z^1^O`81VW)%=z~J$*YXEt~oZV$E+i3jZAba-C0NWt?W;ES#jg1 z#}x3w@nJCjs)66(kr~qq#r_x73m+fEj-mP1ECOoZoekm3M#1H7uX&F3bbA2bF+hkF z`vDWR7eH6Hl|y|EaVR$T$&mwKZ1(h-RHYE+90Rf|i~s3A!H4OULNv?dkT|DG#iJJSoBUfZ z4|PW2ep7rg&~E+Q^Fr(-!O=k(w1s(dEi=dG=HtuXiVf-E{i8WQzc%-w$gd+M#lQoX z4;B2b_)mvB0=djoJyw38=B;VtsJeT_+R^R4k2-Aq7nvuNFAu2pyburbC0J?(DB>+C!GzQl0RZq7eCS{3tfU!^UODsRXHXqiypVuFi^w?!EwM+;%ACh=64mR zCC${K$rFnMz8IbV?W)~`n$KONIIT}xZQeTj)v&=Q=l9jl1JzqtP=w++v!UAfhh&}@ z#Dm;E#ep4!2-K?BK73=FSo2zsijggefmfTg@3j*5|~e?gS0k^^hyz+!1h z2h7znIk52QgC5f=nE-GiL9L3TS~#n6S!Fxn4<<7ULYKthrqMr}#%ek5ZmU_vMe3R zUlgY&H6qfD(ucS&*)shqKq-QIjG+dhSqYS^e_J@v(6E5NN5DjnZ{tTX&ISS9`d`;- zD&wI?+3+O7F=qut*`Vf3^}={Nd5Kke6|w1eA-m*}{!~FR40(AEkD*XKVy+g8hE~N} zBuZ4d1U1}5|C|)IeTB#PxPLJiJ`=g-)s&M}Xl{;vaL=McKozCT9s11UyPnbuX zWSc)x29o5EW{3lCPl#A0=B$tnh7Q$3t1b)m08qV#)6T0-aw;Tn8qSI@C}JZM*6b*u zBK{HF%Vz9KJ|lMOXYLqGy$3yUwj;IGJX7{YFWLq19~FK(p6Ie!q~{4cp+3n`SAp4WbEs!)DC*n;pQ24w z?f{a|YD%<5o?P{R668m;hTC+u)~kb|@oLZJU`N=9Dvp{z8}U}8k;zj%#}Xu>RT$F; zSINx;0KBM1X^}9E+AD(e#;XJolHi-u!!00Qafnl#f_y26)>I3|pNvo)VqBQB6vk2j|u26!w%h=w**;`vvQ1rNfLPwSr z!{^zn%t1oMsK)FoDsds&;udOBfuK9Oa!N7xx}7M*^5vFOJ(pAa3GhNOyojKFn*cAB zmp^PR@3?}<41*^ehNrOMX=w8coHGU%7ugwVrj8fAi%`qcC}&^O536;De5|3_rNdlL zU0v!D0Q%7$$ZCL%O`DDpjGi{A;fWT(LJV-C_yH9v;lLy!Xzw)Y0|$D(F+7x`gxwUY zWO7u(EO;V7GJ^w+6N$+bUZNa~n@8dFp@+96HB7)IG{hdj`KP+DL@M;MioaDdE#q&5 z?Yy5A8#pz$y==E|yEF0-7tul8Th@tq`UlZcR86T&Y3Cr?X*GfM^xNoD4ARN73H$0@ zwI;=>!EI-P_h&Bp)h;L3TG%72z5BvVIo%DuU9;u@O&39{R?Vb@ux7Aatb-0;2DEJy?JaBV2 zfYzYa%{x2Yib$H)T<%!qaCL?`&=?M6F8~?K$*)ipTZ6#c(Mpvv2A{P5T=Rq~m5}#p zubPCXitklL#N^(YR|^Axw~7#38*=?cS3&bAItQ9K?N`L239@L`De$zMWE^0RmG>UM z1~7H~=_gL`GyoLzrcNkV^^8H3MI%zE$f9W*?|P_^3I}u}%7)Ajd#d76e39Jv2)E0||c^Ccr2i#5)%NGXE1Ybo|$7lY{zSXu?{~7PZC|%?{ zwxMNggP4Fil->C5$^AcfPOcE37#_GF0qi-A`uq=VKdo)A0I!V)e|rM5M}w^;pfB$l zJ$Vm4ziV^>K$g})T&5o?0TR%#@}Z}^5hZ;H!`_DHVU?d;+W zexqdi`~z7Ki@pw*6N&Hl`ummmpZF?pDg~}_Y5ib%X!~B|f1E>YRnSiK-VOlN^&3<; z-8DCh`Y_hIUubpW@r5!+g!yrlV>DSjhXERiR`fGxG3|HR?VYK$k$$x+J!k$VpXszZ zar?>%iaml|wD0}9eJhMpZIKt1Rl8j7qAdR*J<(tn_QSB52PMNm{dkadJa{AhVZ{>4 zmAL?@e1fg9{dgiLSsTg z@{IKwvdb6I-3_pJGk5Hr1(DtAw%CL3MH-*j=d7%?hC`#0zUaTadj4_-rm#G&&r(QI zY!3n)FN$6-l;{e@P}?=|&GEWiAhcZ!eWcg}`m4MDW1C%N@NJ&E={mzjg@(c5ohd;k z=?REyyc3}E+O*jAxtQ8kXwS~%z8!vrncp{fcV@l=l=-e!OT_kX0M))ck5c`NxHhc+ z2LU-GfdxL`i@KaC+CCBs(voEaO2IXmB7~Wuw(o zWA}Ij73jR6L{0n4rdp9&=;Gey@JKe|2pT5$2|vk!-Dr4*VMdK*Mp<9YPoaT>c&eKK z)xxja&su?k+aqAJi1dRsQPoxz+BKc4`jH~6?4(c3C6KeX6N(iB_EM0G9C#w$U>uD+#Od82dtxgE`AmY- z#891lxKf_xyiMjN1}8NjM$xNmDWnM0Y|#gfQ^-QZ$X+(oOV^$c-P}c`b2|L5Z&j+a zd4ujdwWiChY6s$b=AEd2P#0!ton2K9(unqWxY!`|bgW_QDb#uDh%K?AY#Jq7K#@k^ z<}0Hnwqwzu4U3ewcjMu6V6DSct>!=IL(`~y;m5z#A00N5v*KYUlc>Cei{Ma{q3t{S z1jBtQ1{OO`{^M}&0wCtp2M(hzt>Zy=#VGX-^>N<&Qse-AHJ1C9`VR?o=m+NazjyD@ z4etmjsRD9i$?o0hPv&x9pj?&K;gt~s)?i~)&#CB%!F|Jif09(tmghH+pIfb`H&?0R z8h|MK(wK%lFT5i(-eg$tAFa6+Q9`&kDMr~}CS;hQ@+=KXr)%5e%K@%RgiW!kg&b(i z?sdw;G_GLA>6%)r2J#W$jcb!y^2zoG>VX7e zfqvq${PMu1=niPnEbi-UWtCM9}oK^`4n65epJJL`Uyxf zhkna9{w)MLA%e=f{A~MP$6Q`l7!?&riyMD>;h}=|kPSWLc&M7HpYwRSVrXK`DV+;V z>w{Xp*Yr`}@rq`|P;*-Y^R&G>{RsPw(13W*CG2|_-a{Djce~AR7tZgsXIA5jpL{lY z|KlI(XX;D8X9gFL5Pce)d8y}R>*aCL>~Ib0zq%t$=2rzB4V_hpC5}*($?mu&ugtjlodz$CoXU!N0$l1ER5SHk;X5U zL45)I>J3;bO_eDJw&C7aT0eYeGplUqy`y~DtbA!<|Bpp_*#FGsJMD5}nZEIV<7a^C za`CRsXHJ&cbF7w8BfR&X>`ye0hxZBYN{RX;^{3o;K-^&Pxd0XIxon|15GDHlj;8(t z@a6Evb>d;5ngoC*977R-YmF?Bgw^C#fQcM@Nd>KhC=D0%GB_xG6{QsR>xCavsAjSX z70OB8d`)##diJf+4gsDSY7G;D3WJ)HhZwO`=`Y-DtR}QyE|d;&Z%f1Pb^*U*m`s4 zww8oX&+q#cOzmht{-@-6bCRvoL;kL*?SD7zGB&brp6W~x1T>_Nw;Qh~qOU!>ZC)|k zIC&bQar6Ac@JD_87tM!%{U47&aKE0BNwIaTV7XXNFu)+8!-d*5B;?+`8v+K45imsP z3S6M^f5HU{Cw|-_@a8s&BL@!sAM)$VF9;;^kBANL|7>)RJO3X1ckkoHcURvYJ$LsO zZIIa`r~dta_VwT2-=F_~``)1ApFQ5ls|_idu%Uw!$O>&VozC(KG@m5I0S5?oiou5) z92D%U%vkWnA9r9g@kE^fd+99{Tg)pK7h{z1M1AzBhaG(Uq2#K?Fe?p+J@_CaG@}|* zfsQ)TAgf1`wC%t+!Q571!=*i2V zG*m1?8|)~~q z^l;sZRj3kOx_G_eV+6?VD;s=L*0ETzfB|EPfvN|^5} zykY`2zM;NvxKA{t;e!k15sV?Ut#P7ZLI3Msw-2OAuvtktQ8l1pqH5qyAoJLZE0lP} zr$8f$oGS+(Y=uPw%8LwzkP9U;!3RsBNL~giVQx9rIk}PC5w}Y)G-5?x3Pzr2ke=P?m#Q)&eLtOGAl$c*8DmA;&gYN{ zXkBz-7jk@~9Kmpcn@*%hWMnih-#BCn*jY8KlyCys`^u*}(3%LPsZ@a6OG_!?kAJx1 zp0&J(A>+BUrpZO81=UL|{lY||Vv!vsn$|6t0KAgTFlb3dQMZ6(pZx6MAAG()HuUg$}eh73|DR~rtpmQ7X zxCFwBa7bupk=IQvGLLpZ_8<6YM~MW|j(-?cE|kT`JT+UEc8szpeSAr1LtB(}#IrE# zNY+l+(LV|PbT72{hckd-+y8$cjbMmXsu6o2RjYa#;B4?B)p<#*wgtG8 z;-xVYn1D~J`y8=lXLuphV0DxGoPShTY|O1r-Hh9;h*2UP%J|1`1>)ZJY9n3p6^Lz} zp$u-kL>u|t??3wcU;gITzyJ6Kef`^xbRhU2>G%g`brOwjbmJlkrZ9pXOyTopIH^=X z0~CNTrnzcZjUd{R*|fr?EM3SVivgL8NR}1QjBCXp(~?fQwO!cA7-ud1m_W9o;)@_w z#29oC$)+%5i=aUuN`8qPnEVeiS|rL*u4f zqb>5~41~D?9{4h)z04I!>x9op76Au3J>)J68UQj^2)TkcysZFgc4je&K z5Ug{piAU$B;Mmr+9@G&~aFJiXBm=(|v_)Di5D{49)vta@u)7lMU!wrp9QZZ01>)>e zKPB1!pmwRTEf7qhrp)?H@}5W377_{RtM zZGn7qyWjoxH^BM*EDKn`11?kEuJ;0G72?|A6VJ6=Lx6%0aKHj#Iru+1?s0+SyW^%# z_(et@Zj@_4<^LYn00&(Da+q^q<=l2RxM>b^o6P*<7U8$4RsQjo$Nc3Xm$|<^zVC$Z zTtB6`sWJ>N_Zx#4Bx`oOPU;EyMKyb~t^4}?Il zU?)58BPr(!0skl&#I^8{hhyJ2Tye+q{p0oJ>kPo2<7SVW(bKrEMVtV$&Lc{`=dCi3V|me z0iP2H@jE)w8??+bw2-5`&1<{Q)49-#Ij6z7q02zd+rWd z52%0;AUnpkfoB@p(I59F2vR&&CvvaofOFxh^IRxy&qu4fdE4LCXiV`eA87M;;5QsGV zhcz^THEhE*WW$%3!=rdZJJg9hWWzF~!_pJMz#svE5JV9WM6O7~9k7WSsDY!Hff+Et z+W*-&4afiy5P=X_6k8jOvPpqjc^A;wipq!>20<=anSjgjAXV|PTk#QjVGzZ5GY1(B ze!+kfut6Uyp;%E943HOEyr!|pnGV5!}V3ef1fUAwaw2mvU-yc2l=ar_5yEXNnffkkA*qo@HM;DLYO0d^FKc6`Tq+yQso z0esBIeEf%fOhkQ5#CHTpfpo`rEXabKM|W&Tg-k?vT*Muyfq#6+u6RV7a74dY#CN0t zi{Jr(Oh=0VNS(+5k^BdYgv7+@ITY}KMUgmwVw@Pj03etGGGKyQ!GRQ*$$n{*H~(OQ zElH#a$W_fnb6xSw+J^ z$|+{f)wz94mg6(aXuE90uzA4e}F?7P{+8y%$IOSbyP^tBuJkiNYLa+ zcI-%w6bOIhM~+-gd$h-e{LIsY3xHhBfMiX9aL9-JN0QtNkPHit^a;&OM~PfSbllC0 z7)g_~9hLL6CkO#?sWs6_fkWt}SGt7;Vghftg$d~ZIp_yUZ~~j~2UZ}1!vFAxZO8L0Xlt_IH)7T_UxS-98NXUa+Q_$=RH3d`FWKG>1 zP7}FOohV78z(*~0NRqVD-n>maHBLp`i9n5!LOoPM_02>r3o7l3J^zHm5tu*y11NVg z44{05ejtapq$ZlgfguP6f7pZd+=e;&hc`F`GC0y_00nRGhiT|0GDrtx7y{_(091<5 zTYwCIXqhb08G)h$`{X5mz$x;vN+8gITR0_wu&WLrnpyIPTR2LaSWo#(&_ni;;REWLP z%q$?C1zIc7$lL4zDDVIsKr;Mfgnd{Ic}anr0tE?3*81##BMpYIEC*z;f$Cy_e=t}b zVE`u}npt&%bO0j8DvjIZ5uAG-kp zP_-i_paVG|i)(R$YS;!R@De7d4AD6PySN9-VazGu9Lm^(ZFqw{@P|5Zf^EYWas|)msL5CddGSBOrrrI?^4v0Svf>exL&5+Ha{e|QFe0ENpL0%Y)p9p0H9b^;6-5i*DYznp>{zNt5m03av?)5WD- z*$OAvC>_w5VCaWiAdAcx5g>I@&_D|qMGScni^$mrYUl@F5G=*O06OTLAxIMjU;qx; zmjwdPGy#zmNLEZ0gbr93P)&rFIsvP!104a?O#d(`uS=M-gVH|rNZ35tc}&xdRMYz9 z*_BPm?Cs>zG}Db_+3;0aONQQuJ&H@l**;axmwjd2yo>prWm=x)i?HRcu+rPC-sFst z=_TM97)N;YfUjV@q=Fx{0Aj^LWOA4W79azCK!zAVUQNXSGMESUCERqup=n*`N2 zcww%^kkS}Z0u31;c!qNDOAVz4Iw*%{=$055;wd?S!tDn`2GxIf25bf=$`C%WhndPf99B7lR6NndJUo7QJ zjMQZ9y=5%@*)dhwm%ZN9ELww<5lz;KP8L}*6!+~mqrhu{&}&Am8qi$C9%#;{O)8Q>3&wrUc8ySz0#zqS zW+P=Vci4t!@C8-?f;kR`OSpyP?S-4{9I?oz4xrl<#+ekL<|)AdS4srry@w%*fnWgX zYtb1PMuvX4hi{k$lWrh{>fIRl)Oc;sb7D_g-C;Sv2Ud6~C-4S+5RlG6lYQNX@(CHk zhHfVS=One4Hvk0>wF`$9mz+t~2LJl8UGiZ%Fy|rY09SI+y9EMURf>5PB8L;5DUbmf z$N?I70gT-N8R*S5JjWauM*|jXe%#IJo!Iqd+1h+%+f-$nFy96j2rB4-e~54%i0}!Q z@Cuhl2cPh&9_5#qSb;>%kHl}1d}`Dj;IXy{b0qPfeThfx-{Kr_f}GM$mRX48*-5_N z18(X;?QtK63j_|}1uho8h8BWQ0wth=5BuyTtR46P7Baqp9cF}d$OI3*sY3u3I{1`1 zz6B>3-5A*7;55CV%Zf*ufd zlGsc|+(#C_;O-vSXGCfE%UFC~-GKUy;a+i@F zICuB;37fsxsouymWk^Lda8~~CK*iH6wfCL9(|Wg4d2eNXkM;sef*(MG5GW@~Ee#lr zp{u|ECWwY0HBx+dp=SUB6`terF%!@}QlM0d@sxl$1_d1;l@4Hl;=Kj11&fA$=!S<@ zP)Gz;@J}0OH^Qf;za-S_$EGsPxz-nk}bzOvi_> znfeit0|@}tZra6k>VTW-1^KLlkdN;ZII<=9hadQdB^Z30NP;C$f`34QizxP&5OxWl z{8Xk#a5wf2r&x2pc6#iA4gUuv6ZUZjc7Y)M!B2vJK>eLa0@Y9ay>9IAWmWkIw{-9Wwc&WTOKFKK?RENaQaV9X`I& zk@F#x&z^fvnVc9Xb}ZSlX3wHct9Gs0m@!g3VY7rS+a&+&{+pX*Z;~Z*>53K7!w8Rm zLJAY^A$Ty4!vA>mpfXl+53@!pk2QkkpOJx^|Di!LP>EP2q(%SxarZ7>)_`BbrrY}L z-+_GnivJbOclX{UO6H=DO}2(`v&4(fC_Y>{^X9LAB=HdA-*o5JugB~_hulAX+7xUsf8@w?!12#Xx^iNJ`5Hp!=|CVzd+qT@Etofd|Goi11~&fq*t0E$1@{L{;T&p45SSS;Mo0U7g5bxSb) zOw@rB1v+s;K}Y;UjSn%<^wBLH7=;ug82A9hQA1&%o>)vEb5A+gxN~4I=*@%yQhP*s z0u$xj^U^;oFhNc^KmftYfd~2m5mJIMAjdZScmtM{*YVlsST~$7g`a9gQJZsx*5;R? zum44{*J@%dibSD>vLWdbjt-isri9wn=s!`ACBs?AjYS-(1D$GIS*Eg8!w#>dx~Z(P zCNYHyGR>N6Su{;SNiP@*;)9Pf1v-sJXX22;A=KRSPe1cK!vqtcywQQM9sEPb5!00O z%`>bdLIw*dFpkIsfx5}txOR;OaM)+kQOFPj3)95}xu2H1jDg1~U=Wk&ZvkOBb(Uj05E)05 z?xM9n`LIw50WuN$LNNg9xye4pG(qSx0eu1nC&)xD8B92Nxyw1JUix$$F!9e3PAqf- zt^>tjdJIggJ|6J@q}OssNDh=c`ImQq0p_@ewKDdW7u3PZo&PkQ<-&_)IR+PJA4B>u zUT*^I^8rp`0EDn~AS{}rTK0Yts3l|#QwtnaYdZCpPGPE0T@#B25p}jDO#f;wmAVTX z_7cJgqA+iZQX5~=lAIL6Fot|W!Vjnr0+GnjIzW>W&`u{7K<#QE6F5N%MCOA%@hpA| z!GRC1wArkzC zm%cFaaVumYBs1yBPpSn8mAq6Bjt~~kff6=>JWC(3_r6u4g=MY8-YnOGyBomrhkT48 z?qXLdvALdda+xV2rE*h%5|ko&v#GChJT zGkPg_R%(&iq$h6lsjGSdW>NZ_CfGKq(4Rt1lt~bc5~dIV>SPY6N?j^b4+^6PJ`|#a zs%8kQichv#wQE`xCp*_^n}NjCZY)h_JHM9Bw59V?UgajHP|8y1nDuXtN}C8(1FCb1 z^n(MbrX%lpD5?Thh4QqjM%BtvYN}OlO@l(s8_e)?VMb5 zsiCfV7L6A7vy=R++(Mfu<%X7p)3oSaRd`sOS~j~g^h*+;paKPIH@xB|i&+xT{beFGJx5{cR+kr&ExK%_?@RI0QnC4z#d019bn-UmJL9>jR1iXl%Mwxs zcX+VN?VFpY%-g@@mV+#<OF_?5C-Pl#X9XtQl#t+QoHAo29~hU#?kLZRdQXmMg{P*5WPCx-N@95$WsHB+|ZjHp8xq4MPN@rOp=B zvVm!=>b-t2%wJ~n21oi{cG^{K7;RLLOdxUyS2JoLN6PqhJvSANxE#YMEYyOHTJIi{Qpmb#|8^x;ldXNqHu!SQ^RN}11QHJ z28x=6yR>Ppbw4~;GLv{UvyLu*QN!A<*;Fs`^leEwir3$!mo>m8Fr?0AsdckC%dGWl zOp$EwzRuH7Rs}1gXWT)+zLVK+MeEUPtZj%xy)3wy6~Y0dg-n6L3tlKo7aBfUFn}SI zR{+cwuwZtDa=|QG9|IRIK9H*q_bjws@{-*t)V<30o5HOqr0KSEjAD3gE&VD=-8N~| zj7+A7S767zVUS)cfg zUs>qjLGfS@wqV8m!x#jic6nV7{zDfK+d!0`Sj-*;Ufl+|Mg~37Y(&}5*&2pTilrHu zk4;L9?VDKTR)D<|%E=bAAzNpSApforT|J!*8$^L(4a62~0mYSH!^NOjxWV&1p<4W* z^VQ%PNTC&!ffZPw6(W`$T3JfbU7)>|#HFB$y&%DLK_+U~B~~IRW#T1%!3%nw^X(zA znZfg+A{XQ#S5%?5vYQ=;)zBzjYQl~V!cUJ05IeDxS`N!nZC-)b;k;mx64NXlVp z0jMaVSbTvS{DU+8VKhFY8MuKPoZ=srg()&)!%5>nP~$T;V>m|RI65OUTB9M_9>tZx z1LjRKQX;w`K|4(oC3Yg${D9$!(r))S|@c9sj_w4d<<%;qlh#%~mb8Uq^LR331*)l))Bs!5lPWHG*R| zLSs0ZfkJ}gOCqE<#w0e@q&1!*Gxj7nHY2f#qu1#qSvaFO;^7>mT^TUt7O>+#I3QUt zqCe)wrt~9KItM^j;_*=>S6au}abj9rVjvDgIi`hKdfhcXA3CDr1ZH5~@Dv@|nyh`3 zVsYD8tp+?P(%@|vH!+}CT-_W%ARj(sVKQX%!5|Ed;!Tz!3>xGg{^UOp+fhE@OqOLh zdgD+YrCCBIAC_Y@-sDS`WnoGqIVz-CVr6PlO<2ALYqBQn^b7`9?!y`Ak{-5D@tNZj&h<$gBd zYx*a1d;$3lC=3=M6uw|jI^RqN;$mLoX$I#vW+Q`kV@<+fOj;;5V&g&zHyY+=o+5+VBxZJJevU;oievK? zr5zAvVRGX)mSOhMWfO*CVy?wcMy6q2=!%v_ zc}gfwQsbJU=KpsVS^9~$XDOe&HhDuh~TabUrLW-481X{Ul}Z*E8KB{{j<)iK-jGo1!)~I|oX{ZjwY=Y~!k}IE(pZJ+6S(qXqg6AM6CS@`x zS)K)2PV2YQD0>>}VXo&;Ht1e348KwxXm(rxqoCZjHCLQdnY zn&UtKLf4iB&wlJbgzj0;f+)}eE&K!Pw(aY}?#RAiZK_2kb|{j%tc;o|(5mHqHt69( ztN%+%W8i{j;2Npr8Z6&tZP8jTnKCXR8fn5xujNLs?jCGm>MX&U>cJAF!lvn|8f9oc zsvV?l*|IJyzyd9#Lf97O8i1oh%4-~$E?LAvEc^r6j_aq!?*1~Bxbn@)_9l*+Dvj=8 zH`*yf`YUDj;nSMuhN9*1GOf0rY0+M0r50~XGOS@1Y+_<8!z%3sM{naYFR@mz*YRw_ z9;EW-DQd1MTc9s2xPmME11^X~Ae?EeK4FvgtgOVDQpGL*0&!FQu%A>ZK~5}Mh^aQ_ zE@<9uw7zTADr@5UXwrJHdp<4&Q}9?^@dl5s^>Xm4R%4SgZwQC*2xo9hjxpsfo~>BW!Yj0H`nK*su&ylN??JNguU4bHKI0tpZ4evsAWk)R@YZL2%BbK9E*c|jjzZ(&dazhvYvS_kX0kFf z7VPzwWeBUW(tfN^h!!lFq5npJ)GV>!4 z8!b-_4I*+jYqME^fgq!6t`HlDhJp31DAIN#tCkdU z1>-V)+Oi+s^Fj_T)}rP z9E^oUmxb&8L)w>EXZ1HKU=I(9xb;1vsG)bwwknLJ|8j< zge%a3DmZg0q=H#!^q-b)Qgd`flZ7b^L?5q(KBn|s(=~ILolA$OB&)@kj)fPHjrQci%ITk4u4W2wP?PisC#^$IHDDAnjh+P=k8wXc?gFcEE8DV3 z?Kb(Rr-~ueff-#SUEIc$|r~>QK0v^-wKgc%Ok}V&X!v9ydwpe&IUGy|t z6n9-CciTqa%5H%esj+N1wckDZQp8S97M#DkdzC=4p%PP0K20;^Y8h zZIDuKT5xT9FZJo#0U(_AJ=6EcTC>28FDqxQ7Qg6e&#@~2LvEYJHvEG!M1wMPv`Bv~ zBmhGBLbO=WFbw~L{o-*f#Bf{xgDa%=M`udIy{3mJclQl(h(itldox*3Us{~@Yq+nl zqN+{*B;DR;Inrz(g14X!>EJf-kOs3gQeRE?Gkmj!M|(8t7I`xxxihZ?*S>~({{xdh zH2aDLf{z82tA#eS!#||MS-6KbSov7kuMFQdEyMyXfOYFi^#5Cn1^#Y$cutM}k~pZs zdAWk;8K7erq_}c;v?`nhNHcj_i^UnVc(^)dyZUi(7BWo&?sz9OV{fOdip5%!?^t+3 z>f$dfjPzC;Lg+pMB+RjyXZZcnu~@_~*|IJ!964P8L+d)jKp?m>tolF1dRdf%HkgGn z*m{A>dM)HaT08w*88iUL*4H&EAM( zv*v)oZ5p4SaOyv8JHh3-SSY!gi-lX0#kr$J9F*fFs^S-H0Xhn>H&bYg24#6hVd4(z zqn<7#ICH?Ox$5$HA6s;N7v@?+_-o{Pu8W1ktA%^idjET%g_pznsvEmlZ~~_fL?DFj z9Ju>gXY^QvK^$Oo$)~vc60%0efeo83Ck%vun}y7q`H{N<{!aUahga6o#nzR(S?qAR za_ovz))!cNCXG9b!8MAjA_WeFY>UO%mIW-B?S`j1S{TA3U^b-^Y(Ud@T7dL}uQ}_Q zg1VbRZU6Q^kb+yg^&FdJ9F(qolf|r)g*I$CS=0kNh($MuMJ_l)E}TMa1pYt>`&f9j z8@M~5qPV@5Zb^6jKX5dCn|E4#gEkQOK=e9nlSOXFg3PA{v30Xp47xpe!O@>Z(o_0C zEHg2yd)mi&afCZ^e{WhqyjZvgbBum*nC;SMc>kLJgSwZ6>w7wEC^?biv8Z#nS){Gk zmhUpha4WO|*{Xsoc*53Fsv%&j^`ixX+d3}fg7$TlPh`{@P(eY<>+CO+iT zx4XCUoEl}2dMD6hH9=!*<3Dr6<|s4+L?Anl{{6#M@Siqr(GdQ7_0LqnSPlQtsz?!I zMvWUecJ%lWWXOM>Mj{kd@DxQ@Cq=e&`4Xl_NS-{2g5~mNOr1M<_VoF)BNm`MmF4;; z>tC&Zz+TpTm{FOws8chh`UmS2ETjc<{(}U_5Li254H+s(GNY=SH))-0Yq6jzQD_kY zs{7APoV;%E^37Y&FG4$Z?EYg3Yb`=j4*v@RQ})kjLqG%z{|gj{B4*4D-MF#i8T99W zp8@gJOxR6nJ9t-rcI~;~>d~WHxBh~cqGvOLK?4>o8aG0|!7;*iP1`OfNEx+JWQyw` zFt|gh@8m+g>qeHH-zE{w_V zSI~r#8d`}w`lrF4*cI3=igl>EC#NuQ#vdGbzT#c_I0qd-@BgJJ6-8g;(_A?%BY<5Q3+SN;-!p!o7 zlawGiB~+2hqDYm33~ltzQ|uh-po8!9WF=T463Ls7+T)2Sa_;P64Lj62nBkHL{;7)& zy}+Uio)q>d(}GggGgF~B`v1ZURW-W8i!tc*f+8{eyCMvp{k!m=E9Uq|Ib;$#lOvfi zGJ{TmLCVm$4!13iA|yr3_OYWrjU$l%Is$iH;Y8~#uyB1uQb^Wr6E;J0({|h2*T9}l zTywt_);DQcW0G7UMf-MIcw6fh-k5Nvb7+%jeMt;XKSt@Otr%8Vlme;qGvdepVF+1} zqyi?FgEY5pBSs^dP$f@F8J)Z9VroSeL0QiTXYPdR;tP_ya5?QSZrlAIFNDW=QiKvW zBr=cUSc9)Mzz74?f?)jz6;euxh!j#}k>ysBqAe&`AXCL_NSTim5fZqv_RwqMvW-_G zsMDTyY>aLbm&f~!yZ@hmx2-}H*iH!3s8&=CD_q&2bGT!c<)kDsFVfRGb`m{~T%l<^aa?^&K@wO@PIj8JoKL#2 z1&-KhRzO)!L$pDv*@XmmA>jfSg!d0HzzHKigUon1VwcL)Bo(lOMJu+LidcYYVhG6( z;b?@BeI=+NXk-><ao9xjZvS0-h_6 z4S6G*bR`%$PLPm`^avDpvbv3g(O*v6$-oNI4sEb-C|bBe8Ae%##{px9+@U0;O6P?N zE$VSK)QH01V*iCLm=Ysrh~D#lf;ye(5|%^Jh9?ukjrBpLObG(r5xav0-g$>a-kG6B z&}f*4ZAW1@NrhY>0ul2dWF{UnOu&{xMU3FbGGeoL_;Rf}-l&gd zs}?6iFpWh6bCHf#hKvA;?b{#mmvH zVU#}$X+gx`x{t*WBt9$yF3mX6mzWb58GS@$pczq*Oot*y1j!=|u~C<-!G$lhDNmG^ z5itxc4*5BVPLF92VAR5#aKQyKEE1iAR1+b}V2~L#BA^|Ot)J|CnjYm@&pH}(OIDLs zVD5(-+5Ze_HMydeBLBxWf)3JehZGhb#pcMD$*Zks<6j>miWHg@WDP4D>PE0oyOz8O zBXG*#pUhxVI8_LxOXJQMp4pM6F_D!~^hk5Q@sD(vi6X>YtWTtJPC#_+A3^Pi6e&U} zELdm@K3rAR%plj*_GFd2JrRjI1X9TuqF=R09!P3&kX9&VBAzhVDUkaQg%$)r?Q4j- zc*Lx*R#09VnOfa~BqHDLbAIzXmtgk^t~k0cHfU?7Mtlpcow30SlDmFf*MAlqY`YiMuU`h-KymR)xV0jAGOp630F}1OgD4fvt8m zk~k1;SDmYg*0UPuUOH-tBfse#1Le84uvx2a@~q!Gp@c3U4U5Zp6{u_MD#*UJb-!hV zGx)X@F5XD;WAq_$Cg;N7pR{-*lZ6S%S|aF=@b0z@?66CO(%Fz?79swb<{W|=pduqg zIR#NpEqv*@f0WiId#)7Dyl{pyIQkMi(o6HOl%q{4w=BRfU(D>Gkd%zM+Dd*K+~jr?dhW&hRI zJ@KbUvtAj^@nu&d?YHJ|Z+V_&4DTYTEZ0IxE1rvfNk)f~#8$(aI)v8uz z5667^UDucIt5%Qb6OU#^7nfwyUoh8^+c?)F{={|P^7>7z)zY$^gJe&3*>{0;bo$QO zO%a-Yq=SXI`VnoylXZOKv<1(2p~*fwkrRA99DZ;x|6#K*oS~z^%Sg)nL#fabYz$X` z)APnKV~?EOrZwIO%mDw9v5TbRiso`}dwcR`ubfrEdQx8dcGkdE-bC0+um6C7)xdVn z5usHlY_2X(S98DZpfxA#e8a2X&Qq<{o%f4Blm0gGDXt-O@v}wz98sL29r(cq{`27O z_l@W_w-@5sg;3Q6TK7b@xkeF21ix5|gMA6`?v#=V~uY%u4l~j=#=gI%vV11|!Mn zrXaSCB1{33gwFym5CcJ?@LJ;TUX3Dh>?azli6~+N^$p}W;shrS&|V@1V{O)cC*yo& zZG1=Blr31w&*bdQ%QCN?$i;5R<=yT`f$#>7M(;J$2CX*FuWpWyg8!q9G*0%2gS~b| zuH~8Q2%&uiPw&k!EP$euvGj^qI)MYf(g;^>vBwQ-RPKzBLfC#OI6B-2nk3y zbS@C@i3^X;ewxmpEUyTmFiWWA34ueu_zM2?uUq;jf=KbpI{)vyAi*ZOf);SWSn^{_ zJ|!b8!XoBkhIeIRj1Xdk0tPXR1s7le7d+uI zW)Ck4<11H$7OKf2sECTt0~QccB<7%N@RB3epmxl_c{-vD#9&T#tnGY)8M}i{KJpe{ zawQvcCC6axdZH$ClEV~JBb2c?6j2+AD?>VjxKt(bcK?I)0D}mnj)4r2e9SROj^D=UU^s#)}HqZ(O?YdU*D`u{e26H7-&S3m%ko}U4Rg!H-I)exalt3lV&DQ1#cd+QFE&{~}oMu8kH0dI! zvpGkCBovYr8=@@C;$P@yEGk1RVgn(;!bD9dKWs=ObgCiFgiOw)sSv_gA_9#bqB@ZQ z7N`n35aKxsf)@I*I~r~#KfCTH3-5wdGt>U;+VFfAdp5I zK&>H~YQ@%P#Tw$NfWad91z+;RiV7kSRR57#@&d@tAp2zP3~qx9Kod9O01dka5Hc-N zDZ&|m0U6x2Ag;3@jK(53)gTHYQdo*RjI>p!iC_{%CO-l`YqdJu;Afx*XK3qBI5ubs z(?48Qb5?d`ophx-!eC@a6k-LNz!D=wVF5WQPkI6^!bw9H!f6pgId6g?L3RwpU<)*M5A_vOfCglLVof^2F8?BMQ*}@|;uM7SCH%}zTm^D5 zA~9|vV92QJ_a8c~6<*;K;P)Y3VOrV#HB-E?)~JZ)}Rw@SF<#8<4KYYzs^(;r7}YVHej3fQWy13{^FGg?l3w{ zPeg$Yc_K{{@>gNPP(^}I3;!Z@Il{!2V!66w4Q?aGVB&j2!g4dB>&$nt#9$0`YnuE+ z3&cQ_S^_ijBQmt%9{vGPp-eb{jFtGe$b5Bm2KXOjr6G)Ug#Td<_QI>2uxztUGZRu$ z!L?G+32R{&4LvtCaKu5c+=0qmhTh!JwpUs8s(Vm=g6YIw`yry$I z*E8m|JNS)pS8H`_;v~vKc9x~6$V;tH(52WIO zW;Mtz;=p8KqGny0P-VsWVoBAK?Vnj6AUq8TJ&G$fL2$r_V)y5Kr679pOT53R(U5HCzk&Kl*Y9kcG@vRtFi#C*!s0pYjTQ-*@khBi?d-*zh}i1WO3e30sqq9oc=ll7$O2DBULN%nw+45TFYR=FCqt z4fHq3XE#kwoyf-B+B#0aWYHMRA|3;zGXud~Vy1;yIoyysGBUC{&?7LjLSS_#B9$qa zy1A4BL0Z9mr~eWrZb%j;XJ!WuhdTn6Ut)TLF;`Sl$X10Wo9!=)hnpt_GnQ{pnL;8p zVj>u@%^YV zOzD~Y-t7=2kw8%nN2r8;oMpUn6=Z!?am`|+x!F6jFC>zWJV=ReF#@M!i?I@0cp$7v z5s#Uk7>Qf!C$_3Oh}$P9ty0GLA4Ex%NC}s&Knp%X4Ay{7#6U4qJ0n!`#W(^B&db$Q z4q3SwFl5`c8$2U2ts!JVc^hMWp35R@K^7hY7dVZp1aesbVQ6}0Q6M}2tfXA(Yi}l6 z{hnLpcK>s&wfn!QQLymG^$;2x%WXi(C$8iOp_|Ren(bSxCH#crlWkG)1WK%d!WB}X z_fqFb6T3WLf*Da75Wm2OcIOLlr(}4ivex_`GN>e1wV5DPpnjgE5}=AB<+T zj3S5;@3x>PCdXi83WDNXMi@1Mm4sq?Ir6bS79&7T^>9!fIl{3zN)hlH)m>EQNrZWM9!yoVQaxgbtE~5Jagun2B`iD#dG0gP(C)bIgdr(Z7yye`g zYIywy0~Bq~&&$Lo74ar&mN33_Gb=f~J_^L6ZL02ary%-JB)pv`9IN_nhx=ZF@OFaS zcmEN1T8%rpc@1<1vGV;2g6e1bgCd5enbmVQUb5Yxkh0_CcVc4Bd9ooq5@$qnZI;b< z!f_q9xg})`OR?OA69txnjGcbWOII$1D_Z5Q<-4&(u7mu&28l_2LkG`vM+6XCkv!Z0 zNw8e*=0hEPj+OjA6G4x)z989Lq&+w3O6a|X)A3{_PQiyqhfbVl4gQ>UE-WP8z3_BL z>hX}5@-C%2iY8I=3P!f>><7d(9PQj(i<2nV$==vBP7qBK8(lldf@~WBR>a%bJ3Kx> z=~?8>4?%Sd%S9xv?B)@L^Xa0_2dR-phTZj?oYynip3Z0I3DM;S@U6!Dt-GAcz5g=u zDKA(c`3v`pZK!*rLClqIvh>vxil8X&8e(KnGKM&-+_Qe8&D}94YtA#SWOhH#h2$C| zUIyPwX*%RP0<`$AyfeJO<2nAT-I%;R6XgIO%4;3knB4Y+GLqBrt;dwS@~RT^tCF|u zx^bQ~^(i%loQ@XJtb8)Ok!~n6j})_8ZP^B*I+#3A_+wC&V9-AGX9pm_{2NGc3>Gv0 zz6?Z2kf4_{Tn3Jbh=m}-h8Qzy+{m$`$B!UEcIgtbq{)*gMJDv3@ZZRWB)^zZ*s@{G ze+YA86bL5FKQ}mW0{s_eDA9pHeg0hNMrp%~Pu+Ym8uTZ^sXwPqm1>8eoBxY$!ct9` zFf3V&3e9!}YG-QKv}eC;75n9_RIUlz5^O0oBVV{TZw{{%9P43Yv$;);^xnwLyI0wx^%}cTLzO9sL{*mEvQY)o=v+p>5(KYVl*>TX3&|y zwbD!|mpDU#MVsqz*q~VH8aC|JDCEN3>u&w|UGLAkG~2R0Us?Rp zfp5<;9vj%^N5Y2T8pUc?uKC84CFX`*k13>AU$zZ&3PGnp!pT5@Z~}-Sfy5C=g2g4M z;f5S`7+M#ob-_hM8G*=>V4?9QkQrdq1O`LWc_`zIvRwq#aKQPMRsV)s&Gc0mW)xLb zS}g_n)k41=ITlbD=O;fqqDIl z8PY;#M`M+$z?{GC?e^qt4`{q+p4naWGhZHF=ka( zS>oqafnTZDSXtU}#b--w&bgGB>M533v*^*sSbbjExfe!FKDixWNM*O@ev-Lapnn-f zsnHrBtucmDYlxcB7@#T@hH^nB$S9>V##rjU{C?yGz6oMckr$U{M6gw-nj-9OzYItE z5sWw$DRDv!y=f|{r$Q{$U}>W1TU8648ZCZuA!d`dbZ)z*dkyv3EVPo18K!=R(R5vw d@A0MMV5jMNE60J+$K;s&A=~mWsE diff --git a/img/architecture.png b/img/architecture.png deleted file mode 100644 index 6975438b31dc7b941c5b9f59308ab158fbd809f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98298 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 diff --git a/img/tpc-h_database_structure.png b/img/tpc-h_database_structure.png deleted file mode 100644 index 9df5b6e53d2940794484ad9100c40a1d04bb4d93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 351330 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

    LGb6ezpEGYsyUQKlt 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

    )n1MB{bil> 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 E+m+1+W6D+) zORv%gD~A$EhR?}`V%bfDob+*u2qy)sj7Ok-%ofEstU(oj#H%@gy~NZWRIhQhO(hj9 zRpz;({jgOi%|)l$2V$q!YkxZ(|Io}$&9=S8=i1*5t%7J%dCv0`c-emI8RZ7=nNh#7 zf1=8^=h6ILYn6Cjv27CdMF0`Si|}phVZfTi^Im#nT)hK(Gl{Ar61SRB zT4SZ7b^Er1tx61#N0c7gI>;ErG;igm_cpfMm)E^{P&L(jT(oK&uwmJ*Gc~cmk7~=T zGpwYl`qJcb21|zCMPPY-6+CF|VNH?)eben3`Zt`7KcD>H-{B