Migrate to bazel modules

Change-Id: I9e49cecf628676744654746105e319f00b383387
diff --git a/.bazelversion b/.bazelversion
new file mode 100644
index 0000000..acd405b
--- /dev/null
+++ b/.bazelversion
@@ -0,0 +1 @@
+8.6.0
diff --git a/BUILD b/BUILD
index 071aee0..8e19948 100644
--- a/BUILD
+++ b/BUILD
@@ -1,35 +1,13 @@
-load("//tools/bzl:plugin.bzl", "PLUGIN_DEPS", "PLUGIN_TEST_DEPS", "gerrit_plugin")
-load("//tools/bzl:junit.bzl", "junit_tests")
+load(
+    "@com_googlesource_gerrit_bazlets//:gerrit_plugin.bzl",
+    "gerrit_plugin",
+    "gerrit_plugin_dependency_tests",
+    "gerrit_plugin_tests",
+)
 
 SAML_DEPS = [
-    "@commons-collections//jar",
-    "@commons-lang//jar",
-    "@cryptacular//jar",
-    "@joda-time//jar",
-    "@opensaml-core//jar",
-    "@opensaml-messaging-api//jar",
-    "@opensaml-messaging-impl//jar",
-    "@opensaml-profile-api//jar",
-    "@opensaml-profile-impl//jar",
-    "@opensaml-saml-api//jar",
-    "@opensaml-saml-impl//jar",
-    "@opensaml-security-api//jar",
-    "@opensaml-security-impl//jar",
-    "@opensaml-soap-api//jar",
-    "@opensaml-soap-impl//jar",
-    "@opensaml-storage-api//jar",
-    "@opensaml-storage-impl//jar",
-    "@opensaml-xmlsec-api//jar",
-    "@opensaml-xmlsec-impl//jar",
-    "@pac4j-core//jar",
-    "@pac4j-saml//jar",
-    "@santuario-xmlsec//jar",
-    "@shibboleth-utilities//jar",
-    "@shibboleth-xmlsectool//jar",
-    "@spring-core//jar",
-    "@stax2-api//jar",
-    "@velocity//jar",
-    "@woodstox-core//jar",
+    "@saml_plugin_deps//:org_pac4j_pac4j_core",
+    "@saml_plugin_deps//:org_pac4j_pac4j_saml",
 ]
 
 gerrit_plugin(
@@ -38,15 +16,14 @@
     manifest_entries = [
         "Gerrit-PluginName: saml",
     ],
-    resources = glob(["src/main/resources/**"]),
     deps = SAML_DEPS,
 )
 
