diff --git a/.bazelrc b/.bazelrc index b93a9e43..07f090aa 100644 --- a/.bazelrc +++ b/.bazelrc @@ -1,8 +1,16 @@ -test --test_output=all --java_runtime_version=remotejdk_11 +common --noenable_bzlmod +common --@io_bazel_rules_docker//transitions:enable=false +build --sandbox_add_mount_pair=/tmp build --java_language_version=11 -build --java_toolchain=@bazel_tools//tools/jdk:toolchain_java11 +build --java_runtime_version=remotejdk_11 # By default the JVM uses a memory-mapped file for the PerfData structure so that tools can easily access the data. # It will create issues when JVM unlinks the file at shutdown and may trigger a sandbox fault http://b/205838938. # -XX:+PerfDisableSharedMem to force JVM uses regular memory instead. # -XX:-UsePerfData to disable /tmp/hsperfdata references. We don't use the perf data here so we disable it build --jvmopt="-XX:-UsePerfData" + +# Kythe indexing -- for xrefs in codesearch +build:kythe --keep_going +build:kythe --experimental_extra_action_top_level_only +build:kythe --experimental_action_listener=@kythe_release//:extract_kzip_java +build:kythe --experimental_action_listener=@kythe_release//:extract_kzip_protobuf diff --git a/.bazelversion b/.bazelversion index af8c8ec7..18bb4182 100644 --- a/.bazelversion +++ b/.bazelversion @@ -1 +1 @@ -4.2.2 +7.5.0 diff --git a/.gitallowed b/.gitallowed index 0427deb6..6fb90578 100644 --- a/.gitallowed +++ b/.gitallowed @@ -1 +1,2 @@ AWS_ACCOUNT_ID=".*" +aws_account_id\s*=\s*".*" diff --git a/.gitignore b/.gitignore index dc584f10..24da983e 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ bazel-* /.ijwb/ /.aswb/ /.clwb/ +__pycache__/ .vscode .idea/ *.iml @@ -20,9 +21,8 @@ bazel-* /target /bin -# don't track prebuilt/local-built artifacts and terrafrom release-manged scripts +# don't track prebuilt/local-built artifacts and terraform release-manged scripts /terrafrom/aws/control-plane-shared-libraries -/terraform/aws/jars /terrafrom/aws/environments/applications /terrafrom/aws/environments/modules /terrafrom/aws/environments/shared diff --git a/.gitmessagetemplate b/.gitmessagetemplate new file mode 100644 index 00000000..0af0c011 --- /dev/null +++ b/.gitmessagetemplate @@ -0,0 +1,7 @@ +[doc|internal|fix|feat] <1-line CL description>. + + + +Changelog: NA/ #NA will typically apply for internal changes or intermediate changes of a multi-CL feature work. +Bug: or NA (only in rare cases) +Launch ticket: or NA diff --git a/.markdownlint-cli2.yaml b/.markdownlint-cli2.yaml deleted file mode 120000 index 8b5fdf87..00000000 --- a/.markdownlint-cli2.yaml +++ /dev/null @@ -1 +0,0 @@ -builders/etc/.markdownlint-cli2.yaml \ No newline at end of file diff --git a/.markdownlint-cli2.yaml b/.markdownlint-cli2.yaml new file mode 100644 index 00000000..df968a89 --- /dev/null +++ b/.markdownlint-cli2.yaml @@ -0,0 +1,44 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +config: + line-length: + line_length: 120 + #stern: true + code_blocks: false + tables: false + + # these are apparently in conflict with prettier's markdown formatting + list-marker-space: false + list-indent: false + ul-indent: false + + headings: false + + proper-names: + code_blocks: false + names: + - CommonMark + - JavaScript + - Markdown + - markdown-it + - markdownlint + - markdownlint-cli2 + - Node.js + +fix: true + +ignores: +- CHANGELOG.md +- google_internal/LATEST_RELEASE.md diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index cdef312a..5432627d 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -15,16 +15,20 @@ # See https://pre-commit.com for more information # See https://pre-commit.com/hooks.html for more hooks exclude: (?x)^( - bazel-(bin|out|testlogs|workspace)/.*| - .bazel_output/.*| - javatests/testData/.*| - version.txt - )$ + bazel-(bin|out|testlogs|workspace)/.*| + .bazel_output/.*| + builders/.*| + javatests/testData/.*| + version.txt| + .*\.patch | + licenses/THIRD_PARTY_NOTICES/.* | + licenses/license_scan_output/.* + )$ fail_fast: true repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.3.0 + rev: v4.4.0 hooks: - id: end-of-file-fixer - id: fix-byte-order-marker @@ -55,15 +59,23 @@ repos: - id: script-must-have-extension - id: require-ascii - id: shellcheck - files: ^$ - exclude: '^(production|tools|google_internal|builders/images)/.*$' + exclude: '^(build-scripts|kokoro|terraform|adtech|coordinator/terraform|tools/opensource)/.*$' + +- repo: https://github.com/bufbuild/buf + rev: v1.19.0 + hooks: + - id: buf-format + - id: buf-lint + args: + - --config + - tools/buf.yaml - repo: https://github.com/macisamuele/language-formatters-pre-commit-hooks - rev: v2.4.0 + rev: v2.9.0 hooks: - id: pretty-format-java name: Google Java Formatter - args: [--autofix] + args: [ --autofix ] files: ^$ - repo: local @@ -72,31 +84,26 @@ repos: name: addlicense language: golang additional_dependencies: - - github.com/google/addlicense@v1.1.0 + - github.com/google/addlicense@v1.1.1 always_run: false pass_filenames: true types_or: - text entry: addlicense -v exclude: &addlicense-ignores (?x)^( - adtech/.*| - coordinator/.*| - kokoro/.*| - .*gcp.*| - .*/.terraform.lock.hcl| - tools/opensource/.*| - version.adtech| - version.coordinator| - worker/aws/testing/.*| - worker/testing/data/1k/BUILD| - WORKSPACE + adtech/.*| + coordinator/terraform/.*| + kokoro/.*| + licenses/.*| + .*gcp.*| + .*/.terraform.lock.hcl )$ - id: addlicense-check name: addlicense check language: golang additional_dependencies: - - github.com/google/addlicense@v1.1.0 + - github.com/google/addlicense@v1.1.1 always_run: false pass_filenames: true types_or: @@ -112,9 +119,10 @@ repos: types_or: - text exclude: (?x)^( - WORKSPACE| - tools/opensource/inclusive_language/.*| - licenses/.* + WORKSPACE| + tools/opensource/inclusive_language/.*| + licenses/.*| + kokoro/gcp_ubuntu/kokoro_update_container_dependencies.sh )$ - id: terraform-fmt @@ -145,7 +153,7 @@ repos: - markdown - repo: https://github.com/DavidAnson/markdownlint-cli2 - rev: v0.5.1 + rev: v0.7.1 hooks: - id: markdownlint-cli2 name: lint markdown @@ -157,7 +165,7 @@ repos: description: Format bazel WORKSPACE, BUILD and .bzl files with a standard convention. language: golang additional_dependencies: - - github.com/bazelbuild/buildtools/buildifier@5.1.0 + - github.com/bazelbuild/buildtools/buildifier@6.1.1 always_run: true pass_filenames: true types_or: @@ -169,7 +177,7 @@ repos: - -warnings=all - repo: https://github.com/psf/black - rev: 22.8.0 + rev: 23.3.0 hooks: - id: black name: black python formatter diff --git a/.python-version b/.python-version new file mode 100644 index 00000000..9575d51b --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.6.1 diff --git a/BUILD b/BUILD index e2f3ad5e..4186734a 100644 --- a/BUILD +++ b/BUILD @@ -25,3 +25,10 @@ buildifier( name = "buildifier_fix", mode = "fix", ) + +genrule( + name = "generate_version_file", + srcs = ["VERSION"], + outs = ["generated_version_file.txt"], + cmd = "cat $< | sed 's/-dev$$//' > $@", +) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1e09d6f4..2f8c5f42 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,416 @@ # Changelog +# [2.13.0](https://github.com/privacysandbox/aggregation-service/compare/v2.12.0...v2.13.0) (2025-03-25) + +- Migrated of Terraform Files into AgS. +- Updated adtech terraform setup instructions. +- Updated register link to use PS console. +- Upgraded AWS provider in CodeBuild terraform module to 5.86.0 version and rightsized EC2 for + Aggregation Service CodeBuild. +- Updated LocalTestRunner to output debug results in json if --json_output is specified. +- Update. build dependencies to point to the newly spun out numerical_conversions_utils where + applicable. +- Made Aggregation Service AMI and EBS snapshot publicly available under the make_ami_public flag. +- Added job success metrics. See + [telemetry.md](https://github.com/privacysandbox/aggregation-service/blob/main/docs/telemetry.md) + for usage guide. +- [AWS] Added support for + [cross-cloud coorindators](https://github.com/privacysandbox/protected-auction-services-docs/blob/main/cross_cloud_coordinators.md). +- [AWS link to new upgrade instructions](https://github.com/privacysandbox/aggregation-service/blob/main/docs/aws-aggregation-service.md#updating-the-system) +- [GCP link to new upgrade instructions](https://github.com/privacysandbox/aggregation-service/blob/main/docs/gcp-aggregation-service.md#upgrade-environment) + +# [2.12.0](https://github.com/privacysandbox/aggregation-service/compare/v2.11.0...v2.12.0) (2025-02-24) + +- Added + [GCP troubleshooting documentation](https://github.com/privacysandbox/aggregation-service/blob/main/docs/gcp-aggregation-service.md) + for debugging 403 error commonly encountered by adtechs. +- Added feature to write privacy budget exhausted debugging information JSON file to cloud storage + in + [PRIVACY_BUDGET_EXHAUSTED](https://github.com/privacysandbox/aggregation-service/blob/main/docs/error-codes-and-mitigation.md) + scenarios. +- Updated the Error code and Mitigation documentation for PRIVACY_BUDGET_EXHAUSTED. +- Updated Aggregation Service support instructions in + [README](https://github.com/privacysandbox/aggregation-service/blob/main/README.md). +- Upgraded control plane shared library dependency to + [1.18-rc01](https://github.com/privacysandbox/coordinator-services-and-shared-libraries/releases/tag/v1.18.0-rc01). + +# [2.11.0](https://github.com/privacysandbox/aggregation-service/compare/v2.10.0...v2.11.0) (2025-01-21) + +- Added support for a new optional field "input_data_blob_prefixes" in CreateJob API. This field + accepts a list of input prefixes which point to the locations where input reports are to be read + from. +- Removed the defunct WorkerJobCompletion metric that was not actively managed. +- Upgraded control plane shared library dependency to + [1.14-rc01](https://github.com/privacysandbox/coordinator-services-and-shared-libraries/releases/tag/v1.14.0-rc01). + +## [2.10.0](https://github.com/privacysandbox/aggregation-service/compare/v2.9.1...v2.10.0) (2024-12-08) + +- Updated debug mode to no longer consume budget. +- Upgraded dependent packages to address critical/high image vulnerabilities. +- Upgraded control plane shared library dependency to + [v1.13.0-rc01](https://github.com/privacysandbox/coordinator-services-and-shared-libraries/releases/tag/v1.13.0-rc01). + +## [2.9.1](https://github.com/privacysandbox/aggregation-service/compare/v2.9.0...v2.9.1) (2024-11-20) + +- [AWS Only] Added a fix to address the reduced volume size of new AMIs by setting it to 8 GB. + +## [2.9.0](https://github.com/privacysandbox/aggregation-service/compare/v2.8.0...v2.9.0) (2024-11-04) + +- Updated PBS budget consumption request to use service client version. +- Added missing permissions to custom GCP Deploy role in adtech_setup environment. +- Reduced domain processing memory usage by parallelizing the domain processing stage and keeping + `AggregatedFacts` in memory in AVRO format files. +- Updated Aggregation Service sizing guidance with the latests benchmark results. + +## [2.8.1](https://github.com/privacysandbox/aggregation-service/compare/v2.8.0...v2.8.1) (2024-11-20) + +- [AWS Only] Added a fix to address the reduced volume size of new AMIs by setting it to 8 GB. + +## [2.8.0](https://github.com/privacysandbox/aggregation-service/compare/v2.7.0...v2.8.0) (2024-09-11) + +- Increased read threads in Aggregation Service to match the number of CPUs. +- Enabled worker instance OTel logs - processed job's id and worker health status. +- [GCP only] Updated the GCP image build target to "worker_mp_gcp_prod". Note: This change would + impact only if you build your own image. + +## [2.7.2](https://github.com/privacysandbox/aggregation-service/compare/v2.7.1...v2.7.2) (2024-11-20) + +- [AWS Only] Added a fix to address the reduced volume size of new AMIs by setting it to 8 GB. + +## [2.7.1](https://github.com/privacysandbox/aggregation-service/compare/v2.7.0...v2.7.1) (2024-09-20) + +- [GCP Only] Added a version in GCP VPC serverless connector module to fix 'Invalid type + specification' error. + +## [2.7.0](https://github.com/privacysandbox/aggregation-service/compare/v2.6.0...v2.7.0) (2024-08-01) + +- Added support for aggregating reports belonging to multiple reporting origins under the same + reporting site in a single aggregation job. +- [GCP Only] Updated coordinator endpoints to new Google/Third-Party coordinator pair. + +## [2.6.1](https://github.com/privacysandbox/aggregation-service/compare/v2.6.0...v2.6.1) (2024-11-20) + +- [AWS Only] Added a fix to address the reduced volume size of new AMIs by setting it to 8 GB. + +## [2.6.0](https://github.com/privacysandbox/aggregation-service/compare/v2.5.0...v2.6.0) (2024-07-19) + +- Enabled support for + [Aggregate Debug Reporting API](https://github.com/WICG/attribution-reporting-api/blob/main/aggregate_debug_reporting.md). +- Reduced memory usage by making `AggregatedFacts` mutable and removing redundant object creation. +- Updated dependencies to address security vulnerabilities. +- Upgraded control plane shared library dependency to + [v1.9.0-rc03](https://github.com/privacysandbox/coordinator-services-and-shared-libraries/releases/tag/v1.9.0-rc03) + +## [2.5.1](https://github.com/privacysandbox/aggregation-service/compare/v2.5.0...v2.5.1) (2024-07-19) + +- Updated dependencies to address security vulnerabilities. + +## [2.5.0](https://github.com/privacysandbox/aggregation-service/compare/v2.4.2...v2.5.0) (2024-05-22) + +### Changes + +- Deprecated single party key support. +- Enabled exception caching on private key service and set TTL for exception cache to reduce the + load and make aggregation jobs run/fail faster. +- Enabled non-zero filtering of labeled contributions. +- Enabled OpenTelemetry for metric and trace collection. +- Fixed enclave worker AMI + [build issue](https://github.com/privacysandbox/aggregation-service/issues/40) by pinning Docker + version to 24.0.5. +- Fixed GCP cloud build by adding -y option to the install commands with Docker. +- Fixed job failure with `ClassCastException` error. +- Fixed noised facts mismatch when DebugRun and DomainOptional are both set. +- Limited Otel memory reporting max to 90%. +- Made aggregate fact noising parallel. +- Made the job fail early on reaching a report error threshold. +- Refactored blob reading logic to handle zero-sized blobs gracefully. +- Removed redundant SingleFactAggregation class to reduce memory consumption. +- Updated dependencies to address security vulnerabilities. +- Updated documentation for batching strategies, aggregatable reports and OpenTelemetry usage. +- Upgraded control plane shared library dependency to + [v1.8.0-rc01](https://github.com/privacysandbox/coordinator-services-and-shared-libraries/releases/tag/v1.8.0-rc01) + +## [2.4.4](https://github.com/privacysandbox/aggregation-service/compare/v2.4.3...v2.4.4) (2024-07-19) + +### Changes + +- Updated dependencies to address security vulnerabilities. + +## [2.4.3](https://github.com/privacysandbox/aggregation-service/compare/v2.4.2...v2.4.3) (2024-05-20) + +### Changes + +- Fixed GCP cloud build by adding -y option to the install commands with Docker. +- Updated dependencies to address security vulnerabilities. + +## [2.4.2](https://github.com/privacysandbox/aggregation-service/compare/v2.4.1...v2.4.2) (2024-04-09) + +### Changes + +- Fixed job failure with `ClassCastException` error. +- Fixed noised facts mismatch when DebugRun and DomainOptional are both set. +- Updated dependencies to address security vulnerabilities. + +## [2.4.1](https://github.com/privacysandbox/aggregation-service/compare/v2.4.0...v2.4.1) (2024-03-11) + +### Changes + +#### [AWS only] + +- Fixed enclave worker AMI + [build issue](https://github.com/privacysandbox/aggregation-service/issues/40) by pinning Docker + version to 24.0.5. + +## [2.4.0](https://github.com/privacysandbox/aggregation-service/compare/v2.3.0...v2.4.0) (2024-02-12) + +### Changes + +- Added support for + [Labeled Privacy Budget keys](https://github.com/patcg-individual-drafts/private-aggregation-api/blob/main/flexible_filtering.md) + for default labels. +- Used RxJava for domain reading, reducing overall job execution time and memory consumption. +- Upgraded Bazel version to 6.5.0. + +## [2.3.4](https://github.com/privacysandbox/aggregation-service/compare/v2.3.3...v2.3.4) (2024-07-19) + +### Changes + +- Updated dependencies to address security vulnerabilities. + +## [2.3.3](https://github.com/privacysandbox/aggregation-service/compare/v2.3.2...v2.3.3) (2024-05-20) + +### Changes + +- Fixed GCP cloud build by adding -y option to the install commands with Docker. +- Updated dependencies to address security vulnerabilities. + +## [2.3.2](https://github.com/privacysandbox/aggregation-service/compare/v2.3.1...v2.3.2) (2024-04-09) + +### Changes + +- Fixed job failure with `ClassCastException` error. +- Updated dependencies to address security vulnerabilities. + +## [2.3.1](https://github.com/privacysandbox/aggregation-service/compare/v2.3.0...v2.3.1) (2024-03-11) + +### Changes + +#### [AWS only] + +- Fixed enclave worker AMI + [build issue](https://github.com/privacysandbox/aggregation-service/issues/40) by pinning Docker + version to 24.0.5. + +## [2.3.0](https://github.com/privacysandbox/aggregation-service/compare/v2.2.0...v2.3.0) (2024-01-12) + +### Changes + +- Upgraded control plane shared library dependency to + [v1.5.1](https://github.com/privacysandbox/coordinator-services-and-shared-libraries/releases/tag/v1.5.1) +- Updated dependencies to address security vulnerabilities. + +## [2.2.3](https://github.com/privacysandbox/aggregation-service/compare/v2.2.2...v2.2.3) (2024-05-20) + +### Changes + +- Fixed GCP cloud build by adding -y option to the install commands with Docker. +- Updated dependencies to address security vulnerabilities. + +## [2.2.2](https://github.com/privacysandbox/aggregation-service/compare/v2.2.1...v2.2.2) (2024-04-09) + +### Changes + +- Fixed job failure with `ClassCastException` error. +- Updated dependencies to address security vulnerabilities. + +## [2.2.1](https://github.com/privacysandbox/aggregation-service/compare/v2.2.0...v2.2.1) (2024-03-11) + +### Changes + +#### [AWS only] + +- Fixed enclave worker AMI + [build issue](https://github.com/privacysandbox/aggregation-service/issues/40) by pinning Docker + version to 24.0.5. + +## [2.2.0](https://github.com/privacysandbox/aggregation-service/compare/v2.1.0...v2.2.0) (2023-12-07) + +### Changes + +- Added additional shared_info version validation in case of version greater than LATEST_VERSION + and updated [documentation](./docs/api.md). +- Upgraded control plane shared library dependency to + [v1.5.0](https://github.com/privacysandbox/coordinator-services-and-shared-libraries/releases/tag/v1.5.0) +- Updated [operating documentation references](./README.md#operating-documentation). +- Pinned maven install rule to prevent unexpected image pcr0/hash change. + +#### [GCP Only] + +- Enabled parallel upload to cloud storage of the sharded summary reports. + +## [2.1.4](https://github.com/privacysandbox/aggregation-service/compare/v2.1.3...v2.1.4) (2024-05-20) + +### Changes + +- Fixed GCP cloud build by adding -y option to the install commands with Docker. +- Updated dependencies to address security vulnerabilities. + +## [2.1.3](https://github.com/privacysandbox/aggregation-service/compare/v2.1.2...v2.1.3) (2024-04-09) + +### Changes + +- Fixed job failure with `ClassCastException` error. +- Updated dependencies to address security vulnerabilities. + +## [2.1.2](https://github.com/privacysandbox/aggregation-service/compare/v2.1.1...v2.1.2) (2024-03-11) + +### Changes + +#### [AWS only] + +- Fixed enclave worker AMI + [build issue](https://github.com/privacysandbox/aggregation-service/issues/40) by pinning Docker + version to 24.0.5. + +## [2.1.1](https://github.com/privacysandbox/aggregation-service/compare/v2.1.0...v2.1.1) (2023-12-05) + +### Changes + +- Fixed document links in [REAMDE.md](./README.md). +- Pinned maven install rule to prevent unexpected image pcr0/hash change. +- Pinned the OTel dependencies to a specific version. + +#### [GCP Only] + +- Enabled parallel upload to cloud storage of the sharded summary reports. + +## [2.1.0](https://github.com/privacysandbox/aggregation-service/compare/v2.0.0...v2.1.0) (2023-11-01) + +### Changes + +- Added support for aggregation service on Google Cloud Platform (GCP) Follow our + [instructions](./docs/gcp-aggregation-service.md) to get started. +- Added check for source registration time being present in Attribution Reporting API (ARA) report + for calculation of Attribution Report Accounting Key for privacy budgeting. +- Added report shared_info version validations. + +#### [AWS only] + +- Enable uploading sharded summary report to cloud storage in parallel. +- Stabilized script fetch_terraform.sh by cleaning up existing files. + +## [2.0.4](https://github.com/privacysandbox/aggregation-service/compare/v2.0.3...v2.0.4) (2024-05-20) + +### Changes + +- Updated dependencies to address security vulnerabilities. + +## [2.0.3](https://github.com/privacysandbox/aggregation-service/compare/v2.0.2...v2.0.3) (2024-04-09) + +### Changes + +- Fixed job failure with `ClassCastException` error. +- Updated dependencies to address security vulnerabilities. + +## [2.0.2](https://github.com/privacysandbox/aggregation-service/compare/v2.0.1...v2.0.2) (2024-03-11) + +### Changes + +#### [AWS only] + +- Fixed enclave worker AMI + [build issue](https://github.com/privacysandbox/aggregation-service/issues/40) by pinning Docker + version to 24.0.5. + +## [2.0.1](https://github.com/privacysandbox/aggregation-service/compare/v2.0.0...v2.0.1) (2023-12-05) + +### Changes + +- Fixed document links in [REAMDE.md](./README.md). +- Stabilized script fetch_terraform.sh by cleaning up existing files. +- Pinned maven install rule to prevent unexpected image pcr0/hash change. + +## [2.0.0](https://github.com/privacysandbox/aggregation-service/compare/v1.0.3...v2.0.0) (2023-09-20) + +### Changes + +- Updated coordinator endpoints to new Google/Third-Party coordinator pair. +- Upgraded control plane shared library dependency to + [v1.2.0](https://github.com/privacysandbox/coordinator-services-and-shared-libraries/releases/tag/v1.2.0). +- Added documentation for various job validations. It can be found [here](./docs/api.md). +- Changes to handle null reports by filtering out the null facts before aggregation. +- Added certain validations around fields in SharedInfo used for privacy budget key generation. + +## [1.0.0](https://github.com/privacysandbox/aggregation-service/compare/v0.12.0...v1.0.0) (2023-07-11) + +### Changes + +- Updated document links for aws-aggregation-service.md. +- Updated comments in AMI BUILD file. + +## [0.12.0](https://github.com/privacysandbox/aggregation-service/compare/v0.11.0...v0.12.0) (2023-06-28) + +### Changes + +- Added output file sharding feature. +- Fixed links in documents. +- Added input bucket encoding details in collecting.md +- Fixed fetch_terraform.sh script. +- Improved AWS credentials provider to include prefetching and caching of credentials. + +## [0.11.0](https://github.com/privacysandbox/aggregation-service/compare/v0.10.0...v0.11.0) (2023-06-21) + +### Changes + +- Upgraded control plane shared library dependency to + [v0.51.15](https://github.com/privacysandbox/control-plane-shared-libraries/tree/v0.51.15) +- Updated Privacy Budget Client to retry on certain retryable http status codes in addition to + IOExceptions. +- Custom return messages for each PrivacyBudget related error for debug jobs. +- Added stacktrace to return messages shown to adtechs in case of unhandled/unexpected exceptions. +- Use of RxJava to read report files. Memory optimization to add back pressure. +- Added 2 new error codes around report decryption - DECRYPTION_KEY_NOT_FOUND, + DECRYPTION_KEY_FETCH_ERROR, SERVICE_ERROR. +- Sample build script fixes that address issues + [#16](https://github.com/privacysandbox/aggregation-service/issues/16) and + [#17](https://github.com/privacysandbox/aggregation-service/issues/17) +- Fail the job early when report error count exceeds threshold. More details + [here](./docs/api.md). +- Updated return message for PRIVACY_BUDGET_EXHAUSTED return code. +- Add support for reading files larger than 2.5 GB. +- Fix Base64 encoding for bucket in JSON format results. + +## [0.10.0](https://github.com/privacysandbox/aggregation-service/compare/v0.9.0...v0.10.0) (2023-05-10) + +### Changes + +- Upgraded control plane shared library dependency to + [v0.51.13](https://github.com/privacysandbox/control-plane-shared-libraries/tree/v0.51.13) + +## [0.9.0](https://github.com/privacysandbox/aggregation-service/compare/v0.8.0...v0.9.0) (2023-05-08) + +### Changes + +- Update enclave base container to `java17-debian11` +- Fixing LocalTestingTool json output +- Add stacktrace to ResultInfo.ReturnMessage for handled exceptions +- Add a return code "SUCCESS_WITH_ERRORS" for jobs that complete successfully but with some errors + in some reports +- Add Description to ErrorCount categories +- Avro file load memory handling +- null report support +- Adding PBS results to debug runs + +## [0.8.0](https://github.com/privacysandbox/aggregation-service/compare/v0.7.0...v0.8.0) (2023-03-15) + +### Changes + +- Fix Local testing tool when using --skip_domain flag to skip specifying domain input file. +- Fix to exit Aggregation worker when going out of memory. Enclave gets restarted automatically + and continues to pick new jobs. +- Fix to mitigate enclave restart failure issue. EC2 instance will get marked unhealthy if not + able to start the enclave. Autoscaling group will replace the instance accordingly. + ## [0.7.0](https://github.com/privacysandbox/aggregation-service/compare/v0.6.0...v0.7.0) (2023-03-07) ### Changes diff --git a/DEPENDENCIES.md b/DEPENDENCIES.md index 80bc10ff..976d4660 100644 --- a/DEPENDENCIES.md +++ b/DEPENDENCIES.md @@ -1,380 +1,557 @@ # Dependencies and Licenses +## AWS + The deployment of the Amazon Web Services [Nitro Enclaves](https://aws.amazon.com/ec2/nitro/nitro-enclaves/) based Aggregation Service depends on several packaged artifacts listed below. These artifacts can be downloaded with the [download_prebuilt_dependencies.sh](/terraform/aws/download_prebuilt_dependencies.sh) script. More information can be found in the -[README](/README.md#download-terraform-scripts-and-prebuilt-dependencies). +[README](/docs/aws-aggregation-service.md#download-terraform-scripts-and-prebuilt-dependencies). + +### Packaged AWS Lambda Jars + +#### AsgCapacityHandlerLambda\_{version}.jar -## Packaged AWS Lambda Jars + +| groupId | artifactId | Version | License | URL | +|--|--|--|--|--| +| com.amazonaws|aws-lambda-java-core|1.2.3|Apache License, Version 2.0 | | +| com.amazonaws|aws-lambda-java-events-sdk-transformer|3.1.0|Apache License, Version 2.0 | | +| com.fasterxml.jackson.core|jackson-annotations|2.16.1|Apache License, Version 2.0 | | +| com.fasterxml.jackson.core|jackson-core|2.16.1|Apache License, Version 2.0 | | +| com.fasterxml.jackson.core|jackson-databind|2.16.1|Apache License, Version 2.0 | | +| com.fasterxml.jackson.datatype|jackson-datatype-guava|2.16.1|Apache License, Version 2.0 | | +| com.fasterxml.jackson.datatype|jackson-datatype-jdk8|2.16.1|Apache License, Version 2.0 | | +| com.fasterxml.jackson.datatype|jackson-datatype-jsr310|2.16.1|Apache License, Version 2.0 | | +| com.google.auto.value|auto-value-annotations|1.10.4|Apache License, Version 2.0 | | +| com.google.code.findbugs|jsr305|3.0.2|Apache License, Version 2.0 | | +| com.google.code.gson|gson|2.10.1|Apache License, Version 2.0 | | +| com.google.errorprone|error-prone-annotations|2.24.1|Apache License, Version 2.0 | | +| com.google.guava|failureaccess|1.0.2|Apache License, Version 2.0 | | +| com.google.guava|guava|33.0.0-jre|Apache License, Version 2.0 | | +| com.google.guava|listenablefuture|9999.0-empty-to-avoid-conflict-with-guava|Apache License, Version 2.0 | | +| com.google.j2objc|j2objc-annotations|2.8|Apache License, Version 2.0 | | +| commons-codec|commons-codec|1.16|Apache License, Version 2.0| | +| commons-logging|commons-logging|1.3.0|Apache License, Version 2.0 | | +| io.netty|netty-buffer|4.1.100.Final|Apache License, Version 2.0 | | +| io.netty|netty-codec|4.1.100.Final|Apache License, Version 2.0 | | +| io.netty|netty-codec-http|4.1.100.Final|Apache License, Version 2.0 | | +| io.netty|netty-codec-http2|4.1.100.Final|Apache License, Version 2.0| +| io.netty|netty-common|4.1.100.Final|Apache License, Version 2.0 | | +| io.netty|netty-handler|4.1.100.Final|Apache License, Version 2.0 | | +| io.netty|netty-resolver|4.1.100.Final|Apache License, Version 2.0 | | +| io.netty|netty-transport|4.1.100.Final|Apache License, Version 2.0 | | +| io.netty|netty-transport-native-classes-epoll|4.1.100.Final|Apache License, Version 2.0| +| io.netty|netty-transport-native-unix-common|4.1.100.Final|Apache License, Version 2.0 | +| joda-time|joda-time|2.10.8|Apache License, Version 2.0 | | +| org.apache.httpcomponents|httpclient|4.5.14|Apache License, Version 2.0 | | +| org.apache.httpcomponents|httpcore|4.4.16|Apache License, Version 2.0 | | +| org.jctools|jctools-core|3.1.0|Apache License, Version 2.0 | | +| org.slf4j|slf4j-api|2.0.11|MIT License | | +| org.slf4j|slf4j-simple|2.0.11|MIT License | | +| software.amazon.awssdk|annotations|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|apache-client|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|auth|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|aws-core|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|aws-json-protocol|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|aws-query-protocol|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|checksums|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|checksums-spi|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|dynamodb|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|dynamodb-enhanced|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|endpoints-spi|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|http-auth|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|http-auth-aws|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|http-auth-spi|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|http-client-spi|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|identity-spi|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|json-utils|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|metrics-spi|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|netty-nio-client|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|profiles|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|protocol-core|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|regions|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|sdk-core|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|sqs|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|url-connection-client|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|utils|2.21.16|Apache License, Version 2.0 | | +| software.amazon.eventstream|eventstream|1.0.1|Apache License, Version 2.0 | | + -### AwsChangeHandlerLambda\_{version}.jar +#### AwsApigatewayFrontend\_{version}.jar | groupId | artifactId | Version | License | URL | |--|--|--|--|--| -| aopalliance | aopalliance | 1.0 |Public Domain | N/A | -| com.amazonaws|aws-lambda-java-core|1.2.1|Apache License, Version 2.0 | | +| com.amazonaws|aws-lambda-java-core|1.2.3|Apache License, Version 2.0 | | +| com.amazonaws|aws-lambda-java-events|3.11.3|Apache License, Version 2.0 | | | com.amazonaws|aws-lambda-java-events-sdk-transformer|3.1.0|Apache License, Version 2.0 | | -| com.amazonaws|aws-lambda-java-events|3.8.0|Apache License, Version 2.0 | | -| com.fasterxml.jackson.core|jackson-annotations|2.12.2|The Apache Software License, Version 2.0 | |.txt | -| com.fasterxml.jackson.core|jackson-core|2.12.2|The Apache Software License, Version 2.0 | |.txt | -| com.fasterxml.jackson.core|jackson-databind|2.12.2|The Apache Software License, Version 2.0 | |.txt | -| com.fasterxml.jackson.datatype|jackson-datatype-guava|2.12.2|The Apache Software License, Version 2.0 | |.txt | -| com.fasterxml.jackson.datatype|jackson-datatype-jdk8|2.12.2|The Apache Software License, Version 2.0 | |.txt | -| com.fasterxml.jackson.datatype|jackson-datatype-jsr310|2.12.2|The Apache Software License, Version 2.0 | |.txt | -| com.google.android|annotations|4.1.1.4|Apache 2.0 | | -| com.google.auto.service|auto-service-annotations|1|Apache 2.0 | |.txt | -| com.google.auto.service|auto-service|1|Apache 2.0 | |.txt | -| com.google.auto.value|auto-value-annotations|1.7.4|Apache 2.0 | |.txt | -| com.google.auto.value|auto-value|1.7.4|Apache 2.0 | |.txt | -| com.google.auto|auto-common|1|Apache 2.0 | |.txt | -| com.google.errorprone|error_prone_annotations|2.0.15|Apache 2.0 | |.txt | -| com.google.guava|failureaccess|1.0.1|The Apache Software License, Version 2.0 | |.txt | -| com.google.guava|guava|30.1-jre|Apache License, Version 2.0 | |.txt | -| com.google.guava|listenablefuture|9999.0-empty-to-avoid-conflict-with-guava|The Apache Software License, Version 2.0 | |.txt | -| com.google.inject|guice|4.2.3|The Apache Software License, Version 2.0 | |.txt | -| com.google.j2objc|j2objc-annotations|1.3|The Apache Software License, Version 2.0 | |.txt | -| com.typesafe.netty|netty-reactive-streams-http|2.0.5|Apache License, Version 2.0 | |.txt | -| com.typesafe.netty|netty-reactive-streams|2.0.5|Apache License, Version 2.0 | |.txt | -| commons-codec|commons-codec|1.15|Apache License, Version 2.0| | -| commons-logging|commons-logging|1.1.1|The Apache Software License, Version 2.0 | |.txt | -| io.netty|netty-buffer|4.1.53.Final|Apache License, Version 2.0 | | -| io.netty|netty-codec-http2|4.1.63.Final|Apache License, Version 2.0| -| io.netty|netty-codec-http|4.1.53.Final|Apache License, Version 2.0 | | -| io.netty|netty-codec|4.1.53.Final|Apache License, Version 2.0 | | -| io.netty|netty-common|4.1.53.Final|Apache License, Version 2.0 | | -| io.netty|netty-handler|4.1.53.Final|Apache License, Version 2.0 | | -| io.netty|netty-resolver|4.1.53.Final|Apache License, Version 2.0 | | -| io.netty|netty-transport-native-epoll|4.1.63.Final|Apache License, Version 2.0| -| io.netty|netty-transport-native-unix-common|4.1.63.Final|Apache License, Version 2.0| -| io.netty|netty-transport|4.1.53.Final|Apache License, Version 2.0 | | -| javax.inject|javax.inject|1|The Apache Software License, Version 2.0 | |.txt | -| joda-time|joda-time|2.6|Apache 2 | |.txt | -| org.apache.httpcomponents|httpclient|4.5.13|Apache License, Version 2.0 | |.txt | -| org.apache.httpcomponents|httpcore|4.4.14|Apache License, Version 2.0 | |.txt | -| org.checkerframework|checker-qual|3.8.0|The MIT License | | -| org.json|json|20180813|The JSON License | | -| org.reactivestreams|reactive-streams|1.0.3 | CC0 | | -| org.slf4j|slf4j-api|1.7.30|MIT License | | -| software.amazon.awssdk|annotations|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|apache-client|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|arns|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|auth|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|aws-core|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|aws-json-protocol|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|aws-query-protocol|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|aws-xml-protocol|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|connect|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|dynamodb-enhanced|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|dynamodb|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|http-client-spi|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|kms|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|lambda|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|metrics-spi|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|netty-nio-client|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|pi|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|profiles|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|protocol-core|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|ram|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|regions|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|s3|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|sdk-core|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|sqs|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|url-connection-client|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|utils|2.16.104|Apache License, Version 2.0 | | +| com.fasterxml.jackson.core|jackson-annotations|2.16.1|Apache License, Version 2.0 | | +| com.fasterxml.jackson.core|jackson-core|2.16.1|Apache License, Version 2.0 | | +| com.fasterxml.jackson.core|jackson-databind|2.16.1|Apache License, Version 2.0 | | +| com.fasterxml.jackson.datatype|jackson-datatype-guava|2.16.1|Apache License, Version 2.0 | | +| com.fasterxml.jackson.datatype|jackson-datatype-jdk8|2.16.1|Apache License, Version 2.0 | | +| com.fasterxml.jackson.datatype|jackson-datatype-jsr310|2.16.1|Apache License, Version 2.0 | | +| com.google.auto.service|auto-service-annotations|1.1.1|Apache License, Version 2.0 | | +| com.google.auto.value|auto-value-annotations|1.10.4|Apache License, Version 2.0 | | +| com.google.code.findbugs|jsr305|3.0.2|Apache License, Version 2.0 | | +| com.google.code.gson|gson|2.10.1|Apache License, Version 2.0 | | +| com.google.errorprone|error-prone-annotations|2.24.1|Apache License, Version 2.0 | | +| com.google.guava|failureaccess|1.0.2|Apache License, Version 2.0 | | +| com.google.guava|guava|33.0.0-jre|Apache License, Version 2.0 | | +| com.google.guava|listenablefuture|9999.0-empty-to-avoid-conflict-with-guava|Apache License, Version 2.0 | | +| com.google.j2objc|j2objc-annotations|2.8|Apache License, Version 2.0 | | +| commons-codec|commons-codec|1.16|Apache License, Version 2.0| | +| commons-logging|commons-logging|1.3.0|Apache License, Version 2.0 | | +| io.netty|netty-buffer|4.1.100.Final|Apache License, Version 2.0 | | +| io.netty|netty-codec|4.1.100.Final|Apache License, Version 2.0 | | +| io.netty|netty-codec-http|4.1.100.Final|Apache License, Version 2.0 | | +| io.netty|netty-codec-http2|4.1.100.Final|Apache License, Version 2.0| +| io.netty|netty-common|4.1.100.Final|Apache License, Version 2.0 | | +| io.netty|netty-handler|4.1.100.Final|Apache License, Version 2.0 | | +| io.netty|netty-resolver|4.1.100.Final|Apache License, Version 2.0 | | +| io.netty|netty-transport|4.1.100.Final|Apache License, Version 2.0 | | +| io.netty|netty-transport-native-classes-epoll|4.1.100.Final|Apache License, Version 2.0| +| io.netty|netty-transport-native-unix-common|4.1.100.Final|Apache License, Version 2.0 | +| io.vavr|vavr|0.10.2|Apache License, Version 2.0 | +| io.vavr|vavr-match|0.10.2|Apache License, Version 2.0 | +| joda-time|joda-time|2.10.8|Apache License, Version 2.0 | | +| org.apache.httpcomponents|httpclient|4.5.14|Apache License, Version 2.0 | | +| org.apache.httpcomponents|httpcore|4.4.16|Apache License, Version 2.0 | | +| org.apache.httpcomponents.client5|httpclient5|5.3|Apache License, Version 2.0 | | +| org.apache.httpcomponents.core5|httpcore5|5.2.4|Apache License, Version 2.0 | | +| org.apache.httpcomponents.core5|httpcore5-h2|5.2.4|Apache License, Version 2.0 | | +| org.jctools|jctools-core|3.1.0|Apache License, Version 2.0 | | +| org.slf4j|slf4j-api|2.0.11|MIT License | | +| org.slf4j|slf4j-simple|2.0.11|MIT License | | +| software.amazon.awssdk|annotations|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|apache-client|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|arns|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|auth|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|aws-core|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|aws-json-protocol|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|aws-query-protocol|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|aws-xml-protocol|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|checksums|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|checksums-spi|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|crt-core|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|dynamodb|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|dynamodb-enhanced|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|endpoints-spi|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|http-auth|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|http-auth-aws|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|http-auth-spi|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|http-client-spi|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|identity-spi|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|json-utils|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|kms|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|metrics-spi|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|netty-nio-client|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|pricing|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|profiles|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|protocol-core|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|regions|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|s3|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|sdk-core|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|sqs|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|sts|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|url-connection-client|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|utils|2.21.16|Apache License, Version 2.0 | | | software.amazon.eventstream|eventstream|1.0.1|Apache License, Version 2.0 | | -### aws_apigateway_frontend\_{version}.jar +#### AwsChangeHandlerLambda\_{version}.jar | groupId | artifactId | Version | License | URL | |--|--|--|--|--| -| aopalliance | aopalliance | 1.0 |Public Domain | N/A | -| com.amazonaws|aws-lambda-java-core|1.2.1|Apache License, Version 2.0 | | +| com.amazonaws|aws-lambda-java-core|1.2.3|Apache License, Version 2.0 | | | com.amazonaws|aws-lambda-java-events-sdk-transformer|3.1.0|Apache License, Version 2.0 | | -| com.amazonaws|aws-lambda-java-events|3.8.0|Apache License, Version 2.0 | | -| com.fasterxml.jackson.core|jackson-annotations|2.12.2|The Apache Software License, Version 2.0 | |.txt | -| com.fasterxml.jackson.core|jackson-core|2.12.2|The Apache Software License, Version 2.0 | |.txt | -| com.fasterxml.jackson.core|jackson-databind|2.12.2|The Apache Software License, Version 2.0 | |.txt | -| com.fasterxml.jackson.datatype|jackson-datatype-guava|2.12.2|The Apache Software License, Version 2.0 | |.txt | -| com.fasterxml.jackson.datatype|jackson-datatype-jdk8|2.12.2|The Apache Software License, Version 2.0 | |.txt | -| com.fasterxml.jackson.datatype|jackson-datatype-jsr310|2.12.2|The Apache Software License, Version 2.0 | |.txt | -| com.google.android|annotations|4.1.1.4|Apache 2.0 | | -| com.google.auto.service|auto-service-annotations|1|Apache 2.0 | |.txt | -| com.google.auto.service|auto-service|1|Apache 2.0 | |.txt | -| com.google.auto.value|auto-value-annotations|1.7.4|Apache 2.0 | |.txt | -| com.google.auto.value|auto-value|1.7.4|Apache 2.0 | |.txt | -| com.google.auto|auto-common|1|Apache 2.0 | |.txt | -| com.google.errorprone|error_prone_annotations|2.0.15|Apache 2.0 | |.txt | -| com.google.guava|failureaccess|1.0.1|The Apache Software License, Version 2.0 | |.txt | -| com.google.guava|guava|30.1-jre|Apache License, Version 2.0 | |.txt | -| com.google.guava|listenablefuture|9999.0-empty-to-avoid-conflict-with-guava|The Apache Software License, Version 2.0 | |.txt | -| com.google.inject|guice|4.2.3|The Apache Software License, Version 2.0 | |.txt | -| com.google.j2objc|j2objc-annotations|1.3|The Apache Software License, Version 2.0 | |.txt | -| com.typesafe.netty|netty-reactive-streams-http|2.0.5|Apache License, Version 2.0 | |.txt | -| com.typesafe.netty|netty-reactive-streams|2.0.5|Apache License, Version 2.0 | |.txt | -| commons-codec|commons-codec|1.15|Apache License, Version 2.0| | -| commons-logging|commons-logging|1.1.1|The Apache Software License, Version 2.0 | |.txt | -| io.netty|netty-buffer|4.1.53.Final|Apache License, Version 2.0 | | -| io.netty|netty-codec-http2|4.1.63.Final|Apache License, Version 2.0| -| io.netty|netty-codec-http|4.1.53.Final|Apache License, Version 2.0 | | -| io.netty|netty-codec|4.1.53.Final|Apache License, Version 2.0 | | -| io.netty|netty-common|4.1.53.Final|Apache License, Version 2.0 | | -| io.netty|netty-handler|4.1.53.Final|Apache License, Version 2.0 | | -| io.netty|netty-resolver|4.1.53.Final|Apache License, Version 2.0 | | -| io.netty|netty-transport-native-epoll|4.1.63.Final|Apache License, Version 2.0| -| io.netty|netty-transport-native-unix-common|4.1.63.Final|Apache License, Version 2.0| -| io.netty|netty-transport|4.1.53.Final|Apache License, Version 2.0 | | -| javax.inject|javax.inject|1|The Apache Software License, Version 2.0 | |.txt | -| joda-time|joda-time|2.6|Apache 2 | |.txt | -| org.apache.httpcomponents|httpclient|4.5.13|Apache License, Version 2.0 | |.txt | -| org.apache.httpcomponents|httpcore|4.4.14|Apache License, Version 2.0 | |.txt | -| org.checkerframework|checker-qual|3.8.0|The MIT License | | -| org.json|json|20180813|The JSON License | | -| org.reactivestreams|reactive-streams|1.0.3 | CC0 | | -| org.slf4j|slf4j-api|1.7.30|MIT License | | -| software.amazon.awssdk|annotations|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|apache-client|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|arns|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|auth|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|aws-core|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|aws-json-protocol|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|aws-query-protocol|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|aws-xml-protocol|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|connect|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|dynamodb-enhanced|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|dynamodb|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|http-client-spi|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|kms|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|lambda|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|metrics-spi|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|netty-nio-client|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|pi|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|profiles|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|protocol-core|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|ram|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|regions|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|s3|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|sdk-core|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|sqs|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|url-connection-client|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|utils|2.16.104|Apache License, Version 2.0 | | +| com.fasterxml.jackson.core|jackson-annotations|2.16.1|Apache License, Version 2.0 | | +| com.fasterxml.jackson.core|jackson-core|2.16.1|Apache License, Version 2.0 | | +| com.fasterxml.jackson.core|jackson-databind|2.16.1|Apache License, Version 2.0 | | +| com.fasterxml.jackson.datatype|jackson-datatype-guava|2.16.1|Apache License, Version 2.0 | | +| com.fasterxml.jackson.datatype|jackson-datatype-jdk8|2.16.1|Apache License, Version 2.0 | | +| com.fasterxml.jackson.datatype|jackson-datatype-jsr310|2.16.1|Apache License, Version 2.0 | | +| com.google.auto.service|auto-service-annotations|1.1.1|Apache License, Version 2.0 | | +| com.google.auto.value|auto-value-annotations|1.10.4|Apache License, Version 2.0 | | +| com.google.auto.value|auto-value|1.10.4|Apache License, Version 2.0 | | +| com.google.code.findbugs|jsr305|3.0.2|Apache License, Version 2.0 | | +| com.google.code.gson|gson|2.10.1|Apache License, Version 2.0 | | +| com.google.errorprone|error-prone-annotations|2.24.1|Apache License, Version 2.0 | | +| com.google.guava|failureaccess|1.0.2|Apache License, Version 2.0 | | +| com.google.guava|guava|33.0.0-jre|Apache License, Version 2.0 | | +| com.google.guava|listenablefuture|9999.0-empty-to-avoid-conflict-with-guava|Apache License, Version 2.0 | | +| com.google.j2objc|j2objc-annotations|2.8|Apache License, Version 2.0 | | +| commons-codec|commons-codec|1.16|Apache License, Version 2.0| | +| commons-logging|commons-logging|1.3.0|Apache License, Version 2.0 | | +| io.netty|netty-buffer|4.1.100.Final|Apache License, Version 2.0 | | +| io.netty|netty-codec|4.1.100.Final|Apache License, Version 2.0 | | +| io.netty|netty-codec-http|4.1.100.Final|Apache License, Version 2.0 | | +| io.netty|netty-codec-http2|4.1.100.Final|Apache License, Version 2.0| +| io.netty|netty-common|4.1.100.Final|Apache License, Version 2.0 | | +| io.netty|netty-handler|4.1.100.Final|Apache License, Version 2.0 | | +| io.netty|netty-resolver|4.1.100.Final|Apache License, Version 2.0 | | +| io.netty|netty-transport|4.1.100.Final|Apache License, Version 2.0 | | +| io.netty|netty-transport-native-classes-epoll|4.1.100.Final|Apache License, Version 2.0| +| io.netty|netty-transport-native-unix-common|4.1.100.Final|Apache License, Version 2.0 | +| io.vavr|vavr|0.10.2|Apache License, Version 2.0 | +| io.vavr|vavr-match|0.10.2|Apache License, Version 2.0 | +| joda-time|joda-time|2.10.8|Apache License, Version 2.0 | | +| org.apache.httpcomponents|httpclient|4.5.14|Apache License, Version 2.0 | | +| org.apache.httpcomponents|httpcore|4.4.16|Apache License, Version 2.0 | | +| org.apache.httpcomponents.client5|httpclient5|5.3|Apache License, Version 2.0 | | +| org.apache.httpcomponents.core5|httpcore5|5.2.4|Apache License, Version 2.0 | | +| org.apache.httpcomponents.core5|httpcore5-h2|5.2.4|Apache License, Version 2.0 | | +| org.jctools|jctools-core|3.1.0|Apache License, Version 2.0 | | +| org.slf4j|slf4j-api|2.0.11|MIT License | | +| org.slf4j|slf4j-simple|2.0.11|MIT License | | +| software.amazon.awssdk|annotations|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|apache-client|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|arns|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|auth|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|aws-core|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|aws-json-protocol|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|aws-query-protocol|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|aws-xml-protocol|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|checksums|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|checksums-spi|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|crt-core|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|dynamodb|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|dynamodb-enhanced|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|endpoints-spi|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|http-auth|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|http-auth-aws|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|http-auth-spi|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|http-client-spi|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|identity-spi|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|json-utils|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|kms|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|metrics-spi|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|netty-nio-client|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|pricing|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|profiles|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|protocol-core|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|regions|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|s3|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|sdk-core|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|sqs|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|sts|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|url-connection-client|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|utils|2.21.16|Apache License, Version 2.0 | | | software.amazon.eventstream|eventstream|1.0.1|Apache License, Version 2.0 | | -### AwsFrontendCleanupLambda\_{version}.jar +#### AwsFrontendCleanupLambda\_{version}.jar | groupId | artifactId | Version | License | URL | |--|--|--|--|--| -| aopalliance | aopalliance | 1.0 |Public Domain | N/A | -| com.amazonaws|aws-lambda-java-core|1.2.1|Apache License, Version 2.0 | | +| com.amazonaws|aws-lambda-java-core|1.2.3|Apache License, Version 2.0 | | +| com.amazonaws|aws-lambda-java-events|3.11.3|Apache License, Version 2.0 | | | com.amazonaws|aws-lambda-java-events-sdk-transformer|3.1.0|Apache License, Version 2.0 | | -| com.amazonaws|aws-lambda-java-events|3.8.0|Apache License, Version 2.0 | | -| com.fasterxml.jackson.core|jackson-annotations|2.12.2|The Apache Software License, Version 2.0 | |.txt | -| com.fasterxml.jackson.core|jackson-core|2.12.2|The Apache Software License, Version 2.0 | |.txt | -| com.fasterxml.jackson.core|jackson-databind|2.12.2|The Apache Software License, Version 2.0 | |.txt | -| com.fasterxml.jackson.datatype|jackson-datatype-guava|2.12.2|The Apache Software License, Version 2.0 | |.txt | -| com.fasterxml.jackson.datatype|jackson-datatype-jdk8|2.12.2|The Apache Software License, Version 2.0 | |.txt | -| com.fasterxml.jackson.datatype|jackson-datatype-jsr310|2.12.2|The Apache Software License, Version 2.0 | |.txt | -| com.google.android|annotations|4.1.1.4|Apache 2.0 | | -| com.google.auto.service|auto-service-annotations|1|Apache 2.0 | |.txt | -| com.google.auto.service|auto-service|1|Apache 2.0 | |.txt | -| com.google.auto.value|auto-value-annotations|1.7.4|Apache 2.0 | |.txt | -| com.google.auto.value|auto-value|1.7.4|Apache 2.0 | |.txt | -| com.google.auto|auto-common|1|Apache 2.0 | |.txt | -| com.google.errorprone|error_prone_annotations|2.0.15|Apache 2.0 | |.txt | -| com.google.guava|failureaccess|1.0.1|The Apache Software License, Version 2.0 | |.txt | -| com.google.guava|guava|30.1-jre|Apache License, Version 2.0 | |.txt | -| com.google.guava|listenablefuture|9999.0-empty-to-avoid-conflict-with-guava|The Apache Software License, Version 2.0 | |.txt | -| com.google.inject|guice|4.2.3|The Apache Software License, Version 2.0 | |.txt | -| com.google.j2objc|j2objc-annotations|1.3|The Apache Software License, Version 2.0 | |.txt | -| com.typesafe.netty|netty-reactive-streams-http|2.0.5|Apache License, Version 2.0 | |.txt | -| com.typesafe.netty|netty-reactive-streams|2.0.5|Apache License, Version 2.0 | |.txt | -| commons-codec|commons-codec|1.15|Apache License, Version 2.0| | -| commons-logging|commons-logging|1.1.1|The Apache Software License, Version 2.0 | |.txt | -| io.netty|netty-buffer|4.1.53.Final|Apache License, Version 2.0 | | -| io.netty|netty-codec-http2|4.1.63.Final|Apache License, Version 2.0| -| io.netty|netty-codec-http|4.1.53.Final|Apache License, Version 2.0 | | -| io.netty|netty-codec|4.1.53.Final|Apache License, Version 2.0 | | -| io.netty|netty-common|4.1.53.Final|Apache License, Version 2.0 | | -| io.netty|netty-handler|4.1.53.Final|Apache License, Version 2.0 | | -| io.netty|netty-resolver|4.1.53.Final|Apache License, Version 2.0 | | -| io.netty|netty-transport-native-epoll|4.1.63.Final|Apache License, Version 2.0| -| io.netty|netty-transport-native-unix-common|4.1.63.Final|Apache License, Version 2.0| -| io.netty|netty-transport|4.1.53.Final|Apache License, Version 2.0 | | -| javax.inject|javax.inject|1|The Apache Software License, Version 2.0 | |.txt | -| joda-time|joda-time|2.6|Apache 2 | |.txt | -| org.apache.httpcomponents|httpclient|4.5.13|Apache License, Version 2.0 | |.txt | -| org.apache.httpcomponents|httpcore|4.4.14|Apache License, Version 2.0 | |.txt | -| org.checkerframework|checker-qual|3.8.0|The MIT License | | -| org.json|json|20180813|The JSON License | | -| org.reactivestreams|reactive-streams|1.0.3 | CC0 | | -| org.slf4j|slf4j-api|1.7.30|MIT License | | -| software.amazon.awssdk|annotations|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|apache-client|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|arns|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|auth|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|aws-core|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|aws-json-protocol|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|aws-query-protocol|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|aws-xml-protocol|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|connect|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|dynamodb-enhanced|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|dynamodb|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|http-client-spi|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|kms|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|lambda|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|metrics-spi|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|netty-nio-client|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|pi|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|profiles|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|protocol-core|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|ram|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|regions|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|s3|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|sdk-core|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|sqs|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|url-connection-client|2.16.104|Apache License, Version 2.0 | | -| software.amazon.awssdk|utils|2.16.104|Apache License, Version 2.0 | | +| com.fasterxml.jackson.core|jackson-annotations|2.16.1|Apache License, Version 2.0 | | +| com.fasterxml.jackson.core|jackson-core|2.16.1|Apache License, Version 2.0 | | +| com.fasterxml.jackson.core|jackson-databind|2.16.1|Apache License, Version 2.0 | | +| com.fasterxml.jackson.datatype|jackson-datatype-guava|2.16.1|Apache License, Version 2.0 | | +| com.fasterxml.jackson.datatype|jackson-datatype-jdk8|2.16.1|Apache License, Version 2.0 | | +| com.fasterxml.jackson.datatype|jackson-datatype-jsr310|2.16.1|Apache License, Version 2.0 | | +| com.google.auto.service|auto-service-annotations|1.1.1|Apache License, Version 2.0 | | +| com.google.auto.value|auto-value-annotations|1.10.4|Apache License, Version 2.0 | | +| com.google.code.findbugs|jsr305|3.0.2|Apache License, Version 2.0 | | +| com.google.code.gson|gson|2.10.1|Apache License, Version 2.0 | | +| com.google.errorprone|error-prone-annotations|2.24.1|Apache License, Version 2.0 | | +| com.google.guava|failureaccess|1.0.2|Apache License, Version 2.0 | | +| com.google.guava|guava|33.0.0-jre|Apache License, Version 2.0 | | +| com.google.guava|listenablefuture|9999.0-empty-to-avoid-conflict-with-guava|Apache License, Version 2.0 | | +| com.google.j2objc|j2objc-annotations|2.8|Apache License, Version 2.0 | | +| commons-codec|commons-codec|1.16|Apache License, Version 2.0| | +| commons-logging|commons-logging|1.3.0|Apache License, Version 2.0 | | +| io.netty|netty-buffer|4.1.100.Final|Apache License, Version 2.0 | | +| io.netty|netty-codec|4.1.100.Final|Apache License, Version 2.0 | | +| io.netty|netty-codec-http|4.1.100.Final|Apache License, Version 2.0 | | +| io.netty|netty-codec-http2|4.1.100.Final|Apache License, Version 2.0| +| io.netty|netty-common|4.1.100.Final|Apache License, Version 2.0 | | +| io.netty|netty-handler|4.1.100.Final|Apache License, Version 2.0 | | +| io.netty|netty-resolver|4.1.100.Final|Apache License, Version 2.0 | | +| io.netty|netty-transport|4.1.100.Final|Apache License, Version 2.0 | | +| io.netty|netty-transport-native-classes-epoll|4.1.100.Final|Apache License, Version 2.0| +| io.netty|netty-transport-native-unix-common|4.1.100.Final|Apache License, Version 2.0 | +| io.vavr|vavr|0.10.2|Apache License, Version 2.0 | +| io.vavr|vavr-match|0.10.2|Apache License, Version 2.0 | +| joda-time|joda-time|2.10.8|Apache License, Version 2.0 | | +| org.apache.httpcomponents|httpclient|4.5.14|Apache License, Version 2.0 | | +| org.apache.httpcomponents|httpcore|4.4.16|Apache License, Version 2.0 | | +| org.apache.httpcomponents.client5|httpclient5|5.3|Apache License, Version 2.0 | | +| org.apache.httpcomponents.core5|httpcore5|5.2.4|Apache License, Version 2.0 | | +| org.apache.httpcomponents.core5|httpcore5-h2|5.2.4|Apache License, Version 2.0 | | +| org.jctools|jctools-core|3.1.0|Apache License, Version 2.0 | | +| org.slf4j|slf4j-api|2.0.11|MIT License | | +| org.slf4j|slf4j-simple|2.0.11|MIT License | | +| software.amazon.awssdk|annotations|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|apache-client|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|arns|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|auth|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|aws-core|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|aws-json-protocol|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|aws-query-protocol|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|aws-xml-protocol|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|checksums|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|checksums-spi|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|crt-core|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|dynamodb|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|dynamodb-enhanced|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|endpoints-spi|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|http-auth|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|http-auth-aws|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|http-auth-spi|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|http-client-spi|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|identity-spi|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|json-utils|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|kms|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|metrics-spi|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|netty-nio-client|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|pricing|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|profiles|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|protocol-core|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|regions|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|s3|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|sdk-core|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|sqs|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|sts|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|url-connection-client|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|utils|2.21.16|Apache License, Version 2.0 | | +| software.amazon.eventstream|eventstream|1.0.1|Apache License, Version 2.0 | | + + +#### TerminatedInstanceHandlerLambda\_{version}.jar + + +| groupId | artifactId | Version | License | URL | +|--|--|--|--|--| +| com.amazonaws|aws-lambda-java-core|1.2.3|Apache License, Version 2.0 | | +| com.amazonaws|aws-lambda-java-events|3.11.3|Apache License, Version 2.0 | | +| com.fasterxml.jackson.core|jackson-annotations|2.16.1|Apache License, Version 2.0 | | +| com.fasterxml.jackson.core|jackson-core|2.16.1|Apache License, Version 2.0 | | +| com.fasterxml.jackson.core|jackson-databind|2.16.1|Apache License, Version 2.0 | | +| com.fasterxml.jackson.datatype|jackson-datatype-guava|2.16.1|Apache License, Version 2.0 | | +| com.fasterxml.jackson.datatype|jackson-datatype-jdk8|2.16.1|Apache License, Version 2.0 | | +| com.fasterxml.jackson.datatype|jackson-datatype-jsr310|2.16.1|Apache License, Version 2.0 | | +| com.google.auto.value|auto-value-annotations|1.10.4|Apache License, Version 2.0 | | +| com.google.code.findbugs|jsr305|3.0.2|Apache License, Version 2.0 | | +| com.google.code.gson|gson|2.10.1|Apache License, Version 2.0 | | +| com.google.errorprone|error-prone-annotations|2.24.1|Apache License, Version 2.0 | | +| com.google.guava|failureaccess|1.0.2|Apache License, Version 2.0 | | +| com.google.guava|guava|33.0.0-jre|Apache License, Version 2.0 | | +| com.google.guava|listenablefuture|9999.0-empty-to-avoid-conflict-with-guava|Apache License, Version 2.0 | | +| com.google.j2objc|j2objc-annotations|2.8|Apache License, Version 2.0 | | +| commons-codec|commons-codec|1.16|Apache License, Version 2.0| | +| commons-logging|commons-logging|1.3.0|Apache License, Version 2.0 | | +| io.netty|netty-buffer|4.1.100.Final|Apache License, Version 2.0 | | +| io.netty|netty-codec|4.1.100.Final|Apache License, Version 2.0 | | +| io.netty|netty-codec-http|4.1.100.Final|Apache License, Version 2.0 | | +| io.netty|netty-codec-http2|4.1.100.Final|Apache License, Version 2.0| +| io.netty|netty-common|4.1.100.Final|Apache License, Version 2.0 | | +| io.netty|netty-handler|4.1.100.Final|Apache License, Version 2.0 | | +| io.netty|netty-resolver|4.1.100.Final|Apache License, Version 2.0 | | +| io.netty|netty-transport|4.1.100.Final|Apache License, Version 2.0 | | +| io.netty|netty-transport-native-classes-epoll|4.1.100.Final|Apache License, Version 2.0| +| io.netty|netty-transport-native-unix-common|4.1.100.Final|Apache License, Version 2.0 | +| joda-time|joda-time|2.10.8|Apache License, Version 2.0 | | +| org.apache.httpcomponents|httpclient|4.5.14|Apache License, Version 2.0 | | +| org.apache.httpcomponents|httpcore|4.4.16|Apache License, Version 2.0 | | +| org.jctools|jctools-core|3.1.0|Apache License, Version 2.0 | | +| org.slf4j|slf4j-api|2.0.11|MIT License | | +| org.slf4j|slf4j-simple|2.0.11|MIT License | | +| software.amazon.awssdk|annotations|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|apache-client|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|auth|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|autoscaling|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|aws-core|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|aws-json-protocol|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|aws-query-protocol|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|checksums|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|checksums-spi|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|dynamodb|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|dynamodb-enhanced|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|endpoints-spi|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|http-auth|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|http-auth-aws|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|http-auth-spi|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|http-client-spi|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|identity-spi|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|json-utils|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|metrics-spi|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|netty-nio-client|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|profiles|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|protocol-core|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|regions|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|sdk-core|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|sqs|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|url-connection-client|2.21.16|Apache License, Version 2.0 | | +| software.amazon.awssdk|utils|2.21.16|Apache License, Version 2.0 | | | software.amazon.eventstream|eventstream|1.0.1|Apache License, Version 2.0 | | -### AsgCapacityHandlerLambda\_{version}.jar +## GCP + +The deployment of the Google Cloud Platform +[Confidential Space](https://cloud.google.com/blog/products/identity-security/confidential-space-is-ga) +based Aggregation Service depends on several packaged artifacts listed below. These artifacts can be +downloaded with the +[download_prebuilt_dependencies.sh](/terraform/gcp/download_prebuilt_dependencies.sh) script. More +information can be found in the +[README](/docs/gcp-aggregation-service.md#download-terraform-scripts-and-prebuilt-dependencies). + +### Packaged GCP Cloud Function Jars + +#### FrontendServiceHttpCloudFunction\_{version}.jar | groupId | artifactId | Version | License | URL | |--|--|--|--|--| -| aopalliance | aopalliance | 1 | Public Domain | -| com.amazonaws | aws-lambda-java-core | 1.2.1 | Apache License, Version 2.0 | | -| com.amazonaws | aws-lambda-java-events | 3.8.0 | Apache License, Version 2.0 | | -| com.fasterxml.jackson.core | jackson-annotations | 2.12.2 | The Apache Software License, Version 2.0 | | -| com.fasterxml.jackson.core | jackson-core | 2.12.2 | The Apache Software License, Version 2.0 | | -| com.fasterxml.jackson.core | jackson-databind | 2.12.2 | The Apache Software License, Version 2.0 | | -| com.google.android | annotations | 4.1.1.4 | Apache 2.0 | | -| com.google.auto.value | auto-value-annotations | 1.7.4 | Apache 2.0 | | -| com.google.auto.value | auto-value | 1.7.4 | Apache 2.0 | | -| com.google.code.findbugs | jsr305 | 3.0.2 | The Apache Software License, Version 2.0 | | -| com.google.errorprone | error_prone_annotations | 2.0.15 | Apache 2.0 | | -| com.google.guava | failureaccess | 1.0.1 | The Apache Software License, Version 2.0 | | -| com.google.guava | guava | 30.1-jre | Apache License, Version 2.0 | | -| com.google.guava | listenablefuture | 9999.0-empty-to-avoid-conflict-with-guava | The Apache Software License, Version 2.0 | | -| com.google.inject | guice | 4.2.3 | The Apache Software License, Version 2.0 | | -| com.google.j2objc | j2objc-annotations | 1.3 | The Apache Software License, Version 2.0 | | -| com.typesafe.netty | netty-reactive-streams-http | 2.0.5 | Apache License, Version 2.0 | | -| com.typesafe.netty | netty-reactive-streams | 2.0.5 | Apache License, Version 2.0 | | -| commons-codec | commons-codec | 1.15 | Apache License, Version 2.0 | | -| commons-logging | commons-logging | 1.1.1 | The Apache Software License, Version 2.0 | | -| io.netty | netty-buffer | 4.1.53.Final | Apache License, Version 2.0 | | -| io.netty | netty-codec-http2 | 4.1.63.Final | Apache License, Version 2.0 | | -| io.netty | netty-codec-http | 4.1.53.Final | Apache License, Version 2.0 | | -| io.netty | netty-codec | 4.1.53.Final | Apache License, Version 2.0 | | -| io.netty | netty-common | 4.1.53.Final | Apache License, Version 2.0 | | -| io.netty | netty-handler | 4.1.53.Final | Apache License, Version 2.0 | | -| io.netty | netty-resolver | 4.1.53.Final | Apache License, Version 2.0 | | -| io.netty | netty-transport-native-epoll | 4.1.63.Final | Apache License, Version 2.0 | | -| io.netty | netty-transport-native-unix-common | 4.1.63.Final | Apache License, Version 2.0 | | -| io.netty | netty-transport | 4.1.53.Final | Apache License, Version 2.0 | | -| javax.inject | javax.inject | 1 | The Apache Software License, Version 2.0 | | -| joda-time | joda-time | 2.6 | Apache 2 | | -| org.apache.httpcomponents | httpclient | 4.5.13 | Apache License, Version 2.0 | | -| org.apache.httpcomponents | httpcore | 4.4.14 | Apache License, Version 2.0 | | -| org.checkerframework | checker-qual | 3.8.0 | The MIT License | | -| org.reactivestreams | reactive-streams | 1.0.3 | CC0 | | -| org.slf4j | slf4j-api | 1.7.30 | MIT License | | -| org.slf4j | slf4j-simple | 1.7.30 | MIT License | | -| software.amazon.awssdk | annotations | 2.16.104 | Apache License, Version 2.0 | | -| software.amazon.awssdk | apache-client | 2.16.104 | Apache License, Version 2.0 | | -| software.amazon.awssdk | auth | 2.16.104 | Apache License, Version 2.0 | | -| software.amazon.awssdk | autoscaling | 2.16.104 | Apache License, Version 2.0 | | -| software.amazon.awssdk | aws-core | 2.16.104 | Apache License, Version 2.0 | | -| software.amazon.awssdk | aws-query-protocol | 2.16.104 | Apache License, Version 2.0 | | -| software.amazon.awssdk | connect | 2.16.104 | Apache License, Version 2.0 | | -| software.amazon.awssdk | http-client-spi | 2.16.104 | Apache License, Version 2.0 | | -| software.amazon.awssdk | lambda | 2.16.104 | Apache License, Version 2.0 | | -| software.amazon.awssdk | metrics-spi | 2.16.104 | Apache License, Version 2.0 | | -| software.amazon.awssdk | netty-nio-client | 2.16.104 | Apache License, Version 2.0 | | -| software.amazon.awssdk | pi | 2.16.104 | Apache License, Version 2.0 | | -| software.amazon.awssdk | profiles | 2.16.104 | Apache License, Version 2.0 | | -| software.amazon.awssdk | protocol-core | 2.16.104 | Apache License, Version 2.0 | | -| software.amazon.awssdk | ram | 2.16.104 | Apache License, Version 2.0 | | -| software.amazon.awssdk | regions | 2.16.104 | Apache License, Version 2.0 | | -| software.amazon.awssdk | sdk-core | 2.16.104 | Apache License, Version 2.0 | | -| software.amazon.awssdk | sqs | 2.16.104 | Apache License, Version 2.0 | | -| software.amazon.awssdk | url-connection-client | 2.16.104 | Apache License, Version 2.0 | | -| software.amazon.awssdk | utils | 2.16.104 | Apache License, Version 2.0 | | -| software.amazon.eventstream | eventstream | 1.0.1 | Apache License, Version 2.0 | | +| com.fasterxml.jackson.core|jackson-annotations|2.16.1|Apache License, Version 2.0 | | +| com.fasterxml.jackson.core|jackson-core|2.16.1|Apache License, Version 2.0 | | +| com.fasterxml.jackson.core|jackson-databind|2.16.1|Apache License, Version 2.0 | | +| com.fasterxml.jackson.datatype|jackson-datatype-guava|2.16.1|Apache License, Version 2.0 | | +| com.fasterxml.jackson.datatype|jackson-datatype-jdk8|2.16.1|Apache License, Version 2.0 | | +| com.fasterxml.jackson.datatype|jackson-datatype-jsr310|2.16.1|Apache License, Version 2.0 | | +| com.google.android|annotations|4.1.1.4|Apache License, Version 2.0 | | +| com.google.api|gax|2.41.0|BSD 3-Clause | | +| com.google.api|gax-grpc|2.41.0|BSD 3-Clause | | +| com.google.api|gax-httpjson|2.41.0|BSD 3-Clause | | +| com.google.api-client|google-api-client|2.2.0|Apache License, Version 2.0 | | +| com.google.api.grpc|grpc-google-cloud-spanner-admin-database-v1|6.56.0|Apache License, Version 2.0 | | +| com.google.api.grpc|grpc-google-cloud-spanner-admin-instance-v1|6.56.0|Apache License, Version 2.0 | | +| com.google.api.grpc|grpc-google-cloud-spanner-v1|6.56.0|Apache License, Version 2.0 | | +| com.google.api.grpc|grpc-google-common-protos|2.31.0|Apache License, Version 2.0 | | +| com.google.api.grpc|proto-google-cloud-pubsub-v1|1.108.2|Apache License, Version 2.0 | | +| com.google.api.grpc|proto-google-cloud-spanner-admin-database-v1|6.56.0|Apache License, Version 2.0 | | +| com.google.api.grpc|proto-google-cloud-spanner-admin-instance-v1|6.56.0|Apache License, Version 2.0 | | +| com.google.api.grpc|proto-google-cloud-spanner-executor-v1|6.56.0|Apache License, Version 2.0 | | +| com.google.api.grpc|proto-google-cloud-spanner-v1|6.56.0|Apache License, Version 2.0 | | +| com.google.api.grpc|proto-google-common-protos|2.32.0|Apache License, Version 2.0 | | +| com.google.api.grpc|proto-google-iam-v1|1.27.0|Apache License, Version 2.0 | | +| com.google.auth|google-auth-library-credentials|1.22.0|BSD 3-Clause | | +| com.google.auth|google-auth-library-oauth2-http|1.22.0|BSD 3-Clause | | +| com.google.auto.value|auto-value-annotations|1.10.4|Apache License, Version 2.0 | | +| com.google.cloud|google-cloud-core|2.31.0|Apache License, Version 2.0 | | +| com.google.cloud|google-cloud-core-grpc|2.31.0|Apache License, Version 2.0 | | +| com.google.cloud|google-cloud-pubsub|1.126.2|Apache License, Version 2.0 | | +| com.google.cloud|google-cloud-spanner|6.56.0|Apache License, Version 2.0 | | +| com.google.cloud.functions|functions-framework-api|1.1.0|Apache License, Version 2.0 | | +| com.google.code.findbugs|jsr305|3.0.2|Apache License, Version 2.0 | | +| com.google.code.gson|gson|2.10.1|Apache License, Version 2.0 | | +| com.google.errorprone|error-prone-annotations|2.24.1|Apache License, Version 2.0 | | +| com.google.guava|failureaccess|1.0.2|Apache License, Version 2.0 | | +| com.google.guava|guava|33.0.0-jre|Apache License, Version 2.0 | | +| com.google.guava|listenablefuture|9999.0-empty-to-avoid-conflict-with-guava|Apache License, Version 2.0 | | +| com.google.http-client|google-http-client|1.43.3|Apache License, Version 2.0 | | +| com.google.http-client|google-http-client-gson|1.43.3|Apache License, Version 2.0 | | +| com.google.j2objc|j2objc-annotations|2.8|Apache License, Version 2.0 | | +| com.google.oauth-client|google-oauth-client|1.35.0|Apache License, Version 2.0 | | +| commons-codec|commons-codec|1.16|Apache License, Version 2.0| | +| commons-logging|commons-logging|1.3.0|Apache License, Version 2.0 | | +| io.cloudevents|cloudevents-api|2.5.0|Apache License, Version 2.0 | | +| io.netty|netty-buffer|4.1.100.Final|Apache License, Version 2.0 | | +| io.netty|netty-codec|4.1.100.Final|Apache License, Version 2.0 | | +| io.netty|netty-codec-http|4.1.100.Final|Apache License, Version 2.0 | | +| io.netty|netty-codec-http2|4.1.100.Final|Apache License, Version 2.0| +| io.netty|netty-common|4.1.100.Final|Apache License, Version 2.0 | | +| io.netty|netty-handler|4.1.100.Final|Apache License, Version 2.0 | | +| io.netty|netty-resolver|4.1.100.Final|Apache License, Version 2.0 | | +| io.netty|netty-transport|4.1.100.Final|Apache License, Version 2.0 | | +| io.netty|netty-transport-native-classes-epoll|4.1.100.Final|Apache License, Version 2.0| +| io.netty|netty-transport-native-unix-common|4.1.100.Final|Apache License, Version 2.0 | +| io.vavr|vavr|0.10.2|Apache License, Version 2.0 | +| io.vavr|vavr-match|0.10.2|Apache License, Version 2.0 | +| javax.annotation|javax.annotation-api|1.3.2|CDDL, GPL 2.0 | | +| org.apache.httpcomponents|httpclient|4.5.14|Apache License, Version 2.0 | | +| org.apache.httpcomponents|httpcore|4.4.16|Apache License, Version 2.0 | | +| org.apache.httpcomponents.client5|httpclient5|5.3|Apache License, Version 2.0 | | +| org.apache.httpcomponents.core5|httpcore5|5.2.4|Apache License, Version 2.0 | | +| org.apache.httpcomponents.core5|httpcore5-h2|5.2.4|Apache License, Version 2.0 | | +| org.codehaus.mojo|animal-sniffer-annotations|1.23|MIT License | | +| org.jctools|jctools-core|3.1.0|Apache License, Version 2.0 | | +| org.slf4j|slf4j-api|2.0.11|MIT License | | +| org.slf4j|slf4j-simple|2.0.11|MIT License | | +| org.threeten|threetenbp|1.6.8|BSD 3-Clause | | -### TerminatedInstanceHandlerLambda\_{version}.jar +#### WorkerScaleInCloudFunction\_{version}.jar | groupId | artifactId | Version | License | URL | |--|--|--|--|--| -| aopalliance | aopalliance | 1 | Public Domain | -| com.amazonaws | aws-lambda-java-core | 1.2.1 | Apache License, Version 2.0 | | -| com.amazonaws | aws-lambda-java-events | 3.8.0 | Apache License, Version 2.0 | | -| com.fasterxml.jackson.core | jackson-annotations | 2.12.2 | The Apache Software License, Version 2.0 | | -| com.fasterxml.jackson.core | jackson-core | 2.12.2 | The Apache Software License, Version 2.0 | | -| com.fasterxml.jackson.core | jackson-databind | 2.12.2 | The Apache Software License, Version 2.0 | | -| com.google.android | annotations | 4.1.1.4 | Apache 2.0 | | -| com.google.auto.value | auto-value-annotations | 1.7.4 | Apache 2.0 | | -| com.google.auto.value | auto-value | 1.7.4 | Apache 2.0 | | -| com.google.code.findbugs | jsr305 | 3.0.2 | The Apache Software License, Version 2.0 | | -| com.google.errorprone | error_prone_annotations | 2.0.15 | Apache 2.0 | | -| com.google.guava | failureaccess | 1.0.1 | The Apache Software License, Version 2.0 | | -| com.google.guava | guava | 30.1-jre | Apache License, Version 2.0 | | -| com.google.guava | listenablefuture | 9999.0-empty-to-avoid-conflict-with-guava | The Apache Software License, Version 2.0 | | -| com.google.inject | guice | 4.2.3 | The Apache Software License, Version 2.0 | | -| com.google.j2objc | j2objc-annotations | 1.3 | The Apache Software License, Version 2.0 | | -| com.typesafe.netty | netty-reactive-streams-http | 2.0.5 | Apache License, Version 2.0 | | -| com.typesafe.netty | netty-reactive-streams | 2.0.5 | Apache License, Version 2.0 | | -| commons-codec | commons-codec | 1.15 | Apache License, Version 2.0 | | -| commons-logging | commons-logging | 1.1.1 | The Apache Software License, Version 2.0 | | -| io.netty | netty-buffer | 4.1.53.Final | Apache License, Version 2.0 | | -| io.netty | netty-codec-http2 | 4.1.63.Final | Apache License, Version 2.0 | | -| io.netty | netty-codec-http | 4.1.53.Final | Apache License, Version 2.0 | | -| io.netty | netty-codec | 4.1.53.Final | Apache License, Version 2.0 | | -| io.netty | netty-common | 4.1.53.Final | Apache License, Version 2.0 | | -| io.netty | netty-handler | 4.1.53.Final | Apache License, Version 2.0 | | -| io.netty | netty-resolver | 4.1.53.Final | Apache License, Version 2.0 | | -| io.netty | netty-transport-native-epoll | 4.1.63.Final | Apache License, Version 2.0 | | -| io.netty | netty-transport-native-unix-common | 4.1.63.Final | Apache License, Version 2.0 | | -| io.netty | netty-transport | 4.1.53.Final | Apache License, Version 2.0 | | -| javax.inject | javax.inject | 1 | The Apache Software License, Version 2.0 | | -| joda-time | joda-time | 2.6 | Apache 2 | | -| org.apache.httpcomponents | httpclient | 4.5.13 | Apache License, Version 2.0 | | -| org.apache.httpcomponents | httpcore | 4.4.14 | Apache License, Version 2.0 | | -| org.checkerframework | checker-qual | 3.8.0 | The MIT License | | -| org.reactivestreams | reactive-streams | 1.0.3 | CC0 | | -| org.slf4j | slf4j-api | 1.7.30 | MIT License | | -| org.slf4j | slf4j-simple | 1.7.30 | MIT License | | -| software.amazon.awssdk | annotations | 2.16.104 | Apache License, Version 2.0 | | -| software.amazon.awssdk | apache-client | 2.16.104 | Apache License, Version 2.0 | | -| software.amazon.awssdk | auth | 2.16.104 | Apache License, Version 2.0 | | -| software.amazon.awssdk | autoscaling | 2.16.104 | Apache License, Version 2.0 | | -| software.amazon.awssdk | aws-core | 2.16.104 | Apache License, Version 2.0 | | -| software.amazon.awssdk | aws-query-protocol | 2.16.104 | Apache License, Version 2.0 | | -| software.amazon.awssdk | connect | 2.16.104 | Apache License, Version 2.0 | | -| software.amazon.awssdk | http-client-spi | 2.16.104 | Apache License, Version 2.0 | | -| software.amazon.awssdk | lambda | 2.16.104 | Apache License, Version 2.0 | | -| software.amazon.awssdk | metrics-spi | 2.16.104 | Apache License, Version 2.0 | | -| software.amazon.awssdk | netty-nio-client | 2.16.104 | Apache License, Version 2.0 | | -| software.amazon.awssdk | pi | 2.16.104 | Apache License, Version 2.0 | | -| software.amazon.awssdk | profiles | 2.16.104 | Apache License, Version 2.0 | | -| software.amazon.awssdk | protocol-core | 2.16.104 | Apache License, Version 2.0 | | -| software.amazon.awssdk | ram | 2.16.104 | Apache License, Version 2.0 | | -| software.amazon.awssdk | regions | 2.16.104 | Apache License, Version 2.0 | | -| software.amazon.awssdk | sdk-core | 2.16.104 | Apache License, Version 2.0 | | -| software.amazon.awssdk | sqs | 2.16.104 | Apache License, Version 2.0 | | -| software.amazon.awssdk | url-connection-client | 2.16.104 | Apache License, Version 2.0 | | -| software.amazon.awssdk | utils | 2.16.104 | Apache License, Version 2.0 | | -| software.amazon.eventstream | eventstream | 1.0.1 | Apache License, Version 2.0 | | +| com.fasterxml.jackson.core|jackson-annotations|2.16.1|Apache License, Version 2.0 | | +| com.fasterxml.jackson.core|jackson-core|2.16.1|Apache License, Version 2.0 | | +| com.fasterxml.jackson.core|jackson-databind|2.16.1|Apache License, Version 2.0 | | +| com.fasterxml.jackson.datatype|jackson-datatype-guava|2.16.1|Apache License, Version 2.0 | | +| com.fasterxml.jackson.datatype|jackson-datatype-jdk8|2.16.1|Apache License, Version 2.0 | | +| com.fasterxml.jackson.datatype|jackson-datatype-jsr310|2.16.1|Apache License, Version 2.0 | | +| com.google.android|annotations|4.1.1.4|Apache License, Version 2.0 | | +| com.google.api|gax|2.41.0|BSD 3-Clause | | +| com.google.api|gax-grpc|2.41.0|BSD 3-Clause | | +| com.google.api|gax-httpjson|2.41.0|BSD 3-Clause | | +| com.google.api.grpc|grpc-google-cloud-spanner-admin-database-v1|6.56.0|Apache License, Version 2.0 | | +| com.google.api.grpc|grpc-google-cloud-spanner-admin-instance-v1|6.56.0|Apache License, Version 2.0 | | +| com.google.api.grpc|grpc-google-cloud-spanner-v1|6.56.0|Apache License, Version 2.0 | | +| com.google.api.grpc|grpc-google-common-protos|2.31.0|Apache License, Version 2.0 | | +| com.google.api.grpc|proto-google-cloudcompute-v1|1.44.0|Apache License, Version 2.0 | | +| com.google.api.grpc|proto-google-cloud-pubsub-v1|1.108.2|Apache License, Version 2.0 | | +| com.google.api.grpc|proto-google-cloud-spanner-admin-database-v1|6.56.0|Apache License, Version 2.0 | | +| com.google.api.grpc|proto-google-cloud-spanner-admin-instance-v1|6.56.0|Apache License, Version 2.0 | | +| com.google.api.grpc|proto-google-cloud-spanner-executor-v1|6.56.0|Apache License, Version 2.0 | | +| com.google.api.grpc|proto-google-cloud-spanner-v1|6.56.0|Apache License, Version 2.0 | | +| com.google.api.grpc|proto-google-common-protos|2.32.0|Apache License, Version 2.0 | | +| com.google.api.grpc|proto-google-iam-v1|1.27.0|Apache License, Version 2.0 | | +| com.google.auth|google-auth-library-credentials|1.22.0|BSD 3-Clause | | +| com.google.auth|google-auth-library-oauth2-http|1.22.0|BSD 3-Clause | | +| com.google.auto.value|auto-value-annotations|1.10.4|Apache License, Version 2.0 | | +| com.google.cloud|google-cloud-compute|1.44.0|Apache License, Version 2.0 | | +| com.google.cloud|google-cloud-core|2.31.0|Apache License, Version 2.0 | | +| com.google.cloud|google-cloud-core-grpc|2.31.0|Apache License, Version 2.0 | | +| com.google.cloud|google-cloud-spanner|6.56.0|Apache License, Version 2.0 | | +| com.google.cloud.functions|functions-framework-api|1.1.0|Apache License, Version 2.0 | | +| com.google.code.findbugs|jsr305|3.0.2|Apache License, Version 2.0 | | +| com.google.code.gson|gson|2.10.1|Apache License, Version 2.0 | | +| com.google.errorprone|error-prone-annotations|2.24.1|Apache License, Version 2.0 | | +| com.google.guava|failureaccess|1.0.2|Apache License, Version 2.0 | | +| com.google.guava|guava|33.0.0-jre|Apache License, Version 2.0 | | +| com.google.guava|listenablefuture|9999.0-empty-to-avoid-conflict-with-guava|Apache License, Version 2.0 | | +| com.google.http-client|google-http-client|1.43.3|Apache License, Version 2.0 | | +| com.google.http-client|google-http-client-gson|1.43.3|Apache License, Version 2.0 | | +| com.google.j2objc|j2objc-annotations|2.8|Apache License, Version 2.0 | | +| com.google.oauth-client|google-oauth-client|1.35.0|Apache License, Version 2.0 | | +| commons-codec|commons-codec|1.16|Apache License, Version 2.0| | +| commons-logging|commons-logging|1.3.0|Apache License, Version 2.0 | | +| io.cloudevents|cloudevents-api|2.5.0|Apache License, Version 2.0 | | +| io.netty|netty-buffer|4.1.100.Final|Apache License, Version 2.0 | | +| io.netty|netty-codec|4.1.100.Final|Apache License, Version 2.0 | | +| io.netty|netty-codec-http|4.1.100.Final|Apache License, Version 2.0 | | +| io.netty|netty-codec-http2|4.1.100.Final|Apache License, Version 2.0| +| io.netty|netty-common|4.1.100.Final|Apache License, Version 2.0 | | +| io.netty|netty-handler|4.1.100.Final|Apache License, Version 2.0 | | +| io.netty|netty-resolver|4.1.100.Final|Apache License, Version 2.0 | | +| io.netty|netty-transport|4.1.100.Final|Apache License, Version 2.0 | | +| io.netty|netty-transport-native-classes-epoll|4.1.100.Final|Apache License, Version 2.0| +| io.netty|netty-transport-native-unix-common|4.1.100.Final|Apache License, Version 2.0 | +| io.vavr|vavr|0.10.2|Apache License, Version 2.0 | +| io.vavr|vavr-match|0.10.2|Apache License, Version 2.0 | +| javax.annotation|javax.annotation-api|1.3.2|CDDL, GPL 2.0 | | +| org.apache.httpcomponents|httpclient|4.5.14|Apache License, Version 2.0 | | +| org.apache.httpcomponents|httpcore|4.4.16|Apache License, Version 2.0 | | +| org.apache.httpcomponents.client5|httpclient5|5.3|Apache License, Version 2.0 | | +| org.apache.httpcomponents.core5|httpcore5|5.2.4|Apache License, Version 2.0 | | +| org.apache.httpcomponents.core5|httpcore5-h2|5.2.4|Apache License, Version 2.0 | | +| org.codehaus.mojo|animal-sniffer-annotations|1.23|MIT License | | +| org.jctools|jctools-core|3.1.0|Apache License, Version 2.0 | | +| org.slf4j|slf4j-api|2.0.11|MIT License | | +| org.slf4j|slf4j-simple|2.0.11|MIT License | | +| org.threeten|threetenbp|1.6.8|BSD 3-Clause | | ## License of artifacts in this repository -Apache 2.0 - See [LICENSE](./LICENSE) for more information. +Apache License, Version 2.0 - See [LICENSE](./LICENSE) for more information. diff --git a/MODULE.bazel b/MODULE.bazel new file mode 100644 index 00000000..0573993d --- /dev/null +++ b/MODULE.bazel @@ -0,0 +1,345 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +Bazel module. +""" + +module( + name = "privacy_sandbox_aggregation_service", + version = "2.12.0", +) + +bazel_dep(name = "gazelle", version = "0.42.0", repo_name = "bazel_gazelle") +bazel_dep(name = "bazel_skylib", version = "1.7.1") +bazel_dep(name = "googletest", version = "1.14.0", repo_name = "com_google_googletest") +bazel_dep(name = "grpc-java", version = "1.69.0", repo_name = "io_grpc_grpc_java") +bazel_dep(name = "protobuf", version = "29.3", repo_name = "com_google_protobuf") +bazel_dep(name = "rpmpack", version = "0.6.0", repo_name = "com_github_google_rpmpack") +bazel_dep(name = "rules_cc", version = "0.0.17") +bazel_dep(name = "rules_go", version = "0.52.0", repo_name = "io_bazel_rules_go") +bazel_dep(name = "rules_java", version = "7.12.2") +bazel_dep(name = "rules_jvm_external", version = "6.7") +bazel_dep(name = "rules_pkg", version = "1.0.1") +bazel_dep(name = "rules_proto", version = "6.0.0") +bazel_dep(name = "rules_python", version = "1.1.0") +bazel_dep(name = "grpc", version = "1.69.0", repo_name = "com_github_grpc_grpc") + +http_archive = use_repo_rule("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") + +http_archive( + name = "terraform", + build_file_content = """ +package(default_visibility = ["//visibility:public"]) +exports_files(["terraform"]) +""", + sha256 = "728b6fbcb288ad1b7b6590585410a98d3b7e05efe4601ef776c37e15e9a83a96", + url = "https://releases.hashicorp.com/terraform/1.2.3/terraform_1.2.3_linux_amd64.zip", +) + +http_archive( + name = "packer", + build_file_content = """ +package(default_visibility = ["//visibility:public"]) +exports_files(["packer"]) +""", + sha256 = "57d0411e578aea62918d36ed186951139d5d49d44b76e5666d1fbf2427b385ae", + url = "https://releases.hashicorp.com/packer/1.8.6/packer_1.8.6_linux_amd64.zip", +) + +http_archive( + name = "google-cloud-sdk", + build_file_content = """ +package(default_visibility = ["//visibility:public"]) +exports_files(["google-cloud-sdk"]) +""", + # latest from https://cloud.google.com/storage/docs/gsutil_install#linux as of 2021-12-16 + sha256 = "94328b9c6559a1b7ec2eeaab9ef0e4702215e16e8327c5b99718750526ae1efe", + url = "https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-367.0.0-linux-x86_64.tar.gz", +) + +# TODO: Migrate to BCR +# https://github.com/bazelbuild/bazel-central-registry/pull/2742 +http_archive( + name = "com_github_googleapis_google_cloud_cpp", + sha256 = "358e3b6277a71634de7b7cb1cef14b728f6af6e450fbc9b0e5847882729b32ea", + strip_prefix = "google-cloud-cpp-c7242253b17a1754e06444bd042849ec101729c8", + urls = ["https://github.com/googleapis/google-cloud-cpp/archive/c7242253b17a1754e06444bd042849ec101729c8.zip"], # 2024-06-11 +) + +single_version_override( + module_name = "rules_cc", + version = "0.1.1", +) + +bazel_dep(name = "rules_boost", repo_name = "com_github_nelhage_rules_boost") +archive_override( + module_name = "rules_boost", + integrity = "sha256-ZLcmvYKc2FqgLvR96ApPXxp8+sXKqhBlCK66PY/uFIo=", + strip_prefix = "rules_boost-e3adfd8d6733c914d2b91a65fb7175af09602281", + urls = "https://github.com/nelhage/rules_boost/archive/e3adfd8d6733c914d2b91a65fb7175af09602281.tar.gz", +) + +bazel_dep(name = "privacy_sandbox_coordinator_services_and_shared_libraries", repo_name = "shared_libraries") + +# local_path_override( +# module_name = "privacy_sandbox_coordinator_services_and_shared_libraries", +# path = "" +# ) + +# Version updated on 2025-03-12 +COORDINATOR_VERSION = "v1.19.0-rc01" + +COORDINATOR_COMMIT_HASH = "1fb28e43af9c7ef3c29b1137ba3e710083947d10" + +git_override( + module_name = "privacy_sandbox_coordinator_services_and_shared_libraries", + commit = COORDINATOR_COMMIT_HASH, + patch_strip = 1, + patches = [ + "//build_defs/shared_libraries:coordinator.patch", + "//build_defs/shared_libraries:emulator_container.patch", + "//build_defs/shared_libraries:golang.patch", + "//build_defs/shared_libraries:rules_docker.patch", + "//build_defs/shared_libraries:tmp_build.patch", + "//build_defs/shared_libraries:workspace.patch", + ], + remote = "https://github.com/privacysandbox/coordinator-services-and-shared-libraries", +) + +http_file = use_repo_rule("@bazel_tools//tools/build_defs/repo:http.bzl", "http_file") + +http_file( + name = "google_java_format", + downloaded_file_path = "google-java-format.jar", + sha256 = "9d404cf6fe5f6aa7672693a3301ef2a22016ba540eca5d835be43104b71eb5d6", + urls = ["https://github.com/google/google-java-format/releases/download/v1.10.0/google-java-format-1.10.0-all-deps.jar"], +) + +http_file( + name = "bazelisk", + downloaded_file_path = "bazelisk", + executable = True, + sha256 = "84e946ed8537eaaa4d540df338a593e373e70c5ddca9f2f49e1aaf3a04bdd6ca", + urls = ["https://github.com/bazelbuild/bazelisk/releases/download/v1.14.0/bazelisk-linux-amd64"], +) + +bazel_dep(name = "googleapis", version = "0.0.0-20240819-fe8ba054a", repo_name = "com_google_googleapis") +archive_override( + module_name = "googleapis", + integrity = "sha256-BRPw9Ar2O9Bdx4nKzDNKts7CfMidtZZVfLLf6JGUY+Q=", + patch_strip = 1, + # Patch module support into googleapis + patches = ["//build_defs:googleapis.patch"], + strip_prefix = "googleapis-fe8ba054ad4f7eca946c2d14a63c3f07c0b586a0", + urls = [ + "https://github.com/googleapis/googleapis/archive/fe8ba054ad4f7eca946c2d14a63c3f07c0b586a0.tar.gz", + ], +) + +switched_rules = use_extension("@com_google_googleapis//:extensions.bzl", "switched_rules") +switched_rules.use_languages( + cc = True, + grpc = True, + java = True, +) +use_repo(switched_rules, "com_google_googleapis_imports") + +go_sdk = use_extension("@io_bazel_rules_go//go:extensions.bzl", "go_sdk") +go_sdk.download(version = "1.24.0") + +go_deps = use_extension("@bazel_gazelle//:extensions.bzl", "go_deps") +go_deps.module( + path = "github.com/bazelbuild/buildtools", + sum = "h1:FGzENZi+SX9I7h9xvMtRA3rel8hCEfyzSixteBgn7MU=", + version = "v0.0.0-20240918101019-be1c24cc9a44", +) + +# All *direct* Go dependencies of all `go.mod` files referenced by the `go.work` +# file have to be listed explicitly. +use_repo( + go_deps, + "com_github_bazelbuild_buildtools", +) + +# IMPORTANT: If you added dependencies and/or updated dependency versions below, run +# `$ bazel run @unpinned_maven//:pin` and include `maven_install_bzlmod.json` in your change. + +PROTOBUF_CORE_VERSION = "28.3" + +PROTOBUF_JAVA_VERSION_PREFIX = "4." + +PROTOBUF_SHA_256 = "7c3ebd7aaedd86fa5dc479a0fda803f602caaf78d8aff7ce83b89e1b8ae7442a" + +JACKSON_VERSION = "2.16.1" + +AUTO_VALUE_VERSION = "1.10.1" + +AWS_SDK_VERSION = "2.21.16" + +AWS_JAVA_SDK_VERSION = "1.12.772" + +GOOGLE_GAX_VERSION = "2.38.0" + +AUTO_SERVICE_VERSION = "1.1.1" + +OTEL_VERSION = "1.43.0" + +# IMPORTANT: If you added dependencies and/or updated dependency versions below, run +# `$ bazel run @maven//:pin` and include `maven_install_bzlmod.json` in your change. +OTEL_ARTIFACTS = [ + "com.google.errorprone:error_prone_annotations:2.+", + "io.opentelemetry:opentelemetry-api:" + OTEL_VERSION, + "io.opentelemetry:opentelemetry-exporter-logging:" + OTEL_VERSION, + "io.opentelemetry:opentelemetry-exporter-logging-otlp:" + OTEL_VERSION, + "io.opentelemetry:opentelemetry-exporter-otlp:" + OTEL_VERSION, + "io.opentelemetry:opentelemetry-sdk:" + OTEL_VERSION, + "io.opentelemetry:opentelemetry-sdk-common:" + OTEL_VERSION, + "io.opentelemetry:opentelemetry-sdk-metrics:" + OTEL_VERSION, + "io.opentelemetry:opentelemetry-sdk-testing:" + OTEL_VERSION, + "io.opentelemetry:opentelemetry-sdk-logs:" + OTEL_VERSION, + "io.opentelemetry:opentelemetry-sdk-trace:" + OTEL_VERSION, + "io.opentelemetry.contrib:opentelemetry-aws-xray:" + OTEL_VERSION, + "com.google.cloud.opentelemetry:exporter-metrics:0.33.0", + # Note from https://github.com/open-telemetry/semantic-conventions-java: + # Although this is for stable semantic conventions, the artifact still has the -alpha and comes with no + # compatibility guarantees. The goal is to mark this artifact stable. + "io.opentelemetry.semconv:opentelemetry-semconv:1.27.0-alpha", + # As of adding, https://repo1.maven.org/maven2/io/opentelemetry/contrib/opentelemetry-gcp-resources/ only shows + # that alpha version is available. + "io.opentelemetry.contrib:opentelemetry-gcp-resources:" + OTEL_VERSION + "-alpha", + "io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi:" + OTEL_VERSION, +] + +maven = use_extension("@rules_jvm_external//:extensions.bzl", "maven") + +# IMPORTANT: If you added dependencies and/or updated dependency versions below, run +# `$ bazel run @maven//:pin` and include `maven_install_bzlmod.json` in your change. + +maven.install( + name = "maven", + artifacts = [ + "com.amazonaws:aws-lambda-java-core:1.2.3", + "com.amazonaws:aws-lambda-java-events:3.11.3", + "com.amazonaws:aws-lambda-java-events-sdk-transformer:3.1.0", + "com.amazonaws:aws-java-sdk-sqs:" + AWS_JAVA_SDK_VERSION, + "com.amazonaws:aws-java-sdk-s3:" + AWS_JAVA_SDK_VERSION, + "com.amazonaws:aws-java-sdk-kms:" + AWS_JAVA_SDK_VERSION, + "com.amazonaws:aws-java-sdk-core:" + AWS_JAVA_SDK_VERSION, + "com.amazonaws:aws-java-sdk-xray:" + AWS_JAVA_SDK_VERSION, + "com.amazonaws:aws-java-sdk-logs:" + AWS_JAVA_SDK_VERSION, + "com.amazonaws:aws-java-sdk-cloudwatch:" + AWS_JAVA_SDK_VERSION, + "com.beust:jcommander:1.82", + "com.google.cloud.functions.invoker:java-function-invoker:1.1.0", + "com.google.inject:guice:5.1.0", + "com.google.inject.extensions:guice-testlib:5.1.0", + "com.fasterxml.jackson.core:jackson-annotations:" + JACKSON_VERSION, + "com.fasterxml.jackson.core:jackson-core:" + JACKSON_VERSION, + "com.fasterxml.jackson.core:jackson-databind:" + JACKSON_VERSION, + "com.fasterxml.jackson.datatype:jackson-datatype-guava:" + JACKSON_VERSION, + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:" + JACKSON_VERSION, + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:" + JACKSON_VERSION, + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor:" + JACKSON_VERSION, + "com.google.acai:acai:1.1", + "com.google.auto.factory:auto-factory:1.0.1", + "com.google.auto.service:auto-service-annotations:" + AUTO_SERVICE_VERSION, + "com.google.auto.service:auto-service:" + AUTO_SERVICE_VERSION, + "com.google.auto.value:auto-value-annotations:" + AUTO_VALUE_VERSION, + "com.google.auto.value:auto-value:" + AUTO_VALUE_VERSION, + "com.google.code.findbugs:jsr305:3.0.2", + "com.google.cloud:google-cloud-logging:3.21.2", + "com.google.cloud:google-cloud-kms:2.60.0", + "com.google.cloud:google-cloud-pubsub:1.136.1", + "com.google.cloud:google-cloud-storage:2.48.0", + "com.google.cloud:google-cloud-spanner:6.86.0", + "com.google.cloud:google-cloud-secretmanager:2.57.0", + "com.google.cloud:google-cloud-compute:1.67.0", + "com.google.api.grpc:proto-google-cloud-logging-v2:0.110.2", + "com.google.api.grpc:proto-google-cloud-compute-v1:1.67.0", + "com.google.cloud.functions:functions-framework-api:1.1.0", + "commons-logging:commons-logging:1.3.0", + "com.google.api.grpc:proto-google-common-protos:2.34.0", + "com.google.cloud:google-cloud-trace:2.35.0", + "com.google.api.grpc:proto-google-cloud-trace-v1:2.35.0", + "com.google.api:gax:" + GOOGLE_GAX_VERSION, + "com.google.http-client:google-http-client-jackson2:1.43.3", + "io.reactivex.rxjava3:rxjava:3.1.8", + "com.google.cloud:google-cloud-monitoring:3.35.0", + "com.google.api.grpc:proto-google-cloud-monitoring-v3:3.35.0", + "com.google.protobuf:protobuf-java:" + PROTOBUF_JAVA_VERSION_PREFIX + PROTOBUF_CORE_VERSION, + "com.google.protobuf:protobuf-java-util:" + PROTOBUF_JAVA_VERSION_PREFIX + PROTOBUF_CORE_VERSION, + "com.google.guava:guava:33.0.0-jre", + "com.google.guava:guava-testlib:33.0.0-jre", + "com.google.jimfs:jimfs:1.3.0", + "com.google.testparameterinjector:test-parameter-injector:1.15", + "com.google.truth.extensions:truth-java8-extension:1.3.0", + "com.google.truth.extensions:truth-proto-extension:1.3.0", + "com.google.truth:truth:1.3.0", + "com.jayway.jsonpath:json-path:2.9.0", + "javax.inject:javax.inject:1", + "io.github.resilience4j:resilience4j-core:1.7.1", + "io.github.resilience4j:resilience4j-retry:1.7.1", + "junit:junit:4.13.2", + "org.apache.avro:avro:1.12.0", + "org.apache.commons:commons-compress:1.26.2", + "org.apache.commons:commons-math3:3.6.1", + "org.apache.httpcomponents:httpcore:4.4.16", + "org.apache.httpcomponents:httpclient:4.5.14", + "org.apache.httpcomponents.client5:httpclient5:5.3", + "org.apache.httpcomponents.core5:httpcore5:5.2.4", + "org.apache.httpcomponents.core5:httpcore5-h2:5.2.4", + "org.apache.logging.log4j:log4j-1.2-api:2.22.1", + "org.apache.logging.log4j:log4j-core:2.22.1", + "org.awaitility:awaitility:3.1.6", + "org.mock-server:mockserver-core:5.11.2", + "org.mock-server:mockserver-junit-rule:5.11.2", + "org.mock-server:mockserver-client-java:5.11.2", + "org.hamcrest:hamcrest-library:2.2", + "org.mockito:mockito-core:4.11.0", + "org.slf4j:slf4j-api:2.0.11", + "org.slf4j:slf4j-simple:2.0.11", + "org.slf4j:slf4j-log4j12:1.7.33", + "org.testcontainers:testcontainers:1.19.3", + "org.testcontainers:localstack:1.19.3", + "software.amazon.awssdk:aws-sdk-java:" + AWS_SDK_VERSION, + "software.amazon.awssdk:dynamodb-enhanced:" + AWS_SDK_VERSION, + "software.amazon.awssdk:dynamodb:" + AWS_SDK_VERSION, + "software.amazon.awssdk:ec2:" + AWS_SDK_VERSION, + "software.amazon.awssdk:regions:" + AWS_SDK_VERSION, + "software.amazon.awssdk:s3:" + AWS_SDK_VERSION, + "software.amazon.awssdk:s3-transfer-manager:" + AWS_SDK_VERSION, + "software.amazon.awssdk:aws-core:" + AWS_SDK_VERSION, + "software.amazon.awssdk:ssm:" + AWS_SDK_VERSION, + "software.amazon.awssdk:sts:" + AWS_SDK_VERSION, + "software.amazon.awssdk:sqs:" + AWS_SDK_VERSION, + "software.amazon.awssdk:url-connection-client:" + AWS_SDK_VERSION, + "software.amazon.awssdk:utils:" + AWS_SDK_VERSION, + "software.amazon.awssdk:auth:" + AWS_SDK_VERSION, + "software.amazon.awssdk:lambda:" + AWS_SDK_VERSION, + "com.google.crypto.tink:tink:1.13.0", + "com.google.crypto.tink:tink-gcpkms:1.9.0", + "com.google.oauth-client:google-oauth-client:1.37.0", + "com.google.auth:google-auth-library-oauth2-http:1.31.0", + "io.netty:netty-codec-http:4.1.115.Final", + "com.google.cloud:google-cloud-iamcredentials:2.57.0", + ] + OTEL_ARTIFACTS, + # Run `bazel run @maven//:pin` to regenerate. + lock_file = "//:maven_install_bzlmod.json", + repositories = [ + "https://repo1.maven.org/maven2", + "https://maven.google.com", + "https://jcenter.bintray.com", + ], +) +use_repo(maven, "maven") diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock new file mode 100644 index 00000000..6eb2dcfc --- /dev/null +++ b/MODULE.bazel.lock @@ -0,0 +1,7753 @@ +{ + "lockFileVersion": 13, + "registryFileHashes": { + "https://bcr.bazel.build/bazel_registry.json": "8a28e4aff06ee60aed2a8c281907fb8bcbf3b753c91fb5a5c57da3215d5b3497", + "https://bcr.bazel.build/modules/abseil-cpp/20210324.2/MODULE.bazel": "7cd0312e064fde87c8d1cd79ba06c876bd23630c83466e9500321be55c96ace2", + "https://bcr.bazel.build/modules/abseil-cpp/20211102.0/MODULE.bazel": "70390338f7a5106231d20620712f7cccb659cd0e9d073d1991c038eb9fc57589", + "https://bcr.bazel.build/modules/abseil-cpp/20220623.1/MODULE.bazel": "73ae41b6818d423a11fd79d95aedef1258f304448193d4db4ff90e5e7a0f076c", + "https://bcr.bazel.build/modules/abseil-cpp/20230125.1/MODULE.bazel": "89047429cb0207707b2dface14ba7f8df85273d484c2572755be4bab7ce9c3a0", + "https://bcr.bazel.build/modules/abseil-cpp/20230802.0.bcr.1/MODULE.bazel": "1c8cec495288dccd14fdae6e3f95f772c1c91857047a098fad772034264cc8cb", + "https://bcr.bazel.build/modules/abseil-cpp/20230802.0/MODULE.bazel": "d253ae36a8bd9ee3c5955384096ccb6baf16a1b1e93e858370da0a3b94f77c16", + "https://bcr.bazel.build/modules/abseil-cpp/20230802.1/MODULE.bazel": "fa92e2eb41a04df73cdabeec37107316f7e5272650f81d6cc096418fe647b915", + "https://bcr.bazel.build/modules/abseil-cpp/20240116.0/MODULE.bazel": "98dc378d64c12a4e4741ad3362f87fb737ee6a0886b2d90c3cdbb4d93ea3e0bf", + "https://bcr.bazel.build/modules/abseil-cpp/20240116.1/MODULE.bazel": "37bcdb4440fbb61df6a1c296ae01b327f19e9bb521f9b8e26ec854b6f97309ed", + "https://bcr.bazel.build/modules/abseil-cpp/20240116.2/MODULE.bazel": "73939767a4686cd9a520d16af5ab440071ed75cec1a876bf2fcfaf1f71987a16", + "https://bcr.bazel.build/modules/abseil-cpp/20240722.0/MODULE.bazel": "88668a07647adbdc14cb3a7cd116fb23c9dda37a90a1681590b6c9d8339a5b84", + "https://bcr.bazel.build/modules/abseil-cpp/20240722.1/MODULE.bazel": "2c6fd3cabd336249aee62c33696ba2fa4f2dc8364df564b76f25e9b940a9c6b4", + "https://bcr.bazel.build/modules/abseil-cpp/20240722.1/source.json": "418dc1af6c5a913cbd9727029c9e4b987e57835bb5f7f6e6ff74c0f3660cf022", + "https://bcr.bazel.build/modules/apple_support/1.15.1/MODULE.bazel": "a0556fefca0b1bb2de8567b8827518f94db6a6e7e7d632b4c48dc5f865bc7c85", + "https://bcr.bazel.build/modules/apple_support/1.15.1/source.json": "517f2b77430084c541bc9be2db63fdcbb7102938c5f64c17ee60ffda2e5cf07b", + "https://bcr.bazel.build/modules/apple_support/1.5.0/MODULE.bazel": "50341a62efbc483e8a2a6aec30994a58749bd7b885e18dd96aa8c33031e558ef", + "https://bcr.bazel.build/modules/bazel_features/1.1.0/MODULE.bazel": "cfd42ff3b815a5f39554d97182657f8c4b9719568eb7fded2b9135f084bf760b", + "https://bcr.bazel.build/modules/bazel_features/1.1.1/MODULE.bazel": "27b8c79ef57efe08efccbd9dd6ef70d61b4798320b8d3c134fd571f78963dbcd", + "https://bcr.bazel.build/modules/bazel_features/1.11.0/MODULE.bazel": "f9382337dd5a474c3b7d334c2f83e50b6eaedc284253334cf823044a26de03e8", + "https://bcr.bazel.build/modules/bazel_features/1.15.0/MODULE.bazel": "d38ff6e517149dc509406aca0db3ad1efdd890a85e049585b7234d04238e2a4d", + "https://bcr.bazel.build/modules/bazel_features/1.17.0/MODULE.bazel": "039de32d21b816b47bd42c778e0454217e9c9caac4a3cf8e15c7231ee3ddee4d", + "https://bcr.bazel.build/modules/bazel_features/1.18.0/MODULE.bazel": "1be0ae2557ab3a72a57aeb31b29be347bcdc5d2b1eb1e70f39e3851a7e97041a", + "https://bcr.bazel.build/modules/bazel_features/1.19.0/MODULE.bazel": "59adcdf28230d220f0067b1f435b8537dd033bfff8db21335ef9217919c7fb58", + "https://bcr.bazel.build/modules/bazel_features/1.21.0/MODULE.bazel": "675642261665d8eea09989aa3b8afb5c37627f1be178382c320d1b46afba5e3b", + "https://bcr.bazel.build/modules/bazel_features/1.21.0/source.json": "3e8379efaaef53ce35b7b8ba419df829315a880cb0a030e5bb45c96d6d5ecb5f", + "https://bcr.bazel.build/modules/bazel_features/1.3.0/MODULE.bazel": "cdcafe83ec318cda34e02948e81d790aab8df7a929cec6f6969f13a489ccecd9", + "https://bcr.bazel.build/modules/bazel_features/1.4.1/MODULE.bazel": "e45b6bb2350aff3e442ae1111c555e27eac1d915e77775f6fdc4b351b758b5d7", + "https://bcr.bazel.build/modules/bazel_features/1.9.1/MODULE.bazel": "8f679097876a9b609ad1f60249c49d68bfab783dd9be012faf9d82547b14815a", + "https://bcr.bazel.build/modules/bazel_skylib/1.0.3/MODULE.bazel": "bcb0fd896384802d1ad283b4e4eb4d718eebd8cb820b0a2c3a347fb971afd9d8", + "https://bcr.bazel.build/modules/bazel_skylib/1.1.1/MODULE.bazel": "1add3e7d93ff2e6998f9e118022c84d163917d912f5afafb3058e3d2f1545b5e", + "https://bcr.bazel.build/modules/bazel_skylib/1.2.0/MODULE.bazel": "44fe84260e454ed94ad326352a698422dbe372b21a1ac9f3eab76eb531223686", + "https://bcr.bazel.build/modules/bazel_skylib/1.2.1/MODULE.bazel": "f35baf9da0efe45fa3da1696ae906eea3d615ad41e2e3def4aeb4e8bc0ef9a7a", + "https://bcr.bazel.build/modules/bazel_skylib/1.3.0/MODULE.bazel": "20228b92868bf5cfc41bda7afc8a8ba2a543201851de39d990ec957b513579c5", + "https://bcr.bazel.build/modules/bazel_skylib/1.4.1/MODULE.bazel": "a0dcb779424be33100dcae821e9e27e4f2901d9dfd5333efe5ac6a8d7ab75e1d", + "https://bcr.bazel.build/modules/bazel_skylib/1.4.2/MODULE.bazel": "3bd40978e7a1fac911d5989e6b09d8f64921865a45822d8b09e815eaa726a651", + "https://bcr.bazel.build/modules/bazel_skylib/1.5.0/MODULE.bazel": "32880f5e2945ce6a03d1fbd588e9198c0a959bb42297b2cfaf1685b7bc32e138", + "https://bcr.bazel.build/modules/bazel_skylib/1.6.1/MODULE.bazel": "8fdee2dbaace6c252131c00e1de4b165dc65af02ea278476187765e1a617b917", + "https://bcr.bazel.build/modules/bazel_skylib/1.7.0/MODULE.bazel": "0db596f4563de7938de764cc8deeabec291f55e8ec15299718b93c4423e9796d", + "https://bcr.bazel.build/modules/bazel_skylib/1.7.1/MODULE.bazel": "3120d80c5861aa616222ec015332e5f8d3171e062e3e804a2a0253e1be26e59b", + "https://bcr.bazel.build/modules/bazel_skylib/1.7.1/source.json": "f121b43eeefc7c29efbd51b83d08631e2347297c95aac9764a701f2a6a2bb953", + "https://bcr.bazel.build/modules/boringssl/0.0.0-20211025-d4f1ab9/MODULE.bazel": "6ee6353f8b1a701fe2178e1d925034294971350b6d3ac37e67e5a7d463267834", + "https://bcr.bazel.build/modules/boringssl/0.0.0-20230215-5c22014/MODULE.bazel": "4b03dc0d04375fa0271174badcd202ed249870c8e895b26664fd7298abea7282", + "https://bcr.bazel.build/modules/boringssl/0.0.0-20240530-2db0eb3/MODULE.bazel": "d0405b762c5e87cd445b7015f2b8da5400ef9a8dbca0bfefa6c1cea79d528a97", + "https://bcr.bazel.build/modules/boringssl/0.20240913.0/MODULE.bazel": "fcaa7503a5213290831a91ed1eb538551cf11ac0bc3a6ad92d0fef92c5bd25fb", + "https://bcr.bazel.build/modules/boringssl/0.20241024.0/MODULE.bazel": "b540cff73d948cb79cb0bc108d7cef391d2098a25adabfda5043e4ef548dbc87", + "https://bcr.bazel.build/modules/boringssl/0.20250114.0/MODULE.bazel": "1e4e83d7fcd35d0441a92452544773947658e34001af9b9ce5475977bfa013e2", + "https://bcr.bazel.build/modules/boringssl/0.20250114.0/source.json": "12bb512f9cc813f7a33f810ff4e12049630865e0b3cae74b0dc399312c5af13d", + "https://bcr.bazel.build/modules/buildozer/7.1.2/MODULE.bazel": "2e8dd40ede9c454042645fd8d8d0cd1527966aa5c919de86661e62953cd73d84", + "https://bcr.bazel.build/modules/buildozer/7.1.2/source.json": "c9028a501d2db85793a6996205c8de120944f50a0d570438fcae0457a5f9d1f8", + "https://bcr.bazel.build/modules/bzip2/1.0.8/MODULE.bazel": "83ee443b286b0b91566e5ee77e74ba6445895f3135467893871560f9e4ebc159", + "https://bcr.bazel.build/modules/bzip2/1.0.8/source.json": "b64f3a2f973749cf5f6ee32b3d804af56a35a746228a7845ed5daa31c8cc8af1", + "https://bcr.bazel.build/modules/c-ares/1.15.0/MODULE.bazel": "ba0a78360fdc83f02f437a9e7df0532ad1fbaa59b722f6e715c11effebaa0166", + "https://bcr.bazel.build/modules/c-ares/1.15.0/source.json": "5e3ed991616c5ec4cc09b0893b29a19232de4a1830eb78c567121bfea87453f7", + "https://bcr.bazel.build/modules/cel-spec/0.15.0/MODULE.bazel": "e1eed53d233acbdcf024b4b0bc1528116d92c29713251b5154078ab1348cb600", + "https://bcr.bazel.build/modules/cel-spec/0.15.0/source.json": "ab7dccdf21ea2261c0f809b5a5221a4d7f8b580309f285fdf1444baaca75d44a", + "https://bcr.bazel.build/modules/civetweb/1.16/MODULE.bazel": "46a38f9daeb57392e3827fce7d40926be0c802bd23cdd6bfd3a96c804de42fae", + "https://bcr.bazel.build/modules/civetweb/1.16/source.json": "ba8b9585adb8355cb51b999d57172fd05e7a762c56b8d4bac6db42c99de3beb7", + "https://bcr.bazel.build/modules/crc32c/1.1.0/MODULE.bazel": "f11439d063a2b4e0f19b56bb8da6a931f9691bf583bd1ec0718645bce6c62b06", + "https://bcr.bazel.build/modules/crc32c/1.1.0/source.json": "aabc6ce46d4b71343d500270c2ddfd45f59cff9fd171313bdd773bf620cf2a6f", + "https://bcr.bazel.build/modules/curl/8.4.0/MODULE.bazel": "0bc250aa1cb69590049383df7a9537c809591fcf876c620f5f097c58fdc9bc10", + "https://bcr.bazel.build/modules/curl/8.7.1/MODULE.bazel": "088221c35a2939c555e6e47cb31a81c15f8b59f4daa8009b1e9271a502d33485", + "https://bcr.bazel.build/modules/curl/8.8.0.bcr.2/MODULE.bazel": "9bd3a98e18919f51008d9999f14e6d918ddabc4e623bf0b70bc470daf2731bec", + "https://bcr.bazel.build/modules/curl/8.8.0.bcr.2/source.json": "1a40c802eff93a3106bb68e18faec596e0dcb7773b2994965d0438de52376778", + "https://bcr.bazel.build/modules/curl/8.8.0/MODULE.bazel": "7da3b3e79b0b4ee8f8c95d640bc6ad7b430ce66ef6e9c9d2bc29b3b5ef85f6fe", + "https://bcr.bazel.build/modules/cython/3.0.11-1/MODULE.bazel": "868b3f5c956c3657420d2302004c6bb92606bfa47e314bab7f2ba0630c7c966c", + "https://bcr.bazel.build/modules/cython/3.0.11-1/source.json": "da318be900b8ca9c3d1018839d3bebc5a8e1645620d0848fa2c696d4ecf7c296", + "https://bcr.bazel.build/modules/envoy_api/0.0.0-20241214-918efc9/MODULE.bazel": "24e05f6f52f37be63a795192848555a2c8c855e7814dbc1ed419fb04a7005464", + "https://bcr.bazel.build/modules/envoy_api/0.0.0-20250128-4de3c74/MODULE.bazel": "1fe72489212c530086e3ffb0e018b2bfef4663200ca03571570f9f006bef1d75", + "https://bcr.bazel.build/modules/envoy_api/0.0.0-20250128-4de3c74/source.json": "028519164a2e24563f4b43d810fdedc702daed90e71e7042d45ba82ad807b46f", + "https://bcr.bazel.build/modules/gazelle/0.27.0/MODULE.bazel": "3446abd608295de6d90b4a8a118ed64a9ce11dcb3dda2dc3290a22056bd20996", + "https://bcr.bazel.build/modules/gazelle/0.30.0/MODULE.bazel": "f888a1effe338491f35f0e0e85003b47bb9d8295ccba73c37e07702d8d31c65b", + "https://bcr.bazel.build/modules/gazelle/0.32.0/MODULE.bazel": "b499f58a5d0d3537f3cf5b76d8ada18242f64ec474d8391247438bf04f58c7b8", + "https://bcr.bazel.build/modules/gazelle/0.33.0/MODULE.bazel": "a13a0f279b462b784fb8dd52a4074526c4a2afe70e114c7d09066097a46b3350", + "https://bcr.bazel.build/modules/gazelle/0.34.0/MODULE.bazel": "abdd8ce4d70978933209db92e436deb3a8b737859e9354fb5fd11fb5c2004c8a", + "https://bcr.bazel.build/modules/gazelle/0.35.0/MODULE.bazel": "bda67986233654255d52d56c2e8d8ce5649fdcf0acd96b1fdd04af4d7e038c36", + "https://bcr.bazel.build/modules/gazelle/0.36.0/MODULE.bazel": "e375d5d6e9a6ca59b0cb38b0540bc9a05b6aa926d322f2de268ad267a2ee74c0", + "https://bcr.bazel.build/modules/gazelle/0.42.0/MODULE.bazel": "fa140a7c019f3a22779ba7c6132ffff9d2d10a51dba2f3304dee61523d11fef4", + "https://bcr.bazel.build/modules/gazelle/0.42.0/source.json": "eb6f7b0cb76c52d2679164910a01fa6ddcee409e6a7fee06e602ef259f65165c", + "https://bcr.bazel.build/modules/google_benchmark/1.8.2/MODULE.bazel": "a70cf1bba851000ba93b58ae2f6d76490a9feb74192e57ab8e8ff13c34ec50cb", + "https://bcr.bazel.build/modules/google_benchmark/1.8.4/MODULE.bazel": "c6d54a11dcf64ee63545f42561eda3fd94c1b5f5ebe1357011de63ae33739d5e", + "https://bcr.bazel.build/modules/google_benchmark/1.8.5/MODULE.bazel": "9ba9b31b984022828a950e3300410977eda2e35df35584c6b0b2d0c2e52766b7", + "https://bcr.bazel.build/modules/google_benchmark/1.9.1/MODULE.bazel": "1abfd0395aea2db11943d817afb6c03208bee28b2e47eccc3042f67a22d3ce1b", + "https://bcr.bazel.build/modules/google_benchmark/1.9.1/source.json": "5d68196f85589340f5ca834d0bea3a49129d8cebf486d51b3d29419b0437bbbc", + "https://bcr.bazel.build/modules/googletest/1.11.0/MODULE.bazel": "3a83f095183f66345ca86aa13c58b59f9f94a2f81999c093d4eeaa2d262d12f4", + "https://bcr.bazel.build/modules/googletest/1.14.0.bcr.1/MODULE.bazel": "22c31a561553727960057361aa33bf20fb2e98584bc4fec007906e27053f80c6", + "https://bcr.bazel.build/modules/googletest/1.14.0/MODULE.bazel": "cfbcbf3e6eac06ef9d85900f64424708cc08687d1b527f0ef65aa7517af8118f", + "https://bcr.bazel.build/modules/googletest/1.15.2/MODULE.bazel": "6de1edc1d26cafb0ea1a6ab3f4d4192d91a312fd2d360b63adaa213cd00b2108", + "https://bcr.bazel.build/modules/googletest/1.15.2/source.json": "dbdda654dcb3a0d7a8bc5d0ac5fc7e150b58c2a986025ae5bc634bb2cb61f470", + "https://bcr.bazel.build/modules/grpc-java/1.66.0/MODULE.bazel": "86ff26209fac846adb89db11f3714b3dc0090fb2fb81575673cc74880cda4e7e", + "https://bcr.bazel.build/modules/grpc-java/1.69.0/MODULE.bazel": "53887af6a00b3b406d70175d3d07e84ea9362016ff55ea90b9185f0227bfaf98", + "https://bcr.bazel.build/modules/grpc-java/1.69.0/source.json": "daf42ef1f7a2b86d9178d288c5245802f9b6157adc302b2b05c8fd12cbd79659", + "https://bcr.bazel.build/modules/grpc-proto/0.0.0-20240627-ec30f58/MODULE.bazel": "88de79051e668a04726e9ea94a481ec6f1692086735fd6f488ab908b3b909238", + "https://bcr.bazel.build/modules/grpc-proto/0.0.0-20240627-ec30f58/source.json": "5035d379c61042930244ab59e750106d893ec440add92ec0df6a0098ca7f131d", + "https://bcr.bazel.build/modules/grpc/1.41.0/MODULE.bazel": "5bcbfc2b274dabea628f0649dc50c90cf36543b1cfc31624832538644ad1aae8", + "https://bcr.bazel.build/modules/grpc/1.56.3.bcr.1/MODULE.bazel": "cd5b1eb276b806ec5ab85032921f24acc51735a69ace781be586880af20ab33f", + "https://bcr.bazel.build/modules/grpc/1.62.1/MODULE.bazel": "2998211594b8a79a6b459c4e797cfa19f0fb8b3be3149760ec7b8c99abfd426f", + "https://bcr.bazel.build/modules/grpc/1.63.1.bcr.1/MODULE.bazel": "d7b9fef03bd175e6825237b521b18a3c29f1ac15f8aa52c8a1a0f3bd8f33d54b", + "https://bcr.bazel.build/modules/grpc/1.66.0.bcr.2/MODULE.bazel": "0fa2b0fd028ce354febf0fe90f1ed8fecfbfc33118cddd95ac0418cc283333a0", + "https://bcr.bazel.build/modules/grpc/1.66.0.bcr.3/MODULE.bazel": "f6047e89faf488f5e3e65cb2594c6f5e86992abec7487163ff6b623526e543b0", + "https://bcr.bazel.build/modules/grpc/1.69.0/MODULE.bazel": "4e26e05c9e1ef291ccbc96aad8e457b1b8abedbc141623831629da2f8168eef6", + "https://bcr.bazel.build/modules/grpc/1.69.0/source.json": "82e5cd0eeed569909ff42fd6946b813c8b69fc71a6b075ccebef224937e19215", + "https://bcr.bazel.build/modules/jsoncpp/1.9.5/MODULE.bazel": "31271aedc59e815656f5736f282bb7509a97c7ecb43e927ac1a37966e0578075", + "https://bcr.bazel.build/modules/jsoncpp/1.9.5/source.json": "4108ee5085dd2885a341c7fab149429db457b3169b86eb081fa245eadf69169d", + "https://bcr.bazel.build/modules/libpfm/4.11.0/MODULE.bazel": "45061ff025b301940f1e30d2c16bea596c25b176c8b6b3087e92615adbd52902", + "https://bcr.bazel.build/modules/libpfm/4.11.0/source.json": "caaffb3ac2b59b8aac456917a4ecf3167d40478ee79f15ab7a877ec9273937c9", + "https://bcr.bazel.build/modules/mbedtls/3.6.0/MODULE.bazel": "8e380e4698107c5f8766264d4df92e36766248447858db28187151d884995a09", + "https://bcr.bazel.build/modules/mbedtls/3.6.0/source.json": "1dbe7eb5258050afcc3806b9d43050f71c6f539ce0175535c670df606790b30c", + "https://bcr.bazel.build/modules/nlohmann_json/3.11.3.bcr.1/MODULE.bazel": "83bbe365b1eb640ef903df2240f11e7df8f70563199bc17085816033bc36da89", + "https://bcr.bazel.build/modules/nlohmann_json/3.11.3.bcr.1/source.json": "7b0b57c1a789dd0b81b8e6f639f36f96a6f4534c2f2ed4430118af6769b00cdf", + "https://bcr.bazel.build/modules/nlohmann_json/3.11.3/MODULE.bazel": "87023db2f55fc3a9949c7b08dc711fae4d4be339a80a99d04453c4bb3998eefc", + "https://bcr.bazel.build/modules/nlohmann_json/3.6.1/MODULE.bazel": "6f7b417dcc794d9add9e556673ad25cb3ba835224290f4f848f8e2db1e1fca74", + "https://bcr.bazel.build/modules/onetbb/2021.10.0/MODULE.bazel": "24af938d1964cce4a82c6a966098d8dfed0ab0d21253f38fe63ac94a5f1c0198", + "https://bcr.bazel.build/modules/onetbb/2021.10.0/source.json": "f1455a145057570b74f78dde1de469620946df15a2267276aa713adac010059d", + "https://bcr.bazel.build/modules/opencensus-cpp/0.0.0-20230502-50eb5de/MODULE.bazel": "02201d2921dadb4ec90c4980eca4b2a02904eddcf6fa02f3da7594fb7b0d821c", + "https://bcr.bazel.build/modules/opencensus-cpp/0.0.0-20230502-50eb5de/source.json": "f50efc07822f5425bd1d3e40e977484f9c0142463052717d40ec85cd6744243e", + "https://bcr.bazel.build/modules/opencensus-proto/0.4.1/MODULE.bazel": "4a2e8b4d0b544002502474d611a5a183aa282251e14f6a01afe841c0c1b10372", + "https://bcr.bazel.build/modules/opencensus-proto/0.4.1/source.json": "a7d956700a85b833c43fc61455c0e111ab75bab40768ed17a206ee18a2bbe38f", + "https://bcr.bazel.build/modules/openssl/3.3.1.bcr.1/MODULE.bazel": "49c0c07e8fb87b480bccb842cfee1b32617f11dac590f732573c69058699a3d1", + "https://bcr.bazel.build/modules/openssl/3.3.1.bcr.1/source.json": "0c0872e048bbea052a9c541fb47019481a19201ba5555a71d762ad591bf94e1f", + "https://bcr.bazel.build/modules/opentelemetry-cpp/1.14.2/MODULE.bazel": "089a5613c2a159c7dfde098dabfc61e966889c7d6a81a98422a84c51535ed17d", + "https://bcr.bazel.build/modules/opentelemetry-cpp/1.16.0/MODULE.bazel": "b7379a140f538cea3f749179a2d481ed81942cc6f7b05a6113723eb34ac3b3e7", + "https://bcr.bazel.build/modules/opentelemetry-cpp/1.19.0/MODULE.bazel": "3455326c08b28415648a3d60d8e3c811847ebdbe64474f75b25878f25585aea1", + "https://bcr.bazel.build/modules/opentelemetry-cpp/1.19.0/source.json": "4e48137e4c3ecb99401ff99876df8fa330598d7da051869bec643446e8a8ff95", + "https://bcr.bazel.build/modules/opentelemetry-proto/1.1.0/MODULE.bazel": "a49f406e99bf05ab43ed4f5b3322fbd33adfd484b6546948929d1316299b68bf", + "https://bcr.bazel.build/modules/opentelemetry-proto/1.3.1/MODULE.bazel": "0141a50e989576ee064c11ce8dd5ec89993525bd9f9a09c5618e4dacc8df9352", + "https://bcr.bazel.build/modules/opentelemetry-proto/1.4.0.bcr.1/MODULE.bazel": "5ceaf25e11170d22eded4c8032728b4a3f273765fccda32f9e94f463755c4167", + "https://bcr.bazel.build/modules/opentelemetry-proto/1.5.0/MODULE.bazel": "7543d91a53b98e7b5b37c5a0865b93bff12c1ee022b1e322cd236b968894b030", + "https://bcr.bazel.build/modules/opentelemetry-proto/1.5.0/source.json": "046b721ce203e88cdaad44d7dd17a86b7200eab9388b663b234e72e13ff7b143", + "https://bcr.bazel.build/modules/opentracing-cpp/1.6.0/MODULE.bazel": "b3925269f63561b8b880ae7cf62ccf81f6ece55b62cd791eda9925147ae116ec", + "https://bcr.bazel.build/modules/opentracing-cpp/1.6.0/source.json": "da1cb1add160f5e5074b7272e9db6fd8f1b3336c15032cd0a653af9d2f484aed", + "https://bcr.bazel.build/modules/platforms/0.0.10/MODULE.bazel": "8cb8efaf200bdeb2150d93e162c40f388529a25852b332cec879373771e48ed5", + "https://bcr.bazel.build/modules/platforms/0.0.11/MODULE.bazel": "0daefc49732e227caa8bfa834d65dc52e8cc18a2faf80df25e8caea151a9413f", + "https://bcr.bazel.build/modules/platforms/0.0.11/source.json": "f7e188b79ebedebfe75e9e1d098b8845226c7992b307e28e1496f23112e8fc29", + "https://bcr.bazel.build/modules/platforms/0.0.4/MODULE.bazel": "9b328e31ee156f53f3c416a64f8491f7eb731742655a47c9eec4703a71644aee", + "https://bcr.bazel.build/modules/platforms/0.0.5/MODULE.bazel": "5733b54ea419d5eaf7997054bb55f6a1d0b5ff8aedf0176fef9eea44f3acda37", + "https://bcr.bazel.build/modules/platforms/0.0.6/MODULE.bazel": "ad6eeef431dc52aefd2d77ed20a4b353f8ebf0f4ecdd26a807d2da5aa8cd0615", + "https://bcr.bazel.build/modules/platforms/0.0.7/MODULE.bazel": "72fd4a0ede9ee5c021f6a8dd92b503e089f46c227ba2813ff183b71616034814", + "https://bcr.bazel.build/modules/platforms/0.0.8/MODULE.bazel": "9f142c03e348f6d263719f5074b21ef3adf0b139ee4c5133e2aa35664da9eb2d", + "https://bcr.bazel.build/modules/platforms/0.0.9/MODULE.bazel": "4a87a60c927b56ddd67db50c89acaa62f4ce2a1d2149ccb63ffd871d5ce29ebc", + "https://bcr.bazel.build/modules/prometheus-cpp/1.2.4/MODULE.bazel": "0fbe5dcff66311947a3f6b86ebc6a6d9328e31a28413ca864debc4a043f371e5", + "https://bcr.bazel.build/modules/prometheus-cpp/1.3.0/MODULE.bazel": "ce82e086bbc0b60267e970f6a54b2ca6d0f22d3eb6633e00e2cc2899c700f3d8", + "https://bcr.bazel.build/modules/prometheus-cpp/1.3.0/source.json": "8cb66b4e535afc718e9d104a3db96ccb71a42ee816a100e50fd0d5ac843c0606", + "https://bcr.bazel.build/modules/protobuf/21.7/MODULE.bazel": "a5a29bb89544f9b97edce05642fac225a808b5b7be74038ea3640fae2f8e66a7", + "https://bcr.bazel.build/modules/protobuf/23.1/MODULE.bazel": "88b393b3eb4101d18129e5db51847cd40a5517a53e81216144a8c32dfeeca52a", + "https://bcr.bazel.build/modules/protobuf/24.4/MODULE.bazel": "7bc7ce5f2abf36b3b7b7c8218d3acdebb9426aeb35c2257c96445756f970eb12", + "https://bcr.bazel.build/modules/protobuf/26.0.bcr.1/MODULE.bazel": "8f04d38c2da40a3715ff6bdce4d32c5981e6432557571482d43a62c31a24c2cf", + "https://bcr.bazel.build/modules/protobuf/26.0.bcr.2/MODULE.bazel": "62e0b84ca727bdeb55a6fe1ef180e6b191bbe548a58305ea1426c158067be534", + "https://bcr.bazel.build/modules/protobuf/26.0/MODULE.bazel": "8402da964092af40097f4a205eec2a33fd4a7748dc43632b7d1629bfd9a2b856", + "https://bcr.bazel.build/modules/protobuf/27.0-rc2/MODULE.bazel": "b2b0dbafd57b6bec0ca9b251da02e628c357dab53a097570aa7d79d020f107cf", + "https://bcr.bazel.build/modules/protobuf/27.0/MODULE.bazel": "7873b60be88844a0a1d8f80b9d5d20cfbd8495a689b8763e76c6372998d3f64c", + "https://bcr.bazel.build/modules/protobuf/27.1/MODULE.bazel": "703a7b614728bb06647f965264967a8ef1c39e09e8f167b3ca0bb1fd80449c0d", + "https://bcr.bazel.build/modules/protobuf/29.0-rc2/MODULE.bazel": "6241d35983510143049943fc0d57937937122baf1b287862f9dc8590fc4c37df", + "https://bcr.bazel.build/modules/protobuf/29.0-rc3/MODULE.bazel": "33c2dfa286578573afc55a7acaea3cada4122b9631007c594bf0729f41c8de92", + "https://bcr.bazel.build/modules/protobuf/29.0/MODULE.bazel": "319dc8bf4c679ff87e71b1ccfb5a6e90a6dbc4693501d471f48662ac46d04e4e", + "https://bcr.bazel.build/modules/protobuf/29.3/MODULE.bazel": "77480eea5fb5541903e49683f24dc3e09f4a79e0eea247414887bb9fc0066e94", + "https://bcr.bazel.build/modules/protobuf/29.3/source.json": "c460e6550ddd24996232c7542ebf201f73c4e01d2183a31a041035fb50f19681", + "https://bcr.bazel.build/modules/protobuf/3.19.0/MODULE.bazel": "6b5fbb433f760a99a22b18b6850ed5784ef0e9928a72668b66e4d7ccd47db9b0", + "https://bcr.bazel.build/modules/protobuf/3.19.2/MODULE.bazel": "532ffe5f2186b69fdde039efe6df13ba726ff338c6bc82275ad433013fa10573", + "https://bcr.bazel.build/modules/protobuf/3.19.6/MODULE.bazel": "9233edc5e1f2ee276a60de3eaa47ac4132302ef9643238f23128fea53ea12858", + "https://bcr.bazel.build/modules/protoc-gen-validate/1.0.4.bcr.2/MODULE.bazel": "c4bd2c850211ff5b7dadf9d2d0496c1c922fdedc303c775b01dfd3b3efc907ed", + "https://bcr.bazel.build/modules/protoc-gen-validate/1.0.4.bcr.2/source.json": "4cc97f70b521890798058600a927ce4b0def8ee84ff2a5aa632aabcb4234aa0b", + "https://bcr.bazel.build/modules/protoc-gen-validate/1.0.4/MODULE.bazel": "b8913c154b16177990f6126d2d2477d187f9ddc568e95ee3e2d50fc65d2c494a", + "https://bcr.bazel.build/modules/pybind11_bazel/2.11.1/MODULE.bazel": "88af1c246226d87e65be78ed49ecd1e6f5e98648558c14ce99176da041dc378e", + "https://bcr.bazel.build/modules/pybind11_bazel/2.12.0/MODULE.bazel": "e6f4c20442eaa7c90d7190d8dc539d0ab422f95c65a57cc59562170c58ae3d34", + "https://bcr.bazel.build/modules/pybind11_bazel/2.12.0/source.json": "6900fdc8a9e95866b8c0d4ad4aba4d4236317b5c1cd04c502df3f0d33afed680", + "https://bcr.bazel.build/modules/rapidjson/1.1.0.bcr.20241007/MODULE.bazel": "82fbcb2e42f9e0040e76ccc74c06c3e46dfd33c64ca359293f8b84df0e6dff4c", + "https://bcr.bazel.build/modules/rapidjson/1.1.0.bcr.20241007/source.json": "5c42389ad0e21fc06b95ad7c0b730008271624a2fa3292e0eab5f30e15adeee3", + "https://bcr.bazel.build/modules/re2/2021-09-01/MODULE.bazel": "bcb6b96f3b071e6fe2d8bed9cc8ada137a105f9d2c5912e91d27528b3d123833", + "https://bcr.bazel.build/modules/re2/2023-09-01/MODULE.bazel": "cb3d511531b16cfc78a225a9e2136007a48cf8a677e4264baeab57fe78a80206", + "https://bcr.bazel.build/modules/re2/2024-05-01/MODULE.bazel": "55a3f059538f381107824e7d00df5df6d061ba1fb80e874e4909c0f0549e8f3e", + "https://bcr.bazel.build/modules/re2/2024-07-02.bcr.1/MODULE.bazel": "b4963dda9b31080be1905ef085ecd7dd6cd47c05c79b9cdf83ade83ab2ab271a", + "https://bcr.bazel.build/modules/re2/2024-07-02.bcr.1/source.json": "2ff292be6ef3340325ce8a045ecc326e92cbfab47c7cbab4bd85d28971b97ac4", + "https://bcr.bazel.build/modules/re2/2024-07-02/MODULE.bazel": "0eadc4395959969297cbcf31a249ff457f2f1d456228c67719480205aa306daa", + "https://bcr.bazel.build/modules/rpmpack/0.6.0/MODULE.bazel": "0955142ea73b5f1a362ce2d871bf63576d0bdc8bbdd9b04c11f54f028228d5da", + "https://bcr.bazel.build/modules/rpmpack/0.6.0/source.json": "824de8849410f94875dae6933b790bbf96eff5fdce117433d4069e7d146aef5b", + "https://bcr.bazel.build/modules/rules_android/0.1.1/MODULE.bazel": "48809ab0091b07ad0182defb787c4c5328bd3a278938415c00a7b69b50c4d3a8", + "https://bcr.bazel.build/modules/rules_android/0.1.1/source.json": "e6986b41626ee10bdc864937ffb6d6bf275bb5b9c65120e6137d56e6331f089e", + "https://bcr.bazel.build/modules/rules_apple/3.5.1/MODULE.bazel": "3d1bbf65ad3692003d36d8a29eff54d4e5c1c5f4bfb60f79e28646a924d9101c", + "https://bcr.bazel.build/modules/rules_apple/3.5.1/source.json": "e7593cdf26437d35dbda64faeaf5b82cbdd9df72674b0f041fdde75c1d20dda7", + "https://bcr.bazel.build/modules/rules_cc/0.1.1/MODULE.bazel": "2f0222a6f229f0bf44cd711dc13c858dad98c62d52bd51d8fc3a764a83125513", + "https://bcr.bazel.build/modules/rules_cc/0.1.1/source.json": "d61627377bd7dd1da4652063e368d9366fc9a73920bfa396798ad92172cf645c", + "https://bcr.bazel.build/modules/rules_foreign_cc/0.10.1/MODULE.bazel": "b9527010e5fef060af92b6724edb3691970a5b1f76f74b21d39f7d433641be60", + "https://bcr.bazel.build/modules/rules_foreign_cc/0.13.0/MODULE.bazel": "5a9419cd02f6c2328eafd5234be8bef4d53357af80873392f5907f73f348c61b", + "https://bcr.bazel.build/modules/rules_foreign_cc/0.13.0/source.json": "e3495e083f232b3de375b77d2b0b01c18b6c2d1fc7337e451e8cd8e0c3e43dc6", + "https://bcr.bazel.build/modules/rules_foreign_cc/0.9.0/MODULE.bazel": "c9e8c682bf75b0e7c704166d79b599f93b72cfca5ad7477df596947891feeef6", + "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/MODULE.bazel": "40c97d1144356f52905566c55811f13b299453a14ac7769dfba2ac38192337a8", + "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/source.json": "c8b1e2c717646f1702290959a3302a178fb639d987ab61d548105019f11e527e", + "https://bcr.bazel.build/modules/rules_go/0.33.0/MODULE.bazel": "a2b11b64cd24bf94f57454f53288a5dacfe6cb86453eee7761b7637728c1910c", + "https://bcr.bazel.build/modules/rules_go/0.38.1/MODULE.bazel": "fb8e73dd3b6fc4ff9d260ceacd830114891d49904f5bda1c16bc147bcc254f71", + "https://bcr.bazel.build/modules/rules_go/0.39.1/MODULE.bazel": "d34fb2a249403a5f4339c754f1e63dc9e5ad70b47c5e97faee1441fc6636cd61", + "https://bcr.bazel.build/modules/rules_go/0.41.0/MODULE.bazel": "55861d8e8bb0e62cbd2896f60ff303f62ffcb0eddb74ecb0e5c0cbe36fc292c8", + "https://bcr.bazel.build/modules/rules_go/0.42.0/MODULE.bazel": "8cfa875b9aa8c6fce2b2e5925e73c1388173ea3c32a0db4d2b4804b453c14270", + "https://bcr.bazel.build/modules/rules_go/0.44.0/MODULE.bazel": "55b2d9e775d7881dbe9a2fc68440442cd6ba32730170c782f1f0e6023a6d8db6", + "https://bcr.bazel.build/modules/rules_go/0.45.1/MODULE.bazel": "6d7884f0edf890024eba8ab31a621faa98714df0ec9d512389519f0edff0281a", + "https://bcr.bazel.build/modules/rules_go/0.46.0/MODULE.bazel": "3477df8bdcc49e698b9d25f734c4f3a9f5931ff34ee48a2c662be168f5f2d3fd", + "https://bcr.bazel.build/modules/rules_go/0.48.0/MODULE.bazel": "d00ebcae0908ee3f5e6d53f68677a303d6d59a77beef879598700049c3980a03", + "https://bcr.bazel.build/modules/rules_go/0.50.1/MODULE.bazel": "b91a308dc5782bb0a8021ad4330c81fea5bda77f96b9e4c117b9b9c8f6665ee0", + "https://bcr.bazel.build/modules/rules_go/0.52.0/MODULE.bazel": "0cf080a2706aa8fc9abf64286cee60fdf0238db37b7f1793b0f7d550d59ea3ae", + "https://bcr.bazel.build/modules/rules_go/0.52.0/source.json": "441bc7591044993dce9fb0377fcadf3086d6afac621b909d17d53858a4a1b8d4", + "https://bcr.bazel.build/modules/rules_java/4.0.0/MODULE.bazel": "5a78a7ae82cd1a33cef56dc578c7d2a46ed0dca12643ee45edbb8417899e6f74", + "https://bcr.bazel.build/modules/rules_java/5.1.0/MODULE.bazel": "324b6478b0343a3ce7a9add8586ad75d24076d6d43d2f622990b9c1cfd8a1b15", + "https://bcr.bazel.build/modules/rules_java/5.3.5/MODULE.bazel": "a4ec4f2db570171e3e5eb753276ee4b389bae16b96207e9d3230895c99644b86", + "https://bcr.bazel.build/modules/rules_java/5.5.0/MODULE.bazel": "486ad1aa15cdc881af632b4b1448b0136c76025a1fe1ad1b65c5899376b83a50", + "https://bcr.bazel.build/modules/rules_java/6.0.0/MODULE.bazel": "8a43b7df601a7ec1af61d79345c17b31ea1fedc6711fd4abfd013ea612978e39", + "https://bcr.bazel.build/modules/rules_java/6.3.0/MODULE.bazel": "a97c7678c19f236a956ad260d59c86e10a463badb7eb2eda787490f4c969b963", + "https://bcr.bazel.build/modules/rules_java/6.4.0/MODULE.bazel": "e986a9fe25aeaa84ac17ca093ef13a4637f6107375f64667a15999f77db6c8f6", + "https://bcr.bazel.build/modules/rules_java/6.5.2/MODULE.bazel": "1d440d262d0e08453fa0c4d8f699ba81609ed0e9a9a0f02cd10b3e7942e61e31", + "https://bcr.bazel.build/modules/rules_java/7.1.0/MODULE.bazel": "30d9135a2b6561c761bd67bd4990da591e6bdc128790ce3e7afd6a3558b2fb64", + "https://bcr.bazel.build/modules/rules_java/7.10.0/MODULE.bazel": "530c3beb3067e870561739f1144329a21c851ff771cd752a49e06e3dc9c2e71a", + "https://bcr.bazel.build/modules/rules_java/7.12.2/MODULE.bazel": "579c505165ee757a4280ef83cda0150eea193eed3bef50b1004ba88b99da6de6", + "https://bcr.bazel.build/modules/rules_java/7.2.0/MODULE.bazel": "06c0334c9be61e6cef2c8c84a7800cef502063269a5af25ceb100b192453d4ab", + "https://bcr.bazel.build/modules/rules_java/7.3.2/MODULE.bazel": "50dece891cfdf1741ea230d001aa9c14398062f2b7c066470accace78e412bc2", + "https://bcr.bazel.build/modules/rules_java/7.4.0/MODULE.bazel": "a592852f8a3dd539e82ee6542013bf2cadfc4c6946be8941e189d224500a8934", + "https://bcr.bazel.build/modules/rules_java/7.6.1/MODULE.bazel": "2f14b7e8a1aa2f67ae92bc69d1ec0fa8d9f827c4e17ff5e5f02e91caa3b2d0fe", + "https://bcr.bazel.build/modules/rules_java/7.6.5/MODULE.bazel": "481164be5e02e4cab6e77a36927683263be56b7e36fef918b458d7a8a1ebadb1", + "https://bcr.bazel.build/modules/rules_java/8.3.2/MODULE.bazel": "7336d5511ad5af0b8615fdc7477535a2e4e723a357b6713af439fe8cf0195017", + "https://bcr.bazel.build/modules/rules_java/8.5.1/MODULE.bazel": "d8a9e38cc5228881f7055a6079f6f7821a073df3744d441978e7a43e20226939", + "https://bcr.bazel.build/modules/rules_java/8.5.1/source.json": "db1a77d81b059e0f84985db67a22f3f579a529a86b7997605be3d214a0abe38e", + "https://bcr.bazel.build/modules/rules_jvm_external/4.4.2/MODULE.bazel": "a56b85e418c83eb1839819f0b515c431010160383306d13ec21959ac412d2fe7", + "https://bcr.bazel.build/modules/rules_jvm_external/5.1/MODULE.bazel": "33f6f999e03183f7d088c9be518a63467dfd0be94a11d0055fe2d210f89aa909", + "https://bcr.bazel.build/modules/rules_jvm_external/5.2/MODULE.bazel": "d9351ba35217ad0de03816ef3ed63f89d411349353077348a45348b096615036", + "https://bcr.bazel.build/modules/rules_jvm_external/5.3/MODULE.bazel": "bf93870767689637164657731849fb887ad086739bd5d360d90007a581d5527d", + "https://bcr.bazel.build/modules/rules_jvm_external/6.0/MODULE.bazel": "37c93a5a78d32e895d52f86a8d0416176e915daabd029ccb5594db422e87c495", + "https://bcr.bazel.build/modules/rules_jvm_external/6.1/MODULE.bazel": "75b5fec090dbd46cf9b7d8ea08cf84a0472d92ba3585b476f44c326eda8059c4", + "https://bcr.bazel.build/modules/rules_jvm_external/6.3/MODULE.bazel": "c998e060b85f71e00de5ec552019347c8bca255062c990ac02d051bb80a38df0", + "https://bcr.bazel.build/modules/rules_jvm_external/6.6/MODULE.bazel": "153042249c7060536dc95b6bb9f9bb8063b8a0b0cb7acdb381bddbc2374aed55", + "https://bcr.bazel.build/modules/rules_jvm_external/6.7/MODULE.bazel": "e717beabc4d091ecb2c803c2d341b88590e9116b8bf7947915eeb33aab4f96dd", + "https://bcr.bazel.build/modules/rules_jvm_external/6.7/source.json": "5426f412d0a7fc6b611643376c7e4a82dec991491b9ce5cb1cfdd25fe2e92be4", + "https://bcr.bazel.build/modules/rules_kotlin/1.9.0/MODULE.bazel": "ef85697305025e5a61f395d4eaede272a5393cee479ace6686dba707de804d59", + "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/MODULE.bazel": "d269a01a18ee74d0335450b10f62c9ed81f2321d7958a2934e44272fe82dcef3", + "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/source.json": "2faa4794364282db7c06600b7e5e34867a564ae91bda7cae7c29c64e9466b7d5", + "https://bcr.bazel.build/modules/rules_license/0.0.3/MODULE.bazel": "627e9ab0247f7d1e05736b59dbb1b6871373de5ad31c3011880b4133cafd4bd0", + "https://bcr.bazel.build/modules/rules_license/0.0.7/MODULE.bazel": "088fbeb0b6a419005b89cf93fe62d9517c0a2b8bb56af3244af65ecfe37e7d5d", + "https://bcr.bazel.build/modules/rules_license/1.0.0/MODULE.bazel": "a7fda60eefdf3d8c827262ba499957e4df06f659330bbe6cdbdb975b768bb65c", + "https://bcr.bazel.build/modules/rules_license/1.0.0/source.json": "a52c89e54cc311196e478f8382df91c15f7a2bfdf4c6cd0e2675cc2ff0b56efb", + "https://bcr.bazel.build/modules/rules_perl/0.2.4/MODULE.bazel": "5f5af7be4bf5fb88d91af7469518f0fd2161718aefc606188f7cd51f436ca938", + "https://bcr.bazel.build/modules/rules_perl/0.2.4/source.json": "574317d6b3c7e4843fe611b76f15e62a1889949f5570702e1ee4ad335ea3c339", + "https://bcr.bazel.build/modules/rules_pkg/0.7.0/MODULE.bazel": "df99f03fc7934a4737122518bb87e667e62d780b610910f0447665a7e2be62dc", + "https://bcr.bazel.build/modules/rules_pkg/1.0.1/MODULE.bazel": "5b1df97dbc29623bccdf2b0dcd0f5cb08e2f2c9050aab1092fd39a41e82686ff", + "https://bcr.bazel.build/modules/rules_pkg/1.0.1/source.json": "bd82e5d7b9ce2d31e380dd9f50c111d678c3bdaca190cb76b0e1c71b05e1ba8a", + "https://bcr.bazel.build/modules/rules_proto/4.0.0/MODULE.bazel": "a7a7b6ce9bee418c1a760b3d84f83a299ad6952f9903c67f19e4edd964894e06", + "https://bcr.bazel.build/modules/rules_proto/5.3.0-21.7/MODULE.bazel": "e8dff86b0971688790ae75528fe1813f71809b5afd57facb44dad9e8eca631b7", + "https://bcr.bazel.build/modules/rules_proto/6.0.0-rc1/MODULE.bazel": "1e5b502e2e1a9e825eef74476a5a1ee524a92297085015a052510b09a1a09483", + "https://bcr.bazel.build/modules/rules_proto/6.0.0/MODULE.bazel": "b531d7f09f58dce456cd61b4579ce8c86b38544da75184eadaf0a7cb7966453f", + "https://bcr.bazel.build/modules/rules_proto/6.0.2/MODULE.bazel": "ce916b775a62b90b61888052a416ccdda405212b6aaeb39522f7dc53431a5e73", + "https://bcr.bazel.build/modules/rules_proto/7.0.2/MODULE.bazel": "bf81793bd6d2ad89a37a40693e56c61b0ee30f7a7fdbaf3eabbf5f39de47dea2", + "https://bcr.bazel.build/modules/rules_proto/7.0.2/source.json": "1e5e7260ae32ef4f2b52fd1d0de8d03b606a44c91b694d2f1afb1d3b28a48ce1", + "https://bcr.bazel.build/modules/rules_python/0.10.2/MODULE.bazel": "cc82bc96f2997baa545ab3ce73f196d040ffb8756fd2d66125a530031cd90e5f", + "https://bcr.bazel.build/modules/rules_python/0.20.0/MODULE.bazel": "bfe14d17f20e3fe900b9588f526f52c967a6f281e47a1d6b988679bd15082286", + "https://bcr.bazel.build/modules/rules_python/0.22.0/MODULE.bazel": "b8057bafa11a9e0f4b08fc3b7cd7bee0dcbccea209ac6fc9a3ff051cd03e19e9", + "https://bcr.bazel.build/modules/rules_python/0.22.1/MODULE.bazel": "26114f0c0b5e93018c0c066d6673f1a2c3737c7e90af95eff30cfee38d0bbac7", + "https://bcr.bazel.build/modules/rules_python/0.23.1/MODULE.bazel": "49ffccf0511cb8414de28321f5fcf2a31312b47c40cc21577144b7447f2bf300", + "https://bcr.bazel.build/modules/rules_python/0.25.0/MODULE.bazel": "72f1506841c920a1afec76975b35312410eea3aa7b63267436bfb1dd91d2d382", + "https://bcr.bazel.build/modules/rules_python/0.28.0/MODULE.bazel": "cba2573d870babc976664a912539b320cbaa7114cd3e8f053c720171cde331ed", + "https://bcr.bazel.build/modules/rules_python/0.29.0/MODULE.bazel": "2ac8cd70524b4b9ec49a0b8284c79e4cd86199296f82f6e0d5da3f783d660c82", + "https://bcr.bazel.build/modules/rules_python/0.31.0/MODULE.bazel": "93a43dc47ee570e6ec9f5779b2e64c1476a6ce921c48cc9a1678a91dd5f8fd58", + "https://bcr.bazel.build/modules/rules_python/0.33.2/MODULE.bazel": "3e036c4ad8d804a4dad897d333d8dce200d943df4827cb849840055be8d2e937", + "https://bcr.bazel.build/modules/rules_python/0.37.1/MODULE.bazel": "3faeb2d9fa0a81f8980643ee33f212308f4d93eea4b9ce6f36d0b742e71e9500", + "https://bcr.bazel.build/modules/rules_python/0.4.0/MODULE.bazel": "9208ee05fd48bf09ac60ed269791cf17fb343db56c8226a720fbb1cdf467166c", + "https://bcr.bazel.build/modules/rules_python/0.40.0/MODULE.bazel": "9d1a3cd88ed7d8e39583d9ffe56ae8a244f67783ae89b60caafc9f5cf318ada7", + "https://bcr.bazel.build/modules/rules_python/1.1.0/MODULE.bazel": "57e01abae22956eb96d891572490d20e07d983e0c065de0b2170cafe5053e788", + "https://bcr.bazel.build/modules/rules_python/1.1.0/source.json": "29f1fdfd23a40808c622f813bc93e29c3aae277333f03293f667e76159750a0f", + "https://bcr.bazel.build/modules/rules_shell/0.2.0/MODULE.bazel": "fda8a652ab3c7d8fee214de05e7a9916d8b28082234e8d2c0094505c5268ed3c", + "https://bcr.bazel.build/modules/rules_shell/0.3.0/MODULE.bazel": "de4402cd12f4cc8fda2354fce179fdb068c0b9ca1ec2d2b17b3e21b24c1a937b", + "https://bcr.bazel.build/modules/rules_shell/0.3.0/source.json": "c55ed591aa5009401ddf80ded9762ac32c358d2517ee7820be981e2de9756cf3", + "https://bcr.bazel.build/modules/rules_swift/1.18.0/MODULE.bazel": "a6aba73625d0dc64c7b4a1e831549b6e375fbddb9d2dde9d80c9de6ec45b24c9", + "https://bcr.bazel.build/modules/rules_swift/1.18.0/source.json": "9e636cabd446f43444ea2662341a9cbb74ecd87ab0557225ae73f1127cb7ff52", + "https://bcr.bazel.build/modules/stardoc/0.5.1/MODULE.bazel": "1a05d92974d0c122f5ccf09291442580317cdd859f07a8655f1db9a60374f9f8", + "https://bcr.bazel.build/modules/stardoc/0.5.3/MODULE.bazel": "c7f6948dae6999bf0db32c1858ae345f112cacf98f174c7a8bb707e41b974f1c", + "https://bcr.bazel.build/modules/stardoc/0.5.6/MODULE.bazel": "c43dabc564990eeab55e25ed61c07a1aadafe9ece96a4efabb3f8bf9063b71ef", + "https://bcr.bazel.build/modules/stardoc/0.6.2/MODULE.bazel": "7060193196395f5dd668eda046ccbeacebfd98efc77fed418dbe2b82ffaa39fd", + "https://bcr.bazel.build/modules/stardoc/0.7.1/MODULE.bazel": "3548faea4ee5dda5580f9af150e79d0f6aea934fc60c1cc50f4efdd9420759e7", + "https://bcr.bazel.build/modules/stardoc/0.7.2/MODULE.bazel": "fc152419aa2ea0f51c29583fab1e8c99ddefd5b3778421845606ee628629e0e5", + "https://bcr.bazel.build/modules/stardoc/0.7.2/source.json": "58b029e5e901d6802967754adf0a9056747e8176f017cfe3607c0851f4d42216", + "https://bcr.bazel.build/modules/upb/0.0.0-20211020-160625a/MODULE.bazel": "6cced416be2dc5b9c05efd5b997049ba795e5e4e6fafbe1624f4587767638928", + "https://bcr.bazel.build/modules/upb/0.0.0-20220923-a547704/MODULE.bazel": "7298990c00040a0e2f121f6c32544bab27d4452f80d9ce51349b1a28f3005c43", + "https://bcr.bazel.build/modules/upb/0.0.0-20230516-61a97ef/MODULE.bazel": "c0df5e35ad55e264160417fd0875932ee3c9dda63d9fccace35ac62f45e1b6f9", + "https://bcr.bazel.build/modules/upb/0.0.0-20230907-e7430e6/MODULE.bazel": "3a7dedadf70346e678dc059dbe44d05cbf3ab17f1ce43a1c7a42edc7cbf93fd9", + "https://bcr.bazel.build/modules/xds/0.0.0-20240423-555b57e/MODULE.bazel": "cea509976a77e34131411684ef05a1d6ad194dd71a8d5816643bc5b0af16dc0f", + "https://bcr.bazel.build/modules/xds/0.0.0-20240423-555b57e/source.json": "7227e1fcad55f3f3cab1a08691ecd753cb29cc6380a47bc650851be9f9ad6d20", + "https://bcr.bazel.build/modules/xz/5.4.5.bcr.5/MODULE.bazel": "b93d7035ac14c900dfdf7624e42cfcbfc34415aa8d3c83a6f225867c48d28dad", + "https://bcr.bazel.build/modules/xz/5.4.5.bcr.5/source.json": "30c4e5c856087a60d92e2522eafd316c0661671f4478ca94c6b7bd877010210a", + "https://bcr.bazel.build/modules/zlib/1.2.11/MODULE.bazel": "07b389abc85fdbca459b69e2ec656ae5622873af3f845e1c9d80fe179f3effa0", + "https://bcr.bazel.build/modules/zlib/1.2.12/MODULE.bazel": "3b1a8834ada2a883674be8cbd36ede1b6ec481477ada359cd2d3ddc562340b27", + "https://bcr.bazel.build/modules/zlib/1.2.13/MODULE.bazel": "aa6deb1b83c18ffecd940c4119aff9567cd0a671d7bba756741cb2ef043a29d5", + "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.1/MODULE.bazel": "6a9fe6e3fc865715a7be9823ce694ceb01e364c35f7a846bf0d2b34762bc066b", + "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.3/MODULE.bazel": "af322bc08976524477c79d1e45e241b6efbeb918c497e8840b8ab116802dda79", + "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.4/MODULE.bazel": "fc880fa3bd9c5299be64b712fbc60a1978ea9ce0a9f74f6bbd0b61c12db1aee6", + "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.4/source.json": "cc6da591fc55c263981d7ba2c0b56131e544cadfc00f93b14483415130a0df88", + "https://bcr.bazel.build/modules/zlib/1.3.1/MODULE.bazel": "751c9940dcfe869f5f7274e1295422a34623555916eb98c174c1e945594bf198", + "https://bcr.bazel.build/modules/zlib/1.3/MODULE.bazel": "6a9c02f19a24dcedb05572b2381446e27c272cd383aed11d41d99da9e3167a72", + "https://bcr.bazel.build/modules/zstd/1.5.6/MODULE.bazel": "471ebe7d3cdd8c6469390fcf623eb4779ff55fbee0a87f1dc57a1def468b96d4", + "https://bcr.bazel.build/modules/zstd/1.5.6/source.json": "02010c3333fc89b44fe861db049968decb6e688411f7f9d4f6791d74f9adfb51" + }, + "selectedYankedVersions": {}, + "moduleExtensions": { + "@@apple_support~//crosstool:setup.bzl%apple_cc_configure_extension": { + "general": { + "bzlTransitiveDigest": "ltCGFbl/LQQZXn/LEMXfKX7pGwyqNiOCHcmiQW0tmjM=", + "usagesDigest": "ySSIdb/E88OpfbnWNA5rarAA0+mZ4DQzZ65kMl8s2rw=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "local_config_apple_cc_toolchains": { + "bzlFile": "@@apple_support~//crosstool:setup.bzl", + "ruleClassName": "_apple_cc_autoconf_toolchains", + "attributes": {} + }, + "local_config_apple_cc": { + "bzlFile": "@@apple_support~//crosstool:setup.bzl", + "ruleClassName": "_apple_cc_autoconf", + "attributes": {} + } + }, + "recordedRepoMappingEntries": [ + [ + "apple_support~", + "bazel_tools", + "bazel_tools" + ] + ] + } + }, + "@@cel-spec~//:extensions.bzl%non_module_dependencies": { + "general": { + "bzlTransitiveDigest": "/2uyuQa5purSharolRXYOGYMGSGjDeByo6JfQDWsraA=", + "usagesDigest": "2f6juplOpWu+UdD1kVgi773xavnFQ+OcH0PRuQduDxY=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "com_google_googleapis": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "bd8e735d881fb829751ecb1a77038dda4a8d274c45490cb9fcf004583ee10571", + "strip_prefix": "googleapis-07c27163ac591955d736f3057b1619ece66f5b99", + "urls": [ + "https://github.com/googleapis/googleapis/archive/07c27163ac591955d736f3057b1619ece66f5b99.tar.gz" + ] + } + } + }, + "recordedRepoMappingEntries": [ + [ + "cel-spec~", + "bazel_tools", + "bazel_tools" + ] + ] + } + }, + "@@cel-spec~//:googleapis_ext.bzl%googleapis_ext": { + "general": { + "bzlTransitiveDigest": "yun2jmsomFi3bs5bjQWXApBzqQf66zBJ39JEBYigzdc=", + "usagesDigest": "OK8FsLndSl2AbwGM1Npe5NdHR1kDAebcw7Ee+KkekE0=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "com_google_googleapis_imports": { + "bzlFile": "@@cel-spec~~non_module_dependencies~com_google_googleapis//:repository_rules.bzl", + "ruleClassName": "switched_rules", + "attributes": { + "rules": { + "proto_library_with_info": [ + "", + "" + ], + "moved_proto_library": [ + "", + "" + ], + "java_proto_library": [ + "", + "" + ], + "java_grpc_library": [ + "", + "" + ], + "java_gapic_library": [ + "", + "" + ], + "java_gapic_test": [ + "", + "" + ], + "java_gapic_assembly_gradle_pkg": [ + "", + "" + ], + "py_proto_library": [ + "", + "" + ], + "py_grpc_library": [ + "", + "" + ], + "py_gapic_library": [ + "", + "" + ], + "py_test": [ + "", + "" + ], + "py_gapic_assembly_pkg": [ + "", + "" + ], + "py_import": [ + "", + "" + ], + "go_proto_library": [ + "", + "" + ], + "go_library": [ + "", + "" + ], + "go_test": [ + "", + "" + ], + "go_gapic_library": [ + "", + "" + ], + "go_gapic_assembly_pkg": [ + "", + "" + ], + "cc_proto_library": [ + "native.cc_proto_library", + "" + ], + "cc_grpc_library": [ + "", + "" + ], + "cc_gapic_library": [ + "", + "" + ], + "php_proto_library": [ + "", + "php_proto_library" + ], + "php_grpc_library": [ + "", + "php_grpc_library" + ], + "php_gapic_library": [ + "", + "php_gapic_library" + ], + "php_gapic_assembly_pkg": [ + "", + "php_gapic_assembly_pkg" + ], + "nodejs_gapic_library": [ + "", + "typescript_gapic_library" + ], + "nodejs_gapic_assembly_pkg": [ + "", + "typescript_gapic_assembly_pkg" + ], + "ruby_proto_library": [ + "", + "" + ], + "ruby_grpc_library": [ + "", + "" + ], + "ruby_ads_gapic_library": [ + "", + "" + ], + "ruby_cloud_gapic_library": [ + "", + "" + ], + "ruby_gapic_assembly_pkg": [ + "", + "" + ], + "csharp_proto_library": [ + "", + "" + ], + "csharp_grpc_library": [ + "", + "" + ], + "csharp_gapic_library": [ + "", + "" + ], + "csharp_gapic_assembly_pkg": [ + "", + "" + ] + } + } + } + }, + "recordedRepoMappingEntries": [ + [ + "cel-spec~", + "com_google_googleapis", + "cel-spec~~non_module_dependencies~com_google_googleapis" + ] + ] + } + }, + "@@envoy_api~//bazel:repositories.bzl%non_module_deps": { + "general": { + "bzlTransitiveDigest": "6TqmRfVELxZJRPQYuJpC4JBX4QvdrHqTDOUJGOGODSo=", + "usagesDigest": "IivjlawPvqhHPUJ3c6dLiPsH22mn/g/dJtlmv3zdimM=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "prometheus_metrics_model": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "urls": [ + "https://github.com/prometheus/client_model/archive/v0.6.1.tar.gz" + ], + "sha256": "b9b690bc35d80061f255faa7df7621eae39fe157179ccd78ff6409c3b004f05e", + "strip_prefix": "client_model-0.6.1", + "build_file_content": "\nload(\"@envoy_api//bazel:api_build_system.bzl\", \"api_cc_py_proto_library\")\nload(\"@io_bazel_rules_go//proto:def.bzl\", \"go_proto_library\")\n\napi_cc_py_proto_library(\n name = \"client_model\",\n srcs = [\n \"io/prometheus/client/metrics.proto\",\n ],\n visibility = [\"//visibility:public\"],\n)\n\ngo_proto_library(\n name = \"client_model_go_proto\",\n importpath = \"github.com/prometheus/client_model/go\",\n proto = \":client_model\",\n visibility = [\"//visibility:public\"],\n)\n" + } + }, + "com_github_bufbuild_buf": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "urls": [ + "https://github.com/bufbuild/buf/releases/download/v1.49.0/buf-Linux-x86_64.tar.gz" + ], + "sha256": "ee8da9748249f7946d79191e36469ce7bc3b8ba80019bff1fa4289a44cbc23bf", + "strip_prefix": "buf", + "build_file_content": "\npackage(\n default_visibility = [\"//visibility:public\"],\n)\n\nfilegroup(\n name = \"buf\",\n srcs = [\n \"@com_github_bufbuild_buf//:bin/buf\",\n ],\n tags = [\"manual\"], # buf is downloaded as a linux binary; tagged manual to prevent build for non-linux users\n)\n" + } + }, + "envoy_toolshed": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "urls": [ + "https://github.com/envoyproxy/toolshed/archive/bazel-v0.2.2.tar.gz" + ], + "sha256": "443fe177aba0cef8c17b7a48905c925c67b09005b10dd70ff12cd9f729a72d51", + "strip_prefix": "toolshed-bazel-v0.2.2/bazel" + } + } + }, + "recordedRepoMappingEntries": [ + [ + "envoy_api~", + "bazel_tools", + "bazel_tools" + ], + [ + "envoy_api~", + "envoy_api", + "envoy_api~" + ] + ] + } + }, + "@@googleapis~//:extensions.bzl%switched_rules": { + "general": { + "bzlTransitiveDigest": "vG6fuTzXD8MMvHWZEQud0MMH7eoC4GXY0va7VrFFh04=", + "usagesDigest": "OS3q7wxIQ5fTpvOuG0Hsx8cMHBvI/aQj5dvppk3XuQE=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "com_google_googleapis_imports": { + "bzlFile": "@@googleapis~//:repository_rules.bzl", + "ruleClassName": "switched_rules", + "attributes": { + "rules": { + "proto_library_with_info": [ + "", + "" + ], + "moved_proto_library": [ + "", + "" + ], + "java_proto_library": [ + "native.java_proto_library", + "" + ], + "java_grpc_library": [ + "@io_grpc_grpc_java//:java_grpc_library.bzl", + "" + ], + "java_gapic_library": [ + "", + "" + ], + "java_gapic_test": [ + "", + "" + ], + "java_gapic_assembly_gradle_pkg": [ + "", + "" + ], + "py_proto_library": [ + "", + "" + ], + "py_grpc_library": [ + "", + "" + ], + "py_gapic_library": [ + "", + "" + ], + "py_test": [ + "", + "" + ], + "py_gapic_assembly_pkg": [ + "", + "" + ], + "py_import": [ + "", + "" + ], + "go_proto_library": [ + "", + "" + ], + "go_grpc_library": [ + "", + "" + ], + "go_library": [ + "", + "" + ], + "go_test": [ + "", + "" + ], + "go_gapic_library": [ + "", + "" + ], + "go_gapic_assembly_pkg": [ + "", + "" + ], + "cc_proto_library": [ + "native.cc_proto_library", + "" + ], + "cc_grpc_library": [ + "@com_github_grpc_grpc//bazel:cc_grpc_library.bzl", + "" + ], + "cc_gapic_library": [ + "", + "" + ], + "php_proto_library": [ + "", + "php_proto_library" + ], + "php_grpc_library": [ + "", + "php_grpc_library" + ], + "php_gapic_library": [ + "", + "php_gapic_library" + ], + "php_gapic_assembly_pkg": [ + "", + "php_gapic_assembly_pkg" + ], + "nodejs_gapic_library": [ + "", + "typescript_gapic_library" + ], + "nodejs_gapic_assembly_pkg": [ + "", + "typescript_gapic_assembly_pkg" + ], + "ruby_proto_library": [ + "", + "" + ], + "ruby_grpc_library": [ + "", + "" + ], + "ruby_ads_gapic_library": [ + "", + "" + ], + "ruby_cloud_gapic_library": [ + "", + "" + ], + "ruby_gapic_assembly_pkg": [ + "", + "" + ], + "csharp_proto_library": [ + "", + "" + ], + "csharp_grpc_library": [ + "", + "" + ], + "csharp_gapic_library": [ + "", + "" + ], + "csharp_gapic_assembly_pkg": [ + "", + "" + ] + } + } + } + }, + "recordedRepoMappingEntries": [] + } + }, + "@@grpc~//bazel:grpc_deps.bzl%grpc_repo_deps_ext": { + "general": { + "bzlTransitiveDigest": "1KZav+5Ao2oqRZEdzTdnBvBDKTuHznzADJPH14CRE6I=", + "usagesDigest": "KokaE9FOrkFUdpxGl8J7iyxeByveCECwkpGCvGNcnvM=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "google_cloud_cpp": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "7ca7f583b60d2aa1274411fed3b9fb3887119b2e84244bb3fc69ea1db819e4e5", + "strip_prefix": "google-cloud-cpp-2.16.0", + "urls": [ + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/googleapis/google-cloud-cpp/archive/refs/tags/v2.16.0.tar.gz", + "https://github.com/googleapis/google-cloud-cpp/archive/refs/tags/v2.16.0.tar.gz" + ] + } + } + }, + "recordedRepoMappingEntries": [ + [ + "grpc~", + "bazel_tools", + "bazel_tools" + ], + [ + "grpc~", + "com_github_grpc_grpc", + "grpc~" + ] + ] + } + }, + "@@pybind11_bazel~//:internal_configure.bzl%internal_configure_extension": { + "general": { + "bzlTransitiveDigest": "CyAKLVVonohnkTSqg9II/HA7M49sOlnMkgMHL3CmDuc=", + "usagesDigest": "mFrTHX5eCiNU/OIIGVHH3cOILY9Zmjqk8RQYv8o6Thk=", + "recordedFileInputs": { + "@@pybind11_bazel~//MODULE.bazel": "e6f4c20442eaa7c90d7190d8dc539d0ab422f95c65a57cc59562170c58ae3d34" + }, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "pybind11": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "build_file": "@@pybind11_bazel~//:pybind11-BUILD.bazel", + "strip_prefix": "pybind11-2.12.0", + "urls": [ + "https://github.com/pybind/pybind11/archive/v2.12.0.zip" + ] + } + } + }, + "recordedRepoMappingEntries": [ + [ + "pybind11_bazel~", + "bazel_tools", + "bazel_tools" + ] + ] + } + }, + "@@rules_apple~//apple:apple.bzl%provisioning_profile_repository_extension": { + "general": { + "bzlTransitiveDigest": "D0anu6Sz8Q9SXmbFaNUKh3YAC7gXF/J/HBTndNBg2ag=", + "usagesDigest": "z3O39ZVxssoz5kUX8+YMSfNS8WcQb9bUg+MxjVA0v6A=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "local_provisioning_profiles": { + "bzlFile": "@@rules_apple~//apple/internal:local_provisioning_profiles.bzl", + "ruleClassName": "provisioning_profile_repository", + "attributes": {} + } + }, + "recordedRepoMappingEntries": [ + [ + "apple_support~", + "bazel_skylib", + "bazel_skylib~" + ], + [ + "bazel_features~", + "bazel_features_globals", + "bazel_features~~version_extension~bazel_features_globals" + ], + [ + "bazel_features~", + "bazel_features_version", + "bazel_features~~version_extension~bazel_features_version" + ], + [ + "protobuf~", + "bazel_skylib", + "bazel_skylib~" + ], + [ + "protobuf~", + "proto_bazel_features", + "bazel_features~" + ], + [ + "rules_apple~", + "bazel_skylib", + "bazel_skylib~" + ], + [ + "rules_apple~", + "bazel_tools", + "bazel_tools" + ], + [ + "rules_apple~", + "build_bazel_apple_support", + "apple_support~" + ], + [ + "rules_apple~", + "build_bazel_rules_apple", + "rules_apple~" + ], + [ + "rules_apple~", + "build_bazel_rules_swift", + "rules_swift~" + ], + [ + "rules_proto~", + "com_google_protobuf", + "protobuf~" + ], + [ + "rules_swift~", + "bazel_skylib", + "bazel_skylib~" + ], + [ + "rules_swift~", + "bazel_tools", + "bazel_tools" + ], + [ + "rules_swift~", + "build_bazel_apple_support", + "apple_support~" + ], + [ + "rules_swift~", + "build_bazel_rules_swift", + "rules_swift~" + ], + [ + "rules_swift~", + "build_bazel_rules_swift_local_config", + "rules_swift~~non_module_deps~build_bazel_rules_swift_local_config" + ], + [ + "rules_swift~", + "com_github_apple_swift_protobuf", + "rules_swift~~non_module_deps~com_github_apple_swift_protobuf" + ], + [ + "rules_swift~", + "com_github_grpc_grpc_swift", + "rules_swift~~non_module_deps~com_github_grpc_grpc_swift" + ], + [ + "rules_swift~", + "rules_proto", + "rules_proto~" + ] + ] + } + }, + "@@rules_apple~//apple:extensions.bzl%non_module_deps": { + "general": { + "bzlTransitiveDigest": "5JTvg4Qr6DXjRKV+Eqg4V65+iHTZQV9VQ+3KQ+Oziw4=", + "usagesDigest": "9pqqsAjbe7kL2SXEcVAUhrJxq9vOJ39lgszUnsqDdrU=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "xctestrunner": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "urls": [ + "https://github.com/google/xctestrunner/archive/b7698df3d435b6491b4b4c0f9fc7a63fbed5e3a6.tar.gz" + ], + "strip_prefix": "xctestrunner-b7698df3d435b6491b4b4c0f9fc7a63fbed5e3a6", + "sha256": "ae3a063c985a8633cb7eb566db21656f8db8eb9a0edb8c182312c7f0db53730d" + } + } + }, + "recordedRepoMappingEntries": [ + [ + "rules_apple~", + "bazel_tools", + "bazel_tools" + ] + ] + } + }, + "@@rules_boost~//:boost/repositories.bzl%non_module_dependencies": { + "general": { + "bzlTransitiveDigest": "x3KMtXr4KoRJ4XlFzBdXD6YURDOScGJ0XQXOZnhxLs4=", + "usagesDigest": "uaZnO/m8Ic3/ACtW2ZtYRX8jlcLhNhSIWnrAQYLYWJA=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "boost": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "build_file": "@@rules_boost~//:boost.BUILD", + "patch_cmds": [ + "rm -f doc/pdf/BUILD" + ], + "patch_cmds_win": [ + "Remove-Item -Force doc/pdf/BUILD" + ], + "patches": [ + "@@rules_boost~//:zlib.patch" + ], + "patch_args": [ + "-p1" + ], + "url": "https://github.com/boostorg/boost/releases/download/boost-1.84.0/boost-1.84.0.tar.gz", + "sha256": "4d27e9efed0f6f152dc28db6430b9d3dfb40c0345da7342eaa5a987dde57bd95", + "strip_prefix": "boost-1.84.0" + } + } + }, + "recordedRepoMappingEntries": [ + [ + "rules_boost~", + "bazel_tools", + "bazel_tools" + ], + [ + "rules_boost~", + "com_github_nelhage_rules_boost", + "rules_boost~" + ] + ] + } + }, + "@@rules_foreign_cc~//foreign_cc:extensions.bzl%tools": { + "general": { + "bzlTransitiveDigest": "82gl0j2nuUSwR2DhSU4Mejqc+E1d+0SHmnz6jHQGxak=", + "usagesDigest": "3PW/Pc9K2FRXrPe+FybHoxEgqzg7eXn9mWy8nzrbxNY=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "rules_foreign_cc_framework_toolchain_linux": { + "bzlFile": "@@rules_foreign_cc~//foreign_cc/private/framework:toolchain.bzl", + "ruleClassName": "framework_toolchain_repository", + "attributes": { + "commands_src": "@rules_foreign_cc//foreign_cc/private/framework/toolchains:linux_commands.bzl", + "exec_compatible_with": [ + "@platforms//os:linux" + ] + } + }, + "rules_foreign_cc_framework_toolchain_freebsd": { + "bzlFile": "@@rules_foreign_cc~//foreign_cc/private/framework:toolchain.bzl", + "ruleClassName": "framework_toolchain_repository", + "attributes": { + "commands_src": "@rules_foreign_cc//foreign_cc/private/framework/toolchains:freebsd_commands.bzl", + "exec_compatible_with": [ + "@platforms//os:freebsd" + ] + } + }, + "rules_foreign_cc_framework_toolchain_windows": { + "bzlFile": "@@rules_foreign_cc~//foreign_cc/private/framework:toolchain.bzl", + "ruleClassName": "framework_toolchain_repository", + "attributes": { + "commands_src": "@rules_foreign_cc//foreign_cc/private/framework/toolchains:windows_commands.bzl", + "exec_compatible_with": [ + "@platforms//os:windows" + ] + } + }, + "rules_foreign_cc_framework_toolchain_macos": { + "bzlFile": "@@rules_foreign_cc~//foreign_cc/private/framework:toolchain.bzl", + "ruleClassName": "framework_toolchain_repository", + "attributes": { + "commands_src": "@rules_foreign_cc//foreign_cc/private/framework/toolchains:macos_commands.bzl", + "exec_compatible_with": [ + "@platforms//os:macos" + ] + } + }, + "rules_foreign_cc_framework_toolchains": { + "bzlFile": "@@rules_foreign_cc~//foreign_cc/private/framework:toolchain.bzl", + "ruleClassName": "framework_toolchain_repository_hub", + "attributes": {} + }, + "cmake_src": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "build_file_content": "filegroup(\n name = \"all_srcs\",\n srcs = glob([\"**\"]),\n visibility = [\"//visibility:public\"],\n)\n", + "sha256": "f316b40053466f9a416adf981efda41b160ca859e97f6a484b447ea299ff26aa", + "strip_prefix": "cmake-3.23.2", + "urls": [ + "https://github.com/Kitware/CMake/releases/download/v3.23.2/cmake-3.23.2.tar.gz" + ], + "patches": [ + "@@rules_foreign_cc~//toolchains:cmake-c++11.patch" + ] + } + }, + "gnumake_src": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "build_file_content": "filegroup(\n name = \"all_srcs\",\n srcs = glob([\"**\"]),\n visibility = [\"//visibility:public\"],\n)\n", + "sha256": "dd16fb1d67bfab79a72f5e8390735c49e3e8e70b4945a15ab1f81ddb78658fb3", + "strip_prefix": "make-4.4.1", + "urls": [ + "https://mirror.bazel.build/ftpmirror.gnu.org/gnu/make/make-4.4.1.tar.gz", + "http://ftpmirror.gnu.org/gnu/make/make-4.4.1.tar.gz" + ] + } + }, + "ninja_build_src": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "build_file_content": "filegroup(\n name = \"all_srcs\",\n srcs = glob([\"**\"]),\n visibility = [\"//visibility:public\"],\n)\n", + "integrity": "sha256-ghvf9Io/aDvEuztvC1/nstZHz2XVKutjMoyRpsbfKFo=", + "strip_prefix": "ninja-1.12.1", + "urls": [ + "https://mirror.bazel.build/github.com/ninja-build/ninja/archive/v1.12.1.tar.gz", + "https://github.com/ninja-build/ninja/archive/v1.12.1.tar.gz" + ] + } + }, + "meson_src": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "build_file_content": "exports_files([\"meson.py\"])\n\nfilegroup(\n name = \"runtime\",\n srcs = glob([\"mesonbuild/**\"]),\n visibility = [\"//visibility:public\"],\n)\n", + "sha256": "567e533adf255de73a2de35049b99923caf872a455af9ce03e01077e0d384bed", + "strip_prefix": "meson-1.5.1", + "urls": [ + "https://mirror.bazel.build/github.com/mesonbuild/meson/releases/download/1.5.1/meson-1.5.1.tar.gz", + "https://github.com/mesonbuild/meson/releases/download/1.5.1/meson-1.5.1.tar.gz" + ] + } + }, + "glib_dev": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "build_file_content": "\ncc_import(\n name = \"glib_dev\",\n hdrs = glob([\"include/**\"]),\n shared_library = \"@glib_runtime//:bin/libglib-2.0-0.dll\",\n visibility = [\"//visibility:public\"],\n)\n ", + "sha256": "bdf18506df304d38be98a4b3f18055b8b8cca81beabecad0eece6ce95319c369", + "urls": [ + "https://mirror.bazel.build/download.gnome.org/binaries/win64/glib/2.26/glib-dev_2.26.1-1_win64.zip", + "https://download.gnome.org/binaries/win64/glib/2.26/glib-dev_2.26.1-1_win64.zip" + ] + } + }, + "glib_src": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "build_file_content": "\ncc_import(\n name = \"msvc_hdr\",\n hdrs = [\"msvc_recommended_pragmas.h\"],\n visibility = [\"//visibility:public\"],\n)\n ", + "sha256": "bc96f63112823b7d6c9f06572d2ad626ddac7eb452c04d762592197f6e07898e", + "strip_prefix": "glib-2.26.1", + "urls": [ + "https://mirror.bazel.build/download.gnome.org/sources/glib/2.26/glib-2.26.1.tar.gz", + "https://download.gnome.org/sources/glib/2.26/glib-2.26.1.tar.gz" + ] + } + }, + "glib_runtime": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "build_file_content": "\nexports_files(\n [\n \"bin/libgio-2.0-0.dll\",\n \"bin/libglib-2.0-0.dll\",\n \"bin/libgmodule-2.0-0.dll\",\n \"bin/libgobject-2.0-0.dll\",\n \"bin/libgthread-2.0-0.dll\",\n ],\n visibility = [\"//visibility:public\"],\n)\n ", + "sha256": "88d857087e86f16a9be651ee7021880b3f7ba050d34a1ed9f06113b8799cb973", + "urls": [ + "https://mirror.bazel.build/download.gnome.org/binaries/win64/glib/2.26/glib_2.26.1-1_win64.zip", + "https://download.gnome.org/binaries/win64/glib/2.26/glib_2.26.1-1_win64.zip" + ] + } + }, + "gettext_runtime": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "build_file_content": "\ncc_import(\n name = \"gettext_runtime\",\n shared_library = \"bin/libintl-8.dll\",\n visibility = [\"//visibility:public\"],\n)\n ", + "sha256": "1f4269c0e021076d60a54e98da6f978a3195013f6de21674ba0edbc339c5b079", + "urls": [ + "https://mirror.bazel.build/download.gnome.org/binaries/win64/dependencies/gettext-runtime_0.18.1.1-2_win64.zip", + "https://download.gnome.org/binaries/win64/dependencies/gettext-runtime_0.18.1.1-2_win64.zip" + ] + } + }, + "pkgconfig_src": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "build_file_content": "filegroup(\n name = \"all_srcs\",\n srcs = glob([\"**\"]),\n visibility = [\"//visibility:public\"],\n)\n", + "sha256": "6fc69c01688c9458a57eb9a1664c9aba372ccda420a02bf4429fe610e7e7d591", + "strip_prefix": "pkg-config-0.29.2", + "patches": [ + "@@rules_foreign_cc~//toolchains:pkgconfig-detectenv.patch", + "@@rules_foreign_cc~//toolchains:pkgconfig-makefile-vc.patch", + "@@rules_foreign_cc~//toolchains:pkgconfig-builtin-glib-int-conversion.patch" + ], + "urls": [ + "https://pkgconfig.freedesktop.org/releases/pkg-config-0.29.2.tar.gz", + "https://mirror.bazel.build/pkgconfig.freedesktop.org/releases/pkg-config-0.29.2.tar.gz" + ] + } + }, + "bazel_features": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "ba1282c1aa1d1fffdcf994ab32131d7c7551a9bc960fbf05f42d55a1b930cbfb", + "strip_prefix": "bazel_features-1.15.0", + "url": "https://github.com/bazel-contrib/bazel_features/releases/download/v1.15.0/bazel_features-v1.15.0.tar.gz" + } + }, + "bazel_skylib": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "urls": [ + "https://mirror.bazel.build/github.com/bazelbuild/bazel-skylib/releases/download/1.2.1/bazel-skylib-1.2.1.tar.gz", + "https://github.com/bazelbuild/bazel-skylib/releases/download/1.2.1/bazel-skylib-1.2.1.tar.gz" + ], + "sha256": "f7be3474d42aae265405a592bb7da8e171919d74c16f082a5457840f06054728" + } + }, + "rules_python": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "84aec9e21cc56fbc7f1335035a71c850d1b9b5cc6ff497306f84cced9a769841", + "strip_prefix": "rules_python-0.23.1", + "url": "https://github.com/bazelbuild/rules_python/archive/refs/tags/0.23.1.tar.gz" + } + }, + "rules_shell": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "d8cd4a3a91fc1dc68d4c7d6b655f09def109f7186437e3f50a9b60ab436a0c53", + "strip_prefix": "rules_shell-0.3.0", + "url": "https://github.com/bazelbuild/rules_shell/releases/download/v0.3.0/rules_shell-v0.3.0.tar.gz" + } + }, + "cmake-3.23.2-linux-aarch64": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "urls": [ + "https://github.com/Kitware/CMake/releases/download/v3.23.2/cmake-3.23.2-linux-aarch64.tar.gz" + ], + "sha256": "f2654bf780b53f170bbbec44d8ac67d401d24788e590faa53036a89476efa91e", + "strip_prefix": "cmake-3.23.2-linux-aarch64", + "build_file_content": "load(\"@rules_foreign_cc//toolchains/native_tools:native_tools_toolchain.bzl\", \"native_tool_toolchain\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nfilegroup(\n name = \"cmake_bin\",\n srcs = [\"bin/cmake\"],\n)\n\nfilegroup(\n name = \"cmake_data\",\n srcs = glob(\n [\n \"**\",\n ],\n exclude = [\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"**/* *\",\n ],\n ),\n)\n\nnative_tool_toolchain(\n name = \"cmake_tool\",\n path = \"bin/cmake\",\n target = \":cmake_data\",\n env = {\"CMAKE\": \"$(execpath :cmake_bin)\"},\n tools = [\":cmake_bin\"],\n)\n" + } + }, + "cmake-3.23.2-linux-x86_64": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "urls": [ + "https://github.com/Kitware/CMake/releases/download/v3.23.2/cmake-3.23.2-linux-x86_64.tar.gz" + ], + "sha256": "aaced6f745b86ce853661a595bdac6c5314a60f8181b6912a0a4920acfa32708", + "strip_prefix": "cmake-3.23.2-linux-x86_64", + "build_file_content": "load(\"@rules_foreign_cc//toolchains/native_tools:native_tools_toolchain.bzl\", \"native_tool_toolchain\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nfilegroup(\n name = \"cmake_bin\",\n srcs = [\"bin/cmake\"],\n)\n\nfilegroup(\n name = \"cmake_data\",\n srcs = glob(\n [\n \"**\",\n ],\n exclude = [\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"**/* *\",\n ],\n ),\n)\n\nnative_tool_toolchain(\n name = \"cmake_tool\",\n path = \"bin/cmake\",\n target = \":cmake_data\",\n env = {\"CMAKE\": \"$(execpath :cmake_bin)\"},\n tools = [\":cmake_bin\"],\n)\n" + } + }, + "cmake-3.23.2-macos-universal": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "urls": [ + "https://github.com/Kitware/CMake/releases/download/v3.23.2/cmake-3.23.2-macos-universal.tar.gz" + ], + "sha256": "853a0f9af148c5ef47282ffffee06c4c9f257be2635936755f39ca13c3286c88", + "strip_prefix": "cmake-3.23.2-macos-universal/CMake.app/Contents", + "build_file_content": "load(\"@rules_foreign_cc//toolchains/native_tools:native_tools_toolchain.bzl\", \"native_tool_toolchain\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nfilegroup(\n name = \"cmake_bin\",\n srcs = [\"bin/cmake\"],\n)\n\nfilegroup(\n name = \"cmake_data\",\n srcs = glob(\n [\n \"**\",\n ],\n exclude = [\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"**/* *\",\n ],\n ),\n)\n\nnative_tool_toolchain(\n name = \"cmake_tool\",\n path = \"bin/cmake\",\n target = \":cmake_data\",\n env = {\"CMAKE\": \"$(execpath :cmake_bin)\"},\n tools = [\":cmake_bin\"],\n)\n" + } + }, + "cmake-3.23.2-windows-i386": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "urls": [ + "https://github.com/Kitware/CMake/releases/download/v3.23.2/cmake-3.23.2-windows-i386.zip" + ], + "sha256": "6a4fcd6a2315b93cb23c93507efccacc30c449c2bf98f14d6032bb226c582e07", + "strip_prefix": "cmake-3.23.2-windows-i386", + "build_file_content": "load(\"@rules_foreign_cc//toolchains/native_tools:native_tools_toolchain.bzl\", \"native_tool_toolchain\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nfilegroup(\n name = \"cmake_bin\",\n srcs = [\"bin/cmake.exe\"],\n)\n\nfilegroup(\n name = \"cmake_data\",\n srcs = glob(\n [\n \"**\",\n ],\n exclude = [\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"**/* *\",\n ],\n ),\n)\n\nnative_tool_toolchain(\n name = \"cmake_tool\",\n path = \"bin/cmake.exe\",\n target = \":cmake_data\",\n env = {\"CMAKE\": \"$(execpath :cmake_bin)\"},\n tools = [\":cmake_bin\"],\n)\n" + } + }, + "cmake-3.23.2-windows-x86_64": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "urls": [ + "https://github.com/Kitware/CMake/releases/download/v3.23.2/cmake-3.23.2-windows-x86_64.zip" + ], + "sha256": "2329387f3166b84c25091c86389fb891193967740c9bcf01e7f6d3306f7ffda0", + "strip_prefix": "cmake-3.23.2-windows-x86_64", + "build_file_content": "load(\"@rules_foreign_cc//toolchains/native_tools:native_tools_toolchain.bzl\", \"native_tool_toolchain\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nfilegroup(\n name = \"cmake_bin\",\n srcs = [\"bin/cmake.exe\"],\n)\n\nfilegroup(\n name = \"cmake_data\",\n srcs = glob(\n [\n \"**\",\n ],\n exclude = [\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"**/* *\",\n ],\n ),\n)\n\nnative_tool_toolchain(\n name = \"cmake_tool\",\n path = \"bin/cmake.exe\",\n target = \":cmake_data\",\n env = {\"CMAKE\": \"$(execpath :cmake_bin)\"},\n tools = [\":cmake_bin\"],\n)\n" + } + }, + "cmake_3.23.2_toolchains": { + "bzlFile": "@@rules_foreign_cc~//toolchains:prebuilt_toolchains_repository.bzl", + "ruleClassName": "prebuilt_toolchains_repository", + "attributes": { + "repos": { + "cmake-3.23.2-linux-aarch64": [ + "@platforms//cpu:aarch64", + "@platforms//os:linux" + ], + "cmake-3.23.2-linux-x86_64": [ + "@platforms//cpu:x86_64", + "@platforms//os:linux" + ], + "cmake-3.23.2-macos-universal": [ + "@platforms//os:macos" + ], + "cmake-3.23.2-windows-i386": [ + "@platforms//cpu:x86_32", + "@platforms//os:windows" + ], + "cmake-3.23.2-windows-x86_64": [ + "@platforms//cpu:x86_64", + "@platforms//os:windows" + ] + }, + "tool": "cmake" + } + }, + "ninja_1.12.1_linux": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "urls": [ + "https://github.com/ninja-build/ninja/releases/download/v1.12.1/ninja-linux.zip" + ], + "sha256": "6f98805688d19672bd699fbbfa2c2cf0fc054ac3df1f0e6a47664d963d530255", + "strip_prefix": "", + "build_file_content": "load(\"@rules_foreign_cc//toolchains/native_tools:native_tools_toolchain.bzl\", \"native_tool_toolchain\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nfilegroup(\n name = \"ninja_bin\",\n srcs = [\"ninja\"],\n)\n\nnative_tool_toolchain(\n name = \"ninja_tool\",\n env = {\"NINJA\": \"$(execpath :ninja_bin)\"},\n path = \"$(execpath :ninja_bin)\",\n target = \":ninja_bin\",\n)\n" + } + }, + "ninja_1.12.1_linux-aarch64": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "urls": [ + "https://github.com/ninja-build/ninja/releases/download/v1.12.1/ninja-linux-aarch64.zip" + ], + "sha256": "5c25c6570b0155e95fce5918cb95f1ad9870df5768653afe128db822301a05a1", + "strip_prefix": "", + "build_file_content": "load(\"@rules_foreign_cc//toolchains/native_tools:native_tools_toolchain.bzl\", \"native_tool_toolchain\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nfilegroup(\n name = \"ninja_bin\",\n srcs = [\"ninja\"],\n)\n\nnative_tool_toolchain(\n name = \"ninja_tool\",\n env = {\"NINJA\": \"$(execpath :ninja_bin)\"},\n path = \"$(execpath :ninja_bin)\",\n target = \":ninja_bin\",\n)\n" + } + }, + "ninja_1.12.1_mac": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "urls": [ + "https://github.com/ninja-build/ninja/releases/download/v1.12.1/ninja-mac.zip" + ], + "sha256": "89a287444b5b3e98f88a945afa50ce937b8ffd1dcc59c555ad9b1baf855298c9", + "strip_prefix": "", + "build_file_content": "load(\"@rules_foreign_cc//toolchains/native_tools:native_tools_toolchain.bzl\", \"native_tool_toolchain\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nfilegroup(\n name = \"ninja_bin\",\n srcs = [\"ninja\"],\n)\n\nnative_tool_toolchain(\n name = \"ninja_tool\",\n env = {\"NINJA\": \"$(execpath :ninja_bin)\"},\n path = \"$(execpath :ninja_bin)\",\n target = \":ninja_bin\",\n)\n" + } + }, + "ninja_1.12.1_mac_aarch64": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "urls": [ + "https://github.com/ninja-build/ninja/releases/download/v1.12.1/ninja-mac.zip" + ], + "sha256": "89a287444b5b3e98f88a945afa50ce937b8ffd1dcc59c555ad9b1baf855298c9", + "strip_prefix": "", + "build_file_content": "load(\"@rules_foreign_cc//toolchains/native_tools:native_tools_toolchain.bzl\", \"native_tool_toolchain\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nfilegroup(\n name = \"ninja_bin\",\n srcs = [\"ninja\"],\n)\n\nnative_tool_toolchain(\n name = \"ninja_tool\",\n env = {\"NINJA\": \"$(execpath :ninja_bin)\"},\n path = \"$(execpath :ninja_bin)\",\n target = \":ninja_bin\",\n)\n" + } + }, + "ninja_1.12.1_win": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "urls": [ + "https://github.com/ninja-build/ninja/releases/download/v1.12.1/ninja-win.zip" + ], + "sha256": "f550fec705b6d6ff58f2db3c374c2277a37691678d6aba463adcbb129108467a", + "strip_prefix": "", + "build_file_content": "load(\"@rules_foreign_cc//toolchains/native_tools:native_tools_toolchain.bzl\", \"native_tool_toolchain\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nfilegroup(\n name = \"ninja_bin\",\n srcs = [\"ninja.exe\"],\n)\n\nnative_tool_toolchain(\n name = \"ninja_tool\",\n env = {\"NINJA\": \"$(execpath :ninja_bin)\"},\n path = \"$(execpath :ninja_bin)\",\n target = \":ninja_bin\",\n)\n" + } + }, + "ninja_1.12.1_toolchains": { + "bzlFile": "@@rules_foreign_cc~//toolchains:prebuilt_toolchains_repository.bzl", + "ruleClassName": "prebuilt_toolchains_repository", + "attributes": { + "repos": { + "ninja_1.12.1_linux": [ + "@platforms//cpu:x86_64", + "@platforms//os:linux" + ], + "ninja_1.12.1_linux-aarch64": [ + "@platforms//cpu:aarch64", + "@platforms//os:linux" + ], + "ninja_1.12.1_mac": [ + "@platforms//cpu:x86_64", + "@platforms//os:macos" + ], + "ninja_1.12.1_mac_aarch64": [ + "@platforms//cpu:aarch64", + "@platforms//os:macos" + ], + "ninja_1.12.1_win": [ + "@platforms//cpu:x86_64", + "@platforms//os:windows" + ] + }, + "tool": "ninja" + } + } + }, + "recordedRepoMappingEntries": [ + [ + "rules_foreign_cc~", + "bazel_tools", + "bazel_tools" + ], + [ + "rules_foreign_cc~", + "rules_foreign_cc", + "rules_foreign_cc~" + ] + ] + } + }, + "@@rules_fuzzing~//fuzzing/private:extensions.bzl%non_module_dependencies": { + "general": { + "bzlTransitiveDigest": "hVgJRQ3Er45/UUAgNn1Yp2Khcp/Y8WyafA2kXIYmQ5M=", + "usagesDigest": "YnIrdgwnf3iCLfChsltBdZ7yOJh706lpa2vww/i2pDI=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "platforms": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "urls": [ + "https://mirror.bazel.build/github.com/bazelbuild/platforms/releases/download/0.0.8/platforms-0.0.8.tar.gz", + "https://github.com/bazelbuild/platforms/releases/download/0.0.8/platforms-0.0.8.tar.gz" + ], + "sha256": "8150406605389ececb6da07cbcb509d5637a3ab9a24bc69b1101531367d89d74" + } + }, + "rules_python": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "d70cd72a7a4880f0000a6346253414825c19cdd40a28289bdf67b8e6480edff8", + "strip_prefix": "rules_python-0.28.0", + "url": "https://github.com/bazelbuild/rules_python/releases/download/0.28.0/rules_python-0.28.0.tar.gz" + } + }, + "bazel_skylib": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "cd55a062e763b9349921f0f5db8c3933288dc8ba4f76dd9416aac68acee3cb94", + "urls": [ + "https://mirror.bazel.build/github.com/bazelbuild/bazel-skylib/releases/download/1.5.0/bazel-skylib-1.5.0.tar.gz", + "https://github.com/bazelbuild/bazel-skylib/releases/download/1.5.0/bazel-skylib-1.5.0.tar.gz" + ] + } + }, + "com_google_absl": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "urls": [ + "https://github.com/abseil/abseil-cpp/archive/refs/tags/20240116.1.zip" + ], + "strip_prefix": "abseil-cpp-20240116.1", + "integrity": "sha256-7capMWOvWyoYbUaHF/b+I2U6XLMaHmky8KugWvfXYuk=" + } + }, + "rules_fuzzing_oss_fuzz": { + "bzlFile": "@@rules_fuzzing~//fuzzing/private/oss_fuzz:repository.bzl", + "ruleClassName": "oss_fuzz_repository", + "attributes": {} + }, + "honggfuzz": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "build_file": "@@rules_fuzzing~//:honggfuzz.BUILD", + "sha256": "6b18ba13bc1f36b7b950c72d80f19ea67fbadc0ac0bb297ec89ad91f2eaa423e", + "url": "https://github.com/google/honggfuzz/archive/2.5.zip", + "strip_prefix": "honggfuzz-2.5" + } + }, + "rules_fuzzing_jazzer": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_jar", + "attributes": { + "sha256": "ee6feb569d88962d59cb59e8a31eb9d007c82683f3ebc64955fd5b96f277eec2", + "url": "https://repo1.maven.org/maven2/com/code-intelligence/jazzer/0.20.1/jazzer-0.20.1.jar" + } + }, + "rules_fuzzing_jazzer_api": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_jar", + "attributes": { + "sha256": "f5a60242bc408f7fa20fccf10d6c5c5ea1fcb3c6f44642fec5af88373ae7aa1b", + "url": "https://repo1.maven.org/maven2/com/code-intelligence/jazzer-api/0.20.1/jazzer-api-0.20.1.jar" + } + } + }, + "recordedRepoMappingEntries": [ + [ + "rules_fuzzing~", + "bazel_tools", + "bazel_tools" + ] + ] + } + }, + "@@rules_java~//java:rules_java_deps.bzl%compatibility_proxy": { + "general": { + "bzlTransitiveDigest": "KIX40nDfygEWbU+rq3nYpt3tVgTK/iO8PKh5VMBlN7M=", + "usagesDigest": "pwHZ+26iLgQdwvdZeA5wnAjKnNI3y6XO2VbhOTeo5h8=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "compatibility_proxy": { + "bzlFile": "@@rules_java~//java:rules_java_deps.bzl", + "ruleClassName": "_compatibility_proxy_repo_rule", + "attributes": {} + } + }, + "recordedRepoMappingEntries": [ + [ + "rules_java~", + "bazel_tools", + "bazel_tools" + ] + ] + } + }, + "@@rules_kotlin~//src/main/starlark/core/repositories:bzlmod_setup.bzl%rules_kotlin_extensions": { + "general": { + "bzlTransitiveDigest": "fus14IFJ/1LGWWGKPH/U18VnJCoMjfDt1ckahqCnM0A=", + "usagesDigest": "aJF6fLy82rR95Ff5CZPAqxNoFgOMLMN5ImfBS0nhnkg=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "com_github_jetbrains_kotlin_git": { + "bzlFile": "@@rules_kotlin~//src/main/starlark/core/repositories:compiler.bzl", + "ruleClassName": "kotlin_compiler_git_repository", + "attributes": { + "urls": [ + "https://github.com/JetBrains/kotlin/releases/download/v1.9.23/kotlin-compiler-1.9.23.zip" + ], + "sha256": "93137d3aab9afa9b27cb06a824c2324195c6b6f6179d8a8653f440f5bd58be88" + } + }, + "com_github_jetbrains_kotlin": { + "bzlFile": "@@rules_kotlin~//src/main/starlark/core/repositories:compiler.bzl", + "ruleClassName": "kotlin_capabilities_repository", + "attributes": { + "git_repository_name": "com_github_jetbrains_kotlin_git", + "compiler_version": "1.9.23" + } + }, + "com_github_google_ksp": { + "bzlFile": "@@rules_kotlin~//src/main/starlark/core/repositories:ksp.bzl", + "ruleClassName": "ksp_compiler_plugin_repository", + "attributes": { + "urls": [ + "https://github.com/google/ksp/releases/download/1.9.23-1.0.20/artifacts.zip" + ], + "sha256": "ee0618755913ef7fd6511288a232e8fad24838b9af6ea73972a76e81053c8c2d", + "strip_version": "1.9.23-1.0.20" + } + }, + "com_github_pinterest_ktlint": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "sha256": "01b2e0ef893383a50dbeb13970fe7fa3be36ca3e83259e01649945b09d736985", + "urls": [ + "https://github.com/pinterest/ktlint/releases/download/1.3.0/ktlint" + ], + "executable": true + } + }, + "rules_android": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "cd06d15dd8bb59926e4d65f9003bfc20f9da4b2519985c27e190cddc8b7a7806", + "strip_prefix": "rules_android-0.1.1", + "urls": [ + "https://github.com/bazelbuild/rules_android/archive/v0.1.1.zip" + ] + } + } + }, + "recordedRepoMappingEntries": [ + [ + "rules_kotlin~", + "bazel_tools", + "bazel_tools" + ] + ] + } + }, + "@@rules_perl~//perl:extensions.bzl%perl_repositories": { + "general": { + "bzlTransitiveDigest": "zKzjvlkMYt5ciDqNdVyTtZfAAPO39SuFy2B+xMqgTss=", + "usagesDigest": "tuJgAyNZD8Ewzr/MlAnnittbPMDC60XQF8aGrsjU+nY=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "perl_darwin_arm64": { + "bzlFile": "@@rules_perl~//perl:repo.bzl", + "ruleClassName": "perl_download", + "attributes": { + "strip_prefix": "perl-darwin-arm64", + "sha256": "285769f3c50c339fb59a3987b216ae3c5c573b95babe6875a1ef56fb178433da", + "urls": [ + "https://github.com/skaji/relocatable-perl/releases/download/5.36.0.1/perl-darwin-arm64.tar.xz" + ] + } + }, + "perl_darwin_amd64": { + "bzlFile": "@@rules_perl~//perl:repo.bzl", + "ruleClassName": "perl_download", + "attributes": { + "strip_prefix": "perl-darwin-amd64", + "sha256": "63bc5ee36f5394d71c50cca6cafdd333ee58f9eaa40bca63c85f9bd06f2c1fd6", + "urls": [ + "https://github.com/skaji/relocatable-perl/releases/download/5.36.0.1/perl-darwin-amd64.tar.xz" + ] + } + }, + "perl_linux_amd64": { + "bzlFile": "@@rules_perl~//perl:repo.bzl", + "ruleClassName": "perl_download", + "attributes": { + "strip_prefix": "perl-linux-amd64", + "sha256": "3bdffa9d7a3f97c0207314637b260ba5115b1d0829f97e3e2e301191a4d4d076", + "urls": [ + "https://github.com/skaji/relocatable-perl/releases/download/5.36.0.1/perl-linux-amd64.tar.xz" + ] + } + }, + "perl_linux_arm64": { + "bzlFile": "@@rules_perl~//perl:repo.bzl", + "ruleClassName": "perl_download", + "attributes": { + "strip_prefix": "perl-linux-arm64", + "sha256": "6fa4ece99e790ecbc2861f6ecb7b52694c01c2eeb215b4370f16a3b12d952117", + "urls": [ + "https://github.com/skaji/relocatable-perl/releases/download/5.36.0.1/perl-linux-arm64.tar.xz" + ] + } + }, + "perl_windows_x86_64": { + "bzlFile": "@@rules_perl~//perl:repo.bzl", + "ruleClassName": "perl_download", + "attributes": { + "strip_prefix": "", + "sha256": "aeb973da474f14210d3e1a1f942dcf779e2ae7e71e4c535e6c53ebabe632cc98", + "urls": [ + "https://mirror.bazel.build/strawberryperl.com/download/5.32.1.1/strawberry-perl-5.32.1.1-64bit.zip", + "https://strawberryperl.com/download/5.32.1.1/strawberry-perl-5.32.1.1-64bit.zip" + ] + } + } + }, + "recordedRepoMappingEntries": [ + [ + "rules_perl~", + "bazel_tools", + "bazel_tools" + ], + [ + "rules_perl~", + "rules_perl", + "rules_perl~" + ] + ] + } + }, + "@@rules_python~//python/extensions:pip.bzl%pip": { + "general": { + "bzlTransitiveDigest": "WR+uUsh3p9y3o7GmRP0iYebUQxKWbZfiV2HtwcTvS6w=", + "usagesDigest": "vPCjYGbmsUtmg1HKnQvp/fnB0iez3h54gbvBCQr75cw=", + "recordedFileInputs": { + "@@rules_python~//tools/publish/requirements_linux.txt": "d576e0d8542df61396a9b38deeaa183c24135ed5e8e73bb9622f298f2671811e", + "@@protoc-gen-validate~//python/requirements.txt": "519d7dac0ff11c4a855aaef022dc2998ece0669db3b481cdb9e5a5d88e57eb83", + "@@rules_fuzzing~//fuzzing/requirements.txt": "ab04664be026b632a0d2a2446c4f65982b7654f5b6851d2f9d399a19b7242a5b", + "@@privacy_sandbox_coordinator_services_and_shared_libraries~//python/privacybudget/gcp/operator_onboarding/requirements.txt": "cff68205e5858f2843371ae61d810cc1209fc045ef505aa84930474f8170d079", + "@@privacy_sandbox_coordinator_services_and_shared_libraries~//python/privacybudget/aws/pbs_identities_migration/requirements.txt": "86026e43fe8cbb6f4907d0e93df12803d6622b1f4ad2f93b91466a9390640424", + "@@grpc~//requirements.bazel.txt": "4c8c19a2a8f22108bf29feb5cc2694eb0c7e0c82ba0364df27fe5f5e4d7936e5", + "@@privacy_sandbox_coordinator_services_and_shared_libraries~//python/privacybudget/gcp/pbs_auth_handler/config/test_requirements.txt": "49d948b725a5dadb343f52bf6d6bddfaf1c3bbcc61c64a6060995dd247165549", + "@@privacy_sandbox_coordinator_services_and_shared_libraries~//python/privacybudget/aws/pbs_synthetic/requirements.txt": "d6044182310142a655da9460a12e6c847e62ef0ba21131d4ec19e612c6fbbad6", + "@@rules_python~//tools/publish/requirements_windows.txt": "d18538a3982beab378fd5687f4db33162ee1ece69801f9a451661b1b64286b76", + "@@privacy_sandbox_coordinator_services_and_shared_libraries~//python/privacybudget/aws/pbs_auth_handler/requirements.txt": "86026e43fe8cbb6f4907d0e93df12803d6622b1f4ad2f93b91466a9390640424", + "@@privacy_sandbox_coordinator_services_and_shared_libraries~//python/mpkhs/aws/privatekey_synthetic/requirements.txt": "d6044182310142a655da9460a12e6c847e62ef0ba21131d4ec19e612c6fbbad6", + "@@protobuf~//python/requirements.txt": "983be60d3cec4b319dcab6d48aeb3f5b2f7c3350f26b3a9e97486c37967c73c5", + "@@rules_python~//tools/publish/requirements_darwin.txt": "095d4a4f3d639dce831cd493367631cd51b53665292ab20194bac2c0c6458fa8" + }, + "recordedDirentsInputs": {}, + "envVariables": { + "RULES_PYTHON_REPO_DEBUG": null, + "RULES_PYTHON_REPO_DEBUG_VERBOSITY": null + }, + "generatedRepoSpecs": { + "grpc_python_dependencies_310_absl_py": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "grpc_python_dependencies_310", + "requirement": "absl-py==1.4.0" + } + }, + "grpc_python_dependencies_310_cachetools": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "grpc_python_dependencies_310", + "requirement": "cachetools==5.3.2" + } + }, + "grpc_python_dependencies_310_certifi": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "grpc_python_dependencies_310", + "requirement": "certifi==2023.7.22" + } + }, + "grpc_python_dependencies_310_chardet": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "grpc_python_dependencies_310", + "requirement": "chardet==3.0.4" + } + }, + "grpc_python_dependencies_310_charset_normalizer": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "grpc_python_dependencies_310", + "requirement": "charset-normalizer==3.3.2" + } + }, + "grpc_python_dependencies_310_coverage": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "grpc_python_dependencies_310", + "requirement": "coverage==4.5.4" + } + }, + "grpc_python_dependencies_310_cython": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "grpc_python_dependencies_310", + "requirement": "cython==3.0.0" + } + }, + "grpc_python_dependencies_310_deprecated": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "grpc_python_dependencies_310", + "requirement": "Deprecated==1.2.14" + } + }, + "grpc_python_dependencies_310_gevent": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "grpc_python_dependencies_310", + "requirement": "gevent==22.08.0" + } + }, + "grpc_python_dependencies_310_google_api_core": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "grpc_python_dependencies_310", + "requirement": "google-api-core==1.34.1" + } + }, + "grpc_python_dependencies_310_google_auth": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "grpc_python_dependencies_310", + "requirement": "google-auth==2.23.4" + } + }, + "grpc_python_dependencies_310_google_cloud_monitoring": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "grpc_python_dependencies_310", + "requirement": "google-cloud-monitoring==2.16.0" + } + }, + "grpc_python_dependencies_310_google_cloud_trace": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "grpc_python_dependencies_310", + "requirement": "google-cloud-trace==1.11.3" + } + }, + "grpc_python_dependencies_310_googleapis_common_protos": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "grpc_python_dependencies_310", + "requirement": "googleapis-common-protos==1.63.1" + } + }, + "grpc_python_dependencies_310_greenlet": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "grpc_python_dependencies_310", + "requirement": "greenlet==1.1.3.post0" + } + }, + "grpc_python_dependencies_310_idna": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "grpc_python_dependencies_310", + "requirement": "idna==2.7" + } + }, + "grpc_python_dependencies_310_importlib_metadata": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "grpc_python_dependencies_310", + "requirement": "importlib-metadata==6.11.0" + } + }, + "grpc_python_dependencies_310_oauth2client": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "grpc_python_dependencies_310", + "requirement": "oauth2client==4.1.0" + } + }, + "grpc_python_dependencies_310_opencensus_context": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "grpc_python_dependencies_310", + "requirement": "opencensus-context==0.1.3" + } + }, + "grpc_python_dependencies_310_opentelemetry_api": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "grpc_python_dependencies_310", + "requirement": "opentelemetry-api==1.25.0" + } + }, + "grpc_python_dependencies_310_opentelemetry_exporter_prometheus": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "grpc_python_dependencies_310", + "requirement": "opentelemetry-exporter-prometheus==0.46b0" + } + }, + "grpc_python_dependencies_310_opentelemetry_resourcedetector_gcp": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "grpc_python_dependencies_310", + "requirement": "opentelemetry-resourcedetector-gcp==1.6.0a0" + } + }, + "grpc_python_dependencies_310_opentelemetry_sdk": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "grpc_python_dependencies_310", + "requirement": "opentelemetry-sdk==1.25.0" + } + }, + "grpc_python_dependencies_310_opentelemetry_semantic_conventions": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "grpc_python_dependencies_310", + "requirement": "opentelemetry-semantic-conventions==0.46b0" + } + }, + "grpc_python_dependencies_310_prometheus_client": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "grpc_python_dependencies_310", + "requirement": "prometheus_client==0.20.0" + } + }, + "grpc_python_dependencies_310_proto_plus": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "grpc_python_dependencies_310", + "requirement": "proto-plus==1.22.3" + } + }, + "grpc_python_dependencies_310_protobuf": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "grpc_python_dependencies_310", + "requirement": "protobuf>=5.27.1,<6.0dev" + } + }, + "grpc_python_dependencies_310_pyasn1": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "grpc_python_dependencies_310", + "requirement": "pyasn1==0.5.0" + } + }, + "grpc_python_dependencies_310_pyasn1_modules": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "grpc_python_dependencies_310", + "requirement": "pyasn1-modules==0.3.0" + } + }, + "grpc_python_dependencies_310_requests": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "grpc_python_dependencies_310", + "requirement": "requests==2.25.1" + } + }, + "grpc_python_dependencies_310_rsa": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "grpc_python_dependencies_310", + "requirement": "rsa==4.9" + } + }, + "grpc_python_dependencies_310_setuptools": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "grpc_python_dependencies_310", + "requirement": "setuptools==44.1.1" + } + }, + "grpc_python_dependencies_310_typing_extensions": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "grpc_python_dependencies_310", + "requirement": "typing-extensions==4.9.0" + } + }, + "grpc_python_dependencies_310_urllib3": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "grpc_python_dependencies_310", + "requirement": "urllib3==1.26.18" + } + }, + "grpc_python_dependencies_310_wheel": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "grpc_python_dependencies_310", + "requirement": "wheel==0.38.1" + } + }, + "grpc_python_dependencies_310_wrapt": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "grpc_python_dependencies_310", + "requirement": "wrapt==1.16.0" + } + }, + "grpc_python_dependencies_310_zipp": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "grpc_python_dependencies_310", + "requirement": "zipp==3.17.0" + } + }, + "grpc_python_dependencies_310_zope_event": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "grpc_python_dependencies_310", + "requirement": "zope.event==4.5.0" + } + }, + "grpc_python_dependencies_310_zope_interface": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "grpc_python_dependencies_310", + "requirement": "zope.interface==6.1" + } + }, + "grpc_python_dependencies_311_absl_py": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "grpc_python_dependencies_311", + "requirement": "absl-py==1.4.0" + } + }, + "grpc_python_dependencies_311_cachetools": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "grpc_python_dependencies_311", + "requirement": "cachetools==5.3.2" + } + }, + "grpc_python_dependencies_311_certifi": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "grpc_python_dependencies_311", + "requirement": "certifi==2023.7.22" + } + }, + "grpc_python_dependencies_311_chardet": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "grpc_python_dependencies_311", + "requirement": "chardet==3.0.4" + } + }, + "grpc_python_dependencies_311_charset_normalizer": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "grpc_python_dependencies_311", + "requirement": "charset-normalizer==3.3.2" + } + }, + "grpc_python_dependencies_311_coverage": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "grpc_python_dependencies_311", + "requirement": "coverage==4.5.4" + } + }, + "grpc_python_dependencies_311_cython": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "grpc_python_dependencies_311", + "requirement": "cython==3.0.0" + } + }, + "grpc_python_dependencies_311_deprecated": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "grpc_python_dependencies_311", + "requirement": "Deprecated==1.2.14" + } + }, + "grpc_python_dependencies_311_gevent": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "grpc_python_dependencies_311", + "requirement": "gevent==22.08.0" + } + }, + "grpc_python_dependencies_311_google_api_core": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "grpc_python_dependencies_311", + "requirement": "google-api-core==1.34.1" + } + }, + "grpc_python_dependencies_311_google_auth": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "grpc_python_dependencies_311", + "requirement": "google-auth==2.23.4" + } + }, + "grpc_python_dependencies_311_google_cloud_monitoring": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "grpc_python_dependencies_311", + "requirement": "google-cloud-monitoring==2.16.0" + } + }, + "grpc_python_dependencies_311_google_cloud_trace": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "grpc_python_dependencies_311", + "requirement": "google-cloud-trace==1.11.3" + } + }, + "grpc_python_dependencies_311_googleapis_common_protos": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "grpc_python_dependencies_311", + "requirement": "googleapis-common-protos==1.63.1" + } + }, + "grpc_python_dependencies_311_greenlet": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "grpc_python_dependencies_311", + "requirement": "greenlet==1.1.3.post0" + } + }, + "grpc_python_dependencies_311_idna": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "grpc_python_dependencies_311", + "requirement": "idna==2.7" + } + }, + "grpc_python_dependencies_311_importlib_metadata": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "grpc_python_dependencies_311", + "requirement": "importlib-metadata==6.11.0" + } + }, + "grpc_python_dependencies_311_oauth2client": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "grpc_python_dependencies_311", + "requirement": "oauth2client==4.1.0" + } + }, + "grpc_python_dependencies_311_opencensus_context": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "grpc_python_dependencies_311", + "requirement": "opencensus-context==0.1.3" + } + }, + "grpc_python_dependencies_311_opentelemetry_api": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "grpc_python_dependencies_311", + "requirement": "opentelemetry-api==1.25.0" + } + }, + "grpc_python_dependencies_311_opentelemetry_exporter_prometheus": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "grpc_python_dependencies_311", + "requirement": "opentelemetry-exporter-prometheus==0.46b0" + } + }, + "grpc_python_dependencies_311_opentelemetry_resourcedetector_gcp": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "grpc_python_dependencies_311", + "requirement": "opentelemetry-resourcedetector-gcp==1.6.0a0" + } + }, + "grpc_python_dependencies_311_opentelemetry_sdk": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "grpc_python_dependencies_311", + "requirement": "opentelemetry-sdk==1.25.0" + } + }, + "grpc_python_dependencies_311_opentelemetry_semantic_conventions": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "grpc_python_dependencies_311", + "requirement": "opentelemetry-semantic-conventions==0.46b0" + } + }, + "grpc_python_dependencies_311_prometheus_client": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "grpc_python_dependencies_311", + "requirement": "prometheus_client==0.20.0" + } + }, + "grpc_python_dependencies_311_proto_plus": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "grpc_python_dependencies_311", + "requirement": "proto-plus==1.22.3" + } + }, + "grpc_python_dependencies_311_protobuf": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "grpc_python_dependencies_311", + "requirement": "protobuf>=5.27.1,<6.0dev" + } + }, + "grpc_python_dependencies_311_pyasn1": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "grpc_python_dependencies_311", + "requirement": "pyasn1==0.5.0" + } + }, + "grpc_python_dependencies_311_pyasn1_modules": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "grpc_python_dependencies_311", + "requirement": "pyasn1-modules==0.3.0" + } + }, + "grpc_python_dependencies_311_requests": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "grpc_python_dependencies_311", + "requirement": "requests==2.25.1" + } + }, + "grpc_python_dependencies_311_rsa": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "grpc_python_dependencies_311", + "requirement": "rsa==4.9" + } + }, + "grpc_python_dependencies_311_setuptools": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "grpc_python_dependencies_311", + "requirement": "setuptools==44.1.1" + } + }, + "grpc_python_dependencies_311_typing_extensions": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "grpc_python_dependencies_311", + "requirement": "typing-extensions==4.9.0" + } + }, + "grpc_python_dependencies_311_urllib3": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "grpc_python_dependencies_311", + "requirement": "urllib3==1.26.18" + } + }, + "grpc_python_dependencies_311_wheel": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "grpc_python_dependencies_311", + "requirement": "wheel==0.38.1" + } + }, + "grpc_python_dependencies_311_wrapt": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "grpc_python_dependencies_311", + "requirement": "wrapt==1.16.0" + } + }, + "grpc_python_dependencies_311_zipp": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "grpc_python_dependencies_311", + "requirement": "zipp==3.17.0" + } + }, + "grpc_python_dependencies_311_zope_event": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "grpc_python_dependencies_311", + "requirement": "zope.event==4.5.0" + } + }, + "grpc_python_dependencies_311_zope_interface": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "grpc_python_dependencies_311", + "requirement": "zope.interface==6.1" + } + }, + "grpc_python_dependencies_312_absl_py": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "grpc_python_dependencies_312", + "requirement": "absl-py==1.4.0" + } + }, + "grpc_python_dependencies_312_cachetools": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "grpc_python_dependencies_312", + "requirement": "cachetools==5.3.2" + } + }, + "grpc_python_dependencies_312_certifi": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "grpc_python_dependencies_312", + "requirement": "certifi==2023.7.22" + } + }, + "grpc_python_dependencies_312_chardet": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "grpc_python_dependencies_312", + "requirement": "chardet==3.0.4" + } + }, + "grpc_python_dependencies_312_charset_normalizer": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "grpc_python_dependencies_312", + "requirement": "charset-normalizer==3.3.2" + } + }, + "grpc_python_dependencies_312_coverage": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "grpc_python_dependencies_312", + "requirement": "coverage==4.5.4" + } + }, + "grpc_python_dependencies_312_cython": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "grpc_python_dependencies_312", + "requirement": "cython==3.0.0" + } + }, + "grpc_python_dependencies_312_deprecated": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "grpc_python_dependencies_312", + "requirement": "Deprecated==1.2.14" + } + }, + "grpc_python_dependencies_312_gevent": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "grpc_python_dependencies_312", + "requirement": "gevent==22.08.0" + } + }, + "grpc_python_dependencies_312_google_api_core": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "grpc_python_dependencies_312", + "requirement": "google-api-core==1.34.1" + } + }, + "grpc_python_dependencies_312_google_auth": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "grpc_python_dependencies_312", + "requirement": "google-auth==2.23.4" + } + }, + "grpc_python_dependencies_312_google_cloud_monitoring": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "grpc_python_dependencies_312", + "requirement": "google-cloud-monitoring==2.16.0" + } + }, + "grpc_python_dependencies_312_google_cloud_trace": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "grpc_python_dependencies_312", + "requirement": "google-cloud-trace==1.11.3" + } + }, + "grpc_python_dependencies_312_googleapis_common_protos": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "grpc_python_dependencies_312", + "requirement": "googleapis-common-protos==1.63.1" + } + }, + "grpc_python_dependencies_312_greenlet": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "grpc_python_dependencies_312", + "requirement": "greenlet==1.1.3.post0" + } + }, + "grpc_python_dependencies_312_idna": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "grpc_python_dependencies_312", + "requirement": "idna==2.7" + } + }, + "grpc_python_dependencies_312_importlib_metadata": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "grpc_python_dependencies_312", + "requirement": "importlib-metadata==6.11.0" + } + }, + "grpc_python_dependencies_312_oauth2client": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "grpc_python_dependencies_312", + "requirement": "oauth2client==4.1.0" + } + }, + "grpc_python_dependencies_312_opencensus_context": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "grpc_python_dependencies_312", + "requirement": "opencensus-context==0.1.3" + } + }, + "grpc_python_dependencies_312_opentelemetry_api": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "grpc_python_dependencies_312", + "requirement": "opentelemetry-api==1.25.0" + } + }, + "grpc_python_dependencies_312_opentelemetry_exporter_prometheus": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "grpc_python_dependencies_312", + "requirement": "opentelemetry-exporter-prometheus==0.46b0" + } + }, + "grpc_python_dependencies_312_opentelemetry_resourcedetector_gcp": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "grpc_python_dependencies_312", + "requirement": "opentelemetry-resourcedetector-gcp==1.6.0a0" + } + }, + "grpc_python_dependencies_312_opentelemetry_sdk": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "grpc_python_dependencies_312", + "requirement": "opentelemetry-sdk==1.25.0" + } + }, + "grpc_python_dependencies_312_opentelemetry_semantic_conventions": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "grpc_python_dependencies_312", + "requirement": "opentelemetry-semantic-conventions==0.46b0" + } + }, + "grpc_python_dependencies_312_prometheus_client": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "grpc_python_dependencies_312", + "requirement": "prometheus_client==0.20.0" + } + }, + "grpc_python_dependencies_312_proto_plus": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "grpc_python_dependencies_312", + "requirement": "proto-plus==1.22.3" + } + }, + "grpc_python_dependencies_312_protobuf": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "grpc_python_dependencies_312", + "requirement": "protobuf>=5.27.1,<6.0dev" + } + }, + "grpc_python_dependencies_312_pyasn1": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "grpc_python_dependencies_312", + "requirement": "pyasn1==0.5.0" + } + }, + "grpc_python_dependencies_312_pyasn1_modules": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "grpc_python_dependencies_312", + "requirement": "pyasn1-modules==0.3.0" + } + }, + "grpc_python_dependencies_312_requests": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "grpc_python_dependencies_312", + "requirement": "requests==2.25.1" + } + }, + "grpc_python_dependencies_312_rsa": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "grpc_python_dependencies_312", + "requirement": "rsa==4.9" + } + }, + "grpc_python_dependencies_312_setuptools": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "grpc_python_dependencies_312", + "requirement": "setuptools==44.1.1" + } + }, + "grpc_python_dependencies_312_typing_extensions": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "grpc_python_dependencies_312", + "requirement": "typing-extensions==4.9.0" + } + }, + "grpc_python_dependencies_312_urllib3": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "grpc_python_dependencies_312", + "requirement": "urllib3==1.26.18" + } + }, + "grpc_python_dependencies_312_wheel": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "grpc_python_dependencies_312", + "requirement": "wheel==0.38.1" + } + }, + "grpc_python_dependencies_312_wrapt": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "grpc_python_dependencies_312", + "requirement": "wrapt==1.16.0" + } + }, + "grpc_python_dependencies_312_zipp": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "grpc_python_dependencies_312", + "requirement": "zipp==3.17.0" + } + }, + "grpc_python_dependencies_312_zope_event": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "grpc_python_dependencies_312", + "requirement": "zope.event==4.5.0" + } + }, + "grpc_python_dependencies_312_zope_interface": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "grpc_python_dependencies_312", + "requirement": "zope.interface==6.1" + } + }, + "grpc_python_dependencies_313_absl_py": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_13_host//:python", + "repo": "grpc_python_dependencies_313", + "requirement": "absl-py==1.4.0" + } + }, + "grpc_python_dependencies_313_cachetools": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_13_host//:python", + "repo": "grpc_python_dependencies_313", + "requirement": "cachetools==5.3.2" + } + }, + "grpc_python_dependencies_313_certifi": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_13_host//:python", + "repo": "grpc_python_dependencies_313", + "requirement": "certifi==2023.7.22" + } + }, + "grpc_python_dependencies_313_chardet": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_13_host//:python", + "repo": "grpc_python_dependencies_313", + "requirement": "chardet==3.0.4" + } + }, + "grpc_python_dependencies_313_charset_normalizer": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_13_host//:python", + "repo": "grpc_python_dependencies_313", + "requirement": "charset-normalizer==3.3.2" + } + }, + "grpc_python_dependencies_313_coverage": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_13_host//:python", + "repo": "grpc_python_dependencies_313", + "requirement": "coverage==4.5.4" + } + }, + "grpc_python_dependencies_313_cython": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_13_host//:python", + "repo": "grpc_python_dependencies_313", + "requirement": "cython==3.0.0" + } + }, + "grpc_python_dependencies_313_deprecated": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_13_host//:python", + "repo": "grpc_python_dependencies_313", + "requirement": "Deprecated==1.2.14" + } + }, + "grpc_python_dependencies_313_gevent": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_13_host//:python", + "repo": "grpc_python_dependencies_313", + "requirement": "gevent==22.08.0" + } + }, + "grpc_python_dependencies_313_google_api_core": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_13_host//:python", + "repo": "grpc_python_dependencies_313", + "requirement": "google-api-core==1.34.1" + } + }, + "grpc_python_dependencies_313_google_auth": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_13_host//:python", + "repo": "grpc_python_dependencies_313", + "requirement": "google-auth==2.23.4" + } + }, + "grpc_python_dependencies_313_google_cloud_monitoring": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_13_host//:python", + "repo": "grpc_python_dependencies_313", + "requirement": "google-cloud-monitoring==2.16.0" + } + }, + "grpc_python_dependencies_313_google_cloud_trace": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_13_host//:python", + "repo": "grpc_python_dependencies_313", + "requirement": "google-cloud-trace==1.11.3" + } + }, + "grpc_python_dependencies_313_googleapis_common_protos": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_13_host//:python", + "repo": "grpc_python_dependencies_313", + "requirement": "googleapis-common-protos==1.63.1" + } + }, + "grpc_python_dependencies_313_greenlet": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_13_host//:python", + "repo": "grpc_python_dependencies_313", + "requirement": "greenlet==1.1.3.post0" + } + }, + "grpc_python_dependencies_313_idna": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_13_host//:python", + "repo": "grpc_python_dependencies_313", + "requirement": "idna==2.7" + } + }, + "grpc_python_dependencies_313_importlib_metadata": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_13_host//:python", + "repo": "grpc_python_dependencies_313", + "requirement": "importlib-metadata==6.11.0" + } + }, + "grpc_python_dependencies_313_oauth2client": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_13_host//:python", + "repo": "grpc_python_dependencies_313", + "requirement": "oauth2client==4.1.0" + } + }, + "grpc_python_dependencies_313_opencensus_context": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_13_host//:python", + "repo": "grpc_python_dependencies_313", + "requirement": "opencensus-context==0.1.3" + } + }, + "grpc_python_dependencies_313_opentelemetry_api": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_13_host//:python", + "repo": "grpc_python_dependencies_313", + "requirement": "opentelemetry-api==1.25.0" + } + }, + "grpc_python_dependencies_313_opentelemetry_exporter_prometheus": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_13_host//:python", + "repo": "grpc_python_dependencies_313", + "requirement": "opentelemetry-exporter-prometheus==0.46b0" + } + }, + "grpc_python_dependencies_313_opentelemetry_resourcedetector_gcp": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_13_host//:python", + "repo": "grpc_python_dependencies_313", + "requirement": "opentelemetry-resourcedetector-gcp==1.6.0a0" + } + }, + "grpc_python_dependencies_313_opentelemetry_sdk": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_13_host//:python", + "repo": "grpc_python_dependencies_313", + "requirement": "opentelemetry-sdk==1.25.0" + } + }, + "grpc_python_dependencies_313_opentelemetry_semantic_conventions": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_13_host//:python", + "repo": "grpc_python_dependencies_313", + "requirement": "opentelemetry-semantic-conventions==0.46b0" + } + }, + "grpc_python_dependencies_313_prometheus_client": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_13_host//:python", + "repo": "grpc_python_dependencies_313", + "requirement": "prometheus_client==0.20.0" + } + }, + "grpc_python_dependencies_313_proto_plus": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_13_host//:python", + "repo": "grpc_python_dependencies_313", + "requirement": "proto-plus==1.22.3" + } + }, + "grpc_python_dependencies_313_protobuf": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_13_host//:python", + "repo": "grpc_python_dependencies_313", + "requirement": "protobuf>=5.27.1,<6.0dev" + } + }, + "grpc_python_dependencies_313_pyasn1": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_13_host//:python", + "repo": "grpc_python_dependencies_313", + "requirement": "pyasn1==0.5.0" + } + }, + "grpc_python_dependencies_313_pyasn1_modules": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_13_host//:python", + "repo": "grpc_python_dependencies_313", + "requirement": "pyasn1-modules==0.3.0" + } + }, + "grpc_python_dependencies_313_requests": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_13_host//:python", + "repo": "grpc_python_dependencies_313", + "requirement": "requests==2.25.1" + } + }, + "grpc_python_dependencies_313_rsa": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_13_host//:python", + "repo": "grpc_python_dependencies_313", + "requirement": "rsa==4.9" + } + }, + "grpc_python_dependencies_313_setuptools": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_13_host//:python", + "repo": "grpc_python_dependencies_313", + "requirement": "setuptools==44.1.1" + } + }, + "grpc_python_dependencies_313_typing_extensions": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_13_host//:python", + "repo": "grpc_python_dependencies_313", + "requirement": "typing-extensions==4.9.0" + } + }, + "grpc_python_dependencies_313_urllib3": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_13_host//:python", + "repo": "grpc_python_dependencies_313", + "requirement": "urllib3==1.26.18" + } + }, + "grpc_python_dependencies_313_wheel": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_13_host//:python", + "repo": "grpc_python_dependencies_313", + "requirement": "wheel==0.38.1" + } + }, + "grpc_python_dependencies_313_wrapt": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_13_host//:python", + "repo": "grpc_python_dependencies_313", + "requirement": "wrapt==1.16.0" + } + }, + "grpc_python_dependencies_313_zipp": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_13_host//:python", + "repo": "grpc_python_dependencies_313", + "requirement": "zipp==3.17.0" + } + }, + "grpc_python_dependencies_313_zope_event": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_13_host//:python", + "repo": "grpc_python_dependencies_313", + "requirement": "zope.event==4.5.0" + } + }, + "grpc_python_dependencies_313_zope_interface": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_13_host//:python", + "repo": "grpc_python_dependencies_313", + "requirement": "zope.interface==6.1" + } + }, + "grpc_python_dependencies_39_absl_py": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "grpc_python_dependencies_39", + "requirement": "absl-py==1.4.0" + } + }, + "grpc_python_dependencies_39_cachetools": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "grpc_python_dependencies_39", + "requirement": "cachetools==5.3.2" + } + }, + "grpc_python_dependencies_39_certifi": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "grpc_python_dependencies_39", + "requirement": "certifi==2023.7.22" + } + }, + "grpc_python_dependencies_39_chardet": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "grpc_python_dependencies_39", + "requirement": "chardet==3.0.4" + } + }, + "grpc_python_dependencies_39_charset_normalizer": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "grpc_python_dependencies_39", + "requirement": "charset-normalizer==3.3.2" + } + }, + "grpc_python_dependencies_39_coverage": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "grpc_python_dependencies_39", + "requirement": "coverage==4.5.4" + } + }, + "grpc_python_dependencies_39_cython": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "grpc_python_dependencies_39", + "requirement": "cython==3.0.0" + } + }, + "grpc_python_dependencies_39_deprecated": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "grpc_python_dependencies_39", + "requirement": "Deprecated==1.2.14" + } + }, + "grpc_python_dependencies_39_gevent": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "grpc_python_dependencies_39", + "requirement": "gevent==22.08.0" + } + }, + "grpc_python_dependencies_39_google_api_core": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "grpc_python_dependencies_39", + "requirement": "google-api-core==1.34.1" + } + }, + "grpc_python_dependencies_39_google_auth": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "grpc_python_dependencies_39", + "requirement": "google-auth==2.23.4" + } + }, + "grpc_python_dependencies_39_google_cloud_monitoring": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "grpc_python_dependencies_39", + "requirement": "google-cloud-monitoring==2.16.0" + } + }, + "grpc_python_dependencies_39_google_cloud_trace": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "grpc_python_dependencies_39", + "requirement": "google-cloud-trace==1.11.3" + } + }, + "grpc_python_dependencies_39_googleapis_common_protos": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "grpc_python_dependencies_39", + "requirement": "googleapis-common-protos==1.63.1" + } + }, + "grpc_python_dependencies_39_greenlet": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "grpc_python_dependencies_39", + "requirement": "greenlet==1.1.3.post0" + } + }, + "grpc_python_dependencies_39_idna": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "grpc_python_dependencies_39", + "requirement": "idna==2.7" + } + }, + "grpc_python_dependencies_39_importlib_metadata": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "grpc_python_dependencies_39", + "requirement": "importlib-metadata==6.11.0" + } + }, + "grpc_python_dependencies_39_oauth2client": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "grpc_python_dependencies_39", + "requirement": "oauth2client==4.1.0" + } + }, + "grpc_python_dependencies_39_opencensus_context": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "grpc_python_dependencies_39", + "requirement": "opencensus-context==0.1.3" + } + }, + "grpc_python_dependencies_39_opentelemetry_api": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "grpc_python_dependencies_39", + "requirement": "opentelemetry-api==1.25.0" + } + }, + "grpc_python_dependencies_39_opentelemetry_exporter_prometheus": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "grpc_python_dependencies_39", + "requirement": "opentelemetry-exporter-prometheus==0.46b0" + } + }, + "grpc_python_dependencies_39_opentelemetry_resourcedetector_gcp": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "grpc_python_dependencies_39", + "requirement": "opentelemetry-resourcedetector-gcp==1.6.0a0" + } + }, + "grpc_python_dependencies_39_opentelemetry_sdk": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "grpc_python_dependencies_39", + "requirement": "opentelemetry-sdk==1.25.0" + } + }, + "grpc_python_dependencies_39_opentelemetry_semantic_conventions": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "grpc_python_dependencies_39", + "requirement": "opentelemetry-semantic-conventions==0.46b0" + } + }, + "grpc_python_dependencies_39_prometheus_client": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "grpc_python_dependencies_39", + "requirement": "prometheus_client==0.20.0" + } + }, + "grpc_python_dependencies_39_proto_plus": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "grpc_python_dependencies_39", + "requirement": "proto-plus==1.22.3" + } + }, + "grpc_python_dependencies_39_protobuf": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "grpc_python_dependencies_39", + "requirement": "protobuf>=5.27.1,<6.0dev" + } + }, + "grpc_python_dependencies_39_pyasn1": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "grpc_python_dependencies_39", + "requirement": "pyasn1==0.5.0" + } + }, + "grpc_python_dependencies_39_pyasn1_modules": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "grpc_python_dependencies_39", + "requirement": "pyasn1-modules==0.3.0" + } + }, + "grpc_python_dependencies_39_requests": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "grpc_python_dependencies_39", + "requirement": "requests==2.25.1" + } + }, + "grpc_python_dependencies_39_rsa": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "grpc_python_dependencies_39", + "requirement": "rsa==4.9" + } + }, + "grpc_python_dependencies_39_setuptools": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "grpc_python_dependencies_39", + "requirement": "setuptools==44.1.1" + } + }, + "grpc_python_dependencies_39_typing_extensions": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "grpc_python_dependencies_39", + "requirement": "typing-extensions==4.9.0" + } + }, + "grpc_python_dependencies_39_urllib3": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "grpc_python_dependencies_39", + "requirement": "urllib3==1.26.18" + } + }, + "grpc_python_dependencies_39_wheel": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "grpc_python_dependencies_39", + "requirement": "wheel==0.38.1" + } + }, + "grpc_python_dependencies_39_wrapt": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "grpc_python_dependencies_39", + "requirement": "wrapt==1.16.0" + } + }, + "grpc_python_dependencies_39_zipp": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "grpc_python_dependencies_39", + "requirement": "zipp==3.17.0" + } + }, + "grpc_python_dependencies_39_zope_event": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "grpc_python_dependencies_39", + "requirement": "zope.event==4.5.0" + } + }, + "grpc_python_dependencies_39_zope_interface": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@grpc_python_dependencies//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "grpc_python_dependencies_39", + "requirement": "zope.interface==6.1" + } + }, + "pgv_pip_deps_310_astunparse": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pgv_pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "pgv_pip_deps_310", + "requirement": "astunparse==1.6.3" + } + }, + "pgv_pip_deps_310_jinja2": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pgv_pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "pgv_pip_deps_310", + "requirement": "jinja2==3.1.3" + } + }, + "pgv_pip_deps_310_markupsafe": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pgv_pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "pgv_pip_deps_310", + "requirement": "markupsafe==2.1.5" + } + }, + "pgv_pip_deps_310_protobuf": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pgv_pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "pgv_pip_deps_310", + "requirement": "protobuf==5.26.0" + } + }, + "pgv_pip_deps_310_six": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pgv_pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "pgv_pip_deps_310", + "requirement": "six==1.16.0" + } + }, + "pgv_pip_deps_310_validate_email": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pgv_pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "pgv_pip_deps_310", + "requirement": "validate-email==1.3" + } + }, + "pgv_pip_deps_310_wheel": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pgv_pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "pgv_pip_deps_310", + "requirement": "wheel==0.43.0" + } + }, + "pgv_pip_deps_311_astunparse": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pgv_pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "pgv_pip_deps_311", + "requirement": "astunparse==1.6.3" + } + }, + "pgv_pip_deps_311_jinja2": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pgv_pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "pgv_pip_deps_311", + "requirement": "jinja2==3.1.3" + } + }, + "pgv_pip_deps_311_markupsafe": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pgv_pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "pgv_pip_deps_311", + "requirement": "markupsafe==2.1.5" + } + }, + "pgv_pip_deps_311_protobuf": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pgv_pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "pgv_pip_deps_311", + "requirement": "protobuf==5.26.0" + } + }, + "pgv_pip_deps_311_six": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pgv_pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "pgv_pip_deps_311", + "requirement": "six==1.16.0" + } + }, + "pgv_pip_deps_311_validate_email": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pgv_pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "pgv_pip_deps_311", + "requirement": "validate-email==1.3" + } + }, + "pgv_pip_deps_311_wheel": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pgv_pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "pgv_pip_deps_311", + "requirement": "wheel==0.43.0" + } + }, + "pgv_pip_deps_312_astunparse": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pgv_pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "pgv_pip_deps_312", + "requirement": "astunparse==1.6.3" + } + }, + "pgv_pip_deps_312_jinja2": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pgv_pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "pgv_pip_deps_312", + "requirement": "jinja2==3.1.3" + } + }, + "pgv_pip_deps_312_markupsafe": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pgv_pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "pgv_pip_deps_312", + "requirement": "markupsafe==2.1.5" + } + }, + "pgv_pip_deps_312_protobuf": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pgv_pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "pgv_pip_deps_312", + "requirement": "protobuf==5.26.0" + } + }, + "pgv_pip_deps_312_six": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pgv_pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "pgv_pip_deps_312", + "requirement": "six==1.16.0" + } + }, + "pgv_pip_deps_312_validate_email": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pgv_pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "pgv_pip_deps_312", + "requirement": "validate-email==1.3" + } + }, + "pgv_pip_deps_312_wheel": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pgv_pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "pgv_pip_deps_312", + "requirement": "wheel==0.43.0" + } + }, + "pgv_pip_deps_313_astunparse": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pgv_pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_13_host//:python", + "repo": "pgv_pip_deps_313", + "requirement": "astunparse==1.6.3" + } + }, + "pgv_pip_deps_313_jinja2": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pgv_pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_13_host//:python", + "repo": "pgv_pip_deps_313", + "requirement": "jinja2==3.1.3" + } + }, + "pgv_pip_deps_313_markupsafe": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pgv_pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_13_host//:python", + "repo": "pgv_pip_deps_313", + "requirement": "markupsafe==2.1.5" + } + }, + "pgv_pip_deps_313_protobuf": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pgv_pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_13_host//:python", + "repo": "pgv_pip_deps_313", + "requirement": "protobuf==5.26.0" + } + }, + "pgv_pip_deps_313_six": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pgv_pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_13_host//:python", + "repo": "pgv_pip_deps_313", + "requirement": "six==1.16.0" + } + }, + "pgv_pip_deps_313_validate_email": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pgv_pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_13_host//:python", + "repo": "pgv_pip_deps_313", + "requirement": "validate-email==1.3" + } + }, + "pgv_pip_deps_313_wheel": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pgv_pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_13_host//:python", + "repo": "pgv_pip_deps_313", + "requirement": "wheel==0.43.0" + } + }, + "pgv_pip_deps_39_astunparse": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pgv_pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "pgv_pip_deps_39", + "requirement": "astunparse==1.6.3" + } + }, + "pgv_pip_deps_39_jinja2": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pgv_pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "pgv_pip_deps_39", + "requirement": "jinja2==3.1.3" + } + }, + "pgv_pip_deps_39_markupsafe": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pgv_pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "pgv_pip_deps_39", + "requirement": "markupsafe==2.1.5" + } + }, + "pgv_pip_deps_39_protobuf": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pgv_pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "pgv_pip_deps_39", + "requirement": "protobuf==5.26.0" + } + }, + "pgv_pip_deps_39_six": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pgv_pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "pgv_pip_deps_39", + "requirement": "six==1.16.0" + } + }, + "pgv_pip_deps_39_validate_email": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pgv_pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "pgv_pip_deps_39", + "requirement": "validate-email==1.3" + } + }, + "pgv_pip_deps_39_wheel": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pgv_pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "pgv_pip_deps_39", + "requirement": "wheel==0.43.0" + } + }, + "pip_deps_310_numpy": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "pip_deps_310", + "requirement": "numpy<=1.26.1" + } + }, + "pip_deps_310_setuptools": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "pip_deps_310", + "requirement": "setuptools<=70.3.0" + } + }, + "pip_deps_311_numpy": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "pip_deps_311", + "requirement": "numpy<=1.26.1" + } + }, + "pip_deps_311_setuptools": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "pip_deps_311", + "requirement": "setuptools<=70.3.0" + } + }, + "pip_deps_312_numpy": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "pip_deps_312", + "requirement": "numpy<=1.26.1" + } + }, + "pip_deps_312_setuptools": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "pip_deps_312", + "requirement": "setuptools<=70.3.0" + } + }, + "pip_deps_38_numpy": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "pip_deps_38", + "requirement": "numpy<=1.26.1" + } + }, + "pip_deps_38_setuptools": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "pip_deps_38", + "requirement": "setuptools<=70.3.0" + } + }, + "pip_deps_39_numpy": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "pip_deps_39", + "requirement": "numpy<=1.26.1" + } + }, + "pip_deps_39_setuptools": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "pip_deps_39", + "requirement": "setuptools<=70.3.0" + } + }, + "py3_mpkhs_aws_privatekey_synthetic_deps_38_aws_requests_auth": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@py3_mpkhs_aws_privatekey_synthetic_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "py3_mpkhs_aws_privatekey_synthetic_deps_38", + "requirement": "aws_requests_auth==0.4.3" + } + }, + "py3_mpkhs_aws_privatekey_synthetic_deps_38_awscrt": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@py3_mpkhs_aws_privatekey_synthetic_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "py3_mpkhs_aws_privatekey_synthetic_deps_38", + "requirement": "awscrt==0.16.16" + } + }, + "py3_mpkhs_aws_privatekey_synthetic_deps_38_certifi": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@py3_mpkhs_aws_privatekey_synthetic_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "py3_mpkhs_aws_privatekey_synthetic_deps_38", + "requirement": "certifi==2022.12.7" + } + }, + "py3_mpkhs_aws_privatekey_synthetic_deps_38_charset_normalizer": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@py3_mpkhs_aws_privatekey_synthetic_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "py3_mpkhs_aws_privatekey_synthetic_deps_38", + "requirement": "charset-normalizer==3.0.1" + } + }, + "py3_mpkhs_aws_privatekey_synthetic_deps_38_h2": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@py3_mpkhs_aws_privatekey_synthetic_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "py3_mpkhs_aws_privatekey_synthetic_deps_38", + "requirement": "h2==2.6.2" + } + }, + "py3_mpkhs_aws_privatekey_synthetic_deps_38_hpack": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@py3_mpkhs_aws_privatekey_synthetic_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "py3_mpkhs_aws_privatekey_synthetic_deps_38", + "requirement": "hpack==3.0.0" + } + }, + "py3_mpkhs_aws_privatekey_synthetic_deps_38_hyper": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@py3_mpkhs_aws_privatekey_synthetic_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "py3_mpkhs_aws_privatekey_synthetic_deps_38", + "requirement": "hyper==0.7.0" + } + }, + "py3_mpkhs_aws_privatekey_synthetic_deps_38_hyperframe": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@py3_mpkhs_aws_privatekey_synthetic_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "py3_mpkhs_aws_privatekey_synthetic_deps_38", + "requirement": "hyperframe==3.2.0" + } + }, + "py3_mpkhs_aws_privatekey_synthetic_deps_38_idna": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@py3_mpkhs_aws_privatekey_synthetic_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "py3_mpkhs_aws_privatekey_synthetic_deps_38", + "requirement": "idna==3.6" + } + }, + "py3_mpkhs_aws_privatekey_synthetic_deps_38_requests": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@py3_mpkhs_aws_privatekey_synthetic_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "py3_mpkhs_aws_privatekey_synthetic_deps_38", + "requirement": "requests==2.28.2" + } + }, + "py3_mpkhs_aws_privatekey_synthetic_deps_38_urllib3": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@py3_mpkhs_aws_privatekey_synthetic_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "py3_mpkhs_aws_privatekey_synthetic_deps_38", + "requirement": "urllib3==1.26.14" + } + }, + "py3_privacybudget_aws_pbs_auth_handler_deps_38_publicsuffixlist": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@py3_privacybudget_aws_pbs_auth_handler_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "py3_privacybudget_aws_pbs_auth_handler_deps_38", + "requirement": "publicsuffixlist==0.10.*" + } + }, + "py3_privacybudget_aws_pbs_identities_migration_deps_38_publicsuffixlist": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@py3_privacybudget_aws_pbs_identities_migration_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "py3_privacybudget_aws_pbs_identities_migration_deps_38", + "requirement": "publicsuffixlist==0.10.*" + } + }, + "py3_privacybudget_aws_pbs_synthetic_deps_38_aws_requests_auth": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@py3_privacybudget_aws_pbs_synthetic_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "py3_privacybudget_aws_pbs_synthetic_deps_38", + "requirement": "aws_requests_auth==0.4.3" + } + }, + "py3_privacybudget_aws_pbs_synthetic_deps_38_awscrt": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@py3_privacybudget_aws_pbs_synthetic_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "py3_privacybudget_aws_pbs_synthetic_deps_38", + "requirement": "awscrt==0.16.16" + } + }, + "py3_privacybudget_aws_pbs_synthetic_deps_38_certifi": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@py3_privacybudget_aws_pbs_synthetic_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "py3_privacybudget_aws_pbs_synthetic_deps_38", + "requirement": "certifi==2022.12.7" + } + }, + "py3_privacybudget_aws_pbs_synthetic_deps_38_charset_normalizer": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@py3_privacybudget_aws_pbs_synthetic_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "py3_privacybudget_aws_pbs_synthetic_deps_38", + "requirement": "charset-normalizer==3.0.1" + } + }, + "py3_privacybudget_aws_pbs_synthetic_deps_38_h2": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@py3_privacybudget_aws_pbs_synthetic_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "py3_privacybudget_aws_pbs_synthetic_deps_38", + "requirement": "h2==2.6.2" + } + }, + "py3_privacybudget_aws_pbs_synthetic_deps_38_hpack": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@py3_privacybudget_aws_pbs_synthetic_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "py3_privacybudget_aws_pbs_synthetic_deps_38", + "requirement": "hpack==3.0.0" + } + }, + "py3_privacybudget_aws_pbs_synthetic_deps_38_hyper": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@py3_privacybudget_aws_pbs_synthetic_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "py3_privacybudget_aws_pbs_synthetic_deps_38", + "requirement": "hyper==0.7.0" + } + }, + "py3_privacybudget_aws_pbs_synthetic_deps_38_hyperframe": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@py3_privacybudget_aws_pbs_synthetic_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "py3_privacybudget_aws_pbs_synthetic_deps_38", + "requirement": "hyperframe==3.2.0" + } + }, + "py3_privacybudget_aws_pbs_synthetic_deps_38_idna": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@py3_privacybudget_aws_pbs_synthetic_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "py3_privacybudget_aws_pbs_synthetic_deps_38", + "requirement": "idna==3.6" + } + }, + "py3_privacybudget_aws_pbs_synthetic_deps_38_requests": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@py3_privacybudget_aws_pbs_synthetic_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "py3_privacybudget_aws_pbs_synthetic_deps_38", + "requirement": "requests==2.28.2" + } + }, + "py3_privacybudget_aws_pbs_synthetic_deps_38_urllib3": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@py3_privacybudget_aws_pbs_synthetic_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "py3_privacybudget_aws_pbs_synthetic_deps_38", + "requirement": "urllib3==1.26.14" + } + }, + "py3_privacybudget_gcp_operator_onboarding_deps_38_google_cloud_spanner": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@py3_privacybudget_gcp_operator_onboarding_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "py3_privacybudget_gcp_operator_onboarding_deps_38", + "requirement": "google-cloud-spanner==3.26.0" + } + }, + "py3_privacybudget_gcp_operator_onboarding_deps_38_google_cloud_storage": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@py3_privacybudget_gcp_operator_onboarding_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "py3_privacybudget_gcp_operator_onboarding_deps_38", + "requirement": "google-cloud-storage==2.7.0" + } + }, + "py3_privacybudget_gcp_operator_onboarding_deps_38_numpy": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@py3_privacybudget_gcp_operator_onboarding_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "py3_privacybudget_gcp_operator_onboarding_deps_38", + "requirement": "numpy==1.24.4" + } + }, + "py3_privacybudget_gcp_operator_onboarding_deps_38_pandas": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@py3_privacybudget_gcp_operator_onboarding_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "py3_privacybudget_gcp_operator_onboarding_deps_38", + "requirement": "pandas==1.5.2" + } + }, + "py3_privacybudget_gcp_operator_onboarding_deps_38_python_dateutil": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@py3_privacybudget_gcp_operator_onboarding_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "py3_privacybudget_gcp_operator_onboarding_deps_38", + "requirement": "python-dateutil==2.9.0" + } + }, + "py3_privacybudget_gcp_operator_onboarding_deps_38_pytz": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@py3_privacybudget_gcp_operator_onboarding_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "py3_privacybudget_gcp_operator_onboarding_deps_38", + "requirement": "pytz==2024.2" + } + }, + "py3_privacybudget_gcp_operator_onboarding_deps_38_six": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@py3_privacybudget_gcp_operator_onboarding_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "py3_privacybudget_gcp_operator_onboarding_deps_38", + "requirement": "six==1.17.0" + } + }, + "py3_privacybudget_gcp_pbs_auth_handler_test_deps_38_cachetools": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@py3_privacybudget_gcp_pbs_auth_handler_test_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "py3_privacybudget_gcp_pbs_auth_handler_test_deps_38", + "requirement": "cachetools==5.5.1" + } + }, + "py3_privacybudget_gcp_pbs_auth_handler_test_deps_38_certifi": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@py3_privacybudget_gcp_pbs_auth_handler_test_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "py3_privacybudget_gcp_pbs_auth_handler_test_deps_38", + "requirement": "certifi==2024.12.14" + } + }, + "py3_privacybudget_gcp_pbs_auth_handler_test_deps_38_charset_normalizer": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@py3_privacybudget_gcp_pbs_auth_handler_test_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "py3_privacybudget_gcp_pbs_auth_handler_test_deps_38", + "requirement": "charset-normalizer==3.4.1" + } + }, + "py3_privacybudget_gcp_pbs_auth_handler_test_deps_38_google_api_core": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@py3_privacybudget_gcp_pbs_auth_handler_test_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "py3_privacybudget_gcp_pbs_auth_handler_test_deps_38", + "requirement": "google-api-core==2.19.1" + } + }, + "py3_privacybudget_gcp_pbs_auth_handler_test_deps_38_google_auth": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@py3_privacybudget_gcp_pbs_auth_handler_test_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "py3_privacybudget_gcp_pbs_auth_handler_test_deps_38", + "requirement": "google-auth==2.37.0" + } + }, + "py3_privacybudget_gcp_pbs_auth_handler_test_deps_38_googleapis_common_protos": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@py3_privacybudget_gcp_pbs_auth_handler_test_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "py3_privacybudget_gcp_pbs_auth_handler_test_deps_38", + "requirement": "googleapis-common-protos==1.66.0" + } + }, + "py3_privacybudget_gcp_pbs_auth_handler_test_deps_38_idna": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@py3_privacybudget_gcp_pbs_auth_handler_test_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "py3_privacybudget_gcp_pbs_auth_handler_test_deps_38", + "requirement": "idna==3.10" + } + }, + "py3_privacybudget_gcp_pbs_auth_handler_test_deps_38_proto_plus": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@py3_privacybudget_gcp_pbs_auth_handler_test_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "py3_privacybudget_gcp_pbs_auth_handler_test_deps_38", + "requirement": "proto-plus==1.25.0" + } + }, + "py3_privacybudget_gcp_pbs_auth_handler_test_deps_38_protobuf": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@py3_privacybudget_gcp_pbs_auth_handler_test_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "py3_privacybudget_gcp_pbs_auth_handler_test_deps_38", + "requirement": "protobuf==5.29.3" + } + }, + "py3_privacybudget_gcp_pbs_auth_handler_test_deps_38_publicsuffixlist": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@py3_privacybudget_gcp_pbs_auth_handler_test_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "py3_privacybudget_gcp_pbs_auth_handler_test_deps_38", + "requirement": "publicsuffixlist==0.10.*" + } + }, + "py3_privacybudget_gcp_pbs_auth_handler_test_deps_38_pyasn1": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@py3_privacybudget_gcp_pbs_auth_handler_test_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "py3_privacybudget_gcp_pbs_auth_handler_test_deps_38", + "requirement": "pyasn1==0.6.1" + } + }, + "py3_privacybudget_gcp_pbs_auth_handler_test_deps_38_pyasn1_modules": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@py3_privacybudget_gcp_pbs_auth_handler_test_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "py3_privacybudget_gcp_pbs_auth_handler_test_deps_38", + "requirement": "pyasn1-modules==0.4.1" + } + }, + "py3_privacybudget_gcp_pbs_auth_handler_test_deps_38_requests": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@py3_privacybudget_gcp_pbs_auth_handler_test_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "py3_privacybudget_gcp_pbs_auth_handler_test_deps_38", + "requirement": "requests==2.32.3" + } + }, + "py3_privacybudget_gcp_pbs_auth_handler_test_deps_38_rsa": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@py3_privacybudget_gcp_pbs_auth_handler_test_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "py3_privacybudget_gcp_pbs_auth_handler_test_deps_38", + "requirement": "rsa==4.9" + } + }, + "py3_privacybudget_gcp_pbs_auth_handler_test_deps_38_urllib3": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@py3_privacybudget_gcp_pbs_auth_handler_test_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "py3_privacybudget_gcp_pbs_auth_handler_test_deps_38", + "requirement": "urllib3==2.2.3" + } + }, + "rules_fuzzing_py_deps_310_absl_py": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_fuzzing_py_deps//{name}:{target}", + "extra_pip_args": [ + "--require-hashes" + ], + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "rules_fuzzing_py_deps_310", + "requirement": "absl-py==2.0.0 --hash=sha256:9a28abb62774ae4e8edbe2dd4c49ffcd45a6a848952a5eccc6a49f3f0fc1e2f3" + } + }, + "rules_fuzzing_py_deps_310_six": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_fuzzing_py_deps//{name}:{target}", + "extra_pip_args": [ + "--require-hashes" + ], + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "rules_fuzzing_py_deps_310", + "requirement": "six==1.16.0 --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + } + }, + "rules_fuzzing_py_deps_311_absl_py": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_fuzzing_py_deps//{name}:{target}", + "extra_pip_args": [ + "--require-hashes" + ], + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_fuzzing_py_deps_311", + "requirement": "absl-py==2.0.0 --hash=sha256:9a28abb62774ae4e8edbe2dd4c49ffcd45a6a848952a5eccc6a49f3f0fc1e2f3" + } + }, + "rules_fuzzing_py_deps_311_six": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_fuzzing_py_deps//{name}:{target}", + "extra_pip_args": [ + "--require-hashes" + ], + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_fuzzing_py_deps_311", + "requirement": "six==1.16.0 --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + } + }, + "rules_fuzzing_py_deps_312_absl_py": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_fuzzing_py_deps//{name}:{target}", + "extra_pip_args": [ + "--require-hashes" + ], + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "rules_fuzzing_py_deps_312", + "requirement": "absl-py==2.0.0 --hash=sha256:9a28abb62774ae4e8edbe2dd4c49ffcd45a6a848952a5eccc6a49f3f0fc1e2f3" + } + }, + "rules_fuzzing_py_deps_312_six": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_fuzzing_py_deps//{name}:{target}", + "extra_pip_args": [ + "--require-hashes" + ], + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "rules_fuzzing_py_deps_312", + "requirement": "six==1.16.0 --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + } + }, + "rules_fuzzing_py_deps_38_absl_py": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_fuzzing_py_deps//{name}:{target}", + "extra_pip_args": [ + "--require-hashes" + ], + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "rules_fuzzing_py_deps_38", + "requirement": "absl-py==2.0.0 --hash=sha256:9a28abb62774ae4e8edbe2dd4c49ffcd45a6a848952a5eccc6a49f3f0fc1e2f3" + } + }, + "rules_fuzzing_py_deps_38_six": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_fuzzing_py_deps//{name}:{target}", + "extra_pip_args": [ + "--require-hashes" + ], + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "rules_fuzzing_py_deps_38", + "requirement": "six==1.16.0 --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + } + }, + "rules_fuzzing_py_deps_39_absl_py": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_fuzzing_py_deps//{name}:{target}", + "extra_pip_args": [ + "--require-hashes" + ], + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "rules_fuzzing_py_deps_39", + "requirement": "absl-py==2.0.0 --hash=sha256:9a28abb62774ae4e8edbe2dd4c49ffcd45a6a848952a5eccc6a49f3f0fc1e2f3" + } + }, + "rules_fuzzing_py_deps_39_six": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_fuzzing_py_deps//{name}:{target}", + "extra_pip_args": [ + "--require-hashes" + ], + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "rules_fuzzing_py_deps_39", + "requirement": "six==1.16.0 --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + } + }, + "rules_python_publish_deps_311_backports_tarfile_py3_none_any_77e284d7": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "backports.tarfile-1.2.0-py3-none-any.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "backports-tarfile==1.2.0", + "sha256": "77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34", + "urls": [ + "https://files.pythonhosted.org/packages/b9/fa/123043af240e49752f1c4bd24da5053b6bd00cad78c2be53c0d1e8b975bc/backports.tarfile-1.2.0-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_backports_tarfile_sdist_d75e02c2": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "backports_tarfile-1.2.0.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "backports-tarfile==1.2.0", + "sha256": "d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991", + "urls": [ + "https://files.pythonhosted.org/packages/86/72/cd9b395f25e290e633655a100af28cb253e4393396264a98bd5f5951d50f/backports_tarfile-1.2.0.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_certifi_py3_none_any_922820b5": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "certifi-2024.8.30-py3-none-any.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "certifi==2024.8.30", + "sha256": "922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8", + "urls": [ + "https://files.pythonhosted.org/packages/12/90/3c9ff0512038035f59d279fddeb79f5f1eccd8859f06d6163c58798b9487/certifi-2024.8.30-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_certifi_sdist_bec941d2": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "certifi-2024.8.30.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "certifi==2024.8.30", + "sha256": "bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9", + "urls": [ + "https://files.pythonhosted.org/packages/b0/ee/9b19140fe824b367c04c5e1b369942dd754c4c5462d5674002f75c4dedc1/certifi-2024.8.30.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_aarch64_a1ed2dd2": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64" + ], + "filename": "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "cffi==1.17.1", + "sha256": "a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", + "urls": [ + "https://files.pythonhosted.org/packages/2e/ea/70ce63780f096e16ce8588efe039d3c4f91deb1dc01e9c73a287939c79a6/cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + ] + } + }, + "rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_ppc64le_46bf4316": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64" + ], + "filename": "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "cffi==1.17.1", + "sha256": "46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", + "urls": [ + "https://files.pythonhosted.org/packages/1c/a0/a4fa9f4f781bda074c3ddd57a572b060fa0df7655d2a4247bbe277200146/cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + ] + } + }, + "rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_s390x_a24ed04c": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64" + ], + "filename": "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "cffi==1.17.1", + "sha256": "a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", + "urls": [ + "https://files.pythonhosted.org/packages/62/12/ce8710b5b8affbcdd5c6e367217c242524ad17a02fe5beec3ee339f69f85/cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl" + ] + } + }, + "rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_x86_64_610faea7": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64" + ], + "filename": "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "cffi==1.17.1", + "sha256": "610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", + "urls": [ + "https://files.pythonhosted.org/packages/ff/6b/d45873c5e0242196f042d555526f92aa9e0c32355a1be1ff8c27f077fd37/cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + ] + } + }, + "rules_python_publish_deps_311_cffi_cp311_cp311_musllinux_1_1_aarch64_a9b15d49": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64" + ], + "filename": "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "cffi==1.17.1", + "sha256": "a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", + "urls": [ + "https://files.pythonhosted.org/packages/1a/52/d9a0e523a572fbccf2955f5abe883cfa8bcc570d7faeee06336fbd50c9fc/cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl" + ] + } + }, + "rules_python_publish_deps_311_cffi_cp311_cp311_musllinux_1_1_x86_64_fc48c783": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64" + ], + "filename": "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "cffi==1.17.1", + "sha256": "fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b", + "urls": [ + "https://files.pythonhosted.org/packages/f8/4a/34599cac7dfcd888ff54e801afe06a19c17787dfd94495ab0c8d35fe99fb/cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl" + ] + } + }, + "rules_python_publish_deps_311_cffi_sdist_1c39c601": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "cffi-1.17.1.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "cffi==1.17.1", + "sha256": "1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", + "urls": [ + "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_10_9_universal2_0d99dd8f": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "charset-normalizer==3.4.0", + "sha256": "0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c", + "urls": [ + "https://files.pythonhosted.org/packages/9c/61/73589dcc7a719582bf56aae309b6103d2762b526bffe189d635a7fcfd998/charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl" + ] + } + }, + "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_10_9_x86_64_c57516e5": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "charset-normalizer==3.4.0", + "sha256": "c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944", + "urls": [ + "https://files.pythonhosted.org/packages/77/d5/8c982d58144de49f59571f940e329ad6e8615e1e82ef84584c5eeb5e1d72/charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl" + ] + } + }, + "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_11_0_arm64_6dba5d19": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "charset-normalizer==3.4.0", + "sha256": "6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee", + "urls": [ + "https://files.pythonhosted.org/packages/bf/19/411a64f01ee971bed3231111b69eb56f9331a769072de479eae7de52296d/charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl" + ] + } + }, + "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_aarch64_bf4475b8": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "charset-normalizer==3.4.0", + "sha256": "bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c", + "urls": [ + "https://files.pythonhosted.org/packages/4c/92/97509850f0d00e9f14a46bc751daabd0ad7765cff29cdfb66c68b6dad57f/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + ] + } + }, + "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_ppc64le_ce031db0": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "charset-normalizer==3.4.0", + "sha256": "ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6", + "urls": [ + "https://files.pythonhosted.org/packages/e2/29/d227805bff72ed6d6cb1ce08eec707f7cfbd9868044893617eb331f16295/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + ] + } + }, + "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_s390x_8ff4e7cd": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "charset-normalizer==3.4.0", + "sha256": "8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea", + "urls": [ + "https://files.pythonhosted.org/packages/13/bc/87c2c9f2c144bedfa62f894c3007cd4530ba4b5351acb10dc786428a50f0/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl" + ] + } + }, + "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_x86_64_3710a975": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "charset-normalizer==3.4.0", + "sha256": "3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc", + "urls": [ + "https://files.pythonhosted.org/packages/eb/5b/6f10bad0f6461fa272bfbbdf5d0023b5fb9bc6217c92bf068fa5a99820f5/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + ] + } + }, + "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_aarch64_47334db7": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "charset-normalizer==3.4.0", + "sha256": "47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594", + "urls": [ + "https://files.pythonhosted.org/packages/d7/a1/493919799446464ed0299c8eef3c3fad0daf1c3cd48bff9263c731b0d9e2/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl" + ] + } + }, + "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_ppc64le_f1a2f519": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "charset-normalizer==3.4.0", + "sha256": "f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365", + "urls": [ + "https://files.pythonhosted.org/packages/75/d2/0ab54463d3410709c09266dfb416d032a08f97fd7d60e94b8c6ef54ae14b/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl" + ] + } + }, + "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_s390x_63bc5c4a": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "charset-normalizer==3.4.0", + "sha256": "63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129", + "urls": [ + "https://files.pythonhosted.org/packages/8d/c9/27e41d481557be53d51e60750b85aa40eaf52b841946b3cdeff363105737/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl" + ] + } + }, + "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_x86_64_bcb4f8ea": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "charset-normalizer==3.4.0", + "sha256": "bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236", + "urls": [ + "https://files.pythonhosted.org/packages/ee/44/4f62042ca8cdc0cabf87c0fc00ae27cd8b53ab68be3605ba6d071f742ad3/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl" + ] + } + }, + "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_win_amd64_cee4373f": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "charset-normalizer==3.4.0", + "sha256": "cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27", + "urls": [ + "https://files.pythonhosted.org/packages/0b/6e/b13bd47fa9023b3699e94abf565b5a2f0b0be6e9ddac9812182596ee62e4/charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl" + ] + } + }, + "rules_python_publish_deps_311_charset_normalizer_py3_none_any_fe9f97fe": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "charset_normalizer-3.4.0-py3-none-any.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "charset-normalizer==3.4.0", + "sha256": "fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079", + "urls": [ + "https://files.pythonhosted.org/packages/bf/9b/08c0432272d77b04803958a4598a51e2a4b51c06640af8b8f0f908c18bf2/charset_normalizer-3.4.0-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_charset_normalizer_sdist_223217c3": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "charset_normalizer-3.4.0.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "charset-normalizer==3.4.0", + "sha256": "223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e", + "urls": [ + "https://files.pythonhosted.org/packages/f2/4f/e1808dc01273379acc506d18f1504eb2d299bd4131743b9fc54d7be4df1e/charset_normalizer-3.4.0.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_17_aarch64_846da004": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64" + ], + "filename": "cryptography-43.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "cryptography==43.0.3", + "sha256": "846da004a5804145a5f441b8530b4bf35afbf7da70f82409f151695b127213d5", + "urls": [ + "https://files.pythonhosted.org/packages/2f/78/55356eb9075d0be6e81b59f45c7b48df87f76a20e73893872170471f3ee8/cryptography-43.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + ] + } + }, + "rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_17_x86_64_0f996e72": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64" + ], + "filename": "cryptography-43.0.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "cryptography==43.0.3", + "sha256": "0f996e7268af62598f2fc1204afa98a3b5712313a55c4c9d434aef49cadc91d4", + "urls": [ + "https://files.pythonhosted.org/packages/2a/2c/488776a3dc843f95f86d2f957ca0fc3407d0242b50bede7fad1e339be03f/cryptography-43.0.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + ] + } + }, + "rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_28_aarch64_f7b178f1": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64" + ], + "filename": "cryptography-43.0.3-cp39-abi3-manylinux_2_28_aarch64.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "cryptography==43.0.3", + "sha256": "f7b178f11ed3664fd0e995a47ed2b5ff0a12d893e41dd0494f406d1cf555cab7", + "urls": [ + "https://files.pythonhosted.org/packages/7c/04/2345ca92f7a22f601a9c62961741ef7dd0127c39f7310dffa0041c80f16f/cryptography-43.0.3-cp39-abi3-manylinux_2_28_aarch64.whl" + ] + } + }, + "rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_28_x86_64_c2e6fc39": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64" + ], + "filename": "cryptography-43.0.3-cp39-abi3-manylinux_2_28_x86_64.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "cryptography==43.0.3", + "sha256": "c2e6fc39c4ab499049df3bdf567f768a723a5e8464816e8f009f121a5a9f4405", + "urls": [ + "https://files.pythonhosted.org/packages/ac/25/e715fa0bc24ac2114ed69da33adf451a38abb6f3f24ec207908112e9ba53/cryptography-43.0.3-cp39-abi3-manylinux_2_28_x86_64.whl" + ] + } + }, + "rules_python_publish_deps_311_cryptography_cp39_abi3_musllinux_1_2_aarch64_e1be4655": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64" + ], + "filename": "cryptography-43.0.3-cp39-abi3-musllinux_1_2_aarch64.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "cryptography==43.0.3", + "sha256": "e1be4655c7ef6e1bbe6b5d0403526601323420bcf414598955968c9ef3eb7d16", + "urls": [ + "https://files.pythonhosted.org/packages/21/ce/b9c9ff56c7164d8e2edfb6c9305045fbc0df4508ccfdb13ee66eb8c95b0e/cryptography-43.0.3-cp39-abi3-musllinux_1_2_aarch64.whl" + ] + } + }, + "rules_python_publish_deps_311_cryptography_cp39_abi3_musllinux_1_2_x86_64_df6b6c6d": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64" + ], + "filename": "cryptography-43.0.3-cp39-abi3-musllinux_1_2_x86_64.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "cryptography==43.0.3", + "sha256": "df6b6c6d742395dd77a23ea3728ab62f98379eff8fb61be2744d4679ab678f73", + "urls": [ + "https://files.pythonhosted.org/packages/2a/33/b3682992ab2e9476b9c81fff22f02c8b0a1e6e1d49ee1750a67d85fd7ed2/cryptography-43.0.3-cp39-abi3-musllinux_1_2_x86_64.whl" + ] + } + }, + "rules_python_publish_deps_311_cryptography_sdist_315b9001": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "cryptography-43.0.3.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "cryptography==43.0.3", + "sha256": "315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805", + "urls": [ + "https://files.pythonhosted.org/packages/0d/05/07b55d1fa21ac18c3a8c79f764e2514e6f6a9698f1be44994f5adf0d29db/cryptography-43.0.3.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_docutils_py3_none_any_dafca5b9": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "docutils-0.21.2-py3-none-any.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "docutils==0.21.2", + "sha256": "dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2", + "urls": [ + "https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_docutils_sdist_3a6b1873": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "docutils-0.21.2.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "docutils==0.21.2", + "sha256": "3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f", + "urls": [ + "https://files.pythonhosted.org/packages/ae/ed/aefcc8cd0ba62a0560c3c18c33925362d46c6075480bfa4df87b28e169a9/docutils-0.21.2.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_idna_py3_none_any_946d195a": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "idna-3.10-py3-none-any.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "idna==3.10", + "sha256": "946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", + "urls": [ + "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_idna_sdist_12f65c9b": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "idna-3.10.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "idna==3.10", + "sha256": "12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", + "urls": [ + "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_importlib_metadata_py3_none_any_45e54197": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "importlib_metadata-8.5.0-py3-none-any.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "importlib-metadata==8.5.0", + "sha256": "45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b", + "urls": [ + "https://files.pythonhosted.org/packages/a0/d9/a1e041c5e7caa9a05c925f4bdbdfb7f006d1f74996af53467bc394c97be7/importlib_metadata-8.5.0-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_importlib_metadata_sdist_71522656": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "importlib_metadata-8.5.0.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "importlib-metadata==8.5.0", + "sha256": "71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7", + "urls": [ + "https://files.pythonhosted.org/packages/cd/12/33e59336dca5be0c398a7482335911a33aa0e20776128f038019f1a95f1b/importlib_metadata-8.5.0.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_jaraco_classes_py3_none_any_f662826b": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "jaraco.classes-3.4.0-py3-none-any.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "jaraco-classes==3.4.0", + "sha256": "f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790", + "urls": [ + "https://files.pythonhosted.org/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_jaraco_classes_sdist_47a024b5": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "jaraco.classes-3.4.0.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "jaraco-classes==3.4.0", + "sha256": "47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd", + "urls": [ + "https://files.pythonhosted.org/packages/06/c0/ed4a27bc5571b99e3cff68f8a9fa5b56ff7df1c2251cc715a652ddd26402/jaraco.classes-3.4.0.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_jaraco_context_py3_none_any_f797fc48": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "jaraco.context-6.0.1-py3-none-any.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "jaraco-context==6.0.1", + "sha256": "f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4", + "urls": [ + "https://files.pythonhosted.org/packages/ff/db/0c52c4cf5e4bd9f5d7135ec7669a3a767af21b3a308e1ed3674881e52b62/jaraco.context-6.0.1-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_jaraco_context_sdist_9bae4ea5": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "jaraco_context-6.0.1.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "jaraco-context==6.0.1", + "sha256": "9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3", + "urls": [ + "https://files.pythonhosted.org/packages/df/ad/f3777b81bf0b6e7bc7514a1656d3e637b2e8e15fab2ce3235730b3e7a4e6/jaraco_context-6.0.1.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_jaraco_functools_py3_none_any_ad159f13": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "jaraco.functools-4.1.0-py3-none-any.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "jaraco-functools==4.1.0", + "sha256": "ad159f13428bc4acbf5541ad6dec511f91573b90fba04df61dafa2a1231cf649", + "urls": [ + "https://files.pythonhosted.org/packages/9f/4f/24b319316142c44283d7540e76c7b5a6dbd5db623abd86bb7b3491c21018/jaraco.functools-4.1.0-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_jaraco_functools_sdist_70f7e0e2": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "jaraco_functools-4.1.0.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "jaraco-functools==4.1.0", + "sha256": "70f7e0e2ae076498e212562325e805204fc092d7b4c17e0e86c959e249701a9d", + "urls": [ + "https://files.pythonhosted.org/packages/ab/23/9894b3df5d0a6eb44611c36aec777823fc2e07740dabbd0b810e19594013/jaraco_functools-4.1.0.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_jeepney_py3_none_any_c0a454ad": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64" + ], + "filename": "jeepney-0.8.0-py3-none-any.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "jeepney==0.8.0", + "sha256": "c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755", + "urls": [ + "https://files.pythonhosted.org/packages/ae/72/2a1e2290f1ab1e06f71f3d0f1646c9e4634e70e1d37491535e19266e8dc9/jeepney-0.8.0-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_jeepney_sdist_5efe48d2": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "jeepney-0.8.0.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "jeepney==0.8.0", + "sha256": "5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806", + "urls": [ + "https://files.pythonhosted.org/packages/d6/f4/154cf374c2daf2020e05c3c6a03c91348d59b23c5366e968feb198306fdf/jeepney-0.8.0.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_keyring_py3_none_any_5426f817": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "keyring-25.4.1-py3-none-any.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "keyring==25.4.1", + "sha256": "5426f817cf7f6f007ba5ec722b1bcad95a75b27d780343772ad76b17cb47b0bf", + "urls": [ + "https://files.pythonhosted.org/packages/83/25/e6d59e5f0a0508d0dca8bb98c7f7fd3772fc943ac3f53d5ab18a218d32c0/keyring-25.4.1-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_keyring_sdist_b07ebc55": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "keyring-25.4.1.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "keyring==25.4.1", + "sha256": "b07ebc55f3e8ed86ac81dd31ef14e81ace9dd9c3d4b5d77a6e9a2016d0d71a1b", + "urls": [ + "https://files.pythonhosted.org/packages/a5/1c/2bdbcfd5d59dc6274ffb175bc29aa07ecbfab196830e0cfbde7bd861a2ea/keyring-25.4.1.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_markdown_it_py_py3_none_any_35521684": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "markdown_it_py-3.0.0-py3-none-any.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "markdown-it-py==3.0.0", + "sha256": "355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", + "urls": [ + "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_markdown_it_py_sdist_e3f60a94": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "markdown-it-py-3.0.0.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "markdown-it-py==3.0.0", + "sha256": "e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", + "urls": [ + "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_mdurl_py3_none_any_84008a41": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "mdurl-0.1.2-py3-none-any.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "mdurl==0.1.2", + "sha256": "84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", + "urls": [ + "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_mdurl_sdist_bb413d29": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "mdurl-0.1.2.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "mdurl==0.1.2", + "sha256": "bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", + "urls": [ + "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_more_itertools_py3_none_any_037b0d32": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "more_itertools-10.5.0-py3-none-any.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "more-itertools==10.5.0", + "sha256": "037b0d3203ce90cca8ab1defbbdac29d5f993fc20131f3664dc8d6acfa872aef", + "urls": [ + "https://files.pythonhosted.org/packages/48/7e/3a64597054a70f7c86eb0a7d4fc315b8c1ab932f64883a297bdffeb5f967/more_itertools-10.5.0-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_more_itertools_sdist_5482bfef": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "more-itertools-10.5.0.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "more-itertools==10.5.0", + "sha256": "5482bfef7849c25dc3c6dd53a6173ae4795da2a41a80faea6700d9f5846c5da6", + "urls": [ + "https://files.pythonhosted.org/packages/51/78/65922308c4248e0eb08ebcbe67c95d48615cc6f27854b6f2e57143e9178f/more-itertools-10.5.0.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_nh3_cp37_abi3_macosx_10_12_x86_64_14c5a72e": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "nh3==0.2.18", + "sha256": "14c5a72e9fe82aea5fe3072116ad4661af5cf8e8ff8fc5ad3450f123e4925e86", + "urls": [ + "https://files.pythonhosted.org/packages/b3/89/1daff5d9ba5a95a157c092c7c5f39b8dd2b1ddb4559966f808d31cfb67e0/nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl" + ] + } + }, + "rules_python_publish_deps_311_nh3_cp37_abi3_macosx_10_12_x86_64_7b7c2a3c": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "nh3==0.2.18", + "sha256": "7b7c2a3c9eb1a827d42539aa64091640bd275b81e097cd1d8d82ef91ffa2e811", + "urls": [ + "https://files.pythonhosted.org/packages/2c/b6/42fc3c69cabf86b6b81e4c051a9b6e249c5ba9f8155590222c2622961f58/nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.whl" + ] + } + }, + "rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_aarch64_42c64511": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "nh3-0.2.18-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "nh3==0.2.18", + "sha256": "42c64511469005058cd17cc1537578eac40ae9f7200bedcfd1fc1a05f4f8c200", + "urls": [ + "https://files.pythonhosted.org/packages/45/b9/833f385403abaf0023c6547389ec7a7acf141ddd9d1f21573723a6eab39a/nh3-0.2.18-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + ] + } + }, + "rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_armv7l_0411beb0": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "nh3-0.2.18-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "nh3==0.2.18", + "sha256": "0411beb0589eacb6734f28d5497ca2ed379eafab8ad8c84b31bb5c34072b7164", + "urls": [ + "https://files.pythonhosted.org/packages/05/2b/85977d9e11713b5747595ee61f381bc820749daf83f07b90b6c9964cf932/nh3-0.2.18-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl" + ] + } + }, + "rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_ppc64_5f36b271": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "nh3-0.2.18-cp37-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "nh3==0.2.18", + "sha256": "5f36b271dae35c465ef5e9090e1fdaba4a60a56f0bb0ba03e0932a66f28b9189", + "urls": [ + "https://files.pythonhosted.org/packages/72/f2/5c894d5265ab80a97c68ca36f25c8f6f0308abac649aaf152b74e7e854a8/nh3-0.2.18-cp37-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl" + ] + } + }, + "rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_ppc64le_34c03fa7": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "nh3-0.2.18-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "nh3==0.2.18", + "sha256": "34c03fa78e328c691f982b7c03d4423bdfd7da69cd707fe572f544cf74ac23ad", + "urls": [ + "https://files.pythonhosted.org/packages/ab/a7/375afcc710dbe2d64cfbd69e31f82f3e423d43737258af01f6a56d844085/nh3-0.2.18-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + ] + } + }, + "rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_s390x_19aaba96": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "nh3-0.2.18-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "nh3==0.2.18", + "sha256": "19aaba96e0f795bd0a6c56291495ff59364f4300d4a39b29a0abc9cb3774a84b", + "urls": [ + "https://files.pythonhosted.org/packages/c2/a8/3bb02d0c60a03ad3a112b76c46971e9480efa98a8946677b5a59f60130ca/nh3-0.2.18-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl" + ] + } + }, + "rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_x86_64_de3ceed6": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "nh3-0.2.18-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "nh3==0.2.18", + "sha256": "de3ceed6e661954871d6cd78b410213bdcb136f79aafe22aa7182e028b8c7307", + "urls": [ + "https://files.pythonhosted.org/packages/1b/63/6ab90d0e5225ab9780f6c9fb52254fa36b52bb7c188df9201d05b647e5e1/nh3-0.2.18-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + ] + } + }, + "rules_python_publish_deps_311_nh3_cp37_abi3_musllinux_1_2_aarch64_f0eca9ca": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "nh3-0.2.18-cp37-abi3-musllinux_1_2_aarch64.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "nh3==0.2.18", + "sha256": "f0eca9ca8628dbb4e916ae2491d72957fdd35f7a5d326b7032a345f111ac07fe", + "urls": [ + "https://files.pythonhosted.org/packages/a3/da/0c4e282bc3cff4a0adf37005fa1fb42257673fbc1bbf7d1ff639ec3d255a/nh3-0.2.18-cp37-abi3-musllinux_1_2_aarch64.whl" + ] + } + }, + "rules_python_publish_deps_311_nh3_cp37_abi3_musllinux_1_2_armv7l_3a157ab1": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "nh3-0.2.18-cp37-abi3-musllinux_1_2_armv7l.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "nh3==0.2.18", + "sha256": "3a157ab149e591bb638a55c8c6bcb8cdb559c8b12c13a8affaba6cedfe51713a", + "urls": [ + "https://files.pythonhosted.org/packages/de/81/c291231463d21da5f8bba82c8167a6d6893cc5419b0639801ee5d3aeb8a9/nh3-0.2.18-cp37-abi3-musllinux_1_2_armv7l.whl" + ] + } + }, + "rules_python_publish_deps_311_nh3_cp37_abi3_musllinux_1_2_x86_64_36c95d4b": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "nh3-0.2.18-cp37-abi3-musllinux_1_2_x86_64.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "nh3==0.2.18", + "sha256": "36c95d4b70530b320b365659bb5034341316e6a9b30f0b25fa9c9eff4c27a204", + "urls": [ + "https://files.pythonhosted.org/packages/eb/61/73a007c74c37895fdf66e0edcd881f5eaa17a348ff02f4bb4bc906d61085/nh3-0.2.18-cp37-abi3-musllinux_1_2_x86_64.whl" + ] + } + }, + "rules_python_publish_deps_311_nh3_cp37_abi3_win_amd64_8ce0f819": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "nh3-0.2.18-cp37-abi3-win_amd64.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "nh3==0.2.18", + "sha256": "8ce0f819d2f1933953fca255db2471ad58184a60508f03e6285e5114b6254844", + "urls": [ + "https://files.pythonhosted.org/packages/26/8d/53c5b19c4999bdc6ba95f246f4ef35ca83d7d7423e5e38be43ad66544e5d/nh3-0.2.18-cp37-abi3-win_amd64.whl" + ] + } + }, + "rules_python_publish_deps_311_nh3_sdist_94a16692": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "nh3-0.2.18.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "nh3==0.2.18", + "sha256": "94a166927e53972a9698af9542ace4e38b9de50c34352b962f4d9a7d4c927af4", + "urls": [ + "https://files.pythonhosted.org/packages/62/73/10df50b42ddb547a907deeb2f3c9823022580a7a47281e8eae8e003a9639/nh3-0.2.18.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_pkginfo_py3_none_any_889a6da2": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "pkginfo-1.10.0-py3-none-any.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "pkginfo==1.10.0", + "sha256": "889a6da2ed7ffc58ab5b900d888ddce90bce912f2d2de1dc1c26f4cb9fe65097", + "urls": [ + "https://files.pythonhosted.org/packages/56/09/054aea9b7534a15ad38a363a2bd974c20646ab1582a387a95b8df1bfea1c/pkginfo-1.10.0-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_pkginfo_sdist_5df73835": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "pkginfo-1.10.0.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "pkginfo==1.10.0", + "sha256": "5df73835398d10db79f8eecd5cd86b1f6d29317589ea70796994d49399af6297", + "urls": [ + "https://files.pythonhosted.org/packages/2f/72/347ec5be4adc85c182ed2823d8d1c7b51e13b9a6b0c1aae59582eca652df/pkginfo-1.10.0.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_pycparser_py3_none_any_c3702b6d": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64" + ], + "filename": "pycparser-2.22-py3-none-any.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "pycparser==2.22", + "sha256": "c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", + "urls": [ + "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_pycparser_sdist_491c8be9": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "pycparser-2.22.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "pycparser==2.22", + "sha256": "491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", + "urls": [ + "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_pygments_py3_none_any_b8e6aca0": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "pygments-2.18.0-py3-none-any.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "pygments==2.18.0", + "sha256": "b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a", + "urls": [ + "https://files.pythonhosted.org/packages/f7/3f/01c8b82017c199075f8f788d0d906b9ffbbc5a47dc9918a945e13d5a2bda/pygments-2.18.0-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_pygments_sdist_786ff802": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "pygments-2.18.0.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "pygments==2.18.0", + "sha256": "786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199", + "urls": [ + "https://files.pythonhosted.org/packages/8e/62/8336eff65bcbc8e4cb5d05b55faf041285951b6e80f33e2bff2024788f31/pygments-2.18.0.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_pywin32_ctypes_py3_none_any_8a151337": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_windows_x86_64" + ], + "filename": "pywin32_ctypes-0.2.3-py3-none-any.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "pywin32-ctypes==0.2.3", + "sha256": "8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8", + "urls": [ + "https://files.pythonhosted.org/packages/de/3d/8161f7711c017e01ac9f008dfddd9410dff3674334c233bde66e7ba65bbf/pywin32_ctypes-0.2.3-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_pywin32_ctypes_sdist_d162dc04": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_windows_x86_64" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "pywin32-ctypes-0.2.3.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "pywin32-ctypes==0.2.3", + "sha256": "d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755", + "urls": [ + "https://files.pythonhosted.org/packages/85/9f/01a1a99704853cb63f253eea009390c88e7131c67e66a0a02099a8c917cb/pywin32-ctypes-0.2.3.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_readme_renderer_py3_none_any_2fbca89b": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "readme_renderer-44.0-py3-none-any.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "readme-renderer==44.0", + "sha256": "2fbca89b81a08526aadf1357a8c2ae889ec05fb03f5da67f9769c9a592166151", + "urls": [ + "https://files.pythonhosted.org/packages/e1/67/921ec3024056483db83953ae8e48079ad62b92db7880013ca77632921dd0/readme_renderer-44.0-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_readme_renderer_sdist_8712034e": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "readme_renderer-44.0.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "readme-renderer==44.0", + "sha256": "8712034eabbfa6805cacf1402b4eeb2a73028f72d1166d6f5cb7f9c047c5d1e1", + "urls": [ + "https://files.pythonhosted.org/packages/5a/a9/104ec9234c8448c4379768221ea6df01260cd6c2ce13182d4eac531c8342/readme_renderer-44.0.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_requests_py3_none_any_70761cfe": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "requests-2.32.3-py3-none-any.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "requests==2.32.3", + "sha256": "70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", + "urls": [ + "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_requests_sdist_55365417": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "requests-2.32.3.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "requests==2.32.3", + "sha256": "55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", + "urls": [ + "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_requests_toolbelt_py2_none_any_cccfdd66": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "requests_toolbelt-1.0.0-py2.py3-none-any.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "requests-toolbelt==1.0.0", + "sha256": "cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06", + "urls": [ + "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_requests_toolbelt_sdist_7681a0a3": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "requests-toolbelt-1.0.0.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "requests-toolbelt==1.0.0", + "sha256": "7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6", + "urls": [ + "https://files.pythonhosted.org/packages/f3/61/d7545dafb7ac2230c70d38d31cbfe4cc64f7144dc41f6e4e4b78ecd9f5bb/requests-toolbelt-1.0.0.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_rfc3986_py2_none_any_50b1502b": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "rfc3986-2.0.0-py2.py3-none-any.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "rfc3986==2.0.0", + "sha256": "50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd", + "urls": [ + "https://files.pythonhosted.org/packages/ff/9a/9afaade874b2fa6c752c36f1548f718b5b83af81ed9b76628329dab81c1b/rfc3986-2.0.0-py2.py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_rfc3986_sdist_97aacf9d": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "rfc3986-2.0.0.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "rfc3986==2.0.0", + "sha256": "97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c", + "urls": [ + "https://files.pythonhosted.org/packages/85/40/1520d68bfa07ab5a6f065a186815fb6610c86fe957bc065754e47f7b0840/rfc3986-2.0.0.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_rich_py3_none_any_6049d5e6": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "rich-13.9.4-py3-none-any.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "rich==13.9.4", + "sha256": "6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90", + "urls": [ + "https://files.pythonhosted.org/packages/19/71/39c7c0d87f8d4e6c020a393182060eaefeeae6c01dab6a84ec346f2567df/rich-13.9.4-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_rich_sdist_43959497": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "rich-13.9.4.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "rich==13.9.4", + "sha256": "439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098", + "urls": [ + "https://files.pythonhosted.org/packages/ab/3a/0316b28d0761c6734d6bc14e770d85506c986c85ffb239e688eeaab2c2bc/rich-13.9.4.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_secretstorage_py3_none_any_f356e662": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64" + ], + "filename": "SecretStorage-3.3.3-py3-none-any.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "secretstorage==3.3.3", + "sha256": "f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99", + "urls": [ + "https://files.pythonhosted.org/packages/54/24/b4293291fa1dd830f353d2cb163295742fa87f179fcc8a20a306a81978b7/SecretStorage-3.3.3-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_secretstorage_sdist_2403533e": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "SecretStorage-3.3.3.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "secretstorage==3.3.3", + "sha256": "2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77", + "urls": [ + "https://files.pythonhosted.org/packages/53/a4/f48c9d79cb507ed1373477dbceaba7401fd8a23af63b837fa61f1dcd3691/SecretStorage-3.3.3.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_twine_py3_none_any_215dbe7b": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "twine-5.1.1-py3-none-any.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "twine==5.1.1", + "sha256": "215dbe7b4b94c2c50a7315c0275d2258399280fbb7d04182c7e55e24b5f93997", + "urls": [ + "https://files.pythonhosted.org/packages/5d/ec/00f9d5fd040ae29867355e559a94e9a8429225a0284a3f5f091a3878bfc0/twine-5.1.1-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_twine_sdist_9aa08251": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "twine-5.1.1.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "twine==5.1.1", + "sha256": "9aa0825139c02b3434d913545c7b847a21c835e11597f5255842d457da2322db", + "urls": [ + "https://files.pythonhosted.org/packages/77/68/bd982e5e949ef8334e6f7dcf76ae40922a8750aa2e347291ae1477a4782b/twine-5.1.1.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_urllib3_py3_none_any_ca899ca0": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "urllib3-2.2.3-py3-none-any.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "urllib3==2.2.3", + "sha256": "ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", + "urls": [ + "https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_urllib3_sdist_e7d814a8": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "urllib3-2.2.3.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "urllib3==2.2.3", + "sha256": "e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9", + "urls": [ + "https://files.pythonhosted.org/packages/ed/63/22ba4ebfe7430b76388e7cd448d5478814d3032121827c12a2cc287e2260/urllib3-2.2.3.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_zipp_py3_none_any_a817ac80": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "zipp-3.20.2-py3-none-any.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "zipp==3.20.2", + "sha256": "a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350", + "urls": [ + "https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_zipp_sdist_bc9eb26f": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "zipp-3.20.2.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "zipp==3.20.2", + "sha256": "bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29", + "urls": [ + "https://files.pythonhosted.org/packages/54/bf/5c0000c44ebc80123ecbdddba1f5dcd94a5ada602a9c225d84b5aaa55e86/zipp-3.20.2.tar.gz" + ] + } + }, + "grpc_python_dependencies": { + "bzlFile": "@@rules_python~//python/private/pypi:hub_repository.bzl", + "ruleClassName": "hub_repository", + "attributes": { + "repo_name": "grpc_python_dependencies", + "extra_hub_aliases": {}, + "whl_map": { + "absl_py": "{\"grpc_python_dependencies_310_absl_py\":[{\"version\":\"3.10\"}],\"grpc_python_dependencies_311_absl_py\":[{\"version\":\"3.11\"}],\"grpc_python_dependencies_312_absl_py\":[{\"version\":\"3.12\"}],\"grpc_python_dependencies_313_absl_py\":[{\"version\":\"3.13\"}],\"grpc_python_dependencies_39_absl_py\":[{\"version\":\"3.9\"}]}", + "cachetools": "{\"grpc_python_dependencies_310_cachetools\":[{\"version\":\"3.10\"}],\"grpc_python_dependencies_311_cachetools\":[{\"version\":\"3.11\"}],\"grpc_python_dependencies_312_cachetools\":[{\"version\":\"3.12\"}],\"grpc_python_dependencies_313_cachetools\":[{\"version\":\"3.13\"}],\"grpc_python_dependencies_39_cachetools\":[{\"version\":\"3.9\"}]}", + "certifi": "{\"grpc_python_dependencies_310_certifi\":[{\"version\":\"3.10\"}],\"grpc_python_dependencies_311_certifi\":[{\"version\":\"3.11\"}],\"grpc_python_dependencies_312_certifi\":[{\"version\":\"3.12\"}],\"grpc_python_dependencies_313_certifi\":[{\"version\":\"3.13\"}],\"grpc_python_dependencies_39_certifi\":[{\"version\":\"3.9\"}]}", + "chardet": "{\"grpc_python_dependencies_310_chardet\":[{\"version\":\"3.10\"}],\"grpc_python_dependencies_311_chardet\":[{\"version\":\"3.11\"}],\"grpc_python_dependencies_312_chardet\":[{\"version\":\"3.12\"}],\"grpc_python_dependencies_313_chardet\":[{\"version\":\"3.13\"}],\"grpc_python_dependencies_39_chardet\":[{\"version\":\"3.9\"}]}", + "charset_normalizer": "{\"grpc_python_dependencies_310_charset_normalizer\":[{\"version\":\"3.10\"}],\"grpc_python_dependencies_311_charset_normalizer\":[{\"version\":\"3.11\"}],\"grpc_python_dependencies_312_charset_normalizer\":[{\"version\":\"3.12\"}],\"grpc_python_dependencies_313_charset_normalizer\":[{\"version\":\"3.13\"}],\"grpc_python_dependencies_39_charset_normalizer\":[{\"version\":\"3.9\"}]}", + "coverage": "{\"grpc_python_dependencies_310_coverage\":[{\"version\":\"3.10\"}],\"grpc_python_dependencies_311_coverage\":[{\"version\":\"3.11\"}],\"grpc_python_dependencies_312_coverage\":[{\"version\":\"3.12\"}],\"grpc_python_dependencies_313_coverage\":[{\"version\":\"3.13\"}],\"grpc_python_dependencies_39_coverage\":[{\"version\":\"3.9\"}]}", + "cython": "{\"grpc_python_dependencies_310_cython\":[{\"version\":\"3.10\"}],\"grpc_python_dependencies_311_cython\":[{\"version\":\"3.11\"}],\"grpc_python_dependencies_312_cython\":[{\"version\":\"3.12\"}],\"grpc_python_dependencies_313_cython\":[{\"version\":\"3.13\"}],\"grpc_python_dependencies_39_cython\":[{\"version\":\"3.9\"}]}", + "deprecated": "{\"grpc_python_dependencies_310_deprecated\":[{\"version\":\"3.10\"}],\"grpc_python_dependencies_311_deprecated\":[{\"version\":\"3.11\"}],\"grpc_python_dependencies_312_deprecated\":[{\"version\":\"3.12\"}],\"grpc_python_dependencies_313_deprecated\":[{\"version\":\"3.13\"}],\"grpc_python_dependencies_39_deprecated\":[{\"version\":\"3.9\"}]}", + "gevent": "{\"grpc_python_dependencies_310_gevent\":[{\"version\":\"3.10\"}],\"grpc_python_dependencies_311_gevent\":[{\"version\":\"3.11\"}],\"grpc_python_dependencies_312_gevent\":[{\"version\":\"3.12\"}],\"grpc_python_dependencies_313_gevent\":[{\"version\":\"3.13\"}],\"grpc_python_dependencies_39_gevent\":[{\"version\":\"3.9\"}]}", + "google_api_core": "{\"grpc_python_dependencies_310_google_api_core\":[{\"version\":\"3.10\"}],\"grpc_python_dependencies_311_google_api_core\":[{\"version\":\"3.11\"}],\"grpc_python_dependencies_312_google_api_core\":[{\"version\":\"3.12\"}],\"grpc_python_dependencies_313_google_api_core\":[{\"version\":\"3.13\"}],\"grpc_python_dependencies_39_google_api_core\":[{\"version\":\"3.9\"}]}", + "google_auth": "{\"grpc_python_dependencies_310_google_auth\":[{\"version\":\"3.10\"}],\"grpc_python_dependencies_311_google_auth\":[{\"version\":\"3.11\"}],\"grpc_python_dependencies_312_google_auth\":[{\"version\":\"3.12\"}],\"grpc_python_dependencies_313_google_auth\":[{\"version\":\"3.13\"}],\"grpc_python_dependencies_39_google_auth\":[{\"version\":\"3.9\"}]}", + "google_cloud_monitoring": "{\"grpc_python_dependencies_310_google_cloud_monitoring\":[{\"version\":\"3.10\"}],\"grpc_python_dependencies_311_google_cloud_monitoring\":[{\"version\":\"3.11\"}],\"grpc_python_dependencies_312_google_cloud_monitoring\":[{\"version\":\"3.12\"}],\"grpc_python_dependencies_313_google_cloud_monitoring\":[{\"version\":\"3.13\"}],\"grpc_python_dependencies_39_google_cloud_monitoring\":[{\"version\":\"3.9\"}]}", + "google_cloud_trace": "{\"grpc_python_dependencies_310_google_cloud_trace\":[{\"version\":\"3.10\"}],\"grpc_python_dependencies_311_google_cloud_trace\":[{\"version\":\"3.11\"}],\"grpc_python_dependencies_312_google_cloud_trace\":[{\"version\":\"3.12\"}],\"grpc_python_dependencies_313_google_cloud_trace\":[{\"version\":\"3.13\"}],\"grpc_python_dependencies_39_google_cloud_trace\":[{\"version\":\"3.9\"}]}", + "googleapis_common_protos": "{\"grpc_python_dependencies_310_googleapis_common_protos\":[{\"version\":\"3.10\"}],\"grpc_python_dependencies_311_googleapis_common_protos\":[{\"version\":\"3.11\"}],\"grpc_python_dependencies_312_googleapis_common_protos\":[{\"version\":\"3.12\"}],\"grpc_python_dependencies_313_googleapis_common_protos\":[{\"version\":\"3.13\"}],\"grpc_python_dependencies_39_googleapis_common_protos\":[{\"version\":\"3.9\"}]}", + "greenlet": "{\"grpc_python_dependencies_310_greenlet\":[{\"version\":\"3.10\"}],\"grpc_python_dependencies_311_greenlet\":[{\"version\":\"3.11\"}],\"grpc_python_dependencies_312_greenlet\":[{\"version\":\"3.12\"}],\"grpc_python_dependencies_313_greenlet\":[{\"version\":\"3.13\"}],\"grpc_python_dependencies_39_greenlet\":[{\"version\":\"3.9\"}]}", + "idna": "{\"grpc_python_dependencies_310_idna\":[{\"version\":\"3.10\"}],\"grpc_python_dependencies_311_idna\":[{\"version\":\"3.11\"}],\"grpc_python_dependencies_312_idna\":[{\"version\":\"3.12\"}],\"grpc_python_dependencies_313_idna\":[{\"version\":\"3.13\"}],\"grpc_python_dependencies_39_idna\":[{\"version\":\"3.9\"}]}", + "importlib_metadata": "{\"grpc_python_dependencies_310_importlib_metadata\":[{\"version\":\"3.10\"}],\"grpc_python_dependencies_311_importlib_metadata\":[{\"version\":\"3.11\"}],\"grpc_python_dependencies_312_importlib_metadata\":[{\"version\":\"3.12\"}],\"grpc_python_dependencies_313_importlib_metadata\":[{\"version\":\"3.13\"}],\"grpc_python_dependencies_39_importlib_metadata\":[{\"version\":\"3.9\"}]}", + "oauth2client": "{\"grpc_python_dependencies_310_oauth2client\":[{\"version\":\"3.10\"}],\"grpc_python_dependencies_311_oauth2client\":[{\"version\":\"3.11\"}],\"grpc_python_dependencies_312_oauth2client\":[{\"version\":\"3.12\"}],\"grpc_python_dependencies_313_oauth2client\":[{\"version\":\"3.13\"}],\"grpc_python_dependencies_39_oauth2client\":[{\"version\":\"3.9\"}]}", + "opencensus_context": "{\"grpc_python_dependencies_310_opencensus_context\":[{\"version\":\"3.10\"}],\"grpc_python_dependencies_311_opencensus_context\":[{\"version\":\"3.11\"}],\"grpc_python_dependencies_312_opencensus_context\":[{\"version\":\"3.12\"}],\"grpc_python_dependencies_313_opencensus_context\":[{\"version\":\"3.13\"}],\"grpc_python_dependencies_39_opencensus_context\":[{\"version\":\"3.9\"}]}", + "opentelemetry_api": "{\"grpc_python_dependencies_310_opentelemetry_api\":[{\"version\":\"3.10\"}],\"grpc_python_dependencies_311_opentelemetry_api\":[{\"version\":\"3.11\"}],\"grpc_python_dependencies_312_opentelemetry_api\":[{\"version\":\"3.12\"}],\"grpc_python_dependencies_313_opentelemetry_api\":[{\"version\":\"3.13\"}],\"grpc_python_dependencies_39_opentelemetry_api\":[{\"version\":\"3.9\"}]}", + "opentelemetry_exporter_prometheus": "{\"grpc_python_dependencies_310_opentelemetry_exporter_prometheus\":[{\"version\":\"3.10\"}],\"grpc_python_dependencies_311_opentelemetry_exporter_prometheus\":[{\"version\":\"3.11\"}],\"grpc_python_dependencies_312_opentelemetry_exporter_prometheus\":[{\"version\":\"3.12\"}],\"grpc_python_dependencies_313_opentelemetry_exporter_prometheus\":[{\"version\":\"3.13\"}],\"grpc_python_dependencies_39_opentelemetry_exporter_prometheus\":[{\"version\":\"3.9\"}]}", + "opentelemetry_resourcedetector_gcp": "{\"grpc_python_dependencies_310_opentelemetry_resourcedetector_gcp\":[{\"version\":\"3.10\"}],\"grpc_python_dependencies_311_opentelemetry_resourcedetector_gcp\":[{\"version\":\"3.11\"}],\"grpc_python_dependencies_312_opentelemetry_resourcedetector_gcp\":[{\"version\":\"3.12\"}],\"grpc_python_dependencies_313_opentelemetry_resourcedetector_gcp\":[{\"version\":\"3.13\"}],\"grpc_python_dependencies_39_opentelemetry_resourcedetector_gcp\":[{\"version\":\"3.9\"}]}", + "opentelemetry_sdk": "{\"grpc_python_dependencies_310_opentelemetry_sdk\":[{\"version\":\"3.10\"}],\"grpc_python_dependencies_311_opentelemetry_sdk\":[{\"version\":\"3.11\"}],\"grpc_python_dependencies_312_opentelemetry_sdk\":[{\"version\":\"3.12\"}],\"grpc_python_dependencies_313_opentelemetry_sdk\":[{\"version\":\"3.13\"}],\"grpc_python_dependencies_39_opentelemetry_sdk\":[{\"version\":\"3.9\"}]}", + "opentelemetry_semantic_conventions": "{\"grpc_python_dependencies_310_opentelemetry_semantic_conventions\":[{\"version\":\"3.10\"}],\"grpc_python_dependencies_311_opentelemetry_semantic_conventions\":[{\"version\":\"3.11\"}],\"grpc_python_dependencies_312_opentelemetry_semantic_conventions\":[{\"version\":\"3.12\"}],\"grpc_python_dependencies_313_opentelemetry_semantic_conventions\":[{\"version\":\"3.13\"}],\"grpc_python_dependencies_39_opentelemetry_semantic_conventions\":[{\"version\":\"3.9\"}]}", + "prometheus_client": "{\"grpc_python_dependencies_310_prometheus_client\":[{\"version\":\"3.10\"}],\"grpc_python_dependencies_311_prometheus_client\":[{\"version\":\"3.11\"}],\"grpc_python_dependencies_312_prometheus_client\":[{\"version\":\"3.12\"}],\"grpc_python_dependencies_313_prometheus_client\":[{\"version\":\"3.13\"}],\"grpc_python_dependencies_39_prometheus_client\":[{\"version\":\"3.9\"}]}", + "proto_plus": "{\"grpc_python_dependencies_310_proto_plus\":[{\"version\":\"3.10\"}],\"grpc_python_dependencies_311_proto_plus\":[{\"version\":\"3.11\"}],\"grpc_python_dependencies_312_proto_plus\":[{\"version\":\"3.12\"}],\"grpc_python_dependencies_313_proto_plus\":[{\"version\":\"3.13\"}],\"grpc_python_dependencies_39_proto_plus\":[{\"version\":\"3.9\"}]}", + "protobuf": "{\"grpc_python_dependencies_310_protobuf\":[{\"version\":\"3.10\"}],\"grpc_python_dependencies_311_protobuf\":[{\"version\":\"3.11\"}],\"grpc_python_dependencies_312_protobuf\":[{\"version\":\"3.12\"}],\"grpc_python_dependencies_313_protobuf\":[{\"version\":\"3.13\"}],\"grpc_python_dependencies_39_protobuf\":[{\"version\":\"3.9\"}]}", + "pyasn1": "{\"grpc_python_dependencies_310_pyasn1\":[{\"version\":\"3.10\"}],\"grpc_python_dependencies_311_pyasn1\":[{\"version\":\"3.11\"}],\"grpc_python_dependencies_312_pyasn1\":[{\"version\":\"3.12\"}],\"grpc_python_dependencies_313_pyasn1\":[{\"version\":\"3.13\"}],\"grpc_python_dependencies_39_pyasn1\":[{\"version\":\"3.9\"}]}", + "pyasn1_modules": "{\"grpc_python_dependencies_310_pyasn1_modules\":[{\"version\":\"3.10\"}],\"grpc_python_dependencies_311_pyasn1_modules\":[{\"version\":\"3.11\"}],\"grpc_python_dependencies_312_pyasn1_modules\":[{\"version\":\"3.12\"}],\"grpc_python_dependencies_313_pyasn1_modules\":[{\"version\":\"3.13\"}],\"grpc_python_dependencies_39_pyasn1_modules\":[{\"version\":\"3.9\"}]}", + "requests": "{\"grpc_python_dependencies_310_requests\":[{\"version\":\"3.10\"}],\"grpc_python_dependencies_311_requests\":[{\"version\":\"3.11\"}],\"grpc_python_dependencies_312_requests\":[{\"version\":\"3.12\"}],\"grpc_python_dependencies_313_requests\":[{\"version\":\"3.13\"}],\"grpc_python_dependencies_39_requests\":[{\"version\":\"3.9\"}]}", + "rsa": "{\"grpc_python_dependencies_310_rsa\":[{\"version\":\"3.10\"}],\"grpc_python_dependencies_311_rsa\":[{\"version\":\"3.11\"}],\"grpc_python_dependencies_312_rsa\":[{\"version\":\"3.12\"}],\"grpc_python_dependencies_313_rsa\":[{\"version\":\"3.13\"}],\"grpc_python_dependencies_39_rsa\":[{\"version\":\"3.9\"}]}", + "setuptools": "{\"grpc_python_dependencies_310_setuptools\":[{\"version\":\"3.10\"}],\"grpc_python_dependencies_311_setuptools\":[{\"version\":\"3.11\"}],\"grpc_python_dependencies_312_setuptools\":[{\"version\":\"3.12\"}],\"grpc_python_dependencies_313_setuptools\":[{\"version\":\"3.13\"}],\"grpc_python_dependencies_39_setuptools\":[{\"version\":\"3.9\"}]}", + "typing_extensions": "{\"grpc_python_dependencies_310_typing_extensions\":[{\"version\":\"3.10\"}],\"grpc_python_dependencies_311_typing_extensions\":[{\"version\":\"3.11\"}],\"grpc_python_dependencies_312_typing_extensions\":[{\"version\":\"3.12\"}],\"grpc_python_dependencies_313_typing_extensions\":[{\"version\":\"3.13\"}],\"grpc_python_dependencies_39_typing_extensions\":[{\"version\":\"3.9\"}]}", + "urllib3": "{\"grpc_python_dependencies_310_urllib3\":[{\"version\":\"3.10\"}],\"grpc_python_dependencies_311_urllib3\":[{\"version\":\"3.11\"}],\"grpc_python_dependencies_312_urllib3\":[{\"version\":\"3.12\"}],\"grpc_python_dependencies_313_urllib3\":[{\"version\":\"3.13\"}],\"grpc_python_dependencies_39_urllib3\":[{\"version\":\"3.9\"}]}", + "wheel": "{\"grpc_python_dependencies_310_wheel\":[{\"version\":\"3.10\"}],\"grpc_python_dependencies_311_wheel\":[{\"version\":\"3.11\"}],\"grpc_python_dependencies_312_wheel\":[{\"version\":\"3.12\"}],\"grpc_python_dependencies_313_wheel\":[{\"version\":\"3.13\"}],\"grpc_python_dependencies_39_wheel\":[{\"version\":\"3.9\"}]}", + "wrapt": "{\"grpc_python_dependencies_310_wrapt\":[{\"version\":\"3.10\"}],\"grpc_python_dependencies_311_wrapt\":[{\"version\":\"3.11\"}],\"grpc_python_dependencies_312_wrapt\":[{\"version\":\"3.12\"}],\"grpc_python_dependencies_313_wrapt\":[{\"version\":\"3.13\"}],\"grpc_python_dependencies_39_wrapt\":[{\"version\":\"3.9\"}]}", + "zipp": "{\"grpc_python_dependencies_310_zipp\":[{\"version\":\"3.10\"}],\"grpc_python_dependencies_311_zipp\":[{\"version\":\"3.11\"}],\"grpc_python_dependencies_312_zipp\":[{\"version\":\"3.12\"}],\"grpc_python_dependencies_313_zipp\":[{\"version\":\"3.13\"}],\"grpc_python_dependencies_39_zipp\":[{\"version\":\"3.9\"}]}", + "zope_event": "{\"grpc_python_dependencies_310_zope_event\":[{\"version\":\"3.10\"}],\"grpc_python_dependencies_311_zope_event\":[{\"version\":\"3.11\"}],\"grpc_python_dependencies_312_zope_event\":[{\"version\":\"3.12\"}],\"grpc_python_dependencies_313_zope_event\":[{\"version\":\"3.13\"}],\"grpc_python_dependencies_39_zope_event\":[{\"version\":\"3.9\"}]}", + "zope_interface": "{\"grpc_python_dependencies_310_zope_interface\":[{\"version\":\"3.10\"}],\"grpc_python_dependencies_311_zope_interface\":[{\"version\":\"3.11\"}],\"grpc_python_dependencies_312_zope_interface\":[{\"version\":\"3.12\"}],\"grpc_python_dependencies_313_zope_interface\":[{\"version\":\"3.13\"}],\"grpc_python_dependencies_39_zope_interface\":[{\"version\":\"3.9\"}]}" + }, + "packages": [ + "absl_py", + "cachetools", + "certifi", + "chardet", + "charset_normalizer", + "coverage", + "cython", + "deprecated", + "gevent", + "google_api_core", + "google_auth", + "google_cloud_monitoring", + "google_cloud_trace", + "googleapis_common_protos", + "greenlet", + "idna", + "importlib_metadata", + "oauth2client", + "opencensus_context", + "opentelemetry_api", + "opentelemetry_exporter_prometheus", + "opentelemetry_resourcedetector_gcp", + "opentelemetry_sdk", + "opentelemetry_semantic_conventions", + "prometheus_client", + "proto_plus", + "protobuf", + "pyasn1", + "pyasn1_modules", + "requests", + "rsa", + "setuptools", + "typing_extensions", + "urllib3", + "wheel", + "wrapt", + "zipp", + "zope_event", + "zope_interface" + ], + "groups": {} + } + }, + "pgv_pip_deps": { + "bzlFile": "@@rules_python~//python/private/pypi:hub_repository.bzl", + "ruleClassName": "hub_repository", + "attributes": { + "repo_name": "pgv_pip_deps", + "extra_hub_aliases": {}, + "whl_map": { + "astunparse": "{\"pgv_pip_deps_310_astunparse\":[{\"version\":\"3.10\"}],\"pgv_pip_deps_311_astunparse\":[{\"version\":\"3.11\"}],\"pgv_pip_deps_312_astunparse\":[{\"version\":\"3.12\"}],\"pgv_pip_deps_313_astunparse\":[{\"version\":\"3.13\"}],\"pgv_pip_deps_39_astunparse\":[{\"version\":\"3.9\"}]}", + "jinja2": "{\"pgv_pip_deps_310_jinja2\":[{\"version\":\"3.10\"}],\"pgv_pip_deps_311_jinja2\":[{\"version\":\"3.11\"}],\"pgv_pip_deps_312_jinja2\":[{\"version\":\"3.12\"}],\"pgv_pip_deps_313_jinja2\":[{\"version\":\"3.13\"}],\"pgv_pip_deps_39_jinja2\":[{\"version\":\"3.9\"}]}", + "markupsafe": "{\"pgv_pip_deps_310_markupsafe\":[{\"version\":\"3.10\"}],\"pgv_pip_deps_311_markupsafe\":[{\"version\":\"3.11\"}],\"pgv_pip_deps_312_markupsafe\":[{\"version\":\"3.12\"}],\"pgv_pip_deps_313_markupsafe\":[{\"version\":\"3.13\"}],\"pgv_pip_deps_39_markupsafe\":[{\"version\":\"3.9\"}]}", + "protobuf": "{\"pgv_pip_deps_310_protobuf\":[{\"version\":\"3.10\"}],\"pgv_pip_deps_311_protobuf\":[{\"version\":\"3.11\"}],\"pgv_pip_deps_312_protobuf\":[{\"version\":\"3.12\"}],\"pgv_pip_deps_313_protobuf\":[{\"version\":\"3.13\"}],\"pgv_pip_deps_39_protobuf\":[{\"version\":\"3.9\"}]}", + "six": "{\"pgv_pip_deps_310_six\":[{\"version\":\"3.10\"}],\"pgv_pip_deps_311_six\":[{\"version\":\"3.11\"}],\"pgv_pip_deps_312_six\":[{\"version\":\"3.12\"}],\"pgv_pip_deps_313_six\":[{\"version\":\"3.13\"}],\"pgv_pip_deps_39_six\":[{\"version\":\"3.9\"}]}", + "validate_email": "{\"pgv_pip_deps_310_validate_email\":[{\"version\":\"3.10\"}],\"pgv_pip_deps_311_validate_email\":[{\"version\":\"3.11\"}],\"pgv_pip_deps_312_validate_email\":[{\"version\":\"3.12\"}],\"pgv_pip_deps_313_validate_email\":[{\"version\":\"3.13\"}],\"pgv_pip_deps_39_validate_email\":[{\"version\":\"3.9\"}]}", + "wheel": "{\"pgv_pip_deps_310_wheel\":[{\"version\":\"3.10\"}],\"pgv_pip_deps_311_wheel\":[{\"version\":\"3.11\"}],\"pgv_pip_deps_312_wheel\":[{\"version\":\"3.12\"}],\"pgv_pip_deps_313_wheel\":[{\"version\":\"3.13\"}],\"pgv_pip_deps_39_wheel\":[{\"version\":\"3.9\"}]}" + }, + "packages": [ + "astunparse", + "jinja2", + "markupsafe", + "protobuf", + "six", + "validate_email", + "wheel" + ], + "groups": {} + } + }, + "pip_deps": { + "bzlFile": "@@rules_python~//python/private/pypi:hub_repository.bzl", + "ruleClassName": "hub_repository", + "attributes": { + "repo_name": "pip_deps", + "extra_hub_aliases": {}, + "whl_map": { + "numpy": "{\"pip_deps_310_numpy\":[{\"version\":\"3.10\"}],\"pip_deps_311_numpy\":[{\"version\":\"3.11\"}],\"pip_deps_312_numpy\":[{\"version\":\"3.12\"}],\"pip_deps_38_numpy\":[{\"version\":\"3.8\"}],\"pip_deps_39_numpy\":[{\"version\":\"3.9\"}]}", + "setuptools": "{\"pip_deps_310_setuptools\":[{\"version\":\"3.10\"}],\"pip_deps_311_setuptools\":[{\"version\":\"3.11\"}],\"pip_deps_312_setuptools\":[{\"version\":\"3.12\"}],\"pip_deps_38_setuptools\":[{\"version\":\"3.8\"}],\"pip_deps_39_setuptools\":[{\"version\":\"3.9\"}]}" + }, + "packages": [ + "numpy", + "setuptools" + ], + "groups": {} + } + }, + "py3_mpkhs_aws_privatekey_synthetic_deps": { + "bzlFile": "@@rules_python~//python/private/pypi:hub_repository.bzl", + "ruleClassName": "hub_repository", + "attributes": { + "repo_name": "py3_mpkhs_aws_privatekey_synthetic_deps", + "extra_hub_aliases": {}, + "whl_map": { + "aws_requests_auth": "{\"py3_mpkhs_aws_privatekey_synthetic_deps_38_aws_requests_auth\":[{\"version\":\"3.8\"}]}", + "awscrt": "{\"py3_mpkhs_aws_privatekey_synthetic_deps_38_awscrt\":[{\"version\":\"3.8\"}]}", + "certifi": "{\"py3_mpkhs_aws_privatekey_synthetic_deps_38_certifi\":[{\"version\":\"3.8\"}]}", + "charset_normalizer": "{\"py3_mpkhs_aws_privatekey_synthetic_deps_38_charset_normalizer\":[{\"version\":\"3.8\"}]}", + "h2": "{\"py3_mpkhs_aws_privatekey_synthetic_deps_38_h2\":[{\"version\":\"3.8\"}]}", + "hpack": "{\"py3_mpkhs_aws_privatekey_synthetic_deps_38_hpack\":[{\"version\":\"3.8\"}]}", + "hyper": "{\"py3_mpkhs_aws_privatekey_synthetic_deps_38_hyper\":[{\"version\":\"3.8\"}]}", + "hyperframe": "{\"py3_mpkhs_aws_privatekey_synthetic_deps_38_hyperframe\":[{\"version\":\"3.8\"}]}", + "idna": "{\"py3_mpkhs_aws_privatekey_synthetic_deps_38_idna\":[{\"version\":\"3.8\"}]}", + "requests": "{\"py3_mpkhs_aws_privatekey_synthetic_deps_38_requests\":[{\"version\":\"3.8\"}]}", + "urllib3": "{\"py3_mpkhs_aws_privatekey_synthetic_deps_38_urllib3\":[{\"version\":\"3.8\"}]}" + }, + "packages": [ + "aws_requests_auth", + "awscrt", + "certifi", + "charset_normalizer", + "h2", + "hpack", + "hyper", + "hyperframe", + "idna", + "requests", + "urllib3" + ], + "groups": {} + } + }, + "py3_privacybudget_aws_pbs_auth_handler_deps": { + "bzlFile": "@@rules_python~//python/private/pypi:hub_repository.bzl", + "ruleClassName": "hub_repository", + "attributes": { + "repo_name": "py3_privacybudget_aws_pbs_auth_handler_deps", + "extra_hub_aliases": {}, + "whl_map": { + "publicsuffixlist": "{\"py3_privacybudget_aws_pbs_auth_handler_deps_38_publicsuffixlist\":[{\"version\":\"3.8\"}]}" + }, + "packages": [ + "publicsuffixlist" + ], + "groups": {} + } + }, + "py3_privacybudget_aws_pbs_identities_migration_deps": { + "bzlFile": "@@rules_python~//python/private/pypi:hub_repository.bzl", + "ruleClassName": "hub_repository", + "attributes": { + "repo_name": "py3_privacybudget_aws_pbs_identities_migration_deps", + "extra_hub_aliases": {}, + "whl_map": { + "publicsuffixlist": "{\"py3_privacybudget_aws_pbs_identities_migration_deps_38_publicsuffixlist\":[{\"version\":\"3.8\"}]}" + }, + "packages": [ + "publicsuffixlist" + ], + "groups": {} + } + }, + "py3_privacybudget_aws_pbs_synthetic_deps": { + "bzlFile": "@@rules_python~//python/private/pypi:hub_repository.bzl", + "ruleClassName": "hub_repository", + "attributes": { + "repo_name": "py3_privacybudget_aws_pbs_synthetic_deps", + "extra_hub_aliases": {}, + "whl_map": { + "aws_requests_auth": "{\"py3_privacybudget_aws_pbs_synthetic_deps_38_aws_requests_auth\":[{\"version\":\"3.8\"}]}", + "awscrt": "{\"py3_privacybudget_aws_pbs_synthetic_deps_38_awscrt\":[{\"version\":\"3.8\"}]}", + "certifi": "{\"py3_privacybudget_aws_pbs_synthetic_deps_38_certifi\":[{\"version\":\"3.8\"}]}", + "charset_normalizer": "{\"py3_privacybudget_aws_pbs_synthetic_deps_38_charset_normalizer\":[{\"version\":\"3.8\"}]}", + "h2": "{\"py3_privacybudget_aws_pbs_synthetic_deps_38_h2\":[{\"version\":\"3.8\"}]}", + "hpack": "{\"py3_privacybudget_aws_pbs_synthetic_deps_38_hpack\":[{\"version\":\"3.8\"}]}", + "hyper": "{\"py3_privacybudget_aws_pbs_synthetic_deps_38_hyper\":[{\"version\":\"3.8\"}]}", + "hyperframe": "{\"py3_privacybudget_aws_pbs_synthetic_deps_38_hyperframe\":[{\"version\":\"3.8\"}]}", + "idna": "{\"py3_privacybudget_aws_pbs_synthetic_deps_38_idna\":[{\"version\":\"3.8\"}]}", + "requests": "{\"py3_privacybudget_aws_pbs_synthetic_deps_38_requests\":[{\"version\":\"3.8\"}]}", + "urllib3": "{\"py3_privacybudget_aws_pbs_synthetic_deps_38_urllib3\":[{\"version\":\"3.8\"}]}" + }, + "packages": [ + "aws_requests_auth", + "awscrt", + "certifi", + "charset_normalizer", + "h2", + "hpack", + "hyper", + "hyperframe", + "idna", + "requests", + "urllib3" + ], + "groups": {} + } + }, + "py3_privacybudget_gcp_operator_onboarding_deps": { + "bzlFile": "@@rules_python~//python/private/pypi:hub_repository.bzl", + "ruleClassName": "hub_repository", + "attributes": { + "repo_name": "py3_privacybudget_gcp_operator_onboarding_deps", + "extra_hub_aliases": {}, + "whl_map": { + "google_cloud_spanner": "{\"py3_privacybudget_gcp_operator_onboarding_deps_38_google_cloud_spanner\":[{\"version\":\"3.8\"}]}", + "google_cloud_storage": "{\"py3_privacybudget_gcp_operator_onboarding_deps_38_google_cloud_storage\":[{\"version\":\"3.8\"}]}", + "numpy": "{\"py3_privacybudget_gcp_operator_onboarding_deps_38_numpy\":[{\"version\":\"3.8\"}]}", + "pandas": "{\"py3_privacybudget_gcp_operator_onboarding_deps_38_pandas\":[{\"version\":\"3.8\"}]}", + "python_dateutil": "{\"py3_privacybudget_gcp_operator_onboarding_deps_38_python_dateutil\":[{\"version\":\"3.8\"}]}", + "pytz": "{\"py3_privacybudget_gcp_operator_onboarding_deps_38_pytz\":[{\"version\":\"3.8\"}]}", + "six": "{\"py3_privacybudget_gcp_operator_onboarding_deps_38_six\":[{\"version\":\"3.8\"}]}" + }, + "packages": [ + "google_cloud_spanner", + "google_cloud_storage", + "numpy", + "pandas", + "python_dateutil", + "pytz", + "six" + ], + "groups": {} + } + }, + "py3_privacybudget_gcp_pbs_auth_handler_test_deps": { + "bzlFile": "@@rules_python~//python/private/pypi:hub_repository.bzl", + "ruleClassName": "hub_repository", + "attributes": { + "repo_name": "py3_privacybudget_gcp_pbs_auth_handler_test_deps", + "extra_hub_aliases": {}, + "whl_map": { + "cachetools": "{\"py3_privacybudget_gcp_pbs_auth_handler_test_deps_38_cachetools\":[{\"version\":\"3.8\"}]}", + "certifi": "{\"py3_privacybudget_gcp_pbs_auth_handler_test_deps_38_certifi\":[{\"version\":\"3.8\"}]}", + "charset_normalizer": "{\"py3_privacybudget_gcp_pbs_auth_handler_test_deps_38_charset_normalizer\":[{\"version\":\"3.8\"}]}", + "google_api_core": "{\"py3_privacybudget_gcp_pbs_auth_handler_test_deps_38_google_api_core\":[{\"version\":\"3.8\"}]}", + "google_auth": "{\"py3_privacybudget_gcp_pbs_auth_handler_test_deps_38_google_auth\":[{\"version\":\"3.8\"}]}", + "googleapis_common_protos": "{\"py3_privacybudget_gcp_pbs_auth_handler_test_deps_38_googleapis_common_protos\":[{\"version\":\"3.8\"}]}", + "idna": "{\"py3_privacybudget_gcp_pbs_auth_handler_test_deps_38_idna\":[{\"version\":\"3.8\"}]}", + "proto_plus": "{\"py3_privacybudget_gcp_pbs_auth_handler_test_deps_38_proto_plus\":[{\"version\":\"3.8\"}]}", + "protobuf": "{\"py3_privacybudget_gcp_pbs_auth_handler_test_deps_38_protobuf\":[{\"version\":\"3.8\"}]}", + "publicsuffixlist": "{\"py3_privacybudget_gcp_pbs_auth_handler_test_deps_38_publicsuffixlist\":[{\"version\":\"3.8\"}]}", + "pyasn1": "{\"py3_privacybudget_gcp_pbs_auth_handler_test_deps_38_pyasn1\":[{\"version\":\"3.8\"}]}", + "pyasn1_modules": "{\"py3_privacybudget_gcp_pbs_auth_handler_test_deps_38_pyasn1_modules\":[{\"version\":\"3.8\"}]}", + "requests": "{\"py3_privacybudget_gcp_pbs_auth_handler_test_deps_38_requests\":[{\"version\":\"3.8\"}]}", + "rsa": "{\"py3_privacybudget_gcp_pbs_auth_handler_test_deps_38_rsa\":[{\"version\":\"3.8\"}]}", + "urllib3": "{\"py3_privacybudget_gcp_pbs_auth_handler_test_deps_38_urllib3\":[{\"version\":\"3.8\"}]}" + }, + "packages": [ + "cachetools", + "certifi", + "charset_normalizer", + "google_api_core", + "google_auth", + "googleapis_common_protos", + "idna", + "proto_plus", + "protobuf", + "publicsuffixlist", + "pyasn1", + "pyasn1_modules", + "requests", + "rsa", + "urllib3" + ], + "groups": {} + } + }, + "rules_fuzzing_py_deps": { + "bzlFile": "@@rules_python~//python/private/pypi:hub_repository.bzl", + "ruleClassName": "hub_repository", + "attributes": { + "repo_name": "rules_fuzzing_py_deps", + "extra_hub_aliases": {}, + "whl_map": { + "absl_py": "{\"rules_fuzzing_py_deps_310_absl_py\":[{\"version\":\"3.10\"}],\"rules_fuzzing_py_deps_311_absl_py\":[{\"version\":\"3.11\"}],\"rules_fuzzing_py_deps_312_absl_py\":[{\"version\":\"3.12\"}],\"rules_fuzzing_py_deps_38_absl_py\":[{\"version\":\"3.8\"}],\"rules_fuzzing_py_deps_39_absl_py\":[{\"version\":\"3.9\"}]}", + "six": "{\"rules_fuzzing_py_deps_310_six\":[{\"version\":\"3.10\"}],\"rules_fuzzing_py_deps_311_six\":[{\"version\":\"3.11\"}],\"rules_fuzzing_py_deps_312_six\":[{\"version\":\"3.12\"}],\"rules_fuzzing_py_deps_38_six\":[{\"version\":\"3.8\"}],\"rules_fuzzing_py_deps_39_six\":[{\"version\":\"3.9\"}]}" + }, + "packages": [ + "absl_py", + "six" + ], + "groups": {} + } + }, + "rules_python_publish_deps": { + "bzlFile": "@@rules_python~//python/private/pypi:hub_repository.bzl", + "ruleClassName": "hub_repository", + "attributes": { + "repo_name": "rules_python_publish_deps", + "extra_hub_aliases": {}, + "whl_map": { + "backports_tarfile": "{\"rules_python_publish_deps_311_backports_tarfile_py3_none_any_77e284d7\":[{\"filename\":\"backports.tarfile-1.2.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_backports_tarfile_sdist_d75e02c2\":[{\"filename\":\"backports_tarfile-1.2.0.tar.gz\",\"version\":\"3.11\"}]}", + "certifi": "{\"rules_python_publish_deps_311_certifi_py3_none_any_922820b5\":[{\"filename\":\"certifi-2024.8.30-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_certifi_sdist_bec941d2\":[{\"filename\":\"certifi-2024.8.30.tar.gz\",\"version\":\"3.11\"}]}", + "cffi": "{\"rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_aarch64_a1ed2dd2\":[{\"filename\":\"cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_ppc64le_46bf4316\":[{\"filename\":\"cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_s390x_a24ed04c\":[{\"filename\":\"cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_x86_64_610faea7\":[{\"filename\":\"cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_cffi_cp311_cp311_musllinux_1_1_aarch64_a9b15d49\":[{\"filename\":\"cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_cffi_cp311_cp311_musllinux_1_1_x86_64_fc48c783\":[{\"filename\":\"cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_cffi_sdist_1c39c601\":[{\"filename\":\"cffi-1.17.1.tar.gz\",\"version\":\"3.11\"}]}", + "charset_normalizer": "{\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_10_9_universal2_0d99dd8f\":[{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_10_9_x86_64_c57516e5\":[{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_11_0_arm64_6dba5d19\":[{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_aarch64_bf4475b8\":[{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_ppc64le_ce031db0\":[{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_s390x_8ff4e7cd\":[{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_x86_64_3710a975\":[{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_aarch64_47334db7\":[{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_ppc64le_f1a2f519\":[{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_s390x_63bc5c4a\":[{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_x86_64_bcb4f8ea\":[{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_win_amd64_cee4373f\":[{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_charset_normalizer_py3_none_any_fe9f97fe\":[{\"filename\":\"charset_normalizer-3.4.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_charset_normalizer_sdist_223217c3\":[{\"filename\":\"charset_normalizer-3.4.0.tar.gz\",\"version\":\"3.11\"}]}", + "cryptography": "{\"rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_17_aarch64_846da004\":[{\"filename\":\"cryptography-43.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_17_x86_64_0f996e72\":[{\"filename\":\"cryptography-43.0.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_28_aarch64_f7b178f1\":[{\"filename\":\"cryptography-43.0.3-cp39-abi3-manylinux_2_28_aarch64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_28_x86_64_c2e6fc39\":[{\"filename\":\"cryptography-43.0.3-cp39-abi3-manylinux_2_28_x86_64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_cryptography_cp39_abi3_musllinux_1_2_aarch64_e1be4655\":[{\"filename\":\"cryptography-43.0.3-cp39-abi3-musllinux_1_2_aarch64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_cryptography_cp39_abi3_musllinux_1_2_x86_64_df6b6c6d\":[{\"filename\":\"cryptography-43.0.3-cp39-abi3-musllinux_1_2_x86_64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_cryptography_sdist_315b9001\":[{\"filename\":\"cryptography-43.0.3.tar.gz\",\"version\":\"3.11\"}]}", + "docutils": "{\"rules_python_publish_deps_311_docutils_py3_none_any_dafca5b9\":[{\"filename\":\"docutils-0.21.2-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_docutils_sdist_3a6b1873\":[{\"filename\":\"docutils-0.21.2.tar.gz\",\"version\":\"3.11\"}]}", + "idna": "{\"rules_python_publish_deps_311_idna_py3_none_any_946d195a\":[{\"filename\":\"idna-3.10-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_idna_sdist_12f65c9b\":[{\"filename\":\"idna-3.10.tar.gz\",\"version\":\"3.11\"}]}", + "importlib_metadata": "{\"rules_python_publish_deps_311_importlib_metadata_py3_none_any_45e54197\":[{\"filename\":\"importlib_metadata-8.5.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_importlib_metadata_sdist_71522656\":[{\"filename\":\"importlib_metadata-8.5.0.tar.gz\",\"version\":\"3.11\"}]}", + "jaraco_classes": "{\"rules_python_publish_deps_311_jaraco_classes_py3_none_any_f662826b\":[{\"filename\":\"jaraco.classes-3.4.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_jaraco_classes_sdist_47a024b5\":[{\"filename\":\"jaraco.classes-3.4.0.tar.gz\",\"version\":\"3.11\"}]}", + "jaraco_context": "{\"rules_python_publish_deps_311_jaraco_context_py3_none_any_f797fc48\":[{\"filename\":\"jaraco.context-6.0.1-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_jaraco_context_sdist_9bae4ea5\":[{\"filename\":\"jaraco_context-6.0.1.tar.gz\",\"version\":\"3.11\"}]}", + "jaraco_functools": "{\"rules_python_publish_deps_311_jaraco_functools_py3_none_any_ad159f13\":[{\"filename\":\"jaraco.functools-4.1.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_jaraco_functools_sdist_70f7e0e2\":[{\"filename\":\"jaraco_functools-4.1.0.tar.gz\",\"version\":\"3.11\"}]}", + "jeepney": "{\"rules_python_publish_deps_311_jeepney_py3_none_any_c0a454ad\":[{\"filename\":\"jeepney-0.8.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_jeepney_sdist_5efe48d2\":[{\"filename\":\"jeepney-0.8.0.tar.gz\",\"version\":\"3.11\"}]}", + "keyring": "{\"rules_python_publish_deps_311_keyring_py3_none_any_5426f817\":[{\"filename\":\"keyring-25.4.1-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_keyring_sdist_b07ebc55\":[{\"filename\":\"keyring-25.4.1.tar.gz\",\"version\":\"3.11\"}]}", + "markdown_it_py": "{\"rules_python_publish_deps_311_markdown_it_py_py3_none_any_35521684\":[{\"filename\":\"markdown_it_py-3.0.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_markdown_it_py_sdist_e3f60a94\":[{\"filename\":\"markdown-it-py-3.0.0.tar.gz\",\"version\":\"3.11\"}]}", + "mdurl": "{\"rules_python_publish_deps_311_mdurl_py3_none_any_84008a41\":[{\"filename\":\"mdurl-0.1.2-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_mdurl_sdist_bb413d29\":[{\"filename\":\"mdurl-0.1.2.tar.gz\",\"version\":\"3.11\"}]}", + "more_itertools": "{\"rules_python_publish_deps_311_more_itertools_py3_none_any_037b0d32\":[{\"filename\":\"more_itertools-10.5.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_more_itertools_sdist_5482bfef\":[{\"filename\":\"more-itertools-10.5.0.tar.gz\",\"version\":\"3.11\"}]}", + "nh3": "{\"rules_python_publish_deps_311_nh3_cp37_abi3_macosx_10_12_x86_64_14c5a72e\":[{\"filename\":\"nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_nh3_cp37_abi3_macosx_10_12_x86_64_7b7c2a3c\":[{\"filename\":\"nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_aarch64_42c64511\":[{\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_armv7l_0411beb0\":[{\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_ppc64_5f36b271\":[{\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_ppc64le_34c03fa7\":[{\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_s390x_19aaba96\":[{\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_x86_64_de3ceed6\":[{\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_nh3_cp37_abi3_musllinux_1_2_aarch64_f0eca9ca\":[{\"filename\":\"nh3-0.2.18-cp37-abi3-musllinux_1_2_aarch64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_nh3_cp37_abi3_musllinux_1_2_armv7l_3a157ab1\":[{\"filename\":\"nh3-0.2.18-cp37-abi3-musllinux_1_2_armv7l.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_nh3_cp37_abi3_musllinux_1_2_x86_64_36c95d4b\":[{\"filename\":\"nh3-0.2.18-cp37-abi3-musllinux_1_2_x86_64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_nh3_cp37_abi3_win_amd64_8ce0f819\":[{\"filename\":\"nh3-0.2.18-cp37-abi3-win_amd64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_nh3_sdist_94a16692\":[{\"filename\":\"nh3-0.2.18.tar.gz\",\"version\":\"3.11\"}]}", + "pkginfo": "{\"rules_python_publish_deps_311_pkginfo_py3_none_any_889a6da2\":[{\"filename\":\"pkginfo-1.10.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_pkginfo_sdist_5df73835\":[{\"filename\":\"pkginfo-1.10.0.tar.gz\",\"version\":\"3.11\"}]}", + "pycparser": "{\"rules_python_publish_deps_311_pycparser_py3_none_any_c3702b6d\":[{\"filename\":\"pycparser-2.22-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_pycparser_sdist_491c8be9\":[{\"filename\":\"pycparser-2.22.tar.gz\",\"version\":\"3.11\"}]}", + "pygments": "{\"rules_python_publish_deps_311_pygments_py3_none_any_b8e6aca0\":[{\"filename\":\"pygments-2.18.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_pygments_sdist_786ff802\":[{\"filename\":\"pygments-2.18.0.tar.gz\",\"version\":\"3.11\"}]}", + "pywin32_ctypes": "{\"rules_python_publish_deps_311_pywin32_ctypes_py3_none_any_8a151337\":[{\"filename\":\"pywin32_ctypes-0.2.3-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_pywin32_ctypes_sdist_d162dc04\":[{\"filename\":\"pywin32-ctypes-0.2.3.tar.gz\",\"version\":\"3.11\"}]}", + "readme_renderer": "{\"rules_python_publish_deps_311_readme_renderer_py3_none_any_2fbca89b\":[{\"filename\":\"readme_renderer-44.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_readme_renderer_sdist_8712034e\":[{\"filename\":\"readme_renderer-44.0.tar.gz\",\"version\":\"3.11\"}]}", + "requests": "{\"rules_python_publish_deps_311_requests_py3_none_any_70761cfe\":[{\"filename\":\"requests-2.32.3-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_requests_sdist_55365417\":[{\"filename\":\"requests-2.32.3.tar.gz\",\"version\":\"3.11\"}]}", + "requests_toolbelt": "{\"rules_python_publish_deps_311_requests_toolbelt_py2_none_any_cccfdd66\":[{\"filename\":\"requests_toolbelt-1.0.0-py2.py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_requests_toolbelt_sdist_7681a0a3\":[{\"filename\":\"requests-toolbelt-1.0.0.tar.gz\",\"version\":\"3.11\"}]}", + "rfc3986": "{\"rules_python_publish_deps_311_rfc3986_py2_none_any_50b1502b\":[{\"filename\":\"rfc3986-2.0.0-py2.py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_rfc3986_sdist_97aacf9d\":[{\"filename\":\"rfc3986-2.0.0.tar.gz\",\"version\":\"3.11\"}]}", + "rich": "{\"rules_python_publish_deps_311_rich_py3_none_any_6049d5e6\":[{\"filename\":\"rich-13.9.4-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_rich_sdist_43959497\":[{\"filename\":\"rich-13.9.4.tar.gz\",\"version\":\"3.11\"}]}", + "secretstorage": "{\"rules_python_publish_deps_311_secretstorage_py3_none_any_f356e662\":[{\"filename\":\"SecretStorage-3.3.3-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_secretstorage_sdist_2403533e\":[{\"filename\":\"SecretStorage-3.3.3.tar.gz\",\"version\":\"3.11\"}]}", + "twine": "{\"rules_python_publish_deps_311_twine_py3_none_any_215dbe7b\":[{\"filename\":\"twine-5.1.1-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_twine_sdist_9aa08251\":[{\"filename\":\"twine-5.1.1.tar.gz\",\"version\":\"3.11\"}]}", + "urllib3": "{\"rules_python_publish_deps_311_urllib3_py3_none_any_ca899ca0\":[{\"filename\":\"urllib3-2.2.3-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_urllib3_sdist_e7d814a8\":[{\"filename\":\"urllib3-2.2.3.tar.gz\",\"version\":\"3.11\"}]}", + "zipp": "{\"rules_python_publish_deps_311_zipp_py3_none_any_a817ac80\":[{\"filename\":\"zipp-3.20.2-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_zipp_sdist_bc9eb26f\":[{\"filename\":\"zipp-3.20.2.tar.gz\",\"version\":\"3.11\"}]}" + }, + "packages": [ + "backports_tarfile", + "certifi", + "charset_normalizer", + "docutils", + "idna", + "importlib_metadata", + "jaraco_classes", + "jaraco_context", + "jaraco_functools", + "keyring", + "markdown_it_py", + "mdurl", + "more_itertools", + "nh3", + "pkginfo", + "pygments", + "readme_renderer", + "requests", + "requests_toolbelt", + "rfc3986", + "rich", + "twine", + "urllib3", + "zipp" + ], + "groups": {} + } + } + }, + "moduleExtensionMetadata": { + "useAllRepos": "NO", + "reproducible": false + }, + "recordedRepoMappingEntries": [ + [ + "bazel_features~", + "bazel_features_globals", + "bazel_features~~version_extension~bazel_features_globals" + ], + [ + "bazel_features~", + "bazel_features_version", + "bazel_features~~version_extension~bazel_features_version" + ], + [ + "rules_python~", + "bazel_features", + "bazel_features~" + ], + [ + "rules_python~", + "bazel_skylib", + "bazel_skylib~" + ], + [ + "rules_python~", + "bazel_tools", + "bazel_tools" + ], + [ + "rules_python~", + "pypi__build", + "rules_python~~internal_deps~pypi__build" + ], + [ + "rules_python~", + "pypi__click", + "rules_python~~internal_deps~pypi__click" + ], + [ + "rules_python~", + "pypi__colorama", + "rules_python~~internal_deps~pypi__colorama" + ], + [ + "rules_python~", + "pypi__importlib_metadata", + "rules_python~~internal_deps~pypi__importlib_metadata" + ], + [ + "rules_python~", + "pypi__installer", + "rules_python~~internal_deps~pypi__installer" + ], + [ + "rules_python~", + "pypi__more_itertools", + "rules_python~~internal_deps~pypi__more_itertools" + ], + [ + "rules_python~", + "pypi__packaging", + "rules_python~~internal_deps~pypi__packaging" + ], + [ + "rules_python~", + "pypi__pep517", + "rules_python~~internal_deps~pypi__pep517" + ], + [ + "rules_python~", + "pypi__pip", + "rules_python~~internal_deps~pypi__pip" + ], + [ + "rules_python~", + "pypi__pip_tools", + "rules_python~~internal_deps~pypi__pip_tools" + ], + [ + "rules_python~", + "pypi__pyproject_hooks", + "rules_python~~internal_deps~pypi__pyproject_hooks" + ], + [ + "rules_python~", + "pypi__setuptools", + "rules_python~~internal_deps~pypi__setuptools" + ], + [ + "rules_python~", + "pypi__tomli", + "rules_python~~internal_deps~pypi__tomli" + ], + [ + "rules_python~", + "pypi__wheel", + "rules_python~~internal_deps~pypi__wheel" + ], + [ + "rules_python~", + "pypi__zipp", + "rules_python~~internal_deps~pypi__zipp" + ], + [ + "rules_python~", + "pythons_hub", + "rules_python~~python~pythons_hub" + ], + [ + "rules_python~~python~pythons_hub", + "python_3_10_host", + "rules_python~~python~python_3_10_host" + ], + [ + "rules_python~~python~pythons_hub", + "python_3_11_host", + "rules_python~~python~python_3_11_host" + ], + [ + "rules_python~~python~pythons_hub", + "python_3_12_host", + "rules_python~~python~python_3_12_host" + ], + [ + "rules_python~~python~pythons_hub", + "python_3_13_host", + "rules_python~~python~python_3_13_host" + ], + [ + "rules_python~~python~pythons_hub", + "python_3_8_host", + "rules_python~~python~python_3_8_host" + ], + [ + "rules_python~~python~pythons_hub", + "python_3_9_host", + "rules_python~~python~python_3_9_host" + ] + ] + } + }, + "@@rules_swift~//swift:extensions.bzl%non_module_deps": { + "general": { + "bzlTransitiveDigest": "sYMR3xOa5sLdm8MWGLAwlRJRX5m6BJwGpHvifl8VR70=", + "usagesDigest": "oOk0O0F9tROCJYa1ynfWbfouHMALDjhAJmpxXr8qfeE=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "com_github_apple_swift_protobuf": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "urls": [ + "https://github.com/apple/swift-protobuf/archive/1.20.2.tar.gz" + ], + "sha256": "3fb50bd4d293337f202d917b6ada22f9548a0a0aed9d9a4d791e6fbd8a246ebb", + "strip_prefix": "swift-protobuf-1.20.2/", + "build_file": "@@rules_swift~//third_party:com_github_apple_swift_protobuf/BUILD.overlay" + } + }, + "com_github_grpc_grpc_swift": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "urls": [ + "https://github.com/grpc/grpc-swift/archive/1.16.0.tar.gz" + ], + "sha256": "58b60431d0064969f9679411264b82e40a217ae6bd34e17096d92cc4e47556a5", + "strip_prefix": "grpc-swift-1.16.0/", + "build_file": "@@rules_swift~//third_party:com_github_grpc_grpc_swift/BUILD.overlay" + } + }, + "com_github_apple_swift_nio": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "urls": [ + "https://github.com/apple/swift-nio/archive/2.42.0.tar.gz" + ], + "sha256": "e3304bc3fb53aea74a3e54bd005ede11f6dc357117d9b1db642d03aea87194a0", + "strip_prefix": "swift-nio-2.42.0/", + "build_file": "@@rules_swift~//third_party:com_github_apple_swift_nio/BUILD.overlay" + } + }, + "com_github_apple_swift_nio_http2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "urls": [ + "https://github.com/apple/swift-nio-http2/archive/1.26.0.tar.gz" + ], + "sha256": "f0edfc9d6a7be1d587e5b403f2d04264bdfae59aac1d74f7d974a9022c6d2b25", + "strip_prefix": "swift-nio-http2-1.26.0/", + "build_file": "@@rules_swift~//third_party:com_github_apple_swift_nio_http2/BUILD.overlay" + } + }, + "com_github_apple_swift_nio_transport_services": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "urls": [ + "https://github.com/apple/swift-nio-transport-services/archive/1.15.0.tar.gz" + ], + "sha256": "f3498dafa633751a52b9b7f741f7ac30c42bcbeb3b9edca6d447e0da8e693262", + "strip_prefix": "swift-nio-transport-services-1.15.0/", + "build_file": "@@rules_swift~//third_party:com_github_apple_swift_nio_transport_services/BUILD.overlay" + } + }, + "com_github_apple_swift_nio_extras": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "urls": [ + "https://github.com/apple/swift-nio-extras/archive/1.4.0.tar.gz" + ], + "sha256": "4684b52951d9d9937bb3e8ccd6b5daedd777021ef2519ea2f18c4c922843b52b", + "strip_prefix": "swift-nio-extras-1.4.0/", + "build_file": "@@rules_swift~//third_party:com_github_apple_swift_nio_extras/BUILD.overlay" + } + }, + "com_github_apple_swift_log": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "urls": [ + "https://github.com/apple/swift-log/archive/1.4.4.tar.gz" + ], + "sha256": "48fe66426c784c0c20031f15dc17faf9f4c9037c192bfac2f643f65cb2321ba0", + "strip_prefix": "swift-log-1.4.4/", + "build_file": "@@rules_swift~//third_party:com_github_apple_swift_log/BUILD.overlay" + } + }, + "com_github_apple_swift_nio_ssl": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "urls": [ + "https://github.com/apple/swift-nio-ssl/archive/2.23.0.tar.gz" + ], + "sha256": "4787c63f61dd04d99e498adc3d1a628193387e41efddf8de19b8db04544d016d", + "strip_prefix": "swift-nio-ssl-2.23.0/", + "build_file": "@@rules_swift~//third_party:com_github_apple_swift_nio_ssl/BUILD.overlay" + } + }, + "com_github_apple_swift_collections": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "urls": [ + "https://github.com/apple/swift-collections/archive/1.0.4.tar.gz" + ], + "sha256": "d9e4c8a91c60fb9c92a04caccbb10ded42f4cb47b26a212bc6b39cc390a4b096", + "strip_prefix": "swift-collections-1.0.4/", + "build_file": "@@rules_swift~//third_party:com_github_apple_swift_collections/BUILD.overlay" + } + }, + "com_github_apple_swift_atomics": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "urls": [ + "https://github.com/apple/swift-atomics/archive/1.1.0.tar.gz" + ], + "sha256": "1bee7f469f7e8dc49f11cfa4da07182fbc79eab000ec2c17bfdce468c5d276fb", + "strip_prefix": "swift-atomics-1.1.0/", + "build_file": "@@rules_swift~//third_party:com_github_apple_swift_atomics/BUILD.overlay" + } + }, + "build_bazel_rules_swift_index_import": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "build_file": "@@rules_swift~//third_party:build_bazel_rules_swift_index_import/BUILD.overlay", + "canonical_id": "index-import-5.8", + "urls": [ + "https://github.com/MobileNativeFoundation/index-import/releases/download/5.8.0.1/index-import.tar.gz" + ], + "sha256": "28c1ffa39d99e74ed70623899b207b41f79214c498c603915aef55972a851a15" + } + }, + "build_bazel_rules_swift_local_config": { + "bzlFile": "@@rules_swift~//swift/internal:swift_autoconfiguration.bzl", + "ruleClassName": "swift_autoconfiguration", + "attributes": {} + } + }, + "recordedRepoMappingEntries": [ + [ + "rules_swift~", + "bazel_tools", + "bazel_tools" + ], + [ + "rules_swift~", + "build_bazel_rules_swift", + "rules_swift~" + ] + ] + } + } + } +} diff --git a/README.md b/README.md index ec303c44..4903c5b9 100644 --- a/README.md +++ b/README.md @@ -1,462 +1,42 @@ -# Set up Aggregation Service for Aggregatable Reports +# Aggregation Service for Measurement -**[NOTE] The latest aggregatable reports generated with Chrome version 104+ are only supported with -version `0.3.0` and later. Please follow the [update instructions](#updating-the-system) for your -environment.** +Aggregation Service provides server-side mechanism for adtechs to create summary reports. A summary +report is the result of noisy aggregation applied to a batch of aggregatable reports. Summary +reports allow for greater flexibility and a richer data model than event-level reporting, +particularly for some use-cases like conversion values. Aggregation Service operates on aggregatable +reports that are encrypted reports sent from individual user devices which contain data about +individual events in the client software, such as a Chrome browser or an Android device. + +## Build and deploy This repository contains instructions and scripts to set up and test the Aggregation Service for [Aggregatable Reports](https://github.com/WICG/conversion-measurement-api/blob/main/AGGREGATION_SERVICE_TEE.md#aggregatable-reports) -locally and on Amazon Web Services -[Nitro Enclaves](https://aws.amazon.com/ec2/nitro/nitro-enclaves/). If you want to learn more about -the [Privacy Sandbox](https://privacysandbox.com/) Aggregation Service for the Attribution Reporting -API, aggregatable, and summary reports click, read the +locally and on Cloud (AWS and GCP). If you want to learn more about the +[Privacy Sandbox](https://privacysandbox.com/) Aggregation Service for the Attribution Reporting API +and other use cases, read the [Aggregation Service proposal](https://github.com/WICG/conversion-measurement-api/blob/main/AGGREGATION_SERVICE_TEE.md#aggregatable-reports). -## Set up local testing - -You can process -[aggregatable debug reports](https://github.com/WICG/conversion-measurement-api/blob/main/AGGREGATE.md#aggregatable-reports) -locally with the `LocalTestingTool_{VERSION}.jar` into summary reports. Learn -[how to setup debug reports](https://docs.google.com/document/d/1BXchEk-UMgcr2fpjfXrQ3D8VhTR-COGYS1cwK_nyLfg/edit#heading=h.fvp017tkgw79). - -_Disclaimer: encrypted reports can **not** be processed with the local testing tool!_ - -### Clone the repository - -Clone the repository into a local folder ``: - -```sh -git clone https://github.com/privacysandbox/aggregation-service; -cd aggregation-service -``` - -### Using the local testing tool - -The local testing tool can be used to perform aggregation on the following types of unencrypted -aggregatable reports- - -1. [Attribution Reporting](https://github.com/WICG/conversion-measurement-api/blob/main/AGGREGATE.md#aggregatable-reports) -2. [FLEDGE](https://github.com/patcg-individual-drafts/private-aggregation-api#reports) -3. [Shared-storage](https://github.com/patcg-individual-drafts/private-aggregation-api#reports) - -Simply pass any of the above 3 kinds of reports as `--input_data_avro_file` param. - -Download the local testing tool with the below command. Run this command in the `` - -```sh -VERSION=$(cat VERSION); curl -f -o LocalTestingTool_$VERSION.jar https://aggregation-service-published-artifacts.s3.amazonaws.com/aggregation-service/$VERSION/LocalTestingTool_$VERSION.jar -``` - -You'll need [Java JRE](https://adoptium.net/) installed to use the tool. - - -_The `SHA256` of the `LocalTestingTool_{version}.jar` can be found on the -[releases page](https://github.com/privacysandbox/aggregation-service/releases)._ - - -Follow the instructions on how to -[collect and batch aggregatable reports](#collect-and-batch-aggregatable-reports). Create an output -domain file: `output_domain.avro`. For testing you can use our -[sample debug batch](./sampledata/output_debug_reports.avro) with the corresponding -[output domain avro](./sampledata/output_domain.avro). - -To aggregate the resulting avro batch `output_debug_reports.avro` file into a summary report in the -same directory where you run the tool, run the following command: - -```sh -java -jar LocalTestingTool_{version}.jar \ ---input_data_avro_file output_debug_reports.avro \ ---domain_avro_file output_domain.avro \ ---output_directory . -``` - -To see all supported flags for the local testing tool run -`java -jar LocalTestingTool_{version}.jar --help`, e.g. you can adjust the noising epsilon with the -`--epsilon` flag or disable noising all together with the `--no_noising` flag. -[See all flags and descriptions](/docs/API.md#local-testing-tool). - -## Test on AWS with support for encrypted reports - -### General Notes - -#### Privacy Budget Enforcement - -Aggregation Service enforces the -[no-duplicate](https://github.com/WICG/attribution-reporting-api/blob/main/AGGREGATION_SERVICE_TEE.md#no-duplicates-rule) -rule. We recommend users design their systems keeping the no-duplicate rule in consideration. We -suggest reading the [debugging](/docs/DEBUGGING.md) document for debug aggregation runs. - -### Prerequisites - -To test the aggregation service with support for encrypted reports, you need the following: - -- Have an [AWS account](https://portal.aws.amazon.com/gp/aws/developer/registration/index.html) - available to you. -- [Register](https://developer.chrome.com/origintrials/#/view_trial/771241436187197441) for the - Privacy Sandbox Relevance and Measurement origin trial (OT) -- Complete the aggregation service [onboarding form](https://forms.gle/EHoecersGKhpcLPNA) - -Once you've submitted the onboarding form, we will contact you to verify your information. Then, -we'll send you the remaining instructions and information needed for this setup.
_You won't be -able to successfully setup your AWS system without registering for the origin trial and completing -the onboarding process!_ - -To set up aggregation service in AWS you'll use [Terraform](https://www.terraform.io/). - -### Set up AWS client - -Make sure you -[install](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) and -[set up](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html) the latest -AWS client. - -### Set up Terraform - -Change into the `/terraform/aws` folder. See -[clone the repository](#clone-the-repository) if you have not cloned the repository so far. - -The setup scripts require terraform version `1.2.3`. You can download Terraform version 1.2.3 from -[https://releases.hashicorp.com/terraform/1.2.3/](https://releases.hashicorp.com/terraform/1.2.3/) -or _at your own risk_, you can install and use -[Terraform version manager](https://github.com/tfutils/tfenv) instead. - -If you have the Terraform version manager `tfenv` installed, run the following in your -`` to set Terraform to version `1.2.3`. - -```sh -tfenv install 1.2.3; -tfenv use 1.2.3 -``` - -We recommend you store the [Terraform state](https://www.terraform.io/language/state) in a cloud -bucket. Create a S3 bucket via the console/cli, which we'll reference as `tf_state_bucket_name`. -Consider enabling `versioning` to preserve, retrieve, and restore previous versions and set -appropriate policies for this bucket to prevent accidental changes and deletion. - -### Download Terraform scripts and prebuilt dependencies - -_Note: The prebuilt Amazon Machine Image (AMI) for the aggregation service is only available in the -`us-east-1` region. If you like to deploy the aggregation service in a different region you need to -copy the released AMI to your account or build it using our provided scripts._ - -If you like to build the Amazon Machine Image including the enclave container, as well as the Lambda -jars in your account, please follow the instructions in -[build-scripts/aws](/build-scripts/aws/README.md). This will skip running -`bash download_prebuilt_dependencies.sh` and run `bash fetch_terraform.sh` instead. Continue with -the [next deployment step](#set-up-your-deployment-environment) after building and downloading your -self-build jars. - -The Terraform scripts to deploy the aggregation service depend on 5 packaged jars for Lambda -functions deployment. These jars are hosted on Amazon S3 -(}) -and can be downloaded with the `/terraform/aws/download_prebuilt_dependencies.sh` -script. The script downloads the terrafrom scripts and jars which will be stored in -`/terraform/aws`. License information of downloaded dependencies can be found in -the [DEPENDENCIES.md](/DEPENDENCIES.md) - -Run the following script in the `/terraform/aws` folder to download the prebuilt -dependencies. - -```bash -bash download_prebuilt_dependencies.sh -``` - -_Note: The above script needs to be run with `bash` and does not support `sh`\*_ - -For manual download into the `/terraform/aws/jars` folder you can download them -from the links on our -[releases page](https://github.com/privacysandbox/aggregation-service/releases). - -### Set up your deployment environment - -We use the following folder structure -`/terraform/aws/environments/` to separate deployment -environments. - -To set up your first environment (e.g `dev`), copy the `demo` environment. Run the following -commands from the `/terraform/aws/environments` folder: - -```sh -mkdir dev -cp -R demo/* dev -cd dev -``` - -Make the following adjustments in the `/terraform/aws/environments/dev` folder: - -1. Add the `tf_state_bucket_name` to your `main.tf` by uncommenting and replacing the values using - `<...>`: - - ```sh - # backend "s3" { - # bucket = "" - # key = ".tfstate" - # region = "us-east-1" - # } - ``` - -1. Rename `example.auto.tfvars` to `.auto.tfvars` and add the `...assume_role...` - values using the information you received in the onboarding email. Delete the line that reads - `assume_role_parameter = "arn:aws:iam::example:role/example"` Leave all other values as-is for - the initial deployment. - - ```sh - environment = "" - ... - - coordinator_a_assume_role_parameter = "arn:aws:iam:::role/a__coordinator_assume_role" - coordinator_b_assume_role_parameter = "arn:aws:iam:::role/b__coordinator_assume_role" - ... - - alarm_notification_email = "" - ``` - - - environment: name of your environment - - coordinator_a_assume_role_parameter: IAM role for Coordinator A given by us in the - onboarding or upgrade email - - coordinator_b_assume_role_parameter: IAM role for Coordinator B given by us in the - onboarding or upgrade email - - alarm_notification_email: Email to receive alarm notifications. Requires confirmation - subscription through sign up email sent to this address. - -1. **Skip this step if you use our prebuilt AMI and Lambda jars** - - If you [self-build your AMI and jars](/build-scripts/aws/README.md), you need to copy the - contents of the `release_params.auto.tfvars` file into a new file - `self_build_params.auto.tfvars` remove the `release_params.auto.tfvars` file afterwards. - - To copy without symlink, run the following in the - `/terraform/aws/environments/dev` folder - - ```sh - cp -L release_params.auto.tfvars self_build_params.auto.tfvars - ``` - - Then delete the symlinked file: - - ```sh - rm release_params.auto.tfvars - ``` - - And change the line `ami_owners = ["971056657085"]` to `ami_owners = ["self"]` in your - `self_build_params.auto.tfvars`. - -1. Once you've adjusted the configuration, run the following in the - `/terraform/aws/environments/dev` folder - - Install all Terraform modules: - - ```sh - terraform init - ``` - - Get an infrastructure setup plan: - - ```sh - terraform plan - ``` - - If you see the following output on a fresh project: - - ```terraform - ... - Plan: 190 to add, 0 to change, 0 to destroy. - ``` - - you can continue to apply the changes (needs confirmation after the planning step) - - ```sh - terraform apply - ``` - - If your see the following output, your setup was successful: - - ```terraform - ... - Apply complete! Resources: 190 added, 0 changed, 0 destroyed. - - Outputs: - create_job_endpoint = "POST https://.execute-api..amazonaws.com/stage/v1alpha/createJob" - frontend_api_id = "xyz" - get_job_endpoint = "GET https://.execute-api..amazonaws.com/stage/v1alpha/getJob" - ``` - - The terraform scripts create `createJob` and `getJob` API endpoints: - - - Create Job Endpoint: - `https://.execute-api..amazonaws.com/stage/v1alpha/createJob` - - Get Job Endpoint: - `https://.execute-api..amazonaws.com/stage/v1alpha/getJob` - - These are authenticated endpoints, refer to the [Testing the System](#testing-the-system) - section to learn how to use them. - - _If you run into any issues during deployment of your system, please consult the - [Troubleshooting](#troubleshooting) and [Support](#support) sections._ - -### Testing the system - -To test the system, you'll need encrypted aggregatable reports in avro batch format (follow the -[collecting and batching instructions](#collect-and-batch-aggregatable-reports)) accessible by the -aggregation service. - -If your inputs are larger than a few hundred MB, we suggest sharding the input reports and domain -file into smaller shards. - -1. Create an S3 bucket for your input and output data, we will refer to it as `data_bucket`. This - bucket must be created in the same AWS account where you set up the aggregation service. \* - Consider enabling `versioning` to preserve, retrieve, and restore previous versions and set - appropriate policies for this bucket to prevent accidental changes and deletion. - -1. Copy your reports.avro with batched encrypted aggregatable reports to `/input`. - -1. Create an aggregation job with the `createJob` API. - - `POST` `https://.execute-api.us-east-1.amazonaws.com/stage/v1alpha/createJob` - - ```json - { - "input_data_blob_prefix": "input/reports.avro", - "input_data_bucket_name": "", - "output_data_blob_prefix": "output/summary_report.avro", - "output_data_bucket_name": "", - "job_parameters": { - "attribution_report_to": "", - "output_domain_blob_prefix": "domain/domain.avro", - "output_domain_bucket_name": "" - }, - "job_request_id": "test01" - } - ``` - - _Note: This API requires authentication. Follow the - [AWS instructions](https://aws.amazon.com/premiumsupport/knowledge-center/iam-authentication-api-gateway/) - for sending an authenticated request._ - -1. Check the status of your job with the `getJob` API, replace values in `<...>` - - `GET` - `https://.execute-api..amazonaws.com/stage/v1alpha/getJob?job_request_id=test01` - - _Note: This API requires authentication. Follow the - [AWS instructions](https://aws.amazon.com/premiumsupport/knowledge-center/iam-authentication-api-gateway/) - for sending an authenticated request. [Detailed API spec](/docs/API.md#getjob-endpoint)_ - -### Updating the system - -If you have deployed the system before, we recommend to run `terraform destroy` in your environment -folder (e.g. `/terraform/aws/environments/dev`) when upgrading from `0.3.z` to -`0.4.z+` and follow the [setup steps](#set-up-your-deployment-environment) again. - -After your upgrade to `0.4.z+` and if you have followed the above setup, next time you can update -your system to the latest version by checking out the latest tagged version and running -`terraform apply` in your environment folder (e.g. -`/terraform/aws/environments/dev`). - -Run the following in the ``. - -```sh -git fetch origin && git checkout -b dev-v{VERSION} v{VERSION} -cd terraform/aws -bash download_prebuilt_dependencies.sh -cd environments/dev -terraform apply -``` - -_Note: If you use self-built artifacts described in -[build-scripts/aws](/build-scripts/aws/README.md), run `bash fetch_terraform.sh` instead of -`bash download_prebuilt_dependencies.sh` and make sure you updated your dependencies in the `jars` -folder._ - -## Collect and batch aggregatable reports - -Both the local testing tool and the aggregation service running on AWS Nitro Enclave expect -aggregatable reports batched in the following [Avro](https://avro.apache.org/) format. - -```avro -{ - "type": "record", - "name": "AggregatableReport", - "fields": [ - { - "name": "payload", - "type": "bytes" - }, - { - "name": "key_id", - "type": "string" - }, - { - "name": "shared_info", - "type": "string" - } - ] -} -``` - -Additionally an output domain file is needed to declare all expected aggregation keys for -aggregating the aggregatable reports (keys not listed in the domain file won't be aggregated) - -```avro -{ - "type": "record", - "name": "AggregationBucket", - "fields": [ - { - "name": "bucket", - "type": "bytes" - /* A single bucket that appears in - the aggregation service output. - 128-bit integer encoded as a - 16-byte big-endian byte string. */ - } - ] -} -``` - -[Review code snippets](/docs/COLLECTING.md) which demonstrate how to collect and batch aggregatable -reports. - -## Generate debug summary reports - -Please refer to [Debug aggregation runs](/docs/DEBUGGING.md) for more details about debugging -support in aggregation service. - -## Troubleshooting - -- The following error message points to a potential lack of instance availability. If you - encounter this situation, run `terraform destroy` to remove your deployment and run - `terraform apply` again. +## Key documents - ```txt - Error: Error creating Auto Scaling Group: ValidationError: You must use a valid - fully-formed launch template. Your requested instance type (m5.2xlarge) is not - supported in your requested Availability Zone (us-east-1e). - Please retry your request by not specifying an Availability Zone or choosing - us-east-1a, us-east-1b, us-east-1c, us-east-1d, us-east-1f. - ``` +### Explainers -- The following error message points to a potential lack of sufficient elastic VPC IPs quota in - your deployment region. Request a - [quota increase](https://docs.aws.amazon.com/vpc/latest/userguide/amazon-vpc-limits.html) or - decrease the number of subnets created for the aggregation service VPC to resolve the issue. To - stay within the default quota you can decrease the number of subnets, by setting - `vpc_availability_zones = ["a","b","c","d","e"]` in your `.auto.tfvars`. +- [Aggregation Service explainer](https://github.com/WICG/attribution-reporting-api/blob/main/AGGREGATION_SERVICE_TEE.md) - ```txt - Error: Error creating EIP: AddressLimitExceeded: The maximum number of addresses has been reached. - status code: 400, request id: 2c7a924c-c807-4714-8d77-8558a463c68b +### Operating documentation - with module.operator_service.module.vpc[0].aws_eip.elastic_ip["us-east-1a"], - on ../../modules/vpc/main.tf line 277, in resource "aws_eip" "elastic_ip": - 277: resource "aws_eip" "elastic_ip" { - ``` +- [Collect and batch aggregatable reports](./docs/collecting.md) +- [Testing locally using Local Testing Tool](./docs/local-testing-tool.md) +- [Testing on AWS using encrypted reports](./docs/aws-aggregation-service.md) +- [Testing on GCP using encrypted reports](./docs/gcp-aggregation-service.md) +- [Aggregation Service API](./docs/api.md) +- [Generate debug summary reports](./docs/debugging.md) ## Support -You can reach out to us for support through creating issues on this repository or sending us an -email at aggregation-service-support\google.com. This address is monitored and only visible to -selected support staff. +For product questions, discussing features, and providing feedback, you can create an issue on this +repository. For requesting technical troubleshooting support if you're facing an error while +deploying, maintaining, or running jobs with Aggregation Service, use this +[Technical Support Form](https://support.google.com/faqs/contact/privacysandbox_aggregation_service). ## License @@ -464,10 +44,9 @@ Apache 2.0 - See [LICENSE](LICENSE) for more information. ## FAQ -### Where should I post feedback/questions, this repo or the Attribution API repo? +### Where should I post feedback/questions, this repo or the API repo? -This repo hosts an implementation of the -[Attribution Reporting API](https://github.com/WICG/attribution-reporting-api). For -feedback/questions encountered during using this particular aggregation service implementation, -please use the support channels provided by this repo. For feedback/requests related to the APIs in -general, please initiate discussions in the Attribution Reporting API repo. +For feedback/questions encountered during using this aggregation service implementation, please use +the support channels provided by this repo. For feedback/requests related to the APIs in general, +please initiate discussions in the respective API repo eg. +[Attribution Reporting API repo](https://github.com/WICG/attribution-reporting-api). diff --git a/VERSION b/VERSION index faef31a4..fb2c0766 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.7.0 +2.13.0 diff --git a/WORKSPACE b/WORKSPACE index ce0ec321..95811eab 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -16,22 +16,31 @@ http_archive( url = "https://github.com/bazelbuild/rules_jvm_external/archive/%s.zip" % RULES_JVM_EXTERNAL_TAG, ) +# IMPORTANT: If you added dependencies and/or updated dependency versions below, run +# `$ bazel run @unpinned_maven//:pin` and include `maven_install.json` in your change. + # Declare explicit protobuf version, to override any implicit dependencies. -PROTOBUF_CORE_VERSION = "3.19.4" +PROTOBUF_CORE_VERSION = "28.3" + +PROTOBUF_JAVA_VERSION_PREFIX = "4." + +PROTOBUF_SHA_256 = "7c3ebd7aaedd86fa5dc479a0fda803f602caaf78d8aff7ce83b89e1b8ae7442a" -COORDINATOR_VERSION = "v0.51.6" # version updated on 2023-03-02 +COORDINATOR_VERSION = "v1.19.0-rc01" # version updated on 2025-03-24 -JACKSON_VERSION = "2.12.2" +JACKSON_VERSION = "2.16.1" -AUTO_VALUE_VERSION = "1.7.4" +AUTO_VALUE_VERSION = "1.10.1" -AWS_SDK_VERSION = "2.17.239" +AWS_SDK_VERSION = "2.21.16" -GOOGLE_GAX_VERSION = "2.4.0" +AWS_JAVA_SDK_VERSION = "1.12.772" -TINK_VERSION = "1.5.0" +GOOGLE_GAX_VERSION = "2.38.0" -AUTO_SERVICE_VERSION = "1.0" +AUTO_SERVICE_VERSION = "1.1.1" + +OTEL_VERSION = "1.43.0" load("@rules_jvm_external//:repositories.bzl", "rules_jvm_external_deps") @@ -45,39 +54,82 @@ load("@rules_jvm_external//:defs.bzl", "maven_install") http_archive( name = "com_google_protobuf", - sha256 = "3bd7828aa5af4b13b99c191e8b1e884ebfa9ad371b0ce264605d347f135d2568", + sha256 = PROTOBUF_SHA_256, strip_prefix = "protobuf-%s" % PROTOBUF_CORE_VERSION, urls = [ "https://github.com/protocolbuffers/protobuf/archive/v%s.tar.gz" % PROTOBUF_CORE_VERSION, ], ) +http_file( + name = "shared_libraries_workspace", + downloaded_file_path = "file", + url = "https://raw.githubusercontent.com/privacysandbox/coordinator-services-and-shared-libraries/{}/WORKSPACE".format(COORDINATOR_VERSION), +) + # Use following instead of git_repository for local development #local_repository( -# name = "com_google_adm_cloud_scp", +# name = "shared_libraries", # path = "", #) git_repository( - name = "com_google_adm_cloud_scp", - remote = "https://github.com/privacysandbox/control-plane-shared-libraries", + name = "shared_libraries", + patch_args = [ + "-p1", + ], + remote = "https://github.com/privacysandbox/coordinator-services-and-shared-libraries", + patches = [ + "//build_defs/shared_libraries:coordinator.patch", + ], tag = COORDINATOR_VERSION, + workspace_file = "@shared_libraries_workspace//file", ) -load("@com_google_adm_cloud_scp//build_defs/tink:tink_defs.bzl", "TINK_MAVEN_ARTIFACTS", "import_tink_git") - -import_tink_git(repo_name = "@com_google_adm_cloud_scp") - +# IMPORTANT: If you added dependencies and/or updated dependency versions below, run +# `$ bazel run @unpinned_maven//:pin` and include `maven_install.json` in your change. +OTEL_ARTIFACTS = [ + "com.google.errorprone:error_prone_annotations:2.+", + "io.opentelemetry:opentelemetry-api:" + OTEL_VERSION, + "io.opentelemetry:opentelemetry-exporter-logging:" + OTEL_VERSION, + "io.opentelemetry:opentelemetry-exporter-logging-otlp:" + OTEL_VERSION, + "io.opentelemetry:opentelemetry-exporter-otlp:" + OTEL_VERSION, + "io.opentelemetry:opentelemetry-sdk:" + OTEL_VERSION, + "io.opentelemetry:opentelemetry-sdk-common:" + OTEL_VERSION, + "io.opentelemetry:opentelemetry-sdk-metrics:" + OTEL_VERSION, + "io.opentelemetry:opentelemetry-sdk-testing:" + OTEL_VERSION, + "io.opentelemetry:opentelemetry-sdk-logs:" + OTEL_VERSION, + "io.opentelemetry:opentelemetry-sdk-trace:" + OTEL_VERSION, + "io.opentelemetry.contrib:opentelemetry-aws-xray:" + OTEL_VERSION, + "com.google.cloud.opentelemetry:exporter-metrics:0.33.0", + # Note from https://github.com/open-telemetry/semantic-conventions-java: + # Although this is for stable semantic conventions, the artifact still has the -alpha and comes with no + # compatibility guarantees. The goal is to mark this artifact stable. + "io.opentelemetry.semconv:opentelemetry-semconv:1.27.0-alpha", + # As of adding, https://repo1.maven.org/maven2/io/opentelemetry/contrib/opentelemetry-gcp-resources/ only shows + # that alpha version is available. + "io.opentelemetry.contrib:opentelemetry-gcp-resources:" + OTEL_VERSION + "-alpha", + "io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi:" + OTEL_VERSION, +] + +# IMPORTANT: If you added dependencies and/or updated dependency versions below, run +# `$ bazel run @unpinned_maven//:pin` and include `maven_install.json` in your change. maven_install( artifacts = [ - "com.amazonaws:aws-lambda-java-core:1.2.1", - "com.amazonaws:aws-lambda-java-events:3.8.0", + "com.amazonaws:aws-lambda-java-core:1.2.3", + "com.amazonaws:aws-lambda-java-events:3.11.3", "com.amazonaws:aws-lambda-java-events-sdk-transformer:3.1.0", - "com.amazonaws:aws-java-sdk-sqs:1.11.860", - "com.amazonaws:aws-java-sdk-s3:1.11.860", - "com.amazonaws:aws-java-sdk-kms:1.11.860", - "com.amazonaws:aws-java-sdk-core:1.11.860", - "com.beust:jcommander:1.81", + "com.amazonaws:aws-java-sdk-sqs:" + AWS_JAVA_SDK_VERSION, + "com.amazonaws:aws-java-sdk-s3:" + AWS_JAVA_SDK_VERSION, + "com.amazonaws:aws-java-sdk-kms:" + AWS_JAVA_SDK_VERSION, + "com.amazonaws:aws-java-sdk-core:" + AWS_JAVA_SDK_VERSION, + "com.amazonaws:aws-java-sdk-xray:" + AWS_JAVA_SDK_VERSION, + "com.amazonaws:aws-java-sdk-logs:" + AWS_JAVA_SDK_VERSION, + "com.amazonaws:aws-java-sdk-cloudwatch:" + AWS_JAVA_SDK_VERSION, + "com.beust:jcommander:1.82", + "com.google.cloud.functions.invoker:java-function-invoker:1.1.0", + "com.google.inject:guice:5.1.0", + "com.google.inject.extensions:guice-testlib:5.1.0", "com.fasterxml.jackson.core:jackson-annotations:" + JACKSON_VERSION, "com.fasterxml.jackson.core:jackson-core:" + JACKSON_VERSION, "com.fasterxml.jackson.core:jackson-databind:" + JACKSON_VERSION, @@ -86,67 +138,73 @@ maven_install( "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:" + JACKSON_VERSION, "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor:" + JACKSON_VERSION, "com.google.acai:acai:1.1", - "com.google.auto.factory:auto-factory:1.0", + "com.google.auto.factory:auto-factory:1.0.1", "com.google.auto.service:auto-service-annotations:" + AUTO_SERVICE_VERSION, "com.google.auto.service:auto-service:" + AUTO_SERVICE_VERSION, "com.google.auto.value:auto-value-annotations:" + AUTO_VALUE_VERSION, "com.google.auto.value:auto-value:" + AUTO_VALUE_VERSION, "com.google.code.findbugs:jsr305:3.0.2", - "com.google.cloud:google-cloud-kms:2.1.2", - "com.google.cloud:google-cloud-secretmanager:2.2.0", - "com.google.cloud:google-cloud-pubsub:1.114.4", - "com.google.cloud:google-cloud-storage:1.118.0", - "com.google.cloud:google-cloud-spanner:6.12.2", - "com.google.cloud.functions:functions-framework-api:1.0.4", - "commons-logging:commons-logging:1.1.1", + "com.google.cloud:google-cloud-logging:3.21.2", + "com.google.cloud:google-cloud-kms:2.60.0", + "com.google.cloud:google-cloud-pubsub:1.136.1", + "com.google.cloud:google-cloud-storage:2.48.0", + "com.google.cloud:google-cloud-spanner:6.86.0", + "com.google.cloud:google-cloud-secretmanager:2.57.0", + "com.google.cloud:google-cloud-compute:1.67.0", + "com.google.api.grpc:proto-google-cloud-logging-v2:0.110.2", + "com.google.api.grpc:proto-google-cloud-compute-v1:1.67.0", + "com.google.cloud.functions:functions-framework-api:1.1.0", + "commons-logging:commons-logging:1.3.0", + "com.google.api.grpc:proto-google-common-protos:2.34.0", + "com.google.cloud:google-cloud-trace:2.35.0", + "com.google.api.grpc:proto-google-cloud-trace-v1:2.35.0", "com.google.api:gax:" + GOOGLE_GAX_VERSION, - "com.google.http-client:google-http-client-jackson2:1.40.0", - #"com.google.crypto.tink:tink:" + TINK_VERSION, # Using Tink from github master branch until new version releases - "com.google.cloud:google-cloud-monitoring:3.4.1", - "com.google.api.grpc:proto-google-cloud-monitoring-v3:3.4.1", - "com.google.protobuf:protobuf-java:" + PROTOBUF_CORE_VERSION, - "com.google.protobuf:protobuf-java-util:" + PROTOBUF_CORE_VERSION, - "com.google.guava:guava:30.1-jre", - "com.google.guava:guava-testlib:30.1-jre", - "com.google.inject:guice:4.2.3", - "com.google.jimfs:jimfs:1.2", - "com.google.testparameterinjector:test-parameter-injector:1.1", - "com.google.truth.extensions:truth-java8-extension:1.1.2", - "com.google.truth.extensions:truth-proto-extension:1.1.2", - "com.google.truth:truth:1.1.2", - "com.jayway.jsonpath:json-path:2.5.0", - "io.github.resilience4j:resilience4j-core:1.7.1", - "io.github.resilience4j:resilience4j-retry:1.7.1", + "com.google.http-client:google-http-client-jackson2:1.43.3", + "io.reactivex.rxjava3:rxjava:3.1.8", + "com.google.cloud:google-cloud-monitoring:3.35.0", + "com.google.api.grpc:proto-google-cloud-monitoring-v3:3.35.0", + "com.google.protobuf:protobuf-java:" + PROTOBUF_JAVA_VERSION_PREFIX + PROTOBUF_CORE_VERSION, + "com.google.protobuf:protobuf-java-util:" + PROTOBUF_JAVA_VERSION_PREFIX + PROTOBUF_CORE_VERSION, + "com.google.guava:guava:33.0.0-jre", + "com.google.guava:guava-testlib:33.0.0-jre", + "com.google.jimfs:jimfs:1.3.0", + "com.google.testparameterinjector:test-parameter-injector:1.15", + "com.google.truth.extensions:truth-java8-extension:1.4.2", + "com.google.truth.extensions:truth-proto-extension:1.4.2", + "com.google.truth:truth:1.4.2", + "com.jayway.jsonpath:json-path:2.9.0", "javax.inject:javax.inject:1", "io.github.resilience4j:resilience4j-core:1.7.1", "io.github.resilience4j:resilience4j-retry:1.7.1", - "junit:junit:4.12", - "org.apache.avro:avro:1.10.2", + "junit:junit:4.13.2", + "org.apache.avro:avro:1.12.0", + "org.apache.commons:commons-compress:1.26.2", "org.apache.commons:commons-math3:3.6.1", - "org.apache.httpcomponents:httpcore:4.4.14", - "org.apache.httpcomponents:httpclient:4.5.13", - "org.apache.httpcomponents.client5:httpclient5:5.1.3", - "org.apache.httpcomponents.core5:httpcore5:5.1.4", - "org.apache.httpcomponents.core5:httpcore5-h2:5.1.4", - "org.apache.logging.log4j:log4j-1.2-api:2.17.0", - "org.apache.logging.log4j:log4j-core:2.17.0", - "org.awaitility:awaitility:3.0.0", + "org.apache.httpcomponents:httpcore:4.4.16", + "org.apache.httpcomponents:httpclient:4.5.14", + "org.apache.httpcomponents.client5:httpclient5:5.3", + "org.apache.httpcomponents.core5:httpcore5:5.2.4", + "org.apache.httpcomponents.core5:httpcore5-h2:5.2.4", + "org.apache.logging.log4j:log4j-1.2-api:2.22.1", + "org.apache.logging.log4j:log4j-core:2.22.1", + "org.awaitility:awaitility:3.1.6", "org.mock-server:mockserver-core:5.11.2", "org.mock-server:mockserver-junit-rule:5.11.2", "org.mock-server:mockserver-client-java:5.11.2", - "org.hamcrest:hamcrest-library:1.3", - "org.mockito:mockito-core:3.11.2", - "org.slf4j:slf4j-api:1.7.30", - "org.slf4j:slf4j-simple:1.7.30", - "org.slf4j:slf4j-log4j12:1.7.30", - "org.testcontainers:testcontainers:1.15.3", - "org.testcontainers:localstack:1.15.3", + "org.hamcrest:hamcrest-library:2.2", + "org.mockito:mockito-core:4.11.0", + "org.slf4j:slf4j-api:2.0.11", + "org.slf4j:slf4j-simple:2.0.11", + "org.slf4j:slf4j-log4j12:1.7.33", + "org.testcontainers:testcontainers:1.19.3", + "org.testcontainers:localstack:1.19.3", "software.amazon.awssdk:aws-sdk-java:" + AWS_SDK_VERSION, "software.amazon.awssdk:dynamodb-enhanced:" + AWS_SDK_VERSION, "software.amazon.awssdk:dynamodb:" + AWS_SDK_VERSION, "software.amazon.awssdk:ec2:" + AWS_SDK_VERSION, "software.amazon.awssdk:regions:" + AWS_SDK_VERSION, "software.amazon.awssdk:s3:" + AWS_SDK_VERSION, + "software.amazon.awssdk:s3-transfer-manager:" + AWS_SDK_VERSION, "software.amazon.awssdk:aws-core:" + AWS_SDK_VERSION, "software.amazon.awssdk:ssm:" + AWS_SDK_VERSION, "software.amazon.awssdk:sts:" + AWS_SDK_VERSION, @@ -155,16 +213,31 @@ maven_install( "software.amazon.awssdk:utils:" + AWS_SDK_VERSION, "software.amazon.awssdk:auth:" + AWS_SDK_VERSION, "software.amazon.awssdk:lambda:" + AWS_SDK_VERSION, - ] + TINK_MAVEN_ARTIFACTS, + "com.google.crypto.tink:tink:1.13.0", + "com.google.crypto.tink:tink-gcpkms:1.9.0", + "com.google.oauth-client:google-oauth-client:1.37.0", + "com.google.auth:google-auth-library-oauth2-http:1.31.0", + "io.netty:netty-codec-http:4.1.115.Final", + "com.google.cloud:google-cloud-iamcredentials:2.57.0", + ] + OTEL_ARTIFACTS, + maven_install_json = "//:maven_install.json", repositories = [ "https://repo1.maven.org/maven2", + "https://maven.google.com", + "https://jcenter.bintray.com", ], ) +load("@maven//:defs.bzl", "pinned_maven_install") + +pinned_maven_install() + http_archive( name = "rules_java", - sha256 = "34b41ec683e67253043ab1a3d1e8b7c61e4e8edefbcad485381328c934d072fe", - url = "https://github.com/bazelbuild/rules_java/releases/download/4.0.0/rules_java-4.0.0.tar.gz", + sha256 = "a9690bc00c538246880d5c83c233e4deb83fe885f54c21bb445eb8116a180b83", + urls = [ + "https://github.com/bazelbuild/rules_java/releases/download/7.12.2/rules_java-7.12.2.tar.gz", + ], ) load("@rules_java//java:repositories.bzl", "rules_java_dependencies", "rules_java_toolchains") @@ -206,12 +279,32 @@ protobuf_deps() # PKG Rules # ############# +http_archive( + name = "rules_cc", + sha256 = "abc605dd850f813bb37004b77db20106a19311a96b2da1c92b789da529d28fe1", + strip_prefix = "rules_cc-0.0.17", + urls = ["https://github.com/bazelbuild/rules_cc/releases/download/0.0.17/rules_cc-0.0.17.tar.gz"], +) + +http_archive( + name = "rules_python", + sha256 = "62ddebb766b4d6ddf1712f753dac5740bea072646f630eb9982caa09ad8a7687", + strip_prefix = "rules_python-0.39.0", + urls = [ + "https://github.com/bazelbuild/rules_python/releases/download/0.39.0/rules_python-0.39.0.tar.gz", + ], +) + +load("@rules_python//python:repositories.bzl", "py_repositories") + +py_repositories() + http_archive( name = "rules_pkg", - sha256 = "a89e203d3cf264e564fcb96b6e06dd70bc0557356eb48400ce4b5d97c2c3720d", + sha256 = "cad05f864a32799f6f9022891de91ac78f30e0fa07dc68abac92a628121b5b11", urls = [ - "https://mirror.bazel.build/github.com/bazelbuild/rules_pkg/releases/download/0.5.1/rules_pkg-0.5.1.tar.gz", - "https://github.com/bazelbuild/rules_pkg/releases/download/0.5.1/rules_pkg-0.5.1.tar.gz", + "https://mirror.bazel.build/github.com/bazelbuild/rules_pkg/releases/download/1.0.0/rules_pkg-1.0.0.tar.gz", + "https://github.com/bazelbuild/rules_pkg/releases/download/1.0.0/rules_pkg-1.0.0.tar.gz", ], ) @@ -229,31 +322,38 @@ rules_pkg_dependencies() http_archive( name = "io_bazel_rules_go", - sha256 = "69de5c704a05ff37862f7e0f5534d4f479418afc21806c887db544a316f3cb6b", + sha256 = "6734a719993b1ba4ebe9806e853864395a8d3968ad27f9dd759c196b3eb3abe8", urls = [ - "https://mirror.bazel.build/github.com/bazelbuild/rules_go/releases/download/v0.27.0/rules_go-v0.27.0.tar.gz", - "https://github.com/bazelbuild/rules_go/releases/download/v0.27.0/rules_go-v0.27.0.tar.gz", + "https://mirror.bazel.build/github.com/bazelbuild/rules_go/releases/download/v0.45.1/rules_go-v0.45.1.zip", + "https://github.com/bazelbuild/rules_go/releases/download/v0.45.1/rules_go-v0.45.1.zip", ], ) http_archive( name = "bazel_gazelle", - sha256 = "62ca106be173579c0a167deb23358fdfe71ffa1e4cfdddf5582af26520f1c66f", + integrity = "sha256-MpOL2hbmcABjA1R5Bj2dJMYO2o15/Uc5Vj9Q0zHLMgk=", urls = [ - "https://mirror.bazel.build/github.com/bazelbuild/bazel-gazelle/releases/download/v0.23.0/bazel-gazelle-v0.23.0.tar.gz", - "https://github.com/bazelbuild/bazel-gazelle/releases/download/v0.23.0/bazel-gazelle-v0.23.0.tar.gz", + "https://mirror.bazel.build/github.com/bazelbuild/bazel-gazelle/releases/download/v0.35.0/bazel-gazelle-v0.35.0.tar.gz", + "https://github.com/bazelbuild/bazel-gazelle/releases/download/v0.35.0/bazel-gazelle-v0.35.0.tar.gz", ], ) -load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies") +load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies", "go_repository") load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_dependencies") go_rules_dependencies() -go_register_toolchains(version = "1.17") +go_register_toolchains(version = "1.20.5") gazelle_dependencies() +go_repository( + name = "com_github_klauspost_compress", + importpath = "github.com/klauspost/compress", + sum = "h1:IFV2oUNUzZaz+XyusxpLzpzS8Pt5rh0Z16For/djlyI=", + version = "v1.16.5", +) + ################### # Container rules # ################### @@ -264,9 +364,8 @@ gazelle_dependencies() http_archive( name = "io_bazel_rules_docker", - sha256 = "59d5b42ac315e7eadffa944e86e90c2990110a1c8075f1cd145f487e999d22b3", - strip_prefix = "rules_docker-0.17.0", - urls = ["https://github.com/bazelbuild/rules_docker/releases/download/v0.17.0/rules_docker-v0.17.0.tar.gz"], + sha256 = "b1e80761a8a8243d03ebca8845e9cc1ba6c82ce7c5179ce2b295cd36f7e394bf", + urls = ["https://github.com/bazelbuild/rules_docker/releases/download/v0.25.0/rules_docker-v0.25.0.tar.gz"], ) load( @@ -286,14 +385,17 @@ load("@io_bazel_rules_docker//container:container.bzl", "container_pull") # Containers # ############## -# Distroless image for running Java. -container_pull( - name = "java_base", - # Using SHA-256 for reproducibility. - digest = "sha256:1606422cc472612cb5bcd885684b4bf87b3813246c266df473357dce5a0fb4b4", - registry = "gcr.io", - repository = "distroless/java", -) +load("//build_defs:container_dependencies.bzl", container_dependencies = "CONTAINER_DEPS") + +[ + container_pull( + name = img_name, + digest = img_info["digest"], + registry = img_info["registry"], + repository = img_info["repository"], + ) + for img_name, img_info in container_dependencies.items() +] # Distroless image for running C++. container_pull( @@ -315,6 +417,14 @@ container_pull( tag = "latest", ) +# Debug image for Java used only for load testing. +container_pull( + name = "java_base_debug", + registry = "docker.io", + repository = "bellsoft/liberica-openjdk-debian", + tag = "latest", +) + ############# # CPP Rules # ############# @@ -325,12 +435,6 @@ http_archive( urls = ["https://github.com/google/googletest/archive/e2239ee6043f73722e7aa812a459f54a28552929.zip"], ) -http_archive( - name = "rules_cc", - strip_prefix = "rules_cc-daf6ace7cfeacd6a83e9ff2ed659f416537b6c74", - urls = ["https://github.com/bazelbuild/rules_cc/archive/daf6ace7cfeacd6a83e9ff2ed659f416537b6c74.zip"], -) - ############### # Proto rules # ############### @@ -356,30 +460,10 @@ rules_proto_toolchains() # Binary Runtime Dependencies # ############################### -# TODO: find a better way to host kmstool binaries, using a public S3 bucket for the time being. -http_file( - name = "kmstool_enclave_cli", - downloaded_file_path = "kmstool_enclave_cli", - executable = True, - sha256 = "37dcd658328c5b57c0a6d8ea141156407de4e4fb5ac43f5906b171b2018352fc", - urls = ["https://mgol-enclavepoc-deps.s3.us-east-2.amazonaws.com/kmstool_enclave_cli"], -) - -# TODO: find a better way to host kmstool binaries, using a public S3 bucket for the time being. -http_file( - name = "kmstool_enclave", - downloaded_file_path = "kmstool_enclave", - executable = True, - urls = ["https://mgol-enclavepoc-deps.s3.us-east-2.amazonaws.com/kmstool_enclave"], -) +# Download the AWS enclave SDK repo and apply a patch for building the kmstool dependencies. +load("@shared_libraries//build_defs/shared:enclaves_kmstools.bzl", "import_aws_nitro_enclaves_sdk_c") -# TODO: find a better way to host kmstool binaries, using a public S3 bucket for the time being. -http_file( - name = "libnsm", - downloaded_file_path = "libnsm.so", - executable = False, - urls = ["https://mgol-enclavepoc-deps.s3.us-east-2.amazonaws.com/libnsm.so"], -) +import_aws_nitro_enclaves_sdk_c(repo_name = "@shared_libraries") ########################### # Binary Dev Dependencies # @@ -401,8 +485,8 @@ http_archive( package(default_visibility = ["//visibility:public"]) exports_files(["packer"]) """, - sha256 = "8a94b84542d21b8785847f4cccc8a6da4c7be5e16d4b1a2d0a5f7ec5532faec0", - url = "https://releases.hashicorp.com/packer/1.7.8/packer_1.7.8_linux_amd64.zip", + sha256 = "57d0411e578aea62918d36ed186951139d5d49d44b76e5666d1fbf2427b385ae", + url = "https://releases.hashicorp.com/packer/1.8.6/packer_1.8.6_linux_amd64.zip", ) # google cloud sdk for releasing artifacts to gcs @@ -436,8 +520,8 @@ http_file( git_repository( name = "com_github_google_rpmpack", - # Lastest commit in main branch as of 2021-11-29 - commit = "d0ed9b1b61b95992d3c4e83df3e997f3538a7b6c", + # Lastest commit in main branch as of 2022-11-20 + commit = "98b63d62fd7793b55131f19984972293f29af659", remote = "https://github.com/google/rpmpack.git", shallow_since = "1637822718 +0200", ) @@ -456,20 +540,56 @@ http_archive( ], ) -################################################################################ -# Download Containers: Begin -################################################################################ +########################## +# SDK Dependencies Rules # +########################## -# Needed for reproducibly building AL2 binaries (e.g. //cc/aws/proxy) -container_pull( - name = "amazonlinux_2", - # Latest as of 2022-09-14. - digest = "sha256:ba4ab64a757797930ebb0cf40a41da433cb0531877a3a2376f5427e3fdf93694", - registry = "index.docker.io", - repository = "amazonlinux", - tag = "2.0.20220805.0", +load("@shared_libraries//build_defs/cc:sdk.bzl", "sdk_dependencies") + +sdk_dependencies(PROTOBUF_CORE_VERSION, PROTOBUF_SHA_256) + +################################# +# SCP Shared Dependencies Rules # +################################# + +# This bazel file contains all the dependencies in SCP, except the dependencies +# only used in SDK. Eventually, each project will have its own bazel file for +# its dependencies, and this file will be removed. +load("@shared_libraries//build_defs:scp_dependencies.bzl", "scp_dependencies") + +scp_dependencies(PROTOBUF_CORE_VERSION, PROTOBUF_SHA_256) + +######### To gegerate Java interface for SDK ######### +load("@com_google_api_gax_java//:repository_rules.bzl", "com_google_api_gax_java_properties") + +com_google_api_gax_java_properties( + name = "com_google_api_gax_java_properties", + file = "@com_google_api_gax_java//:dependencies.properties", ) -################################################################################ -# Download Containers: End -################################################################################ +load("@com_google_api_gax_java//:repositories.bzl", "com_google_api_gax_java_repositories") + +com_google_api_gax_java_repositories() + +load("@io_grpc_grpc_java//:repositories.bzl", "grpc_java_repositories") + +grpc_java_repositories() + +########################### +# CC Dependencies # +########################### + +# Load indirect dependencies due to +# https://github.com/bazelbuild/bazel/issues/1943 +load("@com_github_googleapis_google_cloud_cpp//bazel:google_cloud_cpp_deps.bzl", "google_cloud_cpp_deps") + +google_cloud_cpp_deps() + +load("@com_google_googleapis//:repository_rules.bzl", "switched_rules_by_language") + +switched_rules_by_language( + name = "com_google_googleapis_imports", + cc = True, + grpc = True, + java = True, +) diff --git a/WORKSPACE.bzlmod b/WORKSPACE.bzlmod new file mode 100644 index 00000000..90926b30 --- /dev/null +++ b/WORKSPACE.bzlmod @@ -0,0 +1,164 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository") +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") + +# Load specific version of differential privacy from github 2nd March 2022. + +DIFFERENTIAL_PRIVACY_COMMIT = "099080e49c4c047802d785bc818898c0caf84d45" + +# value recommended by the differential privacy repo. +# date, not after the specified commit to allow for more shallow clone of repo +# for faster build times. +DIFFERENTIAL_PRIVACY_SHALLOW_SINCE = "1618997113 +0200" + +git_repository( + name = "com_google_differential_privacy", + commit = DIFFERENTIAL_PRIVACY_COMMIT, + remote = "https://github.com/google/differential-privacy.git", + shallow_since = DIFFERENTIAL_PRIVACY_SHALLOW_SINCE, +) + +# Load dependencies for the base workspace. +load("@com_google_differential_privacy//:differential_privacy_deps.bzl", "differential_privacy_deps") + +differential_privacy_deps() + +############ +# Go rules # +############ + +# Note: Go build rules are an indirect dependency of "io_bazel_rules_docker" and +# a direct dependency of rpmpack and buildifier. These rules are not used for +# deploying go code at the time of writing. + +http_archive( + name = "io_bazel_rules_go", + sha256 = "6734a719993b1ba4ebe9806e853864395a8d3968ad27f9dd759c196b3eb3abe8", + urls = [ + "https://mirror.bazel.build/github.com/bazelbuild/rules_go/releases/download/v0.45.1/rules_go-v0.45.1.zip", + "https://github.com/bazelbuild/rules_go/releases/download/v0.45.1/rules_go-v0.45.1.zip", + ], +) + +http_archive( + name = "bazel_gazelle", + integrity = "sha256-MpOL2hbmcABjA1R5Bj2dJMYO2o15/Uc5Vj9Q0zHLMgk=", + urls = [ + "https://mirror.bazel.build/github.com/bazelbuild/bazel-gazelle/releases/download/v0.35.0/bazel-gazelle-v0.35.0.tar.gz", + "https://github.com/bazelbuild/bazel-gazelle/releases/download/v0.35.0/bazel-gazelle-v0.35.0.tar.gz", + ], +) + +load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies") +load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_dependencies") + +go_rules_dependencies() + +go_register_toolchains(version = "1.20.5") + +gazelle_dependencies() + +################### +# Container rules # +################### + +# Note: these rules add a dependency on the golang toolchain and must be ordered +# after any `go_register_toolchains` calls in this file (or else the toolchain +# defined in io_bazel_rules_docker are used for future go toolchains) + +http_archive( + name = "io_bazel_rules_docker", + sha256 = "b1e80761a8a8243d03ebca8845e9cc1ba6c82ce7c5179ce2b295cd36f7e394bf", + urls = ["https://github.com/bazelbuild/rules_docker/releases/download/v0.25.0/rules_docker-v0.25.0.tar.gz"], +) + +load( + "@io_bazel_rules_docker//repositories:repositories.bzl", + container_repositories = "repositories", +) + +container_repositories() + +load("@io_bazel_rules_docker//repositories:deps.bzl", container_deps = "deps") + +container_deps() + +load("@io_bazel_rules_docker//container:container.bzl", "container_pull") + +############## +# Containers # +############## + +load("//build_defs:container_dependencies.bzl", container_dependencies = "CONTAINER_DEPS") + +[ + container_pull( + name = img_name, + digest = img_info["digest"], + registry = img_info["registry"], + repository = img_info["repository"], + ) + for img_name, img_info in container_dependencies.items() +] + +# Distroless image for running C++. +container_pull( + name = "cc_base", + registry = "gcr.io", + repository = "distroless/cc", + # Using SHA-256 for reproducibility. + # TODO: use digest instead of tag, currently it's not working. + tag = "latest", +) + +# Distroless image for running statically linked binaries. +container_pull( + name = "static_base", + registry = "gcr.io", + repository = "distroless/static", + # Using SHA-256 for reproducibility. + # TODO: use digest instead of tag, currently it's not working. + tag = "latest", +) + +# Debug image for Java used only for load testing. +container_pull( + name = "java_base_debug", + registry = "docker.io", + repository = "bellsoft/liberica-openjdk-debian", + tag = "latest", +) + +############################### +# Binary Runtime Dependencies # +############################### + +# Download the AWS enclave SDK repo and apply a patch for building the kmstool dependencies. +# load("@shared_libraries//build_defs/shared:enclaves_kmstools.bzl", "import_aws_nitro_enclaves_sdk_c") +# import_aws_nitro_enclaves_sdk_c(repo_name = "@shared_libraries") + +# http_archive( +# name = "aws_nitro_enclaves_sdk_c", +# build_file = Label("//build_defs/aws/kmstool:kmstool.BUILD"), +# patches = [ +# Label("//build_defs/aws/kmstool:kmstool.patch"), +# Label("//build_defs/aws/kmstool:dockerfile_git_shallow_clone.patch"), +# ], +# patch_args = ["-p1"], +# sha256 = "bc937626e1058c2464e60dde3a410855b87987e6da23433d78e77aedc8a152ec", +# strip_prefix = "aws-nitro-enclaves-sdk-c-e3425251b5fd573a730101b091f770ad21b9ee56", +# urls = ["https://github.com/aws/aws-nitro-enclaves-sdk-c/archive/e3425251b5fd573a730101b091f770ad21b9ee56.zip"], +# ) diff --git a/build-scripts/DEBIAN_CONTAINER_DIGEST b/build-scripts/DEBIAN_CONTAINER_DIGEST new file mode 100644 index 00000000..cc7e644b --- /dev/null +++ b/build-scripts/DEBIAN_CONTAINER_DIGEST @@ -0,0 +1 @@ +sha256:e9ac68ffde903b241342267a51cd74c5417414af652cb2e380c6ddcf522589bc diff --git a/build-scripts/aws/README.md b/build-scripts/aws/README.md index 460a85d7..8b249ae3 100644 --- a/build-scripts/aws/README.md +++ b/build-scripts/aws/README.md @@ -1,4 +1,4 @@ -# Building aggregation service artifacts +# Building aggregation service artifacts for Amazon Web Services ## Prerequisites @@ -83,7 +83,7 @@ The build can take several minutes. You can check the status at ## Download artifacts -To download the artifacts you can use `aws s3` commands. Download the artifacts to +To download the artifacts you can use the `aws s3` command. Download the artifacts to `/terraform/aws/jars`. Run the following in `/terraform/aws` ```sh @@ -98,4 +98,37 @@ Switch to `/terraform/aws`. Run `bash fetch_terraform.sh`. After downloading the artifacts and running above script continue with -[Set up your deployment environment](/README.md#set-up-your-deployment-environment) +[Set up your deployment environment](/docs/aws-aggregation-service.md#set-up-your-deployment-environment) + +## Upgrade Terraform AWS provider to `5.x` version + +1. Update the Terraform code to the most recent version in the repository. +2. Remove Terraform variable `compute_type` in `codebuild.auto.tfvars`. +3. Update aws provider version in `main.tf` to the latest `5.x`. + + ```hcl + required_providers { + aws = { + source = "hashicorp/aws" + version = "~> 5.0" + } + } + ``` + +4. Update the locked dependency selections and apply changes. + + ```shell + terraform init -upgrade + terraform apply + ``` + +5. (Optional) Update the Terraform variables `aggregation_service_compute_type` and + `bazel_compute_type` to change the compute type for the bazel or aggregation-service CodeBuild, + if necessary. + +## Terraform variable changes (AWS provider version `3.x`) + +1. Update the Terraform code to the most recent version in the repository. +2. Remove Terraform variable `compute_type` in `codebuild.auto.tfvars`. +3. Set the Terraform variable `aggregation_service_compute_type` to `BUILD_GENERAL1_2XLARGE` in + `codebuild.auto.tfvars`. diff --git a/build-scripts/aws/build-container/DEBIAN_CONTAINER_DIGEST b/build-scripts/aws/build-container/DEBIAN_CONTAINER_DIGEST new file mode 120000 index 00000000..5a8a7c0f --- /dev/null +++ b/build-scripts/aws/build-container/DEBIAN_CONTAINER_DIGEST @@ -0,0 +1 @@ +../../DEBIAN_CONTAINER_DIGEST \ No newline at end of file diff --git a/build-scripts/aws/build-container/Dockerfile b/build-scripts/aws/build-container/Dockerfile index 6c183061..1456beb7 100644 --- a/build-scripts/aws/build-container/Dockerfile +++ b/build-scripts/aws/build-container/Dockerfile @@ -12,42 +12,37 @@ # See the License for the specific language governing permissions and # limitations under the License. -# Based on https://github.com/GoogleCloudPlatform/cloud-builders/blob/2c8cebc3e2dc28ac15b6e06f2887103e32a036ef/bazel/Dockerfile -# Keeps GCLIBC at version 2.28 since Golang Apache Beam only supports up to GLIBC version 2.29 in the harnes container as of 2022s0103 - - -# bookworm stable with latest security updates -FROM debian:bookworm-slim +# bookworm-slim stable +ARG DEBIAN_VERSION +FROM debian@${DEBIAN_VERSION} RUN \ # This makes add-apt-repository available. apt-get update && \ apt-get -y upgrade && \ apt-get -y install \ - python3 \ - python3-pkg-resources \ - python-is-python3 \ 2to3 \ - software-properties-common \ - unzip \ - git \ curl \ + git \ gnupg \ - tree + npm \ + python-is-python3 \ + python3 \ + python3-pkg-resources \ + software-properties-common \ + tree \ + unzip RUN \ # Install OpenJDK apt-get -y install openjdk-17-jdk + RUN \ - # Install bazel 4.2.2 (https://docs.bazel.build/versions/4.2.2/install-ubuntu.html) - echo "deb [arch=amd64] http://storage.googleapis.com/bazel-apt stable jdk1.8" | tee /etc/apt/sources.list.d/bazel.list && \ - curl https://bazel.build/bazel-release.pub.gpg | apt-key add - && \ - apt-get update && \ - apt-get -y install bazel-4.2.2 && \ - apt upgrade -y bazel-4.2.2 + # Install bazel + npm install -g @bazel/bazelisk -# symlink bazel to bazel-4.2.2 binary -RUN ln -s /usr/bin/bazel-4.2.2 /usr/bin/bazel +# symlink bazel to bazelisk binary +RUN ln -s bazelisk /usr/bin/bazel # Unpack bazel for future use. RUN bazel version diff --git a/build-scripts/aws/build-container/buildspec.yml b/build-scripts/aws/build-container/buildspec.yml index 1e1bcd8c..b0305562 100644 --- a/build-scripts/aws/build-container/buildspec.yml +++ b/build-scripts/aws/build-container/buildspec.yml @@ -24,7 +24,7 @@ phases: - cd build-scripts/aws/build-container - echo Build started on `date` - echo Building the Docker image... && docker version - - docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG . + - docker build --build-arg DEBIAN_VERSION=$(cat DEBIAN_CONTAINER_DIGEST) -t $IMAGE_REPO_NAME:$IMAGE_TAG . - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG post_build: commands: diff --git a/build-scripts/aws/buildspec.yml b/build-scripts/aws/buildspec.yml index 7d0d90b2..dfd910f0 100644 --- a/build-scripts/aws/buildspec.yml +++ b/build-scripts/aws/buildspec.yml @@ -20,6 +20,8 @@ env: phases: install: commands: + - mkdir $HOME/.docker + - sed -i 's/ulimit -Hn/# ulimit -Hn/g' /etc/init.d/docker - nohup service docker start & - timeout 15 sh -c "until docker info; do echo .; sleep 1; done" pre_build: @@ -29,8 +31,11 @@ phases: build: commands: - echo Bazel Build started on `date` - - bazel run //worker/aws:worker_mp_aws_prod --//worker/aws:ami_name_flag=aggregation-service-enclave_$(cat VERSION) - - bash build-scripts/aws/set_ami_to_public.sh set_ami_to_public_by_prefix aggregation-service-enclave_$(cat VERSION) $AWS_DEFAULT_REGION $AWS_ACCOUNT_ID + - bazel run //worker/aws:worker_mp_aws_prod --sandbox_writable_path=$HOME/.docker --//worker/aws:ami_name_flag=aggregation-service-enclave_$(cat VERSION) --//worker/aws:aws_region_flag=$AWS_DEFAULT_REGION + - | + if [ "$MAKE_AMI_PUBLIC" = "true" ]; then + bash build-scripts/aws/set_ami_to_public.sh set_ami_to_public_by_prefix aggregation-service-enclave_$(cat VERSION) $AWS_DEFAULT_REGION $AWS_ACCOUNT_ID + fi - cd build-scripts/aws && bash publish.sh post_build: commands: diff --git a/build-scripts/aws/publish.sh b/build-scripts/aws/publish.sh index c41d18f6..84c17e98 100644 --- a/build-scripts/aws/publish.sh +++ b/build-scripts/aws/publish.sh @@ -36,3 +36,7 @@ bazel run //terraform/aws:aws_frontend_cleanup_handler_lambda_release \ bazel run //terraform/aws:local_testing_tool_release \ --//terraform/aws:bucket_flag=$JARS_PUBLISH_BUCKET --//terraform/aws:bucket_path_flag=$JARS_PUBLISH_BUCKET_PATH \ -- --version=$VERSION + +bazel run //terraform/aws:privacy_budget_unit_extraction_tool_release \ +--//terraform/aws:bucket_flag=$JARS_PUBLISH_BUCKET --//terraform/aws:bucket_path_flag=$JARS_PUBLISH_BUCKET_PATH \ +-- --version=$VERSION diff --git a/build-scripts/aws/terraform/.terraform.lock.hcl b/build-scripts/aws/terraform/.terraform.lock.hcl index 13e8c5a9..b4f812d1 100644 --- a/build-scripts/aws/terraform/.terraform.lock.hcl +++ b/build-scripts/aws/terraform/.terraform.lock.hcl @@ -2,40 +2,43 @@ # Manual edits may be lost in future updates. provider "registry.terraform.io/hashicorp/aws" { - version = "3.75.2" - constraints = "~> 3.0" + version = "5.86.0" + constraints = "~> 5.0" hashes = [ - "h1:x0gluX9ZKEmz+JJW3Ut5GgWDFOq/lhs2vkqJ+xt57zs=", - "zh:0e75fb14ec42d69bc46461dd54016bb2487d38da324222cec20863918b8954c4", - "zh:30831a1fe29f005d8b809250b43d09522288db45d474c9d238b26f40bdca2388", - "zh:36163d625ab2999c9cd31ef2475d978f9f033a8dfa0d585f1665f2d6492fac4b", - "zh:48ec39685541e4ddd8ddd196e2cfb72516b87f471d86ac3892bc11f83c573199", - "zh:707b9c8775efd6962b6226d914ab25f308013bba1f68953daa77adca99ff6807", - "zh:72bd9f4609a827afa366c6f119c7dec7d73a35d712dad1457c0497d87bf8d160", - "zh:930e3ae3d0cb152e17ee5a8aee5cb47f7613d6421bc7c22e7f50c19da484a100", + "h1:dVxrQ67Ikqv/1/rfopK/wvCdETlUbQ6ZFuNOH+vEWqs=", + "zh:1587c6a0199dc33d066c13e1628bc0dd966d7d6740cb2007b636524a3ec99430", + "zh:15af46cc5bb43a37c24438cb3a36d44209a89d923ea4d4d631b56b1a89717b26", + "zh:166902101ac1cc8ec4f53e3bdcbab2eac7eb448b1c428c2e622adbf9ce1a679c", + "zh:284d116ac9d4a4de74cd1f52486f00e10bc400d9654f92a8990ea0093c43ff78", + "zh:4135e928f20d456172c8ab4ae3d4d8e411b6feddc94aaa1347c92469d52f1e61", + "zh:72b317d17182c3e0ee72f2851d25565d369cb6ee803b12adc9b6c6d3dbfca8d7", "zh:9b12af85486a96aedd8d7984b0ff811a4b42e3d88dad1a3fb4c0b580d04fa425", - "zh:a19bf49b80101a0f0272b994153eeff8f8c206ecc592707bfbce7563355b6882", - "zh:a34b5d2bbaf52285b0c9a8df6258f4789f4d927ff777e126bdc77e7887abbeaa", - "zh:caad6fd5e79eae33e6d74e38c3b15c28a5482f2a1a8ca46cc1ee70089de61adb", - "zh:f2eae988635030de9a088f8058fbcd91e2014a8312a48b16bfd09a9d69d9d6f7", + "zh:9dd0e80964e215ff658b708be72ccda8a20f63af7eaebdd6f11eb0461633bb03", + "zh:a18e502c16b7b6b216b888eab9a5c66b1ed103847fce6985850e4fc9e364a3e8", + "zh:c239f12648d7f7bbadbf5db0b57aaa9429abe70b574975b581784b4f17b7ed79", + "zh:c5164ca8254b9973ee985a3841a4b1f776844c7dcbc112ab3a88a0096e7e2198", + "zh:d93ac58092c3fffc5ddc688b39721fbfacc353e8965001060a5a1ce934d97246", + "zh:e877f1be2ebe67a2d163b7488f47cff4c95aca9c541ddfa25ad16c6ecc98f6a8", + "zh:eb71af6dfdd2b5670b5b957397a576d6053587c75750c17acc105fb44ed806eb", + "zh:ff6aa4f88f8e789375391bc8c886c636fb3e4a45a3fd7dc291bca17c2b8d4184", ] } provider "registry.terraform.io/hashicorp/local" { - version = "2.2.3" + version = "2.5.2" hashes = [ - "h1:aWp5iSUxBGgPv1UnV5yag9Pb0N+U1I0sZb38AXBFO8A=", - "zh:04f0978bb3e052707b8e82e46780c371ac1c66b689b4a23bbc2f58865ab7d5c0", - "zh:6484f1b3e9e3771eb7cc8e8bab8b35f939a55d550b3f4fb2ab141a24269ee6aa", - "zh:78a56d59a013cb0f7eb1c92815d6eb5cf07f8b5f0ae20b96d049e73db915b238", + "h1:JlMZD6nYqJ8sSrFfEAH0Vk/SL8WLZRmFaMUF9PJK5wM=", + "zh:136299545178ce281c56f36965bf91c35407c11897f7082b3b983d86cb79b511", + "zh:3b4486858aa9cb8163378722b642c57c529b6c64bfbfc9461d940a84cd66ebea", + "zh:4855ee628ead847741aa4f4fc9bed50cfdbf197f2912775dd9fe7bc43fa077c0", + "zh:4b8cd2583d1edcac4011caafe8afb7a95e8110a607a1d5fb87d921178074a69b", + "zh:52084ddaff8c8cd3f9e7bcb7ce4dc1eab00602912c96da43c29b4762dc376038", + "zh:71562d330d3f92d79b2952ffdda0dad167e952e46200c767dd30c6af8d7c0ed3", "zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3", - "zh:8aa9950f4c4db37239bcb62e19910c49e47043f6c8587e5b0396619923657797", - "zh:996beea85f9084a725ff0e6473a4594deb5266727c5f56e9c1c7c62ded6addbb", - "zh:9a7ef7a21f48fabfd145b2e2a4240ca57517ad155017e86a30860d7c0c109de3", - "zh:a63e70ac052aa25120113bcddd50c1f3cfe61f681a93a50cea5595a4b2cc3e1c", - "zh:a6e8d46f94108e049ad85dbed60354236dc0b9b5ec8eabe01c4580280a43d3b8", - "zh:bb112ce7efbfcfa0e65ed97fa245ef348e0fd5bfa5a7e4ab2091a9bd469f0a9e", - "zh:d7bec0da5c094c6955efed100f3fe22fca8866859f87c025be1760feb174d6d9", - "zh:fb9f271b72094d07cef8154cd3d50e9aa818a0ea39130bc193132ad7b23076fd", + "zh:805f81ade06ff68fa8b908d31892eaed5c180ae031c77ad35f82cb7a74b97cf4", + "zh:8b6b3ebeaaa8e38dd04e56996abe80db9be6f4c1df75ac3cccc77642899bd464", + "zh:ad07750576b99248037b897de71113cc19b1a8d0bc235eb99173cc83d0de3b1b", + "zh:b9f1c3bfadb74068f5c205292badb0661e17ac05eb23bfe8bd809691e4583d0e", + "zh:cc4cbcd67414fefb111c1bf7ab0bc4beb8c0b553d01719ad17de9a047adff4d1", ] } diff --git a/build-scripts/aws/terraform/codebuild.tf b/build-scripts/aws/terraform/codebuild.tf index e727b098..f34a7737 100644 --- a/build-scripts/aws/terraform/codebuild.tf +++ b/build-scripts/aws/terraform/codebuild.tf @@ -38,8 +38,17 @@ resource "aws_s3_bucket" "artifacts_output" { } resource "aws_s3_bucket_acl" "artifacts_output" { + bucket = aws_s3_bucket.artifacts_output.id + acl = "private" + depends_on = [aws_s3_bucket_ownership_controls.artifacts_output_ownership_controls] +} + +resource "aws_s3_bucket_ownership_controls" "artifacts_output_ownership_controls" { bucket = aws_s3_bucket.artifacts_output.id - acl = "private" + + rule { + object_ownership = "BucketOwnerPreferred" + } } # Create and manage ECR Repository for build container @@ -191,7 +200,7 @@ resource "aws_codebuild_project" "bazel_build_container" { } environment { - compute_type = var.compute_type + compute_type = var.bazel_compute_type image = "aws/codebuild/standard:6.0" type = "LINUX_CONTAINER" image_pull_credentials_type = "CODEBUILD" @@ -256,7 +265,7 @@ resource "aws_codebuild_project" "aggregation-service-artifacts-build" { } environment { - compute_type = var.compute_type + compute_type = var.aggregation_service_compute_type image = "${aws_ecr_repository.ecr_repository.repository_url}:${local.release_version}" type = "LINUX_CONTAINER" image_pull_credentials_type = "SERVICE_ROLE" @@ -286,6 +295,11 @@ resource "aws_codebuild_project" "aggregation-service-artifacts-build" { name = "JARS_PUBLISH_BUCKET_PATH" value = "aggregation-service" } + + environment_variable { + name = "MAKE_AMI_PUBLIC" + value = tostring(var.make_ami_public) + } } source { @@ -294,6 +308,10 @@ resource "aws_codebuild_project" "aggregation-service-artifacts-build" { git_clone_depth = 1 buildspec = "build-scripts/aws/buildspec.yml" + + git_submodules_config { + fetch_submodules = false + } } source_version = var.aggregation_service_github_repo_branch == "" ? "v${local.release_version}" : var.aggregation_service_github_repo_branch diff --git a/build-scripts/aws/terraform/codebuild_variables.tf b/build-scripts/aws/terraform/codebuild_variables.tf index fbbc32ab..9b896f37 100644 --- a/build-scripts/aws/terraform/codebuild_variables.tf +++ b/build-scripts/aws/terraform/codebuild_variables.tf @@ -30,9 +30,15 @@ variable "region" { description = "Region to deploy services to and publish artifacts" } -variable "compute_type" { +variable "aggregation_service_compute_type" { type = string - description = "CodeBuild compute type to use for build." + description = "CodeBuild compute type to use for Aggregation Service build." + default = "BUILD_GENERAL1_XLARGE" +} + +variable "bazel_compute_type" { + type = string + description = "CodeBuild compute type to use for utility bazel build." default = "BUILD_GENERAL1_MEDIUM" } @@ -68,3 +74,9 @@ variable "aggregation_service_github_repo_branch" { description = "Aggregation Service Github repository branch" default = "" } + +variable "make_ami_public" { + type = bool + description = "Set the AMI and its EBS snapshots to be publicly accessible" + default = false +} diff --git a/build-scripts/aws/terraform/main.tf_sample b/build-scripts/aws/terraform/main.tf_sample index 48835176..078da44e 100644 --- a/build-scripts/aws/terraform/main.tf_sample +++ b/build-scripts/aws/terraform/main.tf_sample @@ -10,15 +10,15 @@ terraform { # state in a remote backend. # backend "s3" { - # bucket = "" - # key = ".tfstate" + # bucket = "" + # key = "" # region = "us-east-1" # } required_providers { aws = { source = "hashicorp/aws" - version = "~> 3.0" + version = "~> 5.0" } } } diff --git a/build-scripts/gcp/README.md b/build-scripts/gcp/README.md new file mode 100644 index 00000000..267ab217 --- /dev/null +++ b/build-scripts/gcp/README.md @@ -0,0 +1,58 @@ +# Building aggregation service artifacts for Google Cloud + +## Prerequisites + +### Set up GCLOUD CLI + +Make sure you [install](https://cloud.google.com/sdk/gcloud) and +[authenticate](https://cloud.google.com/sdk/docs/authorizing#auth-login) the latest gcloud CLI. + +## Building the build container + +The build container is requried for the aggregation service artifacts build. + +To trigger the build, run the following command from the root of the repo: + +```sh +gcloud builds submit --config=build-scripts/gcp/build-container/cloudbuild.yaml --substitutions=_IMAGE_REPO_PATH="",_IMAGE_NAME="bazel-build-container",_IMAGE_TAG=$(cat VERSION) +``` + +The `` is in the form of +`-docker.pkg.dev//`. + +The build can take several minutes. You can check the status at +`https://console.cloud.google.com/cloud-build/builds`. + +## Building artifacts + +To build the aggregation service artifacts the above build container is required. Make sure the +build for the build container ran successful before starting the build for the aggregation service +artifacts. + +To trigger the artifacts build, run the following command from the root of the repo: + +```sh +gcloud builds submit --config=build-scripts/gcp/cloudbuild.yaml --substitutions=_BUILD_IMAGE_REPO_PATH="",_IMAGE_REPO_PATH="",_IMAGE_NAME="worker_mp_gcp_prod",_IMAGE_TAG=$(cat VERSION),_JARS_PUBLISH_BUCKET="",_JARS_PUBLISH_BUCKET_PATH="aggregation-service",_VERSION=$(cat VERSION) +``` + +The build can take several minutes. You can check the status at +`https://console.cloud.google.com/cloud-build/builds`. + +## Download artifacts + +To download the artifacts you can use the `gsutil` command. Download the artifacts to +`/terraform/gcp/jars`. Run the following in `/terraform/gcp` + +```sh +mkdir -p jars +gsutil cp -r gs:///aggregation-service/$(cat ../../VERSION)/ jars/ +``` + +### Fetch Aggregation Service Terraform + +Switch to `/terraform/gcp`. + +Run `bash fetch_terraform.sh`. + +After downloading the artifacts and running above script continue with +[Set up your deployment environment](/docs/gcp-aggregation-service.md#set-up-your-deployment-environment) diff --git a/build-scripts/gcp/build-container/DEBIAN_CONTAINER_DIGEST b/build-scripts/gcp/build-container/DEBIAN_CONTAINER_DIGEST new file mode 120000 index 00000000..5a8a7c0f --- /dev/null +++ b/build-scripts/gcp/build-container/DEBIAN_CONTAINER_DIGEST @@ -0,0 +1 @@ +../../DEBIAN_CONTAINER_DIGEST \ No newline at end of file diff --git a/build-scripts/gcp/build-container/Dockerfile b/build-scripts/gcp/build-container/Dockerfile new file mode 100644 index 00000000..007679f1 --- /dev/null +++ b/build-scripts/gcp/build-container/Dockerfile @@ -0,0 +1,71 @@ +# Copyright 2023 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# bookworm-slim stable +ARG DEBIAN_VERSION +FROM debian@${DEBIAN_VERSION} + +RUN \ + # This makes add-apt-repository available. + apt-get update && \ + apt-get -y upgrade && \ + apt-get -y install \ + 2to3 \ + curl \ + git \ + gnupg \ + npm \ + python-is-python3 \ + python3 \ + python3-pkg-resources \ + software-properties-common \ + tree \ + unzip + +RUN \ + # Install OpenJDK + apt-get -y install openjdk-17-jdk +RUN \ + # Install bazel + npm install -g @bazel/bazelisk + +# symlink bazel to bazelisk binary +RUN ln -s bazelisk /usr/bin/bazel + +RUN \ + # Install Docker (https://docs.docker.com/engine/install/debian/) + apt-get -y install \ + apt-transport-https \ + ca-certificates \ + lsb-release +RUN \ + curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg && \ + echo \ + "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \ + $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null && \ + apt-get update && \ + apt-get install -y docker-ce docker-ce-cli + +RUN \ + echo "deb [signed-by=/usr/share/keyrings/cloud.google.asc] https://packages.cloud.google.com/apt cloud-sdk main" | tee -a /etc/apt/sources.list.d/google-cloud-sdk.list && \ + curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | tee /usr/share/keyrings/cloud.google.asc && \ + apt-get update && apt-get -y install google-cloud-cli && \ + apt-get -y autoclean && apt-get -y autoremove + +# Store the Bazel outputs under /workspace so that the symlinks under bazel-bin (et al) are accessible +# to downstream build steps. +RUN mkdir -p /workspace +RUN echo 'startup --output_base=/workspace/.bazel' > ~/.bazelrc + +ENTRYPOINT ["bazel"] diff --git a/build-scripts/gcp/build-container/cloudbuild.yaml b/build-scripts/gcp/build-container/cloudbuild.yaml new file mode 100644 index 00000000..aab756b6 --- /dev/null +++ b/build-scripts/gcp/build-container/cloudbuild.yaml @@ -0,0 +1,22 @@ +# Copyright 2023 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +steps: +- name: 'gcr.io/cloud-builders/docker' + script: | + docker build --build-arg DEBIAN_VERSION=$(cat DEBIAN_CONTAINER_DIGEST) -t $_IMAGE_REPO_PATH/$_IMAGE_NAME:$_IMAGE_TAG . + automapSubstitutions: true + dir: build-scripts/gcp/build-container +images: +- '$_IMAGE_REPO_PATH/$_IMAGE_NAME:$_IMAGE_TAG' diff --git a/build-scripts/gcp/cloudbuild.yaml b/build-scripts/gcp/cloudbuild.yaml new file mode 100644 index 00000000..dc8ba284 --- /dev/null +++ b/build-scripts/gcp/cloudbuild.yaml @@ -0,0 +1,34 @@ +# Copyright 2023 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +steps: +- name: '$_BUILD_IMAGE_REPO_PATH/bazel-build-container:$_VERSION' + script: | + bazel run worker/gcp:worker_mp_gcp_prod -- -dst "$_IMAGE_REPO_PATH/$_IMAGE_NAME:$_IMAGE_TAG" + bazel run //terraform/gcp:frontend_service_http_cloud_function_release \ + --//terraform/gcp:bucket_flag=$_JARS_PUBLISH_BUCKET --//terraform/gcp:bucket_path_flag=$_JARS_PUBLISH_BUCKET_PATH \ + -- --version=$_VERSION + bazel run //terraform/gcp:worker_scale_in_cloud_function_release \ + --//terraform/gcp:bucket_flag=$_JARS_PUBLISH_BUCKET --//terraform/gcp:bucket_path_flag=$_JARS_PUBLISH_BUCKET_PATH \ + -- --version=$_VERSION + bazel run //terraform/gcp:local_testing_tool_release \ + --//terraform/gcp:bucket_flag=$_JARS_PUBLISH_BUCKET --//terraform/gcp:bucket_path_flag=$_JARS_PUBLISH_BUCKET_PATH \ + -- --version=$_VERSION + bazel run //terraform/gcp:privacy_budget_unit_extraction_tool_release \ + --//terraform/gcp:bucket_flag=$_JARS_PUBLISH_BUCKET --//terraform/gcp:bucket_path_flag=$_JARS_PUBLISH_BUCKET_PATH \ + -- --version=$_VERSION + automapSubstitutions: true + +options: + machineType: "E2_HIGHCPU_32" diff --git a/build_defs/container_dependencies.bzl b/build_defs/container_dependencies.bzl new file mode 100644 index 00000000..2f81baec --- /dev/null +++ b/build_defs/container_dependencies.bzl @@ -0,0 +1,50 @@ +# Copyright 2023 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +################################################################################ +# The following map contains container dependencies used by the `container_pull` +# bazel rules. Docker images under the corresponding repository will be pulled +# based on the image digest. +# +# Container dependencies: +# - amazonlinux_2: The official Amazon Linux image; needed for reproducibly +# building AL2 binaries (e.g. //cc/aws/proxy) +# - aws_otel_collector: AWS OpenTelemetry Collector. +# - java_base: Distroless image for running Java. +################################################################################ + +# Updated as of: 2025-03-19 + +CONTAINER_DEPS = { + "amazonlinux_2": { + "digest": "sha256:6f5f1a86b54c965ce6547fbb5fea13125be4f14cef8aeb627c27bdc3af203522", + "registry": "index.docker.io", + "repository": "amazonlinux", + }, + "aws_otel_collector": { + "digest": "sha256:2a6183f63e637b940584e8ebf5335bd9a2581ca16ee400e2e74b7b488825adb4", + "registry": "public.ecr.aws", + "repository": "aws-observability/aws-otel-collector", + }, + "java_base": { + "digest": "sha256:587ce66b08faea2e2e1568d6bb6c5fd6b085909621f4c14762206d687ff7d202", + "registry": "gcr.io", + "repository": "distroless/java17-debian11", + }, + "java_base_gcp": { + "digest": "sha256:b620ae24437cb21b69c5b53ddf05be4436070e3800482a8bf240116051ec451e", + "registry": "gcr.io", + "repository": "distroless/java17-debian12", + }, +} diff --git a/build_defs/googleapis.patch b/build_defs/googleapis.patch new file mode 100644 index 00000000..2cce81fc --- /dev/null +++ b/build_defs/googleapis.patch @@ -0,0 +1,128 @@ +diff --git a/BUILD.bazel b/BUILD.bazel +index 95e4c12e5..a901fd573 100644 +--- a/BUILD.bazel ++++ b/BUILD.bazel +@@ -1,3 +1,7 @@ ++package(default_visibility = ["//visibility:public"]) ++ ++licenses(["notice"]) # Apache 2.0 ++ + genrule( + name = "build_gen", + outs = ["build_gen.sh"], +@@ -16,3 +20,15 @@ EOD + fi + """, + ) ++ ++# This build file overlays on top of the BUILD files for the googleapis repo, ++# and it adds a target that lets us include their header files using ++# angle-brackets, thus treating their headers as system includes. This allows ++# us to dial-up the warnings in our own code, without seeing compiler warnings ++# from their headers, which we do not own. ++cc_library( ++ name = "googleapis_system_includes", ++ includes = [ ++ ".", ++ ], ++) +diff --git a/MODULE.bazel b/MODULE.bazel +new file mode 100644 +index 000000000..169133e43 +--- /dev/null ++++ b/MODULE.bazel +@@ -0,0 +1,29 @@ ++module( ++ name = "googleapis", ++ version = "0.0.0-20240819-fe8ba054a", ++ repo_name = "com_google_googleapis", ++) ++ ++bazel_dep(name = "grpc", version = "1.66.0.bcr.2", repo_name = "com_github_grpc_grpc") ++bazel_dep(name = "grpc-java", version = "1.66.0", repo_name = "io_grpc_grpc_java") ++bazel_dep(name = "protobuf", version = "21.7", repo_name = "com_google_protobuf") ++bazel_dep(name = "rules_go", version = "0.46.0", repo_name = "io_bazel_rules_go") ++bazel_dep(name = "rules_proto", version = "5.3.0-21.7") ++bazel_dep(name = "rules_python", version = "0.31.0") ++ ++switched_rules = use_extension("//:extensions.bzl", "switched_rules") ++ ++# TODO: Enable support for other languages with bzlmod ++switched_rules.use_languages( ++ cc = True, ++ # csharp = True, ++ # gapic = True, ++ # go = True, ++ grpc = True, ++ java = True, ++ # nodejs = True, ++ # php = True, ++ # python = True, ++ # ruby = True, ++) ++use_repo(switched_rules, "com_google_googleapis_imports") +diff --git a/extensions.bzl b/extensions.bzl +new file mode 100644 +index 000000000..9aa161841 +--- /dev/null ++++ b/extensions.bzl +@@ -0,0 +1,59 @@ ++load(":repository_rules.bzl", "switched_rules_by_language") ++ ++_use_languages_tag = tag_class( ++ attrs = { ++ "cc": attr.bool(default = False), ++ "csharp": attr.bool(default = False), ++ "gapic": attr.bool(default = False), ++ "go": attr.bool(default = False), ++ "go_test": attr.bool(default = False), ++ "grpc": attr.bool(default = False), ++ "java": attr.bool(default = False), ++ "nodejs": attr.bool(default = False), ++ "php": attr.bool(default = False), ++ "python": attr.bool(default = False), ++ "ruby": attr.bool(default = False), ++ }, ++) ++ ++def _switched_rules_impl(ctx): ++ attrs = {} ++ for module in ctx.modules: ++ if not module.is_root: ++ continue ++ ++ is_tag_set = False ++ set_tag_name = "" ++ ++ for t in module.tags.use_languages: ++ if is_tag_set: ++ fail("Multiple use_language tags are set in the root module: '{}' and '{}'. Only one is allowed.".format(set_tag_name, module.name)) ++ ++ is_tag_set = True ++ set_tag_name = module.name ++ ++ attrs = { ++ "cc": t.cc, ++ "csharp": t.csharp, ++ "gapic": t.gapic, ++ "go": t.go, ++ "go_test": t.go_test, ++ "grpc": t.grpc, ++ "java": t.java, ++ "nodejs": t.nodejs, ++ "php": t.php, ++ "python": t.python, ++ "ruby": t.ruby, ++ } ++ ++ switched_rules_by_language( ++ name = "com_google_googleapis_imports", ++ **attrs ++ ) ++ ++switched_rules = module_extension( ++ implementation = _switched_rules_impl, ++ tag_classes = { ++ "use_languages": _use_languages_tag, ++ }, ++) \ No newline at end of file diff --git a/build_defs/pbs_loadtest.bzl b/build_defs/pbs_loadtest.bzl new file mode 100644 index 00000000..b36c5ad5 --- /dev/null +++ b/build_defs/pbs_loadtest.bzl @@ -0,0 +1,43 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("@io_bazel_rules_docker//container:container.bzl", "container_image", "container_push") + +def pbs_loadtest_container( + *, + name, + cmd = [], + files = [], + entrypoint = [], + labels = {}): + docker_target_name = "%s_container" % name + + container_image( + name = docker_target_name, + base = "@java_base_debug//image", + cmd = cmd, + entrypoint = entrypoint, + files = files, + labels = labels, + ) + + # registry,repository,tag will be assigned by "-dst" argument. + container_push( + name = name, + format = "Docker", + image = docker_target_name, + registry = "", + repository = "", + tag = "", + ) diff --git a/build_defs/release.bzl b/build_defs/release.bzl index 72cabb9b..f6dfcc8c 100644 --- a/build_defs/release.bzl +++ b/build_defs/release.bzl @@ -1,4 +1,4 @@ -# Copyright 2022 Google LLC +# Copyright 2023 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -15,6 +15,7 @@ load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo") def _s3_jar_release_impl(ctx): jar_file = ctx.file.jar_target + licenses = ctx.file.licenses script_template = """#!/bin/bash set -eux # parse arguments and set up variables @@ -49,26 +50,30 @@ echo "bazel working directory:" pwd echo "-------------------------" outputfile=$(mktemp) +jar uf {jar_file} {licenses} aws s3 cp {jar_file} s3://{release_bucket}/{release_key}/$version/$artifact_name 2>&1 | tee $outputfile if grep -q "Skipping" "$outputfile"; then echo "ERROR: Artifact already exists" exit 1 fi +openssl sha256 {jar_file} || true """ script = ctx.actions.declare_file("%s_script.sh" % ctx.label.name) script_content = script_template.format( jar_file = jar_file.short_path, release_bucket = ctx.attr.release_bucket[BuildSettingInfo].value, release_key = ctx.attr.release_key[BuildSettingInfo].value, + licenses = licenses.short_path, artifact_base_name = ctx.attr.artifact_base_name, ) ctx.actions.write(script, script_content, is_executable = True) runfiles = ctx.runfiles(files = [ jar_file, + licenses, ]) return [DefaultInfo( executable = script, - files = depset([script, jar_file]), + files = depset([script, jar_file, licenses]), runfiles = runfiles, )] @@ -83,6 +88,10 @@ s3_jar_release_rule = rule( mandatory = True, providers = [BuildSettingInfo], ), + "licenses": attr.label( + allow_single_file = True, + mandatory = True, + ), "release_bucket": attr.label( mandatory = True, providers = [BuildSettingInfo], @@ -99,6 +108,7 @@ def s3_jar_release( *, name, jar_target = ":jar_target_flag", + licenses = ":licenses_flag", release_bucket = ":bucket_flag", release_key = ":bucket_path_flag", artifact_base_name): @@ -114,16 +124,142 @@ def s3_jar_release( Args: name: The target name used to generate the targets described above. jar_target: Path to the jar build target. + licenses: Licenses that should be packaged with the release jar. release_bucket: s3 bucket to which the release the artifact. release_key: s3 key for the release artifact. artifact_base_name: base name of the artifact. The base name should include a "{VERSION}" substring which will be - replaced with the version argument. e.g. "AwsChangeHandlerLambda-{VERSION}.tgz". - gcloud_sdk: Path to google cloud sdk for linux. + replaced with the version argument. e.g. "AwsChangeHandlerLambda_{VERSION}.tgz". """ s3_jar_release_rule( + name = name, + jar_target = jar_target, + licenses = licenses, + release_bucket = release_bucket, + release_key = release_key, + artifact_base_name = artifact_base_name, + ) + +def _gcs_jar_release_impl(ctx): + jar_file = ctx.file.jar_target + licenses = ctx.file.licenses + script_template = """#!/bin/bash +set -eux +# parse arguments and set up variables +artifact_base_name="{artifact_base_name}" +version="" +for ARGUMENT in "$@" +do + case $ARGUMENT in + --version=*) + version=$(echo $ARGUMENT | cut -f2 -d=) + ;; + *) + printf "ERROR: invalid argument $ARGUMENT\n" + exit 1 + ;; + esac +done +## check variables and arguments +if [[ "$version" == "" ]]; then + printf "ERROR: --version argument is not provided\n" + exit 1 +fi +if [[ "$artifact_base_name" != *"{{VERSION}}"* ]]; then + printf "ERROR: artifact_base_name must include {{VERSION}} substring\n" + exit 1 +fi +artifact_name=$(echo $artifact_base_name | sed -e "s/{{VERSION}}/$version/g") +# upload artifact to gcs +echo "Preparing release jar to gcs" +gsutil --version +echo "bazel working directory:" +pwd +echo "-------------------------" +outputfile=$(mktemp) +jar uf {jar_file} {licenses} +gsutil cp {jar_file} gs://{release_bucket}/{release_key}/$version/$artifact_name 2>&1 | tee $outputfile +if grep -q "Skipping" "$outputfile"; then + echo "ERROR: Artifact already exists" + exit 1 +fi +openssl sha256 {jar_file} || true +""" + script = ctx.actions.declare_file("%s_script.sh" % ctx.label.name) + script_content = script_template.format( + jar_file = jar_file.short_path, + release_bucket = ctx.attr.release_bucket[BuildSettingInfo].value, + release_key = ctx.attr.release_key[BuildSettingInfo].value, + licenses = licenses.short_path, + artifact_base_name = ctx.attr.artifact_base_name, + ) + ctx.actions.write(script, script_content, is_executable = True) + runfiles = ctx.runfiles(files = [ + jar_file, + licenses, + ]) + return [DefaultInfo( + executable = script, + files = depset([script, jar_file, licenses]), + runfiles = runfiles, + )] + +gcs_jar_release_rule = rule( + implementation = _gcs_jar_release_impl, + attrs = { + "artifact_base_name": attr.string( + mandatory = True, + ), + "jar_target": attr.label( + allow_single_file = True, + mandatory = True, + providers = [BuildSettingInfo], + ), + "licenses": attr.label( + allow_single_file = True, + mandatory = True, + ), + "release_bucket": attr.label( + mandatory = True, + providers = [BuildSettingInfo], + ), + "release_key": attr.label( + mandatory = True, + providers = [BuildSettingInfo], + ), + }, + executable = True, +) + +def gcs_jar_release( + *, + name, + jar_target = ":jar_target_flag", + release_bucket = ":bucket_flag", + release_key = ":bucket_path_flag", + licenses = ":licenses_flag", + artifact_base_name): + """ + Creates targets for releasing aggregation service artifact to gcs. + This rule only accepts releasing one artifact (e.g. a jar file). The path in which the artifact is stored + is specified by the gcs bucket name, key, artifact base name, and version. The naming convention is as below: + `gs://bucket/key/VERSION/name_of_artifact_VERSION.tgz` + targets: + 1. '%s_script.sh': script for running gsutil cli to copy code package to gcs. + 2. artifact file: the package file being uploaded to gcs. This is built from the + specified build target (e.g. a `pkg_tar` target). + Args: + name: The target name used to generate the targets described above. + jar_target: Path to the jar build target. + release_bucket: gcs bucket to which the release the artifact. + release_key: gcs key for the release artifact. + artifact_base_name: base name of the artifact. The base name should include a "{VERSION}" substring which will be + replaced with the version argument. e.g. "WorkerScaleInCloudFunction_{VERSION}.tgz". + """ + gcs_jar_release_rule( name = name, jar_target = jar_target, release_bucket = release_bucket, release_key = release_key, + licenses = licenses, artifact_base_name = artifact_base_name, ) diff --git a/build_defs/shared_libraries/BUILD b/build_defs/shared_libraries/BUILD new file mode 100644 index 00000000..29cc47f4 --- /dev/null +++ b/build_defs/shared_libraries/BUILD @@ -0,0 +1,17 @@ +# Copyright 2023 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +package(default_visibility = ["//visibility:public"]) + +exports_files(glob(["*.patch"])) diff --git a/build_defs/shared_libraries/client_config_fix.patch b/build_defs/shared_libraries/client_config_fix.patch new file mode 100644 index 00000000..d8fce344 --- /dev/null +++ b/build_defs/shared_libraries/client_config_fix.patch @@ -0,0 +1,259 @@ +diff --git a/java/com/google/scp/operator/cpio/configclient/aws/Aws2GcpOperatorClientConfigModule.java b/java/com/google/scp/operator/cpio/configclient/aws/Aws2GcpOperatorClientConfigModule.java +index 5b58d3783..482d458f4 100644 +--- a/java/com/google/scp/operator/cpio/configclient/aws/Aws2GcpOperatorClientConfigModule.java ++++ b/java/com/google/scp/operator/cpio/configclient/aws/Aws2GcpOperatorClientConfigModule.java +@@ -124,7 +124,7 @@ public final class Aws2GcpOperatorClientConfigModule extends AbstractModule { + coordinatorBCredentials, + config + .coordinatorBEncryptionKeyServiceCloudfunctionUrl() +- .orElse(config.coordinatorBEncryptionKeyServiceBaseUrl().get())); ++ .orElse(config.coordinatorBEncryptionKeyServiceBaseUrl())); + } + + /** Provider for a {@code AwsSessionCredentialsProvider} class to access coordinator A. */ +diff --git a/java/com/google/scp/operator/cpio/configclient/common/OperatorClientConfig.java b/java/com/google/scp/operator/cpio/configclient/common/OperatorClientConfig.java +index 8a7a70502..4f881ac7f 100644 +--- a/java/com/google/scp/operator/cpio/configclient/common/OperatorClientConfig.java ++++ b/java/com/google/scp/operator/cpio/configclient/common/OperatorClientConfig.java +@@ -32,12 +32,12 @@ public abstract class OperatorClientConfig { + } + + /** CoordinatorA Workload Identity Pool Provider. */ +- public abstract String coordinatorAWipProvider(); ++ public abstract Optional coordinatorAWipProvider(); + + /** + * CoordinatorA Service Account which TEE can impersonate and has access to protected resources. + */ +- public abstract String coordinatorAServiceAccountToImpersonate(); ++ public abstract Optional coordinatorAServiceAccountToImpersonate(); + + /** CoordinatorB Workload Identity Pool Provider. */ + public abstract Optional coordinatorBWipProvider(); +@@ -54,7 +54,7 @@ public abstract class OperatorClientConfig { + public abstract String coordinatorAEncryptionKeyServiceBaseUrl(); + + /** Coordinator B encryption key service url */ +- public abstract Optional coordinatorBEncryptionKeyServiceBaseUrl(); ++ public abstract String coordinatorBEncryptionKeyServiceBaseUrl(); + + /** Coordinator A encryption key service cloudfunction url */ + public abstract Optional coordinatorAEncryptionKeyServiceCloudfunctionUrl(); +@@ -67,11 +67,11 @@ public abstract class OperatorClientConfig { + public abstract static class Builder { + + /** Set the CoordinatorA Workload Identity Pool Provider. */ +- public abstract Builder setCoordinatorAWipProvider(String coordinatorAWipProvider); ++ public abstract Builder setCoordinatorAWipProvider(Optional coordinatorAWipProvider); + + /** Set the CoordinatorA Service Account which can be impersonated by TEE. */ + public abstract Builder setCoordinatorAServiceAccountToImpersonate( +- String coordinatorAServiceAccountToImpersonate); ++ Optional coordinatorAServiceAccountToImpersonate); + + /** Set the CoordinatorB Workload Identity Pool Provider. */ + public abstract Builder setCoordinatorBWipProvider(Optional coordinatorBWipProvider); +@@ -89,7 +89,7 @@ public abstract class OperatorClientConfig { + + /** Set coordinator B encryption key service base url */ + public abstract Builder setCoordinatorBEncryptionKeyServiceBaseUrl( +- Optional coordinatorBEncryptionKeyServiceBaseUrl); ++ String coordinatorBEncryptionKeyServiceBaseUrl); + + /** Set coordinator A encryption key service base url */ + public abstract Builder setCoordinatorAEncryptionKeyServiceCloudfunctionUrl( +diff --git a/java/com/google/scp/operator/cpio/configclient/gcp/GcpOperatorClientConfigModule.java b/java/com/google/scp/operator/cpio/configclient/gcp/GcpOperatorClientConfigModule.java +index 4b74c418c..88b3752b4 100644 +--- a/java/com/google/scp/operator/cpio/configclient/gcp/GcpOperatorClientConfigModule.java ++++ b/java/com/google/scp/operator/cpio/configclient/gcp/GcpOperatorClientConfigModule.java +@@ -49,7 +49,8 @@ public final class GcpOperatorClientConfigModule extends AbstractModule { + return GoogleCredentials.getApplicationDefault(); + } + return CredentialsHelper.getAttestedCredentials( +- config.coordinatorAWipProvider(), config.coordinatorAServiceAccountToImpersonate()); ++ config.coordinatorAWipProvider().get(), ++ config.coordinatorAServiceAccountToImpersonate().get()); + } + + /** +@@ -60,9 +61,7 @@ public final class GcpOperatorClientConfigModule extends AbstractModule { + @CoordinatorBCredentials + @Singleton + GoogleCredentials provideCoordinatorBCredentials(OperatorClientConfig config) throws IOException { +- // For single party solution, we will not have coordinatorB details, so use default +- // credentials. These are not used for single party solution. +- if (config.useLocalCredentials() || config.coordinatorBWipProvider().isEmpty()) { ++ if (config.useLocalCredentials()) { + return GoogleCredentials.getApplicationDefault(); + } + return CredentialsHelper.getAttestedCredentials( +@@ -88,13 +87,10 @@ public final class GcpOperatorClientConfigModule extends AbstractModule { + @Singleton + public HttpClientWrapper provideCoordinatorBHttpClient(OperatorClientConfig config) + throws IOException { +- if (config.coordinatorBEncryptionKeyServiceBaseUrl().isPresent()) { +- return getHttpClientWrapper( +- config +- .coordinatorBEncryptionKeyServiceCloudfunctionUrl() +- .orElse(config.coordinatorBEncryptionKeyServiceBaseUrl().get())); +- } +- return HttpClientWrapper.createDefault(); ++ return getHttpClientWrapper( ++ config ++ .coordinatorBEncryptionKeyServiceCloudfunctionUrl() ++ .orElse(config.coordinatorBEncryptionKeyServiceBaseUrl())); + } + + @Override +@@ -102,9 +98,9 @@ public final class GcpOperatorClientConfigModule extends AbstractModule { + install(new GcpClientConfigModule()); + } + +- private static HttpClientWrapper getHttpClientWrapper(String url) throws IOException { ++ private static HttpClientWrapper getHttpClientWrapper(String audience) throws IOException { + return HttpClientWrapper.builder() +- .setInterceptor(GcpHttpInterceptorUtil.createHttpInterceptor(url)) ++ .setInterceptor(GcpHttpInterceptorUtil.createHttpInterceptor(audience)) + .setExponentialBackoff( + COORDINATOR_HTTPCLIENT_RETRY_INITIAL_INTERVAL, + COORDINATOR_HTTPCLIENT_RETRY_MULTIPLIER, +diff --git a/java/com/google/scp/operator/worker/SimpleWorkerModule.java b/java/com/google/scp/operator/worker/SimpleWorkerModule.java +index 40a071117..e0b6694e3 100644 +--- a/java/com/google/scp/operator/worker/SimpleWorkerModule.java ++++ b/java/com/google/scp/operator/worker/SimpleWorkerModule.java +@@ -25,8 +25,8 @@ import com.google.scp.operator.cpio.blobstorageclient.aws.S3BlobStorageClientMod + import com.google.scp.operator.cpio.blobstorageclient.gcp.Annotations.GcsEndpointUrl; + import com.google.scp.operator.cpio.configclient.Annotations.CoordinatorARegionBindingOverride; + import com.google.scp.operator.cpio.configclient.Annotations.CoordinatorBRegionBindingOverride; +-import com.google.scp.operator.cpio.configclient.common.OperatorClientConfig; + import com.google.scp.operator.cpio.configclient.Annotations.TrustedServicesClientVersion; ++import com.google.scp.operator.cpio.configclient.common.OperatorClientConfig; + import com.google.scp.operator.cpio.configclient.local.Annotations.CoordinatorARoleArn; + import com.google.scp.operator.cpio.configclient.local.Annotations.CoordinatorBRoleArn; + import com.google.scp.operator.cpio.configclient.local.Annotations.CoordinatorKmsArnParameter; +@@ -266,26 +266,22 @@ public final class SimpleWorkerModule extends AbstractModule { + } + OperatorClientConfig.Builder configBuilder = + OperatorClientConfig.builder() +- .setCoordinatorAServiceAccountToImpersonate(args.getCoordinatorAServiceAccount()) +- .setCoordinatorAWipProvider(args.getCoordinatorAWipProvider()) ++ .setCoordinatorAServiceAccountToImpersonate( ++ Optional.of(args.getCoordinatorAServiceAccount())) ++ .setCoordinatorBServiceAccountToImpersonate( ++ Optional.of(args.getCoordinatorBServiceAccount())) ++ .setCoordinatorAWipProvider(Optional.of(args.getCoordinatorAWipProvider())) ++ .setCoordinatorBWipProvider(Optional.of(args.getCoordinatorBWipProvider())) + .setUseLocalCredentials(args.getCoordinatorAWipProvider().isEmpty()) + .setCoordinatorAEncryptionKeyServiceBaseUrl( + args.getPrimaryEncryptionKeyServiceBaseUrl()) ++ .setCoordinatorBEncryptionKeyServiceBaseUrl( ++ args.getSecondaryEncryptionKeyServiceBaseUrl()) + .setCoordinatorAEncryptionKeyServiceCloudfunctionUrl( +- args.getPrimaryEncryptionKeyServiceCloudfunctionUrl()); +- if (!args.getCoordinatorBWipProvider().isEmpty()) { +- configBuilder.setCoordinatorBWipProvider(Optional.of(args.getCoordinatorBWipProvider())); +- } +- if (!args.getCoordinatorBServiceAccount().isEmpty()) { +- configBuilder.setCoordinatorBServiceAccountToImpersonate( +- Optional.of(args.getCoordinatorBServiceAccount())); +- } +- if (!args.getSecondaryEncryptionKeyServiceBaseUrl().isEmpty()) { +- configBuilder.setCoordinatorBEncryptionKeyServiceBaseUrl( +- Optional.of(args.getSecondaryEncryptionKeyServiceBaseUrl())); +- } +- configBuilder.setCoordinatorBEncryptionKeyServiceCloudfunctionUrl( +- args.getSecondaryEncryptionKeyServiceCloudfunctionUrl()); ++ args.getPrimaryEncryptionKeyServiceCloudfunctionUrl()) ++ .setCoordinatorBEncryptionKeyServiceCloudfunctionUrl( ++ args.getSecondaryEncryptionKeyServiceCloudfunctionUrl()); ++ + bind(OperatorClientConfig.class).toInstance(configBuilder.build()); + install(args.getClientConfigSelector().getClientConfigGuiceModule()); + +diff --git a/java/com/google/scp/shared/gcp/util/GcpHttpInterceptorUtil.java b/java/com/google/scp/shared/gcp/util/GcpHttpInterceptorUtil.java +index 3a3255d16..fbf63f0ca 100644 +--- a/java/com/google/scp/shared/gcp/util/GcpHttpInterceptorUtil.java ++++ b/java/com/google/scp/shared/gcp/util/GcpHttpInterceptorUtil.java +@@ -16,32 +16,32 @@ import org.apache.hc.core5.http.protocol.HttpContext; + public final class GcpHttpInterceptorUtil { + + /** Create http interceptor for gcp http clients with url as audience */ +- public static org.apache.http.HttpRequestInterceptor createHttpInterceptor(String url) ++ public static org.apache.http.HttpRequestInterceptor createHttpInterceptor(String audience) + throws IOException { +- return createHttpInterceptor(GoogleCredentials.getApplicationDefault(), url); ++ return createHttpInterceptor(GoogleCredentials.getApplicationDefault(), audience); + } + + public static org.apache.http.HttpRequestInterceptor createHttpInterceptor( +- GoogleCredentials credentials, String url) { +- return new GcpHttpInterceptor(credentials, url); ++ GoogleCredentials credentials, String audience) { ++ return new GcpHttpInterceptor(credentials, audience); + } + + /** + * Create HTTP Interceptor for GCP HTTP clients with url as audience. This is for use when + * communicating with the PBS server - not with GCP directly. + * +- * @param url The TargetAudience url to use ++ * @param audience The TargetAudience url to use + * @return A HttpRequestInterceptor that applies the generated GCP AccessToken to the intercepted + * HTTP request. + */ + public static org.apache.hc.core5.http.HttpRequestInterceptor createPbsHttpInterceptor( +- GoogleCredentials credentials, String url) { +- return new GcpPbsHttpInterceptor(credentials, url); ++ GoogleCredentials credentials, String audience) { ++ return new GcpPbsHttpInterceptor(credentials, audience); + } + +- public static org.apache.hc.core5.http.HttpRequestInterceptor createPbsHttpInterceptor(String url) +- throws IOException { +- return new GcpPbsHttpInterceptor(GoogleCredentials.getApplicationDefault(), url); ++ public static org.apache.hc.core5.http.HttpRequestInterceptor createPbsHttpInterceptor( ++ String audience) throws IOException { ++ return new GcpPbsHttpInterceptor(GoogleCredentials.getApplicationDefault(), audience); + } + + private abstract static class GcpHttpInterceptorBase { +@@ -50,13 +50,13 @@ public final class GcpHttpInterceptorUtil { + + public GcpHttpInterceptorBase( + GoogleCredentials sourceCredentials, +- String url, ++ String audience, + Consumer... extraSettings) { + + IdTokenCredentials.Builder builder = + IdTokenCredentials.newBuilder() + .setIdTokenProvider((IdTokenProvider) sourceCredentials) +- .setTargetAudience(url) ++ .setTargetAudience(audience) + // Setting the ID token options. + .setOptions( + Arrays.asList(Option.FORMAT_FULL, Option.LICENSES_TRUE, Option.INCLUDE_EMAIL)); +@@ -75,8 +75,8 @@ public final class GcpHttpInterceptorUtil { + private static final class GcpHttpInterceptor extends GcpHttpInterceptorBase + implements org.apache.http.HttpRequestInterceptor { + +- public GcpHttpInterceptor(GoogleCredentials sourceCredentials, String url) { +- super(sourceCredentials, url); ++ public GcpHttpInterceptor(GoogleCredentials sourceCredentials, String audience) { ++ super(sourceCredentials, audience); + } + + @Override +@@ -90,10 +90,10 @@ public final class GcpHttpInterceptorUtil { + private static final class GcpPbsHttpInterceptor extends GcpHttpInterceptorBase + implements org.apache.hc.core5.http.HttpRequestInterceptor { + +- public GcpPbsHttpInterceptor(GoogleCredentials sourceCredentials, String url) { ++ public GcpPbsHttpInterceptor(GoogleCredentials sourceCredentials, String audience) { + super( + sourceCredentials, +- url, ++ audience, + builder -> + builder + .setExpirationMargin(Duration.ofMinutes(10)) diff --git a/build_defs/shared_libraries/coordinator.patch b/build_defs/shared_libraries/coordinator.patch new file mode 100644 index 00000000..4e028d49 --- /dev/null +++ b/build_defs/shared_libraries/coordinator.patch @@ -0,0 +1,4 @@ +diff --git a/cc/tools/build/build_container_params.bzl.prebuilt b/cc/tools/build/build_container_params.bzl +similarity index 100% +rename from cc/tools/build/build_container_params.bzl.prebuilt +rename to cc/tools/build/build_container_params.bzl diff --git a/build_defs/shared_libraries/emulator_container.patch b/build_defs/shared_libraries/emulator_container.patch new file mode 100644 index 00000000..f5954f65 --- /dev/null +++ b/build_defs/shared_libraries/emulator_container.patch @@ -0,0 +1,13 @@ +diff --git a/javatests/com/google/scp/shared/testutils/gcp/CloudFunctionEmulatorContainer.java b/javatests/com/google/scp/shared/testutils/gcp/CloudFunctionEmulatorContainer.java +index 9775176eb..1a0bf52b1 100644 +--- a/javatests/com/google/scp/shared/testutils/gcp/CloudFunctionEmulatorContainer.java ++++ b/javatests/com/google/scp/shared/testutils/gcp/CloudFunctionEmulatorContainer.java +@@ -28,7 +28,7 @@ public final class CloudFunctionEmulatorContainer + + private static final String invokerJarFilename = "java-function-invoker-1.1.0.jar"; + private static final String invokerJarPath = +- "external/maven/v1/https/repo1.maven.org/maven2/com/google/cloud/functions/invoker/java-function-invoker/1.1.0/" ++ "external/rules_jvm_external~~maven~maven/com/google/cloud/functions/invoker/java-function-invoker/1.1.0/" + + invokerJarFilename; + private static final int invokerPort = 8080; // default internal port for the invoker jar process + diff --git a/build_defs/shared_libraries/golang.patch b/build_defs/shared_libraries/golang.patch new file mode 100644 index 00000000..6edd29ae --- /dev/null +++ b/build_defs/shared_libraries/golang.patch @@ -0,0 +1,29 @@ +diff --git a/MODULE.bazel b/MODULE.bazel +index 16f8d85..0881461 100644 +--- a/MODULE.bazel ++++ b/MODULE.bazel +@@ -209,7 +209,8 @@ go_sdk = use_extension("@io_bazel_rules_go//go:extensions.bzl", "go_sdk") + go_sdk.download(version = "1.23.0") + + go_deps = use_extension("@bazel_gazelle//:extensions.bzl", "go_deps") +-go_deps.from_file(go_work = "//:go.work") ++ ++# go_deps.from_file(go_work = "//:go.work") + go_deps.module( + path = "github.com/bazelbuild/buildtools", + sum = "h1:FGzENZi+SX9I7h9xvMtRA3rel8hCEfyzSixteBgn7MU=", +@@ -221,10 +222,10 @@ go_deps.module( + use_repo( + go_deps, + "com_github_bazelbuild_buildtools", +- "com_github_googleapis_gax_go_v2", +- "com_github_kylelemons_godebug", +- "com_github_stretchr_testify", +- "com_google_cloud_go_spanner", ++ # "com_github_googleapis_gax_go_v2", ++ # "com_github_kylelemons_godebug", ++ # "com_github_stretchr_testify", ++ # "com_google_cloud_go_spanner", + ) + + python = use_extension("@rules_python//python/extensions:python.bzl", "python") diff --git a/build_defs/shared_libraries/rules_docker.patch b/build_defs/shared_libraries/rules_docker.patch new file mode 100644 index 00000000..7c613580 --- /dev/null +++ b/build_defs/shared_libraries/rules_docker.patch @@ -0,0 +1,209 @@ +diff --git a/.bazelrc b/.bazelrc +index 879cb6c..a241f5d 100644 +--- a/.bazelrc ++++ b/.bazelrc +@@ -10,7 +10,7 @@ build --test_output=errors + + # Required for io_bazel_rules_docker. Reference: + # https://github.com/bazelbuild/rules_docker/issues/2275 +-common --@io_bazel_rules_docker//transitions:enable=false ++common --@@io_bazel_rules_docker//transitions:enable=false + + build:cpp --client_env=BAZEL_CXXOPTS=-std=c++20 + build:cpp --cxxopt=-std=c++20 +diff --git a/build_defs/aws/enclave/container.bzl b/build_defs/aws/enclave/container.bzl +index 873a452..ca662aa 100644 +--- a/build_defs/aws/enclave/container.bzl ++++ b/build_defs/aws/enclave/container.bzl +@@ -12,7 +12,7 @@ + # See the License for the specific language governing permissions and + # limitations under the License. + +-load("@io_bazel_rules_docker//container:container.bzl", "container_image") ++load("@@io_bazel_rules_docker//container:container.bzl", "container_image") + + # Note: use reproducible versions of these binaries. + _PROXY_BINARY_FILES = [Label("//cc/aws/proxy:libproxy_preload.so"), Label("//cc/aws/proxy:proxify"), Label("//cc/aws/proxy:socket_vendor")] +@@ -74,7 +74,7 @@ def java_enclave_image( + + container_image( + name = name, +- base = "@java_base//image", ++ base = "@@java_base//image", + cmd = enclave_cmd, + env = enclave_env_variables, + files = container_files, +diff --git a/build_defs/cc/aws/enclave/container.bzl b/build_defs/cc/aws/enclave/container.bzl +index 9330d32..7ebc0fa 100644 +--- a/build_defs/cc/aws/enclave/container.bzl ++++ b/build_defs/cc/aws/enclave/container.bzl +@@ -12,9 +12,9 @@ + # See the License for the specific language governing permissions and + # limitations under the License. + +-load("@io_bazel_rules_docker//container:container.bzl", "container_image") +-load("@io_bazel_rules_docker//docker/package_managers:download_pkgs.bzl", "download_pkgs") +-load("@io_bazel_rules_docker//docker/package_managers:install_pkgs.bzl", "install_pkgs") ++load("@@io_bazel_rules_docker//container:container.bzl", "container_image") ++load("@@io_bazel_rules_docker//docker/package_managers:download_pkgs.bzl", "download_pkgs") ++load("@@io_bazel_rules_docker//docker/package_managers:install_pkgs.bzl", "install_pkgs") + load("@rules_pkg//:pkg.bzl", "pkg_tar") + load("//cc/process_launcher:helpers.bzl", "executable_struct_to_json_str") + +diff --git a/cc/aws/proxy/BUILD b/cc/aws/proxy/BUILD +index f9f0301..1d001a5 100644 +--- a/cc/aws/proxy/BUILD ++++ b/cc/aws/proxy/BUILD +@@ -13,7 +13,7 @@ + # limitations under the License. + + load("@com_github_google_rpmpack//:def.bzl", "pkg_tar2rpm") +-load("@io_bazel_rules_docker//container:container.bzl", "container_image") ++load("@@io_bazel_rules_docker//container:container.bzl", "container_image") + load("@rules_pkg//:pkg.bzl", "pkg_tar") + + package( +@@ -63,7 +63,7 @@ pkg_tar( + + container_image( + name = "build_container", +- base = "@amazonlinux_2//image", ++ base = "@@amazonlinux_2//image", + ) + + # Mounts the source code into an AmazonLinux2 docker container and performs a +diff --git a/cc/pbs/deploy/pbs_server/build_defs/pbs_container_multi_stage_build_tools.bzl b/cc/pbs/deploy/pbs_server/build_defs/pbs_container_multi_stage_build_tools.bzl +index d9c02f5..3124a15 100644 +--- a/cc/pbs/deploy/pbs_server/build_defs/pbs_container_multi_stage_build_tools.bzl ++++ b/cc/pbs/deploy/pbs_server/build_defs/pbs_container_multi_stage_build_tools.bzl +@@ -12,10 +12,10 @@ + # See the License for the specific language governing permissions and + # limitations under the License. + +-load("@io_bazel_rules_docker//container:container.bzl", "container_image") +-load("@io_bazel_rules_docker//docker/package_managers:download_pkgs.bzl", "download_pkgs") +-load("@io_bazel_rules_docker//docker/package_managers:install_pkgs.bzl", "install_pkgs") +-load("@io_bazel_rules_docker//docker/util:run.bzl", "container_run_and_commit_layer", "container_run_and_extract") ++load("@@io_bazel_rules_docker//container:container.bzl", "container_image") ++load("@@io_bazel_rules_docker//docker/package_managers:download_pkgs.bzl", "download_pkgs") ++load("@@io_bazel_rules_docker//docker/package_managers:install_pkgs.bzl", "install_pkgs") ++load("@@io_bazel_rules_docker//docker/util:run.bzl", "container_run_and_commit_layer", "container_run_and_extract") + load("@rules_pkg//:pkg.bzl", "pkg_tar") + load("//cc/process_launcher:helpers.bzl", "executable_struct_to_json_str") + +diff --git a/cc/tools/build/BUILD b/cc/tools/build/BUILD +index acfce04..2cc1f37 100644 +--- a/cc/tools/build/BUILD ++++ b/cc/tools/build/BUILD +@@ -12,10 +12,10 @@ + # See the License for the specific language governing permissions and + # limitations under the License. + +-load("@io_bazel_rules_docker//container:container.bzl", "container_image") +-load("@io_bazel_rules_docker//docker/package_managers:download_pkgs.bzl", "download_pkgs") +-load("@io_bazel_rules_docker//docker/package_managers:install_pkgs.bzl", "install_pkgs") +-load("@io_bazel_rules_docker//docker/util:run.bzl", "container_run_and_commit", "container_run_and_commit_layer") ++load("@@io_bazel_rules_docker//container:container.bzl", "container_image") ++load("@@io_bazel_rules_docker//docker/package_managers:download_pkgs.bzl", "download_pkgs") ++load("@@io_bazel_rules_docker//docker/package_managers:install_pkgs.bzl", "install_pkgs") ++load("@@io_bazel_rules_docker//docker/util:run.bzl", "container_run_and_commit", "container_run_and_commit_layer") + load("@rules_pkg//:pkg.bzl", "pkg_tar") + + package(default_visibility = ["//cc:pbs_visibility"]) +diff --git a/coordinator/keygeneration/gcp/build_defs.bzl b/coordinator/keygeneration/gcp/build_defs.bzl +index e846f6a..648f886 100644 +--- a/coordinator/keygeneration/gcp/build_defs.bzl ++++ b/coordinator/keygeneration/gcp/build_defs.bzl +@@ -12,7 +12,7 @@ + # See the License for the specific language governing permissions and + # limitations under the License. + +-load("@io_bazel_rules_docker//container:container.bzl", "container_image", "container_push") ++load("@@io_bazel_rules_docker//container:container.bzl", "container_image", "container_push") + + def keygeneration_container(name, tag, registry, repository, log_policy_override = False): + container_name = name + "_container" +@@ -21,7 +21,7 @@ def keygeneration_container(name, tag, registry, repository, log_policy_override + labels["tee.launch_policy.log_redirect"] = "always" + container_image( + name = container_name, +- base = "@java_base//image", ++ base = "@@java_base//image", + cmd = [ + "KeyGenerationApp_deploy.jar", + "--multiparty", +diff --git a/coordinator/keyhosting/gcp/build_defs.bzl b/coordinator/keyhosting/gcp/build_defs.bzl +index 24f107c..405814d 100644 +--- a/coordinator/keyhosting/gcp/build_defs.bzl ++++ b/coordinator/keyhosting/gcp/build_defs.bzl +@@ -12,14 +12,14 @@ + # See the License for the specific language governing permissions and + # limitations under the License. + +-load("@io_bazel_rules_docker//container:container.bzl", "container_image", "container_push") ++load("@@io_bazel_rules_docker//container:container.bzl", "container_image", "container_push") + load("//build_defs/shared:variables.bzl", "CLOUD_FUNCTIONS_JAVA_INVOKER_VERSION") + + def keyhosting_public_key_container(name, tag, registry, repository): + container_name = name + "_container" + container_image( + name = container_name, +- base = "@java_base//image", ++ base = "@@java_base//image", + cmd = [ + "/java-function-invoker-{}.jar".format(CLOUD_FUNCTIONS_JAVA_INVOKER_VERSION), + "--classpath", +@@ -46,7 +46,7 @@ def keyhosting_private_key_container(name, tag, registry, repository): + container_name = name + "_container" + container_image( + name = container_name, +- base = "@java_base//image", ++ base = "@@java_base//image", + cmd = [ + "/java-function-invoker-{}.jar".format(CLOUD_FUNCTIONS_JAVA_INVOKER_VERSION), + "--classpath", +diff --git a/coordinator/keystorage/gcp/build_defs.bzl b/coordinator/keystorage/gcp/build_defs.bzl +index 7a8b692..f11fc58 100644 +--- a/coordinator/keystorage/gcp/build_defs.bzl ++++ b/coordinator/keystorage/gcp/build_defs.bzl +@@ -12,14 +12,14 @@ + # See the License for the specific language governing permissions and + # limitations under the License. + +-load("@io_bazel_rules_docker//container:container.bzl", "container_image", "container_push") ++load("@@io_bazel_rules_docker//container:container.bzl", "container_image", "container_push") + load("//build_defs/shared:variables.bzl", "CLOUD_FUNCTIONS_JAVA_INVOKER_VERSION") + + def keystorage_container(name, tag, registry, repository): + container_name = name + "_container" + container_image( + name = container_name, +- base = "@java_base//image", ++ base = "@@java_base//image", + cmd = [ + "/java-function-invoker-{}.jar".format(CLOUD_FUNCTIONS_JAVA_INVOKER_VERSION), + "--classpath", +diff --git a/coordinator/privacybudget/gcp/BUILD b/coordinator/privacybudget/gcp/BUILD +index 36e1a77..3bca731 100644 +--- a/coordinator/privacybudget/gcp/BUILD ++++ b/coordinator/privacybudget/gcp/BUILD +@@ -12,7 +12,7 @@ + # See the License for the specific language governing permissions and + # limitations under the License. + +-load("@io_bazel_rules_docker//container:container.bzl", "container_push") ++load("@@io_bazel_rules_docker//container:container.bzl", "container_push") + + container_push( + name = "pbs_cloud_run_container_image", +diff --git a/operator/worker/gcp/BUILD b/operator/worker/gcp/BUILD +index bf94567..a4c83a0 100644 +--- a/operator/worker/gcp/BUILD ++++ b/operator/worker/gcp/BUILD +@@ -12,6 +12,4 @@ + # See the License for the specific language governing permissions and + # limitations under the License. + +-load("@io_bazel_rules_docker//container:container.bzl", "container_image", "container_push") +- + package(default_visibility = ["//visibility:public"]) diff --git a/build_defs/shared_libraries/tmp_build.patch b/build_defs/shared_libraries/tmp_build.patch new file mode 100644 index 00000000..265518e7 --- /dev/null +++ b/build_defs/shared_libraries/tmp_build.patch @@ -0,0 +1,25 @@ +diff --git a/.bazelrc b/.bazelrc +index 879cb6cfd..7c019b93c 100644 +--- a/.bazelrc ++++ b/.bazelrc +@@ -1,5 +1,5 @@ + # Migration to Bzlmod is not ready yet +-common --noenable_bzlmod ++# common --noenable_bzlmod + + build --announce_rc + build --verbose_failures +diff --git a/BUILD b/BUILD +index 41107c77f..5094911d3 100644 +--- a/BUILD ++++ b/BUILD +@@ -119,7 +119,9 @@ pkg_tar( + ".bazelrc", + ".bazelversion", + "BUILD", ++ "MODULE.bazel", + "WORKSPACE", ++ "WORKSPACE.bzlmod", + ":build_defs_dir", + ":cc_dir", + ":java_dir", diff --git a/build_defs/shared_libraries/workspace.patch b/build_defs/shared_libraries/workspace.patch new file mode 100644 index 00000000..1197c765 --- /dev/null +++ b/build_defs/shared_libraries/workspace.patch @@ -0,0 +1,7 @@ +diff --git a/WORKSPACE b/WORKSPACE +index 809c65855..f67caa8b2 100644 +--- a/WORKSPACE ++++ b/WORKSPACE +@@ -1 +1 @@ +-workspace(name = "privacy_sandbox_coordinator_services_and_shared_libraries~") ++workspace(name = "privacy_sandbox_coordinator_services_and_shared_libraries") diff --git a/build_defs/worker/gcp/BUILD b/build_defs/worker/gcp/BUILD new file mode 100644 index 00000000..d6bde58e --- /dev/null +++ b/build_defs/worker/gcp/BUILD @@ -0,0 +1,15 @@ +# Copyright 2023 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +package(default_visibility = ["//visibility:public"]) diff --git a/build_defs/worker/gcp/deploy.bzl b/build_defs/worker/gcp/deploy.bzl new file mode 100644 index 00000000..a27d8488 --- /dev/null +++ b/build_defs/worker/gcp/deploy.bzl @@ -0,0 +1,43 @@ +# Copyright 2023 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("@io_bazel_rules_docker//container:container.bzl", "container_image", "container_push") + +def worker_gcp_deployment( + *, + name, + cmd = [], + files = [], + entrypoint = [], + labels = {}): + docker_target_name = "%s_container" % name + + container_image( + name = docker_target_name, + base = "@java_base_gcp//image", + cmd = cmd, + entrypoint = entrypoint, + files = files, + labels = labels, + ) + + # registry,repository,tag will be assigned by "-dst" argument. + container_push( + name = name, + format = "Docker", + image = docker_target_name, + registry = "", + repository = "", + tag = "", + ) diff --git a/docs/API.md b/docs/API.md deleted file mode 100644 index d5fa5057..00000000 --- a/docs/API.md +++ /dev/null @@ -1,254 +0,0 @@ -# Aggregation Service API Documentation - -## AWS Nitro Enclave based Aggregation Service - -### createJob Endpoint - -#### Endpoint - -`https:///stage/v1alpha/createJob` - -#### Protocol - -HTTPS - -#### Method - -POST - -#### Payload - -```jsonc -{ - // Unique identifier. Length must be 128 characters or less. - // Legal characters are ASCII letters (a-z, A-Z), ASCII - // numbers (0-9), and the following ASCII punctuation - // characters !"#$%&'()*+,-./:;<=>?@[\]^_`{}~. - "job_request_id": , - // For a single file, it's a file path in the bucket. For multiple input - // files, it's a prefix in the file path. For example, inputting - // "folder1/shard" would take all files with paths starting with - // "folder1/shard" such as "folder1/shard1.avro", "folder1/shard/test1.avro" - // and "folder1/shard1/folder2/test1.avro". - "input_data_blob_prefix": , - // Storage bucket for input data. - "input_data_bucket_name": , - // The output data path in the bucket. Currently, single output file is - // supported. - "output_data_blob_prefix": , - // Storage bucket for output data. - "output_data_bucket_name": , - "job_parameters": { - // For a single domain file, it's a file path in the bucket. For multiple - // domain files, it's a prefix in the file path. For example, inputting - // "folder1/shard" would include "folder1/shard/domain1.avro", - // "folder1/shard_domain.avro" and "folder1/shard/folder2/domain.avro". - "output_domain_blob_prefix": , - // Domain file bucket. - "output_domain_bucket_name": , - // Reporting URL. - "attribution_report_to": , - // [Optional] differential privacy epsilon value to be used - // for this job. 0.0 < debug_privacy_epsilon <= 64.0. The - // value can be varied so that tests with different epsilon - // values can be performed during the origin trial. - "debug_privacy_epsilon": - } -} -``` - -#### Response HTTP codes - -```txt -Success: 202 Accepted -Bad request (malformed): 400 Bad Request -Duplicate job (job_request_id already taken): 409 Conflict -``` - -#### Success Response Payload - -`{} // Empty object in response body for success` - -#### Error Response body - -These match the [Google Cloud Error Model](https://cloud.google.com/apis/design/errors#error_model) - -```jsonc -{ - "error": { - "code": 3, - // Corresponds to this - "message": "detailed error message string", - "status": "INVALID_ARGUMENT", - "details": [ - { - "reason": "API_KEY_INVALID", - "domain": "foo.com", - // might not be present - "metadata": { - // Map, might not be present - "service": "translate.googleapis.com" - } - } - ] - } -} -``` - -### getJob Endpoint - -#### Endpoint - -`https:///stage/v1alpha/getJob` - -#### Protocol - -HTTPS - -#### Method - -GET - -#### Request params - -`"job_request_id": ` - -#### Response HTTP code - -```txt -Found: 200 Ok -Not found: 404 Not Found -``` - -#### Response Body - -```jsonc -{ - // Unique identifier - "job_request_id" : "UNIQUEID12313", - // - "job_status": , - // Time request was received - "request_received_at": , - // Last update time - "request_updated_at": , - "input_data_blob_prefix": , - "input_data_bucket_name": , - "output_data_blob_prefix": , - "output_data_bucket_name": , - // Only present when job is finished - "result_info": { - "return_code": , - // Debug information - "return_message": , - "finished_at": , - "error_summary": { - "error_counts": [ - { - "category": , - "count": - }, - ... - ] - } - }, - "job_parameters": { - // Location of pre-listed aggregation buckets - "output_domain_blob_prefix": , - "output_domain_bucket_name": , - // Reporting URL - "attribution_report_to" : , - // [Optional] differential privacy epsilon value to be used - // for this job. 0.0 < debug_privacy_epsilon <= 64.0. The - // value can be varied so that tests with different epsilon - // values can be performed during the origin trial. A greater - // epsilon value results in less noise in the output. Default - // value for epsilon is 10. - "debug_privacy_epsilon": - }, - // The time when worker starts processing request in the latest processing - // attempt - // If the job_status is set to `FINISHED`, one can calculate the request's - // processing time in worker (excludes the time spent waiting in job queue) - // as `request_updated_at` minus `request_processing_started_at`. - "request_processing_started_at": -} -``` - -#### Error Response codes - -In case of errors in successfully completing the job, the below error response codes would be -present in the `result_info` section of the GetJob API response body - -- RETRIES_EXHAUSTED: The aggregation request failed because it exhausted the number of retries - attempted. This error is transient and the job can be retried. - -Note: Additional error response codes can be found in -[AggregationWorkerReturnCode.java](https://github.com/privacysandbox/aggregation-service/blob/main/java/com/google/aggregate/adtech/worker/AggregationWorkerReturnCode.java) - -#### Error Response body - -These match the [Google Cloud Error Model](https://cloud.google.com/apis/design/errors#error_model) - -```jsonc -{ - "error": { - "code": 3, - // Corresponds to this - "message": "detailed error message string", - "status": "INVALID_ARGUMENT", - "details": [ - { - "reason": "API_KEY_INVALID", - "domain": "foo.com", - // might not be present - "metadata": { - // Map, might not be present - "service": "translate.googleapis.com" - } - } - ] - } -} -``` - -## Local testing tool - -The local testing tool can be used to perform aggregation on the following types of unencrypted -aggregatable reports- - -1. [Attribution Reporting](https://github.com/WICG/conversion-measurement-api/blob/main/AGGREGATE.md#aggregatable-reports) -2. [FLEDGE](https://github.com/patcg-individual-drafts/private-aggregation-api#reports) -3. [Shared-storage](https://github.com/patcg-individual-drafts/private-aggregation-api#reports) - -Aggregatable reports avro file of the above 3 kinds can be passed in as `--input_data_avro_file` -param. - -```sh -$ java -jar LocalTestingTool_deploy.jar --help -Usage: Aggregation Library [options] - Options: - --input_data_avro_file - Path to the local file which contains aggregate reports in avro format - Default: - --domain_avro_file - Path to the local file which contains the pre-listed keys in avro format - Default: - --output_directory - Path to the directory where the output would be written - Default: - --epsilon - Epsilon value for noise > 0 and <= 64 - Default: 10.0 - --print_licenses - only prints licenses for all the dependencies. - Default: false - --help - list all the parameters. - --no_noising - ignore noising and thresholding. - Default: false - --json_output - output the result in json format. - Default: false -``` diff --git a/docs/COLLECTING.md b/docs/COLLECTING.md deleted file mode 100644 index f8d54304..00000000 --- a/docs/COLLECTING.md +++ /dev/null @@ -1,365 +0,0 @@ -# Collecting and Batching Aggregatable Reports - -This document provides instructions and code snippets on how to collect, transform and batch -[Aggregatable Reports](https://github.com/WICG/conversion-measurement-api/blob/main/AGGREGATE.md#aggregatable-reports) -produced by the -[Attribution Reporting API](https://github.com/WICG/conversion-measurement-api/blob/main/AGGREGATE.md) -and -[Private Aggregation API](https://github.com/patcg-individual-drafts/private-aggregation-api#reports). - -The Attribution Reporting API can generate 4 possible types of reports during the -[Privacy Sandbox Relevance and Measurement origin trials (OT)](https://developer.chrome.com/origintrials/#/view_trial/771241436187197441). -These reports are sent to predefined endpoints to the domain registered during source registration -(such as ). See this [demo](https://goo.gle/attribution-reporting-demo) -for examples. - -1. Event-level report - - Reporting URL: - `http://adtech.localhost/.well-known/attribution-reporting/report-event-attribution` -1. Event-level debug report - - Reporting URL: - `http://adtech.localhost/.well-known/attribution-reporting/debug/report-event-attribution` -1. Aggregatable report - - Reporting URL: - `http://adtech.localhost/.well-known/attribution-reporting/report-aggregate-attribution` -1. Aggregatable debug report - - Reporting URL: - `http://adtech.localhost/.well-known/attribution-reporting/debug/report-aggregate-attribution` - -_The `.well-known/...` paths are predefined paths which can not be customized. To collect reports, -you need to run an endpoint that can respond to POST requests on the above paths._ - -## Aggregatable report sample - -This is a sample aggregatable report produced with the -[Attribution Reporting API Demo](https://goo.gle/attribution-reporting-demo) with debugging enabled. - -```json -{ - "aggregation_service_payloads": [ - { - "debug_cleartext_payload": "omRkYXRhgaJldmFsdWVEAACAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAFWWlvcGVyYXRpb25paGlzdG9ncmFt", - "key_id": "e101cca5-3dec-4d4f-9823-9c7984b0bafe", - "payload": "26/oZSjHABFqsIxR4Gyh/DpmJLNA/fcp43Wdc1/sblss3eAkAPsqJLphnKjAC2eLFR2bQolMTOneOU5sMWuCfag2tmFlQKLjTkNv85Wq6HAmLg+Zq+YU0gxF573yzK38Cj2pWtb65lhnq9dl4Yiz" - } - ], - "attribution_destination": "http://shoes.localhost", - "shared_info": "{\"debug_mode\":\"enabled\",\"privacy_budget_key\":\"OtLi6K1k0yNpebFbh92gUh/Cf8HgVBVXLo/BU50SRag=\",\"report_id\":\"00cf2236-a4fa-40e5-a7aa-d2ceb33a4d9d\",\"reporting_origin\":\"http://adtech.localhost:3000\",\"scheduled_report_time\":\"1649652363\",\"version\":\"\"}", - "source_debug_key": "531933890459023", - "source_registration_time": "1649635200", - "source_site": "http://news.localhost", - "trigger_debug_key": "531933890459023" -} -``` - -The `debug_cleartext_payload` field contains the base64 encoded [CBOR](https://cbor.io/) payload. -The above CBOR payload decodes into the following data in JSON format (Decoded with -[CBOR Playground](https://cbor.me)). The bucket value is encoded as a sequence of 'characters' -representing the underlying bytes. While some bytes may be represented as ASCII characters, others -are unicode escaped. - -```json -{ - "data": [ - { - "value": "\u0000\u0000\x80\u0000", - "bucket": "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0005Y" - } - ], - "operation": "histogram" -} -``` - -## Convert the aggregatable report into Avro binary representation - -The [sample report](#aggregatable-report-sample) lists a `debug_cleartext_payload` field that is -_not_ encrypted and can be processed with the local testing tool. - -Follow the instructions in the -[README.md#using-the-local-testing-tool](/README.md#using-the-local-testing-tool) to download the -local testing tool. - -When testing the aggregation service locally and on Amazon Web Services -[Nitro Enclaves](https://aws.amazon.com/ec2/nitro/nitro-enclaves/), an -[Avro](https://avro.apache.org/) batch with the following record schema is expected. - -### `reports.avsc` - -```avro -{ - "type": "record", - "name": "AggregatableReport", - "fields": [ - { - "name": "payload", - "type": "bytes" - }, - { - "name": "key_id", - "type": "string" - }, - { - "name": "shared_info", - "type": "string" - } - ] -} -``` - -For local testing, the avro `payload` field expects a byte array of the `debug_cleartext_payload` -field (`base64` encoded). The `debug_cleartext_payload` field is present in each aggregation service -payload object in the `aggregation_service_payloads` list of an aggregatable report with debugging -enabled. - -For testing with encrypted reports on the Amazon Web Services -[Nitro Enclaves](https://aws.amazon.com/ec2/nitro/nitro-enclaves/), the avro `payload` field expects -a byte array of the aggregatable report's `aggregation_service_payloads` object's `payload` field. - -## Collect, transform and batch reports - -The following code snippets are in Golang, but can be adapted to other programming languages. - -### Listen on predefined endpoints - -When debugging is enabled for the Attribution Reporting API, additional fields are present in the -reports, and a duplicate debug report is sent immediately. The following 2 predefined endpoints are -used: - -1. `.well-known/attribution-reporting/report-aggregate-attribution` for regular, scheduled (delayed) - reports with encrypted payloads. If debugging is enabled, these will contain additional fields: - for example, a cleartext payload if both debug keys are also set. -2. `.well-known/attribution-reporting/debug/report-aggregate-attribution` for debug reports that are - duplicates of the regular reports, but sent immediately at generation time. - -First, lets define all types we will work with: - -- Aggregatable report generated from the Attribution Reporting API - - ```go - // AggregatableReport contains the information generated by the Attribution - // Reporting API in the browser - type AggregatableReport struct { - SourceSite string `json:"source_site"` - AttributionDestination string `json:"attribution_destination"` - // SharedInfo is a JSON serialized instance of struct SharedInfo. - // This exact string is used as authenticated data for decryption. The string - // therefore must be forwarded to the aggregation service unmodified. The - // reporting origin can parse the string to access the encoded fields. - // https://github.com/WICG/conversion-measurement-api/blob/main/AGGREGATE.md#aggregatable-reports - SharedInfo string `json:"shared_info"` - AggregationServicePayloads []*AggregationServicePayload `json:"aggregation_service_payloads"` - - SourceDebugKey uint64 `json:"source_debug_key,string"` - TriggerDebugKey uint64 `json:"trigger_debug_key,string"` - } - - // AggregationServicePayload contains the payload for the aggregation server. - type AggregationServicePayload struct { - // Payload is a encrypted CBOR serialized instance of struct Payload, which is base64 encoded. - Payload string `json:"payload"` - KeyID string `json:"key_id"` - DebugCleartextPayload string `json:"debug_cleartext_payload,omitempty"` - } - ``` - -- Aggregatable report in Avro format, as expected by the aggregation service (you'll need to - import [gopkg.in/avro.v0](https://pkg.go.dev/gopkg.in/avro.v0)) - - ```go - // AvroAggregatableReport format expected by aggregation service and local testing tool - type AvroAggregatableReport struct { - Payload []byte `avro:"payload"` - KeyID string `avro:"key_id"` - SharedInfo string `avro:"shared_info"` - } - ``` - -Now let's register request handlers and start an http server: - -```go -func main() { - http.HandleFunc("/.well-known/attribution-reporting/report-aggregate-attribution", collectEndpoint) - http.HandleFunc("/.well-known/attribution-reporting/debug/report-aggregate-attribution", collectEndpoint) - var address = ":3001" - log.Printf("Starting Collector on address %v", address) - log.Fatal(http.ListenAndServe(address, nil)) -} -``` - -And here is how we handle incoming reports in our `HandlerFunc` implementation: - -```go -func collectEndpoint(w http.ResponseWriter, r *http.Request) { - var timeStr = time.Now().Format(time.RFC3339) - if r.Method == "POST" { - var endpoint = "regular" - // check if report was an immediately sent one to the debug endpoint - if strings.Contains(r.URL.Path, ".well-known/attribution-reporting/debug/report-aggregate-attribution") { - endpoint = "debug" - } - - log.Printf("Received Aggregatable Report on %s endpoint", endpoint) - report := &AggregatableReport{} - buf := new(bytes.Buffer) - buf.ReadFrom(r.Body) - log.Print(buf.String()) - if err := json.Unmarshal(buf.Bytes(), report); err != nil { - errMsg := "Failed in decoding aggregation report" - http.Error(w, errMsg, http.StatusBadRequest) - log.Printf(errMsg+" %v", err) - return - } - schema, err := avro.ParseSchema(reports_avsc) - check(err) - - f, err := os.Create(fmt.Sprintf("output_%s_reports_%s.avro", endpoint, timeStr)) - check(err) - defer f.Close() - - w := bufio.NewWriter(f) - writer, err := avro.NewDataFileWriter(w, schema, avro.NewSpecificDatumWriter()) - check(err) - - var dwriter *avro.DataFileWriter - var dw *bufio.Writer - if (len(report.AggregationServicePayloads) > 0 && len(report.AggregationServicePayloads[0].DebugCleartextPayload) > 0) { - df, err := os.Create(fmt.Sprintf("output_%s_clear_text_reports_%s.avro", endpoint, timeStr)) - check(err) - defer df.Close() - - dw = bufio.NewWriter(df) - dwriter, err = avro.NewDataFileWriter(dw, schema, avro.NewSpecificDatumWriter()) - check(err) - } - - for _, payload := range report.AggregationServicePayloads { - var payload_cbor []byte - var err error - - payload_cbor, err = b64.StdEncoding.DecodeString(payload.Payload) - check(err) - avroReport := &AvroAggregatableReport{ - Payload: []byte(payload_cbor), - KeyID: payload.KeyID, - SharedInfo: report.SharedInfo, - } - - if err := writer.Write(avroReport); err != nil { - log.Fatal(err) // i/o errors OR encoding errors - } - - if len(payload.DebugCleartextPayload) > 0 { - payload_debug_cbor, err := b64.StdEncoding.DecodeString(payload.DebugCleartextPayload) - check(err) - avroDReport := &AvroAggregatableReport{ - Payload: []byte(payload_debug_cbor), - KeyID: payload.KeyID, - SharedInfo: report.SharedInfo, - } - if err := dwriter.Write(avroDReport); err != nil { - log.Fatal(err) // i/o errors OR encoding errors - } - } - } - writer.Flush() - w.Flush() - if dwriter != nil { - dwriter.Flush() - dw.Flush() - } - - } else { - http.Error(w, "Invalid request method.", http.StatusMethodNotAllowed) - log.Print("Invalid request received.") - } -``` - -Once an aggregatable report has been collected, it'll be stored in the -`output_regular_reports_.avro` and `output_regular_clear_text_reports_.avro` -for report received on the `.well-known/attribution-reporting/report-aggregate-attribution` endpoint -and `output_debug_reports_.avro` and `output_debug_clear_text_reports_.avro` -for report received on the `.well-known/attribution-reporting/debug/report-aggregate-attribution` -endpoint respectively. - -## Process Avro batch files - -To process the above Avro files, you must specify the expected bucket keys in a domain file -`output_domain.avro` with the following Avro schema. - -### `output_domain.avsc` - -```avro -{ - "type": "record", - "name": "AggregationBucket", - "fields": [ - { - "name": "bucket", - "type": "bytes", - "doc": "A single bucket that appears in the aggregation service output. 128-bit integer encoded as a 16-byte big-endian bytestring." - } - ] -} -``` - -### Generate a output domain Avro file - -You can use the [Avro Tools](https://www.apache.org/dyn/closer.cgi/avro/) to generate a -`output_domain.avro` from a JSON input file. - -You can download the Avro Tools jar 1.11.1 -[here](http://archive.apache.org/dist/avro/avro-1.11.1/java/avro-tools-1.11.1.jar) - -We use the following `output_domain.json` input file to generate our `output_domain.avro` file. This -uses the bucket from the above [sample aggregatable report](#aggregatable-report-sample). The below -sample uses unicode escaped "characters" to encode the byte array bucket value. - -```json -{ - "bucket": "\u0005Y" -} -``` - -To generate the `output_domain.avro` file use the above JSON file and domain schema file: - -```sh -java -jar avro-tools-1.11.1.jar fromjson \ ---schema-file output_domain.avsc output_domain.json > output_domain.avro -``` - -### Produce a summary report locally - -Using the local testing tool, you now can generate a summary report. -[See all flags and descriptions](./docs/API.md#local-testing-tool) - -Follow the instructions in the -[README.md#using-the-local-testing-tool](/README.md#using-the-local-testing-tool) to download the -local testing tool. - -We will run the tool, without adding noise to the summary report, to receive the expected value of -`32768` from the [sample aggregatable report](#aggregatable-report-sample). - -```sh -java -jar LocalRunner_deploy.jar \ ---input_data_avro_file output_debug_reports_.avro \ ---domain_avro_file output_domain.avro \ ---json_output \ ---no_noising -``` - -The output of above tool execution will be in `output.json` with the following content - -```json -[ - { - "bucket": "\u0005Y", - "value": 32768 - } -] -``` - -Note: The local testing tool also supports aggregation of -[FLEDGE](https://github.com/patcg-individual-drafts/private-aggregation-api#reports) and -[Shared-storage](https://github.com/patcg-individual-drafts/private-aggregation-api#reports) -reports. Simply pass the batch of FLEDGE or shared-storage unencrypted reports in the ---input_data_avro_file param. diff --git a/docs/DEBUGGING.md b/docs/DEBUGGING.md deleted file mode 100644 index dc1adbf8..00000000 --- a/docs/DEBUGGING.md +++ /dev/null @@ -1,157 +0,0 @@ -# Debug aggregation runs with encrypted payloads - -This document describes the debugging support for the Aggregation Service running in a TEE using -encrypted payloads of aggregatable reports. This allows you to debug your production setup and -understand how the encrypted payloads of aggregatable reports are processed. Reports with -debug_cleartext_payload can be used with the -[local testing tool](/README.md#using-the-local-testing-tool) and are helpful for understanding the -content of reports and validating that registrations on the browser client or device are configured -properly. - -To test the Aggregation Service, you can enable debug aggregation runs which use encrypted payloads -of aggregatable reports to generate debug summary reports. When executing a debug run, no noise is -added to the debug summary report, and annotations are added to indicate whether keys are present in -domain input and/or reports. This allows developers to: - -- Analyze the reports -- Determine if the aggregation was completed correctly, per the adtech's specifications -- Understand the impact of noise in summary reports -- Determine how to set the proper domain keys - -Additionally, debug runs do not enforce the -[No-Duplicates rule](https://github.com/WICG/attribution-reporting-api/blob/main/AGGREGATION_SERVICE_TEE.md#no-duplicates-rule) -across batches. The No-Duplicates rule is still enforced within a batch. This allows adtech to try -different batches without worrying about making them -[disjoint](https://github.com/WICG/attribution-reporting-api/blob/main/AGGREGATION_SERVICE_TEE.md#disjoint-batches) -during testing or debugging. - -Once third-party cookies are deprecated, the client (browser or operating system) will no longer -generate aggregatable reports that are enabled for debugging. At that time, debug runs with -encrypted payloads will no longer be supported for reports from real user devices or browsers. - -In this document, you'll find code snippets and instructions for how to debug the Aggregation -Service and create debug summary reports. - -## Create a debug job - -To create an aggregation debug job, add the `debug_run` parameter to the `job_parameters` object of -the `createJob` API request. - -`POST https://.execute-api.us-east-1.amazonaws.com/stage/v1alpha/createJob` - -```json -{ - "input_data_blob_prefix": "input/reports.avro", - "input_data_bucket_name": "", - "output_data_blob_prefix": "output/summary_report.avro", - "output_data_bucket_name": "", - "job_parameters": { - "attribution_report_to": "", - "output_domain_blob_prefix": "domain/domain.avro", - "output_domain_bucket_name": "", - "debug_run": "true" - }, - "Job_request_id": "test01" -} -``` - -If `debug_run` is not present in`job_parameters` or it's set to `false`, a normal noised aggregation -run is created. More details about `createJob` API can be found in -[detailed API spec](/docs/API.md#createjob-endpoint). - -## Debuggable aggregatable reports - -A debug run only considers reports that have the flag `"debug_mode": "enabled"` in the report -shared_info ([aggregatable report sample](/docs/COLLECTING.md#aggregatable-report-sample)). Reports -with the `debug_mode` flag missing or the `debug_mode` value isn't set to `enabled` aren't included -in the results generated by a debug run. - -The count of reports that were not processed during a debug run is returned in the job response, -which can be previewed in the [detailed API spec](/docs/API.md#createjob-endpoint). In the -`error_counts` field, the category `NUM_REPORTS_DEBUG_NOT_ENABLED` shows the numbers of reports not -processed during a debug run. - -## Results - -Two summary reports are generated from a debug run: a regular summary report and a debug summary -report. The regular summary report format generated from the debug run is consistent with that of a -regular aggregation run. The debug summary report has a [different format](#debug-summary-report). -The path of the summary report is set in the [createJob](/docs/API.md#createjob-endpoint) API. The -debug summary report will be stored in the "debug" folder under the summary report's path with the -same object name. - -Considering the following createJob parameters for `output_data_bucket_name` and -`output_data_blob_prefix`: - -```json -"output_data_blob_prefix": "output/summary_report.avro", -"output_data_bucket_name": "", -``` - -the following objects are created by a debug run: - -`s3:///output/summary_report.avro` and - -`s3:///output/debug/summary_report.avro`. - -Note that the regular summary report generated during a debug run will only include reports which -have the flag `"debug_mode": "enabled"` in the reports `shared_info`. - -### Debug summary report - -The debug summary report includes the following data: - -- `bucket`: The aggregation key -- `unnoised_metric`: The aggregation value without noise -- `noise`: The approximate noise applied to the aggregated results in the regular summary report -- `annotations`: The annotations associated with the bucket - -The keys in the debug summary report will include all the keys from the output domain. - -If the key is only present in the output domain (not in any of the processed aggregatable reports), -the key will be included in the debug report with `unnoised_metric=0` and -`annotations=["in_domain"]`. - -The keys that are only present in aggregatable reports (not in output domain) will also be included -in the debug report with `unnoised_metric=` and -`annotations=["in_reports"]`. - -Keys that are present in domain and aggregatable reports will have annotations for both -`["in_domain", "in_reports"]`. - -The schema of debug summary reports is in the following [Avro](https://avro.apache.org/) format: - -```avro -{ -"type": "record", -"name": "DebugAggregatedFact", -"fields": [ - { - "name": "bucket", - "type": "bytes", - "doc": "Histogram bucket used in aggregation. 128-bit integer encoded as a 16-byte big-endian bytestring. Leading 0-bits will be left out." - }, - { - "name": "unnoised_metric", - "type": "long", - "doc": "Unnoised metric associated with the bucket." - }, - { - "name": "noise", - "type": "long", - "doc": "The noise applied to the metric in the regular result." - } - { - "name":"annotations", - "type": - { - "type": "array", - "items": { - "type":"enum", - "name":"bucket_tags", - "symbols":["in_domain","in_reports"] - } - } - ] -} -``` diff --git a/docs/api.md b/docs/api.md new file mode 100644 index 00000000..5a6ae01b --- /dev/null +++ b/docs/api.md @@ -0,0 +1,452 @@ +# Aggregation Service API Documentation + +### createJob Endpoint + +#### Endpoint + +AWS: `https:///stage/v1alpha/createJob` + +GCP: `https:///v1alpha/createJob` + +#### Protocol + +HTTPS + +#### Method + +POST + +#### Payload + +```jsonc +{ + // Unique identifier. Length must be 128 characters or less. + // Legal characters are ASCII letters (a-z, A-Z), ASCII + // numbers (0-9), and the following ASCII punctuation + // characters !"#$%&'()*+,-./:;<=>?@[\]^_`{}~. + "job_request_id": , + + // For a single file, it's a file path in the bucket. For multiple input + // files, it's a prefix in the file path. For example, inputting + // "folder1/shard" would take all files with paths starting with + // "folder1/shard" such as "folder1/shard1.avro", "folder1/shard/test1.avro" + // and "folder1/shard1/folder2/test1.avro". + // It is recommended to keep the number of shards between the number of CPUs + // available to the enclave and 1000. + "input_data_blob_prefix": , + + // [Optional] Input prefixes list. A maximum of 50 entries can be specified in the list. + // Each entry in the list should either be a path to + // a single file or a prefix in file path for multiple files. + // For example, specifying "["folder1/shard", "folder2/shard/test2.avro"]" would + // take as input all files with paths starting with "folder1/shard" + // along with the file "folder2/shard/test2.avro". + // This parameter and the "input_data_blob_prefix" parameter are mutually + // exclusive. Exactly one of the two parameters should be provided in the request. + // The parameter "input_data_blob_prefixes" will be supported in version 2.11 and onward. + "input_data_blob_prefixes": >, + + // Storage bucket for input data. + "input_data_bucket_name": , + + // The output data path in the bucket. + // The output file will be named as follows: + // [OutputDataBlobPrefix]-[ShardId]-of-[TotalShards] + // In the case of a single shard, the output file will still apply the + // shard suffix information as "[OutputDataBlobPrefix]-1-of-1". + // If "output_data_blob_prefix" includes the Avro file extension (.avro), + // the output shard names will also include the Avro file extension at + // the end. + // If the Aggregation job returns the error code PRIVACY_BUDGET_EXHAUSTED, + // a JSON file with debugging information will be written in + // output_data_bucket_name at the output_data_blob_prefix. + "output_data_blob_prefix": , + + // Storage bucket for output data. + "output_data_bucket_name": , + + // Parameters are required unless marked Optional. + "job_parameters": { + // For a single domain file, it's a file path in the bucket. For multiple + // domain files, it's a prefix in the file path. For example, inputting + // "folder1/shard" would include "folder1/shard/domain1.avro", + // "folder1/shard_domain.avro" and "folder1/shard/folder2/domain.avro". + // It is recommended to keep the number of shards between the number of CPUs + // available to the enclave and 1000. + // Only keys in the domain file are written to the summary report. + // More details on domain keys can be found here: + // https://developers.google.com/privacy-sandbox/private-advertising/aggregation-service/privacy-protection-report-strategy#pre-declared_aggregation_keys. + "output_domain_blob_prefix": , + + // Domain file bucket. + "output_domain_bucket_name": , + + // Reporting URL. + // This should be same as the reporting_origin present in the reports' shared_info. + "attribution_report_to": , + + // [Optional] Reporting Site. + // This should be the reporting site that is onboared to aggregation service. + // Note: All reports in the request should have reporting origins which + // belong to the reporting site mentioned in this parameter. This parameter + // and the "attribution_report_to" parameter are mutually exclusive, exactly + // one of the two parameters should be provided in the request. + "reporting_site": "" + + // [Optional] Differential privacy epsilon value to be used + // for this job. 0.0 < debug_privacy_epsilon <= 64.0. The + // value can be varied so that tests with different epsilon + // values can be performed during the origin trial. + "debug_privacy_epsilon": , + + // [Optional] The percentage of reports, if excluded from + // aggregation due to an error, will fail the job. + // Values can be from 0 to 100. If left empty, default value of 10% + // will be used, + "report_error_threshold_percentage": , + + // [Optional] Total number of reports provided as input data for this job. + // This value, in conjunction with "report_error_threshold_percentage" will + // enable early failure of the job when reports are excluded due to errors. + "input_report_count": , + + // [Optional] A list of unsigned filtering IDs separated by comma. All the + // contribtions other than the matching filtering ID will be filtered out. + // e.g. "filtering_ids":"12345,34455,12". Default value is "0". + "filtering_ids":, + + // [Optional] When executing a debug run, noised and unnoised debug summary + // report and annotations are added to indicate which keys are present in the + // domain input and/or reports. Additionally, duplicates across batches are + // also not enforced. Privacy budget will not be consumed when debug_run is + // enabled. Note that the debug run only considers reports that have the flag + // "debug_mode": "enabled". Read /docs/debugging.md for details. + "debug_run": + } +} +``` + +Please see [Appendix](/docs/api.md#appendix) for input and output file format details. + +#### Response HTTP codes + +```txt +Success: 202 Accepted +Bad request (malformed): 400 Bad Request +Duplicate job (job_request_id already taken): 409 Conflict +``` + +#### Success Response Payload + +`{} // Empty object in response body for success` + +#### Error Response body + +These match the [Google Cloud Error Model](https://cloud.google.com/apis/design/errors#error_model) + +```jsonc +{ + "error": { + "code": 3, + // Corresponds to this + "message": "detailed error message string", + "status": "INVALID_ARGUMENT", + "details": [ + { + "reason": "API_KEY_INVALID", + "domain": "foo.com", + // might not be present + "metadata": { + // Map, might not be present + "service": "translate.googleapis.com" + } + } + ] + } +} +``` + +# Job Request Validations + +These are the validations that are done before the aggregation begins. + +1. **Job request is valid**\ + i. Job request is not empty.\ + ii. Job should have a job_request_id. + +2. **Job parameters are valid**\ + All required `request_info.job_parameters` map entries must be set with valid values. \ + Please see the createJob request parameter documentation above for more details. +3. Job request's `job_parameters.attribution_report_to` value should match Aggregatable Report's + `shared_info.reporting_origin`. Reports that fail this validation are counted in + ATTRIBUTION_REPORT_TO_MISMATCH error counter. Aggregatable report validations and error counters + can be found in the + [Input Aggregatable Report Validations](#input-aggregatable-report-validations) below +4. Job request's `job_parameters` should contain exactly one of `attribution_report_to` and + `reporting_site`. +5. If `job_parameters.reporting_site` is provided, `shared_info.reporting_origin` of all + aggregatable reports should belong to this reporting site. +6. Job request should contain exactly one of `input_data_blob_prefix` and `input_data_blob_prefixes` + parameters. This validation will be enforced in version 2.11 and onward. + +Return code: +[INVALID_JOB](java/com/google/aggregate/adtech/worker/AggregationWorkerReturnCode.java#L38) + +### getJob Endpoint + +#### Endpoint + +AWS: `https:///stage/v1alpha/getJob` + +GCP: `https:///v1alpha/getJob` + +#### Protocol + +HTTPS + +#### Method + +GET + +#### Request params + +`"job_request_id": ` + +#### Response HTTP code + +```txt +Found: 200 Ok +Not found: 404 Not Found +``` + +#### Response Body + +```jsonc +{ + // Unique identifier + "job_request_id" : "UNIQUEID12313", + // + "job_status": , + // Time request was received + "request_received_at": , + // Last update time + "request_updated_at": , + // Location of input reports + "input_data_blob_prefix": , + // [Optional] List of locations of input reports from the CreateJob request, + // if provided. This parameter will be available in version 2.11 and onward. + "input_data_blob_prefixes": >, + "input_data_bucket_name": , + // Location of output summary report + "output_data_blob_prefix": , + "output_data_bucket_name": , + // Only present when job is finished + "result_info": { + "return_code": , + // Debug information + "return_message": , + "finished_at": , + "error_summary": { + "error_counts": [ + { + "category": , + "count": + }, + ... + ] + } + }, + "job_parameters": { + // Location of pre-listed aggregation buckets + "output_domain_blob_prefix": , + "output_domain_bucket_name": , + // Reporting URL + "attribution_report_to" : , + // [Optional] Reporting site value from the CreateJob request, if provided. + "reporting_site": + // [Optional] differential privacy epsilon value to be used + // for this job. 0.0 < debug_privacy_epsilon <= 64.0. The + // value can be varied so that tests with different epsilon + // values can be performed during the origin trial. A greater + // epsilon value results in less noise in the output. Default + // value for epsilon is 10. + "debug_privacy_epsilon": , + // [Optional] The percentage of reports, if excluded from + // aggregation due to an error, will fail the job. + // Values can be from 0 to 100. If left empty, default value of 10% + // will be used. + "report_error_threshold_percentage": , + // [Optional] Total number of reports provided as input data for this job. + // This value, in conjunction with "report_error_threshold_percentage" will + // enable early failure of the job when reports are excluded due to errors. + "input_report_count": , + // [Optional] A list of unsigned filtering IDs separated by comma. All the + // contribtions other than the matching filtering ID will be filtered out. + // e.g. "filtering_ids":"12345,34455,12". Default value is "0". + "filtering_ids":, + }, + // The time when worker starts processing request in the latest processing + // attempt + // If the job_status is set to `FINISHED`, one can calculate the request's + // processing time in worker (excludes the time spent waiting in job queue) + // as `request_updated_at` minus `request_processing_started_at`. + "request_processing_started_at": +} +``` + +#### Error Response codes + +In case of errors in successfully completing the job, the below error response codes would be +present in the `result_info` section of the GetJob API response body + +- RETRIES_EXHAUSTED: The aggregation request failed because it exhausted the number of retries + attempted. This error is transient and the job can be retried. + +If the job fails due to a handled exception, then `result_info.return_code` will have the +corresponding error code in +[AggregationWorkerReturnCode.java](../java/com/google/aggregate/adtech/worker/AggregationWorkerReturnCode.java) +and `result_info.return_messages` will have the exception message followed by a few stack frames of +the exception stacktrace for debugging. + +If an unexpected exception occurs, `result_info.error_summary.error_messages` will contain the error +messages. + +#### Error Counts - error_counts + +The count of reports that are excluded from aggregation due to errors can be found in the getJob +response `result_info.error_summary.error_counts` with the `category` field giving the error code +and `count` giving the number of reports in that category. + +[Error categories and description](../java/com/google/aggregate/adtech/worker/model/ErrorCounter.java) + +If the total number of reports with errors exceeds 10% of the total report count, then the job will +fail early with return code +[REPORTS_WITH_ERRORS_EXCEEDED_THRESHOLD](../java/com/google/aggregate/adtech/worker/AggregationWorkerReturnCode.java#L88) +before the privacy budget is consumed. The threshold percentage can be set in +job.request_info.job_parameters for the key "report_error_threshold_percentage". + +#### Error Response body + +These match the [Google Cloud Error Model](https://cloud.google.com/apis/design/errors#error_model) + +```jsonc +{ + "error": { + "code": 3, + // Corresponds to this + "message": "detailed error message string", + "status": "INVALID_ARGUMENT", + "details": [ + { + "reason": "API_KEY_INVALID", + "domain": "foo.com", + // might not be present + "metadata": { + // Map, might not be present + "service": "translate.googleapis.com" + } + } + ] + } +} +``` + +### Appendix + +#### Input File format + +Aggregation service expects input aggregatable reports batched in the +[Avro](https://avro.apache.org/) format given below. Please see +[Collecting and Batching Aggregatable Reports](/docs/collecting.md) for how to generate avro +aggregatable reports using collected data. + +#### [reports.avsc](/protocol/avro/reports.avsc) + +```avro +{ + "type": "record", + "name": "AggregatableReport", + "fields": [ + { + "name": "payload", + "type": "bytes" + }, + { + "name": "key_id", + "type": "string" + }, + { + "name": "shared_info", + "type": "string" + } + ] +} +``` + +Additionally a domain file is needed to declare all expected aggregation keys for aggregating the +aggregatable reports (keys not listed in the domain file won't be aggregated). More details on +domain keys can be found +[here](https://developers.google.com/privacy-sandbox/private-advertising/aggregation-service/privacy-protection-report-strategy#pre-declared_aggregation_keys). + +#### [output_domain.avsc](/protocol/avro/output_domain.avsc) + +```avro +{ + "type": "record", + "name": "AggregationBucket", + "fields": [ + { + "name": "bucket", + "type": "bytes" + /* A single bucket that appears in + the aggregation service output. + 128-bit integer encoded as a + 16-byte big-endian byte string. */ + } + ] +} +``` + +#### Output File format + +Summary report is the output file generated by the Aggregation Service and is also in avro format +with the following schema - + +#### [results.avsc](/protocol/avro/results.avsc) + +```avro +{ + "type": "record", + "name": "AggregatedFact", + "fields": [ + { + "name": "bucket", + "type": "bytes", + "doc": "Histogram bucket used in aggregation. 128-bit integer encoded as a 16-byte big-endian bytestring. Leading 0-bits will be left out." + }, + { + "name": "metric", + "type": "long", + "doc": "Metric associated with the bucket" + } + ] +} +``` + +#### Input Aggregatable Report Validations + +Input aggregatable report is required to have a valid and/or supported value for the following +report shared_info fields: `api`, `report_id`, `reporting_origin` and `scheduled_report_time`. +Invalid aggregatable reports will not be included in the aggregation. getJob response +`result_info.error_summary.error_counts` will have error counters for these invalid reports along +with the error code, reason and count of reports in each category. + +If the invalid reports in a job exceed the `report_error_threshold_percentage` (see the +[createJob](#createjob-endpoint) request job parameters above), the job will fail with +REPORTS_WITH_ERRORS_EXCEEDED_THRESHOLD error. + +A summary of all report error counters along with their mitigations can be found in +[Aggregation Service Report Error Codes and Mitigations](/docs/error-codes-and-mitigation.md#aggregation-service-report-error-codes-and-mitigations). + +If report `shared_info.version` is higher than supported major version, the aggregation job will +fail without consuming privacy budget with `result_info.return_code` UNSUPPORTED_REPORT_VERSION. diff --git a/docs/assets/batching.png b/docs/assets/batching.png new file mode 100644 index 00000000..5f0be3b8 Binary files /dev/null and b/docs/assets/batching.png differ diff --git a/docs/assets/duplication.png b/docs/assets/duplication.png new file mode 100644 index 00000000..f5336c72 Binary files /dev/null and b/docs/assets/duplication.png differ diff --git a/docs/assets/instance-type-recommendation.png b/docs/assets/instance-type-recommendation.png new file mode 100644 index 00000000..f620cf26 Binary files /dev/null and b/docs/assets/instance-type-recommendation.png differ diff --git a/docs/assets/resource-based-recommendation.png b/docs/assets/resource-based-recommendation.png new file mode 100644 index 00000000..81b5dc32 Binary files /dev/null and b/docs/assets/resource-based-recommendation.png differ diff --git a/docs/assets/scheduled-report-time.png b/docs/assets/scheduled-report-time.png new file mode 100644 index 00000000..28209199 Binary files /dev/null and b/docs/assets/scheduled-report-time.png differ diff --git a/docs/assets/shared-id.png b/docs/assets/shared-id.png new file mode 100644 index 00000000..82ab1015 Binary files /dev/null and b/docs/assets/shared-id.png differ diff --git a/docs/aws-aggregation-service.md b/docs/aws-aggregation-service.md new file mode 100644 index 00000000..bce45a19 --- /dev/null +++ b/docs/aws-aggregation-service.md @@ -0,0 +1,336 @@ +# Testing on AWS using encrypted reports + +## Prerequisites + +To test the aggregation service with support for encrypted reports, you need the following: + +- Have an [AWS account](https://portal.aws.amazon.com/gp/aws/developer/registration/index.html) + available to you. +- Complete the aggregation service + [onboarding & enrollment flow](https://console.privacysandbox.google.com) + +Once you've submitted the onboarding form, we will contact you to verify your information. Then, +we'll send you the remaining instructions and information needed for this setup.
_You won't be +able to successfully setup your AWS system without completing the onboarding process!_ + +To set up aggregation service in AWS you'll use [Terraform](https://www.terraform.io/). + +## Set up AWS client + +Make sure you +[install](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) and +[set up](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html) the latest +AWS client. + +## Set up Terraform + +Change into the `/terraform/aws` folder. See +[clone the repository](/docs/local-testing-tool.md#clone-the-repository) if you have not cloned the +repository so far. + +The setup scripts require Terraform version `1.2.3`. You can download Terraform version `1.2.3` from +[https://releases.hashicorp.com/terraform/1.2.3/](https://releases.hashicorp.com/terraform/1.2.3/) +or _at your own risk_, you can install and use +[Terraform version manager](https://github.com/tfutils/tfenv) instead. + +If you have the Terraform version manager `tfenv` installed, run the following in your +`` to set Terraform to version `1.2.3`. + +```sh +tfenv install 1.2.3; +tfenv use 1.2.3 +``` + +We recommend you store the [Terraform state](https://www.terraform.io/language/state) in a cloud +bucket. Create a S3 bucket via the console/cli, which we'll reference as `tf_state_bucket_name`. +Consider enabling `versioning` to preserve, retrieve, and restore previous versions and set +appropriate policies for this bucket to prevent accidental changes and deletion. + +## Download Terraform scripts and prebuilt dependencies + +_Note: The prebuilt Amazon Machine Image (AMI) for the aggregation service is only available in the +`us-east-1` region. If you like to deploy the aggregation service in a different region you need to +copy the released AMI to your account or build it using our provided scripts._ + +If you like to build the Amazon Machine Image including the enclave container, as well as the Lambda +jars in your account, please follow the instructions in +[build-scripts/aws](/build-scripts/aws/README.md). This will skip running +`bash download_prebuilt_dependencies.sh` and run `bash fetch_terraform.sh` instead. Continue with +the [next deployment step](#set-up-your-deployment-environment) after building and downloading your +self-build jars. + +The Terraform scripts to deploy the aggregation service depend on 5 packaged jars for Lambda +functions deployment. These jars are hosted on Amazon S3 +(}) +and can be downloaded with the `/terraform/aws/download_prebuilt_dependencies.sh` +script. The script downloads the terrafrom scripts and jars which will be stored in +`/terraform/aws`. License information of downloaded dependencies can be found in +the [DEPENDENCIES.md](/DEPENDENCIES.md) + +Run the following script in the `/terraform/aws` folder to download the prebuilt +dependencies. + +```bash +bash download_prebuilt_dependencies.sh +``` + +_Note: The above script needs to be run with `bash` and does not support `sh`\*_ + +For manual download into the `/terraform/aws/jars` folder you can download them +from the links on our +[releases page](https://github.com/privacysandbox/aggregation-service/releases). + +To copy the AMI to another account and/or region, follow the steps below. + +1. Open the EC2 console at . +2. In the navigation pane, choose AMI under images. +3. Select the AMI aggregation-service-enclave\_[VERSION]--[DATETIME]. It will be under "Public + Images" category. +4. To copy the AMI, select the "Actions" -> "Copy AMI" for the selected AMI. +5. [Optional] Change the Destination Region if another one is preferred. +6. Click on "Copy AMI". + +## Set up your deployment environment + +We use the following folder structure +`/terraform/aws/environments/` to separate deployment +environments. + +To set up your first environment (e.g `dev`), copy the `demo` environment. Run the following +commands from the `/terraform/aws/environments` folder: + +```sh +mkdir dev +cp -R demo/* dev +cd dev +``` + +Make the following adjustments in the `/terraform/aws/environments/dev` folder: + +1. Add the `tf_state_bucket_name` to your `main.tf` by uncommenting and replacing the values using + `<...>`: + + ```sh + # backend "s3" { + # bucket = "" + # key = ".tfstate" + # region = "us-east-1" + # } + ``` + +1. Rename `example.auto.tfvars` to `.auto.tfvars`. Delete the line that reads + `assume_role_parameter = "arn:aws:iam::example:role/example"`. Leave all other values as-is for + the initial deployment. + + ```sh + environment = "" + ... + ... + + alarm_notification_email = "" + ``` + + - environment: name of your environment + - alarm_notification_email: Email to receive alarm notifications. Requires confirmation + subscription through sign up email sent to this address. + - region: The region of the AMI. It is set to "us-east-1" by default. If the AMI is self-built + or is copied to another region, then this value needs to be updated. + + Note: If you want to use an instance type other than the default one specified in the + configuration, we recommend using an instance type with single NUMA node. Memory and CPUs for + the enclave must be from the [same NUMA node](https://docs.kernel.org/virt/ne_overview.html); + however, a single NUMA node on AWS EC2 has a maximum of 48 cores. Please refer to + [sizing guidance](/docs/sizing-guidance.md) for instance type recommendations. For AWS instance + specific questions, please contact AWS support. + +1. **Follow this step if you self-build your AMI and jars or copy the AMI (self-build or prebuilt + AMI) to your account** + + If you [self-build your AMI and jars](/build-scripts/aws/README.md) or copied the AMI to your + account, you need to copy the contents of the `release_params.auto.tfvars` file into a new file + `self_build_params.auto.tfvars` remove the `release_params.auto.tfvars` file afterwards. + + To copy without symlink, run the following in the + `/terraform/aws/environments/dev` folder + + ```sh + cp -L release_params.auto.tfvars self_build_params.auto.tfvars + ``` + + Then delete the symlinked file: + + ```sh + rm release_params.auto.tfvars + ``` + + And change the line `ami_owners = ["971056657085"]` to `ami_owners = ["self"]` in your + `self_build_params.auto.tfvars`. + +1. Once you've adjusted the configuration, run the following in the + `/terraform/aws/environments/dev` folder + + Install all Terraform modules: + + ```sh + terraform init + ``` + + Get an infrastructure setup plan: + + ```sh + terraform plan + ``` + + If you see the following output on a fresh project: + + ```terraform + ... + Plan: 193 to add, 0 to change, 0 to destroy. + ``` + + you can continue to apply the changes (needs confirmation after the planning step) + + ```sh + terraform apply + ``` + + If your see the following output, your setup was successful: + + ```terraform + ... + Apply complete! Resources: 190 added, 0 changed, 0 destroyed. + + Outputs: + create_job_endpoint = "POST https://.execute-api..amazonaws.com/stage/v1alpha/createJob" + frontend_api_id = "xyz" + get_job_endpoint = "GET https://.execute-api..amazonaws.com/stage/v1alpha/getJob" + ``` + + The Terraform scripts create `createJob` and `getJob` API endpoints: + + - Create Job Endpoint: + `https://.execute-api..amazonaws.com/stage/v1alpha/createJob` + - Get Job Endpoint: + `https://.execute-api..amazonaws.com/stage/v1alpha/getJob` + + These are authenticated endpoints, refer to the [Testing the System](#testing-the-system) + section to learn how to use them. + + _If you run into any issues during deployment of your system, please consult the + [Troubleshooting](#troubleshooting) and [Support](/README.md#support) sections._ + +## Testing the system + +To test the system, you'll need encrypted aggregatable reports in Avro batch format (follow the +[collecting and batching instructions](/docs/collecting.md#collecting-and-batching-aggregatable-reports) +accessible by the aggregation service. + +If your inputs are larger than a few hundred MB, we suggest sharding the input reports and domain +file into smaller shards. + +1. Create an S3 bucket for your input and output data, we will refer to it as `data_bucket`. This + bucket must be created in the same AWS account where you set up the aggregation service. \* + Consider enabling `versioning` to preserve, retrieve, and restore previous versions and set + appropriate policies for this bucket to prevent accidental changes and deletion. + +1. Copy your reports.avro with batched encrypted aggregatable reports to `/input`. + +1. Create an aggregation job with the `createJob` API. + + `POST` `https://.execute-api.us-east-1.amazonaws.com/stage/v1alpha/createJob` + + ```json + { + "input_data_blob_prefix": "input/reports.avro", + "input_data_bucket_name": "", + "output_data_blob_prefix": "output/summary_report.avro", + "output_data_bucket_name": "", + "job_parameters": { + "attribution_report_to": "", + "output_domain_blob_prefix": "domain/domain.avro", + "output_domain_bucket_name": "" + }, + "job_request_id": "test01" + } + ``` + + _Note: This API requires authentication. Follow the + [AWS instructions](https://aws.amazon.com/premiumsupport/knowledge-center/iam-authentication-api-gateway/) + for sending an authenticated request._ + +1. Check the status of your job with the `getJob` API, replace values in `<...>` + + `GET` + `https://.execute-api..amazonaws.com/stage/v1alpha/getJob?job_request_id=test01` + + _Note: This API requires authentication. Follow the + [AWS instructions](https://aws.amazon.com/premiumsupport/knowledge-center/iam-authentication-api-gateway/) + for sending an authenticated request. [Detailed API spec](/docs/api.md#getjob-endpoint)_ + +## Updating the system + +_Note: Versions 2.13.0 and higher will contain the terraform files previously available in the +[Coordinator Services and Shared Libraries Repository](https://github.com/privacysandbox/coordinator-services-and-shared-libraries). +When upgrading from a version lower than or equal to 2.12.x, please run the below commands to remove +untracked copies of the folders that will now be managed via the aggregation service repository:_ + +```sh +rm -rf terraform/aws/environments/demo +rm -rf terraform/aws/environments/shared +rm -rf terraform/aws/applications +rm -rf terraform/aws/modules +rm -rf terraform/aws/coordinator-services-and-shared-libraries +``` + +Run the following in the ``. + +```sh +git fetch origin && git checkout -b dev-v{VERSION} v{VERSION} +cd terraform/aws +bash download_prebuilt_dependencies.sh +cd environments/dev +terraform apply +``` + +_Note: If you use self-built artifacts described in +[build-scripts/aws](/build-scripts/aws/README.md), run `bash fetch_terraform.sh` instead of +`bash download_prebuilt_dependencies.sh` and make sure you updated your dependencies in the `jars` +folder._ + +If you're updating from pre-2.13 to 2.13+ : + +1. Make sure to update shared terraform, following this + [section](#download-terraform-scripts-and-prebuilt-dependencies). +2. In your `.auto.tfvars`, delete `coordinator_a_assume_role_parameter` and + `coordinator_b_assume_role_parameter` since the cross-cloud coordinators no longer require these + values. + +## Troubleshooting + +- The following error message points to a potential lack of instance availability. If you + encounter this situation, run `terraform destroy` to remove your deployment and run + `terraform apply` again. + + ```txt + Error: Error creating Auto Scaling Group: ValidationError: You must use a valid + fully-formed launch template. Your requested instance type (m5.2xlarge) is not + supported in your requested Availability Zone (us-east-1e). + Please retry your request by not specifying an Availability Zone or choosing + us-east-1a, us-east-1b, us-east-1c, us-east-1d, us-east-1f. + ``` + +- The following error message points to a potential lack of sufficient elastic VPC IPs quota in + your deployment region. Request a + [quota increase](https://docs.aws.amazon.com/vpc/latest/userguide/amazon-vpc-limits.html) or + decrease the number of subnets created for the aggregation service VPC to resolve the issue. To + stay within the default quota you can decrease the number of subnets, by setting + `vpc_availability_zones = ["a","b","c","d","e"]` in your `.auto.tfvars`. + + ```txt + Error: Error creating EIP: AddressLimitExceeded: The maximum number of addresses has been reached. + status code: 400, request id: 2c7a924c-c807-4714-8d77-8558a463c68b + + with module.operator_service.module.vpc[0].aws_eip.elastic_ip["us-east-1a"], + on ../../modules/vpc/main.tf line 277, in resource "aws_eip" "elastic_ip": + 277: resource "aws_eip" "elastic_ip" { + ``` diff --git a/docs/batching-strategies.md b/docs/batching-strategies.md new file mode 100644 index 00000000..d6f1ed0d --- /dev/null +++ b/docs/batching-strategies.md @@ -0,0 +1,146 @@ +# Strategies for batching + +When batching aggregatable reports, it is important to optimize batching strategies so that privacy +limits are not exceeded. The following are a few recommended strategies for sending batches of +reports to the Aggregation Service. + +## Collect reports + +When collecting reports to include in a batch, keep the following in mind: + +#### Report upload retries + +**Note:** Retry criteria are subject to change. The information in this section will be updated in +that case. + +On both the web and OS platforms, a platform will attempt to send the report three times, but if the +report fails to be sent after the third try, it will not be sent. The original +`scheduled_report_time` value is preserved no matter when the report is able to be sent. The +timeline for retries is different per platform: + +- A web browser will send reports when the browser is online. If the report fails to send, it will + wait five minutes for the second retry, and then 15 minutes for the third. If the browser goes + offline, the next retry will be one minute after it comes back online. There is no maximum delay + in sending reports on the web; this means, if the browser goes offline, no matter how long ago + the report was generated, once the browser goes back online, it will try and send the report in + accordance with the retry policy. +- An Android phone has a consistent network connection. As such, it will run the job to send + reports once per hour. This means that if a report fails to send, it will be retried the next + hour, and again in the hour after that. If the device doesn't have a connection, the device will + retry sending the report with the next reporting job that runs after the device connects to the + network again. The maximum delay is 28 days, which means that the device will not send a report + that was generated more than 28 days ago. + +#### Wait on reports + +It is recommended to wait for late arriving reports when collecting reports for batching. Late +reports can be determined by checking the `scheduled_report_time` value against when the report was +received. The time difference between those reports will help determine how long you may want to +consider waiting for late arriving reports. For example, as delayed reports are collected, check the +`scheduled_report_time` field and note the time delay in hours as 90%, 95%, and 99% of reports are +received. That data can be used to determine how long to wait for late arriving reports. +[Instant aggregate reports](https://github.com/WICG/attribution-reporting-api/blob/main/AGGREGATE.md#optional-reduce-report-delay-with-trigger-context-id) +can be used to reduce the chance of delayed reports. + +The following visual shows late arriving reports being stored in the appropriate batches according +to scheduled report time. Batch T represents scheduled_report_time, and T+X represents time waited +for delayed reports. This results in a summary report that includes the majority of reports that are +included in the batch which corresponds to their scheduled report time. + +![batching](assets/batching.png) + +### Aggregatable report accounting + +The Aggregation Service maintains a +["no duplicates" rule](https://github.com/WICG/attribution-reporting-api/blob/main/AGGREGATION_SERVICE_TEE.md#no-duplicates-rule). +This rule enforces that all Aggregatable reports with the same shared ID must be included in the +same batch. + +After the reports are collected, they should be batched in such a way that all reports with the same +shared ID are part of one batch. + +If a report has already been processed in another batch, the processing can result in a +[privacy budget exhausted error](https://github.com/privacysandbox/aggregation-service/blob/2a83ed7c6e7c99d0a8fa4dc107edec86264aeaad/java/com/google/aggregate/adtech/worker/AggregationWorkerReturnCode.java#L26). +Batching reports correctly helps prevent batches from being rejected due to the "no duplicates" +rule. + +A +[shared ID](https://github.com/WICG/attribution-reporting-api/blob/main/AGGREGATION_SERVICE_TEE.md#disjoint-batches) +is a key that is generated for each report to track aggregatable report accounting. The shared ID +ensures that reports with the same shared ID contribute to only one summary report. This means that +the reports that map to one shared ID together must all be included in a single batch. For example, +if Report X and Report Y both have the same shared ID, they must be included in the same batch to +avoid reports being dropped for duplication. + +The following image demonstrates the shared_info components that are hashed together to generate a +Shared ID. + +![shared-id](assets/shared-id.png) + +The following image demonstrates how two different reports can have the same shared ID: + +![scheduled-report-time](assets/scheduled-report-time.png) + +**Note:** scheduled_report_time is truncated by hour, and source_registration_time is truncated by +day. Report_id is not used in shared ID creation. Time granularity may be updated in the future. + +#### Duplicate reports within batches + +The `shared_info` field in an aggregatable report contains a UUID in the `report_id` field, which is +used to identify duplicate reports within a batch. If there is more than one report with the same +`report_id` in a batch, only the first report will be aggregated, and the others will be considered +duplicates and silently dropped; the aggregation will proceed as normal and no errors will be sent. +Although not required, Adtech can expect to see some performance gains by filtering out the +duplicate reports with same reports ids before aggregation. + +The `report_id` is unique to each report. + +#### Duplicate reports across batches + +Each report is assigned a shared ID, which is an ID generated from combined data points that come +from the report's `shared_info` field. Multiple reports can have the same shared ID, and each batch +can contain multiple shared IDs. All reports with the same shared ID must go in the same batch. If +reports with the same shared ID end up in multiple batches, only the first batch will be accepted, +and the others will be rejected as duplicates. To prevent this, +[batches must be created appropriately](#batch-reports). + +The following image shows an example where reports with the same shared ID across batches can cause +the later batch to fail. In the image, you can see that two or more reports with the same shared ID +e679aa are batched into different batches #1 and #2. Since the budget for all reports with shared ID +e679aa is consumed during Batch #1 summary report generation, Batch #2 is not allowed and fails with +an error. + +![duplication](assets/duplication.png) + +## Batch reports + +The following are recommended ways to batch reports to avoid duplicates and optimize aggregate +report accounting. + +### Batch by advertiser + +**Note:** This strategy is only recommended for Attribution Reporting aggregation. + +Private Aggregation does not have an attribution_destination field, which is the advertiser. It is +recommended to batch by advertiser, meaning to include reports belonging to a single advertiser in +the same batch, to avoid hitting the aggregatable report account limit for each batch. Advertiser is +a field considered in sharedID generation, so reports with the same advertiser could also have the +same sharedID, which would require them to be in the same batch to avoid errors. + +### Batch by time + +It is recommended to consider the report's scheduled report time +(`shared_info.scheduled_report_time`) when batching. Scheduled report time is truncated to the hour +in the shared ID generation, so at a minimum reports should be batched at hour intervals, meaning +all reports with scheduled report time within the same hour should go in the same batch to avoid +having reports with same shared ID across multiple batches, which will lead to job errors. + +### Batching frequency and noise + +It is recommended to consider the +[impact of noise](https://developers.google.com/privacy-sandbox/relevance/attribution-reporting/design-decisions#batching-frequency) +on how often aggregatable reports are processed. If aggregatable reports are batched more +frequently-for example, reports are processed once an hour-fewer conversion events will be included +and noise will have a larger relative impact. If the frequency is decreased and reports are +processed once a week, noise will have a smaller relative impact. To better understand the impact of +noise on batches, experiment with the [Noise Lab](https://noise-lab.uc.r.appspot.com/?mode=simple). diff --git a/docs/collecting.md b/docs/collecting.md new file mode 100644 index 00000000..01d6f7ca --- /dev/null +++ b/docs/collecting.md @@ -0,0 +1,369 @@ +# Collecting and Batching Aggregatable Reports + +This document provides instructions and code snippets on how to collect, transform and batch +[Aggregatable Reports](https://github.com/WICG/conversion-measurement-api/blob/main/AGGREGATE.md#aggregatable-reports) +produced by the +[Attribution Reporting API](https://github.com/WICG/conversion-measurement-api/blob/main/AGGREGATE.md) +and +[Private Aggregation API](https://github.com/patcg-individual-drafts/private-aggregation-api#reports). + +The Attribution Reporting API can generate 4 possible types of reports during the +[Privacy Sandbox Relevance and Measurement origin trials (OT)](https://developer.chrome.com/origintrials/#/view_trial/771241436187197441). +These reports are sent to predefined endpoints to the domain registered during source registration +(such as ). See this [demo](https://goo.gle/attribution-reporting-demo) +for examples. + +1. Event-level report + - Reporting URL: + `http://adtech.localhost/.well-known/attribution-reporting/report-event-attribution` +1. Event-level debug report + - Reporting URL: + `http://adtech.localhost/.well-known/attribution-reporting/debug/report-event-attribution` +1. Aggregatable report + - Reporting URL: + `http://adtech.localhost/.well-known/attribution-reporting/report-aggregate-attribution` +1. Aggregatable debug report + - Reporting URL: + `http://adtech.localhost/.well-known/attribution-reporting/debug/report-aggregate-attribution` + +The Private Aggregation API is used to support reports triggered within a Protected Audience or +Shared Storage context. The predefined endpoints for those two use cases are defined +[here](https://github.com/patcg-individual-drafts/private-aggregation-api/blob/main/README.md#reports). + +1. Protected Audience + - Reporting URL: + `http://adtech.localhost/.well-known/private-aggregation/report-protected-audience` +1. Shared Storage + - Reporting URL: + `http://adtech.localhost/.well-known/private-aggregation/report-shared-storage` + +_The `.well-known/...` paths are predefined paths which can not be customized. To collect reports, +you need to run an endpoint that can respond to POST requests on the above paths._ + +## Aggregatable report sample + +This is a sample aggregatable report produced with the +[Attribution Reporting API Demo](https://goo.gle/attribution-reporting-demo) with debugging enabled. + +```json +{ + "aggregation_coordinator_origin": "https://publickeyservice.msmt.aws.privacysandboxservices.com", + "aggregation_service_payloads": [ + { + "debug_cleartext_payload": "omRkYXRhlKJldmFsdWVEAACAAGZidWNrZXRQPPhnkD+7c+wm1RjAlowp3KJldmFsdWVEAAARMGZidWNrZXRQJFJl9DLxbnMm1RjAlowp3KJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAGlvcGVyYXRpb25paGlzdG9ncmFt", + "key_id": "27c22e1b-dc77-4fc0-aee7-4d291262071c", + "payload": "vxia0shX3KjvsgdNWZdznk2IUWtOi8+fZCTGFniGeRTzAv5LgSeGLd3PhDANDyazjDNSm8GxjtsPmoG08rd5nL8+qc6NwKJfwnAQUVgg/iCS8alpCcrD9aTSTyjeUdrJBmfwvjjydpm6NA6o+RVbpv1N7v+Z3arSvUzqw3k3UfGy12n10+TkaH/ymCo5Ke/9mbSwxy68aJfAGutEt91fo7qHtvvrTAULBIgQTgNsy9LkSeCTQ2YeEr7wyxBssZLrPEanjh6LGtzj2gXRiz3OiVAqXxnSn7eW8K9V9TosFsIVHijk9o5oz6+9LhkDx5SHHvx048m5OqyFe48KSBAlMcHHSSk+GCwQtHcHWgSVb8TmHDE9UnTc7+tSR60IK/UK4351my7aEaKaacF3q28pYjjoy92idwzcw0IWUUMAb4c1z1RetxZ602txSnjOsFLUcW02ReeUJcgynbi5M/DIbpltqTlg2FeSsMzLvf0yGvP6NDUF6jqgaD9kfHcLgwLR61G/SnjXVtdUU31VdS5bPMyrfBthesHytmNFKQQtBqLZ32uyf60NKed9xZku70IW0r/z06hPlvRG+ME+FqPEgbWC/YsBXv/Ua3wPjQ1Q3/BvQWHIPuaEyA2aeDilE0h3wfHMLsGbHxq/5Tw+pqwR12g069Qf5jiYyCiBdo96Vd40iKbZL4DVt85QHevpHFQYTmANBHYqW09Gl3TWnay8BgbIE+38IX2O9lwR59tiRCXFNwLmE6nUtGjfTBFpz1VCIVRos9K14tE4yGfxyyNVt8dHy6CFABG5wYtnT/+izKMhPzZCVA65wqaKEehk26+inHa4GzXCJfWvX5QNV1FxEaSrktM22/91NWsQXyMC2fT7NtK7MEKsXSmkqL0VdlxNR4b6WCz2yd5hVufSKZA8e4Wfljr43Lc22om54o2Y6qtteoIsj9FhJbHmnke/NbrbmEPf9Jk37d/KxGu96X0E46ACA4WQa18hBxKTir+LKI0g+rXJlfwUn4vvNZz1vInX7VUHelZi0mpVylFD5XP09O0PX4oUPx+WVCCf" + } + ], + "shared_info": "{\"api\":\"attribution-reporting\",\"attribution_destination\":\"https://arapi-advertiser.web.app\",\"debug_mode\":\"enabled\",\"report_id\":\"6334058b-301d-40c8-be58-3f63eed454a1\",\"reporting_origin\":\"https://arapi-adtech.web.app\",\"scheduled_report_time\":\"1700089276\",\"source_registration_time\":\"0\",\"version\":\"0.1\"}", + "source_debug_key": "685645209142579", + "trigger_debug_key": "685645209142579" +} +``` + +The `debug_cleartext_payload` field contains the base64 encoded [CBOR](https://cbor.io/) payload. +The above CBOR payload decodes into the following data in JSON format (Decoded with +[CBOR Playground](https://cbor.me)). The bucket value is encoded as a sequence of 'characters' +representing the underlying bytes. While some bytes may be represented as ASCII characters, others +are unicode escaped. + +Using CBOR, you will get the bucket and value in hex format. You can convert the value into decimal +while the bucket can be converted into an escaped unicode format by converting the characters into +ASCII or using the JavaScript code below. + +```json +{ + "data": [ + { + "value": h'00008000', + "bucket": h'3CF867903FBB73EC26D518C0968C29DC' + }, + { + "value": h'00001130', + "bucket": h'245265F432F16E7326D518C0968C29DC' + }, + { + "value": h'00000000', + "bucket": h'00000000000000000000000000000000' + }, + ... + ], + "operation": "histogram" +} +``` + +```javascript +function hexToAscii(hexString) { + if (hexString.length % 2 != 0) { + hexString = '0' + hexString; + } + let asciiStr = ''; + for (let i = 0; i < hexString.length; i += 2) { + asciiStr += String.fromCharCode(parseInt(hexString.substr(i, 2), 16)); + } + return asciiStr; +} +``` + +## Convert the aggregatable report into Avro binary representation + +Both the local testing tool and the aggregation service running on AWS Nitro Enclave expect +aggregatable reports batched in the [Avro](https://avro.apache.org/) format given below. + +### `reports.avsc` + +```avro +{ + "type": "record", + "name": "AggregatableReport", + "fields": [ + { + "name": "payload", + "type": "bytes" + }, + { + "name": "key_id", + "type": "string" + }, + { + "name": "shared_info", + "type": "string" + } + ] +} +``` + +The [sample report](#aggregatable-report-sample) lists a `debug_cleartext_payload` field that is +_not_ encrypted and can be processed with the [local testing tool](/docs/local-testing-tool.md). + +For local testing, the avro `payload` field expects a byte array of the `debug_cleartext_payload` +field (`base64` encoded). The `debug_cleartext_payload` field is present in each aggregation service +payload object in the `aggregation_service_payloads` list of an aggregatable report with debugging +enabled. + +For testing with encrypted reports on the Amazon Web Services +[Nitro Enclaves](https://aws.amazon.com/ec2/nitro/nitro-enclaves/), the avro `payload` field expects +a byte array of the aggregatable report's `aggregation_service_payloads` object's `payload` field. + +## Collect, transform and batch reports + +The following code snippets are in Golang, but can be adapted to other programming languages. + +### Listen on predefined endpoints + +When debugging is enabled for the Attribution Reporting API, additional fields are present in the +reports, and a duplicate debug report is sent immediately. The following 2 predefined endpoints are +used: + +1. `.well-known/attribution-reporting/report-aggregate-attribution` for regular, scheduled (delayed) + reports with encrypted payloads. If debugging is enabled, these will contain additional fields: + for example, a cleartext payload if both debug keys are also set. +2. `.well-known/attribution-reporting/debug/report-aggregate-attribution` for debug reports that are + duplicates of the regular reports, but sent immediately at generation time. + +First, lets define all types we will work with: + +- Aggregatable report generated from the Attribution Reporting API + + ```go + // AggregatableReport contains the information generated by the Attribution + // Reporting API in the browser + type AggregatableReport struct { + SourceSite string `json:"source_site"` + AttributionDestination string `json:"attribution_destination"` + // SharedInfo is a JSON serialized instance of struct SharedInfo. + // This exact string is used as authenticated data for decryption. The string + // therefore must be forwarded to the aggregation service unmodified. The + // reporting origin can parse the string to access the encoded fields. + // https://github.com/WICG/conversion-measurement-api/blob/main/AGGREGATE.md#aggregatable-reports + SharedInfo string `json:"shared_info"` + AggregationServicePayloads []*AggregationServicePayload `json:"aggregation_service_payloads"` + + SourceDebugKey uint64 `json:"source_debug_key,string"` + TriggerDebugKey uint64 `json:"trigger_debug_key,string"` + } + + // AggregationServicePayload contains the payload for the aggregation server. + type AggregationServicePayload struct { + // Payload is a encrypted CBOR serialized instance of struct Payload, which is base64 encoded. + Payload string `json:"payload"` + KeyID string `json:"key_id"` + DebugCleartextPayload string `json:"debug_cleartext_payload,omitempty"` + } + ``` + +- Aggregatable report in Avro format, as expected by the aggregation service (you'll need to + import [gopkg.in/avro.v0](https://pkg.go.dev/gopkg.in/avro.v0)) + + ```go + // AvroAggregatableReport format expected by aggregation service and local testing tool + type AvroAggregatableReport struct { + Payload []byte `avro:"payload"` + KeyID string `avro:"key_id"` + SharedInfo string `avro:"shared_info"` + } + ``` + +Now let's register request handlers and start an http server: + +```go +func main() { + http.HandleFunc("/.well-known/attribution-reporting/report-aggregate-attribution", collectEndpoint) + http.HandleFunc("/.well-known/attribution-reporting/debug/report-aggregate-attribution", collectEndpoint) + var address = ":3001" + log.Printf("Starting Collector on address %v", address) + log.Fatal(http.ListenAndServe(address, nil)) +} +``` + +And here is how we handle incoming reports in our `HandlerFunc` implementation: + +```go +func collectEndpoint(w http.ResponseWriter, r *http.Request) { + var timeStr = time.Now().Format(time.RFC3339) + if r.Method == "POST" { + var endpoint = "regular" + // check if report was an immediately sent one to the debug endpoint + if strings.Contains(r.URL.Path, ".well-known/attribution-reporting/debug/report-aggregate-attribution") { + endpoint = "debug" + } + + log.Printf("Received Aggregatable Report on %s endpoint", endpoint) + report := &AggregatableReport{} + buf := new(bytes.Buffer) + buf.ReadFrom(r.Body) + log.Print(buf.String()) + if err := json.Unmarshal(buf.Bytes(), report); err != nil { + errMsg := "Failed in decoding aggregation report" + http.Error(w, errMsg, http.StatusBadRequest) + log.Printf(errMsg+" %v", err) + return + } + schema, err := avro.ParseSchema(reports_avsc) + check(err) + + f, err := os.Create(fmt.Sprintf("output_%s_reports_%s.avro", endpoint, timeStr)) + check(err) + defer f.Close() + + w := bufio.NewWriter(f) + writer, err := avro.NewDataFileWriter(w, schema, avro.NewSpecificDatumWriter()) + check(err) + + var dwriter *avro.DataFileWriter + var dw *bufio.Writer + if (len(report.AggregationServicePayloads) > 0 && len(report.AggregationServicePayloads[0].DebugCleartextPayload) > 0) { + df, err := os.Create(fmt.Sprintf("output_%s_clear_text_reports_%s.avro", endpoint, timeStr)) + check(err) + defer df.Close() + + dw = bufio.NewWriter(df) + dwriter, err = avro.NewDataFileWriter(dw, schema, avro.NewSpecificDatumWriter()) + check(err) + } + + for _, payload := range report.AggregationServicePayloads { + var payload_cbor []byte + var err error + + payload_cbor, err = b64.StdEncoding.DecodeString(payload.Payload) + check(err) + avroReport := &AvroAggregatableReport{ + Payload: []byte(payload_cbor), + KeyID: payload.KeyID, + SharedInfo: report.SharedInfo, + } + + if err := writer.Write(avroReport); err != nil { + log.Fatal(err) // i/o errors OR encoding errors + } + + if len(payload.DebugCleartextPayload) > 0 { + payload_debug_cbor, err := b64.StdEncoding.DecodeString(payload.DebugCleartextPayload) + check(err) + avroDReport := &AvroAggregatableReport{ + Payload: []byte(payload_debug_cbor), + KeyID: payload.KeyID, + SharedInfo: report.SharedInfo, + } + if err := dwriter.Write(avroDReport); err != nil { + log.Fatal(err) // i/o errors OR encoding errors + } + } + } + writer.Flush() + w.Flush() + if dwriter != nil { + dwriter.Flush() + dw.Flush() + } + + } else { + http.Error(w, "Invalid request method.", http.StatusMethodNotAllowed) + log.Print("Invalid request received.") + } +``` + +Once an aggregatable report has been collected, it'll be stored in the +`output_regular_reports_.avro` and `output_regular_clear_text_reports_.avro` +for report received on the `.well-known/attribution-reporting/report-aggregate-attribution` endpoint +and `output_debug_reports_.avro` and `output_debug_clear_text_reports_.avro` +for report received on the `.well-known/attribution-reporting/debug/report-aggregate-attribution` +endpoint respectively. + +## Process Avro batch files + +To process the above Avro files, you must specify the expected bucket keys in a domain file. The +bucket values are 128-bit integer encoded as a 16-byte big-endian bytestring. `output_domain.avro` +with the following Avro schema. + +The schema for output domain file is provided below - + +### `output_domain.avsc` + +```avro +{ + "type": "record", + "name": "AggregationBucket", + "fields": [ + { + "name": "bucket", + "type": "bytes", + "doc": "A single bucket that appears in the aggregation service output. 128-bit integer encoded as a 16-byte big-endian bytestring." + } + ] +} +``` + +### Generate a output domain Avro file + +You can use the [Avro Tools](https://www.apache.org/dyn/closer.cgi/avro/) to generate a +`output_domain.avro` from a JSON input file. + +You can download the Avro Tools jar 1.11.1 +[here](http://archive.apache.org/dist/avro/avro-1.11.1/java/avro-tools-1.11.1.jar) + +We use the following `output_domain.json` input file to generate our `output_domain.avro` file. This +uses the bucket from the above [sample aggregatable report](#aggregatable-report-sample). The below +sample uses unicode escaped "characters" to encode the byte array bucket value. + +```json +{ + "bucket": "<øg\u0090?»sì&Õ\u0018À\u0096\u008c)Ü" +} +``` + +To generate the `output_domain.avro` file use the above JSON file and domain schema file: + +```sh +java -jar avro-tools-1.11.1.jar fromjson \ +--schema-file output_domain.avsc output_domain.json > output_domain.avro +``` + +Another sample of a valid output domain json file - + +```json +{ + "bucket": "\u003c\u00f8\u0067\u0090\u003f\u00bb\u0073\u00ec\u0026\u00d5\u0018\u00c0\u0096\u008c\u0029\u00dc" +} +``` diff --git a/docs/debugging.md b/docs/debugging.md new file mode 100644 index 00000000..6409ecd6 --- /dev/null +++ b/docs/debugging.md @@ -0,0 +1,170 @@ +# Debug aggregation runs with encrypted payloads + +This document describes the debugging support for the Aggregation Service running in a TEE using +encrypted payloads of aggregatable reports. This allows you to debug your production setup and +understand how the encrypted payloads of aggregatable reports are processed. Reports with +debug_cleartext_payload can be used with the [local testing tool](/docs/local-testing-tool.md) and +are helpful for understanding the content of reports and validating that registrations on the +browser client or device are configured properly. + +To test the Aggregation Service, you can enable debug aggregation runs which use encrypted payloads +of aggregatable reports to generate debug summary reports. When executing a debug run, no noise is +added to the debug summary report, and annotations are added to indicate whether keys are present in +domain input and/or reports. This allows developers to: + +- Analyze the reports +- Determine if the aggregation was completed correctly, per the adtech's specifications +- Understand the impact of noise in summary reports +- Determine how to set the proper domain keys + +Additionally, debug runs do not enforce the +[No-Duplicates rule](https://github.com/WICG/attribution-reporting-api/blob/main/AGGREGATION_SERVICE_TEE.md#no-duplicates-rule) +across batches. The No-Duplicates rule is still enforced within a batch. This allows adtech to try +different batches without worrying about making them +[disjoint](https://github.com/WICG/attribution-reporting-api/blob/main/AGGREGATION_SERVICE_TEE.md#disjoint-batches) +during testing or debugging. + +Once third-party cookies are deprecated, the client (browser or operating system) will no longer +generate aggregatable reports that are enabled for debugging. At that time, debug runs with +encrypted payloads will no longer be supported for reports from real user devices or browsers. + +In this document, you'll find code snippets and instructions for how to debug the Aggregation +Service and create debug summary reports. + +## Create a debug job + +To create an aggregation debug job, add the `debug_run` parameter to the `job_parameters` object of +the `createJob` API request. + +AWS: `POST https://.execute-api.us-east-1.amazonaws.com/stage/v1alpha/createJob` +GCP: `POST https:///v1alpha/createJob` + +```json +{ + "input_data_blob_prefix": "input/reports.avro", + "input_data_bucket_name": "", + "output_data_blob_prefix": "output/summary_report.avro", + "output_data_bucket_name": "", + "job_parameters": { + "attribution_report_to": "", + "output_domain_blob_prefix": "domain/domain.avro", + "output_domain_bucket_name": "", + "debug_run": "true" + }, + "job_request_id": "test01" +} +``` + +If `debug_run` is not present in`job_parameters` or it's set to `false`, a normal noised aggregation +run is created. More details about `createJob` API can be found in +[detailed API spec](/docs/api.md#createjob-endpoint). + +## Debuggable aggregatable reports + +A debug run only considers reports that have the flag `"debug_mode": "enabled"` in the report +shared_info ([aggregatable report sample](/docs/collecting.md#aggregatable-report-sample)). Reports +with the `debug_mode` flag missing or the `debug_mode` value isn't set to `enabled` aren't included +in the results generated by a debug run. + +The count of reports that were not processed during a debug run is returned in the job response, +which can be previewed in the [detailed API spec](/docs/api.md#createjob-endpoint). In the +`error_counts` field, the category `NUM_REPORTS_DEBUG_NOT_ENABLED` shows the numbers of reports not +processed during a debug run. + +## Results + +Two summary reports are generated from a debug run: a regular summary report and a debug summary +report. The regular summary report format generated from the debug run is consistent with that of a +regular aggregation run. The debug summary report has a [different format](#debug-summary-report). +The path of the summary report is set in the [createJob](/docs/api.md#createjob-endpoint) API. The +debug summary report will be stored in the "debug" folder under the summary report's path with the +same object name. + +Considering the following createJob parameters for `output_data_bucket_name` and +`output_data_blob_prefix`: + +```json +{ + "output_data_blob_prefix": "output/summary_report.avro", + "output_data_bucket_name": "" +} +``` + +the following objects are created by a debug run: + +`s3:///output/summary_report.avro` and + +`s3:///output/debug/summary_report.avro`. + +Note that the regular summary report generated during a debug run will only include reports which +have the flag `"debug_mode": "enabled"` in the reports `shared_info`. + +### Debug summary report + +The debug summary report includes the following data: + +- `bucket`: The aggregation key +- `unnoised_metric`: The aggregation value without noise +- `noise`: The approximate noise applied to the aggregated results in the regular summary report +- `annotations`: The annotations associated with the bucket + +The keys in the debug summary report will include all the keys from the output domain. + +If the key is only present in the output domain (not in any of the processed aggregatable reports), +the key will be included in the debug report with `unnoised_metric=0` and +`annotations=["in_domain"]`. + +The keys that are only present in aggregatable reports (not in output domain) will also be included +in the debug report with `unnoised_metric=` and +`annotations=["in_reports"]`. + +Keys that are present in domain and aggregatable reports will have annotations for both +`["in_domain", "in_reports"]`. + +The schema of debug summary reports is in the following [Avro](https://avro.apache.org/) format: + +```avro +{ +"type": "record", +"name": "DebugAggregatedFact", +"fields": [ + { + "name": "bucket", + "type": "bytes", + "doc": "Histogram bucket used in aggregation. 128-bit integer encoded as a 16-byte big-endian bytestring. Leading 0-bits will be left out." + }, + { + "name": "unnoised_metric", + "type": "long", + "doc": "Unnoised metric associated with the bucket." + }, + { + "name": "noise", + "type": "long", + "doc": "The noise applied to the metric in the regular result." + } + { + "name":"annotations", + "type": + { + "type": "array", + "items": { + "type":"enum", + "name":"bucket_tags", + "symbols":["in_domain","in_reports"] + } + } + ] +} +``` + +### Privacy Budget Service Errors + +When an aggregation job is performed with `debug_run` enabled, the privacy budget is **not** +consumed. Furthermore, budget availability will not be checked while `debug_run` is enabled -- even +if budget is not available, the summary report will still be generated successfully. + +This change was made in version 2.10. For versions 2.9 and lower, debug runs _would_ consume privacy +budget. Budget that was consumed with previous debug runs will not be recovered automatically. If +budget recovery is necessary for previously consumed budget, please see the +[budget recovery process](https://github.com/privacysandbox/aggregation-service/wiki/Aggregate-Report-Accounting-Budget-Recovery-Criteria-&-Process) diff --git a/docs/error-codes-and-mitigation.md b/docs/error-codes-and-mitigation.md new file mode 100644 index 00000000..b47804c7 --- /dev/null +++ b/docs/error-codes-and-mitigation.md @@ -0,0 +1,47 @@ +# Error Codes and Mitigations for Aggregation Service + +## Aggregation Service Return Codes and Mitigations + +This section covers the return code provided by the Aggregation Service job once it finishes +running. The `return_code` field within the `result_info` section of the getJob API response will +provide these return codes listed in [/docs/api.md#getjob-endpoint](/docs/api.md#getjob-endpoint). + +| Return Code | Message | When does this error happen? | Job can be retried | Adtech actionable? | Mitigation | +| -------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| SUCCESS | Aggregation Job completed successfully. | Aggregation Job completed successfully. | N/A | N/A | N/A | +| SUCCESS_WITH_ERRORS | "Aggregation job successfully processed but some reports have errors." | Some of the reports had processing errors. | No | No | Check the Error Summary to see Aggregation Service Report Error Codes. More details about error summary at [/docs/api.md#error-response-body-1](/docs/api.md#error-response-body-1) | +| PRIVACY_BUDGET_EXHAUSTED | "Insufficient privacy budget for one or more aggregatable reports. No aggregatable report can appear in more than one aggregation job. Information related to reports that do not have budget can be found in the following file: File path: `//` Filename: `privacy_budget_exhausted_.json` " | When a job is trying to process reports that have been processed before or have the same shared ID as another report that is already processed. | No | Yes | Remove reports that have shared IDs with no budget left. A JSON file with information on the inputs that led to the privacy budget exhausted error is at output_data_blob_prefix. This file contains the {shared_info, filtering_id} combinations that are causing the related privacy budget error. Aggregatable reports matching the {shared_info, filtering_id} combinations can be removed from the job to mitigate the issue. Note: All reports regardless of production or debug endpoint will need to be batched according to shared ID. If you have a batch where the shared ID both exists in production and debug, you will encounter a privacy budget exhausted error. See our batching strategies [/docs/batching-strategies.md](/docs/batching-strategies.md) for more information. | +| PRIVACY_BUDGET_ERROR | "Exception while consuming privacy budget. Exception message: " + {exception message} | An error happened while consuming the privacy budget. | Yes | Yes | Retry the job. We also recommend each batch to be per advertiser or destination. Batching strategies can be found at [/docs/batching-strategies.md](/docs/batching-strategies.md) | +| INVALID_JOB | "Error due to validation exception." | When the job parameters fail validation. | Yes | Yes | Correct the job parameters for the job based on the validation message returned. Please see the createJob request parameter documentation for more details : [/docs/api.md#payload](/docs/api.md#payload) | +| RESULT_WRITE_ERROR | "Exception occured while writing result." | When the write to the output directory fails. | No | Yes | 1. Check that the account running Aggregation Service has write permissions for the output directory. 2. If a budget recovery process is available then contact Aggregation Service support for recovering the budget. | +| INTERNAL_ERROR | "Exception in processing domain." or "Internal Service Exception when processing reports." | An error occurred while processing output domains or Internal Error encountered. | Yes | Yes | Ensure that output domain location is a valid path. Retry the job. If error persists, contact Aggregation Service support. | +| UNSUPPORTED_REPORT_VERSION | "Exception due to unsupported report version" | An aggregatable report with a higher major sharedInfo version was provided and Aggregation Service is not up-to-date to support this version. | No | Yes | Update Aggregation Service deployment to a version that supports the report versions. | +| PERMISSION_ERROR | "Exception because of missing permission." | Aggregation service did not have access to storage or other requested resources. | No | Yes | 1. Ensure that Aggregation Service has access to the storage and requested resources to run the job. 2. This could be due to permission error while fetching decryption keys. Ensure that the account running Aggregation Service is the same as the one provided during onboarding. | +| INPUT_DATA_READ_FAILED | "No report shards found for location: " + reportsLocationor "Exception while reading reports input data." or "Exception while reading domain input data." | No reports or output domain shards were found, or the Aggregation Service was unable to read them. | Yes | Yes | 1.Ensure that the input report data location has the reports to be processed. 2.Ensure that the job has the right permissions to read the input/domain shards. Make sure the worker/job has the correct permissions to read the shards. 3.Ensure that the input_data_bucket_name, input_data_blob_prefix, output_data_bucket_name and output_data_blob_prefix fields are correct in your createJob request | +| REPORTS_WITH_ERRORS_EXCEEDED_THRESHOLD | "Aggregation job failed early because the number of reports excluded from aggregation exceeded threshold." | The number reports with an issue exceeded the threshold. | Yes. | Yes | Check the Error Summary to see Aggregation Service Report Error Codes. Retry the job once reports with errors are removed from the batch. | +| PRIVACY_BUDGET_AUTHENTICATION_ERROR | "Aggregation service is not authenticated to call privacy budget service. This could happen due to a misconfiguration during enrollment. Please contact support for resolution." | Aggregation Service is not set up correctly for Aggregatable report accounting. | Yes, retry after setup is fixed. | Yes | Check that the account running the Aggregation Service matches the account that was provided during onboarding. | +| PRIVACY_BUDGET_AUTHORIZATION_ERROR | "Aggregation service is not authorized to call privacy budget service. This could happen if the createJob API job_paramaters.attribution_report_to does not match the one registered at enrollment. Please verify and contact support if needed." | The attribution reporting origin in the job parameters doesn't match the one registered during enrollment. | Yes, retry after changing the reporting origin job parameter. | Yes | Correct the job parameter `attribution_report_to`. | + +## Aggregation Service Report Error Codes and Mitigations + +This section covers the report-level errors present in the error summary. These are reports excluded +from aggregation due to errors and can be found in the `getJob` response +`result_info.error_summary.error_counts`. See +[/docs/api.md#error-response-body-1](/docs/api.md#error-response-body-1) for more details. + +| Return Code | Message | When does this error happen? | Mitigation | +| --------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| DECRYPTION_KEY_NOT_FOUND | "Could not find decryption key on private key endpoint." | The key_id supplied in the report's payload was not found. | For Attribution Reporting API, this error may be caused by an issue with the trigger registration. Check that the trigger has been registered with the correct cloud using the `aggregation_coordinator_origin` field (instructions here: [AGGREGATE.md#data-processing-through-a-secure-aggregation-service in github.com/WICG/attribution-reporting-api](https://github.com/WICG/attribution-reporting-api/blob/main/AGGREGATE.md#data-processing-through-a-secure-aggregation-service)). This can also happen when aggregatable reports encrypted for one cloud are aggregated with an Aggregation service running on another cloud provider. Validate the public key endpoint used to encrypt the aggregatable reports. On your raw aggregatable report received in your .well-known reporting endpoint, you should be able to see the `aggregation_coordinator_origin` field. For GCP, the value should be `https://publickeyservice.msmt.gcp.privacysandboxservices.com`. For AWS, it's `https://publickeyservice.msmt.aws.privacysandboxservices.com`. If `aggregation_coordinator_origin` is not stated in the Attribution Reporting API / Private Aggregation API, the default will be AWS. For Attribution Reporting API, you can specify your cloud provider by passing it in the trigger registration. For Private Aggregation API, you will have to define the `aggregationCoordinatorOrigin` using the example in Aggregation coordinator choice section in the Private Aggregation API explainer. Please specify `https://publickeyservice.msmt.gcp.privacysandboxservices.com` as the "aggregationCoordinatorOrigin". | +| DECRYPTION_KEY_FETCH_ERROR | "Fetching the decryption key for report decryption failed. This can happen using an unapproved aggregation service binary, running the aggregation service binary in debug mode, key corruption or service availability issues." | This happens if running an unapproved Aggregation Service binary or due to Key Service issues. | No action required in case of Key Service disruptions. Job can be retried. In case of unapproved binary, using the right binary will fix the issue. Follow instructions here to use prebuilt image or self-build your image: [/docs/aws-aggregation-service.md#download-terraform-scripts-and-prebuilt-dependencies](/docs/aws-aggregation-service.md#download-terraform-scripts-and-prebuilt-dependencies) | +| DECRYPTION_ERROR | "Unable to decrypt the report. This may be caused by: a tampered aggregatable report file, a corrupt encrypted report, or other such issues." | This happens when report decryption fails. | 1. Ensure that the Aggregatable AVRO reports are generated correctly. Payload will need to be base64 decoded and converted into a byte array. More information on how to generate an AVRO report can be found at [/docs/collecting.md#convert-the-aggregatable-report-into-avro-binary-representation](/docs/collecting.md#convert-the-aggregatable-report-into-avro-binary-representation) 2. Ensure that the report is in avro format. 3.Check if the output domain AVRO is correct. Buckets are converted to escaped unicode hex format and then converted into a byte array. Contact Aggregation Service support for next steps. | +| ATTRIBUTION_REPORT_TO_MALFORMED | Report's reporting_origin domain is malformed. Domain must be syntactically valid and have an Effective Top Level Domain (eTLD). | This happens when the reporting origin's domain is malformed/invalid. | Ensure that the reports have a valid reporting origin domain. | +| ATTRIBUTION_REPORT_TO_MISMATCH | Report's reporting_origin value does not match attribution_report_to value set in the Aggregation job parameters. Aggregation request job parameters must have attribution_report_to set to report's reporting_origin value. | This occurs when there is a mismatch between the report's origin and the aggregation job parameters. | Change the reporting origin in the job parameter attribution_report_to to match the reporting origin of the reports being processed. | +| DEBUG_NOT_ENABLED | "Reports without .debug_mode enabled cannot be processed in a debug run." | This happens when the job is trying to process reports without debug mode enabled in a debug run. | Process only debug mode enabled reports in the debug run. A debug run only considers reports that have the flag "debug_mode": "enabled" in the report shared_info, see example at: [collecting.md#aggregatable-report-sample](/docs/collecting.md#aggregatable-report-sample) | +| NUM_REPORTS_WITH_ERRORS | "Total number of reports had an error. These reports were not considered in aggregation. See additional error messages for details on specific reasons. | This indicates that some reports had errors and were excluded from aggregation. | Exclude the processed reports and rerun the job with the unprocessed reports. | +| ORIGINAL_REPORT_TIME_TOO_OLD | "Report's scheduled_report_time is too old, reports cannot be older than 90 days." | This error occurs when the report's timestamp is older than the allowed 90-day limit. | N/A - The reports are too old to be processed. | +| INTERNAL_ERROR | "Internal error occurred during operation." | An internal error within the Aggregation Service service during operation. | Retry the job. If you encounter repeated Internal Errors, contact Aggregation Service support for help. | +| UNSUPPORTED_OPERATION | "Report's operation is unsupported. Supported operations are {SUPPORTED_OPERATIONS}." | This means that the report's operation is not among the supported operations. | N/A - The report's operation is not supported by Aggregation Service. | +| UNSUPPORTED_REPORT_API_TYPE | "The report's API type is not supported for aggregation. Supported APIs are {SUPPORTED_APIS}" | This error occurs when the report's API type is not supported by Aggregation Service. | N/A - The report's API type is not supported by Aggregation Service. | +| REQUIRED_SHAREDINFO_FIELD_INVALID | "One or more required SharedInfo fields are empty or invalid." | This indicates that essential SharedInfo fields are missing or contain invalid values. | Ensure that the reports have all the required SharedInfo fields. | +| INVALID_REPORT_ID | "Report ID missing or invalid in SharedInfo." | This error happens when the report ID is missing or invalid in the SharedInfo. | N/A - Aggregation Service cannot process reports with invalid report ID. | +| UNSUPPORTED_SHAREDINFO_VERSION | "Report has an unsupported version value in its shared_info. Supported values for report shared_info major version(s) are:{SUPPORTED_MAJOR_VERSIONS}" | This error arises when the report's shared_info version is incompatible with the supported versions. | Process the reports with a version of Aggregation Service that supports the report versions. | diff --git a/docs/gcp-aggregation-service.md b/docs/gcp-aggregation-service.md new file mode 100644 index 00000000..30932070 --- /dev/null +++ b/docs/gcp-aggregation-service.md @@ -0,0 +1,408 @@ +# Testing on GCP using encrypted reports + +## Prerequisites + +To test the aggregation service with support for encrypted reports, you need the following: + +- Have a [GCP project](https://cloud.google.com/). +- Run the [Adtech Setup Terraform](#adtech-setup-terraform) to create/configure the service + account needed for onboarding. +- Complete the aggregation service + [onboarding & enrollment flow](https://console.privacysandbox.google.com) + +Once you've submitted the onboarding form, we will contact you to verify your information. Then, +we'll send you the remaining instructions and information needed for this setup.
_You won't be +able to successfully setup your GCP deployment without completing the onboarding process!_ + +To set up aggregation service in GCP you'll use [Terraform](https://www.terraform.io/). + +## Set up GCLOUD CLI + +Make sure you [install](https://cloud.google.com/sdk/gcloud) and +[authenticate](https://cloud.google.com/sdk/docs/authorizing#auth-login) the latest gcloud CLI. + +## Set up Terraform + +Change into the `/terraform/gcp` folder. See +[clone the repository](/docs/local-testing-tool.md#clone-the-repository) if you have not cloned the +repository so far. + +The setup scripts require Terraform version `1.2.3`. You can download Terraform version `1.2.3` from +[https://releases.hashicorp.com/terraform/1.2.3/](https://releases.hashicorp.com/terraform/1.2.3/) +or _at your own risk_, you can install and use +[Terraform version manager](https://github.com/tfutils/tfenv) instead. + +If you have the Terraform version manager `tfenv` installed, run the following in your +`` to set Terraform to version `1.2.3`. + +```sh +tfenv install 1.2.3; +tfenv use 1.2.3 +``` + +We recommend you store the [Terraform state](https://www.terraform.io/language/state) in a cloud +bucket. Create a Google Cloud Storage bucket via the console/cli, which we'll reference as +`tf_state_bucket_name`. Consider enabling `versioning` to preserve, retrieve, and restore previous +versions and set appropriate policies for this bucket to prevent accidental changes and deletion. + +```sh +gsutil mb gs:// +``` + +[Authenticate](https://cloud.google.com/sdk/docs/authorizing#adc) gcloud cli for terraform. + +```sh +gcloud auth application-default login +``` + +## Download Terraform scripts and prebuilt dependencies + +If you like to build the Confidential Space container, as well as the Cloud Function jars in your +account, please follow the instructions in [build-scripts/gcp](/build-scripts/gcp/README.md). Skip +running `bash download_prebuilt_dependencies.sh` and run `bash fetch_terraform.sh` instead. Continue +with the [next deployment step](#set-up-your-deployment-environment) after building and downloading +your self-build jars. + +The Terraform scripts to deploy the aggregation service depend on 2 packaged jars for Cloud +functions deployment. These jars are hosted on Google Cloud Storage +(}) +and can be downloaded with the `/terraform/gcp/download_prebuilt_dependencies.sh` +script. The script downloads the terrafrom scripts and jars which will be stored in +`/terraform/gcp`. License information of downloaded dependencies can be found in +the [DEPENDENCIES.md](/DEPENDENCIES.md) + +Run the following script in the `/terraform/gcp` folder to download the prebuilt +dependencies. + +```bash +bash download_prebuilt_dependencies.sh +``` + +_Note: The above script needs to be run with `bash` and does not support `sh`\*_ + +For manual download into the `/terraform/gcp/jars` folder you can download them +from the links on our +[releases page](https://github.com/privacysandbox/aggregation-service/releases). + +## Adtech Setup Terraform + +Make sure you have completed the steps above before following the next instructions. + +- [Set up GCLOUD CLI](#set-up-gcloud-cli) +- [Set up Terraform](#set-up-terraform) +- [Download Terraform scripts and prebuilt dependencies](#download-terraform-scripts-and-prebuilt-dependencies) + +Make the following adjustments in the `/terraform/gcp/environments/adtech_setup` +folder: + +1. Copy `main.tf_sample` to `main.tf` and add the `tf_state_bucket_name` to your `main.tf` by + uncommenting and replacing the values using `<...>`: + + ```sh + # backend "gcs" { + # bucket = "" + # prefix = "adtech_setup-tfstate" + # } + ``` + +1. Copy `adtech_setup.auto.tfvars_sample` to `adtech_setup.auto.tfvars` and replace the values + using `<...>` following instructions in the file. + +1. Once you've adjusted the configuration, run the following in the + `/terraform/gcp/environments/adtech_setup` folder + + Install all Terraform modules: + + ```sh + terraform init + ``` + + Get an infrastructure setup plan: + + ```sh + terraform plan + ``` + + If you see the following output on a fresh project: + + ```terraform + ... + Plan: ?? to add, 0 to change, 0 to destroy. + ``` + + you can continue to apply the changes (needs confirmation after the planning step) + + ```sh + terraform apply + ``` + + If your see the following output, your setup was successful: + + ```terraform + ... + Apply complete! Resources: 54 added, 0 changed, 0 destroyed. + ... + ``` + +_Note: Please be advised that executing `terraform destroy` for the Adtech Setup environment will +result in the deletion of all resources generated within that environment._ + +## Set up your deployment environment + +_Note: Please, make sure that you have completed the above [Prerequisites](#prerequisites), +including the onboarding process._ + +We use the following folder structure +`/terraform/gcp/environments/` to separate deployment +environments. + +To set up your first environment (e.g `dev`), copy the `demo` environment. Run the following +commands from the `/terraform/gcp/environments` folder: + +```sh +mkdir dev +cp -R demo/* dev +cd dev +``` + +Make the following adjustments in the `/terraform/gcp/environments/dev` folder: + +1. Add the `tf_state_bucket_name` to your `main.tf` by uncommenting and replacing the values using + `<...>`: + + ```sh + # backend "gcs" { + # bucket = "" + # prefix = "-tfstate" + # } + ``` + +1. Rename `example.auto.tfvars` to `.auto.tfvars` and replace the values using + `<...>`. Leave all other values as-is for the initial deployment. + + ```sh + project_id = "" + environment = "" + ... + alarms_enabled = true + alarms_notification_email = "" + ``` + + - project_id: Google Cloud project ID for your deployment + - environment: name of your environment + - user_provided_worker_sa_email: Set to worker service account created in + [Adtech Setup section](./docs/gcp-aggregation-service.md#adtech-setup-terraform) and + submitted in [onboarding form](./docs/gcp-aggregation-service.md#prerequisites) + - alarms_enabled: boolean flag to enable alarms (default: false) + - alarms_notification_email: Email to receive alarm notifications. + +1. **Skip this step if you use our prebuilt container image and Cloud Function jars** + + If you [self-build your container image and jars](/build-scripts/gcp/README.md), you need to + copy the contents of the `release_params.auto.tfvars` file into a new file + `self_build_params.auto.tfvars` remove the `release_params.auto.tfvars` file afterwards. + + To copy without symlink, run the following in the + `/terraform/gcp/environments/dev` folder + + ```sh + cp -L release_params.auto.tfvars self_build_params.auto.tfvars + ``` + + Then delete the symlinked file: + + ```sh + rm release_params.auto.tfvars + ``` + + And change the line `worker_image` to your location of the self built container image. + +1. To run the aggregation service deployment with the **deploy service account** created in + [Adtech Setup](#adtech-setup-terraform), set the following environment variable: + + ```sh + export GOOGLE_IMPERSONATE_SERVICE_ACCOUNT="@.iam.gserviceaccount.com" + ``` + +1. Once you've adjusted the configuration, run the following in the + `/terraform/gcp/environments/dev` folder + + Install all Terraform modules: + + ```sh + terraform init + ``` + + Get an infrastructure setup plan: + + ```sh + terraform plan + ``` + + If you see the following output on a fresh project: + + ```terraform + ... + Plan: 54 to add, 0 to change, 0 to destroy. + ``` + + you can continue to apply the changes (needs confirmation after the planning step) + + ```sh + terraform apply + ``` + + If your see the following output, your setup was successful: + + ```terraform + ... + Apply complete! Resources: 54 added, 0 changed, 0 destroyed. + + Outputs: + frontend_service_cloudfunction_url = "https://-us-central1-frontend-service--uc.a.run.app" + vpc_network = "https://www.googleapis.com/compute/v1/projects//global/networks/-network" + ``` + + The Terraform scripts create `createJob` and `getJob` API endpoints: + + - Create Job Endpoint: + `https://--frontend-service--uc.a.run.app/v1alpha/createJob` + - Get Job Endpoint: + `https://--frontend-service--uc.a.run.app/v1alpha/getJob` + + These are authenticated endpoints, refer to the [Testing the System](#testing-the-system) + section to learn how to use them. + + _If you run into any issues during deployment of your system, please consult the + [Support](/README.md#support) section._ + +## Testing the system + +To test the system, you'll need encrypted aggregatable reports in Avro batch format (follow the +[collecting and batching instructions](/docs/collecting.md#collecting-and-batching-aggregatable-reports) +accessible by the aggregation service. + +If your inputs are larger than a few hundred MB, we suggest sharding the input reports and domain +file into smaller shards. + +1. Create a Google Cloud Storage bucket for your input and output data (if not done during Adtech + Setup), we will refer to it as `data_bucket`. This bucket should be created in the same Google + Cloud project where you set up the aggregation service. + + _Consider enabling `versioning` to preserve, retrieve, and restore previous versions and set + appropriate policies for this bucket to prevent accidental changes and deletion._ + +1. Copy your reports.avro with batched encrypted aggregatable reports to `/input`. + +1. Create an aggregation job with the `createJob` API. + + `POST` + `https://--frontend-service--uc.a.run.app/v1alpha/createJob` + + ```json + { + "input_data_blob_prefix": "input/reports.avro", + "input_data_bucket_name": "", + "output_data_blob_prefix": "output/summary_report.avro", + "output_data_bucket_name": "", + "job_parameters": { + "attribution_report_to": "", + "output_domain_blob_prefix": "domain/domain.avro", + "output_domain_bucket_name": "" + }, + "job_request_id": "test01" + } + ``` + + _Note: This API requires authentication. Follow the + [Google Cloud Function instructions](https://cloud.google.com/functions/docs/securing/authenticating) + for sending an authenticated request._ + +1. Check the status of your job with the `getJob` API, replace values in `<...>` + + `GET` + `https://--frontend-service--uc.a.run.app/v1alpha/getJob?job_request_id=test01` + + _Note: This API requires authentication. Follow the + [Google Cloud Function instructions](https://cloud.google.com/functions/docs/securing/authenticating) + for sending an authenticated request. [Detailed API spec](/docs/api.md#getjob-endpoint)_ + +# **Upgrade Environment** + +_Note: Versions 2.13.0 and higher will contain the terraform files previously available in the +[Coordinator Services and Shared Libraries Repository](https://github.com/privacysandbox/coordinator-services-and-shared-libraries). +When upgrading from a version lower than or equal to 2.12.x, please run the below commands to remove +untracked copies of the folders that will now be managed via the aggregation service repository. If +you made manual modifications to the adtech_setup.tf, adtech_setup_output.tf, or +adtech_setup_variables.tf files, you should not remove them._ + +```sh +rm -rf terraform/gcp/applications +rm -rf terraform/gcp/environments/demo +rm -rf terraform/gcp/environments/shared +rm -rf terraform/gcp/modules +rm -rf terraform/gcp/coordinator-services-and-shared-libraries +rm -rf terraform/gcp/environments/adtech_setup/adtech_setup.auto.tfvars_sample +rm -rf terraform/gcp/environments/adtech_setup/main.tf_sample +mkdir backup +mv terraform/gcp/environments/adtech_setup/adtech_setup.tf backup/ +mv terraform/gcp/environments/adtech_setup/adtech_setup_output.tf backup/ +mv terraform/gcp/environments/adtech_setup/adtech_setup_variables.tf backup/ +``` + +Run the following in the ``. + +```sh +git fetch origin && git checkout -b dev-v{VERSION} v{VERSION} +cd terraform/gcp +bash download_prebuilt_dependencies.sh +``` + +Execute the following commands with your own Google Cloud account. If you were previously +impersonating a service account, clean the environment variable : + +```sh +export GOOGLE_IMPERSONATE_SERVICE_ACCOUNT="" +cd environments/adtech_setup +terraform plan +terraform apply +``` + +Execute the following command by impersonating the Deploy Service Account : + +```sh +export GOOGLE_IMPERSONATE_SERVICE_ACCOUNT="@.iam.gserviceaccount.com" +cd ../dev +terraform apply +``` + +_Note: If you use self-built artifacts described in +[build-scripts/gcp](/build-scripts/gcp/README.md), run `bash fetch_terraform.sh` instead of +`bash download_prebuilt_dependencies.sh` and make sure you updated your dependencies in the `jars` +folder._ + +_Note: When migrating to new coordinator pair from version 2.[4|5|6].z to 2.7.z or later, ensure the +file `/terraform/gcp/environments/shared/release_params.auto.tfvars` was updated with the following +values:_ + +```sh +coordinator_a_impersonate_service_account = "a-opallowedusr@ps-msmt-coord-prd-g3p-svcacc.iam.gserviceaccount.com" +coordinator_b_impersonate_service_account = "b-opallowedusr@ps-prod-msmt-type2-e541.iam.gserviceaccount.com" +``` + +## Troubleshooting + +- After successfully deploying the Aggregation Service, if the submitted jobs remain in a + 'RECEIVED' state, check for the following error message in the VM's + [serial log](https://cloud.google.com/compute/docs/troubleshooting/viewing-serial-port-output#cloud-logging): + +```txt +Error: Failed to fetch OIDC token: failed to retreive service attestation service +token: failed to get principle token: failed to get impersonated token for [a-opverifiedusr@ps-msmt-coord-prd-g3p-wif.iam.gserviceaccount.com | b-opverifiedusr@ps-prod-msmt-type2-e541.iam.gserviceaccount.com]. +Status code: 403 +Message: Permission 'iam.serviceAccounts.getOpenIdToken' denied on resource (or it may not exist) +``` + +It points to an incomplete Service Account (SA) onboarding. If you encounter this situation, verify +that your SA onboarding was successfully completed and that your deployment is using the onboarded +SA account. diff --git a/docs/general-notes.md b/docs/general-notes.md new file mode 100644 index 00000000..9ff6f196 --- /dev/null +++ b/docs/general-notes.md @@ -0,0 +1,8 @@ +## General Notes + +### Privacy Budget Enforcement + +Aggregation Service enforces the +[no-duplicate](https://github.com/WICG/attribution-reporting-api/blob/main/AGGREGATION_SERVICE_TEE.md#no-duplicates-rule) +rule. We recommend users design their systems keeping the no-duplicate rule in consideration. We +suggest reading the [debugging](/docs/debugging.md) document for debug aggregation runs. diff --git a/docs/local-testing-tool.md b/docs/local-testing-tool.md new file mode 100644 index 00000000..6386d865 --- /dev/null +++ b/docs/local-testing-tool.md @@ -0,0 +1,143 @@ +# Testing locally using Local Testing Tool + +The local testing tool can be used to perform aggregation and generate a summary report with the +following types of **unencrypted** aggregatable debug reports- + +1. [Attribution Reporting](https://github.com/WICG/conversion-measurement-api/blob/main/AGGREGATE.md#aggregatable-reports) +2. [Protected Audience](https://github.com/patcg-individual-drafts/private-aggregation-api#reports) +3. [Shared Storage](https://github.com/patcg-individual-drafts/private-aggregation-api#reports) + +[Aggregatable debug reports](https://github.com/WICG/conversion-measurement-api/blob/main/AGGREGATE.md#aggregatable-reports) +that have debug_cleartext_payload are helpful for understanding the content of reports and +validating that registrations on the browser client or device are configured properly. Learn how to +setup debug reports for +[Chrome](https://developer.chrome.com/docs/privacy-sandbox/attribution-reporting-debugging) and +[Android](https://developer.android.com/design-for-safety/privacy-sandbox/attribution#attribution-success) +clients. + +You can process +[aggregatable debug reports](https://github.com/WICG/conversion-measurement-api/blob/main/AGGREGATE.md#aggregatable-reports) +locally and generate summary reports with the LocalTestingTool\_{VERSION}.jar. + +**NOTE** : encrypted reports can **not** be processed with the local testing tool. + +## Using the Local Testing tool + +### Clone the repository + +Clone the repository into a local folder ``: + +```sh +git clone https://github.com/privacysandbox/aggregation-service; +cd aggregation-service +``` + +### Download Local Testing tool + +Download the local testing tool with the below command. + +```sh +VERSION=$(cat VERSION); curl -f -o LocalTestingTool_$VERSION.jar https://storage.googleapis.com/aggregation-service-published-artifacts/aggregation-service/$VERSION/LocalTestingTool_$VERSION.jar +``` + +You'll need [Java JRE](https://adoptium.net/) installed to use the tool. + + +_The `SHA256` of the `LocalTestingTool_{version}.jar` can be found on the +[releases page](https://github.com/privacysandbox/aggregation-service/releases)._ + + +### Generating a summary report + +Using the local testing tool, you can generate a summary report. + +Simply pass any of the 3 kinds of supported reports as `--input_data_avro_file` param. + +Follow the instructions on how to +[collect and batch aggregatable reports](/docs/collecting.md#collecting-and-batching-aggregatable-reports). +Create an output domain file: `output_domain.avro`. For testing you can use our +[sample debug batch](/sampledata/output_debug_reports.avro) with the corresponding +[output domain avro](/sampledata/output_domain.avro). + +To aggregate the resulting avro batch `output_debug_reports.avro` file into a summary report, run +the following command: + +```sh +java -jar LocalTestingTool_{version}.jar \ +--input_data_avro_file output_debug_reports.avro \ +--domain_avro_file output_domain.avro \ +--output_directory . +``` + +This will create a summary report as output.avro file in the same directory where you ran the tool. +You can use [avro tools](https://mvnrepository.com/artifact/org.apache.avro/avro-tools) to read avro +output as JSON. + +You can also batch the `output_debug_reports.avro` file into a summary report without adding noise +to the summary report. You should expect to receive the value of `32768` and `4400` from the +[sample aggregatable report](collecting.md#aggregatable-report-sample) + +```sh +java -jar LocalTestingTool_.jar \ +--input_data_avro_file output_debug_reports_.avro \ +--domain_avro_file output_domain.avro \ +--json_output \ +--output_directory . \ +--no_noising +``` + +The output of above tool execution will be in `output.json` with the following content + +```json +[ + { + "bucket": "<øg\u0090?»sì&Õ\u0018À\u0096\u008c)Ü", + "metric": 32768 + }, + { + "bucket": "$Reô2ñns&Õ\u0018À\u0096\u008c)Ü", + "metric": 4400 + } +] +``` + +To see all supported flags for the local testing tool run +`java -jar LocalTestingTool_{version}.jar --help`, e.g. you can adjust the noising epsilon with the +`--epsilon` flag or disable noising all together with the `--no_noising` flag. + +Note: The local testing tool also supports aggregation of +[Protected Audience](https://github.com/patcg-individual-drafts/private-aggregation-api#reports) and +[Shared Storage](https://github.com/patcg-individual-drafts/private-aggregation-api#reports) +reports. Simply pass the batch of FLEDGE or shared-storage unencrypted reports in the +--input_data_avro_file param. + +## Local Testing tool flags and descriptions + +```sh +$ java -jar LocalTestingTool_deploy.jar --help +Usage: Aggregation Library [options] + Options: + --input_data_avro_file + Path to the local file which contains aggregate reports in avro format + Default: + --domain_avro_file + Path to the local file which contains the pre-listed keys in avro format + Default: + --output_directory + Path to the directory where the output would be written + Default: + --epsilon + Epsilon value for noise > 0 and <= 64 + Default: 10.0 + --print_licenses + only prints licenses for all the dependencies. + Default: false + --help + list all the parameters. + --no_noising + ignore noising and thresholding. + Default: false + --json_output + output the result in json format. + Default: false +``` diff --git a/docs/sizing-guidance.md b/docs/sizing-guidance.md new file mode 100644 index 00000000..dbdd78e7 --- /dev/null +++ b/docs/sizing-guidance.md @@ -0,0 +1,298 @@ +# Sizing Guidance for Aggregation Service + +## Background + +Adtechs use the aggregation service to generate summary reports from aggregatable reports (see the +[workflow](https://github.com/WICG/attribution-reporting-api/blob/main/AGGREGATION_SERVICE_TEE.md#aggregation-workflow)). +The aggregation service can process jobs of different input sizes (reports and pre-declared +aggregation buckets). Each report can include a different number of events. Each event is a +key-value pair in an aggregatable report's encrypted payload. A pre-declared aggregation bucket is +an entry (also referred to as domain key in this document) in the pre-declared buckets file that is +provided as an input in the aggregation job (see +[createJob API documentation](https://github.com/privacysandbox/aggregation-service/blob/main/docs/api.md#payload)). +Reports used in generating this guidance each have a payload with 10 events and were padded to the +report size of 20 (standard for +[Attribution Reporting API](https://github.com/WICG/attribution-reporting-api/blob/main/AGGREGATE.md#contribution-bounding-and-budgeting) +and +[Shared Storage](https://github.com/patcg-individual-drafts/private-aggregation-api?tab=readme-ov-file#limiting-the-number-of-contributions-per-report)). +Reports and domain keys are sharded into 1000 files individually when running the benchmark. + +## Which Cloud compute instance type to use for aggregation? + +The [table below](#minimum-workable-instance-with-memory) provides cloud instance type guidelines +for minimum required instance memory for aggregation jobs with different sizes of reports and domain +keys. For example, if your individual jobs are around the 10K reports/50 million domain keys, an +instance type with at least 32 GB memory is required. + +Note that this is a general guideline based on the input data as mentioned above and adtechs may use +a different instance type depending on their specific needs. For example, if an adtech wants lower +latency results, one may need to provision larger compute capacity instance types + +After the instance type has been selected, the +[running times](#how-long-does-an-aggregation-job-take) provided below can be used to estimate the +cost per job and the total cost: + +- Cost per job = job running time \* cost of selected instance type + ([AWS pricing](https://aws.amazon.com/ec2/pricing/on-demand/), + [GCP pricing](https://cloud.google.com/compute/vm-instance-pricing)) +- Total estimated cost = # of jobs \* cost per job + +Adtechs may use the formula above to determine the most cost-efficient machine for their jobs. For +example, an adTech chooses a r5.12xlarge instance for jobs with 1 million aggregatable reports and +200 million output domain keys. The running time for a job of this size is 1 hour per job: + +- Instance cost: $3.024 / hour +- Cost per job = 1 hour \* $3.024 / hour = $3.024 +- Total cost = 10 jobs \* $3.024 / job = $30.24 + +The [table below](#minimum-workable-instance-with-memory) considers the following AWS and GCP +instances types: + +- [AWS](https://aws.amazon.com/ec2/instance-types/): m5.2xlarge (default), m5.4xlarge, m5.8xlarge, + m5.12xlarge, r5.2xlarge, r5.4xlarge, r5.8xlarge, r5.12xlarge +- [GCP](https://cloud.google.com/compute/docs/general-purpose-machines#n2-standard): + n2d-standard-8 (default), n2d-standard-16, n2d-standard-32, n2d-standard-48, n2d-highmem-8, + n2d-highmem-16, n2d-highmem-32, n2d-highmem-48, n2d-highmem-64, n2d-highmem-80, n2d-highmem-96 + +On AWS, if your jobs have larger domain keys (~1 billion), you may use the AWS machine type +x2iedn.8xlarge. For any other questions, please feel free to reach out to +[Aggregation Support](https://developers.google.com/privacy-sandbox/private-advertising/aggregation-service#engage_and_share_feedback). + +For a given aggregation job, the rows (R) correspond to the input reports, the columns (D) +correspond to the domain keys (in millions), and the value is the minimum workable instance with +memory (GiB). + +#### Minimum workable instance with memory + +![instance-type-recommendation](assets/resource-based-recommendation.png) + +## How long does an aggregation job take? + +The aggregation job completion time is the time an instance picks up the job from the job queue to +when the results were written to storage. The job completion time can be calculated from the fields +returned from the +[getJob](https://github.com/privacysandbox/aggregation-service/blob/86356cd5ac86aefc35ec62f82b154b1108e137a9/docs/api.md?plain=1#L267) +API using `request_updated_at` minus `request_processing_started_at` field. It depends on a number +of factors such as the size of the job inputs, the service instance compute capacity, the +auto-scaling size, and more. + +The aggregation job completion times are split into different brackets. For example, the "00 hr 40 +min" bracket indicates that the job ran for more than 20 minutes but less than or equal to 40 +minutes. The "n/a" bracket indicates that the instance was not able to process the job, and a higher +capacity instance is needed. + +The processing time values here are subject to change. + +| Running time buckets | +| -------------------- | +| 00 hr 05 min | +| 00 hr 20 min | +| 00 hr 40 min | +| 01 hr 00 min | +| 02 hr 00 min | +| 03 hr 00 min | +| 04 hr 00 min | +| 06 hr 00 min | +| 10 hr 00 min | +| 12 hr 00 min | + +In the following table, the rows (R) correspond to the input reports. The columns (D) correspond to +the domain keys (in millions). + +- Memory(GiB): 32 / vCPU: 8 + +| R/D | 1m | 50m | 100m | 200m | 300m | 400m | 500m | 600m | 700m | 800m | 900m | 1000m | 1100m | 1200m | 1300m | 1400m | 1500m | +| ---- | ------------ | ------------ | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ----- | ----- | ----- | ----- | ----- | ----- | +| 10k | 00 hr 05 min | 00 hr 20 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 50k | 00 hr 05 min | 00 hr 20 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 100k | 00 hr 05 min | 00 hr 20 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 1m | 00 hr 05 min | 00 hr 20 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 10m | 00 hr 40 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 100m | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 200m | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 300m | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 400m | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 600m | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 700m | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 800m | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 1b | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | + +- Memory(GiB): 64 / vCPU: 8 + +| R/D | 1m | 50m | 100m | 200m | 300m | 400m | 500m | 600m | 700m | 800m | 900m | 1000m | 1100m | 1200m | 1300m | 1400m | 1500m | +| ---- | ------------ | ------------ | ------------ | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ----- | ----- | ----- | ----- | ----- | ----- | +| 10k | 00 hr 05 min | 00 hr 20 min | 00 hr 40 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 50k | 00 hr 05 min | 00 hr 20 min | 00 hr 40 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 100k | 00 hr 05 min | 00 hr 20 min | 00 hr 40 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 1m | 00 hr 05 min | 00 hr 20 min | 00 hr 40 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 10m | 00 hr 40 min | 00 hr 40 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 100m | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 200m | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 300m | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 400m | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 600m | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 700m | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 800m | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 1b | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | + +- Memory(GiB):64 / vCPU: 16 + +| R/D | 1m | 50m | 100m | 200m | 300m | 400m | 500m | 600m | 700m | 800m | 900m | 1000m | 1100m | 1200m | 1300m | 1400m | 1500m | +| ---- | ------------ | ------------ | ------------ | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ----- | ----- | ----- | ----- | ----- | ----- | +| 10k | 00 hr 05 min | 00 hr 20 min | 00 hr 40 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 50k | 00 hr 05 min | 00 hr 20 min | 00 hr 40 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 100k | 00 hr 05 min | 00 hr 20 min | 00 hr 40 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 1m | 00 hr 05 min | 00 hr 20 min | 00 hr 40 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 10m | 00 hr 20 min | 00 hr 40 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 100m | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 200m | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 300m | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 400m | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 600m | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 700m | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 800m | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 1b | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | + +- Memory(GiB): 128 / vCPU: 16 + +| R/D | 1m | 50m | 100m | 200m | 300m | 400m | 500m | 600m | 700m | 800m | 900m | 1000m | 1100m | 1200m | 1300m | 1400m | 1500m | +| ---- | ------------ | ------------ | ------------ | ------------ | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ----- | ----- | ----- | ----- | ----- | ----- | +| 10k | 00 hr 05 min | 00 hr 20 min | 00 hr 40 min | 01 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 50k | 00 hr 05 min | 00 hr 20 min | 00 hr 40 min | 01 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 100k | 00 hr 05 min | 00 hr 20 min | 00 hr 40 min | 01 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 1m | 00 hr 05 min | 00 hr 20 min | 00 hr 40 min | 01 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 10m | 00 hr 20 min | 00 hr 40 min | 00 hr 40 min | 02 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 100m | 02 hr 00 min | 02 hr 00 min | 02 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 200m | 03 hr 00 min | 03 hr 00 min | 04 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 300m | 04 hr 00 min | 06 hr 00 min | 06 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 400m | 06 hr 00 min | 06 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 600m | 10 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 700m | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 800m | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 1b | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | + +- Memory(GiB): 128 / vCPU: 32 + +| R/D | 1m | 50m | 100m | 200m | 300m | 400m | 500m | 600m | 700m | 800m | 900m | 1000m | 1100m | 1200m | 1300m | 1400m | 1500m | +| ---- | ------------ | ------------ | ------------ | ------------ | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ----- | ----- | ----- | ----- | ----- | ----- | +| 10k | 00 hr 05 min | 00 hr 20 min | 00 hr 40 min | 01 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 50k | 00 hr 05 min | 00 hr 20 min | 00 hr 40 min | 01 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 100k | 00 hr 05 min | 00 hr 20 min | 00 hr 40 min | 01 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 1m | 00 hr 05 min | 00 hr 20 min | 00 hr 40 min | 01 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 10m | 00 hr 20 min | 00 hr 20 min | 00 hr 40 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 100m | 01 hr 00 min | 01 hr 00 min | 02 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 200m | 02 hr 00 min | 02 hr 00 min | 02 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 300m | 02 hr 00 min | 03 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 400m | 03 hr 00 min | 03 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 600m | 04 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 700m | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 800m | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 1b | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | + +- Memory(GiB): 256 / vCPU: 32 + +| R/D | 1m | 50m | 100m | 200m | 300m | 400m | 500m | 600m | 700m | 800m | 900m | 1000m | 1100m | 1200m | 1300m | 1400m | 1500m | +| ---- | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ---- | ---- | ---- | ---- | ----- | ----- | ----- | ----- | ----- | ----- | +| 10k | 00 hr 05 min | 00 hr 20 min | 00 hr 40 min | 01 hr 00 min | 02 hr 00 min | 02 hr 00 min | 03 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 50k | 00 hr 05 min | 00 hr 20 min | 00 hr 40 min | 01 hr 00 min | 02 hr 00 min | 02 hr 00 min | 03 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 100k | 00 hr 05 min | 00 hr 20 min | 00 hr 40 min | 01 hr 00 min | 02 hr 00 min | 02 hr 00 min | 03 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 1m | 00 hr 05 min | 00 hr 20 min | 00 hr 40 min | 01 hr 00 min | 02 hr 00 min | 02 hr 00 min | 03 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 10m | 00 hr 20 min | 00 hr 20 min | 00 hr 40 min | 01 hr 00 min | 02 hr 00 min | 02 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 100m | 00 hr 40 min | 01 hr 00 min | 02 hr 00 min | 02 hr 00 min | 03 hr 00 min | 03 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 200m | 02 hr 00 min | 02 hr 00 min | 02 hr 00 min | 02 hr 00 min | 03 hr 00 min | 03 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 300m | 02 hr 00 min | 02 hr 00 min | 03 hr 00 min | 03 hr 00 min | 04 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 400m | 03 hr 00 min | 03 hr 00 min | 03 hr 00 min | 04 hr 00 min | 04 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 600m | 04 hr 00 min | 04 hr 00 min | 04 hr 00 min | 06 hr 00 min | 06 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 700m | 10 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 800m | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 1b | 10 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | + +- Memory(GiB): 256 / vCPU: 48 + +| R/D | 1m | 50m | 100m | 200m | 300m | 400m | 500m | 600m | 700m | 800m | 900m | 1000m | 1100m | 1200m | 1300m | 1400m | 1500m | +| ---- | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ---- | ---- | ---- | ---- | ---- | ----- | ----- | ----- | ----- | ----- | ----- | +| 10k | 00 hr 05 min | 00 hr 20 min | 00 hr 40 min | 01 hr 00 min | 02 hr 00 min | 02 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 50k | 00 hr 05 min | 00 hr 20 min | 00 hr 40 min | 01 hr 00 min | 02 hr 00 min | 02 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 100k | 00 hr 05 min | 00 hr 20 min | 00 hr 40 min | 01 hr 00 min | 02 hr 00 min | 02 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 1m | 00 hr 05 min | 00 hr 20 min | 00 hr 40 min | 01 hr 00 min | 02 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 10m | 00 hr 20 min | 00 hr 20 min | 00 hr 40 min | 01 hr 00 min | 02 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 100m | 00 hr 40 min | 01 hr 00 min | 01 hr 00 min | 02 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 200m | 01 hr 00 min | 02 hr 00 min | 02 hr 00 min | 02 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 300m | 02 hr 00 min | 02 hr 00 min | 02 hr 00 min | 03 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 400m | 02 hr 00 min | 02 hr 00 min | 03 hr 00 min | 03 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 600m | 03 hr 00 min | 03 hr 00 min | 04 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 700m | 04 hr 00 min | 04 hr 00 min | 04 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 800m | 04 hr 00 min | 04 hr 00 min | 06 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 1b | 06 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | + +- Memory(GiB): 384 / vCPU: 48 + +| R/D | 1m | 50m | 100m | 200m | 300m | 400m | 500m | 600m | 700m | 800m | 900m | 1000m | 1100m | 1200m | 1300m | 1400m | 1500m | +| ---- | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ---- | ----- | ----- | ----- | ----- | ----- | ----- | +| 10k | 00 hr 05 min | 00 hr 20 min | 00 hr 40 min | 01 hr 00 min | 02 hr 00 min | 02 hr 00 min | 03 hr 00 min | 03 hr 00 min | 04 hr 00 min | 04 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 50k | 00 hr 05 min | 00 hr 20 min | 00 hr 40 min | 01 hr 00 min | 02 hr 00 min | 02 hr 00 min | 03 hr 00 min | 03 hr 00 min | 04 hr 00 min | 04 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 100k | 00 hr 05 min | 00 hr 20 min | 00 hr 40 min | 01 hr 00 min | 02 hr 00 min | 02 hr 00 min | 03 hr 00 min | 03 hr 00 min | 04 hr 00 min | 04 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 1m | 00 hr 05 min | 00 hr 20 min | 00 hr 40 min | 01 hr 00 min | 02 hr 00 min | 02 hr 00 min | 03 hr 00 min | 03 hr 00 min | 04 hr 00 min | 04 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 10m | 00 hr 20 min | 00 hr 20 min | 00 hr 40 min | 01 hr 00 min | 02 hr 00 min | 02 hr 00 min | 03 hr 00 min | 03 hr 00 min | 04 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 100m | 00 hr 40 min | 01 hr 00 min | 01 hr 00 min | 02 hr 00 min | 02 hr 00 min | 03 hr 00 min | 03 hr 00 min | 04 hr 00 min | 04 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 200m | 01 hr 00 min | 02 hr 00 min | 02 hr 00 min | 02 hr 00 min | 03 hr 00 min | 03 hr 00 min | 04 hr 00 min | 04 hr 00 min | 04 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 300m | 02 hr 00 min | 02 hr 00 min | 02 hr 00 min | 03 hr 00 min | 03 hr 00 min | 04 hr 00 min | 04 hr 00 min | 04 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 400m | 02 hr 00 min | 02 hr 00 min | 03 hr 00 min | 03 hr 00 min | 03 hr 00 min | 04 hr 00 min | 04 hr 00 min | 06 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 600m | 03 hr 00 min | 03 hr 00 min | 03 hr 00 min | 04 hr 00 min | 04 hr 00 min | 06 hr 00 min | 06 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 700m | 03 hr 00 min | 04 hr 00 min | 04 hr 00 min | 04 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 800m | 04 hr 00 min | 04 hr 00 min | 04 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +| 1b | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | + +- Memory(GiB): 512 / vCPU: 64 + +| R/D | 1m | 50m | 100m | 200m | 300m | 400m | 500m | 600m | 700m | 800m | 900m | 1000m | 1100m | 1200m | 1300m | 1400m | 1500m | +| ---- | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ----- | ----- | ----- | +| 10k | 00 hr 05 min | 00 hr 20 min | 00 hr 40 min | 01 hr 00 min | 02 hr 00 min | 02 hr 00 min | 02 hr 00 min | 03 hr 00 min | 03 hr 00 min | 03 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | n/a | n/a | n/a | +| 50k | 00 hr 05 min | 00 hr 20 min | 00 hr 40 min | 01 hr 00 min | 02 hr 00 min | 02 hr 00 min | 02 hr 00 min | 03 hr 00 min | 04 hr 00 min | 04 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | n/a | n/a | n/a | +| 100k | 00 hr 05 min | 00 hr 20 min | 00 hr 40 min | 01 hr 00 min | 02 hr 00 min | 02 hr 00 min | 02 hr 00 min | 03 hr 00 min | 04 hr 00 min | 04 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | n/a | n/a | n/a | +| 1m | 00 hr 05 min | 00 hr 20 min | 00 hr 40 min | 01 hr 00 min | 02 hr 00 min | 02 hr 00 min | 02 hr 00 min | 03 hr 00 min | 04 hr 00 min | 04 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | n/a | n/a | n/a | +| 10m | 00 hr 05 min | 00 hr 20 min | 00 hr 40 min | 01 hr 00 min | 02 hr 00 min | 02 hr 00 min | 03 hr 00 min | 03 hr 00 min | 04 hr 00 min | 04 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | n/a | n/a | n/a | n/a | +| 100m | 00 hr 40 min | 00 hr 40 min | 01 hr 00 min | 02 hr 00 min | 02 hr 00 min | 02 hr 00 min | 03 hr 00 min | 03 hr 00 min | 04 hr 00 min | 04 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | n/a | n/a | n/a | n/a | +| 200m | 01 hr 00 min | 01 hr 00 min | 02 hr 00 min | 02 hr 00 min | 02 hr 00 min | 03 hr 00 min | 03 hr 00 min | 04 hr 00 min | 04 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | n/a | n/a | n/a | n/a | +| 300m | 01 hr 00 min | 02 hr 00 min | 02 hr 00 min | 02 hr 00 min | 03 hr 00 min | 03 hr 00 min | 04 hr 00 min | 04 hr 00 min | 04 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | n/a | n/a | n/a | n/a | n/a | +| 400m | 02 hr 00 min | 02 hr 00 min | 02 hr 00 min | 02 hr 00 min | 03 hr 00 min | 03 hr 00 min | 04 hr 00 min | 06 hr 00 min | 04 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | n/a | n/a | n/a | n/a | n/a | +| 600m | 02 hr 00 min | 03 hr 00 min | 03 hr 00 min | 04 hr 00 min | 04 hr 00 min | 04 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | n/a | n/a | n/a | n/a | n/a | +| 700m | 03 hr 00 min | 03 hr 00 min | 03 hr 00 min | 03 hr 00 min | 04 hr 00 min | 04 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 10 hr 00 min | 10 hr 00 min | n/a | n/a | n/a | n/a | n/a | +| 800m | 04 hr 00 min | 03 hr 00 min | 04 hr 00 min | 04 hr 00 min | 04 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 10 hr 00 min | 10 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | +| 1b | 04 hr 00 min | 04 hr 00 min | 04 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | + +- Memory(GiB): 640 / vCPU: 80 + +| R/D | 1m | 50m | 100m | 200m | 300m | 400m | 500m | 600m | 700m | 800m | 900m | 1000m | 1100m | 1200m | 1300m | 1400m | 1500m | +| ---- | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ----- | ----- | +| 10k | 00 hr 05 min | 00 hr 20 min | 00 hr 40 min | 01 hr 00 min | 02 hr 00 min | 02 hr 00 min | 03 hr 00 min | 03 hr 00 min | 04 hr 00 min | 06 hr 00 min | 04 hr 00 min | 06 hr 00 min | 06 hr 00 min | 10 hr 00 min | 10 hr 00 min | n/a | n/a | +| 50k | 00 hr 05 min | 00 hr 20 min | 00 hr 40 min | 01 hr 00 min | 02 hr 00 min | 02 hr 00 min | 03 hr 00 min | 03 hr 00 min | 04 hr 00 min | 06 hr 00 min | 04 hr 00 min | 06 hr 00 min | 06 hr 00 min | 10 hr 00 min | 10 hr 00 min | n/a | n/a | +| 100k | 00 hr 05 min | 00 hr 20 min | 00 hr 40 min | 02 hr 00 min | 02 hr 00 min | 02 hr 00 min | 03 hr 00 min | 03 hr 00 min | 04 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 10 hr 00 min | 10 hr 00 min | n/a | n/a | +| 1m | 00 hr 05 min | 00 hr 20 min | 00 hr 40 min | 01 hr 00 min | 02 hr 00 min | 02 hr 00 min | 03 hr 00 min | 03 hr 00 min | 04 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 10 hr 00 min | 10 hr 00 min | n/a | n/a | +| 10m | 00 hr 05 min | 00 hr 40 min | 00 hr 40 min | 02 hr 00 min | 02 hr 00 min | 03 hr 00 min | 03 hr 00 min | 04 hr 00 min | 04 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 10 hr 00 min | 10 hr 00 min | n/a | n/a | +| 100m | 00 hr 40 min | 00 hr 40 min | 01 hr 00 min | 02 hr 00 min | 02 hr 00 min | 03 hr 00 min | 03 hr 00 min | 04 hr 00 min | 04 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 10 hr 00 min | 10 hr 00 min | n/a | n/a | +| 200m | 01 hr 00 min | 01 hr 00 min | 02 hr 00 min | 02 hr 00 min | 03 hr 00 min | 03 hr 00 min | 03 hr 00 min | 04 hr 00 min | 04 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 10 hr 00 min | 10 hr 00 min | n/a | n/a | +| 300m | 01 hr 00 min | 02 hr 00 min | 02 hr 00 min | 02 hr 00 min | 03 hr 00 min | 03 hr 00 min | 03 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 10 hr 00 min | 06 hr 00 min | 10 hr 00 min | 10 hr 00 min | n/a | n/a | +| 400m | 02 hr 00 min | 02 hr 00 min | 02 hr 00 min | 03 hr 00 min | 03 hr 00 min | 03 hr 00 min | 04 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 10 hr 00 min | 10 hr 00 min | 10 hr 00 min | 10 hr 00 min | 10 hr 00 min | n/a | n/a | +| 600m | 02 hr 00 min | 03 hr 00 min | 03 hr 00 min | 03 hr 00 min | 03 hr 00 min | 04 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 10 hr 00 min | 10 hr 00 min | 10 hr 00 min | 10 hr 00 min | 10 hr 00 min | n/a | n/a | +| 700m | 03 hr 00 min | 03 hr 00 min | 03 hr 00 min | 04 hr 00 min | 04 hr 00 min | 04 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 10 hr 00 min | 10 hr 00 min | 10 hr 00 min | 10 hr 00 min | 10 hr 00 min | n/a | n/a | +| 800m | 03 hr 00 min | 03 hr 00 min | 03 hr 00 min | 04 hr 00 min | 04 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 10 hr 00 min | 10 hr 00 min | 10 hr 00 min | 10 hr 00 min | n/a | n/a | n/a | +| 1b | 03 hr 00 min | 04 hr 00 min | 04 hr 00 min | 04 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 10 hr 00 min | 10 hr 00 min | 10 hr 00 min | 10 hr 00 min | 10 hr 00 min | 10 hr 00 min | n/a | n/a | n/a | + +- Memory(GiB): 768 / vCPU: 96 + +| R/D | 1m | 50m | 100m | 200m | 300m | 400m | 500m | 600m | 700m | 800m | 900m | 1000m | 1100m | 1200m | 1300m | 1400m | 1500m | +| ---- | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ----- | ----- | +| 10k | 00 hr 05 min | 00 hr 20 min | 00 hr 40 min | 02 hr 00 min | 02 hr 00 min | 03 hr 00 min | 03 hr 00 min | 04 hr 00 min | 04 hr 00 min | 04 hr 00 min | 04 hr 00 min | 04 hr 00 min | 06 hr 00 min | 06 hr 00 min | 10 hr 00 min | n/a | n/a | +| 50k | 00 hr 05 min | 00 hr 20 min | 00 hr 40 min | 02 hr 00 min | 02 hr 00 min | 03 hr 00 min | 03 hr 00 min | 04 hr 00 min | 04 hr 00 min | 04 hr 00 min | 04 hr 00 min | 04 hr 00 min | 06 hr 00 min | 06 hr 00 min | 10 hr 00 min | n/a | n/a | +| 100k | 00 hr 05 min | 00 hr 20 min | 00 hr 40 min | 02 hr 00 min | 02 hr 00 min | 03 hr 00 min | 03 hr 00 min | 04 hr 00 min | 04 hr 00 min | 04 hr 00 min | 04 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 10 hr 00 min | n/a | n/a | +| 1m | 00 hr 05 min | 00 hr 20 min | 00 hr 40 min | 02 hr 00 min | 02 hr 00 min | 03 hr 00 min | 03 hr 00 min | 04 hr 00 min | 04 hr 00 min | 04 hr 00 min | 04 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 10 hr 00 min | n/a | n/a | +| 10m | 00 hr 05 min | 00 hr 40 min | 00 hr 40 min | 02 hr 00 min | 02 hr 00 min | 03 hr 00 min | 03 hr 00 min | 04 hr 00 min | 04 hr 00 min | 04 hr 00 min | 04 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 10 hr 00 min | n/a | n/a | +| 100m | 00 hr 40 min | 00 hr 40 min | 01 hr 00 min | 02 hr 00 min | 02 hr 00 min | 03 hr 00 min | 03 hr 00 min | 04 hr 00 min | 04 hr 00 min | 06 hr 00 min | 04 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 10 hr 00 min | n/a | n/a | +| 200m | 00 hr 40 min | 01 hr 00 min | 02 hr 00 min | 02 hr 00 min | 02 hr 00 min | 03 hr 00 min | 03 hr 00 min | 04 hr 00 min | 04 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 10 hr 00 min | 10 hr 00 min | n/a | n/a | +| 300m | 01 hr 00 min | 02 hr 00 min | 02 hr 00 min | 02 hr 00 min | 03 hr 00 min | 03 hr 00 min | 04 hr 00 min | 04 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 10 hr 00 min | 10 hr 00 min | n/a | n/a | +| 400m | 02 hr 00 min | 02 hr 00 min | 02 hr 00 min | 03 hr 00 min | 03 hr 00 min | 03 hr 00 min | 04 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 10 hr 00 min | 10 hr 00 min | n/a | n/a | +| 600m | 02 hr 00 min | 03 hr 00 min | 03 hr 00 min | 03 hr 00 min | 04 hr 00 min | 04 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 10 hr 00 min | 10 hr 00 min | 10 hr 00 min | 10 hr 00 min | 10 hr 00 min | n/a | n/a | +| 700m | 03 hr 00 min | 03 hr 00 min | 03 hr 00 min | 03 hr 00 min | 04 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 10 hr 00 min | 10 hr 00 min | 10 hr 00 min | 10 hr 00 min | 10 hr 00 min | 10 hr 00 min | n/a | n/a | +| 800m | 03 hr 00 min | 03 hr 00 min | 03 hr 00 min | 04 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 10 hr 00 min | 10 hr 00 min | 10 hr 00 min | 10 hr 00 min | 10 hr 00 min | 10 hr 00 min | n/a | n/a | +| 1b | 04 hr 00 min | 04 hr 00 min | 04 hr 00 min | 04 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | 06 hr 00 min | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | diff --git a/docs/supported-api-types.md b/docs/supported-api-types.md new file mode 100644 index 00000000..bc3f95b9 --- /dev/null +++ b/docs/supported-api-types.md @@ -0,0 +1,13 @@ +# API types supported by the Aggregation Service + +The following Aggregatable Report API types are supported by the Aggregation Service + +1. [Attribution Reporting API](https://github.com/WICG/attribution-reporting-api/blob/main/AGGREGATE.md) +2. [Attribution Reporting Debug API](https://github.com/WICG/attribution-reporting-api/blob/main/aggregate_debug_reporting.md) +3. [Protected Audience API](https://github.com/WICG/turtledove/blob/main/FLEDGE.md) +4. [Shared Storage API](https://github.com/WICG/shared-storage) + +Also see +[Private Aggregation API explainer](https://github.com/patcg-individual-drafts/private-aggregation-api) +for more information on measurement of results collected via Protected Audience API and Shared +Storage API. diff --git a/docs/telemetry.md b/docs/telemetry.md new file mode 100644 index 00000000..d5d82bb4 --- /dev/null +++ b/docs/telemetry.md @@ -0,0 +1,64 @@ +# Telemetry in Aggregation Service + +Aggregation Service exports the following metrics and traces through +[OpenTelemetry](https://opentelemetry.io/): CPU usage, memory, total execution time, job success +metrics. These metrics/traces can be helpful during the debugging process or when deciding on the +appropriate cloud [instance size](./sizing-guidance.md). + +Metrics/traces: + +- CPU usage: measured in percentage and exported with an interval of one minute. CPU percentage is + rounded to the nearest integer (e.g. 12.34% rounded to 12%). +- Memory: measured in percentage and exported with an interval of one minute. Memory percentage is + rounded to the nearest 10th (e.g. 12% rounded to 10%) and reported max to 90%. +- Total execution time (in seconds): time spent in worker processing from the time job is picked + for processing to its completion. This is generated per job. +- Job success metrics - Track the success and failure rates of jobs using two counters: + - **Job success counter:** + - A counter that increments each time a job completes successfully. + - This metric is emitted per job and can be used to track the overall success rate of jobs + processed by the worker. + - **Job failure counter:** + - A counter that increments each time a job fails to complete. + - This metric is emitted per job and, along with the success counter, can be used to + calculate the job failure rate. + +Memory and CPU usage are tracked for each environment. For debugging purposes only, we recommend +setting the following in your terraform variables file (`{name}.auto.tfvars`) to debug issues with a +single cloud instance. + +E.g. In terraform variables file (`{name}.auto.tfvars`): + +- For AWS, set `max_capacity_ec2_instances = "1"` +- For GCP, set `max_worker_instances = "1"` + +## How to enable metrics/traces collection + +Please note that enabling metrics or traces may add extra cost to your cloud billing. We recommend +referring to cloud provider website for cost details. + +The metrics and traces collection is disabled by default. To enable it, please add the metrics you +want to export in your terraform variables file (`{name}.auto.tfvars`) as shown here: + +```sh +allowed_otel_metrics = ["cpu_usage", "memory", "total_execution_time", "job_success_metrics"] +``` + +In this case, "cpu_usage", "memory", "total_execution_time", and the job success metrics (which +include "job_success_counter" and "job_fail_counter") would be exported. + +## Where to find the metrics/traces: + +The env_name here is the same as what was set in your Aggregation Service deployment terraform. + +- AWS + - "cpu_usage", "memory", "job_success_counter", and "job_fail_counter" graphs can be found in + Cloudwatch > all metrics > {env_name} > OTelLib. + - "total_execution_time" is exported to "Traces" in Cloudwatch. You can run a query with + `annotation.job_id = {job_id}` to get traces for a specific job. +- GCP + - "cpu_usage", "memory", "job_success_counter", and "job_fail_counter" graphs can be found in + Monitoring > Metric explorer > Generic Node > Process. You can put + `custom_namespace={env_name}` in the filter to see the metrics from a specific environment. + - "total_execution_time" is exported to "Trace Explorer". You can set `job-id: {job_id}` in + the filter to get traces for a specific job. diff --git a/explainers/assets/encrypted_intermediates_aggregation_example.png b/explainers/assets/encrypted_intermediates_aggregation_example.png new file mode 100644 index 00000000..dff8d5cf Binary files /dev/null and b/explainers/assets/encrypted_intermediates_aggregation_example.png differ diff --git a/explainers/assets/encrypted_intermediates_flow.png b/explainers/assets/encrypted_intermediates_flow.png new file mode 100644 index 00000000..e6213517 Binary files /dev/null and b/explainers/assets/encrypted_intermediates_flow.png differ diff --git a/explainers/encrypted_intermediates.md b/explainers/encrypted_intermediates.md new file mode 100644 index 00000000..c0f9aa85 --- /dev/null +++ b/explainers/encrypted_intermediates.md @@ -0,0 +1,427 @@ +# Encrypted Intermediates + +## Table of Contents + +- [Introduction](#introduction) +- [Terminology](#terminology) +- [Motivating Use Cases](#motivating-use-cases) +- [Proposal](#proposal) + - [Contribution Filtering](#contribution-filtering) + - [Aggregatable Report Accounting](#aggregatable-report-accounting) + - [Inputs and Outputs](#inputs-and-outputs) + - [Encrypted Intermediates](#encrypted-intermediates) + - [Output Location](#output-location) + - [Other Considerations](#other-considerations) + - [Processing Cost](#processing-cost) + - [Aggregatable Report Accounting Failures](#aggregatable-report-accounting-failures) + - [Output Domain](#output-domain) + - [Sample Query Flow](#sample-query-flow) + - [Privacy Considerations](#privacy-considerations) + - [Security Considerations](#security-considerations) +- [Potential Future Changes](#potential-future-changes) + +## Introduction + +The +[Aggregation Service](https://github.com/WICG/attribution-reporting-api/blob/main/AGGREGATION_SERVICE_TEE.md) +currently processes raw encrypted reports to produce noised aggregated histograms. However, when +adtechs need to repeatedly aggregate the same data, for example, when using +[filtering ID](https://github.com/patcg-individual-drafts/private-aggregation-api/blob/main/flexible_filtering.md)s +or querying across different time ranges with the proposed +[re-querying feature](https://github.com/privacysandbox/aggregation-service/blob/main/explainers/requerying.md), +they could benefit from pre-aggregated intermediate reports. We propose introducing Encrypted +Intermediates. Encrypted Intermediates are reports that store aggregated contributions in an +un-noised but encrypted format, allowing subsequent aggregation queries to reuse these +intermediates. The noise will be added only in the summary report query aggregating these Encrypted +Intermediates. This approach can reduce redundant processing cost by decrypting and aggregating each +raw report only once, leading to faster query performance and lower costs for adtechs. + +_Note: This document describes possible new functionality in the Aggregation Service. It is not +necessarily a feature that will ship in the near future, but we are considering it as a largely +backwards-compatible fast-follow. While this new functionality is being developed, we still highly +encourage testing the existing API functionalities to support core utility and compatibility needs._ + +## Terminology + +- **Job/Query** : A query in Aggregation Service to aggregate the contributions from input + reports. + +- **Regular/Summary Report Query** : Aggregation Service job that generates noised summary + reports. + +- **Encrypted Intermediates** : Reports that generated from Encrypted Intermediates query. + +- **Encrypted Intermediates Query** : Aggregation Service job that will generate un-noised + Encrypted Intermediates. + +- **[Shared ID](https://github.com/WICG/attribution-reporting-api/blob/main/AGGREGATION_SERVICE_TEE.md#disjoint-batches)**: + Each aggregatable report is associated with a Shared ID. This is the ID against which the budget + accounting takes place. + +- **[Output Domains](https://developers.google.com/privacy-sandbox/private-advertising/aggregation-service/privacy-protection-report-strategy#pre-declared_aggregation_keys)** + : These aggregatable keys are given as input to the Aggregation job, and only the aggregation + output that corresponds to these keys is written in Summary Reports or Encrypted Intermediates. + +## Motivating Use Cases + +### Contribution Filtering + +When using +[filtering IDs](https://github.com/patcg-individual-drafts/private-aggregation-api/blob/main/flexible_filtering.md), +the same reports need to be processed multiple times in separate jobs for each unique ID (except if +the adtech queries all filtering IDs in the same job). This repetition creates significant +processing overhead, especially with a large number of reports. Encrypted Intermediates offer a +solution by allowing a single job to generate multiple Encrypted Intermediates, one for each +filtering ID. This means the original raw reports only get processed once. Future processing then +utilizes the relevant and smaller Encrypted Intermediates, reducing processing cost and time. + +### Rolling Window/Extended Range Queries + +[Requerying](https://github.com/privacysandbox/aggregation-service/blob/main/explainers/requerying.md) +support in Aggregation Service would allow for reprocessing reports for daily/weekly/monthly queries +and rolling window queries i.e. queries over a sliding time range, like the last 7 days. If adtechs +need to reprocess the reports for every such query, they'd end up aggregating the same set of +records over and over again, creating redundant computation. This becomes especially expensive when +using contribution filtering because the reports undergo additional repeated processing for every +filtering ID. Encrypted Intermediates provides pre-aggregated reports allowing future analyses to +work with these smaller, pre-aggregated reports, reducing processing time and costs. + +### Reach measurement + +[Reach Measurement](https://github.com/patcg-individual-drafts/private-aggregation-api/blob/main/reach_whitepaper.md) +is a combination of all the above use cases. By utilizing Encrypted Intermediates, we can +[optimize Reach Measurement](https://github.com/patcg-individual-drafts/private-aggregation-api/blob/main/reach_whitepaper.md#sketch-based-methods) +by minimizing redundant processing, reducing latency, and lowering costs. + +## Proposal + +We propose Aggregation Service to support 2 kinds of queries: + +1. The existing regular aggregation query, aka the Summary Report query that does aggregatable + report accounting, +2. Encrypted Intermediates query producing encrypted un-noised aggregated intermediate reports + without aggregatable report accounting. + +In the +[CreateJobRequest](https://docs.google.com/document/d/1DmPcC_y9P2f-2RUzW7_6_gaoi10hkZe1r3afgdA5hW4/edit?pli=1&tab=t.0#heading=h.mkprtinqk9hi), +the new and optional job parameter "job_type" will serve the purpose of identifying the specific +query type. If not specified, the job type defaults to the existing behavior of generating summary +reports. + +```console +{ + "job_request_id": , + ... + // Identifies the query type as AGGREGATION producing summary report + // or INTERMEDIATE producing Encrypted Intermediates. + // If not set, defaults to AGGREGATION. + "job_type": , + + "job_parameters": { + ... + } +} +``` + +Both kinds of queries can process raw aggregatable reports and Encrypted Intermediates as inputs. + +![encrypted_intermediates_flow](assets/encrypted_intermediates_flow.png) + +### Contribution Filtering + +One job will produce multiple Encrypted Intermediates corresponding to the filtering Ids queried. +The filtering IDs for the Encrypted Intermediates will be persisted in the shared_info. If there is +no filtering ID specified, then only one Encrypted Intermediate will be produced, corresponding to +the +[default filtering ID of 0](https://github.com/patcg-individual-drafts/private-aggregation-api/blob/main/flexible_filtering.md#backwards-compatibility). + +To start with, we plan to write one intermediate report per filtering ID. In the future, we will +consider adding support for combining multiple filtering IDs into a single report. + +### Aggregatable Report Accounting + +Aggregatable Report Accounting will be done only in the summary report query. To accommodate that, +with every intermediate query, the associated report shared IDs list will be persisted in the +intermediate report's shared_info. Intermediate queries will not consume Aggregatable Report +Accounting Budget. The Aggregation Service will only consume budget in the summary report query and +use the shared IDs corresponding to the queried filtering ID from the Encrypted Intermediates. + +With no budget consumption for intermediate queries, Encrypted Intermediates can act as inputs for +subsequent intermediate queries without cost to the budgets, creating a sequential chain of +intermediates. This approach is particularly useful for scenarios involving incremental aggregation. + +Even if a report contributes to multiple Encrypted Intermediates, it only contributes to a summary +report in a Summary Report query. + +#### Disjointedness of Shared Ids + +Even though a report can contribute to multiple Encrypted Intermediates, a single job cannot contain +multiple Encrypted Intermediates that aggregate the same report as it would violate the +"[No Duplicate Rule](https://github.com/WICG/attribution-reporting-api/blob/main/AGGREGATION_SERVICE_TEE.md#no-duplicates-rule)". +If the shared IDs in the input Encrypted Intermediates and the raw reports are not disjoint, the +Aggregation Service will invalidate the job and return an appropriate error. + +An implication of this is if a delayed report shares a shared ID with an existing encrypted +intermediate, it can't be appended to that Encrypted Intermediate. To combine the delayed reports +with all the raw reports sharing shared IDs in the same query, an adtech will have to generate a new +Encrypted Intermediate, and discard the existing one generated without the delayed reports. + +### Inputs and Outputs + +#### Encrypted Intermediates + +Each job will output one Encrypted Intermediate for every filtering ID queried. If multiple +filtering IDs are queried, the job will have a corresponding number of Encrypted Intermediates. + +![encrypted_intermediates_aggregation_example](assets/encrypted_intermediates_aggregation_example.png) + +The format of Encrypted Intermediates will be similar to raw aggregatable reports: they will have 1) +a visible and unencrypted part i.e. shared_info, and 2) an encrypted payload with aggregated (key, +value) pairs. The Encrypted Intermediates' shared_info will have some additional information +pertinent to Encrypted Intermediates as highlighted below. + +**Intermediate Report shared_info** + +```jsonc +// Report +{ + "aggregation_service_payloads": [ + { + "key_id": "", + "payload": "vxia0shX3Kf..." + } + ], + "shared_info": "{\"report_id\":\"\",\"earliest_report_time\":\"