-junit_tests(
+gerrit_plugin_tests(
     name = "saml_tests",
     srcs = glob(["src/test/java/**/*.java"]),
     tags = ["saml"],
-    deps = PLUGIN_TEST_DEPS + [
+    deps = [
         ":saml__plugin",
         "//javatests/com/google/gerrit/util/http/testutil",
     ],
@@ -58,7 +35,9 @@
         "src/main/java/com/googlesource/gerrit/plugins/saml/**/*.java",
     ]),
     main_class = "com.googlesource.gerrit.plugins.saml.pgm.SamlMetadataCreator",
-    deps = PLUGIN_DEPS + SAML_DEPS + [
-        "@commons-io//jar",
+    deps = SAML_DEPS + [
+        "//plugins:plugin-lib-neverlink",
     ],
 )
+
+gerrit_plugin_dependency_tests(plugin = "saml")
diff --git a/MODULE.bazel b/MODULE.bazel
new file mode 100644
index 0000000..a6ddf9e
--- /dev/null
+++ b/MODULE.bazel
@@ -0,0 +1,116 @@
+module(name = "gerrit-saml")
+
+bazel_dep(name = "rules_java", version = "8.16.1")
+bazel_dep(name = "rules_jvm_external", version = "6.10")
+bazel_dep(name = "com_googlesource_gerrit_bazlets")
+git_override(
+    module_name = "com_googlesource_gerrit_bazlets",
+    commit = "fe7c19542f8dc0a5720be3a93dbbdd05551003ec",
+    remote = "https://gerrit.googlesource.com/bazlets",
+)
+
+GERRIT_API_VERS = "3.13.5"
+
+gerrit_api_version = use_repo_rule("@com_googlesource_gerrit_bazlets//:gerrit_api_version.bzl", "gerrit_api_version")
+
+gerrit_api_version(
+    name = "gerrit_api_version",
+    version = GERRIT_API_VERS,
+    visibility = ["//visibility:public"],
+)
+
+maven = use_extension("@rules_jvm_external//:extensions.bzl", "maven")
+maven.install(
+    name = "external_plugin_deps",
+    artifacts = [
+        "com.google.gerrit:gerrit-plugin-api:" + GERRIT_API_VERS,
+        "com.google.gerrit:gerrit-acceptance-framework:" + GERRIT_API_VERS,
+    ],
+    # IMPORTANT:
+    # Do NOT set lock_file here.
+    #
+    # This repository is intentionally shared across plugins and contains
+    # only Gerrit-provided APIs (gerrit-plugin-api and acceptance framework)
+    # that are provided by Gerrit at runtime and must not be bundled into
+    # the plugin JAR.
+    #
+    # When built in-tree, rules_jvm_external merges maven.install() tags
+    # with the same name across all modules. Defining a lock_file for this
+    # shared repository in more than one plugin causes multiple lock files
+    # to be contributed for the same repository name, which is rejected by
+    # rules_jvm_external during module extension evaluation.
+    #
+    # Plugin runtime dependencies must instead be declared in a
+    # plugin-specific repository (e.g. oauth_plugin_deps) that owns
+    # its own lock file.
+)
+use_repo(maven, "external_plugin_deps")
+
+PAC4J_VERSION = "3.8.3"
+
+maven.install(
+    name = "saml_plugin_deps",
+    artifacts = [
+        "org.pac4j:pac4j-saml:" + PAC4J_VERSION,
+        "org.pac4j:pac4j-core:" + PAC4J_VERSION,
+    ],
+    excluded_artifacts = [
+        # Provided by Gerrit at runtime, and must not be bundled into the plugin JAR.
+        "com.google.code.findbugs:jsr305",
+        "com.google.guava:guava",
+        "com.google.j2objc:j2objc-annotations",
+        "commons-codec:commons-codec",
+        "commons-io:commons-io",
+        "io.dropwizard.metrics:metrics-core",
+        "org.apache.httpcomponents:httpclient",
+        "org.apache.httpcomponents:httpcore",
+        "org.slf4j:jcl-over-slf4j",
+        "org.slf4j:slf4j-api",
+        # Transitive dependencies not used by the plugin, which should not be
+        # bundled into the plugin JAR.
+        "antlr:antlr",
+        "com.beust:jcommander",
+        "com.sun.istack:istack-commons-runtime",
+        "com.sun.xml.fastinfoset:FastInfoset",
+        "dom4j:dom4j",
+        "jakarta.activation:jakarta.activation-api",
+        "jakarta.xml.bind:jakarta.xml.bind-api",
+        "javax.annotation:javax.annotation-api",
+        "javax.json:javax.json-api",
+        "net.spy:spymemcached",
+        "org.bouncycastle:bcprov-jdk15on",
+        "org.glassfish.jaxb:jaxb-runtime",
+        "org.glassfish.jaxb:txw2",
+        "org.glassfish:javax.json",
+        "org.hibernate.common:hibernate-commons-annotations",
+        "org.hibernate.javax.persistence:hibernate-jpa-2.1-api",
+        "org.hibernate:hibernate-core",
+        "org.hibernate:hibernate-entitymanager",
+        "org.javassist:javassist",
+        "org.jboss.logging:jboss-logging",
+        "org.jboss.logging:jboss-logging-annotations",
+        "org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec",
+        "org.jboss:jandex",
+        "org.jvnet.staxex:stax-ex",
+        "org.ldaptive:ldaptive",
+        "org.springframework:spring-beans",
+        "org.springframework:spring-jcl",
+        "org.springframework:spring-jdbc",
+        "org.springframework:spring-orm",
+        "org.springframework:spring-tx",
+        "xalan:serializer",
+        "xalan:xalan",
+        "xml-apis:xml-apis"
+    ],
+    duplicate_version_warning = "error",
+    fail_if_repin_required = True,
+    fail_on_missing_checksum = True,
+    fetch_sources = True,
+    lock_file = "//:saml_plugin_deps.lock.json",
+    repositories = [
+        "https://repo1.maven.org/maven2",
+        "https://build.shibboleth.net/nexus/content/repositories/releases/",
+    ],
+    version_conflict_policy = "pinned",
+)
+use_repo(maven, "saml_plugin_deps")
diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock
new file mode 100644
index 0000000..7c85d97
--- /dev/null
+++ b/MODULE.bazel.lock
@@ -0,0 +1,966 @@
+{
+  "lockFileVersion": 24,
+  "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/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.1/MODULE.bazel": "37bcdb4440fbb61df6a1c296ae01b327f19e9bb521f9b8e26ec854b6f97309ed",
+    "https://bcr.bazel.build/modules/abseil-cpp/20240116.2/MODULE.bazel": "73939767a4686cd9a520d16af5ab440071ed75cec1a876bf2fcfaf1f71987a16",
+    "https://bcr.bazel.build/modules/abseil-cpp/20250127.0/MODULE.bazel": "d1086e248cda6576862b4b3fe9ad76a214e08c189af5b42557a6e1888812c5d5",
+    "https://bcr.bazel.build/modules/abseil-cpp/20250127.1/MODULE.bazel": "c4a89e7ceb9bf1e25cf84a9f830ff6b817b72874088bf5141b314726e46a57c1",
+    "https://bcr.bazel.build/modules/abseil-cpp/20250512.1/MODULE.bazel": "d209fdb6f36ffaf61c509fcc81b19e81b411a999a934a032e10cd009a0226215",
+    "https://bcr.bazel.build/modules/abseil-cpp/20250814.0/MODULE.bazel": "c43c16ca2c432566cdb78913964497259903ebe8fb7d9b57b38e9f1425b427b8",
+    "https://bcr.bazel.build/modules/abseil-cpp/20250814.0/source.json": "b88bff599ceaf0f56c264c749b1606f8485cec3b8c38ba30f88a4df9af142861",
+    "https://bcr.bazel.build/modules/abseil-py/2.1.0/MODULE.bazel": "5ebe5bf853769c65707e5c28f216798f7a4b1042015e6a36e6d03094d94bec8a",
+    "https://bcr.bazel.build/modules/abseil-py/2.1.0/source.json": "0e8fc4f088ce07099c1cd6594c20c7ddbb48b4b3c0849b7d94ba94be88ff042b",
+    "https://bcr.bazel.build/modules/apple_support/1.11.1/MODULE.bazel": "1843d7cd8a58369a444fc6000e7304425fba600ff641592161d9f15b179fb896",
+    "https://bcr.bazel.build/modules/apple_support/1.15.1/MODULE.bazel": "a0556fefca0b1bb2de8567b8827518f94db6a6e7e7d632b4c48dc5f865bc7c85",
+    "https://bcr.bazel.build/modules/apple_support/1.23.1/MODULE.bazel": "53763fed456a968cf919b3240427cf3a9d5481ec5466abc9d5dc51bc70087442",
+    "https://bcr.bazel.build/modules/apple_support/1.23.1/source.json": "d888b44312eb0ad2c21a91d026753f330caa48a25c9b2102fae75eb2b0dcfdd2",
+    "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.13.0/MODULE.bazel": "c14c33c7c3c730612bdbe14ebbb5e61936b6f11322ea95a6e91cd1ba962f94df",
+    "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.23.0/MODULE.bazel": "fd1ac84bc4e97a5a0816b7fd7d4d4f6d837b0047cf4cbd81652d616af3a6591a",
+    "https://bcr.bazel.build/modules/bazel_features/1.27.0/MODULE.bazel": "621eeee06c4458a9121d1f104efb80f39d34deff4984e778359c60eaf1a8cb65",
+    "https://bcr.bazel.build/modules/bazel_features/1.28.0/MODULE.bazel": "4b4200e6cbf8fa335b2c3f43e1d6ef3e240319c33d43d60cc0fbd4b87ece299d",
+    "https://bcr.bazel.build/modules/bazel_features/1.3.0/MODULE.bazel": "cdcafe83ec318cda34e02948e81d790aab8df7a929cec6f6969f13a489ccecd9",
+    "https://bcr.bazel.build/modules/bazel_features/1.30.0/MODULE.bazel": "a14b62d05969a293b80257e72e597c2da7f717e1e69fa8b339703ed6731bec87",
+    "https://bcr.bazel.build/modules/bazel_features/1.30.0/source.json": "b07e17f067fe4f69f90b03b36ef1e08fe0d1f3cac254c1241a1818773e3423bc",
+    "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.8.1/MODULE.bazel": "88ade7293becda963e0e3ea33e7d54d3425127e0a326e0d17da085a5f1f03ff6",
+    "https://bcr.bazel.build/modules/bazel_skylib/1.8.2/MODULE.bazel": "69ad6927098316848b34a9142bcc975e018ba27f08c4ff403f50c1b6e646ca67",
+    "https://bcr.bazel.build/modules/bazel_skylib/1.9.0/MODULE.bazel": "72997b29dfd95c3fa0d0c48322d05590418edef451f8db8db5509c57875fb4b7",
+    "https://bcr.bazel.build/modules/bazel_skylib/1.9.0/source.json": "7ad77c1e8c1b84222d9b3f3cae016a76639435744c19330b0b37c0a3c9da7dc0",
+    "https://bcr.bazel.build/modules/bazel_worker_api/0.0.1/MODULE.bazel": "02a13b77321773b2042e70ee5e4c5e099c8ddee4cf2da9cd420442c36938d4bd",
+    "https://bcr.bazel.build/modules/bazel_worker_api/0.0.4/MODULE.bazel": "460aa12d01231a80cce03c548287b433b321d205b0028ae596728c35e5ee442e",
+    "https://bcr.bazel.build/modules/bazel_worker_api/0.0.4/source.json": "d353c410d47a8b65d09fa98e83d57ebec257a2c2b9c6e42d6fda1cb25e5464a5",
+    "https://bcr.bazel.build/modules/bazel_worker_java/0.0.4/MODULE.bazel": "82494a01018bb7ef06d4a17ec4cd7a758721f10eb8b6c820a818e70d669500db",
+    "https://bcr.bazel.build/modules/bazel_worker_java/0.0.4/source.json": "a2d30458fd86cf022c2b6331e652526fa08e17573b2f5034a9dbcacdf9c2583c",
+    "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/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.36.0/MODULE.bazel": "e375d5d6e9a6ca59b0cb38b0540bc9a05b6aa926d322f2de268ad267a2ee74c0",
+    "https://bcr.bazel.build/modules/gazelle/0.40.0/MODULE.bazel": "42ba5378ebe845fca43989a53186ab436d956db498acde790685fe0e8f9c6146",
+    "https://bcr.bazel.build/modules/gazelle/0.40.0/source.json": "1e5ef6e4d8b9b6836d93273c781e78ff829ea2e077afef7a57298040fa4f010a",
+    "https://bcr.bazel.build/modules/google_benchmark/1.8.2/MODULE.bazel": "a70cf1bba851000ba93b58ae2f6d76490a9feb74192e57ab8e8ff13c34ec50cb",
+    "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.17.0/MODULE.bazel": "dbec758171594a705933a29fcf69293d2468c49ec1f2ebca65c36f504d72df46",
+    "https://bcr.bazel.build/modules/googletest/1.17.0/source.json": "38e4454b25fc30f15439c0378e57909ab1fd0a443158aa35aec685da727cd713",
+    "https://bcr.bazel.build/modules/jsoncpp/1.9.5/MODULE.bazel": "31271aedc59e815656f5736f282bb7509a97c7ecb43e927ac1a37966e0578075",
+    "https://bcr.bazel.build/modules/jsoncpp/1.9.6/MODULE.bazel": "2f8d20d3b7d54143213c4dfc3d98225c42de7d666011528dc8fe91591e2e17b0",
+    "https://bcr.bazel.build/modules/jsoncpp/1.9.6/source.json": "a04756d367a2126c3541682864ecec52f92cdee80a35735a3cb249ce015ca000",
+    "https://bcr.bazel.build/modules/libpfm/4.11.0/MODULE.bazel": "45061ff025b301940f1e30d2c16bea596c25b176c8b6b3087e92615adbd52902",
+    "https://bcr.bazel.build/modules/nlohmann_json/3.6.1/MODULE.bazel": "6f7b417dcc794d9add9e556673ad25cb3ba835224290f4f848f8e2db1e1fca74",
+    "https://bcr.bazel.build/modules/nlohmann_json/3.6.1/source.json": "f448c6e8963fdfa7eb831457df83ad63d3d6355018f6574fb017e8169deb43a9",
+    "https://bcr.bazel.build/modules/package_metadata/0.0.7/MODULE.bazel": "7adb03933fc8401f495800cf4eafcff0edc6da0ff55c7db223ef69d19f689486",
+    "https://bcr.bazel.build/modules/package_metadata/0.0.7/source.json": "50639625e937b56115012674c797cca7a05a96b4878c87d803c13dc2b31de8a0",
+    "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.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/platforms/1.0.0/MODULE.bazel": "f05feb42b48f1b3c225e4ccf351f367be0371411a803198ec34a389fb22aa580",
+    "https://bcr.bazel.build/modules/platforms/1.0.0/source.json": "f4ff1fd412e0246fd38c82328eb209130ead81d62dcd5a9e40910f867f733d96",
+    "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/27.0/MODULE.bazel": "7873b60be88844a0a1d8f80b9d5d20cfbd8495a689b8763e76c6372998d3f64c",
+    "https://bcr.bazel.build/modules/protobuf/27.1/MODULE.bazel": "703a7b614728bb06647f965264967a8ef1c39e09e8f167b3ca0bb1fd80449c0d",
+    "https://bcr.bazel.build/modules/protobuf/27.2/MODULE.bazel": "32450b50673882e4c8c3d10a83f3bc82161b213ed2f80d17e38bece8f165c295",
+    "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.1/MODULE.bazel": "557c3457560ff49e122ed76c0bc3397a64af9574691cb8201b4e46d4ab2ecb95",
+    "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/protobuf/31.1/MODULE.bazel": "379a389bb330b7b8c1cdf331cc90bf3e13de5614799b3b52cdb7c6f389f6b38e",
+    "https://bcr.bazel.build/modules/protobuf/32.1/MODULE.bazel": "89cd2866a9cb07fee9ff74c41ceace11554f32e0d849de4e23ac55515cfada4d",
+    "https://bcr.bazel.build/modules/protobuf/32.1/source.json": "bd2664e90875c0cd755d1d9b7a103a4b027893ac8eafa3bba087557ffc244ad4",
+    "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/re2/2023-09-01/MODULE.bazel": "cb3d511531b16cfc78a225a9e2136007a48cf8a677e4264baeab57fe78a80206",
+    "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/rules_android/0.1.1/MODULE.bazel": "48809ab0091b07ad0182defb787c4c5328bd3a278938415c00a7b69b50c4d3a8",
+    "https://bcr.bazel.build/modules/rules_android/0.6.6/MODULE.bazel": "b0fb569752aab65ab1a9db0a8f6cfaf5aa1754965e17e95dcf0e4d88e192a68d",
+    "https://bcr.bazel.build/modules/rules_android/0.6.6/source.json": "a9d8dc2d5a102dc03269a94acc886a4cab82cdcb9ccbc77b0f665d6d17a6ae09",
+    "https://bcr.bazel.build/modules/rules_apple/3.16.0/MODULE.bazel": "0d1caf0b8375942ce98ea944be754a18874041e4e0459401d925577624d3a54a",
+    "https://bcr.bazel.build/modules/rules_apple/3.16.0/source.json": "d8b5fe461272018cc07cfafce11fe369c7525330804c37eec5a82f84cd475366",
+    "https://bcr.bazel.build/modules/rules_cc/0.0.1/MODULE.bazel": "cb2aa0747f84c6c3a78dad4e2049c154f08ab9d166b1273835a8174940365647",
+    "https://bcr.bazel.build/modules/rules_cc/0.0.10/MODULE.bazel": "ec1705118f7eaedd6e118508d3d26deba2a4e76476ada7e0e3965211be012002",
+    "https://bcr.bazel.build/modules/rules_cc/0.0.13/MODULE.bazel": "0e8529ed7b323dad0775ff924d2ae5af7640b23553dfcd4d34344c7e7a867191",
+    "https://bcr.bazel.build/modules/rules_cc/0.0.14/MODULE.bazel": "5e343a3aac88b8d7af3b1b6d2093b55c347b8eefc2e7d1442f7a02dc8fea48ac",
+    "https://bcr.bazel.build/modules/rules_cc/0.0.15/MODULE.bazel": "6704c35f7b4a72502ee81f61bf88706b54f06b3cbe5558ac17e2e14666cd5dcc",
+    "https://bcr.bazel.build/modules/rules_cc/0.0.16/MODULE.bazel": "7661303b8fc1b4d7f532e54e9d6565771fea666fbdf839e0a86affcd02defe87",
+    "https://bcr.bazel.build/modules/rules_cc/0.0.17/MODULE.bazel": "2ae1d8f4238ec67d7185d8861cb0a2cdf4bc608697c331b95bf990e69b62e64a",
+    "https://bcr.bazel.build/modules/rules_cc/0.0.2/MODULE.bazel": "6915987c90970493ab97393024c156ea8fb9f3bea953b2f3ec05c34f19b5695c",
+    "https://bcr.bazel.build/modules/rules_cc/0.0.6/MODULE.bazel": "abf360251023dfe3efcef65ab9d56beefa8394d4176dd29529750e1c57eaa33f",
+    "https://bcr.bazel.build/modules/rules_cc/0.0.8/MODULE.bazel": "964c85c82cfeb6f3855e6a07054fdb159aced38e99a5eecf7bce9d53990afa3e",
+    "https://bcr.bazel.build/modules/rules_cc/0.0.9/MODULE.bazel": "836e76439f354b89afe6a911a7adf59a6b2518fafb174483ad78a2a2fde7b1c5",
+    "https://bcr.bazel.build/modules/rules_cc/0.1.1/MODULE.bazel": "2f0222a6f229f0bf44cd711dc13c858dad98c62d52bd51d8fc3a764a83125513",
+    "https://bcr.bazel.build/modules/rules_cc/0.1.5/MODULE.bazel": "88dfc9361e8b5ae1008ac38f7cdfd45ad738e4fa676a3ad67d19204f045a1fd8",
+    "https://bcr.bazel.build/modules/rules_cc/0.2.0/MODULE.bazel": "b5c17f90458caae90d2ccd114c81970062946f49f355610ed89bebf954f5783c",
+    "https://bcr.bazel.build/modules/rules_cc/0.2.8/MODULE.bazel": "f1df20f0bf22c28192a794f29b501ee2018fa37a3862a1a2132ae2940a23a642",
+    "https://bcr.bazel.build/modules/rules_cc/0.2.8/source.json": "85087982aca15f31307bd52698316b28faa31bd2c3095a41f456afec0131344c",
+    "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_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.46.0/MODULE.bazel": "3477df8bdcc49e698b9d25f734c4f3a9f5931ff34ee48a2c662be168f5f2d3fd",
+    "https://bcr.bazel.build/modules/rules_go/0.50.1/MODULE.bazel": "b91a308dc5782bb0a8021ad4330c81fea5bda77f96b9e4c117b9b9c8f6665ee0",
+    "https://bcr.bazel.build/modules/rules_go/0.51.0-rc2/MODULE.bazel": "edfc3a9cea7bedb0eaaff37b0d7817c1a4bf72b3c615580b0ffcee6c52690fd4",
+    "https://bcr.bazel.build/modules/rules_go/0.51.0-rc2/source.json": "6b5cd0b3da2bd0e6949580851db990a04af0a285f072b9a0f059424457cd8cc9",
+    "https://bcr.bazel.build/modules/rules_java/4.0.0/MODULE.bazel": "5a78a7ae82cd1a33cef56dc578c7d2a46ed0dca12643ee45edbb8417899e6f74",
+    "https://bcr.bazel.build/modules/rules_java/5.3.5/MODULE.bazel": "a4ec4f2db570171e3e5eb753276ee4b389bae16b96207e9d3230895c99644b86",
+    "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/8.13.0/MODULE.bazel": "0444ebf737d144cf2bb2ccb368e7f1cce735264285f2a3711785827c1686625e",
+    "https://bcr.bazel.build/modules/rules_java/8.14.0/MODULE.bazel": "717717ed40cc69994596a45aec6ea78135ea434b8402fb91b009b9151dd65615",
+    "https://bcr.bazel.build/modules/rules_java/8.16.1/MODULE.bazel": "0f20b1cecaa8e52f60a8f071e59a20b4e3b9a67f6c56c802ea256f6face692d3",
+    "https://bcr.bazel.build/modules/rules_java/8.16.1/source.json": "072f8d11264edc499621be2dc9ea01d6395db5aa6f8799c034ae01a3e857f2e4",
+    "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.6.0/MODULE.bazel": "9c064c434606d75a086f15ade5edb514308cccd1544c2b2a89bbac4310e41c71",
+    "https://bcr.bazel.build/modules/rules_java/8.6.1/MODULE.bazel": "f4808e2ab5b0197f094cabce9f4b006a27766beb6a9975931da07099560ca9c2",
+    "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.1/MODULE.bazel": "75b5fec090dbd46cf9b7d8ea08cf84a0472d92ba3585b476f44c326eda8059c4",
+    "https://bcr.bazel.build/modules/rules_jvm_external/6.10/MODULE.bazel": "33e636ca6bc9ee0fa090a38aa33c631ded2d8cf6fead4124181d1b35dc474f7c",
+    "https://bcr.bazel.build/modules/rules_jvm_external/6.10/source.json": "c191249787625db72616a3fb3cc2786ab57355a2e3b615402b8b3b66b0f995b7",
+    "https://bcr.bazel.build/modules/rules_jvm_external/6.2/MODULE.bazel": "36a6e52487a855f33cb960724eb56547fa87e2c98a0474c3acad94339d7f8e99",
+    "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_kotlin/1.9.0/MODULE.bazel": "ef85697305025e5a61f395d4eaede272a5393cee479ace6686dba707de804d59",
+    "https://bcr.bazel.build/modules/rules_kotlin/1.9.5/MODULE.bazel": "043a16a572f610558ec2030db3ff0c9938574e7dd9f58bded1bb07c0192ef025",
+    "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/MODULE.bazel": "d269a01a18ee74d0335450b10f62c9ed81f2321d7958a2934e44272fe82dcef3",
+    "https://bcr.bazel.build/modules/rules_kotlin/2.1.3/MODULE.bazel": "ce7def6d576aa8d3a9c6d10e13b4d157296229674371f67dbf788dae0afae3d5",
+    "https://bcr.bazel.build/modules/rules_kotlin/2.1.3/source.json": "0b0dc9400f14b5fbb13d278ad3bf0413cdbaf0da0db337e055b855e35b878a3b",
+    "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_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.1.0/MODULE.bazel": "002d62d9108f75bb807cd56245d45648f38275cb3a99dcd45dfb864c5d74cb96",
+    "https://bcr.bazel.build/modules/rules_proto/7.1.0/source.json": "39f89066c12c24097854e8f57ab8558929f9c8d474d34b2c00ac04630ad8940e",
+    "https://bcr.bazel.build/modules/rules_python/0.10.2/MODULE.bazel": "cc82bc96f2997baa545ab3ce73f196d040ffb8756fd2d66125a530031cd90e5f",
+    "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.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.37.2/MODULE.bazel": "b5ffde91410745750b6c13be1c5dc4555ef5bc50562af4a89fd77807fdde626a",
+    "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.0.0/MODULE.bazel": "898a3d999c22caa585eb062b600f88654bf92efb204fa346fb55f6f8edffca43",
+    "https://bcr.bazel.build/modules/rules_python/1.4.1/MODULE.bazel": "8991ad45bdc25018301d6b7e1d3626afc3c8af8aaf4bc04f23d0b99c938b73a6",
+    "https://bcr.bazel.build/modules/rules_python/1.7.0/MODULE.bazel": "d01f995ecd137abf30238ad9ce97f8fc3ac57289c8b24bd0bf53324d937a14f8",
+    "https://bcr.bazel.build/modules/rules_python/1.7.0/source.json": "028a084b65dcf8f4dc4f82f8778dbe65df133f234b316828a82e060d81bdce32",
+    "https://bcr.bazel.build/modules/rules_robolectric/4.14.1.2/MODULE.bazel": "d44fec647d0aeb67b9f3b980cf68ba634976f3ae7ccd6c07d790b59b87a4f251",
+    "https://bcr.bazel.build/modules/rules_robolectric/4.14.1.2/source.json": "37c10335f2361c337c5c1f34ed36d2da70534c23088062b33a8bdaab68aa9dea",
+    "https://bcr.bazel.build/modules/rules_shell/0.1.2/MODULE.bazel": "66e4ca3ce084b04af0b9ff05ff14cab4e5df7503973818bb91cbc6cda08d32fc",
+    "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.4.1/MODULE.bazel": "00e501db01bbf4e3e1dd1595959092c2fadf2087b2852d3f553b5370f5633592",
+    "https://bcr.bazel.build/modules/rules_shell/0.4.1/source.json": "4757bd277fe1567763991c4425b483477bb82e35e777a56fd846eb5cceda324a",
+    "https://bcr.bazel.build/modules/rules_swift/1.16.0/MODULE.bazel": "4a09f199545a60d09895e8281362b1ff3bb08bbde69c6fc87aff5b92fcc916ca",
+    "https://bcr.bazel.build/modules/rules_swift/2.1.1/MODULE.bazel": "494900a80f944fc7aa61500c2073d9729dff0b764f0e89b824eb746959bc1046",
+    "https://bcr.bazel.build/modules/rules_swift/2.1.1/source.json": "40fc69dfaac64deddbb75bd99cdac55f4427d9ca0afbe408576a65428427a186",
+    "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.0/MODULE.bazel": "05e3d6d30c099b6770e97da986c53bd31844d7f13d41412480ea265ac9e8079c",
+    "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/swift_argument_parser/1.3.1.1/MODULE.bazel": "5e463fbfba7b1701d957555ed45097d7f984211330106ccd1352c6e0af0dcf91",
+    "https://bcr.bazel.build/modules/swift_argument_parser/1.3.1.1/source.json": "32bd87e5f4d7acc57c5b2ff7c325ae3061d5e242c0c4c214ae87e0f1c13e54cb",
+    "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/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.3.1.bcr.5/MODULE.bazel": "eec517b5bbe5492629466e11dae908d043364302283de25581e3eb944326c4ca",
+    "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/source.json": "22bc55c47af97246cfc093d0acf683a7869377de362b5d1c552c2c2e16b7a806",
+    "https://bcr.bazel.build/modules/zlib/1.3.1/MODULE.bazel": "751c9940dcfe869f5f7274e1295422a34623555916eb98c174c1e945594bf198"
+  },
+  "selectedYankedVersions": {},
+  "moduleExtensions": {
+    "@@pybind11_bazel+//:internal_configure.bzl%internal_configure_extension": {
+      "general": {
+        "bzlTransitiveDigest": "NFQjcZF+fAvf5fDH+pqsx4JrfzP9PuHBz6S6ZutIbnw=",
+        "usagesDigest": "D1r3lfzMuUBFxgG8V6o0bQTLMk3GkaGOaPzw53wrwyw=",
+        "recordedFileInputs": {
+          "@@pybind11_bazel+//MODULE.bazel": "e6f4c20442eaa7c90d7190d8dc539d0ab422f95c65a57cc59562170c58ae3d34"
+        },
+        "recordedDirentsInputs": {},
+        "envVariables": {},
+        "generatedRepoSpecs": {
+          "pybind11": {
+            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%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_android+//bzlmod_extensions:apksig.bzl%apksig_extension": {
+      "general": {
+        "bzlTransitiveDigest": "By9qVNN7G4oL1vYOJXye7Dp/CbR2ar9oxAW8WXAVcVw=",
+        "usagesDigest": "xq6OVkELeJvOgYo3oY/sUBsGFbcqdV+9BYiNgSPV/po=",
+        "recordedFileInputs": {},
+        "recordedDirentsInputs": {},
+        "envVariables": {},
+        "generatedRepoSpecs": {
+          "apksig": {
+            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
+            "attributes": {
+              "url": "https://android.googlesource.com/platform/tools/apksig/+archive/24e3075e68ebe17c0b529bb24bfda819db5e2f3b.tar.gz",
+              "build_file": "@@rules_android+//bzlmod_extensions:apksig.BUILD"
+            }
+          }
+        },
+        "recordedRepoMappingEntries": [
+          [
+            "rules_android+",
+            "bazel_tools",
+            "bazel_tools"
+          ]
+        ]
+      }
+    },
+    "@@rules_android+//bzlmod_extensions:com_android_dex.bzl%com_android_dex_extension": {
+      "general": {
+        "bzlTransitiveDigest": "rvWbJQc8jInfIAaXIMhSOqUlwM9HVeLey6q0ISvg08Y=",
+        "usagesDigest": "toF8IFMu98H/VU2p1sfVC5fVXVYJunpbbmtM6tOsQXY=",
+        "recordedFileInputs": {},
+        "recordedDirentsInputs": {},
+        "envVariables": {},
+        "generatedRepoSpecs": {
+          "com_android_dex": {
+            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
+            "attributes": {
+              "url": "https://android.googlesource.com/platform/dalvik/+archive/5a81c499a569731e2395f7c8d13c0e0d4e17a2b6.tar.gz",
+              "build_file": "@@rules_android+//bzlmod_extensions:com_android_dex.BUILD"
+            }
+          }
+        },
+        "recordedRepoMappingEntries": [
+          [
+            "rules_android+",
+            "bazel_tools",
+            "bazel_tools"
+          ]
+        ]
+      }
+    },
+    "@@rules_android+//rules/android_sdk_repository:rule.bzl%android_sdk_repository_extension": {
+      "general": {
+        "bzlTransitiveDigest": "NAy+0M15JNVEBb8Tny6t7j3lKqTnsAMjoBB6LJ+C370=",
+        "usagesDigest": "g9Ur6X6qhf9a8MmY9qXU/jFjkyk/aZVBegI0yVMF0z4=",
+        "recordedFileInputs": {},
+        "recordedDirentsInputs": {},
+        "envVariables": {},
+        "generatedRepoSpecs": {
+          "androidsdk": {
+            "repoRuleId": "@@rules_android+//rules/android_sdk_repository:rule.bzl%_android_sdk_repository",
+            "attributes": {}
+          }
+        },
+        "recordedRepoMappingEntries": []
+      }
+    },
+    "@@rules_apple+//apple:apple.bzl%provisioning_profile_repository_extension": {
+      "general": {
+        "bzlTransitiveDigest": "CUIdbxeGZ+GPvVqbCkw9HQeJLsqeG3I1pJQ+oyZr/D4=",
+        "usagesDigest": "vsJl8Rw5NL+5Ag2wdUDoTeRF/5klkXO8545Iy7U1Q08=",
+        "recordedFileInputs": {},
+        "recordedDirentsInputs": {},
+        "envVariables": {},
+        "generatedRepoSpecs": {
+          "local_provisioning_profiles": {
+            "repoRuleId": "@@rules_apple+//apple/internal:local_provisioning_profiles.bzl%provisioning_profile_repository",
+            "attributes": {}
+          }
+        },
+        "recordedRepoMappingEntries": [
+          [
+            "apple_support+",
+            "bazel_skylib",
+            "bazel_skylib+"
+          ],
+          [
+            "bazel_tools",
+            "rules_cc",
+            "rules_cc+"
+          ],
+          [
+            "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_swift",
+            "rules_swift+"
+          ],
+          [
+            "rules_cc+",
+            "bazel_tools",
+            "bazel_tools"
+          ],
+          [
+            "rules_cc+",
+            "rules_cc",
+            "rules_cc+"
+          ],
+          [
+            "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_apple+//apple:extensions.bzl%non_module_deps": {
+      "general": {
+        "bzlTransitiveDigest": "4xtddSlWIQdtVNVuvOI62fJfQVETHZCVWFvYYwQHMR4=",
+        "usagesDigest": "M3VqFpeTCo4qmrNKGZw0dxBHvTYDrfV3cscGzlSAhQ4=",
+        "recordedFileInputs": {},
+        "recordedDirentsInputs": {},
+        "envVariables": {},
+        "generatedRepoSpecs": {
+          "xctestrunner": {
+            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%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_kotlin+//src/main/starlark/core/repositories:bzlmod_setup.bzl%rules_kotlin_extensions": {
+      "general": {
+        "bzlTransitiveDigest": "HJP3wKFbPhB1mSYjJS6kbXEiP+OQxvsBdqpvyJN6I3s=",
+        "usagesDigest": "qTwqmKKUfWcPdvM0waG+CPWrxsbeAWVeUxavm7tEk9E=",
+        "recordedFileInputs": {},
+        "recordedDirentsInputs": {},
+        "envVariables": {},
+        "generatedRepoSpecs": {
+          "com_github_jetbrains_kotlin_git": {
+            "repoRuleId": "@@rules_kotlin+//src/main/starlark/core/repositories:compiler.bzl%kotlin_compiler_git_repository",
+            "attributes": {
+              "urls": [
+                "https://github.com/JetBrains/kotlin/releases/download/v2.1.0/kotlin-compiler-2.1.0.zip"
+              ],
+              "sha256": "b6698d5728ad8f9edcdd01617d638073191d8a03139cc538a391b4e3759ad297"
+            }
+          },
+          "com_github_jetbrains_kotlin": {
+            "repoRuleId": "@@rules_kotlin+//src/main/starlark/core/repositories:compiler.bzl%kotlin_capabilities_repository",
+            "attributes": {
+              "git_repository_name": "com_github_jetbrains_kotlin_git",
+              "compiler_version": "2.1.0"
+            }
+          },
+          "com_github_google_ksp": {
+            "repoRuleId": "@@rules_kotlin+//src/main/starlark/core/repositories:ksp.bzl%ksp_compiler_plugin_repository",
+            "attributes": {
+              "urls": [
+                "https://github.com/google/ksp/releases/download/2.1.0-1.0.28/artifacts.zip"
+              ],
+              "sha256": "fc27b08cadc061a4a989af01cbeccb613feef1995f4aad68f2be0f886a3ee251",
+              "strip_version": "2.1.0-1.0.28"
+            }
+          },
+          "com_github_pinterest_ktlint": {
+            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_file",
+            "attributes": {
+              "sha256": "a9f923be58fbd32670a17f0b729b1df804af882fa57402165741cb26e5440ca1",
+              "urls": [
+                "https://github.com/pinterest/ktlint/releases/download/1.3.1/ktlint"
+              ],
+              "executable": true
+            }
+          },
+          "kotlinx_serialization_core_jvm": {
+            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_jar",
+            "attributes": {
+              "sha256": "29c821a8d4e25cbfe4f2ce96cdd4526f61f8f4e69a135f9612a34a81d93b65f1",
+              "urls": [
+                "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-serialization-core-jvm/1.6.3/kotlinx-serialization-core-jvm-1.6.3.jar"
+              ]
+            }
+          },
+          "kotlinx_serialization_json": {
+            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_jar",
+            "attributes": {
+              "sha256": "8c0016890a79ab5980dd520a5ab1a6738023c29aa3b6437c482e0e5fdc06dab1",
+              "urls": [
+                "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-serialization-json/1.6.3/kotlinx-serialization-json-1.6.3.jar"
+              ]
+            }
+          },
+          "kotlinx_serialization_json_jvm": {
+            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_jar",
+            "attributes": {
+              "sha256": "d3234179bcff1886d53d67c11eca47f7f3cf7b63c349d16965f6db51b7f3dd9a",
+              "urls": [
+                "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-serialization-json-jvm/1.6.3/kotlinx-serialization-json-jvm-1.6.3.jar"
+              ]
+            }
+          }
+        },
+        "recordedRepoMappingEntries": [
+          [
+            "rules_kotlin+",
+            "bazel_tools",
+            "bazel_tools"
+          ]
+        ]
+      }
+    },
+    "@@rules_python+//python/extensions:config.bzl%config": {
+      "general": {
+        "bzlTransitiveDigest": "9cZw51LLMu2V/jKcxvnA1pBg58ZgQEDuMni3CbNZSRg=",
+        "usagesDigest": "ZVSXMAGpD+xzVNPuvF1IoLBkty7TROO0+akMapt1pAg=",
+        "recordedFileInputs": {},
+        "recordedDirentsInputs": {},
+        "envVariables": {},
+        "generatedRepoSpecs": {
+          "rules_python_internal": {
+            "repoRuleId": "@@rules_python+//python/private:internal_config_repo.bzl%internal_config_repo",
+            "attributes": {
+              "transition_setting_generators": {},
+              "transition_settings": []
+            }
+          },
+          "pypi__build": {
+            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
+            "attributes": {
+              "url": "https://files.pythonhosted.org/packages/e2/03/f3c8ba0a6b6e30d7d18c40faab90807c9bb5e9a1e3b2fe2008af624a9c97/build-1.2.1-py3-none-any.whl",
+              "sha256": "75e10f767a433d9a86e50d83f418e83efc18ede923ee5ff7df93b6cb0306c5d4",
+              "type": "zip",
+              "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:py_library.bzl\", \"py_library\")\n\npy_library(\n    name = \"lib\",\n    srcs = glob([\"**/*.py\"]),\n    data = glob([\"**/*\"], exclude=[\n        # These entries include those put into user-installed dependencies by\n        # data_exclude to avoid non-determinism.\n        \"**/*.py\",\n        \"**/*.pyc\",\n        \"**/*.pyc.*\",  # During pyc creation, temp files named *.pyc.NNN are created\n        \"**/*.dist-info/RECORD\",\n        \"BUILD\",\n        \"WORKSPACE\",\n    ]),\n    # This makes this directory a top-level in the python import\n    # search path for anything that depends on this.\n    imports = [\".\"],\n)\n"
+            }
+          },
+          "pypi__click": {
+            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
+            "attributes": {
+              "url": "https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl",
+              "sha256": "ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28",
+              "type": "zip",
+              "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:py_library.bzl\", \"py_library\")\n\npy_library(\n    name = \"lib\",\n    srcs = glob([\"**/*.py\"]),\n    data = glob([\"**/*\"], exclude=[\n        # These entries include those put into user-installed dependencies by\n        # data_exclude to avoid non-determinism.\n        \"**/*.py\",\n        \"**/*.pyc\",\n        \"**/*.pyc.*\",  # During pyc creation, temp files named *.pyc.NNN are created\n        \"**/*.dist-info/RECORD\",\n        \"BUILD\",\n        \"WORKSPACE\",\n    ]),\n    # This makes this directory a top-level in the python import\n    # search path for anything that depends on this.\n    imports = [\".\"],\n)\n"
+            }
+          },
+          "pypi__colorama": {
+            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
+            "attributes": {
+              "url": "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl",
+              "sha256": "4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6",
+              "type": "zip",
+              "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:py_library.bzl\", \"py_library\")\n\npy_library(\n    name = \"lib\",\n    srcs = glob([\"**/*.py\"]),\n    data = glob([\"**/*\"], exclude=[\n        # These entries include those put into user-installed dependencies by\n        # data_exclude to avoid non-determinism.\n        \"**/*.py\",\n        \"**/*.pyc\",\n        \"**/*.pyc.*\",  # During pyc creation, temp files named *.pyc.NNN are created\n        \"**/*.dist-info/RECORD\",\n        \"BUILD\",\n        \"WORKSPACE\",\n    ]),\n    # This makes this directory a top-level in the python import\n    # search path for anything that depends on this.\n    imports = [\".\"],\n)\n"
+            }
+          },
+          "pypi__importlib_metadata": {
+            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
+            "attributes": {
+              "url": "https://files.pythonhosted.org/packages/2d/0a/679461c511447ffaf176567d5c496d1de27cbe34a87df6677d7171b2fbd4/importlib_metadata-7.1.0-py3-none-any.whl",
+              "sha256": "30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570",
+              "type": "zip",
+              "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:py_library.bzl\", \"py_library\")\n\npy_library(\n    name = \"lib\",\n    srcs = glob([\"**/*.py\"]),\n    data = glob([\"**/*\"], exclude=[\n        # These entries include those put into user-installed dependencies by\n        # data_exclude to avoid non-determinism.\n        \"**/*.py\",\n        \"**/*.pyc\",\n        \"**/*.pyc.*\",  # During pyc creation, temp files named *.pyc.NNN are created\n        \"**/*.dist-info/RECORD\",\n        \"BUILD\",\n        \"WORKSPACE\",\n    ]),\n    # This makes this directory a top-level in the python import\n    # search path for anything that depends on this.\n    imports = [\".\"],\n)\n"
+            }
+          },
+          "pypi__installer": {
+            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
+            "attributes": {
+              "url": "https://files.pythonhosted.org/packages/e5/ca/1172b6638d52f2d6caa2dd262ec4c811ba59eee96d54a7701930726bce18/installer-0.7.0-py3-none-any.whl",
+              "sha256": "05d1933f0a5ba7d8d6296bb6d5018e7c94fa473ceb10cf198a92ccea19c27b53",
+              "type": "zip",
+              "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:py_library.bzl\", \"py_library\")\n\npy_library(\n    name = \"lib\",\n    srcs = glob([\"**/*.py\"]),\n    data = glob([\"**/*\"], exclude=[\n        # These entries include those put into user-installed dependencies by\n        # data_exclude to avoid non-determinism.\n        \"**/*.py\",\n        \"**/*.pyc\",\n        \"**/*.pyc.*\",  # During pyc creation, temp files named *.pyc.NNN are created\n        \"**/*.dist-info/RECORD\",\n        \"BUILD\",\n        \"WORKSPACE\",\n    ]),\n    # This makes this directory a top-level in the python import\n    # search path for anything that depends on this.\n    imports = [\".\"],\n)\n"
+            }
+          },
+          "pypi__more_itertools": {
+            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
+            "attributes": {
+              "url": "https://files.pythonhosted.org/packages/50/e2/8e10e465ee3987bb7c9ab69efb91d867d93959095f4807db102d07995d94/more_itertools-10.2.0-py3-none-any.whl",
+              "sha256": "686b06abe565edfab151cb8fd385a05651e1fdf8f0a14191e4439283421f8684",
+              "type": "zip",
+              "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:py_library.bzl\", \"py_library\")\n\npy_library(\n    name = \"lib\",\n    srcs = glob([\"**/*.py\"]),\n    data = glob([\"**/*\"], exclude=[\n        # These entries include those put into user-installed dependencies by\n        # data_exclude to avoid non-determinism.\n        \"**/*.py\",\n        \"**/*.pyc\",\n        \"**/*.pyc.*\",  # During pyc creation, temp files named *.pyc.NNN are created\n        \"**/*.dist-info/RECORD\",\n        \"BUILD\",\n        \"WORKSPACE\",\n    ]),\n    # This makes this directory a top-level in the python import\n    # search path for anything that depends on this.\n    imports = [\".\"],\n)\n"
+            }
+          },
+          "pypi__packaging": {
+            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
+            "attributes": {
+              "url": "https://files.pythonhosted.org/packages/49/df/1fceb2f8900f8639e278b056416d49134fb8d84c5942ffaa01ad34782422/packaging-24.0-py3-none-any.whl",
+              "sha256": "2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5",
+              "type": "zip",
+              "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:py_library.bzl\", \"py_library\")\n\npy_library(\n    name = \"lib\",\n    srcs = glob([\"**/*.py\"]),\n    data = glob([\"**/*\"], exclude=[\n        # These entries include those put into user-installed dependencies by\n        # data_exclude to avoid non-determinism.\n        \"**/*.py\",\n        \"**/*.pyc\",\n        \"**/*.pyc.*\",  # During pyc creation, temp files named *.pyc.NNN are created\n        \"**/*.dist-info/RECORD\",\n        \"BUILD\",\n        \"WORKSPACE\",\n    ]),\n    # This makes this directory a top-level in the python import\n    # search path for anything that depends on this.\n    imports = [\".\"],\n)\n"
+            }
+          },
+          "pypi__pep517": {
+            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
+            "attributes": {
+              "url": "https://files.pythonhosted.org/packages/25/6e/ca4a5434eb0e502210f591b97537d322546e4833dcb4d470a48c375c5540/pep517-0.13.1-py3-none-any.whl",
+              "sha256": "31b206f67165b3536dd577c5c3f1518e8fbaf38cbc57efff8369a392feff1721",
+              "type": "zip",
+              "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:py_library.bzl\", \"py_library\")\n\npy_library(\n    name = \"lib\",\n    srcs = glob([\"**/*.py\"]),\n    data = glob([\"**/*\"], exclude=[\n        # These entries include those put into user-installed dependencies by\n        # data_exclude to avoid non-determinism.\n        \"**/*.py\",\n        \"**/*.pyc\",\n        \"**/*.pyc.*\",  # During pyc creation, temp files named *.pyc.NNN are created\n        \"**/*.dist-info/RECORD\",\n        \"BUILD\",\n        \"WORKSPACE\",\n    ]),\n    # This makes this directory a top-level in the python import\n    # search path for anything that depends on this.\n    imports = [\".\"],\n)\n"
+            }
+          },
+          "pypi__pip": {
+            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
+            "attributes": {
+              "url": "https://files.pythonhosted.org/packages/8a/6a/19e9fe04fca059ccf770861c7d5721ab4c2aebc539889e97c7977528a53b/pip-24.0-py3-none-any.whl",
+              "sha256": "ba0d021a166865d2265246961bec0152ff124de910c5cc39f1156ce3fa7c69dc",
+              "type": "zip",
+              "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:py_library.bzl\", \"py_library\")\n\npy_library(\n    name = \"lib\",\n    srcs = glob([\"**/*.py\"]),\n    data = glob([\"**/*\"], exclude=[\n        # These entries include those put into user-installed dependencies by\n        # data_exclude to avoid non-determinism.\n        \"**/*.py\",\n        \"**/*.pyc\",\n        \"**/*.pyc.*\",  # During pyc creation, temp files named *.pyc.NNN are created\n        \"**/*.dist-info/RECORD\",\n        \"BUILD\",\n        \"WORKSPACE\",\n    ]),\n    # This makes this directory a top-level in the python import\n    # search path for anything that depends on this.\n    imports = [\".\"],\n)\n"
+            }
+          },
+          "pypi__pip_tools": {
+            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
+            "attributes": {
+              "url": "https://files.pythonhosted.org/packages/0d/dc/38f4ce065e92c66f058ea7a368a9c5de4e702272b479c0992059f7693941/pip_tools-7.4.1-py3-none-any.whl",
+              "sha256": "4c690e5fbae2f21e87843e89c26191f0d9454f362d8acdbd695716493ec8b3a9",
+              "type": "zip",
+              "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:py_library.bzl\", \"py_library\")\n\npy_library(\n    name = \"lib\",\n    srcs = glob([\"**/*.py\"]),\n    data = glob([\"**/*\"], exclude=[\n        # These entries include those put into user-installed dependencies by\n        # data_exclude to avoid non-determinism.\n        \"**/*.py\",\n        \"**/*.pyc\",\n        \"**/*.pyc.*\",  # During pyc creation, temp files named *.pyc.NNN are created\n        \"**/*.dist-info/RECORD\",\n        \"BUILD\",\n        \"WORKSPACE\",\n    ]),\n    # This makes this directory a top-level in the python import\n    # search path for anything that depends on this.\n    imports = [\".\"],\n)\n"
+            }
+          },
+          "pypi__pyproject_hooks": {
+            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
+            "attributes": {
+              "url": "https://files.pythonhosted.org/packages/ae/f3/431b9d5fe7d14af7a32340792ef43b8a714e7726f1d7b69cc4e8e7a3f1d7/pyproject_hooks-1.1.0-py3-none-any.whl",
+              "sha256": "7ceeefe9aec63a1064c18d939bdc3adf2d8aa1988a510afec15151578b232aa2",
+              "type": "zip",
+              "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:py_library.bzl\", \"py_library\")\n\npy_library(\n    name = \"lib\",\n    srcs = glob([\"**/*.py\"]),\n    data = glob([\"**/*\"], exclude=[\n        # These entries include those put into user-installed dependencies by\n        # data_exclude to avoid non-determinism.\n        \"**/*.py\",\n        \"**/*.pyc\",\n        \"**/*.pyc.*\",  # During pyc creation, temp files named *.pyc.NNN are created\n        \"**/*.dist-info/RECORD\",\n        \"BUILD\",\n        \"WORKSPACE\",\n    ]),\n    # This makes this directory a top-level in the python import\n    # search path for anything that depends on this.\n    imports = [\".\"],\n)\n"
+            }
+          },
+          "pypi__setuptools": {
+            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
+            "attributes": {
+              "url": "https://files.pythonhosted.org/packages/90/99/158ad0609729111163fc1f674a5a42f2605371a4cf036d0441070e2f7455/setuptools-78.1.1-py3-none-any.whl",
+              "sha256": "c3a9c4211ff4c309edb8b8c4f1cbfa7ae324c4ba9f91ff254e3d305b9fd54561",
+              "type": "zip",
+              "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:py_library.bzl\", \"py_library\")\n\npy_library(\n    name = \"lib\",\n    srcs = glob([\"**/*.py\"]),\n    data = glob([\"**/*\"], exclude=[\n        # These entries include those put into user-installed dependencies by\n        # data_exclude to avoid non-determinism.\n        \"**/*.py\",\n        \"**/*.pyc\",\n        \"**/*.pyc.*\",  # During pyc creation, temp files named *.pyc.NNN are created\n        \"**/*.dist-info/RECORD\",\n        \"BUILD\",\n        \"WORKSPACE\",\n    ]),\n    # This makes this directory a top-level in the python import\n    # search path for anything that depends on this.\n    imports = [\".\"],\n)\n"
+            }
+          },
+          "pypi__tomli": {
+            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
+            "attributes": {
+              "url": "https://files.pythonhosted.org/packages/97/75/10a9ebee3fd790d20926a90a2547f0bf78f371b2f13aa822c759680ca7b9/tomli-2.0.1-py3-none-any.whl",
+              "sha256": "939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc",
+              "type": "zip",
+              "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:py_library.bzl\", \"py_library\")\n\npy_library(\n    name = \"lib\",\n    srcs = glob([\"**/*.py\"]),\n    data = glob([\"**/*\"], exclude=[\n        # These entries include those put into user-installed dependencies by\n        # data_exclude to avoid non-determinism.\n        \"**/*.py\",\n        \"**/*.pyc\",\n        \"**/*.pyc.*\",  # During pyc creation, temp files named *.pyc.NNN are created\n        \"**/*.dist-info/RECORD\",\n        \"BUILD\",\n        \"WORKSPACE\",\n    ]),\n    # This makes this directory a top-level in the python import\n    # search path for anything that depends on this.\n    imports = [\".\"],\n)\n"
+            }
+          },
+          "pypi__wheel": {
+            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
+            "attributes": {
+              "url": "https://files.pythonhosted.org/packages/7d/cd/d7460c9a869b16c3dd4e1e403cce337df165368c71d6af229a74699622ce/wheel-0.43.0-py3-none-any.whl",
+              "sha256": "55c570405f142630c6b9f72fe09d9b67cf1477fcf543ae5b8dcb1f5b7377da81",
+              "type": "zip",
+              "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:py_library.bzl\", \"py_library\")\n\npy_library(\n    name = \"lib\",\n    srcs = glob([\"**/*.py\"]),\n    data = glob([\"**/*\"], exclude=[\n        # These entries include those put into user-installed dependencies by\n        # data_exclude to avoid non-determinism.\n        \"**/*.py\",\n        \"**/*.pyc\",\n        \"**/*.pyc.*\",  # During pyc creation, temp files named *.pyc.NNN are created\n        \"**/*.dist-info/RECORD\",\n        \"BUILD\",\n        \"WORKSPACE\",\n    ]),\n    # This makes this directory a top-level in the python import\n    # search path for anything that depends on this.\n    imports = [\".\"],\n)\n"
+            }
+          },
+          "pypi__zipp": {
+            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
+            "attributes": {
+              "url": "https://files.pythonhosted.org/packages/da/55/a03fd7240714916507e1fcf7ae355bd9d9ed2e6db492595f1a67f61681be/zipp-3.18.2-py3-none-any.whl",
+              "sha256": "dce197b859eb796242b0622af1b8beb0a722d52aa2f57133ead08edd5bf5374e",
+              "type": "zip",
+              "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:py_library.bzl\", \"py_library\")\n\npy_library(\n    name = \"lib\",\n    srcs = glob([\"**/*.py\"]),\n    data = glob([\"**/*\"], exclude=[\n        # These entries include those put into user-installed dependencies by\n        # data_exclude to avoid non-determinism.\n        \"**/*.py\",\n        \"**/*.pyc\",\n        \"**/*.pyc.*\",  # During pyc creation, temp files named *.pyc.NNN are created\n        \"**/*.dist-info/RECORD\",\n        \"BUILD\",\n        \"WORKSPACE\",\n    ]),\n    # This makes this directory a top-level in the python import\n    # search path for anything that depends on this.\n    imports = [\".\"],\n)\n"
+            }
+          }
+        },
+        "recordedRepoMappingEntries": [
+          [
+            "rules_python+",
+            "bazel_tools",
+            "bazel_tools"
+          ],
+          [
+            "rules_python+",
+            "pypi__build",
+            "rules_python++config+pypi__build"
+          ],
+          [
+            "rules_python+",
+            "pypi__click",
+            "rules_python++config+pypi__click"
+          ],
+          [
+            "rules_python+",
+            "pypi__colorama",
+            "rules_python++config+pypi__colorama"
+          ],
+          [
+            "rules_python+",
+            "pypi__importlib_metadata",
+            "rules_python++config+pypi__importlib_metadata"
+          ],
+          [
+            "rules_python+",
+            "pypi__installer",
+            "rules_python++config+pypi__installer"
+          ],
+          [
+            "rules_python+",
+            "pypi__more_itertools",
+            "rules_python++config+pypi__more_itertools"
+          ],
+          [
+            "rules_python+",
+            "pypi__packaging",
+            "rules_python++config+pypi__packaging"
+          ],
+          [
+            "rules_python+",
+            "pypi__pep517",
+            "rules_python++config+pypi__pep517"
+          ],
+          [
+            "rules_python+",
+            "pypi__pip",
+            "rules_python++config+pypi__pip"
+          ],
+          [
+            "rules_python+",
+            "pypi__pip_tools",
+            "rules_python++config+pypi__pip_tools"
+          ],
+          [
+            "rules_python+",
+            "pypi__pyproject_hooks",
+            "rules_python++config+pypi__pyproject_hooks"
+          ],
+          [
+            "rules_python+",
+            "pypi__setuptools",
+            "rules_python++config+pypi__setuptools"
+          ],
+          [
+            "rules_python+",
+            "pypi__tomli",
+            "rules_python++config+pypi__tomli"
+          ],
+          [
+            "rules_python+",
+            "pypi__wheel",
+            "rules_python++config+pypi__wheel"
+          ],
+          [
+            "rules_python+",
+            "pypi__zipp",
+            "rules_python++config+pypi__zipp"
+          ]
+        ]
+      }
+    },
+    "@@rules_python+//python/uv:uv.bzl%uv": {
+      "general": {
+        "bzlTransitiveDigest": "ijW9KS7qsIY+yBVvJ+Nr1mzwQox09j13DnE3iIwaeTM=",
+        "usagesDigest": "H8dQoNZcoqP+Mu0tHZTi4KHATzvNkM5ePuEqoQdklIU=",
+        "recordedFileInputs": {},
+        "recordedDirentsInputs": {},
+        "envVariables": {},
+        "generatedRepoSpecs": {
+          "uv": {
+            "repoRuleId": "@@rules_python+//python/uv/private:uv_toolchains_repo.bzl%uv_toolchains_repo",
+            "attributes": {
+              "toolchain_type": "'@@rules_python+//python/uv:uv_toolchain_type'",
+              "toolchain_names": [
+                "none"
+              ],
+              "toolchain_implementations": {
+                "none": "'@@rules_python+//python:none'"
+              },
+              "toolchain_compatible_with": {
+                "none": [
+                  "@platforms//:incompatible"
+                ]
+              },
+              "toolchain_target_settings": {}
+            }
+          }
+        },
+        "recordedRepoMappingEntries": [
+          [
+            "rules_python+",
+            "bazel_tools",
+            "bazel_tools"
+          ],
+          [
+            "rules_python+",
+            "platforms",
+            "platforms"
+          ]
+        ]
+      }
+    },
+    "@@rules_swift+//swift:extensions.bzl%non_module_deps": {
+      "general": {
+        "bzlTransitiveDigest": "6axDCXf6fQoPav8hojnUBxGA0FAMqLvtpC1cRsisCdw=",
+        "usagesDigest": "mhACFnrdMv9Wi0Mt67bxocJqviRkDSV+Ee5Mqdj5akA=",
+        "recordedFileInputs": {},
+        "recordedDirentsInputs": {},
+        "envVariables": {},
+        "generatedRepoSpecs": {
+          "com_github_apple_swift_protobuf": {
+            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%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": {
+            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%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_docc_symbolkit": {
+            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
+            "attributes": {
+              "urls": [
+                "https://github.com/apple/swift-docc-symbolkit/archive/refs/tags/swift-5.10-RELEASE.tar.gz"
+              ],
+              "sha256": "de1d4b6940468ddb53b89df7aa1a81323b9712775b0e33e8254fa0f6f7469a97",
+              "strip_prefix": "swift-docc-symbolkit-swift-5.10-RELEASE",
+              "build_file": "@@rules_swift+//third_party:com_github_apple_swift_docc_symbolkit/BUILD.overlay"
+            }
+          },
+          "com_github_apple_swift_nio": {
+            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%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": {
+            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%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": {
+            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%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": {
+            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%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": {
+            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%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": {
+            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%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": {
+            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%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": {
+            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%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": {
+            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%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": {
+            "repoRuleId": "@@rules_swift+//swift/internal:swift_autoconfiguration.bzl%swift_autoconfiguration",
+            "attributes": {}
+          }
+        },
+        "recordedRepoMappingEntries": [
+          [
+            "rules_swift+",
+            "bazel_tools",
+            "bazel_tools"
+          ],
+          [
+            "rules_swift+",
+            "build_bazel_rules_swift",
+            "rules_swift+"
+          ]
+        ]
+      }
+    }
+  },
+  "facts": {}
+}
diff --git a/external_plugin_deps.MODULE.bazel b/external_plugin_deps.MODULE.bazel
new file mode 100644
index 0000000..4b328ba
--- /dev/null
+++ b/external_plugin_deps.MODULE.bazel
@@ -0,0 +1,19 @@
+# Module fragment for wiring this plugin's Bazel module into the
+# Gerrit in-tree build when using Bzlmod.
+#
+# This file is included from Gerrit's plugins/external_plugin_deps.MODULE.bazel.
+# It wires the plugin module into the root dependency graph and exposes
+# any repositories it creates (for example via rules_jvm_external).
+#
+# NOTE: This file must be self-contained: bindings do not cross include()
+# boundaries, so it re-declares the rules_jvm_external extension handle.
+
+maven = use_extension("@rules_jvm_external//:extensions.bzl", "maven")
+
+bazel_dep(name = "gerrit-saml")
+local_path_override(
+    module_name = "gerrit-saml",
+    path = "plugins/saml",
+)
+
+use_repo(maven, "saml_plugin_deps")
diff --git a/external_plugin_deps.bzl b/external_plugin_deps.bzl
deleted file mode 100644
index ed1ca14..0000000
--- a/external_plugin_deps.bzl
+++ /dev/null
@@ -1,200 +0,0 @@
-load("//tools/bzl:maven_jar.bzl", "maven_jar")
-
-SHIBBOLETH = "https://build.shibboleth.net/nexus/content/repositories/releases/"
-
-OPENSAML_VERSION = "3.4.3"
-
-PAC4J_VERSION = "3.8.3"
-
-def external_plugin_deps():
-    # Transitive dependency of velocity
-    maven_jar(
-        name = "commons-collections",
-        artifact = "commons-collections:commons-collections:3.2.2",
-        sha1 = "8ad72fe39fa8c91eaaf12aadb21e0c3661fe26d5",
-    )
-
-    maven_jar(
-        name = "commons-io",
-        artifact = "commons-io:commons-io:2.4",
-        sha1 = "b1b6ea3b7e4aa4f492509a4952029cd8e48019ad",
-    )
-
-    maven_jar(
-        name = "commons-lang",
-        artifact = "commons-lang:commons-lang:2.6",
-        sha1 = "0ce1edb914c94ebc388f086c6827e8bdeec71ac2",
-    )
-
-    maven_jar(
-        name = "cryptacular",
-        artifact = "org.cryptacular:cryptacular:1.2.1",
-        sha1 = "c470bac7309ac04b0b9529bd7dcb1e0b75954f11",
-    )
-
-    maven_jar(
-        name = "joda-time",
-        artifact = "joda-time:joda-time:2.9.9",
-        sha1 = "f7b520c458572890807d143670c9b24f4de90897",
-    )
-
-    maven_jar(
-        name = "opensaml-core",
-        artifact = "org.opensaml:opensaml-core:" + OPENSAML_VERSION,
-        sha1 = "406eedd86ea88c1442a6b1c7625a45cf696b9f55",
-        repository = SHIBBOLETH,
-    )
-
-    maven_jar(
-        name = "opensaml-saml-api",
-        artifact = "org.opensaml:opensaml-saml-api:" + OPENSAML_VERSION,
-        sha1 = "b2c68a7265e8b059ecbfff0ac6525720cd3e1a86",
-        repository = SHIBBOLETH,
-    )
-
-    maven_jar(
-        name = "opensaml-storage-api",
-        artifact = "org.opensaml:opensaml-storage-api:" + OPENSAML_VERSION,
-        sha1 = "80ff32a3df660fe71527f293a317813c51375dcc",
-        repository = SHIBBOLETH,
-    )
-
-    maven_jar(
-        name = "opensaml-storage-impl",
-        artifact = "org.opensaml:opensaml-storage-impl:" + OPENSAML_VERSION,
-        sha1 = "da2116186a10ba5e1adecf2445184bf1feb1aa1c",
-        repository = SHIBBOLETH,
-    )
-
-    maven_jar(
-        name = "opensaml-saml-impl",
-        artifact = "org.opensaml:opensaml-saml-impl:" + OPENSAML_VERSION,
-        sha1 = "c4bce04bec8fd065bbc014a2c4003172ec612ba6",
-        repository = SHIBBOLETH,
-    )
-
-    maven_jar(
-        name = "opensaml-soap-impl",
-        artifact = "org.opensaml:opensaml-soap-impl:" + OPENSAML_VERSION,
-        sha1 = "9a1b9bc0ed6a0c62f3f607cc2c1164c76a57303e",
-        repository = SHIBBOLETH,
-    )
-
-    maven_jar(
-        name = "opensaml-soap-api",
-        artifact = "org.opensaml:opensaml-soap-api:" + OPENSAML_VERSION,
-        sha1 = "4fe18269fff79f7172d9dbe0d421886282baa434",
-        repository = SHIBBOLETH,
-    )
-
-    maven_jar(
-        name = "opensaml-xmlsec-api",
-        artifact = "org.opensaml:opensaml-xmlsec-api:" + OPENSAML_VERSION,
-        sha1 = "b7f0f8a9c17997008bcef75a8886faeb5e9d9ea9",
-        repository = SHIBBOLETH,
-    )
-
-    maven_jar(
-        name = "opensaml-xmlsec-impl",
-        artifact = "org.opensaml:opensaml-xmlsec-impl:" + OPENSAML_VERSION,
-        sha1 = "3dbdf38773a07d37f013dc9a2ecc4d0295a724de",
-        repository = SHIBBOLETH,
-    )
-
-    maven_jar(
-        name = "opensaml-security-api",
-        artifact = "org.opensaml:opensaml-security-api:" + OPENSAML_VERSION,
-        sha1 = "b6878bd144c15612ab899643e561e52f04d332c1",
-        repository = SHIBBOLETH,
-    )
-
-    maven_jar(
-        name = "opensaml-security-impl",
-        artifact = "org.opensaml:opensaml-security-impl:" + OPENSAML_VERSION,
-        sha1 = "72edf27dbce57ed29aebab8563a41942f7f15527",
-        repository = SHIBBOLETH,
-    )
-
-    maven_jar(
-        name = "opensaml-profile-api",
-        artifact = "org.opensaml:opensaml-profile-api:" + OPENSAML_VERSION,
-        sha1 = "8daff1c6b7ff47178054e17e78b0d4b19b622434",
-        repository = SHIBBOLETH,
-    )
-
-    maven_jar(
-        name = "opensaml-profile-impl",
-        artifact = "org.opensaml:opensaml-profile-impl:" + OPENSAML_VERSION,
-        sha1 = "175bd3d0ba07a17f0222ea799c3971119c9b32b3",
-        repository = SHIBBOLETH,
-    )
-
-    maven_jar(
-        name = "opensaml-messaging-api",
-        artifact = "org.opensaml:opensaml-messaging-api:" + OPENSAML_VERSION,
-        sha1 = "18f68283a3729e4355a29936861f6472ab20b2be",
-        repository = SHIBBOLETH,
-    )
-
-    maven_jar(
-        name = "opensaml-messaging-impl",
-        artifact = "org.opensaml:opensaml-messaging-impl:" + OPENSAML_VERSION,
-        sha1 = "d0cd65f2b0a167dc25477245adf5417a8735e132",
-        repository = SHIBBOLETH,
-    )
-
-    maven_jar(
-        name = "pac4j-saml",
-        artifact = "org.pac4j:pac4j-saml:" + PAC4J_VERSION,
-        sha1 = "c112c180703e600815c949bdd4c9646b6d70238e",
-    )
-
-    maven_jar(
-        name = "pac4j-core",
-        artifact = "org.pac4j:pac4j-core:" + PAC4J_VERSION,
-        sha1 = "ce2d5c63d9f034f5631d3b3ebec46f916b7064f2",
-    )
-
-    maven_jar(
-        name = "shibboleth-utilities",
-        artifact = "net.shibboleth.utilities:java-support:7.4.0",
-        sha1 = "e10c137cdb5045eea2c0ccf8ac5094052eaee36b",
-        repository = SHIBBOLETH,
-    )
-
-    maven_jar(
-        name = "shibboleth-xmlsectool",
-        artifact = "net.shibboleth.tool:xmlsectool:2.0.0",
-        sha1 = "c57f887f522c0e930341c7d86eff4d8ec9b797a1",
-        repository = SHIBBOLETH,
-    )
-
-    maven_jar(
-        name = "santuario-xmlsec",
-        artifact = "org.apache.santuario:xmlsec:2.1.4",
-        sha1 = "cb43326f02e3e77526c24269c8b5d3cc3f7f6653",
-    )
-
-    maven_jar(
-        name = "spring-core",
-        artifact = "org.springframework:spring-core:5.1.5.RELEASE",
-        sha1 = "aacc4555108f3da913a58114b2aebc819f58cce4",
-    )
-
-    maven_jar(
-        name = "stax2-api",
-        artifact = "org.codehaus.woodstox:stax2-api:3.1.4",
-        sha1 = "ac19014b1e6a7c08aad07fe114af792676b685b7",
-    )
-
-    maven_jar(
-        name = "velocity",
-        artifact = "org.apache.velocity:velocity:1.7",
-        sha1 = "2ceb567b8f3f21118ecdec129fe1271dbc09aa7a",
-    )
-
-    maven_jar(
-        name = "woodstox-core",
-        artifact = "com.fasterxml.woodstox:woodstox-core:5.0.3",
-        sha1 = "10aa199207fda142eff01cd61c69244877d71770",
-    )
diff --git a/saml_plugin_deps.lock.json b/saml_plugin_deps.lock.json
new file mode 100644
index 0000000..afb320b
--- /dev/null
+++ b/saml_plugin_deps.lock.json
@@ -0,0 +1,1309 @@
+{
+  "__AUTOGENERATED_FILE_DO_NOT_MODIFY_THIS_FILE_MANUALLY": "THERE_IS_NO_DATA_ONLY_ZUUL",
+  "__INPUT_ARTIFACTS_HASH": {
+    "antlr:antlr": -2145275312,
+    "com.beust:jcommander": 1163304480,
+    "com.google.code.findbugs:jsr305": -313338248,
+    "com.google.guava:guava": -2125091860,
+    "com.google.j2objc:j2objc-annotations": 1772577837,
+    "com.sun.istack:istack-commons-runtime": -1996941263,
+    "com.sun.xml.fastinfoset:FastInfoset": -376851424,
+    "commons-codec:commons-codec": 284109768,
+    "commons-io:commons-io": 150368282,
+    "dom4j:dom4j": -1935759878,
+    "io.dropwizard.metrics:metrics-core": 923383316,
+    "jakarta.activation:jakarta.activation-api": -634525369,
+    "jakarta.xml.bind:jakarta.xml.bind-api": -1675921593,
+    "javax.annotation:javax.annotation-api": 2130729383,
+    "javax.json:javax.json-api": -1689713273,
+    "net.spy:spymemcached": -1229464946,
+    "org.apache.httpcomponents:httpclient": 1407535949,
+    "org.apache.httpcomponents:httpcore": -1485416135,
+    "org.bouncycastle:bcprov-jdk15on": 1343277677,
+    "org.glassfish.jaxb:jaxb-runtime": -934194879,
+    "org.glassfish.jaxb:txw2": 1166785588,
+    "org.glassfish:javax.json": -1306772566,
+    "org.hibernate.common:hibernate-commons-annotations": 1785677079,
+    "org.hibernate.javax.persistence:hibernate-jpa-2.1-api": -715964364,
+    "org.hibernate:hibernate-core": -1713365582,
+    "org.hibernate:hibernate-entitymanager": 1263982483,
+    "org.javassist:javassist": -184085724,
+    "org.jboss.logging:jboss-logging": -167338717,
+    "org.jboss.logging:jboss-logging-annotations": 948439852,
+    "org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec": -218352971,
+    "org.jboss:jandex": 381532071,
+    "org.jvnet.staxex:stax-ex": 1653702714,
+    "org.ldaptive:ldaptive": -1401312048,
+    "org.pac4j:pac4j-core": -1885834262,
+    "org.pac4j:pac4j-saml": 546994744,
+    "org.slf4j:jcl-over-slf4j": 952037207,
+    "org.slf4j:slf4j-api": 2145585153,
+    "org.springframework:spring-beans": 1730161258,
+    "org.springframework:spring-jcl": 305529370,
+    "org.springframework:spring-jdbc": -1672745176,
+    "org.springframework:spring-orm": -2082237149,
+    "org.springframework:spring-tx": -1880570177,
+    "repositories": 1328618244,
+    "xalan:serializer": -570814062,
+    "xalan:xalan": -1133946166,
+    "xml-apis:xml-apis": -113825062
+  },
+  "__RESOLVED_ARTIFACTS_HASH": {
+    "com.fasterxml.woodstox:woodstox-core": 1559142143,
+    "com.fasterxml.woodstox:woodstox-core:jar:sources": 562322615,
+    "commons-collections:commons-collections": -1554676895,
+    "commons-collections:commons-collections:jar:sources": -940592224,
+    "commons-lang:commons-lang": 1068578062,
+    "commons-lang:commons-lang:jar:sources": -1880892831,
+    "joda-time:joda-time": 1802772986,
+    "joda-time:joda-time:jar:sources": -2055935237,
+    "net.shibboleth.tool:xmlsectool": 1283688185,
+    "net.shibboleth.tool:xmlsectool:jar:sources": 1685923833,
+    "net.shibboleth.utilities:java-support": -829122539,
+    "net.shibboleth.utilities:java-support:jar:sources": -1859970925,
+    "org.apache.santuario:xmlsec": 1600832347,
+    "org.apache.santuario:xmlsec:jar:sources": 16778711,
+    "org.apache.velocity:velocity": -338007855,
+    "org.apache.velocity:velocity:jar:sources": 423768923,
+    "org.codehaus.woodstox:stax2-api": 1683625127,
+    "org.codehaus.woodstox:stax2-api:jar:sources": -635980412,
+    "org.cryptacular:cryptacular": -1278569359,
+    "org.cryptacular:cryptacular:jar:sources": 532170463,
+    "org.opensaml:opensaml-core": 1448554566,
+    "org.opensaml:opensaml-core:jar:sources": -1372251147,
+    "org.opensaml:opensaml-messaging-api": 567233078,
+    "org.opensaml:opensaml-messaging-api:jar:sources": 1514783622,
+    "org.opensaml:opensaml-messaging-impl": -458533045,
+    "org.opensaml:opensaml-messaging-impl:jar:sources": -965946012,
+    "org.opensaml:opensaml-profile-api": -1273884513,
+    "org.opensaml:opensaml-profile-api:jar:sources": 12498399,
+    "org.opensaml:opensaml-profile-impl": 1217071109,
+    "org.opensaml:opensaml-profile-impl:jar:sources": 1258239839,
+    "org.opensaml:opensaml-saml-api": 952195453,
+    "org.opensaml:opensaml-saml-api:jar:sources": 467367240,
+    "org.opensaml:opensaml-saml-impl": 2051094081,
+    "org.opensaml:opensaml-saml-impl:jar:sources": 877274651,
+    "org.opensaml:opensaml-security-api": 1449104502,
+    "org.opensaml:opensaml-security-api:jar:sources": -1186479754,
+    "org.opensaml:opensaml-security-impl": -1616860860,
+    "org.opensaml:opensaml-security-impl:jar:sources": -421683774,
+    "org.opensaml:opensaml-soap-api": 1825222250,
+    "org.opensaml:opensaml-soap-api:jar:sources": 1367807556,
+    "org.opensaml:opensaml-soap-impl": -1989989837,
+    "org.opensaml:opensaml-soap-impl:jar:sources": 1365807144,
+    "org.opensaml:opensaml-storage-api": -1107019852,
+    "org.opensaml:opensaml-storage-api:jar:sources": -1255292524,
+    "org.opensaml:opensaml-storage-impl": 951553791,
+    "org.opensaml:opensaml-storage-impl:jar:sources": -1806560411,
+    "org.opensaml:opensaml-xmlsec-api": 1540948441,
+    "org.opensaml:opensaml-xmlsec-api:jar:sources": 366870672,
+    "org.opensaml:opensaml-xmlsec-impl": 1186580558,
+    "org.opensaml:opensaml-xmlsec-impl:jar:sources": 2136134416,
+    "org.pac4j:pac4j-core": -1843825366,
+    "org.pac4j:pac4j-core:jar:sources": -1023161084,
+    "org.pac4j:pac4j-saml": 570280143,
+    "org.pac4j:pac4j-saml:jar:sources": -1783477431,
+    "org.springframework:spring-core": -1934413677,
+    "org.springframework:spring-core:jar:sources": 1308686065
+  },
+  "artifacts": {
+    "com.fasterxml.woodstox:woodstox-core": {
+      "shasums": {
+        "jar": "a1c04b64fbfe20ae9f2c60a3bf1633fed6688ae31935b6bd4a457a1bbb2e82d4",
+        "sources": "d515c11b586b29da98c6359bbf0fd0eedfe5251b70626b28ca3f553e1c9061d9"
+      },
+      "version": "5.0.3"
+    },
+    "commons-collections:commons-collections": {
+      "shasums": {
+        "jar": "eeeae917917144a68a741d4c0dff66aa5c5c5fd85593ff217bced3fc8ca783b8",
+        "sources": "a5b5ee16a02edadf7fe637f250217c19878bc6134f15eb55635c48996f6fed1d"
+      },
+      "version": "3.2.2"
+    },
+    "commons-lang:commons-lang": {
+      "shasums": {
+        "jar": "2c73b940c91250bc98346926270f13a6a10bb6e29d2c9316a70d134e382c873e",
+        "sources": "8ceb33a5122d6540ebb90f114e9d52979cc364ab3ece2435a6df25c7b5b2e955"
+      },
+      "version": "2.4"
+    },
+    "joda-time:joda-time": {
+      "shasums": {
+        "jar": "b049a43c1057942e6acfbece008e4949b2e35d1658d0c8e06f4485397e2fa4e7",
+        "sources": "facba3aeb0c0d842d545bf7e732ea19869e2b18916adaa4eeda395c946c22991"
+      },
+      "version": "2.9.9"
+    },
+    "net.shibboleth.tool:xmlsectool": {
+      "shasums": {
+        "jar": "47f92f83257552bb65ea10150ed10b50ad1c1afb3461c94db62a9617f1a1eeba",
+        "sources": "5ec9e7894924eafd6fae90d9d4e4d84364dd204391ab9c873b07ab7890eecf22"
+      },
+      "version": "2.0.0"
+    },
+    "net.shibboleth.utilities:java-support": {
+      "shasums": {
+        "jar": "bccd0aaa211c20d68ef1d46f6bfc680b3a97d8c6c4c4d216168d7c272efd9edb",
+        "sources": "8bfd5ca8be60e0e80f932cc9bc23285c95f4caee685edb7022b87036ac94d18a"
+      },
+      "version": "7.5.0"
+    },
+    "org.apache.santuario:xmlsec": {
+      "shasums": {
+        "jar": "2e2ec8fe0cf873979f630ae4d35e7ede3390321279b7a15de9deed3f3430990c",
+        "sources": "817db7cf71d51bd358d9b516bff1d21b87452797c9a8678a26e5799b8b14408c"
+      },
+      "version": "2.1.4"
+    },
+    "org.apache.velocity:velocity": {
+      "shasums": {
+        "jar": "ec92dae810034f4b46dbb16ef4364a4013b0efb24a8c5dd67435cae46a290d8e",
+        "sources": "fb8079077f7ef9b4ee406b893d0e919f97fa468b3aa45782b341519f3ccbc2c2"
+      },
+      "version": "1.7"
+    },
+    "org.codehaus.woodstox:stax2-api": {
+      "shasums": {
+        "jar": "86d7c0b775a7c9b454cc6ba61d40a8eb3b99cc129f832eb9b977a3755b4b338e",
+        "sources": "2c36141117b83f63b5dded35f490c7b501a472fe60c60ecf02ed9e9954ef28b9"
+      },
+      "version": "3.1.4"
+    },
+    "org.cryptacular:cryptacular": {
+      "shasums": {
+        "jar": "0053f8d816b272a4be84c50b42ca97fe4cf42886e535b9389c834f1afc09158f",
+        "sources": "eaa3b3ff66c676f3157d23bfba887e5ee4e0ce6914d60cdbc4b94fdc6e0b40e8"
+      },
+      "version": "1.2.1"
+    },
+    "org.opensaml:opensaml-core": {
+      "shasums": {
+        "jar": "6364aa5bdef85d7ff010cdc1d1fd9e19e8b9d717500f2b39ea9b204df626ad94",
+        "sources": "6126c991f3fd85fe2c7d148cee983bdc5fbf40619e60741b6851abda0ee53ee4"
+      },
+      "version": "3.4.3"
+    },
+    "org.opensaml:opensaml-messaging-api": {
+      "shasums": {
+        "jar": "498786b70f96295b84e8afc7300ddcca60947957ab59c97ac6b31b9438727468",
+        "sources": "93871a1444259222b97f06dee19ff0b8c357393c6e44461707c717a5f366f359"
+      },
+      "version": "3.4.3"
+    },
+    "org.opensaml:opensaml-messaging-impl": {
+      "shasums": {
+        "jar": "d1c2b2131b77736aa7464c3ef87d174ecd6b4fee748e030facd42565fcff916c",
+        "sources": "010916adff774fdeaecabb223d0d592438f31dff50a25a1d900120214efe8021"
+      },
+      "version": "3.4.3"
+    },
+    "org.opensaml:opensaml-profile-api": {
+      "shasums": {
+        "jar": "174a4b550fb705b903ffd67cfce99317dca99919e6db7b992fb2d4fbcdc0163d",
+        "sources": "0fa786f804ddb0af225839b01e5251e566d6721b9691c4c312e13d39ad9ceed1"
+      },
+      "version": "3.4.3"
+    },
+    "org.opensaml:opensaml-profile-impl": {
+      "shasums": {
+        "jar": "bb72430db4e207ae43a1a371aa5caae9030165786e5cdd48b39e323545e837c4",
+        "sources": "e6724a9d73c6a000484ba27a3739bafacab00d2e09574826a131f205f2c90692"
+      },
+      "version": "3.4.3"
+    },
+    "org.opensaml:opensaml-saml-api": {
+      "shasums": {
+        "jar": "58b6d42a47d6ef1326853bd1dd5c22fcffd40fcde6006280cfc3fdbd63284e50",
+        "sources": "d369a72e092bbe88be64e99585190589e8e9ba4a18cf087f90f34306ea4e7a83"
+      },
+      "version": "3.4.3"
+    },
+    "org.opensaml:opensaml-saml-impl": {
+      "shasums": {
+        "jar": "4370a3f296ff958a1dd7a77b4fa032bbe8ab145981fbf39f221cd5a1e4fed60e",
+        "sources": "cb3a91ab64932fa0fc14fc75a6df3535885b095f4028c99f510103feaa0d1176"
+      },
+      "version": "3.4.3"
+    },
+    "org.opensaml:opensaml-security-api": {
+      "shasums": {
+        "jar": "559ba68e1d823e7997d8734d6e901f4d278caa7d7946dacf3b7156b827097380",
+        "sources": "e6fbc2c76e08fb0275b957f8deea385eb81858b2b654fa6af7f7e766670dba21"
+      },
+      "version": "3.4.3"
+    },
+    "org.opensaml:opensaml-security-impl": {
+      "shasums": {
+        "jar": "24ce19d2b8edea7c509a4772cb4c3587a97f55e14658f527aef671193c9e344f",
+        "sources": "6eb8ae9ff3e2aab0fe962701037ee1e59098ac77a33276ab974a59561c83b8c6"
+      },
+      "version": "3.4.3"
+    },
+    "org.opensaml:opensaml-soap-api": {
+      "shasums": {
+        "jar": "99bda4c02bdd1528dec1a283c610bd448495019845044f42616a0baefeb60d8e",
+        "sources": "4703c6a9982b767016dce4f54db2aa7a7965b865b76fa64f9244ed9555e21e25"
+      },
+      "version": "3.4.3"
+    },
+    "org.opensaml:opensaml-soap-impl": {
+      "shasums": {
+        "jar": "5c8a87aa67c3c302cd9cf73ba4fd9004c29fe3ee507c11fd876a845c1e892451",
+        "sources": "f08f16b205a740e1d62bea6bd37ab484d1d20c4d3f3769fa06dc7db881e3c37f"
+      },
+      "version": "3.4.3"
+    },
+    "org.opensaml:opensaml-storage-api": {
+      "shasums": {
+        "jar": "62105376b3e4887376ba321b72c81e8c2b6936fa6384505cd921da064d5d01c5",
+        "sources": "999e4b8a31fd65140b291e8c29e35daa464f872c8137948b2d68b1dfa1f46806"
+      },
+      "version": "3.4.3"
+    },
+    "org.opensaml:opensaml-storage-impl": {
+      "shasums": {
+        "jar": "d7916083bfd28472d18aa20749a867ff3bca7a727ddac1bdaa53a370e3d3f4ac",
+        "sources": "40353d1fbecf39ca7e06dd8fcc30f9cc331afec56ecb6785adddfaac6584c945"
+      },
+      "version": "3.4.3"
+    },
+    "org.opensaml:opensaml-xmlsec-api": {
+      "shasums": {
+        "jar": "9aeeacab145d2c7890d5753bebc11ca42e5885888a65514aa71c2131386b8470",
+        "sources": "18cef28e06c336d8a11b62f5c915ab6f04962555c0b4f7815b9631a64d1b8243"
+      },
+      "version": "3.4.3"
+    },
+    "org.opensaml:opensaml-xmlsec-impl": {
+      "shasums": {
+        "jar": "4f381b0c3eff01b6d2b9a6bd29535e26fb32303e58dad6e43fc6b1759727c04f",
+        "sources": "440fa3cf20185ff5a8f5f310c3db7d7b23fb6c3030be3df25f18d0b1e3d581f9"
+      },
+      "version": "3.4.3"
+    },
+    "org.pac4j:pac4j-core": {
+      "shasums": {
+        "jar": "2345c23cf4f80972c4acebc74f558c2e114d4c4ebaaf633c2996e38cbf0f4caa",
+        "sources": "53b659e9a8cf67e7986ea0b012ad9075c761a3a4cd3f26b3f8b8a495ec4d7763"
+      },
+      "version": "3.8.3"
+    },
+    "org.pac4j:pac4j-saml": {
+      "shasums": {
+        "jar": "382c33da50ac726eb128c04d3311ace3235456a466baaf84b1da4383e406b3df",
+        "sources": "70160a85a946547885e63e0b8ed038bfa0ffc7e02d911d3a2f15d273ca525d33"
+      },
+      "version": "3.8.3"
+    },
+    "org.springframework:spring-core": {
+      "shasums": {
+        "jar": "7fdf01404d57297b81103de73c79e2f13655bcc8096488f2fa47d74a0f0d1959",
+        "sources": "8f39b963a4c64c78ed6dd9a2a4f76d43ab5748aa6db4432b9f2031613ecd2668"
+      },
+      "version": "5.0.2.RELEASE"
+    }
+  },
+  "dependencies": {
+    "com.fasterxml.woodstox:woodstox-core": [
+      "org.codehaus.woodstox:stax2-api"
+    ],
+    "net.shibboleth.tool:xmlsectool": [
+      "net.shibboleth.utilities:java-support",
+      "org.apache.santuario:xmlsec",
+      "org.opensaml:opensaml-core",
+      "org.opensaml:opensaml-security-api",
+      "org.opensaml:opensaml-xmlsec-api",
+      "org.opensaml:opensaml-xmlsec-impl"
+    ],
+    "net.shibboleth.utilities:java-support": [
+      "joda-time:joda-time"
+    ],
+    "org.apache.santuario:xmlsec": [
+      "com.fasterxml.woodstox:woodstox-core"
+    ],
+    "org.apache.velocity:velocity": [
+      "commons-collections:commons-collections",
+      "commons-lang:commons-lang"
+    ],
+    "org.opensaml:opensaml-core": [
+      "joda-time:joda-time",
+      "net.shibboleth.utilities:java-support"
+    ],
+    "org.opensaml:opensaml-messaging-api": [
+      "joda-time:joda-time",
+      "net.shibboleth.utilities:java-support",
+      "org.opensaml:opensaml-core"
+    ],
+    "org.opensaml:opensaml-messaging-impl": [
+      "net.shibboleth.utilities:java-support",
+      "org.opensaml:opensaml-messaging-api"
+    ],
+    "org.opensaml:opensaml-profile-api": [
+      "net.shibboleth.utilities:java-support",
+      "org.opensaml:opensaml-core",
+      "org.opensaml:opensaml-messaging-api"
+    ],
+    "org.opensaml:opensaml-profile-impl": [
+      "net.shibboleth.utilities:java-support",
+      "org.opensaml:opensaml-messaging-api",
+      "org.opensaml:opensaml-profile-api",
+      "org.opensaml:opensaml-xmlsec-api",
+      "org.opensaml:opensaml-xmlsec-impl"
+    ],
+    "org.opensaml:opensaml-saml-api": [
+      "net.shibboleth.utilities:java-support",
+      "org.opensaml:opensaml-messaging-api",
+      "org.opensaml:opensaml-profile-api",
+      "org.opensaml:opensaml-soap-api",
+      "org.opensaml:opensaml-storage-api",
+      "org.opensaml:opensaml-xmlsec-api"
+    ],
+    "org.opensaml:opensaml-saml-impl": [
+      "net.shibboleth.utilities:java-support",
+      "org.apache.velocity:velocity",
+      "org.opensaml:opensaml-profile-api",
+      "org.opensaml:opensaml-saml-api",
+      "org.opensaml:opensaml-security-impl",
+      "org.opensaml:opensaml-soap-impl",
+      "org.opensaml:opensaml-storage-api",
+      "org.opensaml:opensaml-xmlsec-impl"
+    ],
+    "org.opensaml:opensaml-security-api": [
+      "net.shibboleth.utilities:java-support",
+      "org.apache.santuario:xmlsec",
+      "org.cryptacular:cryptacular",
+      "org.opensaml:opensaml-core",
+      "org.opensaml:opensaml-messaging-api"
+    ],
+    "org.opensaml:opensaml-security-impl": [
+      "net.shibboleth.utilities:java-support",
+      "org.opensaml:opensaml-messaging-api",
+      "org.opensaml:opensaml-security-api"
+    ],
+    "org.opensaml:opensaml-soap-api": [
+      "net.shibboleth.utilities:java-support",
+      "org.opensaml:opensaml-messaging-api",
+      "org.opensaml:opensaml-xmlsec-api"
+    ],
+    "org.opensaml:opensaml-soap-impl": [
+      "net.shibboleth.utilities:java-support",
+      "org.opensaml:opensaml-profile-api",
+      "org.opensaml:opensaml-soap-api"
+    ],
+    "org.opensaml:opensaml-storage-api": [
+      "joda-time:joda-time",
+      "net.shibboleth.utilities:java-support"
+    ],
+    "org.opensaml:opensaml-storage-impl": [
+      "net.shibboleth.utilities:java-support",
+      "org.cryptacular:cryptacular",
+      "org.opensaml:opensaml-profile-api",
+      "org.opensaml:opensaml-storage-api"
+    ],
+    "org.opensaml:opensaml-xmlsec-api": [
+      "net.shibboleth.utilities:java-support",
+      "org.opensaml:opensaml-messaging-api",
+      "org.opensaml:opensaml-security-api"
+    ],
+    "org.opensaml:opensaml-xmlsec-impl": [
+      "net.shibboleth.utilities:java-support",
+      "org.apache.santuario:xmlsec",
+      "org.cryptacular:cryptacular",
+      "org.opensaml:opensaml-core",
+      "org.opensaml:opensaml-messaging-api",
+      "org.opensaml:opensaml-security-api",
+      "org.opensaml:opensaml-security-impl",
+      "org.opensaml:opensaml-xmlsec-api"
+    ],
+    "org.pac4j:pac4j-saml": [
+      "commons-collections:commons-collections",
+      "joda-time:joda-time",
+      "net.shibboleth.tool:xmlsectool",
+      "org.apache.velocity:velocity",
+      "org.cryptacular:cryptacular",
+      "org.opensaml:opensaml-core",
+      "org.opensaml:opensaml-messaging-api",
+      "org.opensaml:opensaml-messaging-impl",
+      "org.opensaml:opensaml-profile-api",
+      "org.opensaml:opensaml-profile-impl",
+      "org.opensaml:opensaml-saml-api",
+      "org.opensaml:opensaml-saml-impl",
+      "org.opensaml:opensaml-security-api",
+      "org.opensaml:opensaml-security-impl",
+      "org.opensaml:opensaml-soap-api",
+      "org.opensaml:opensaml-storage-impl",
+      "org.opensaml:opensaml-xmlsec-api",
+      "org.opensaml:opensaml-xmlsec-impl",
+      "org.pac4j:pac4j-core",
+      "org.springframework:spring-core"
+    ]
+  },
+  "packages": {
+    "com.fasterxml.woodstox:woodstox-core": [
+      "com.ctc.wstx.api",
+      "com.ctc.wstx.cfg",
+      "com.ctc.wstx.compat",
+      "com.ctc.wstx.dom",
+      "com.ctc.wstx.dtd",
+      "com.ctc.wstx.ent",
+      "com.ctc.wstx.evt",
+      "com.ctc.wstx.exc",
+      "com.ctc.wstx.io",
+      "com.ctc.wstx.msv",
+      "com.ctc.wstx.osgi",
+      "com.ctc.wstx.sax",
+      "com.ctc.wstx.sr",
+      "com.ctc.wstx.stax",
+      "com.ctc.wstx.sw",
+      "com.ctc.wstx.util"
+    ],
+    "commons-collections:commons-collections": [
+      "org.apache.commons.collections",
+      "org.apache.commons.collections.bag",
+      "org.apache.commons.collections.bidimap",
+      "org.apache.commons.collections.buffer",
+      "org.apache.commons.collections.collection",
+      "org.apache.commons.collections.comparators",
+      "org.apache.commons.collections.functors",
+      "org.apache.commons.collections.iterators",
+      "org.apache.commons.collections.keyvalue",
+      "org.apache.commons.collections.list",
+      "org.apache.commons.collections.map",
+      "org.apache.commons.collections.set"
+    ],
+    "commons-lang:commons-lang": [
+      "org.apache.commons.lang",
+      "org.apache.commons.lang.builder",
+      "org.apache.commons.lang.enum",
+      "org.apache.commons.lang.enums",
+      "org.apache.commons.lang.exception",
+      "org.apache.commons.lang.math",
+      "org.apache.commons.lang.mutable",
+      "org.apache.commons.lang.text",
+      "org.apache.commons.lang.time"
+    ],
+    "joda-time:joda-time": [
+      "org.joda.time",
+      "org.joda.time.base",
+      "org.joda.time.chrono",
+      "org.joda.time.convert",
+      "org.joda.time.field",
+      "org.joda.time.format",
+      "org.joda.time.tz"
+    ],
+    "net.shibboleth.tool:xmlsectool": [
+      "net.shibboleth.tool.xmlsectool"
+    ],
+    "net.shibboleth.utilities:java-support": [
+      "net.shibboleth.utilities.java.support.annotation",
+      "net.shibboleth.utilities.java.support.annotation.constraint",
+      "net.shibboleth.utilities.java.support.codec",
+      "net.shibboleth.utilities.java.support.collection",
+      "net.shibboleth.utilities.java.support.component",
+      "net.shibboleth.utilities.java.support.httpclient",
+      "net.shibboleth.utilities.java.support.logic",
+      "net.shibboleth.utilities.java.support.net",
+      "net.shibboleth.utilities.java.support.primitive",
+      "net.shibboleth.utilities.java.support.resolver",
+      "net.shibboleth.utilities.java.support.resource",
+      "net.shibboleth.utilities.java.support.scripting",
+      "net.shibboleth.utilities.java.support.security",
+      "net.shibboleth.utilities.java.support.service",
+      "net.shibboleth.utilities.java.support.velocity",
+      "net.shibboleth.utilities.java.support.xml"
+    ],
+    "org.apache.santuario:xmlsec": [
+      "org.apache.jcp.xml.dsig.internal",
+      "org.apache.jcp.xml.dsig.internal.dom",
+      "org.apache.xml.security",
+      "org.apache.xml.security.algorithms",
+      "org.apache.xml.security.algorithms.implementations",
+      "org.apache.xml.security.binding.excc14n",
+      "org.apache.xml.security.binding.xmldsig",
+      "org.apache.xml.security.binding.xmldsig11",
+      "org.apache.xml.security.binding.xmlenc",
+      "org.apache.xml.security.binding.xmlenc11",
+      "org.apache.xml.security.binding.xop",
+      "org.apache.xml.security.c14n",
+      "org.apache.xml.security.c14n.helper",
+      "org.apache.xml.security.c14n.implementations",
+      "org.apache.xml.security.configuration",
+      "org.apache.xml.security.encryption",
+      "org.apache.xml.security.exceptions",
+      "org.apache.xml.security.keys",
+      "org.apache.xml.security.keys.content",
+      "org.apache.xml.security.keys.content.keyvalues",
+      "org.apache.xml.security.keys.content.x509",
+      "org.apache.xml.security.keys.keyresolver",
+      "org.apache.xml.security.keys.keyresolver.implementations",
+      "org.apache.xml.security.keys.storage",
+      "org.apache.xml.security.keys.storage.implementations",
+      "org.apache.xml.security.signature",
+      "org.apache.xml.security.signature.reference",
+      "org.apache.xml.security.stax.config",
+      "org.apache.xml.security.stax.ext",
+      "org.apache.xml.security.stax.ext.stax",
+      "org.apache.xml.security.stax.impl",
+      "org.apache.xml.security.stax.impl.algorithms",
+      "org.apache.xml.security.stax.impl.processor.input",
+      "org.apache.xml.security.stax.impl.processor.output",
+      "org.apache.xml.security.stax.impl.resourceResolvers",
+      "org.apache.xml.security.stax.impl.securityToken",
+      "org.apache.xml.security.stax.impl.stax",
+      "org.apache.xml.security.stax.impl.transformer",
+      "org.apache.xml.security.stax.impl.transformer.canonicalizer",
+      "org.apache.xml.security.stax.impl.util",
+      "org.apache.xml.security.stax.securityEvent",
+      "org.apache.xml.security.stax.securityToken",
+      "org.apache.xml.security.transforms",
+      "org.apache.xml.security.transforms.implementations",
+      "org.apache.xml.security.transforms.params",
+      "org.apache.xml.security.utils",
+      "org.apache.xml.security.utils.resolver",
+      "org.apache.xml.security.utils.resolver.implementations"
+    ],
+    "org.apache.velocity:velocity": [
+      "org.apache.velocity",
+      "org.apache.velocity.anakia",
+      "org.apache.velocity.app",
+      "org.apache.velocity.app.event",
+      "org.apache.velocity.app.event.implement",
+      "org.apache.velocity.app.tools",
+      "org.apache.velocity.context",
+      "org.apache.velocity.convert",
+      "org.apache.velocity.exception",
+      "org.apache.velocity.io",
+      "org.apache.velocity.runtime",
+      "org.apache.velocity.runtime.directive",
+      "org.apache.velocity.runtime.log",
+      "org.apache.velocity.runtime.parser",
+      "org.apache.velocity.runtime.parser.node",
+      "org.apache.velocity.runtime.resource",
+      "org.apache.velocity.runtime.resource.loader",
+      "org.apache.velocity.runtime.resource.util",
+      "org.apache.velocity.runtime.visitor",
+      "org.apache.velocity.servlet",
+      "org.apache.velocity.texen",
+      "org.apache.velocity.texen.ant",
+      "org.apache.velocity.texen.util",
+      "org.apache.velocity.util",
+      "org.apache.velocity.util.introspection"
+    ],
+    "org.codehaus.woodstox:stax2-api": [
+      "org.codehaus.stax2",
+      "org.codehaus.stax2.evt",
+      "org.codehaus.stax2.io",
+      "org.codehaus.stax2.osgi",
+      "org.codehaus.stax2.ri",
+      "org.codehaus.stax2.ri.dom",
+      "org.codehaus.stax2.ri.evt",
+      "org.codehaus.stax2.ri.typed",
+      "org.codehaus.stax2.typed",
+      "org.codehaus.stax2.util",
+      "org.codehaus.stax2.validation"
+    ],
+    "org.cryptacular:cryptacular": [
+      "org.cryptacular",
+      "org.cryptacular.adapter",
+      "org.cryptacular.asn",
+      "org.cryptacular.bean",
+      "org.cryptacular.codec",
+      "org.cryptacular.generator",
+      "org.cryptacular.generator.sp80038a",
+      "org.cryptacular.generator.sp80038d",
+      "org.cryptacular.io",
+      "org.cryptacular.pbe",
+      "org.cryptacular.spec",
+      "org.cryptacular.util",
+      "org.cryptacular.x509",
+      "org.cryptacular.x509.dn"
+    ],
+    "org.opensaml:opensaml-core": [
+      "org.opensaml.core",
+      "org.opensaml.core.config",
+      "org.opensaml.core.config.provider",
+      "org.opensaml.core.criterion",
+      "org.opensaml.core.metrics",
+      "org.opensaml.core.metrics.impl",
+      "org.opensaml.core.xml",
+      "org.opensaml.core.xml.config",
+      "org.opensaml.core.xml.io",
+      "org.opensaml.core.xml.persist",
+      "org.opensaml.core.xml.schema",
+      "org.opensaml.core.xml.schema.impl",
+      "org.opensaml.core.xml.util"
+    ],
+    "org.opensaml:opensaml-messaging-api": [
+      "org.opensaml.messaging",
+      "org.opensaml.messaging.context",
+      "org.opensaml.messaging.context.httpclient",
+      "org.opensaml.messaging.context.navigate",
+      "org.opensaml.messaging.decoder",
+      "org.opensaml.messaging.decoder.httpclient",
+      "org.opensaml.messaging.decoder.servlet",
+      "org.opensaml.messaging.encoder",
+      "org.opensaml.messaging.encoder.httpclient",
+      "org.opensaml.messaging.encoder.servlet",
+      "org.opensaml.messaging.error",
+      "org.opensaml.messaging.error.servlet",
+      "org.opensaml.messaging.handler",
+      "org.opensaml.messaging.logic",
+      "org.opensaml.messaging.pipeline",
+      "org.opensaml.messaging.pipeline.httpclient",
+      "org.opensaml.messaging.pipeline.servlet"
+    ],
+    "org.opensaml:opensaml-messaging-impl": [
+      "org.opensaml.messaging.handler.impl"
+    ],
+    "org.opensaml:opensaml-profile-api": [
+      "org.opensaml.profile.action",
+      "org.opensaml.profile.context",
+      "org.opensaml.profile.context.navigate",
+      "org.opensaml.profile.logic"
+    ],
+    "org.opensaml:opensaml-profile-impl": [
+      "org.opensaml.profile.action.impl"
+    ],
+    "org.opensaml:opensaml-saml-api": [
+      "org.opensaml.saml.common",
+      "org.opensaml.saml.common.assertion",
+      "org.opensaml.saml.common.binding",
+      "org.opensaml.saml.common.binding.artifact",
+      "org.opensaml.saml.common.binding.decoding",
+      "org.opensaml.saml.common.binding.encoding",
+      "org.opensaml.saml.common.messaging",
+      "org.opensaml.saml.common.messaging.context",
+      "org.opensaml.saml.common.messaging.context.navigate",
+      "org.opensaml.saml.common.messaging.logic",
+      "org.opensaml.saml.common.messaging.soap",
+      "org.opensaml.saml.common.profile",
+      "org.opensaml.saml.common.profile.logic",
+      "org.opensaml.saml.common.xml",
+      "org.opensaml.saml.config",
+      "org.opensaml.saml.criterion",
+      "org.opensaml.saml.ext.idpdisco",
+      "org.opensaml.saml.ext.reqattr",
+      "org.opensaml.saml.ext.saml1md",
+      "org.opensaml.saml.ext.saml2alg",
+      "org.opensaml.saml.ext.saml2aslo",
+      "org.opensaml.saml.ext.saml2cb",
+      "org.opensaml.saml.ext.saml2delrestrict",
+      "org.opensaml.saml.ext.saml2mdattr",
+      "org.opensaml.saml.ext.saml2mdquery",
+      "org.opensaml.saml.ext.saml2mdreqinit",
+      "org.opensaml.saml.ext.saml2mdrpi",
+      "org.opensaml.saml.ext.saml2mdui",
+      "org.opensaml.saml.ext.samlec",
+      "org.opensaml.saml.ext.samlpthrpty",
+      "org.opensaml.saml.metadata",
+      "org.opensaml.saml.metadata.criteria.entity",
+      "org.opensaml.saml.metadata.criteria.role",
+      "org.opensaml.saml.metadata.resolver",
+      "org.opensaml.saml.metadata.resolver.filter",
+      "org.opensaml.saml.metadata.resolver.index",
+      "org.opensaml.saml.metadata.support",
+      "org.opensaml.saml.saml1.binding.artifact",
+      "org.opensaml.saml.saml1.core",
+      "org.opensaml.saml.saml1.profile",
+      "org.opensaml.saml.saml2.assertion",
+      "org.opensaml.saml.saml2.binding.artifact",
+      "org.opensaml.saml.saml2.common",
+      "org.opensaml.saml.saml2.core",
+      "org.opensaml.saml.saml2.ecp",
+      "org.opensaml.saml.saml2.encryption",
+      "org.opensaml.saml.saml2.metadata",
+      "org.opensaml.saml.saml2.profile",
+      "org.opensaml.saml.saml2.profile.context",
+      "org.opensaml.saml.saml2.wssecurity"
+    ],
+    "org.opensaml:opensaml-saml-impl": [
+      "org.opensaml.saml.common.binding.artifact.impl",
+      "org.opensaml.saml.common.binding.impl",
+      "org.opensaml.saml.common.binding.security.impl",
+      "org.opensaml.saml.common.profile.impl",
+      "org.opensaml.saml.config.impl",
+      "org.opensaml.saml.ext.idpdisco.impl",
+      "org.opensaml.saml.ext.reqattr.impl",
+      "org.opensaml.saml.ext.saml1md.impl",
+      "org.opensaml.saml.ext.saml2alg.impl",
+      "org.opensaml.saml.ext.saml2aslo.impl",
+      "org.opensaml.saml.ext.saml2cb.impl",
+      "org.opensaml.saml.ext.saml2delrestrict.impl",
+      "org.opensaml.saml.ext.saml2mdattr.impl",
+      "org.opensaml.saml.ext.saml2mdquery.impl",
+      "org.opensaml.saml.ext.saml2mdreqinit.impl",
+      "org.opensaml.saml.ext.saml2mdrpi.impl",
+      "org.opensaml.saml.ext.saml2mdui.impl",
+      "org.opensaml.saml.ext.samlec.impl",
+      "org.opensaml.saml.ext.samlpthrpty.impl",
+      "org.opensaml.saml.metadata.criteria.entity.impl",
+      "org.opensaml.saml.metadata.criteria.role.impl",
+      "org.opensaml.saml.metadata.resolver.filter.impl",
+      "org.opensaml.saml.metadata.resolver.impl",
+      "org.opensaml.saml.metadata.resolver.index.impl",
+      "org.opensaml.saml.saml1.binding.decoding.impl",
+      "org.opensaml.saml.saml1.binding.encoding.impl",
+      "org.opensaml.saml.saml1.binding.impl",
+      "org.opensaml.saml.saml1.core.impl",
+      "org.opensaml.saml.saml1.profile.impl",
+      "org.opensaml.saml.saml2.assertion.impl",
+      "org.opensaml.saml.saml2.binding.decoding.impl",
+      "org.opensaml.saml.saml2.binding.encoding.impl",
+      "org.opensaml.saml.saml2.binding.impl",
+      "org.opensaml.saml.saml2.binding.security.impl",
+      "org.opensaml.saml.saml2.core.impl",
+      "org.opensaml.saml.saml2.ecp.impl",
+      "org.opensaml.saml.saml2.metadata.impl",
+      "org.opensaml.saml.saml2.profile.impl",
+      "org.opensaml.saml.saml2.wssecurity.messaging.impl",
+      "org.opensaml.saml.security.impl"
+    ],
+    "org.opensaml:opensaml-security-api": [
+      "org.opensaml.security",
+      "org.opensaml.security.credential",
+      "org.opensaml.security.criteria",
+      "org.opensaml.security.crypto",
+      "org.opensaml.security.httpclient",
+      "org.opensaml.security.messaging",
+      "org.opensaml.security.trust",
+      "org.opensaml.security.x509",
+      "org.opensaml.security.x509.tls"
+    ],
+    "org.opensaml:opensaml-security-impl": [
+      "org.opensaml.security.config.impl",
+      "org.opensaml.security.credential.criteria.impl",
+      "org.opensaml.security.credential.impl",
+      "org.opensaml.security.httpclient.impl",
+      "org.opensaml.security.messaging.impl",
+      "org.opensaml.security.trust.impl",
+      "org.opensaml.security.x509.impl",
+      "org.opensaml.security.x509.tls.impl"
+    ],
+    "org.opensaml:opensaml-soap-api": [
+      "org.opensaml.soap.client",
+      "org.opensaml.soap.client.http",
+      "org.opensaml.soap.client.messaging",
+      "org.opensaml.soap.client.security",
+      "org.opensaml.soap.common",
+      "org.opensaml.soap.messaging",
+      "org.opensaml.soap.messaging.context",
+      "org.opensaml.soap.soap11",
+      "org.opensaml.soap.soap12",
+      "org.opensaml.soap.util",
+      "org.opensaml.soap.wsaddressing",
+      "org.opensaml.soap.wsaddressing.messaging",
+      "org.opensaml.soap.wsaddressing.util",
+      "org.opensaml.soap.wsfed",
+      "org.opensaml.soap.wspolicy",
+      "org.opensaml.soap.wssecurity",
+      "org.opensaml.soap.wssecurity.messaging",
+      "org.opensaml.soap.wssecurity.util",
+      "org.opensaml.soap.wstrust"
+    ],
+    "org.opensaml:opensaml-soap-impl": [
+      "org.opensaml.soap.client.soap11.decoder.http.impl",
+      "org.opensaml.soap.client.soap11.encoder.http.impl",
+      "org.opensaml.soap.config.impl",
+      "org.opensaml.soap.soap11.decoder.http.impl",
+      "org.opensaml.soap.soap11.encoder.http.impl",
+      "org.opensaml.soap.soap11.impl",
+      "org.opensaml.soap.soap11.messaging.impl",
+      "org.opensaml.soap.soap11.profile.impl",
+      "org.opensaml.soap.wsaddressing.impl",
+      "org.opensaml.soap.wsaddressing.messaging.impl",
+      "org.opensaml.soap.wsfed.impl",
+      "org.opensaml.soap.wspolicy.impl",
+      "org.opensaml.soap.wssecurity.impl",
+      "org.opensaml.soap.wssecurity.messaging.impl",
+      "org.opensaml.soap.wstrust.impl"
+    ],
+    "org.opensaml:opensaml-storage-api": [
+      "org.opensaml.storage",
+      "org.opensaml.storage.annotation"
+    ],
+    "org.opensaml:opensaml-storage-impl": [
+      "org.opensaml.storage.impl",
+      "org.opensaml.storage.impl.client",
+      "org.opensaml.storage.impl.memcached"
+    ],
+    "org.opensaml:opensaml-xmlsec-api": [
+      "org.opensaml.xmlsec",
+      "org.opensaml.xmlsec.algorithm",
+      "org.opensaml.xmlsec.algorithm.descriptors",
+      "org.opensaml.xmlsec.config",
+      "org.opensaml.xmlsec.context",
+      "org.opensaml.xmlsec.criterion",
+      "org.opensaml.xmlsec.crypto",
+      "org.opensaml.xmlsec.encryption",
+      "org.opensaml.xmlsec.encryption.support",
+      "org.opensaml.xmlsec.keyinfo",
+      "org.opensaml.xmlsec.signature",
+      "org.opensaml.xmlsec.signature.support"
+    ],
+    "org.opensaml:opensaml-xmlsec-impl": [
+      "org.opensaml.xmlsec.config.impl",
+      "org.opensaml.xmlsec.encryption.impl",
+      "org.opensaml.xmlsec.impl",
+      "org.opensaml.xmlsec.keyinfo.impl",
+      "org.opensaml.xmlsec.keyinfo.impl.provider",
+      "org.opensaml.xmlsec.messaging.impl",
+      "org.opensaml.xmlsec.signature.impl",
+      "org.opensaml.xmlsec.signature.support.impl",
+      "org.opensaml.xmlsec.signature.support.impl.provider"
+    ],
+    "org.pac4j:pac4j-core": [
+      "org.pac4j.core.authorization.authorizer",
+      "org.pac4j.core.authorization.authorizer.csrf",
+      "org.pac4j.core.authorization.checker",
+      "org.pac4j.core.authorization.generator",
+      "org.pac4j.core.client",
+      "org.pac4j.core.client.direct",
+      "org.pac4j.core.client.finder",
+      "org.pac4j.core.config",
+      "org.pac4j.core.context",
+      "org.pac4j.core.context.session",
+      "org.pac4j.core.credentials",
+      "org.pac4j.core.credentials.authenticator",
+      "org.pac4j.core.credentials.extractor",
+      "org.pac4j.core.credentials.password",
+      "org.pac4j.core.engine",
+      "org.pac4j.core.engine.decision",
+      "org.pac4j.core.exception",
+      "org.pac4j.core.http.adapter",
+      "org.pac4j.core.http.ajax",
+      "org.pac4j.core.http.callback",
+      "org.pac4j.core.http.url",
+      "org.pac4j.core.logout",
+      "org.pac4j.core.logout.handler",
+      "org.pac4j.core.matching",
+      "org.pac4j.core.profile",
+      "org.pac4j.core.profile.converter",
+      "org.pac4j.core.profile.creator",
+      "org.pac4j.core.profile.definition",
+      "org.pac4j.core.profile.jwt",
+      "org.pac4j.core.profile.service",
+      "org.pac4j.core.redirect",
+      "org.pac4j.core.state",
+      "org.pac4j.core.store",
+      "org.pac4j.core.util"
+    ],
+    "org.pac4j:pac4j-saml": [
+      "org.pac4j.saml.client",
+      "org.pac4j.saml.config",
+      "org.pac4j.saml.context",
+      "org.pac4j.saml.credentials",
+      "org.pac4j.saml.credentials.authenticator",
+      "org.pac4j.saml.credentials.extractor",
+      "org.pac4j.saml.crypto",
+      "org.pac4j.saml.exceptions",
+      "org.pac4j.saml.logout",
+      "org.pac4j.saml.logout.impl",
+      "org.pac4j.saml.metadata",
+      "org.pac4j.saml.profile",
+      "org.pac4j.saml.profile.api",
+      "org.pac4j.saml.profile.impl",
+      "org.pac4j.saml.redirect",
+      "org.pac4j.saml.replay",
+      "org.pac4j.saml.sso.artifact",
+      "org.pac4j.saml.sso.impl",
+      "org.pac4j.saml.state",
+      "org.pac4j.saml.storage",
+      "org.pac4j.saml.transport",
+      "org.pac4j.saml.util"
+    ],
+    "org.springframework:spring-core": [
+      "org.springframework.asm",
+      "org.springframework.cglib",
+      "org.springframework.cglib.beans",
+      "org.springframework.cglib.core",
+      "org.springframework.cglib.core.internal",
+      "org.springframework.cglib.proxy",
+      "org.springframework.cglib.reflect",
+      "org.springframework.cglib.transform",
+      "org.springframework.cglib.transform.impl",
+      "org.springframework.cglib.util",
+      "org.springframework.core",
+      "org.springframework.core.annotation",
+      "org.springframework.core.codec",
+      "org.springframework.core.convert",
+      "org.springframework.core.convert.converter",
+      "org.springframework.core.convert.support",
+      "org.springframework.core.env",
+      "org.springframework.core.io",
+      "org.springframework.core.io.buffer",
+      "org.springframework.core.io.support",
+      "org.springframework.core.serializer",
+      "org.springframework.core.serializer.support",
+      "org.springframework.core.style",
+      "org.springframework.core.task",
+      "org.springframework.core.task.support",
+      "org.springframework.core.type",
+      "org.springframework.core.type.classreading",
+      "org.springframework.core.type.filter",
+      "org.springframework.lang",
+      "org.springframework.objenesis",
+      "org.springframework.objenesis.instantiator",
+      "org.springframework.objenesis.instantiator.android",
+      "org.springframework.objenesis.instantiator.annotations",
+      "org.springframework.objenesis.instantiator.basic",
+      "org.springframework.objenesis.instantiator.gcj",
+      "org.springframework.objenesis.instantiator.perc",
+      "org.springframework.objenesis.instantiator.sun",
+      "org.springframework.objenesis.instantiator.util",
+      "org.springframework.objenesis.strategy",
+      "org.springframework.util",
+      "org.springframework.util.backoff",
+      "org.springframework.util.comparator",
+      "org.springframework.util.concurrent",
+      "org.springframework.util.xml"
+    ]
+  },
+  "repositories": {
+    "https://repo1.maven.org/maven2/": [
+      "com.fasterxml.woodstox:woodstox-core",
+      "com.fasterxml.woodstox:woodstox-core:jar:sources",
+      "commons-collections:commons-collections",
+      "commons-collections:commons-collections:jar:sources",
+      "commons-lang:commons-lang",
+      "commons-lang:commons-lang:jar:sources",
+      "joda-time:joda-time",
+      "joda-time:joda-time:jar:sources",
+      "net.shibboleth.tool:xmlsectool",
+      "net.shibboleth.tool:xmlsectool:jar:sources",
+      "net.shibboleth.utilities:java-support",
+      "net.shibboleth.utilities:java-support:jar:sources",
+      "org.apache.santuario:xmlsec",
+      "org.apache.santuario:xmlsec:jar:sources",
+      "org.apache.velocity:velocity",
+      "org.apache.velocity:velocity:jar:sources",
+      "org.codehaus.woodstox:stax2-api",
+      "org.codehaus.woodstox:stax2-api:jar:sources",
+      "org.cryptacular:cryptacular",
+      "org.cryptacular:cryptacular:jar:sources",
+      "org.opensaml:opensaml-core",
+      "org.opensaml:opensaml-core:jar:sources",
+      "org.opensaml:opensaml-messaging-api",
+      "org.opensaml:opensaml-messaging-api:jar:sources",
+      "org.opensaml:opensaml-messaging-impl",
+      "org.opensaml:opensaml-messaging-impl:jar:sources",
+      "org.opensaml:opensaml-profile-api",
+      "org.opensaml:opensaml-profile-api:jar:sources",
+      "org.opensaml:opensaml-profile-impl",
+      "org.opensaml:opensaml-profile-impl:jar:sources",
+      "org.opensaml:opensaml-saml-api",
+      "org.opensaml:opensaml-saml-api:jar:sources",
+      "org.opensaml:opensaml-saml-impl",
+      "org.opensaml:opensaml-saml-impl:jar:sources",
+      "org.opensaml:opensaml-security-api",
+      "org.opensaml:opensaml-security-api:jar:sources",
+      "org.opensaml:opensaml-security-impl",
+      "org.opensaml:opensaml-security-impl:jar:sources",
+      "org.opensaml:opensaml-soap-api",
+      "org.opensaml:opensaml-soap-api:jar:sources",
+      "org.opensaml:opensaml-soap-impl",
+      "org.opensaml:opensaml-soap-impl:jar:sources",
+      "org.opensaml:opensaml-storage-api",
+      "org.opensaml:opensaml-storage-api:jar:sources",
+      "org.opensaml:opensaml-storage-impl",
+      "org.opensaml:opensaml-storage-impl:jar:sources",
+      "org.opensaml:opensaml-xmlsec-api",
+      "org.opensaml:opensaml-xmlsec-api:jar:sources",
+      "org.opensaml:opensaml-xmlsec-impl",
+      "org.opensaml:opensaml-xmlsec-impl:jar:sources",
+      "org.pac4j:pac4j-core",
+      "org.pac4j:pac4j-core:jar:sources",
+      "org.pac4j:pac4j-saml",
+      "org.pac4j:pac4j-saml:jar:sources",
+      "org.springframework:spring-core",
+      "org.springframework:spring-core:jar:sources"
+    ],
+    "https://build.shibboleth.net/nexus/content/repositories/releases/": [
+      "com.fasterxml.woodstox:woodstox-core",
+      "com.fasterxml.woodstox:woodstox-core:jar:sources",
+      "commons-collections:commons-collections",
+      "commons-collections:commons-collections:jar:sources",
+      "commons-lang:commons-lang",
+      "commons-lang:commons-lang:jar:sources",
+      "joda-time:joda-time",
+      "joda-time:joda-time:jar:sources",
+      "net.shibboleth.tool:xmlsectool",
+      "net.shibboleth.tool:xmlsectool:jar:sources",
+      "net.shibboleth.utilities:java-support",
+      "net.shibboleth.utilities:java-support:jar:sources",
+      "org.apache.santuario:xmlsec",
+      "org.apache.santuario:xmlsec:jar:sources",
+      "org.apache.velocity:velocity",
+      "org.apache.velocity:velocity:jar:sources",
+      "org.codehaus.woodstox:stax2-api",
+      "org.codehaus.woodstox:stax2-api:jar:sources",
+      "org.cryptacular:cryptacular",
+      "org.cryptacular:cryptacular:jar:sources",
+      "org.opensaml:opensaml-core",
+      "org.opensaml:opensaml-core:jar:sources",
+      "org.opensaml:opensaml-messaging-api",
+      "org.opensaml:opensaml-messaging-api:jar:sources",
+      "org.opensaml:opensaml-messaging-impl",
+      "org.opensaml:opensaml-messaging-impl:jar:sources",
+      "org.opensaml:opensaml-profile-api",
+      "org.opensaml:opensaml-profile-api:jar:sources",
+      "org.opensaml:opensaml-profile-impl",
+      "org.opensaml:opensaml-profile-impl:jar:sources",
+      "org.opensaml:opensaml-saml-api",
+      "org.opensaml:opensaml-saml-api:jar:sources",
+      "org.opensaml:opensaml-saml-impl",
+      "org.opensaml:opensaml-saml-impl:jar:sources",
+      "org.opensaml:opensaml-security-api",
+      "org.opensaml:opensaml-security-api:jar:sources",
+      "org.opensaml:opensaml-security-impl",
+      "org.opensaml:opensaml-security-impl:jar:sources",
+      "org.opensaml:opensaml-soap-api",
+      "org.opensaml:opensaml-soap-api:jar:sources",
+      "org.opensaml:opensaml-soap-impl",
+      "org.opensaml:opensaml-soap-impl:jar:sources",
+      "org.opensaml:opensaml-storage-api",
+      "org.opensaml:opensaml-storage-api:jar:sources",
+      "org.opensaml:opensaml-storage-impl",
+      "org.opensaml:opensaml-storage-impl:jar:sources",
+      "org.opensaml:opensaml-xmlsec-api",
+      "org.opensaml:opensaml-xmlsec-api:jar:sources",
+      "org.opensaml:opensaml-xmlsec-impl",
+      "org.opensaml:opensaml-xmlsec-impl:jar:sources",
+      "org.pac4j:pac4j-core",
+      "org.pac4j:pac4j-core:jar:sources",
+      "org.pac4j:pac4j-saml",
+      "org.pac4j:pac4j-saml:jar:sources",
+      "org.springframework:spring-core",
+      "org.springframework:spring-core:jar:sources"
+    ]
+  },
+  "services": {
+    "com.fasterxml.woodstox:woodstox-core": {
+      "javax.xml.stream.XMLEventFactory": [
+        "com.ctc.wstx.stax.WstxEventFactory"
+      ],
+      "javax.xml.stream.XMLInputFactory": [
+        "com.ctc.wstx.stax.WstxInputFactory"
+      ],
+      "javax.xml.stream.XMLOutputFactory": [
+        "com.ctc.wstx.stax.WstxOutputFactory"
+      ],
+      "org.codehaus.stax2.validation.XMLValidationSchemaFactory.dtd": [
+        "com.ctc.wstx.dtd.DTDSchemaFactory"
+      ],
+      "org.codehaus.stax2.validation.XMLValidationSchemaFactory.relaxng": [
+        "com.ctc.wstx.msv.RelaxNGSchemaFactory"
+      ],
+      "org.codehaus.stax2.validation.XMLValidationSchemaFactory.w3c": [
+        "com.ctc.wstx.msv.W3CSchemaFactory"
+      ]
+    },
+    "com.fasterxml.woodstox:woodstox-core:jar:sources": {
+      "javax.xml.stream.XMLEventFactory": [
+        "com.ctc.wstx.stax.WstxEventFactory"
+      ],
+      "javax.xml.stream.XMLInputFactory": [
+        "com.ctc.wstx.stax.WstxInputFactory"
+      ],
+      "javax.xml.stream.XMLOutputFactory": [
+        "com.ctc.wstx.stax.WstxOutputFactory"
+      ],
+      "org.codehaus.stax2.validation.XMLValidationSchemaFactory.dtd": [
+        "com.ctc.wstx.dtd.DTDSchemaFactory"
+      ],
+      "org.codehaus.stax2.validation.XMLValidationSchemaFactory.relaxng": [
+        "com.ctc.wstx.msv.RelaxNGSchemaFactory"
+      ],
+      "org.codehaus.stax2.validation.XMLValidationSchemaFactory.w3c": [
+        "com.ctc.wstx.msv.W3CSchemaFactory"
+      ]
+    },
+    "org.opensaml:opensaml-core": {
+      "org.opensaml.core.config.Initializer": [
+        "org.opensaml.core.metrics.impl.MetricRegistryInitializer",
+        "org.opensaml.core.xml.config.GlobalParserPoolInitializer",
+        "org.opensaml.core.xml.config.XMLObjectProviderInitializer"
+      ]
+    },
+    "org.opensaml:opensaml-core:jar:sources": {
+      "org.opensaml.core.config.Initializer": [
+        "org.opensaml.core.metrics.impl.MetricRegistryInitializer",
+        "org.opensaml.core.xml.config.GlobalParserPoolInitializer",
+        "org.opensaml.core.xml.config.XMLObjectProviderInitializer"
+      ]
+    },
+    "org.opensaml:opensaml-saml-impl": {
+      "org.opensaml.core.config.Initializer": [
+        "org.opensaml.saml.config.impl.SAMLConfigurationInitializer",
+        "org.opensaml.saml.config.impl.XMLObjectProviderInitializer"
+      ]
+    },
+    "org.opensaml:opensaml-saml-impl:jar:sources": {
+      "org.opensaml.core.config.Initializer": [
+        "org.opensaml.saml.config.impl.SAMLConfigurationInitializer",
+        "org.opensaml.saml.config.impl.XMLObjectProviderInitializer"
+      ]
+    },
+    "org.opensaml:opensaml-security-impl": {
+      "org.opensaml.core.config.Initializer": [
+        "org.opensaml.security.config.impl.ClientTLSValidationConfiguratonInitializer",
+        "org.opensaml.security.config.impl.HttpClientSecurityConfigurationInitalizer"
+      ]
+    },
+    "org.opensaml:opensaml-security-impl:jar:sources": {
+      "org.opensaml.core.config.Initializer": [
+        "org.opensaml.security.config.impl.ClientTLSValidationConfiguratonInitializer",
+        "org.opensaml.security.config.impl.HttpClientSecurityConfigurationInitalizer"
+      ]
+    },
+    "org.opensaml:opensaml-soap-impl": {
+      "org.opensaml.core.config.Initializer": [
+        "org.opensaml.soap.config.impl.XMLObjectProviderInitializer"
+      ]
+    },
+    "org.opensaml:opensaml-soap-impl:jar:sources": {
+      "org.opensaml.core.config.Initializer": [
+        "org.opensaml.soap.config.impl.XMLObjectProviderInitializer"
+      ]
+    },
+    "org.opensaml:opensaml-xmlsec-api": {
+      "org.opensaml.core.config.Initializer": [
+        "org.opensaml.xmlsec.config.DecryptionParserPoolInitializer",
+        "org.opensaml.xmlsec.config.GlobalAlgorithmRegistryInitializer"
+      ],
+      "org.opensaml.xmlsec.algorithm.AlgorithmDescriptor": [
+        "org.opensaml.xmlsec.algorithm.descriptors.BlockEncryptionAES128CBC",
+        "org.opensaml.xmlsec.algorithm.descriptors.BlockEncryptionAES128GCM",
+        "org.opensaml.xmlsec.algorithm.descriptors.BlockEncryptionAES192CBC",
+        "org.opensaml.xmlsec.algorithm.descriptors.BlockEncryptionAES192GCM",
+        "org.opensaml.xmlsec.algorithm.descriptors.BlockEncryptionAES256CBC",
+        "org.opensaml.xmlsec.algorithm.descriptors.BlockEncryptionAES256GCM",
+        "org.opensaml.xmlsec.algorithm.descriptors.BlockEncryptionDESede",
+        "org.opensaml.xmlsec.algorithm.descriptors.DigestMD5",
+        "org.opensaml.xmlsec.algorithm.descriptors.DigestRIPEMD160",
+        "org.opensaml.xmlsec.algorithm.descriptors.DigestSHA1",
+        "org.opensaml.xmlsec.algorithm.descriptors.DigestSHA224",
+        "org.opensaml.xmlsec.algorithm.descriptors.DigestSHA256",
+        "org.opensaml.xmlsec.algorithm.descriptors.DigestSHA384",
+        "org.opensaml.xmlsec.algorithm.descriptors.DigestSHA512",
+        "org.opensaml.xmlsec.algorithm.descriptors.HMACMD5",
+        "org.opensaml.xmlsec.algorithm.descriptors.HMACRIPEMD160",
+        "org.opensaml.xmlsec.algorithm.descriptors.HMACSHA1",
+        "org.opensaml.xmlsec.algorithm.descriptors.HMACSHA224",
+        "org.opensaml.xmlsec.algorithm.descriptors.HMACSHA256",
+        "org.opensaml.xmlsec.algorithm.descriptors.HMACSHA384",
+        "org.opensaml.xmlsec.algorithm.descriptors.HMACSHA512",
+        "org.opensaml.xmlsec.algorithm.descriptors.KeyTransportRSA15",
+        "org.opensaml.xmlsec.algorithm.descriptors.KeyTransportRSAOAEP",
+        "org.opensaml.xmlsec.algorithm.descriptors.KeyTransportRSAOAEPMGF1P",
+        "org.opensaml.xmlsec.algorithm.descriptors.SignatureDSASHA1",
+        "org.opensaml.xmlsec.algorithm.descriptors.SignatureDSASHA256",
+        "org.opensaml.xmlsec.algorithm.descriptors.SignatureECDSASHA1",
+        "org.opensaml.xmlsec.algorithm.descriptors.SignatureECDSASHA224",
+        "org.opensaml.xmlsec.algorithm.descriptors.SignatureECDSASHA256",
+        "org.opensaml.xmlsec.algorithm.descriptors.SignatureECDSASHA384",
+        "org.opensaml.xmlsec.algorithm.descriptors.SignatureECDSASHA512",
+        "org.opensaml.xmlsec.algorithm.descriptors.SignatureRSAMD5",
+        "org.opensaml.xmlsec.algorithm.descriptors.SignatureRSARIPEMD160",
+        "org.opensaml.xmlsec.algorithm.descriptors.SignatureRSASHA1",
+        "org.opensaml.xmlsec.algorithm.descriptors.SignatureRSASHA224",
+        "org.opensaml.xmlsec.algorithm.descriptors.SignatureRSASHA256",
+        "org.opensaml.xmlsec.algorithm.descriptors.SignatureRSASHA384",
+        "org.opensaml.xmlsec.algorithm.descriptors.SignatureRSASHA512",
+        "org.opensaml.xmlsec.algorithm.descriptors.SymmetricKeyWrapAES128",
+        "org.opensaml.xmlsec.algorithm.descriptors.SymmetricKeyWrapAES192",
+        "org.opensaml.xmlsec.algorithm.descriptors.SymmetricKeyWrapAES256",
+        "org.opensaml.xmlsec.algorithm.descriptors.SymmetricKeyWrapDESede"
+      ]
+    },
+    "org.opensaml:opensaml-xmlsec-api:jar:sources": {
+      "org.opensaml.core.config.Initializer": [
+        "org.opensaml.xmlsec.config.DecryptionParserPoolInitializer",
+        "org.opensaml.xmlsec.config.GlobalAlgorithmRegistryInitializer"
+      ],
+      "org.opensaml.xmlsec.algorithm.AlgorithmDescriptor": [
+        "org.opensaml.xmlsec.algorithm.descriptors.BlockEncryptionAES128CBC",
+        "org.opensaml.xmlsec.algorithm.descriptors.BlockEncryptionAES128GCM",
+        "org.opensaml.xmlsec.algorithm.descriptors.BlockEncryptionAES192CBC",
+        "org.opensaml.xmlsec.algorithm.descriptors.BlockEncryptionAES192GCM",
+        "org.opensaml.xmlsec.algorithm.descriptors.BlockEncryptionAES256CBC",
+        "org.opensaml.xmlsec.algorithm.descriptors.BlockEncryptionAES256GCM",
+        "org.opensaml.xmlsec.algorithm.descriptors.BlockEncryptionDESede",
+        "org.opensaml.xmlsec.algorithm.descriptors.DigestMD5",
+        "org.opensaml.xmlsec.algorithm.descriptors.DigestRIPEMD160",
+        "org.opensaml.xmlsec.algorithm.descriptors.DigestSHA1",
+        "org.opensaml.xmlsec.algorithm.descriptors.DigestSHA224",
+        "org.opensaml.xmlsec.algorithm.descriptors.DigestSHA256",
+        "org.opensaml.xmlsec.algorithm.descriptors.DigestSHA384",
+        "org.opensaml.xmlsec.algorithm.descriptors.DigestSHA512",
+        "org.opensaml.xmlsec.algorithm.descriptors.HMACMD5",
+        "org.opensaml.xmlsec.algorithm.descriptors.HMACRIPEMD160",
+        "org.opensaml.xmlsec.algorithm.descriptors.HMACSHA1",
+        "org.opensaml.xmlsec.algorithm.descriptors.HMACSHA224",
+        "org.opensaml.xmlsec.algorithm.descriptors.HMACSHA256",
+        "org.opensaml.xmlsec.algorithm.descriptors.HMACSHA384",
+        "org.opensaml.xmlsec.algorithm.descriptors.HMACSHA512",
+        "org.opensaml.xmlsec.algorithm.descriptors.KeyTransportRSA15",
+        "org.opensaml.xmlsec.algorithm.descriptors.KeyTransportRSAOAEP",
+        "org.opensaml.xmlsec.algorithm.descriptors.KeyTransportRSAOAEPMGF1P",
+        "org.opensaml.xmlsec.algorithm.descriptors.SignatureDSASHA1",
+        "org.opensaml.xmlsec.algorithm.descriptors.SignatureDSASHA256",
+        "org.opensaml.xmlsec.algorithm.descriptors.SignatureECDSASHA1",
+        "org.opensaml.xmlsec.algorithm.descriptors.SignatureECDSASHA224",
+        "org.opensaml.xmlsec.algorithm.descriptors.SignatureECDSASHA256",
+        "org.opensaml.xmlsec.algorithm.descriptors.SignatureECDSASHA384",
+        "org.opensaml.xmlsec.algorithm.descriptors.SignatureECDSASHA512",
+        "org.opensaml.xmlsec.algorithm.descriptors.SignatureRSAMD5",
+        "org.opensaml.xmlsec.algorithm.descriptors.SignatureRSARIPEMD160",
+        "org.opensaml.xmlsec.algorithm.descriptors.SignatureRSASHA1",
+        "org.opensaml.xmlsec.algorithm.descriptors.SignatureRSASHA224",
+        "org.opensaml.xmlsec.algorithm.descriptors.SignatureRSASHA256",
+        "org.opensaml.xmlsec.algorithm.descriptors.SignatureRSASHA384",
+        "org.opensaml.xmlsec.algorithm.descriptors.SignatureRSASHA512",
+        "org.opensaml.xmlsec.algorithm.descriptors.SymmetricKeyWrapAES128",
+        "org.opensaml.xmlsec.algorithm.descriptors.SymmetricKeyWrapAES192",
+        "org.opensaml.xmlsec.algorithm.descriptors.SymmetricKeyWrapAES256",
+        "org.opensaml.xmlsec.algorithm.descriptors.SymmetricKeyWrapDESede"
+      ]
+    },
+    "org.opensaml:opensaml-xmlsec-impl": {
+      "org.opensaml.core.config.Initializer": [
+        "org.opensaml.xmlsec.config.impl.ApacheXMLSecurityInitializer",
+        "org.opensaml.xmlsec.config.impl.GlobalSecurityConfigurationInitializer",
+        "org.opensaml.xmlsec.config.impl.JavaCryptoValidationInitializer",
+        "org.opensaml.xmlsec.config.impl.XMLObjectProviderInitializer"
+      ],
+      "org.opensaml.xmlsec.signature.support.SignatureValidationProvider": [
+        "org.opensaml.xmlsec.signature.support.impl.provider.ApacheSantuarioSignatureValidationProviderImpl"
+      ],
+      "org.opensaml.xmlsec.signature.support.SignerProvider": [
+        "org.opensaml.xmlsec.signature.support.impl.provider.ApacheSantuarioSignerProviderImpl"
+      ]
+    },
+    "org.opensaml:opensaml-xmlsec-impl:jar:sources": {
+      "org.opensaml.core.config.Initializer": [
+        "org.opensaml.xmlsec.config.impl.ApacheXMLSecurityInitializer",
+        "org.opensaml.xmlsec.config.impl.GlobalSecurityConfigurationInitializer",
+        "org.opensaml.xmlsec.config.impl.JavaCryptoValidationInitializer",
+        "org.opensaml.xmlsec.config.impl.XMLObjectProviderInitializer"
+      ],
+      "org.opensaml.xmlsec.signature.support.SignatureValidationProvider": [
+        "org.opensaml.xmlsec.signature.support.impl.provider.ApacheSantuarioSignatureValidationProviderImpl"
+      ],
+      "org.opensaml.xmlsec.signature.support.SignerProvider": [
+        "org.opensaml.xmlsec.signature.support.impl.provider.ApacheSantuarioSignerProviderImpl"
+      ]
+    },
+    "org.pac4j:pac4j-saml": {
+      "org.pac4j.saml.util.ConfigurationManager": [
+        "org.pac4j.saml.util.DefaultConfigurationManager"
+      ]
+    },
+    "org.pac4j:pac4j-saml:jar:sources": {
+      "org.pac4j.saml.util.ConfigurationManager": [
+        "org.pac4j.saml.util.DefaultConfigurationManager"
+      ]
+    }
+  },
+  "version": "3"
+}
diff --git a/saml_third_party_runtime_jars.allowlist.txt b/saml_third_party_runtime_jars.allowlist.txt
new file mode 100644
index 0000000..ea714f0
--- /dev/null
+++ b/saml_third_party_runtime_jars.allowlist.txt
@@ -0,0 +1,28 @@
+commons-collections
+commons-lang
+cryptacular
+java-support
+joda-time
+opensaml-core
+opensaml-messaging-api
+opensaml-messaging-impl
+opensaml-profile-api
+opensaml-profile-impl
+opensaml-saml-api
+opensaml-saml-impl
+opensaml-security-api
+opensaml-security-impl
+opensaml-soap-api
+opensaml-soap-impl
+opensaml-storage-api
+opensaml-storage-impl
+opensaml-xmlsec-api
+opensaml-xmlsec-impl
+pac4j-core
+pac4j-saml
+spring-core
+stax2-api
+velocity
+woodstox-core
+xmlsec
+xmlsectool