tools

various tools I have been using throughout the years
Log | Files | Refs | README | LICENSE

commit ace4beff2303cc52988c0902bea63aef874adfcf
parent 0382c9d35940ccc167bcefa668bbaf0e390c98bb
Author: mtmn <miro@haravara.org>
Date:   Sun, 14 Jun 2026 18:33:36 +0200

dam: generate man page from clap's help

Diffstat:
MCargo.lock | 17+++++++++++++++++
MMODULE.bazel.lock | 38++++++++++++++++++++++++++++++++------
Mbazel/rust.bzl | 23++++++++++++++++++++---
Mdam/BUILD | 38++++++++++++++++++++++++++++++++++++--
Mdam/Cargo.toml | 5+++++
Mdam/Makefile | 4++++
Mdam/dam.1 | 290++++++++++++++++++-------------------------------------------------------------
Adam/examples/mangen.rs | 29+++++++++++++++++++++++++++++
Adam/src/lib.rs | 680+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mdam/src/main.rs | 673+------------------------------------------------------------------------------
10 files changed, 892 insertions(+), 905 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock @@ -185,6 +185,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" [[package]] +name = "clap_mangen" +version = "0.2.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e30ffc187e2e3aeafcd1c6e2aa416e29739454c0ccaa419226d5ecd181f2d78" +dependencies = [ + "clap", + "roff", +] + +[[package]] name = "cmake" version = "0.1.58" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -274,6 +284,7 @@ version = "0.1.0" dependencies = [ "anyhow", "clap", + "clap_mangen", "console", "natord", "similar", @@ -1111,6 +1122,12 @@ dependencies = [ ] [[package]] +name = "roff" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "323c417e1d9665a65b263ec744ba09030cfb277e9daa0b018a4ab62e57bc8189" + +[[package]] name = "rustc-hash" version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock @@ -371,8 +371,8 @@ "REPO_MAPPING:rules_rust+,bazel_tools bazel_tools", "REPO_MAPPING:rules_rust+,rules_cc rules_cc+", "REPO_MAPPING:rules_rust+,rules_rust rules_rust+", - "FILE:@@//Cargo.lock 72f389ed9c20d2b1ec38d7852f368325e4e1c5ba298d69ef60741112e148b49d", - "FILE:@@//dam/Cargo.toml c1504e8cde4c0342272661a96967718a9b5ac2ced754c9669aa4fec65441328d", + "FILE:@@//Cargo.lock 3ab7c5df1a00f53098fbab5a602eec2a6bfbb00ccff52ffc963dd65c676772df", + "FILE:@@//dam/Cargo.toml 1b28b0907ad5eb79b2484f38237bd86ad78a01f2962a5d47b165f4a24311950d", "FILE:@@//lastfm_rs/Cargo.toml 8e80765395fd5e43a4ecf0223a01322c8956ceb1313e6472423dd25a5d92c87e" ], "generatedRepoSpecs": { @@ -380,9 +380,9 @@ "repoRuleId": "@@rules_rust+//crate_universe:extensions.bzl%_generate_repo", "attributes": { "contents": { - "BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'tools'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files(\n [\n \"cargo-bazel.json\",\n \"crates.bzl\",\n \"defs.bzl\",\n ] + glob(\n allow_empty = True,\n include = [\"*.bazel\"],\n ),\n)\n\nfilegroup(\n name = \"srcs\",\n srcs = glob(\n allow_empty = True,\n include = [\n \"*.bazel\",\n \"*.bzl\",\n ],\n ),\n)\n\n# Workspace Member Dependencies\nalias(\n name = \"anyhow-1.0.102\",\n actual = \"@crates__anyhow-1.0.102//:anyhow\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"anyhow\",\n actual = \"@crates__anyhow-1.0.102//:anyhow\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"clap-4.6.1\",\n actual = \"@crates__clap-4.6.1//:clap\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"clap\",\n actual = \"@crates__clap-4.6.1//:clap\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"console-0.16.3\",\n actual = \"@crates__console-0.16.3//:console\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"console\",\n actual = \"@crates__console-0.16.3//:console\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"csv-1.4.0\",\n actual = \"@crates__csv-1.4.0//:csv\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"csv\",\n actual = \"@crates__csv-1.4.0//:csv\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"natord-1.0.9\",\n actual = \"@crates__natord-1.0.9//:natord\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"natord\",\n actual = \"@crates__natord-1.0.9//:natord\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"reqwest-0.13.4\",\n actual = \"@crates__reqwest-0.13.4//:reqwest\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"reqwest\",\n actual = \"@crates__reqwest-0.13.4//:reqwest\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"serde-1.0.228\",\n actual = \"@crates__serde-1.0.228//:serde\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"serde\",\n actual = \"@crates__serde-1.0.228//:serde\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"serde_json-1.0.150\",\n actual = \"@crates__serde_json-1.0.150//:serde_json\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"serde_json\",\n actual = \"@crates__serde_json-1.0.150//:serde_json\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"similar-3.1.1\",\n actual = \"@crates__similar-3.1.1//:similar\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"similar\",\n actual = \"@crates__similar-3.1.1//:similar\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tempfile-3.27.0\",\n actual = \"@crates__tempfile-3.27.0//:tempfile\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tempfile\",\n actual = \"@crates__tempfile-3.27.0//:tempfile\",\n tags = [\"manual\"],\n)\n", + "BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'tools'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files(\n [\n \"cargo-bazel.json\",\n \"crates.bzl\",\n \"defs.bzl\",\n ] + glob(\n allow_empty = True,\n include = [\"*.bazel\"],\n ),\n)\n\nfilegroup(\n name = \"srcs\",\n srcs = glob(\n allow_empty = True,\n include = [\n \"*.bazel\",\n \"*.bzl\",\n ],\n ),\n)\n\n# Workspace Member Dependencies\nalias(\n name = \"anyhow-1.0.102\",\n actual = \"@crates__anyhow-1.0.102//:anyhow\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"anyhow\",\n actual = \"@crates__anyhow-1.0.102//:anyhow\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"clap-4.6.1\",\n actual = \"@crates__clap-4.6.1//:clap\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"clap\",\n actual = \"@crates__clap-4.6.1//:clap\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"clap_mangen-0.2.33\",\n actual = \"@crates__clap_mangen-0.2.33//:clap_mangen\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"clap_mangen\",\n actual = \"@crates__clap_mangen-0.2.33//:clap_mangen\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"console-0.16.3\",\n actual = \"@crates__console-0.16.3//:console\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"console\",\n actual = \"@crates__console-0.16.3//:console\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"csv-1.4.0\",\n actual = \"@crates__csv-1.4.0//:csv\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"csv\",\n actual = \"@crates__csv-1.4.0//:csv\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"natord-1.0.9\",\n actual = \"@crates__natord-1.0.9//:natord\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"natord\",\n actual = \"@crates__natord-1.0.9//:natord\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"reqwest-0.13.4\",\n actual = \"@crates__reqwest-0.13.4//:reqwest\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"reqwest\",\n actual = \"@crates__reqwest-0.13.4//:reqwest\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"serde-1.0.228\",\n actual = \"@crates__serde-1.0.228//:serde\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"serde\",\n actual = \"@crates__serde-1.0.228//:serde\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"serde_json-1.0.150\",\n actual = \"@crates__serde_json-1.0.150//:serde_json\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"serde_json\",\n actual = \"@crates__serde_json-1.0.150//:serde_json\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"similar-3.1.1\",\n actual = \"@crates__similar-3.1.1//:similar\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"similar\",\n actual = \"@crates__similar-3.1.1//:similar\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tempfile-3.27.0\",\n actual = \"@crates__tempfile-3.27.0//:tempfile\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tempfile\",\n actual = \"@crates__tempfile-3.27.0//:tempfile\",\n tags = [\"manual\"],\n)\n", "alias_rules.bzl": "\"\"\"Alias that transitions its target to `compilation_mode=opt`. Use `transition_alias=\"opt\"` to enable.\"\"\"\n\nload(\"@rules_cc//cc:defs.bzl\", \"CcInfo\")\nload(\"@rules_rust//rust:rust_common.bzl\", \"COMMON_PROVIDERS\")\n\ndef _transition_alias_impl(ctx):\n # `ctx.attr.actual` is a list of 1 item due to the transition\n providers = [ctx.attr.actual[0][provider] for provider in COMMON_PROVIDERS]\n if CcInfo in ctx.attr.actual[0]:\n providers.append(ctx.attr.actual[0][CcInfo])\n return providers\n\ndef _change_compilation_mode(compilation_mode):\n def _change_compilation_mode_impl(_settings, _attr):\n return {\n \"//command_line_option:compilation_mode\": compilation_mode,\n }\n\n return transition(\n implementation = _change_compilation_mode_impl,\n inputs = [],\n outputs = [\n \"//command_line_option:compilation_mode\",\n ],\n )\n\ndef _transition_alias_rule(compilation_mode):\n return rule(\n implementation = _transition_alias_impl,\n provides = COMMON_PROVIDERS,\n attrs = {\n \"actual\": attr.label(\n mandatory = True,\n doc = \"`rust_library()` target to transition to `compilation_mode=opt`.\",\n providers = COMMON_PROVIDERS,\n cfg = _change_compilation_mode(compilation_mode),\n ),\n \"_allowlist_function_transition\": attr.label(\n default = \"@bazel_tools//tools/allowlists/function_transition_allowlist\",\n ),\n },\n doc = \"Transitions a Rust library crate to the `compilation_mode=opt`.\",\n )\n\ntransition_alias_dbg = _transition_alias_rule(\"dbg\")\ntransition_alias_fastbuild = _transition_alias_rule(\"fastbuild\")\ntransition_alias_opt = _transition_alias_rule(\"opt\")\n", - "defs.bzl": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'tools'\n###############################################################################\n\"\"\"\n# `crates_repository` API\n\n- [aliases](#aliases)\n- [crate_deps](#crate_deps)\n- [all_crate_deps](#all_crate_deps)\n- [crate_repositories](#crate_repositories)\n\n\"\"\"\n\nload(\"@bazel_tools//tools/build_defs/repo:git.bzl\", \"git_repository\")\nload(\"@bazel_tools//tools/build_defs/repo:http.bzl\", \"http_archive\")\nload(\"@bazel_tools//tools/build_defs/repo:utils.bzl\", \"maybe\")\nload(\"@bazel_skylib//lib:selects.bzl\", \"selects\")\nload(\"@rules_rust//crate_universe/private:local_crate_mirror.bzl\", \"local_crate_mirror\")\n\n###############################################################################\n# MACROS API\n###############################################################################\n\n# An identifier that represent common dependencies (unconditional).\n_COMMON_CONDITION = \"\"\n\ndef _flatten_dependency_maps(all_dependency_maps):\n \"\"\"Flatten a list of dependency maps into one dictionary.\n\n Dependency maps have the following structure:\n\n ```python\n DEPENDENCIES_MAP = {\n # The first key in the map is a Bazel package\n # name of the workspace this file is defined in.\n \"workspace_member_package\": {\n\n # Not all dependencies are supported for all platforms.\n # the condition key is the condition required to be true\n # on the host platform.\n \"condition\": {\n\n # An alias to a crate target. # The label of the crate target the\n # Aliases are only crate names. # package name refers to.\n \"package_name\": \"@full//:label\",\n }\n }\n }\n ```\n\n Args:\n all_dependency_maps (list): A list of dicts as described above\n\n Returns:\n dict: A dictionary as described above\n \"\"\"\n dependencies = {}\n\n for workspace_deps_map in all_dependency_maps:\n for pkg_name, conditional_deps_map in workspace_deps_map.items():\n if pkg_name not in dependencies:\n non_frozen_map = dict()\n for key, values in conditional_deps_map.items():\n non_frozen_map.update({key: dict(values.items())})\n dependencies.setdefault(pkg_name, non_frozen_map)\n continue\n\n for condition, deps_map in conditional_deps_map.items():\n # If the condition has not been recorded, do so and continue\n if condition not in dependencies[pkg_name]:\n dependencies[pkg_name].setdefault(condition, dict(deps_map.items()))\n continue\n\n # Alert on any miss-matched dependencies\n inconsistent_entries = []\n for crate_name, crate_label in deps_map.items():\n existing = dependencies[pkg_name][condition].get(crate_name)\n if existing and existing != crate_label:\n inconsistent_entries.append((crate_name, existing, crate_label))\n dependencies[pkg_name][condition].update({crate_name: crate_label})\n\n return dependencies\n\ndef crate_deps(deps, package_name = None):\n \"\"\"Finds the fully qualified label of the requested crates for the package where this macro is called.\n\n Args:\n deps (list): The desired list of crate targets.\n package_name (str, optional): The package name of the set of dependencies to look up.\n Defaults to `native.package_name()`.\n\n Returns:\n list: A list of labels to generated rust targets (str)\n \"\"\"\n\n if not deps:\n return []\n\n if package_name == None:\n package_name = native.package_name()\n\n # Join both sets of dependencies\n dependencies = _flatten_dependency_maps([\n _NORMAL_DEPENDENCIES,\n _NORMAL_DEV_DEPENDENCIES,\n _PROC_MACRO_DEPENDENCIES,\n _PROC_MACRO_DEV_DEPENDENCIES,\n _BUILD_DEPENDENCIES,\n _BUILD_PROC_MACRO_DEPENDENCIES,\n ]).pop(package_name, {})\n\n # Combine all conditional packages so we can easily index over a flat list\n # TODO: Perhaps this should actually return select statements and maintain\n # the conditionals of the dependencies\n flat_deps = {}\n for deps_set in dependencies.values():\n for crate_name, crate_label in deps_set.items():\n flat_deps.update({crate_name: crate_label})\n\n missing_crates = []\n crate_targets = []\n for crate_target in deps:\n if crate_target not in flat_deps:\n missing_crates.append(crate_target)\n else:\n crate_targets.append(flat_deps[crate_target])\n\n if missing_crates:\n fail(\"Could not find crates `{}` among dependencies of `{}`. Available dependencies were `{}`\".format(\n missing_crates,\n package_name,\n dependencies,\n ))\n\n return crate_targets\n\ndef all_crate_deps(\n normal = False, \n normal_dev = False, \n proc_macro = False, \n proc_macro_dev = False,\n build = False,\n build_proc_macro = False,\n package_name = None):\n \"\"\"Finds the fully qualified label of all requested direct crate dependencies \\\n for the package where this macro is called.\n\n If no parameters are set, all normal dependencies are returned. Setting any one flag will\n otherwise impact the contents of the returned list.\n\n Args:\n normal (bool, optional): If True, normal dependencies are included in the\n output list.\n normal_dev (bool, optional): If True, normal dev dependencies will be\n included in the output list.\n proc_macro (bool, optional): If True, proc_macro dependencies are included\n in the output list.\n proc_macro_dev (bool, optional): If True, dev proc_macro dependencies are\n included in the output list.\n build (bool, optional): If True, build dependencies are included\n in the output list.\n build_proc_macro (bool, optional): If True, build proc_macro dependencies are\n included in the output list.\n package_name (str, optional): The package name of the set of dependencies to look up.\n Defaults to `native.package_name()` when unset.\n\n Returns:\n list: A list of labels to generated rust targets (str)\n \"\"\"\n\n if package_name == None:\n package_name = native.package_name()\n\n # Determine the relevant maps to use\n all_dependency_maps = []\n if normal:\n all_dependency_maps.append(_NORMAL_DEPENDENCIES)\n if normal_dev:\n all_dependency_maps.append(_NORMAL_DEV_DEPENDENCIES)\n if proc_macro:\n all_dependency_maps.append(_PROC_MACRO_DEPENDENCIES)\n if proc_macro_dev:\n all_dependency_maps.append(_PROC_MACRO_DEV_DEPENDENCIES)\n if build:\n all_dependency_maps.append(_BUILD_DEPENDENCIES)\n if build_proc_macro:\n all_dependency_maps.append(_BUILD_PROC_MACRO_DEPENDENCIES)\n\n # Default to always using normal dependencies\n if not all_dependency_maps:\n all_dependency_maps.append(_NORMAL_DEPENDENCIES)\n\n dependencies = _flatten_dependency_maps(all_dependency_maps).pop(package_name, None)\n\n if not dependencies:\n if dependencies == None:\n fail(\"Tried to get all_crate_deps for package \" + package_name + \" but that package had no Cargo.toml file\")\n else:\n return []\n\n crate_deps = list(dependencies.pop(_COMMON_CONDITION, {}).values())\n for condition, deps in dependencies.items():\n crate_deps += selects.with_or({\n tuple(_CONDITIONS[condition]): deps.values(),\n \"//conditions:default\": [],\n })\n\n return crate_deps\n\ndef aliases(\n normal = False,\n normal_dev = False,\n proc_macro = False,\n proc_macro_dev = False,\n build = False,\n build_proc_macro = False,\n package_name = None):\n \"\"\"Produces a map of Crate alias names to their original label\n\n If no dependency kinds are specified, `normal` and `proc_macro` are used by default.\n Setting any one flag will otherwise determine the contents of the returned dict.\n\n Args:\n normal (bool, optional): If True, normal dependencies are included in the\n output list.\n normal_dev (bool, optional): If True, normal dev dependencies will be\n included in the output list..\n proc_macro (bool, optional): If True, proc_macro dependencies are included\n in the output list.\n proc_macro_dev (bool, optional): If True, dev proc_macro dependencies are\n included in the output list.\n build (bool, optional): If True, build dependencies are included\n in the output list.\n build_proc_macro (bool, optional): If True, build proc_macro dependencies are\n included in the output list.\n package_name (str, optional): The package name of the set of dependencies to look up.\n Defaults to `native.package_name()` when unset.\n\n Returns:\n dict: The aliases of all associated packages\n \"\"\"\n if package_name == None:\n package_name = native.package_name()\n\n # Determine the relevant maps to use\n all_aliases_maps = []\n if normal:\n all_aliases_maps.append(_NORMAL_ALIASES)\n if normal_dev:\n all_aliases_maps.append(_NORMAL_DEV_ALIASES)\n if proc_macro:\n all_aliases_maps.append(_PROC_MACRO_ALIASES)\n if proc_macro_dev:\n all_aliases_maps.append(_PROC_MACRO_DEV_ALIASES)\n if build:\n all_aliases_maps.append(_BUILD_ALIASES)\n if build_proc_macro:\n all_aliases_maps.append(_BUILD_PROC_MACRO_ALIASES)\n\n # Default to always using normal aliases\n if not all_aliases_maps:\n all_aliases_maps.append(_NORMAL_ALIASES)\n all_aliases_maps.append(_PROC_MACRO_ALIASES)\n\n aliases = _flatten_dependency_maps(all_aliases_maps).pop(package_name, None)\n\n if not aliases:\n return dict()\n\n common_items = aliases.pop(_COMMON_CONDITION, {}).items()\n\n # If there are only common items in the dictionary, immediately return them\n if not len(aliases.keys()) == 1:\n return dict(common_items)\n\n # Build a single select statement where each conditional has accounted for the\n # common set of aliases.\n crate_aliases = {\"//conditions:default\": dict(common_items)}\n for condition, deps in aliases.items():\n condition_triples = _CONDITIONS[condition]\n for triple in condition_triples:\n if triple in crate_aliases:\n crate_aliases[triple].update(deps)\n else:\n crate_aliases.update({triple: dict(deps.items() + common_items)})\n\n return select(crate_aliases)\n\n###############################################################################\n# WORKSPACE MEMBER DEPS AND ALIASES\n###############################################################################\n\n_NORMAL_DEPENDENCIES = {\n \"dam\": {\n _COMMON_CONDITION: {\n \"anyhow\": Label(\"@crates//:anyhow-1.0.102\"),\n \"clap\": Label(\"@crates//:clap-4.6.1\"),\n \"console\": Label(\"@crates//:console-0.16.3\"),\n \"natord\": Label(\"@crates//:natord-1.0.9\"),\n \"similar\": Label(\"@crates//:similar-3.1.1\"),\n \"tempfile\": Label(\"@crates//:tempfile-3.27.0\"),\n },\n },\n \"lastfm_rs\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"@crates//:clap-4.6.1\"),\n \"csv\": Label(\"@crates//:csv-1.4.0\"),\n \"reqwest\": Label(\"@crates//:reqwest-0.13.4\"),\n \"serde\": Label(\"@crates//:serde-1.0.228\"),\n \"serde_json\": Label(\"@crates//:serde_json-1.0.150\"),\n },\n },\n}\n\n\n_NORMAL_ALIASES = {\n \"dam\": {\n _COMMON_CONDITION: {\n },\n },\n \"lastfm_rs\": {\n _COMMON_CONDITION: {\n },\n },\n}\n\n\n_NORMAL_DEV_DEPENDENCIES = {\n \"dam\": {\n },\n \"lastfm_rs\": {\n },\n}\n\n\n_NORMAL_DEV_ALIASES = {\n \"dam\": {\n },\n \"lastfm_rs\": {\n },\n}\n\n\n_PROC_MACRO_DEPENDENCIES = {\n \"dam\": {\n },\n \"lastfm_rs\": {\n },\n}\n\n\n_PROC_MACRO_ALIASES = {\n \"dam\": {\n },\n \"lastfm_rs\": {\n },\n}\n\n\n_PROC_MACRO_DEV_DEPENDENCIES = {\n \"dam\": {\n },\n \"lastfm_rs\": {\n },\n}\n\n\n_PROC_MACRO_DEV_ALIASES = {\n \"dam\": {\n },\n \"lastfm_rs\": {\n },\n}\n\n\n_BUILD_DEPENDENCIES = {\n \"dam\": {\n },\n \"lastfm_rs\": {\n },\n}\n\n\n_BUILD_ALIASES = {\n \"dam\": {\n },\n \"lastfm_rs\": {\n },\n}\n\n\n_BUILD_PROC_MACRO_DEPENDENCIES = {\n \"dam\": {\n },\n \"lastfm_rs\": {\n },\n}\n\n\n_BUILD_PROC_MACRO_ALIASES = {\n \"dam\": {\n },\n \"lastfm_rs\": {\n },\n}\n\n\n_CONDITIONS = {\n \"aarch64-apple-darwin\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\"],\n \"aarch64-pc-windows-gnullvm\": [],\n \"aarch64-unknown-linux-gnu\": [\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\"],\n \"cfg(all(all(target_arch = \\\"aarch64\\\", target_endian = \\\"little\\\"), target_os = \\\"windows\\\"))\": [],\n \"cfg(all(all(target_arch = \\\"aarch64\\\", target_endian = \\\"little\\\"), target_vendor = \\\"apple\\\", any(target_os = \\\"ios\\\", target_os = \\\"macos\\\", target_os = \\\"tvos\\\", target_os = \\\"visionos\\\", target_os = \\\"watchos\\\")))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\"],\n \"cfg(all(any(all(target_arch = \\\"aarch64\\\", target_endian = \\\"little\\\"), all(target_arch = \\\"arm\\\", target_endian = \\\"little\\\")), any(target_os = \\\"android\\\", target_os = \\\"linux\\\")))\": [\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\"],\n \"cfg(all(any(target_arch = \\\"x86_64\\\", target_arch = \\\"arm64ec\\\"), target_env = \\\"msvc\\\", not(windows_raw_dylib)))\": [\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\"],\n \"cfg(all(any(target_os = \\\"linux\\\", target_os = \\\"android\\\"), any(rustix_use_libc, miri, not(all(target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", any(target_arch = \\\"s390x\\\", target_arch = \\\"powerpc\\\")), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc\\\"), all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\")))))))\": [],\n \"cfg(all(any(target_os = \\\"linux\\\", target_os = \\\"android\\\"), not(any(all(target_os = \\\"linux\\\", target_env = \\\"\\\"), getrandom_backend = \\\"custom\\\", getrandom_backend = \\\"linux_raw\\\", getrandom_backend = \\\"rdrand\\\", getrandom_backend = \\\"rndr\\\"))))\": [\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(all(not(rustix_use_libc), not(miri), target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", any(target_arch = \\\"s390x\\\", target_arch = \\\"powerpc\\\")), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc\\\"), all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\"))))\": [\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(all(not(windows), any(rustix_use_libc, miri, not(all(target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", any(target_arch = \\\"s390x\\\", target_arch = \\\"powerpc\\\")), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc\\\"), all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\")))))))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:wasm32-unknown-unknown\",\"@rules_rust//rust/platform:wasm32-wasip1\"],\n \"cfg(all(target_arch = \\\"aarch64\\\", target_env = \\\"msvc\\\", not(windows_raw_dylib)))\": [],\n \"cfg(all(target_arch = \\\"wasm32\\\", any(target_os = \\\"unknown\\\", target_os = \\\"none\\\")))\": [\"@rules_rust//rust/platform:wasm32-unknown-unknown\"],\n \"cfg(all(target_arch = \\\"wasm32\\\", target_os = \\\"wasi\\\", target_env = \\\"p2\\\"))\": [],\n \"cfg(all(target_arch = \\\"wasm32\\\", target_os = \\\"wasi\\\", target_env = \\\"p3\\\"))\": [],\n \"cfg(all(target_arch = \\\"x86\\\", target_env = \\\"gnu\\\", not(target_abi = \\\"llvm\\\"), not(windows_raw_dylib)))\": [],\n \"cfg(all(target_arch = \\\"x86\\\", target_env = \\\"msvc\\\", not(windows_raw_dylib)))\": [],\n \"cfg(all(target_arch = \\\"x86_64\\\", target_env = \\\"gnu\\\", not(target_abi = \\\"llvm\\\"), not(windows_raw_dylib)))\": [\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(all(target_family = \\\"wasm\\\", target_os = \\\"unknown\\\"))\": [\"@rules_rust//rust/platform:wasm32-unknown-unknown\"],\n \"cfg(all(target_os = \\\"uefi\\\", getrandom_backend = \\\"efi_rng\\\"))\": [],\n \"cfg(all(unix, not(target_os = \\\"android\\\"), not(target_vendor = \\\"apple\\\"), not(target_arch = \\\"wasm32\\\")))\": [\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(all(unix, not(target_os = \\\"macos\\\")))\": [\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(any())\": [],\n \"cfg(any(target_os = \\\"dragonfly\\\", target_os = \\\"freebsd\\\", target_os = \\\"hurd\\\", target_os = \\\"illumos\\\", target_os = \\\"cygwin\\\", all(target_os = \\\"horizon\\\", target_arch = \\\"arm\\\")))\": [],\n \"cfg(any(target_os = \\\"haiku\\\", target_os = \\\"redox\\\", target_os = \\\"nto\\\", target_os = \\\"aix\\\"))\": [],\n \"cfg(any(target_os = \\\"ios\\\", target_os = \\\"visionos\\\", target_os = \\\"watchos\\\", target_os = \\\"tvos\\\"))\": [],\n \"cfg(any(target_os = \\\"macos\\\", target_os = \\\"openbsd\\\", target_os = \\\"vita\\\", target_os = \\\"emscripten\\\"))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\"],\n \"cfg(any(target_vendor = \\\"apple\\\"))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\"],\n \"cfg(any(unix, target_os = \\\"hermit\\\", target_os = \\\"wasi\\\"))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:wasm32-wasip1\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(any(unix, target_os = \\\"wasi\\\"))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:wasm32-wasip1\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(not(all(target_arch = \\\"wasm32\\\", any(target_os = \\\"unknown\\\", target_os = \\\"none\\\"))))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:wasm32-wasip1\",\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(not(all(target_family = \\\"wasm\\\", target_os = \\\"unknown\\\")))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:wasm32-wasip1\",\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(target_arch = \\\"wasm32\\\")\": [\"@rules_rust//rust/platform:wasm32-unknown-unknown\",\"@rules_rust//rust/platform:wasm32-wasip1\"],\n \"cfg(target_os = \\\"android\\\")\": [],\n \"cfg(target_os = \\\"hermit\\\")\": [],\n \"cfg(target_os = \\\"macos\\\")\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\"],\n \"cfg(target_os = \\\"netbsd\\\")\": [],\n \"cfg(target_os = \\\"solaris\\\")\": [],\n \"cfg(target_os = \\\"vxworks\\\")\": [],\n \"cfg(target_os = \\\"wasi\\\")\": [\"@rules_rust//rust/platform:wasm32-wasip1\"],\n \"cfg(unix)\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(windows)\": [\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\"],\n \"cfg(windows_raw_dylib)\": [],\n \"i686-pc-windows-gnullvm\": [],\n \"wasm32-unknown-unknown\": [\"@rules_rust//rust/platform:wasm32-unknown-unknown\"],\n \"wasm32-wasip1\": [\"@rules_rust//rust/platform:wasm32-wasip1\"],\n \"x86_64-pc-windows-gnullvm\": [],\n \"x86_64-pc-windows-msvc\": [\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\"],\n \"x86_64-unknown-linux-gnu\": [\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"x86_64-unknown-nixos-gnu\": [\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n}\n\n###############################################################################\n\ndef crate_repositories():\n \"\"\"A macro for defining repositories for all generated crates.\n\n Returns:\n A list of repos visible to the module through the module extension.\n \"\"\"\n maybe(\n http_archive,\n name = \"crates__anstream-1.0.0\",\n sha256 = \"824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstream/1.0.0/download\"],\n strip_prefix = \"anstream-1.0.0\",\n build_file = Label(\"@crates//crates:BUILD.anstream-1.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstyle-1.0.14\",\n sha256 = \"940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle/1.0.14/download\"],\n strip_prefix = \"anstyle-1.0.14\",\n build_file = Label(\"@crates//crates:BUILD.anstyle-1.0.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstyle-parse-1.0.0\",\n sha256 = \"52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle-parse/1.0.0/download\"],\n strip_prefix = \"anstyle-parse-1.0.0\",\n build_file = Label(\"@crates//crates:BUILD.anstyle-parse-1.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstyle-query-1.1.5\",\n sha256 = \"40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle-query/1.1.5/download\"],\n strip_prefix = \"anstyle-query-1.1.5\",\n build_file = Label(\"@crates//crates:BUILD.anstyle-query-1.1.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstyle-wincon-3.0.11\",\n sha256 = \"291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle-wincon/3.0.11/download\"],\n strip_prefix = \"anstyle-wincon-3.0.11\",\n build_file = Label(\"@crates//crates:BUILD.anstyle-wincon-3.0.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anyhow-1.0.102\",\n sha256 = \"7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anyhow/1.0.102/download\"],\n strip_prefix = \"anyhow-1.0.102\",\n build_file = Label(\"@crates//crates:BUILD.anyhow-1.0.102.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__atomic-waker-1.1.2\",\n sha256 = \"1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/atomic-waker/1.1.2/download\"],\n strip_prefix = \"atomic-waker-1.1.2\",\n build_file = Label(\"@crates//crates:BUILD.atomic-waker-1.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__aws-lc-rs-1.17.0\",\n sha256 = \"5ec2f1fc3ec205783a5da9a7e6c1509cc69dedf09a1949e412c1e18469326d00\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/aws-lc-rs/1.17.0/download\"],\n strip_prefix = \"aws-lc-rs-1.17.0\",\n build_file = Label(\"@crates//crates:BUILD.aws-lc-rs-1.17.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__aws-lc-sys-0.41.0\",\n sha256 = \"1a2f9779ce85b93ab6170dd940ad0169b5766ff848247aff13bb788b832fe3f4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/aws-lc-sys/0.41.0/download\"],\n strip_prefix = \"aws-lc-sys-0.41.0\",\n build_file = Label(\"@crates//crates:BUILD.aws-lc-sys-0.41.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__base64-0.22.1\",\n sha256 = \"72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/base64/0.22.1/download\"],\n strip_prefix = \"base64-0.22.1\",\n build_file = Label(\"@crates//crates:BUILD.base64-0.22.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bitflags-2.13.0\",\n sha256 = \"b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bitflags/2.13.0/download\"],\n strip_prefix = \"bitflags-2.13.0\",\n build_file = Label(\"@crates//crates:BUILD.bitflags-2.13.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bstr-1.12.1\",\n sha256 = \"63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bstr/1.12.1/download\"],\n strip_prefix = \"bstr-1.12.1\",\n build_file = Label(\"@crates//crates:BUILD.bstr-1.12.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bumpalo-3.20.3\",\n sha256 = \"72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bumpalo/3.20.3/download\"],\n strip_prefix = \"bumpalo-3.20.3\",\n build_file = Label(\"@crates//crates:BUILD.bumpalo-3.20.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bytes-1.11.1\",\n sha256 = \"1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bytes/1.11.1/download\"],\n strip_prefix = \"bytes-1.11.1\",\n build_file = Label(\"@crates//crates:BUILD.bytes-1.11.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cc-1.2.64\",\n sha256 = \"dad887fd958be91b5098c0248def011f4523ab786cd411be668777e55063501f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cc/1.2.64/download\"],\n strip_prefix = \"cc-1.2.64\",\n build_file = Label(\"@crates//crates:BUILD.cc-1.2.64.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cfg-if-1.0.4\",\n sha256 = \"9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cfg-if/1.0.4/download\"],\n strip_prefix = \"cfg-if-1.0.4\",\n build_file = Label(\"@crates//crates:BUILD.cfg-if-1.0.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cfg_aliases-0.2.1\",\n sha256 = \"613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cfg_aliases/0.2.1/download\"],\n strip_prefix = \"cfg_aliases-0.2.1\",\n build_file = Label(\"@crates//crates:BUILD.cfg_aliases-0.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clap-4.6.1\",\n sha256 = \"1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap/4.6.1/download\"],\n strip_prefix = \"clap-4.6.1\",\n build_file = Label(\"@crates//crates:BUILD.clap-4.6.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clap_builder-4.6.0\",\n sha256 = \"714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap_builder/4.6.0/download\"],\n strip_prefix = \"clap_builder-4.6.0\",\n build_file = Label(\"@crates//crates:BUILD.clap_builder-4.6.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clap_derive-4.6.1\",\n sha256 = \"f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap_derive/4.6.1/download\"],\n strip_prefix = \"clap_derive-4.6.1\",\n build_file = Label(\"@crates//crates:BUILD.clap_derive-4.6.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clap_lex-1.1.0\",\n sha256 = \"c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap_lex/1.1.0/download\"],\n strip_prefix = \"clap_lex-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.clap_lex-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cmake-0.1.58\",\n sha256 = \"c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cmake/0.1.58/download\"],\n strip_prefix = \"cmake-0.1.58\",\n build_file = Label(\"@crates//crates:BUILD.cmake-0.1.58.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__colorchoice-1.0.5\",\n sha256 = \"1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/colorchoice/1.0.5/download\"],\n strip_prefix = \"colorchoice-1.0.5\",\n build_file = Label(\"@crates//crates:BUILD.colorchoice-1.0.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__combine-4.6.7\",\n sha256 = \"ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/combine/4.6.7/download\"],\n strip_prefix = \"combine-4.6.7\",\n build_file = Label(\"@crates//crates:BUILD.combine-4.6.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__console-0.16.3\",\n sha256 = \"d64e8af5551369d19cf50138de61f1c42074ab970f74e99be916646777f8fc87\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/console/0.16.3/download\"],\n strip_prefix = \"console-0.16.3\",\n build_file = Label(\"@crates//crates:BUILD.console-0.16.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__core-foundation-0.10.1\",\n sha256 = \"b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/core-foundation/0.10.1/download\"],\n strip_prefix = \"core-foundation-0.10.1\",\n build_file = Label(\"@crates//crates:BUILD.core-foundation-0.10.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__core-foundation-0.9.4\",\n sha256 = \"91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/core-foundation/0.9.4/download\"],\n strip_prefix = \"core-foundation-0.9.4\",\n build_file = Label(\"@crates//crates:BUILD.core-foundation-0.9.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__core-foundation-sys-0.8.7\",\n sha256 = \"773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/core-foundation-sys/0.8.7/download\"],\n strip_prefix = \"core-foundation-sys-0.8.7\",\n build_file = Label(\"@crates//crates:BUILD.core-foundation-sys-0.8.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__csv-1.4.0\",\n sha256 = \"52cd9d68cf7efc6ddfaaee42e7288d3a99d613d4b50f76ce9827ae0c6e14f938\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/csv/1.4.0/download\"],\n strip_prefix = \"csv-1.4.0\",\n build_file = Label(\"@crates//crates:BUILD.csv-1.4.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__csv-core-0.1.13\",\n sha256 = \"704a3c26996a80471189265814dbc2c257598b96b8a7feae2d31ace646bb9782\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/csv-core/0.1.13/download\"],\n strip_prefix = \"csv-core-0.1.13\",\n build_file = Label(\"@crates//crates:BUILD.csv-core-0.1.13.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__displaydoc-0.2.6\",\n sha256 = \"1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/displaydoc/0.2.6/download\"],\n strip_prefix = \"displaydoc-0.2.6\",\n build_file = Label(\"@crates//crates:BUILD.displaydoc-0.2.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__dunce-1.0.5\",\n sha256 = \"92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/dunce/1.0.5/download\"],\n strip_prefix = \"dunce-1.0.5\",\n build_file = Label(\"@crates//crates:BUILD.dunce-1.0.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__encode_unicode-1.0.0\",\n sha256 = \"34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/encode_unicode/1.0.0/download\"],\n strip_prefix = \"encode_unicode-1.0.0\",\n build_file = Label(\"@crates//crates:BUILD.encode_unicode-1.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__encoding_rs-0.8.35\",\n sha256 = \"75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/encoding_rs/0.8.35/download\"],\n strip_prefix = \"encoding_rs-0.8.35\",\n build_file = Label(\"@crates//crates:BUILD.encoding_rs-0.8.35.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__equivalent-1.0.2\",\n sha256 = \"877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/equivalent/1.0.2/download\"],\n strip_prefix = \"equivalent-1.0.2\",\n build_file = Label(\"@crates//crates:BUILD.equivalent-1.0.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__errno-0.3.14\",\n sha256 = \"39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/errno/0.3.14/download\"],\n strip_prefix = \"errno-0.3.14\",\n build_file = Label(\"@crates//crates:BUILD.errno-0.3.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fastrand-2.4.1\",\n sha256 = \"9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fastrand/2.4.1/download\"],\n strip_prefix = \"fastrand-2.4.1\",\n build_file = Label(\"@crates//crates:BUILD.fastrand-2.4.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__find-msvc-tools-0.1.9\",\n sha256 = \"5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/find-msvc-tools/0.1.9/download\"],\n strip_prefix = \"find-msvc-tools-0.1.9\",\n build_file = Label(\"@crates//crates:BUILD.find-msvc-tools-0.1.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fnv-1.0.7\",\n sha256 = \"3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fnv/1.0.7/download\"],\n strip_prefix = \"fnv-1.0.7\",\n build_file = Label(\"@crates//crates:BUILD.fnv-1.0.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__foldhash-0.1.5\",\n sha256 = \"d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/foldhash/0.1.5/download\"],\n strip_prefix = \"foldhash-0.1.5\",\n build_file = Label(\"@crates//crates:BUILD.foldhash-0.1.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__form_urlencoded-1.2.2\",\n sha256 = \"cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/form_urlencoded/1.2.2/download\"],\n strip_prefix = \"form_urlencoded-1.2.2\",\n build_file = Label(\"@crates//crates:BUILD.form_urlencoded-1.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fs_extra-1.3.0\",\n sha256 = \"42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fs_extra/1.3.0/download\"],\n strip_prefix = \"fs_extra-1.3.0\",\n build_file = Label(\"@crates//crates:BUILD.fs_extra-1.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-channel-0.3.32\",\n sha256 = \"07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-channel/0.3.32/download\"],\n strip_prefix = \"futures-channel-0.3.32\",\n build_file = Label(\"@crates//crates:BUILD.futures-channel-0.3.32.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-core-0.3.32\",\n sha256 = \"7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-core/0.3.32/download\"],\n strip_prefix = \"futures-core-0.3.32\",\n build_file = Label(\"@crates//crates:BUILD.futures-core-0.3.32.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-io-0.3.32\",\n sha256 = \"cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-io/0.3.32/download\"],\n strip_prefix = \"futures-io-0.3.32\",\n build_file = Label(\"@crates//crates:BUILD.futures-io-0.3.32.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-sink-0.3.32\",\n sha256 = \"c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-sink/0.3.32/download\"],\n strip_prefix = \"futures-sink-0.3.32\",\n build_file = Label(\"@crates//crates:BUILD.futures-sink-0.3.32.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-task-0.3.32\",\n sha256 = \"037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-task/0.3.32/download\"],\n strip_prefix = \"futures-task-0.3.32\",\n build_file = Label(\"@crates//crates:BUILD.futures-task-0.3.32.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-util-0.3.32\",\n sha256 = \"389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-util/0.3.32/download\"],\n strip_prefix = \"futures-util-0.3.32\",\n build_file = Label(\"@crates//crates:BUILD.futures-util-0.3.32.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__getrandom-0.2.17\",\n sha256 = \"ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/getrandom/0.2.17/download\"],\n strip_prefix = \"getrandom-0.2.17\",\n build_file = Label(\"@crates//crates:BUILD.getrandom-0.2.17.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__getrandom-0.3.4\",\n sha256 = \"899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/getrandom/0.3.4/download\"],\n strip_prefix = \"getrandom-0.3.4\",\n build_file = Label(\"@crates//crates:BUILD.getrandom-0.3.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__getrandom-0.4.2\",\n sha256 = \"0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/getrandom/0.4.2/download\"],\n strip_prefix = \"getrandom-0.4.2\",\n build_file = Label(\"@crates//crates:BUILD.getrandom-0.4.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__h2-0.4.14\",\n sha256 = \"171fefbc92fe4a4de27e0698d6a5b392d6a0e333506bc49133760b3bcf948733\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/h2/0.4.14/download\"],\n strip_prefix = \"h2-0.4.14\",\n build_file = Label(\"@crates//crates:BUILD.h2-0.4.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hashbrown-0.15.5\",\n sha256 = \"9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hashbrown/0.15.5/download\"],\n strip_prefix = \"hashbrown-0.15.5\",\n build_file = Label(\"@crates//crates:BUILD.hashbrown-0.15.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hashbrown-0.17.1\",\n sha256 = \"ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hashbrown/0.17.1/download\"],\n strip_prefix = \"hashbrown-0.17.1\",\n build_file = Label(\"@crates//crates:BUILD.hashbrown-0.17.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__heck-0.5.0\",\n sha256 = \"2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/heck/0.5.0/download\"],\n strip_prefix = \"heck-0.5.0\",\n build_file = Label(\"@crates//crates:BUILD.heck-0.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__http-1.4.2\",\n sha256 = \"6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/http/1.4.2/download\"],\n strip_prefix = \"http-1.4.2\",\n build_file = Label(\"@crates//crates:BUILD.http-1.4.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__http-body-1.0.1\",\n sha256 = \"1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/http-body/1.0.1/download\"],\n strip_prefix = \"http-body-1.0.1\",\n build_file = Label(\"@crates//crates:BUILD.http-body-1.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__http-body-util-0.1.3\",\n sha256 = \"b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/http-body-util/0.1.3/download\"],\n strip_prefix = \"http-body-util-0.1.3\",\n build_file = Label(\"@crates//crates:BUILD.http-body-util-0.1.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__httparse-1.10.1\",\n sha256 = \"6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/httparse/1.10.1/download\"],\n strip_prefix = \"httparse-1.10.1\",\n build_file = Label(\"@crates//crates:BUILD.httparse-1.10.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hyper-1.10.1\",\n sha256 = \"55281c53a1894c864990125767da440a4e630446785086f52523b20033b74498\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hyper/1.10.1/download\"],\n strip_prefix = \"hyper-1.10.1\",\n build_file = Label(\"@crates//crates:BUILD.hyper-1.10.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hyper-rustls-0.27.9\",\n sha256 = \"33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hyper-rustls/0.27.9/download\"],\n strip_prefix = \"hyper-rustls-0.27.9\",\n build_file = Label(\"@crates//crates:BUILD.hyper-rustls-0.27.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hyper-util-0.1.20\",\n sha256 = \"96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hyper-util/0.1.20/download\"],\n strip_prefix = \"hyper-util-0.1.20\",\n build_file = Label(\"@crates//crates:BUILD.hyper-util-0.1.20.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_collections-2.2.0\",\n sha256 = \"2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_collections/2.2.0/download\"],\n strip_prefix = \"icu_collections-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_collections-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_locale_core-2.2.0\",\n sha256 = \"92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_locale_core/2.2.0/download\"],\n strip_prefix = \"icu_locale_core-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_locale_core-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_normalizer-2.2.0\",\n sha256 = \"c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_normalizer/2.2.0/download\"],\n strip_prefix = \"icu_normalizer-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_normalizer-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_normalizer_data-2.2.0\",\n sha256 = \"da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_normalizer_data/2.2.0/download\"],\n strip_prefix = \"icu_normalizer_data-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_normalizer_data-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_properties-2.2.0\",\n sha256 = \"bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_properties/2.2.0/download\"],\n strip_prefix = \"icu_properties-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_properties-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_properties_data-2.2.0\",\n sha256 = \"8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_properties_data/2.2.0/download\"],\n strip_prefix = \"icu_properties_data-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_properties_data-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_provider-2.2.0\",\n sha256 = \"139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_provider/2.2.0/download\"],\n strip_prefix = \"icu_provider-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_provider-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__id-arena-2.3.0\",\n sha256 = \"3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/id-arena/2.3.0/download\"],\n strip_prefix = \"id-arena-2.3.0\",\n build_file = Label(\"@crates//crates:BUILD.id-arena-2.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__idna-1.1.0\",\n sha256 = \"3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/idna/1.1.0/download\"],\n strip_prefix = \"idna-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.idna-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__idna_adapter-1.2.2\",\n sha256 = \"cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/idna_adapter/1.2.2/download\"],\n strip_prefix = \"idna_adapter-1.2.2\",\n build_file = Label(\"@crates//crates:BUILD.idna_adapter-1.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__indexmap-2.14.0\",\n sha256 = \"d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/indexmap/2.14.0/download\"],\n strip_prefix = \"indexmap-2.14.0\",\n build_file = Label(\"@crates//crates:BUILD.indexmap-2.14.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ipnet-2.12.0\",\n sha256 = \"d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ipnet/2.12.0/download\"],\n strip_prefix = \"ipnet-2.12.0\",\n build_file = Label(\"@crates//crates:BUILD.ipnet-2.12.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__is_terminal_polyfill-1.70.2\",\n sha256 = \"a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/is_terminal_polyfill/1.70.2/download\"],\n strip_prefix = \"is_terminal_polyfill-1.70.2\",\n build_file = Label(\"@crates//crates:BUILD.is_terminal_polyfill-1.70.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__itoa-1.0.18\",\n sha256 = \"8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/itoa/1.0.18/download\"],\n strip_prefix = \"itoa-1.0.18\",\n build_file = Label(\"@crates//crates:BUILD.itoa-1.0.18.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jni-0.22.4\",\n sha256 = \"5efd9a482cf3a427f00d6b35f14332adc7902ce91efb778580e180ff90fa3498\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jni/0.22.4/download\"],\n strip_prefix = \"jni-0.22.4\",\n build_file = Label(\"@crates//crates:BUILD.jni-0.22.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jni-macros-0.22.4\",\n sha256 = \"a00109accc170f0bdb141fed3e393c565b6f5e072365c3bd58f5b062591560a3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jni-macros/0.22.4/download\"],\n strip_prefix = \"jni-macros-0.22.4\",\n build_file = Label(\"@crates//crates:BUILD.jni-macros-0.22.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jni-sys-0.4.1\",\n sha256 = \"c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jni-sys/0.4.1/download\"],\n strip_prefix = \"jni-sys-0.4.1\",\n build_file = Label(\"@crates//crates:BUILD.jni-sys-0.4.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jni-sys-macros-0.4.1\",\n sha256 = \"38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jni-sys-macros/0.4.1/download\"],\n strip_prefix = \"jni-sys-macros-0.4.1\",\n build_file = Label(\"@crates//crates:BUILD.jni-sys-macros-0.4.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jobserver-0.1.34\",\n sha256 = \"9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jobserver/0.1.34/download\"],\n strip_prefix = \"jobserver-0.1.34\",\n build_file = Label(\"@crates//crates:BUILD.jobserver-0.1.34.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__js-sys-0.3.102\",\n sha256 = \"03d04c30968dffe80775bd4d7fb676131cd04a1fb46d2686dbffbaec2d9dfd31\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/js-sys/0.3.102/download\"],\n strip_prefix = \"js-sys-0.3.102\",\n build_file = Label(\"@crates//crates:BUILD.js-sys-0.3.102.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__leb128fmt-0.1.0\",\n sha256 = \"09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/leb128fmt/0.1.0/download\"],\n strip_prefix = \"leb128fmt-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.leb128fmt-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__libc-0.2.186\",\n sha256 = \"68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/libc/0.2.186/download\"],\n strip_prefix = \"libc-0.2.186\",\n build_file = Label(\"@crates//crates:BUILD.libc-0.2.186.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__linux-raw-sys-0.12.1\",\n sha256 = \"32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/linux-raw-sys/0.12.1/download\"],\n strip_prefix = \"linux-raw-sys-0.12.1\",\n build_file = Label(\"@crates//crates:BUILD.linux-raw-sys-0.12.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__litemap-0.8.2\",\n sha256 = \"92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/litemap/0.8.2/download\"],\n strip_prefix = \"litemap-0.8.2\",\n build_file = Label(\"@crates//crates:BUILD.litemap-0.8.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__log-0.4.32\",\n sha256 = \"953f07c43838f8e6f9758cab68bf5bed85465e7587ebe0b823f1bcd81978ad3a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/log/0.4.32/download\"],\n strip_prefix = \"log-0.4.32\",\n build_file = Label(\"@crates//crates:BUILD.log-0.4.32.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__lru-slab-0.1.2\",\n sha256 = \"112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/lru-slab/0.1.2/download\"],\n strip_prefix = \"lru-slab-0.1.2\",\n build_file = Label(\"@crates//crates:BUILD.lru-slab-0.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__memchr-2.8.2\",\n sha256 = \"88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/memchr/2.8.2/download\"],\n strip_prefix = \"memchr-2.8.2\",\n build_file = Label(\"@crates//crates:BUILD.memchr-2.8.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__mime-0.3.17\",\n sha256 = \"6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/mime/0.3.17/download\"],\n strip_prefix = \"mime-0.3.17\",\n build_file = Label(\"@crates//crates:BUILD.mime-0.3.17.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__mio-1.2.1\",\n sha256 = \"02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fda\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/mio/1.2.1/download\"],\n strip_prefix = \"mio-1.2.1\",\n build_file = Label(\"@crates//crates:BUILD.mio-1.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__natord-1.0.9\",\n sha256 = \"308d96db8debc727c3fd9744aac51751243420e46edf401010908da7f8d5e57c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/natord/1.0.9/download\"],\n strip_prefix = \"natord-1.0.9\",\n build_file = Label(\"@crates//crates:BUILD.natord-1.0.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__once_cell-1.21.4\",\n sha256 = \"9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/once_cell/1.21.4/download\"],\n strip_prefix = \"once_cell-1.21.4\",\n build_file = Label(\"@crates//crates:BUILD.once_cell-1.21.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__once_cell_polyfill-1.70.2\",\n sha256 = \"384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/once_cell_polyfill/1.70.2/download\"],\n strip_prefix = \"once_cell_polyfill-1.70.2\",\n build_file = Label(\"@crates//crates:BUILD.once_cell_polyfill-1.70.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__openssl-probe-0.2.1\",\n sha256 = \"7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/openssl-probe/0.2.1/download\"],\n strip_prefix = \"openssl-probe-0.2.1\",\n build_file = Label(\"@crates//crates:BUILD.openssl-probe-0.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__percent-encoding-2.3.2\",\n sha256 = \"9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/percent-encoding/2.3.2/download\"],\n strip_prefix = \"percent-encoding-2.3.2\",\n build_file = Label(\"@crates//crates:BUILD.percent-encoding-2.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pin-project-lite-0.2.17\",\n sha256 = \"a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pin-project-lite/0.2.17/download\"],\n strip_prefix = \"pin-project-lite-0.2.17\",\n build_file = Label(\"@crates//crates:BUILD.pin-project-lite-0.2.17.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__potential_utf-0.1.5\",\n sha256 = \"0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/potential_utf/0.1.5/download\"],\n strip_prefix = \"potential_utf-0.1.5\",\n build_file = Label(\"@crates//crates:BUILD.potential_utf-0.1.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ppv-lite86-0.2.21\",\n sha256 = \"85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ppv-lite86/0.2.21/download\"],\n strip_prefix = \"ppv-lite86-0.2.21\",\n build_file = Label(\"@crates//crates:BUILD.ppv-lite86-0.2.21.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__prettyplease-0.2.37\",\n sha256 = \"479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/prettyplease/0.2.37/download\"],\n strip_prefix = \"prettyplease-0.2.37\",\n build_file = Label(\"@crates//crates:BUILD.prettyplease-0.2.37.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__proc-macro2-1.0.106\",\n sha256 = \"8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/proc-macro2/1.0.106/download\"],\n strip_prefix = \"proc-macro2-1.0.106\",\n build_file = Label(\"@crates//crates:BUILD.proc-macro2-1.0.106.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__quinn-0.11.9\",\n sha256 = \"b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/quinn/0.11.9/download\"],\n strip_prefix = \"quinn-0.11.9\",\n build_file = Label(\"@crates//crates:BUILD.quinn-0.11.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__quinn-proto-0.11.14\",\n sha256 = \"434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/quinn-proto/0.11.14/download\"],\n strip_prefix = \"quinn-proto-0.11.14\",\n build_file = Label(\"@crates//crates:BUILD.quinn-proto-0.11.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__quinn-udp-0.5.14\",\n sha256 = \"addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/quinn-udp/0.5.14/download\"],\n strip_prefix = \"quinn-udp-0.5.14\",\n build_file = Label(\"@crates//crates:BUILD.quinn-udp-0.5.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__quote-1.0.45\",\n sha256 = \"41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/quote/1.0.45/download\"],\n strip_prefix = \"quote-1.0.45\",\n build_file = Label(\"@crates//crates:BUILD.quote-1.0.45.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__r-efi-5.3.0\",\n sha256 = \"69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/r-efi/5.3.0/download\"],\n strip_prefix = \"r-efi-5.3.0\",\n build_file = Label(\"@crates//crates:BUILD.r-efi-5.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__r-efi-6.0.0\",\n sha256 = \"f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/r-efi/6.0.0/download\"],\n strip_prefix = \"r-efi-6.0.0\",\n build_file = Label(\"@crates//crates:BUILD.r-efi-6.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rand-0.9.4\",\n sha256 = \"44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rand/0.9.4/download\"],\n strip_prefix = \"rand-0.9.4\",\n build_file = Label(\"@crates//crates:BUILD.rand-0.9.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rand_chacha-0.9.0\",\n sha256 = \"d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rand_chacha/0.9.0/download\"],\n strip_prefix = \"rand_chacha-0.9.0\",\n build_file = Label(\"@crates//crates:BUILD.rand_chacha-0.9.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rand_core-0.9.5\",\n sha256 = \"76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rand_core/0.9.5/download\"],\n strip_prefix = \"rand_core-0.9.5\",\n build_file = Label(\"@crates//crates:BUILD.rand_core-0.9.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__reqwest-0.13.4\",\n sha256 = \"219c5811de6525e5416c7d5d53bb656d3afdbc6c5af816e0802bcfa42dbdc1c3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/reqwest/0.13.4/download\"],\n strip_prefix = \"reqwest-0.13.4\",\n build_file = Label(\"@crates//crates:BUILD.reqwest-0.13.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ring-0.17.14\",\n sha256 = \"a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ring/0.17.14/download\"],\n strip_prefix = \"ring-0.17.14\",\n build_file = Label(\"@crates//crates:BUILD.ring-0.17.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustc-hash-2.1.2\",\n sha256 = \"94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustc-hash/2.1.2/download\"],\n strip_prefix = \"rustc-hash-2.1.2\",\n build_file = Label(\"@crates//crates:BUILD.rustc-hash-2.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustc_version-0.4.1\",\n sha256 = \"cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustc_version/0.4.1/download\"],\n strip_prefix = \"rustc_version-0.4.1\",\n build_file = Label(\"@crates//crates:BUILD.rustc_version-0.4.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustix-1.1.4\",\n sha256 = \"b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustix/1.1.4/download\"],\n strip_prefix = \"rustix-1.1.4\",\n build_file = Label(\"@crates//crates:BUILD.rustix-1.1.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustls-0.23.40\",\n sha256 = \"ef86cd5876211988985292b91c96a8f2d298df24e75989a43a3c73f2d4d8168b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustls/0.23.40/download\"],\n strip_prefix = \"rustls-0.23.40\",\n build_file = Label(\"@crates//crates:BUILD.rustls-0.23.40.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustls-native-certs-0.8.4\",\n sha256 = \"dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustls-native-certs/0.8.4/download\"],\n strip_prefix = \"rustls-native-certs-0.8.4\",\n build_file = Label(\"@crates//crates:BUILD.rustls-native-certs-0.8.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustls-pki-types-1.14.1\",\n sha256 = \"30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustls-pki-types/1.14.1/download\"],\n strip_prefix = \"rustls-pki-types-1.14.1\",\n build_file = Label(\"@crates//crates:BUILD.rustls-pki-types-1.14.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustls-platform-verifier-0.7.0\",\n sha256 = \"26d1e2536ce4f35f4846aa13bff16bd0ff40157cdb14cc056c7b14ba41233ba0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustls-platform-verifier/0.7.0/download\"],\n strip_prefix = \"rustls-platform-verifier-0.7.0\",\n build_file = Label(\"@crates//crates:BUILD.rustls-platform-verifier-0.7.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustls-platform-verifier-android-0.1.1\",\n sha256 = \"f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustls-platform-verifier-android/0.1.1/download\"],\n strip_prefix = \"rustls-platform-verifier-android-0.1.1\",\n build_file = Label(\"@crates//crates:BUILD.rustls-platform-verifier-android-0.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustls-webpki-0.103.13\",\n sha256 = \"61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustls-webpki/0.103.13/download\"],\n strip_prefix = \"rustls-webpki-0.103.13\",\n build_file = Label(\"@crates//crates:BUILD.rustls-webpki-0.103.13.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustversion-1.0.22\",\n sha256 = \"b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustversion/1.0.22/download\"],\n strip_prefix = \"rustversion-1.0.22\",\n build_file = Label(\"@crates//crates:BUILD.rustversion-1.0.22.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ryu-1.0.23\",\n sha256 = \"9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ryu/1.0.23/download\"],\n strip_prefix = \"ryu-1.0.23\",\n build_file = Label(\"@crates//crates:BUILD.ryu-1.0.23.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__same-file-1.0.6\",\n sha256 = \"93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/same-file/1.0.6/download\"],\n strip_prefix = \"same-file-1.0.6\",\n build_file = Label(\"@crates//crates:BUILD.same-file-1.0.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__schannel-0.1.29\",\n sha256 = \"91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/schannel/0.1.29/download\"],\n strip_prefix = \"schannel-0.1.29\",\n build_file = Label(\"@crates//crates:BUILD.schannel-0.1.29.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__security-framework-3.7.0\",\n sha256 = \"b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/security-framework/3.7.0/download\"],\n strip_prefix = \"security-framework-3.7.0\",\n build_file = Label(\"@crates//crates:BUILD.security-framework-3.7.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__security-framework-sys-2.17.0\",\n sha256 = \"6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/security-framework-sys/2.17.0/download\"],\n strip_prefix = \"security-framework-sys-2.17.0\",\n build_file = Label(\"@crates//crates:BUILD.security-framework-sys-2.17.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__semver-1.0.28\",\n sha256 = \"8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/semver/1.0.28/download\"],\n strip_prefix = \"semver-1.0.28\",\n build_file = Label(\"@crates//crates:BUILD.semver-1.0.28.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde-1.0.228\",\n sha256 = \"9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde/1.0.228/download\"],\n strip_prefix = \"serde-1.0.228\",\n build_file = Label(\"@crates//crates:BUILD.serde-1.0.228.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_core-1.0.228\",\n sha256 = \"41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_core/1.0.228/download\"],\n strip_prefix = \"serde_core-1.0.228\",\n build_file = Label(\"@crates//crates:BUILD.serde_core-1.0.228.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_derive-1.0.228\",\n sha256 = \"d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_derive/1.0.228/download\"],\n strip_prefix = \"serde_derive-1.0.228\",\n build_file = Label(\"@crates//crates:BUILD.serde_derive-1.0.228.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_json-1.0.150\",\n sha256 = \"e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_json/1.0.150/download\"],\n strip_prefix = \"serde_json-1.0.150\",\n build_file = Label(\"@crates//crates:BUILD.serde_json-1.0.150.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__shlex-2.0.1\",\n sha256 = \"f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/shlex/2.0.1/download\"],\n strip_prefix = \"shlex-2.0.1\",\n build_file = Label(\"@crates//crates:BUILD.shlex-2.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__simd_cesu8-1.1.1\",\n sha256 = \"94f90157bb87cddf702797c5dadfa0be7d266cdf49e22da2fcaa32eff75b2c33\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/simd_cesu8/1.1.1/download\"],\n strip_prefix = \"simd_cesu8-1.1.1\",\n build_file = Label(\"@crates//crates:BUILD.simd_cesu8-1.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__simdutf8-0.1.5\",\n sha256 = \"e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/simdutf8/0.1.5/download\"],\n strip_prefix = \"simdutf8-0.1.5\",\n build_file = Label(\"@crates//crates:BUILD.simdutf8-0.1.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__similar-3.1.1\",\n sha256 = \"e6505efef05804732ed8a3f2d4f279429eb485bd69d5b0cc6b19cc02005cda16\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/similar/3.1.1/download\"],\n strip_prefix = \"similar-3.1.1\",\n build_file = Label(\"@crates//crates:BUILD.similar-3.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__slab-0.4.12\",\n sha256 = \"0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/slab/0.4.12/download\"],\n strip_prefix = \"slab-0.4.12\",\n build_file = Label(\"@crates//crates:BUILD.slab-0.4.12.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__smallvec-1.15.2\",\n sha256 = \"8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/smallvec/1.15.2/download\"],\n strip_prefix = \"smallvec-1.15.2\",\n build_file = Label(\"@crates//crates:BUILD.smallvec-1.15.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__socket2-0.6.4\",\n sha256 = \"52d1cfed4120b4d927bf7c0f86d2087a4a7d6027c906d9f9d525a80573b9be51\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/socket2/0.6.4/download\"],\n strip_prefix = \"socket2-0.6.4\",\n build_file = Label(\"@crates//crates:BUILD.socket2-0.6.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__stable_deref_trait-1.2.1\",\n sha256 = \"6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/stable_deref_trait/1.2.1/download\"],\n strip_prefix = \"stable_deref_trait-1.2.1\",\n build_file = Label(\"@crates//crates:BUILD.stable_deref_trait-1.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__strsim-0.11.1\",\n sha256 = \"7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/strsim/0.11.1/download\"],\n strip_prefix = \"strsim-0.11.1\",\n build_file = Label(\"@crates//crates:BUILD.strsim-0.11.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__subtle-2.6.1\",\n sha256 = \"13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/subtle/2.6.1/download\"],\n strip_prefix = \"subtle-2.6.1\",\n build_file = Label(\"@crates//crates:BUILD.subtle-2.6.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__syn-2.0.117\",\n sha256 = \"e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/syn/2.0.117/download\"],\n strip_prefix = \"syn-2.0.117\",\n build_file = Label(\"@crates//crates:BUILD.syn-2.0.117.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__sync_wrapper-1.0.2\",\n sha256 = \"0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/sync_wrapper/1.0.2/download\"],\n strip_prefix = \"sync_wrapper-1.0.2\",\n build_file = Label(\"@crates//crates:BUILD.sync_wrapper-1.0.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__synstructure-0.13.2\",\n sha256 = \"728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/synstructure/0.13.2/download\"],\n strip_prefix = \"synstructure-0.13.2\",\n build_file = Label(\"@crates//crates:BUILD.synstructure-0.13.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__system-configuration-0.7.0\",\n sha256 = \"a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/system-configuration/0.7.0/download\"],\n strip_prefix = \"system-configuration-0.7.0\",\n build_file = Label(\"@crates//crates:BUILD.system-configuration-0.7.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__system-configuration-sys-0.6.0\",\n sha256 = \"8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/system-configuration-sys/0.6.0/download\"],\n strip_prefix = \"system-configuration-sys-0.6.0\",\n build_file = Label(\"@crates//crates:BUILD.system-configuration-sys-0.6.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tempfile-3.27.0\",\n sha256 = \"32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tempfile/3.27.0/download\"],\n strip_prefix = \"tempfile-3.27.0\",\n build_file = Label(\"@crates//crates:BUILD.tempfile-3.27.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__thiserror-2.0.18\",\n sha256 = \"4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/thiserror/2.0.18/download\"],\n strip_prefix = \"thiserror-2.0.18\",\n build_file = Label(\"@crates//crates:BUILD.thiserror-2.0.18.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__thiserror-impl-2.0.18\",\n sha256 = \"ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/thiserror-impl/2.0.18/download\"],\n strip_prefix = \"thiserror-impl-2.0.18\",\n build_file = Label(\"@crates//crates:BUILD.thiserror-impl-2.0.18.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tinystr-0.8.3\",\n sha256 = \"c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tinystr/0.8.3/download\"],\n strip_prefix = \"tinystr-0.8.3\",\n build_file = Label(\"@crates//crates:BUILD.tinystr-0.8.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tinyvec-1.11.0\",\n sha256 = \"3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tinyvec/1.11.0/download\"],\n strip_prefix = \"tinyvec-1.11.0\",\n build_file = Label(\"@crates//crates:BUILD.tinyvec-1.11.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tinyvec_macros-0.1.1\",\n sha256 = \"1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tinyvec_macros/0.1.1/download\"],\n strip_prefix = \"tinyvec_macros-0.1.1\",\n build_file = Label(\"@crates//crates:BUILD.tinyvec_macros-0.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tokio-1.52.3\",\n sha256 = \"8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tokio/1.52.3/download\"],\n strip_prefix = \"tokio-1.52.3\",\n build_file = Label(\"@crates//crates:BUILD.tokio-1.52.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tokio-rustls-0.26.4\",\n sha256 = \"1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tokio-rustls/0.26.4/download\"],\n strip_prefix = \"tokio-rustls-0.26.4\",\n build_file = Label(\"@crates//crates:BUILD.tokio-rustls-0.26.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tokio-util-0.7.18\",\n sha256 = \"9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tokio-util/0.7.18/download\"],\n strip_prefix = \"tokio-util-0.7.18\",\n build_file = Label(\"@crates//crates:BUILD.tokio-util-0.7.18.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tower-0.5.3\",\n sha256 = \"ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tower/0.5.3/download\"],\n strip_prefix = \"tower-0.5.3\",\n build_file = Label(\"@crates//crates:BUILD.tower-0.5.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tower-http-0.6.11\",\n sha256 = \"4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tower-http/0.6.11/download\"],\n strip_prefix = \"tower-http-0.6.11\",\n build_file = Label(\"@crates//crates:BUILD.tower-http-0.6.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tower-layer-0.3.3\",\n sha256 = \"121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tower-layer/0.3.3/download\"],\n strip_prefix = \"tower-layer-0.3.3\",\n build_file = Label(\"@crates//crates:BUILD.tower-layer-0.3.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tower-service-0.3.3\",\n sha256 = \"8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tower-service/0.3.3/download\"],\n strip_prefix = \"tower-service-0.3.3\",\n build_file = Label(\"@crates//crates:BUILD.tower-service-0.3.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tracing-0.1.44\",\n sha256 = \"63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tracing/0.1.44/download\"],\n strip_prefix = \"tracing-0.1.44\",\n build_file = Label(\"@crates//crates:BUILD.tracing-0.1.44.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tracing-core-0.1.36\",\n sha256 = \"db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tracing-core/0.1.36/download\"],\n strip_prefix = \"tracing-core-0.1.36\",\n build_file = Label(\"@crates//crates:BUILD.tracing-core-0.1.36.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__try-lock-0.2.5\",\n sha256 = \"e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/try-lock/0.2.5/download\"],\n strip_prefix = \"try-lock-0.2.5\",\n build_file = Label(\"@crates//crates:BUILD.try-lock-0.2.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__unicode-ident-1.0.24\",\n sha256 = \"e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/unicode-ident/1.0.24/download\"],\n strip_prefix = \"unicode-ident-1.0.24\",\n build_file = Label(\"@crates//crates:BUILD.unicode-ident-1.0.24.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__unicode-width-0.2.2\",\n sha256 = \"b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/unicode-width/0.2.2/download\"],\n strip_prefix = \"unicode-width-0.2.2\",\n build_file = Label(\"@crates//crates:BUILD.unicode-width-0.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__unicode-xid-0.2.6\",\n sha256 = \"ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/unicode-xid/0.2.6/download\"],\n strip_prefix = \"unicode-xid-0.2.6\",\n build_file = Label(\"@crates//crates:BUILD.unicode-xid-0.2.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__untrusted-0.9.0\",\n sha256 = \"8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/untrusted/0.9.0/download\"],\n strip_prefix = \"untrusted-0.9.0\",\n build_file = Label(\"@crates//crates:BUILD.untrusted-0.9.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__url-2.5.8\",\n sha256 = \"ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/url/2.5.8/download\"],\n strip_prefix = \"url-2.5.8\",\n build_file = Label(\"@crates//crates:BUILD.url-2.5.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__utf8_iter-1.0.4\",\n sha256 = \"b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/utf8_iter/1.0.4/download\"],\n strip_prefix = \"utf8_iter-1.0.4\",\n build_file = Label(\"@crates//crates:BUILD.utf8_iter-1.0.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__utf8parse-0.2.2\",\n sha256 = \"06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/utf8parse/0.2.2/download\"],\n strip_prefix = \"utf8parse-0.2.2\",\n build_file = Label(\"@crates//crates:BUILD.utf8parse-0.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__walkdir-2.5.0\",\n sha256 = \"29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/walkdir/2.5.0/download\"],\n strip_prefix = \"walkdir-2.5.0\",\n build_file = Label(\"@crates//crates:BUILD.walkdir-2.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__want-0.3.1\",\n sha256 = \"bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/want/0.3.1/download\"],\n strip_prefix = \"want-0.3.1\",\n build_file = Label(\"@crates//crates:BUILD.want-0.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasi-0.11.1-wasi-snapshot-preview1\",\n sha256 = \"ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasi/0.11.1+wasi-snapshot-preview1/download\"],\n strip_prefix = \"wasi-0.11.1+wasi-snapshot-preview1\",\n build_file = Label(\"@crates//crates:BUILD.wasi-0.11.1+wasi-snapshot-preview1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasip2-1.0.4-wasi-0.2.12\",\n sha256 = \"b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasip2/1.0.4+wasi-0.2.12/download\"],\n strip_prefix = \"wasip2-1.0.4+wasi-0.2.12\",\n build_file = Label(\"@crates//crates:BUILD.wasip2-1.0.4+wasi-0.2.12.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasip3-0.4.0-wasi-0.3.0-rc-2026-01-06\",\n sha256 = \"5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasip3/0.4.0+wasi-0.3.0-rc-2026-01-06/download\"],\n strip_prefix = \"wasip3-0.4.0+wasi-0.3.0-rc-2026-01-06\",\n build_file = Label(\"@crates//crates:BUILD.wasip3-0.4.0+wasi-0.3.0-rc-2026-01-06.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-0.2.125\",\n sha256 = \"8ddb3f79143bced6de84270411622a2699cee572fc0875aeaf1e7867cf9fca1a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen/0.2.125/download\"],\n strip_prefix = \"wasm-bindgen-0.2.125\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-0.2.125.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-futures-0.4.75\",\n sha256 = \"503b14d284f2c8dac03b819967e155ea753f573586193b2b2c95990cb5d69280\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen-futures/0.4.75/download\"],\n strip_prefix = \"wasm-bindgen-futures-0.4.75\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-futures-0.4.75.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-macro-0.2.125\",\n sha256 = \"4e21a184b13fb19e157296e2c46056aec9092264fab83e4ba59e68c61b323c3d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen-macro/0.2.125/download\"],\n strip_prefix = \"wasm-bindgen-macro-0.2.125\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-macro-0.2.125.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-macro-support-0.2.125\",\n sha256 = \"fecefd9c35bd935a20fc3fc344b5f29138961e4f47fb03297d88f2587afb5ebd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen-macro-support/0.2.125/download\"],\n strip_prefix = \"wasm-bindgen-macro-support-0.2.125\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-macro-support-0.2.125.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-shared-0.2.125\",\n sha256 = \"23939e44bb9a5d7576fa2b563dc2e136628f1224e88a8deed09e04858b77871f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen-shared/0.2.125/download\"],\n strip_prefix = \"wasm-bindgen-shared-0.2.125\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-shared-0.2.125.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-encoder-0.244.0\",\n sha256 = \"990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-encoder/0.244.0/download\"],\n strip_prefix = \"wasm-encoder-0.244.0\",\n build_file = Label(\"@crates//crates:BUILD.wasm-encoder-0.244.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-metadata-0.244.0\",\n sha256 = \"bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-metadata/0.244.0/download\"],\n strip_prefix = \"wasm-metadata-0.244.0\",\n build_file = Label(\"@crates//crates:BUILD.wasm-metadata-0.244.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasmparser-0.244.0\",\n sha256 = \"47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasmparser/0.244.0/download\"],\n strip_prefix = \"wasmparser-0.244.0\",\n build_file = Label(\"@crates//crates:BUILD.wasmparser-0.244.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__web-sys-0.3.102\",\n sha256 = \"a6430a72df5eb332242960fe84b3002a241163998241eb596d4f739b9757061d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/web-sys/0.3.102/download\"],\n strip_prefix = \"web-sys-0.3.102\",\n build_file = Label(\"@crates//crates:BUILD.web-sys-0.3.102.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__web-time-1.1.0\",\n sha256 = \"5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/web-time/1.1.0/download\"],\n strip_prefix = \"web-time-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.web-time-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__webpki-root-certs-1.0.7\",\n sha256 = \"f31141ce3fc3e300ae89b78c0dd67f9708061d1d2eda54b8209346fd6be9a92c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/webpki-root-certs/1.0.7/download\"],\n strip_prefix = \"webpki-root-certs-1.0.7\",\n build_file = Label(\"@crates//crates:BUILD.webpki-root-certs-1.0.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__winapi-util-0.1.11\",\n sha256 = \"c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/winapi-util/0.1.11/download\"],\n strip_prefix = \"winapi-util-0.1.11\",\n build_file = Label(\"@crates//crates:BUILD.winapi-util-0.1.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-link-0.2.1\",\n sha256 = \"f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-link/0.2.1/download\"],\n strip_prefix = \"windows-link-0.2.1\",\n build_file = Label(\"@crates//crates:BUILD.windows-link-0.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-registry-0.6.1\",\n sha256 = \"02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-registry/0.6.1/download\"],\n strip_prefix = \"windows-registry-0.6.1\",\n build_file = Label(\"@crates//crates:BUILD.windows-registry-0.6.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-result-0.4.1\",\n sha256 = \"7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-result/0.4.1/download\"],\n strip_prefix = \"windows-result-0.4.1\",\n build_file = Label(\"@crates//crates:BUILD.windows-result-0.4.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-strings-0.5.1\",\n sha256 = \"7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-strings/0.5.1/download\"],\n strip_prefix = \"windows-strings-0.5.1\",\n build_file = Label(\"@crates//crates:BUILD.windows-strings-0.5.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-sys-0.52.0\",\n sha256 = \"282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-sys/0.52.0/download\"],\n strip_prefix = \"windows-sys-0.52.0\",\n build_file = Label(\"@crates//crates:BUILD.windows-sys-0.52.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-sys-0.60.2\",\n sha256 = \"f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-sys/0.60.2/download\"],\n strip_prefix = \"windows-sys-0.60.2\",\n build_file = Label(\"@crates//crates:BUILD.windows-sys-0.60.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-sys-0.61.2\",\n sha256 = \"ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-sys/0.61.2/download\"],\n strip_prefix = \"windows-sys-0.61.2\",\n build_file = Label(\"@crates//crates:BUILD.windows-sys-0.61.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-targets-0.52.6\",\n sha256 = \"9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-targets/0.52.6/download\"],\n strip_prefix = \"windows-targets-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows-targets-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-targets-0.53.5\",\n sha256 = \"4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-targets/0.53.5/download\"],\n strip_prefix = \"windows-targets-0.53.5\",\n build_file = Label(\"@crates//crates:BUILD.windows-targets-0.53.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_gnullvm-0.52.6\",\n sha256 = \"32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_gnullvm/0.52.6/download\"],\n strip_prefix = \"windows_aarch64_gnullvm-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_gnullvm-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_gnullvm-0.53.1\",\n sha256 = \"a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_gnullvm/0.53.1/download\"],\n strip_prefix = \"windows_aarch64_gnullvm-0.53.1\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_gnullvm-0.53.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_msvc-0.52.6\",\n sha256 = \"09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_msvc/0.52.6/download\"],\n strip_prefix = \"windows_aarch64_msvc-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_msvc-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_msvc-0.53.1\",\n sha256 = \"b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_msvc/0.53.1/download\"],\n strip_prefix = \"windows_aarch64_msvc-0.53.1\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_msvc-0.53.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnu-0.52.6\",\n sha256 = \"8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnu/0.52.6/download\"],\n strip_prefix = \"windows_i686_gnu-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnu-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnu-0.53.1\",\n sha256 = \"960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnu/0.53.1/download\"],\n strip_prefix = \"windows_i686_gnu-0.53.1\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnu-0.53.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnullvm-0.52.6\",\n sha256 = \"0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnullvm/0.52.6/download\"],\n strip_prefix = \"windows_i686_gnullvm-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnullvm-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnullvm-0.53.1\",\n sha256 = \"fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnullvm/0.53.1/download\"],\n strip_prefix = \"windows_i686_gnullvm-0.53.1\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnullvm-0.53.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_msvc-0.52.6\",\n sha256 = \"240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_msvc/0.52.6/download\"],\n strip_prefix = \"windows_i686_msvc-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_msvc-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_msvc-0.53.1\",\n sha256 = \"1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_msvc/0.53.1/download\"],\n strip_prefix = \"windows_i686_msvc-0.53.1\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_msvc-0.53.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnu-0.52.6\",\n sha256 = \"147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnu/0.52.6/download\"],\n strip_prefix = \"windows_x86_64_gnu-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnu-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnu-0.53.1\",\n sha256 = \"9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnu/0.53.1/download\"],\n strip_prefix = \"windows_x86_64_gnu-0.53.1\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnu-0.53.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnullvm-0.52.6\",\n sha256 = \"24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnullvm/0.52.6/download\"],\n strip_prefix = \"windows_x86_64_gnullvm-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnullvm-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnullvm-0.53.1\",\n sha256 = \"0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnullvm/0.53.1/download\"],\n strip_prefix = \"windows_x86_64_gnullvm-0.53.1\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnullvm-0.53.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_msvc-0.52.6\",\n sha256 = \"589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_msvc/0.52.6/download\"],\n strip_prefix = \"windows_x86_64_msvc-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_msvc-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_msvc-0.53.1\",\n sha256 = \"d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_msvc/0.53.1/download\"],\n strip_prefix = \"windows_x86_64_msvc-0.53.1\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_msvc-0.53.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wit-bindgen-0.51.0\",\n sha256 = \"d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wit-bindgen/0.51.0/download\"],\n strip_prefix = \"wit-bindgen-0.51.0\",\n build_file = Label(\"@crates//crates:BUILD.wit-bindgen-0.51.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wit-bindgen-0.57.1\",\n sha256 = \"1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wit-bindgen/0.57.1/download\"],\n strip_prefix = \"wit-bindgen-0.57.1\",\n build_file = Label(\"@crates//crates:BUILD.wit-bindgen-0.57.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wit-bindgen-core-0.51.0\",\n sha256 = \"ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wit-bindgen-core/0.51.0/download\"],\n strip_prefix = \"wit-bindgen-core-0.51.0\",\n build_file = Label(\"@crates//crates:BUILD.wit-bindgen-core-0.51.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wit-bindgen-rust-0.51.0\",\n sha256 = \"b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wit-bindgen-rust/0.51.0/download\"],\n strip_prefix = \"wit-bindgen-rust-0.51.0\",\n build_file = Label(\"@crates//crates:BUILD.wit-bindgen-rust-0.51.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wit-bindgen-rust-macro-0.51.0\",\n sha256 = \"0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wit-bindgen-rust-macro/0.51.0/download\"],\n strip_prefix = \"wit-bindgen-rust-macro-0.51.0\",\n build_file = Label(\"@crates//crates:BUILD.wit-bindgen-rust-macro-0.51.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wit-component-0.244.0\",\n sha256 = \"9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wit-component/0.244.0/download\"],\n strip_prefix = \"wit-component-0.244.0\",\n build_file = Label(\"@crates//crates:BUILD.wit-component-0.244.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wit-parser-0.244.0\",\n sha256 = \"ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wit-parser/0.244.0/download\"],\n strip_prefix = \"wit-parser-0.244.0\",\n build_file = Label(\"@crates//crates:BUILD.wit-parser-0.244.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__writeable-0.6.3\",\n sha256 = \"1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/writeable/0.6.3/download\"],\n strip_prefix = \"writeable-0.6.3\",\n build_file = Label(\"@crates//crates:BUILD.writeable-0.6.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__yoke-0.8.3\",\n sha256 = \"709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/yoke/0.8.3/download\"],\n strip_prefix = \"yoke-0.8.3\",\n build_file = Label(\"@crates//crates:BUILD.yoke-0.8.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__yoke-derive-0.8.2\",\n sha256 = \"de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/yoke-derive/0.8.2/download\"],\n strip_prefix = \"yoke-derive-0.8.2\",\n build_file = Label(\"@crates//crates:BUILD.yoke-derive-0.8.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerocopy-0.8.52\",\n sha256 = \"ce1022995ff5ff5d841ad7d994facc23098cd40152f2c1d11cd607c6f530653f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerocopy/0.8.52/download\"],\n strip_prefix = \"zerocopy-0.8.52\",\n build_file = Label(\"@crates//crates:BUILD.zerocopy-0.8.52.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerocopy-derive-0.8.52\",\n sha256 = \"1ae7f38b72ec2a254e2b87ef277cf2cd4fb97cbebf944faa6f33354da0867930\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerocopy-derive/0.8.52/download\"],\n strip_prefix = \"zerocopy-derive-0.8.52\",\n build_file = Label(\"@crates//crates:BUILD.zerocopy-derive-0.8.52.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerofrom-0.1.8\",\n sha256 = \"0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerofrom/0.1.8/download\"],\n strip_prefix = \"zerofrom-0.1.8\",\n build_file = Label(\"@crates//crates:BUILD.zerofrom-0.1.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerofrom-derive-0.1.7\",\n sha256 = \"11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerofrom-derive/0.1.7/download\"],\n strip_prefix = \"zerofrom-derive-0.1.7\",\n build_file = Label(\"@crates//crates:BUILD.zerofrom-derive-0.1.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zeroize-1.9.0\",\n sha256 = \"e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zeroize/1.9.0/download\"],\n strip_prefix = \"zeroize-1.9.0\",\n build_file = Label(\"@crates//crates:BUILD.zeroize-1.9.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerotrie-0.2.4\",\n sha256 = \"0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerotrie/0.2.4/download\"],\n strip_prefix = \"zerotrie-0.2.4\",\n build_file = Label(\"@crates//crates:BUILD.zerotrie-0.2.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerovec-0.11.6\",\n sha256 = \"90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerovec/0.11.6/download\"],\n strip_prefix = \"zerovec-0.11.6\",\n build_file = Label(\"@crates//crates:BUILD.zerovec-0.11.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerovec-derive-0.11.3\",\n sha256 = \"625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerovec-derive/0.11.3/download\"],\n strip_prefix = \"zerovec-derive-0.11.3\",\n build_file = Label(\"@crates//crates:BUILD.zerovec-derive-0.11.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zmij-1.0.21\",\n sha256 = \"b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zmij/1.0.21/download\"],\n strip_prefix = \"zmij-1.0.21\",\n build_file = Label(\"@crates//crates:BUILD.zmij-1.0.21.bazel\"),\n )\n\n return [\n struct(repo=\"crates__anyhow-1.0.102\", is_dev_dep = False),\n struct(repo=\"crates__clap-4.6.1\", is_dev_dep = False),\n struct(repo=\"crates__console-0.16.3\", is_dev_dep = False),\n struct(repo=\"crates__csv-1.4.0\", is_dev_dep = False),\n struct(repo=\"crates__natord-1.0.9\", is_dev_dep = False),\n struct(repo=\"crates__reqwest-0.13.4\", is_dev_dep = False),\n struct(repo=\"crates__serde-1.0.228\", is_dev_dep = False),\n struct(repo=\"crates__serde_json-1.0.150\", is_dev_dep = False),\n struct(repo=\"crates__similar-3.1.1\", is_dev_dep = False),\n struct(repo=\"crates__tempfile-3.27.0\", is_dev_dep = False),\n ]\n" + "defs.bzl": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'tools'\n###############################################################################\n\"\"\"\n# `crates_repository` API\n\n- [aliases](#aliases)\n- [crate_deps](#crate_deps)\n- [all_crate_deps](#all_crate_deps)\n- [crate_repositories](#crate_repositories)\n\n\"\"\"\n\nload(\"@bazel_tools//tools/build_defs/repo:git.bzl\", \"git_repository\")\nload(\"@bazel_tools//tools/build_defs/repo:http.bzl\", \"http_archive\")\nload(\"@bazel_tools//tools/build_defs/repo:utils.bzl\", \"maybe\")\nload(\"@bazel_skylib//lib:selects.bzl\", \"selects\")\nload(\"@rules_rust//crate_universe/private:local_crate_mirror.bzl\", \"local_crate_mirror\")\n\n###############################################################################\n# MACROS API\n###############################################################################\n\n# An identifier that represent common dependencies (unconditional).\n_COMMON_CONDITION = \"\"\n\ndef _flatten_dependency_maps(all_dependency_maps):\n \"\"\"Flatten a list of dependency maps into one dictionary.\n\n Dependency maps have the following structure:\n\n ```python\n DEPENDENCIES_MAP = {\n # The first key in the map is a Bazel package\n # name of the workspace this file is defined in.\n \"workspace_member_package\": {\n\n # Not all dependencies are supported for all platforms.\n # the condition key is the condition required to be true\n # on the host platform.\n \"condition\": {\n\n # An alias to a crate target. # The label of the crate target the\n # Aliases are only crate names. # package name refers to.\n \"package_name\": \"@full//:label\",\n }\n }\n }\n ```\n\n Args:\n all_dependency_maps (list): A list of dicts as described above\n\n Returns:\n dict: A dictionary as described above\n \"\"\"\n dependencies = {}\n\n for workspace_deps_map in all_dependency_maps:\n for pkg_name, conditional_deps_map in workspace_deps_map.items():\n if pkg_name not in dependencies:\n non_frozen_map = dict()\n for key, values in conditional_deps_map.items():\n non_frozen_map.update({key: dict(values.items())})\n dependencies.setdefault(pkg_name, non_frozen_map)\n continue\n\n for condition, deps_map in conditional_deps_map.items():\n # If the condition has not been recorded, do so and continue\n if condition not in dependencies[pkg_name]:\n dependencies[pkg_name].setdefault(condition, dict(deps_map.items()))\n continue\n\n # Alert on any miss-matched dependencies\n inconsistent_entries = []\n for crate_name, crate_label in deps_map.items():\n existing = dependencies[pkg_name][condition].get(crate_name)\n if existing and existing != crate_label:\n inconsistent_entries.append((crate_name, existing, crate_label))\n dependencies[pkg_name][condition].update({crate_name: crate_label})\n\n return dependencies\n\ndef crate_deps(deps, package_name = None):\n \"\"\"Finds the fully qualified label of the requested crates for the package where this macro is called.\n\n Args:\n deps (list): The desired list of crate targets.\n package_name (str, optional): The package name of the set of dependencies to look up.\n Defaults to `native.package_name()`.\n\n Returns:\n list: A list of labels to generated rust targets (str)\n \"\"\"\n\n if not deps:\n return []\n\n if package_name == None:\n package_name = native.package_name()\n\n # Join both sets of dependencies\n dependencies = _flatten_dependency_maps([\n _NORMAL_DEPENDENCIES,\n _NORMAL_DEV_DEPENDENCIES,\n _PROC_MACRO_DEPENDENCIES,\n _PROC_MACRO_DEV_DEPENDENCIES,\n _BUILD_DEPENDENCIES,\n _BUILD_PROC_MACRO_DEPENDENCIES,\n ]).pop(package_name, {})\n\n # Combine all conditional packages so we can easily index over a flat list\n # TODO: Perhaps this should actually return select statements and maintain\n # the conditionals of the dependencies\n flat_deps = {}\n for deps_set in dependencies.values():\n for crate_name, crate_label in deps_set.items():\n flat_deps.update({crate_name: crate_label})\n\n missing_crates = []\n crate_targets = []\n for crate_target in deps:\n if crate_target not in flat_deps:\n missing_crates.append(crate_target)\n else:\n crate_targets.append(flat_deps[crate_target])\n\n if missing_crates:\n fail(\"Could not find crates `{}` among dependencies of `{}`. Available dependencies were `{}`\".format(\n missing_crates,\n package_name,\n dependencies,\n ))\n\n return crate_targets\n\ndef all_crate_deps(\n normal = False, \n normal_dev = False, \n proc_macro = False, \n proc_macro_dev = False,\n build = False,\n build_proc_macro = False,\n package_name = None):\n \"\"\"Finds the fully qualified label of all requested direct crate dependencies \\\n for the package where this macro is called.\n\n If no parameters are set, all normal dependencies are returned. Setting any one flag will\n otherwise impact the contents of the returned list.\n\n Args:\n normal (bool, optional): If True, normal dependencies are included in the\n output list.\n normal_dev (bool, optional): If True, normal dev dependencies will be\n included in the output list.\n proc_macro (bool, optional): If True, proc_macro dependencies are included\n in the output list.\n proc_macro_dev (bool, optional): If True, dev proc_macro dependencies are\n included in the output list.\n build (bool, optional): If True, build dependencies are included\n in the output list.\n build_proc_macro (bool, optional): If True, build proc_macro dependencies are\n included in the output list.\n package_name (str, optional): The package name of the set of dependencies to look up.\n Defaults to `native.package_name()` when unset.\n\n Returns:\n list: A list of labels to generated rust targets (str)\n \"\"\"\n\n if package_name == None:\n package_name = native.package_name()\n\n # Determine the relevant maps to use\n all_dependency_maps = []\n if normal:\n all_dependency_maps.append(_NORMAL_DEPENDENCIES)\n if normal_dev:\n all_dependency_maps.append(_NORMAL_DEV_DEPENDENCIES)\n if proc_macro:\n all_dependency_maps.append(_PROC_MACRO_DEPENDENCIES)\n if proc_macro_dev:\n all_dependency_maps.append(_PROC_MACRO_DEV_DEPENDENCIES)\n if build:\n all_dependency_maps.append(_BUILD_DEPENDENCIES)\n if build_proc_macro:\n all_dependency_maps.append(_BUILD_PROC_MACRO_DEPENDENCIES)\n\n # Default to always using normal dependencies\n if not all_dependency_maps:\n all_dependency_maps.append(_NORMAL_DEPENDENCIES)\n\n dependencies = _flatten_dependency_maps(all_dependency_maps).pop(package_name, None)\n\n if not dependencies:\n if dependencies == None:\n fail(\"Tried to get all_crate_deps for package \" + package_name + \" but that package had no Cargo.toml file\")\n else:\n return []\n\n crate_deps = list(dependencies.pop(_COMMON_CONDITION, {}).values())\n for condition, deps in dependencies.items():\n crate_deps += selects.with_or({\n tuple(_CONDITIONS[condition]): deps.values(),\n \"//conditions:default\": [],\n })\n\n return crate_deps\n\ndef aliases(\n normal = False,\n normal_dev = False,\n proc_macro = False,\n proc_macro_dev = False,\n build = False,\n build_proc_macro = False,\n package_name = None):\n \"\"\"Produces a map of Crate alias names to their original label\n\n If no dependency kinds are specified, `normal` and `proc_macro` are used by default.\n Setting any one flag will otherwise determine the contents of the returned dict.\n\n Args:\n normal (bool, optional): If True, normal dependencies are included in the\n output list.\n normal_dev (bool, optional): If True, normal dev dependencies will be\n included in the output list..\n proc_macro (bool, optional): If True, proc_macro dependencies are included\n in the output list.\n proc_macro_dev (bool, optional): If True, dev proc_macro dependencies are\n included in the output list.\n build (bool, optional): If True, build dependencies are included\n in the output list.\n build_proc_macro (bool, optional): If True, build proc_macro dependencies are\n included in the output list.\n package_name (str, optional): The package name of the set of dependencies to look up.\n Defaults to `native.package_name()` when unset.\n\n Returns:\n dict: The aliases of all associated packages\n \"\"\"\n if package_name == None:\n package_name = native.package_name()\n\n # Determine the relevant maps to use\n all_aliases_maps = []\n if normal:\n all_aliases_maps.append(_NORMAL_ALIASES)\n if normal_dev:\n all_aliases_maps.append(_NORMAL_DEV_ALIASES)\n if proc_macro:\n all_aliases_maps.append(_PROC_MACRO_ALIASES)\n if proc_macro_dev:\n all_aliases_maps.append(_PROC_MACRO_DEV_ALIASES)\n if build:\n all_aliases_maps.append(_BUILD_ALIASES)\n if build_proc_macro:\n all_aliases_maps.append(_BUILD_PROC_MACRO_ALIASES)\n\n # Default to always using normal aliases\n if not all_aliases_maps:\n all_aliases_maps.append(_NORMAL_ALIASES)\n all_aliases_maps.append(_PROC_MACRO_ALIASES)\n\n aliases = _flatten_dependency_maps(all_aliases_maps).pop(package_name, None)\n\n if not aliases:\n return dict()\n\n common_items = aliases.pop(_COMMON_CONDITION, {}).items()\n\n # If there are only common items in the dictionary, immediately return them\n if not len(aliases.keys()) == 1:\n return dict(common_items)\n\n # Build a single select statement where each conditional has accounted for the\n # common set of aliases.\n crate_aliases = {\"//conditions:default\": dict(common_items)}\n for condition, deps in aliases.items():\n condition_triples = _CONDITIONS[condition]\n for triple in condition_triples:\n if triple in crate_aliases:\n crate_aliases[triple].update(deps)\n else:\n crate_aliases.update({triple: dict(deps.items() + common_items)})\n\n return select(crate_aliases)\n\n###############################################################################\n# WORKSPACE MEMBER DEPS AND ALIASES\n###############################################################################\n\n_NORMAL_DEPENDENCIES = {\n \"dam\": {\n _COMMON_CONDITION: {\n \"anyhow\": Label(\"@crates//:anyhow-1.0.102\"),\n \"clap\": Label(\"@crates//:clap-4.6.1\"),\n \"console\": Label(\"@crates//:console-0.16.3\"),\n \"natord\": Label(\"@crates//:natord-1.0.9\"),\n \"similar\": Label(\"@crates//:similar-3.1.1\"),\n \"tempfile\": Label(\"@crates//:tempfile-3.27.0\"),\n },\n },\n \"lastfm_rs\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"@crates//:clap-4.6.1\"),\n \"csv\": Label(\"@crates//:csv-1.4.0\"),\n \"reqwest\": Label(\"@crates//:reqwest-0.13.4\"),\n \"serde\": Label(\"@crates//:serde-1.0.228\"),\n \"serde_json\": Label(\"@crates//:serde_json-1.0.150\"),\n },\n },\n}\n\n\n_NORMAL_ALIASES = {\n \"dam\": {\n _COMMON_CONDITION: {\n },\n },\n \"lastfm_rs\": {\n _COMMON_CONDITION: {\n },\n },\n}\n\n\n_NORMAL_DEV_DEPENDENCIES = {\n \"dam\": {\n _COMMON_CONDITION: {\n \"clap_mangen\": Label(\"@crates//:clap_mangen-0.2.33\"),\n },\n },\n \"lastfm_rs\": {\n },\n}\n\n\n_NORMAL_DEV_ALIASES = {\n \"dam\": {\n _COMMON_CONDITION: {\n },\n },\n \"lastfm_rs\": {\n },\n}\n\n\n_PROC_MACRO_DEPENDENCIES = {\n \"dam\": {\n },\n \"lastfm_rs\": {\n },\n}\n\n\n_PROC_MACRO_ALIASES = {\n \"dam\": {\n },\n \"lastfm_rs\": {\n },\n}\n\n\n_PROC_MACRO_DEV_DEPENDENCIES = {\n \"dam\": {\n },\n \"lastfm_rs\": {\n },\n}\n\n\n_PROC_MACRO_DEV_ALIASES = {\n \"dam\": {\n _COMMON_CONDITION: {\n },\n },\n \"lastfm_rs\": {\n },\n}\n\n\n_BUILD_DEPENDENCIES = {\n \"dam\": {\n },\n \"lastfm_rs\": {\n },\n}\n\n\n_BUILD_ALIASES = {\n \"dam\": {\n },\n \"lastfm_rs\": {\n },\n}\n\n\n_BUILD_PROC_MACRO_DEPENDENCIES = {\n \"dam\": {\n },\n \"lastfm_rs\": {\n },\n}\n\n\n_BUILD_PROC_MACRO_ALIASES = {\n \"dam\": {\n },\n \"lastfm_rs\": {\n },\n}\n\n\n_CONDITIONS = {\n \"aarch64-apple-darwin\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\"],\n \"aarch64-pc-windows-gnullvm\": [],\n \"aarch64-unknown-linux-gnu\": [\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\"],\n \"cfg(all(all(target_arch = \\\"aarch64\\\", target_endian = \\\"little\\\"), target_os = \\\"windows\\\"))\": [],\n \"cfg(all(all(target_arch = \\\"aarch64\\\", target_endian = \\\"little\\\"), target_vendor = \\\"apple\\\", any(target_os = \\\"ios\\\", target_os = \\\"macos\\\", target_os = \\\"tvos\\\", target_os = \\\"visionos\\\", target_os = \\\"watchos\\\")))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\"],\n \"cfg(all(any(all(target_arch = \\\"aarch64\\\", target_endian = \\\"little\\\"), all(target_arch = \\\"arm\\\", target_endian = \\\"little\\\")), any(target_os = \\\"android\\\", target_os = \\\"linux\\\")))\": [\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\"],\n \"cfg(all(any(target_arch = \\\"x86_64\\\", target_arch = \\\"arm64ec\\\"), target_env = \\\"msvc\\\", not(windows_raw_dylib)))\": [\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\"],\n \"cfg(all(any(target_os = \\\"linux\\\", target_os = \\\"android\\\"), any(rustix_use_libc, miri, not(all(target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", any(target_arch = \\\"s390x\\\", target_arch = \\\"powerpc\\\")), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc\\\"), all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\")))))))\": [],\n \"cfg(all(any(target_os = \\\"linux\\\", target_os = \\\"android\\\"), not(any(all(target_os = \\\"linux\\\", target_env = \\\"\\\"), getrandom_backend = \\\"custom\\\", getrandom_backend = \\\"linux_raw\\\", getrandom_backend = \\\"rdrand\\\", getrandom_backend = \\\"rndr\\\"))))\": [\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(all(not(rustix_use_libc), not(miri), target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", any(target_arch = \\\"s390x\\\", target_arch = \\\"powerpc\\\")), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc\\\"), all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\"))))\": [\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(all(not(windows), any(rustix_use_libc, miri, not(all(target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", any(target_arch = \\\"s390x\\\", target_arch = \\\"powerpc\\\")), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc\\\"), all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\")))))))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:wasm32-unknown-unknown\",\"@rules_rust//rust/platform:wasm32-wasip1\"],\n \"cfg(all(target_arch = \\\"aarch64\\\", target_env = \\\"msvc\\\", not(windows_raw_dylib)))\": [],\n \"cfg(all(target_arch = \\\"wasm32\\\", any(target_os = \\\"unknown\\\", target_os = \\\"none\\\")))\": [\"@rules_rust//rust/platform:wasm32-unknown-unknown\"],\n \"cfg(all(target_arch = \\\"wasm32\\\", target_os = \\\"wasi\\\", target_env = \\\"p2\\\"))\": [],\n \"cfg(all(target_arch = \\\"wasm32\\\", target_os = \\\"wasi\\\", target_env = \\\"p3\\\"))\": [],\n \"cfg(all(target_arch = \\\"x86\\\", target_env = \\\"gnu\\\", not(target_abi = \\\"llvm\\\"), not(windows_raw_dylib)))\": [],\n \"cfg(all(target_arch = \\\"x86\\\", target_env = \\\"msvc\\\", not(windows_raw_dylib)))\": [],\n \"cfg(all(target_arch = \\\"x86_64\\\", target_env = \\\"gnu\\\", not(target_abi = \\\"llvm\\\"), not(windows_raw_dylib)))\": [\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(all(target_family = \\\"wasm\\\", target_os = \\\"unknown\\\"))\": [\"@rules_rust//rust/platform:wasm32-unknown-unknown\"],\n \"cfg(all(target_os = \\\"uefi\\\", getrandom_backend = \\\"efi_rng\\\"))\": [],\n \"cfg(all(unix, not(target_os = \\\"android\\\"), not(target_vendor = \\\"apple\\\"), not(target_arch = \\\"wasm32\\\")))\": [\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(all(unix, not(target_os = \\\"macos\\\")))\": [\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(any())\": [],\n \"cfg(any(target_os = \\\"dragonfly\\\", target_os = \\\"freebsd\\\", target_os = \\\"hurd\\\", target_os = \\\"illumos\\\", target_os = \\\"cygwin\\\", all(target_os = \\\"horizon\\\", target_arch = \\\"arm\\\")))\": [],\n \"cfg(any(target_os = \\\"haiku\\\", target_os = \\\"redox\\\", target_os = \\\"nto\\\", target_os = \\\"aix\\\"))\": [],\n \"cfg(any(target_os = \\\"ios\\\", target_os = \\\"visionos\\\", target_os = \\\"watchos\\\", target_os = \\\"tvos\\\"))\": [],\n \"cfg(any(target_os = \\\"macos\\\", target_os = \\\"openbsd\\\", target_os = \\\"vita\\\", target_os = \\\"emscripten\\\"))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\"],\n \"cfg(any(target_vendor = \\\"apple\\\"))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\"],\n \"cfg(any(unix, target_os = \\\"hermit\\\", target_os = \\\"wasi\\\"))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:wasm32-wasip1\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(any(unix, target_os = \\\"wasi\\\"))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:wasm32-wasip1\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(not(all(target_arch = \\\"wasm32\\\", any(target_os = \\\"unknown\\\", target_os = \\\"none\\\"))))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:wasm32-wasip1\",\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(not(all(target_family = \\\"wasm\\\", target_os = \\\"unknown\\\")))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:wasm32-wasip1\",\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(target_arch = \\\"wasm32\\\")\": [\"@rules_rust//rust/platform:wasm32-unknown-unknown\",\"@rules_rust//rust/platform:wasm32-wasip1\"],\n \"cfg(target_os = \\\"android\\\")\": [],\n \"cfg(target_os = \\\"hermit\\\")\": [],\n \"cfg(target_os = \\\"macos\\\")\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\"],\n \"cfg(target_os = \\\"netbsd\\\")\": [],\n \"cfg(target_os = \\\"solaris\\\")\": [],\n \"cfg(target_os = \\\"vxworks\\\")\": [],\n \"cfg(target_os = \\\"wasi\\\")\": [\"@rules_rust//rust/platform:wasm32-wasip1\"],\n \"cfg(unix)\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(windows)\": [\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\"],\n \"cfg(windows_raw_dylib)\": [],\n \"i686-pc-windows-gnullvm\": [],\n \"wasm32-unknown-unknown\": [\"@rules_rust//rust/platform:wasm32-unknown-unknown\"],\n \"wasm32-wasip1\": [\"@rules_rust//rust/platform:wasm32-wasip1\"],\n \"x86_64-pc-windows-gnullvm\": [],\n \"x86_64-pc-windows-msvc\": [\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\"],\n \"x86_64-unknown-linux-gnu\": [\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"x86_64-unknown-nixos-gnu\": [\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n}\n\n###############################################################################\n\ndef crate_repositories():\n \"\"\"A macro for defining repositories for all generated crates.\n\n Returns:\n A list of repos visible to the module through the module extension.\n \"\"\"\n maybe(\n http_archive,\n name = \"crates__anstream-1.0.0\",\n sha256 = \"824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstream/1.0.0/download\"],\n strip_prefix = \"anstream-1.0.0\",\n build_file = Label(\"@crates//crates:BUILD.anstream-1.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstyle-1.0.14\",\n sha256 = \"940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle/1.0.14/download\"],\n strip_prefix = \"anstyle-1.0.14\",\n build_file = Label(\"@crates//crates:BUILD.anstyle-1.0.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstyle-parse-1.0.0\",\n sha256 = \"52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle-parse/1.0.0/download\"],\n strip_prefix = \"anstyle-parse-1.0.0\",\n build_file = Label(\"@crates//crates:BUILD.anstyle-parse-1.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstyle-query-1.1.5\",\n sha256 = \"40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle-query/1.1.5/download\"],\n strip_prefix = \"anstyle-query-1.1.5\",\n build_file = Label(\"@crates//crates:BUILD.anstyle-query-1.1.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstyle-wincon-3.0.11\",\n sha256 = \"291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle-wincon/3.0.11/download\"],\n strip_prefix = \"anstyle-wincon-3.0.11\",\n build_file = Label(\"@crates//crates:BUILD.anstyle-wincon-3.0.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anyhow-1.0.102\",\n sha256 = \"7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anyhow/1.0.102/download\"],\n strip_prefix = \"anyhow-1.0.102\",\n build_file = Label(\"@crates//crates:BUILD.anyhow-1.0.102.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__atomic-waker-1.1.2\",\n sha256 = \"1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/atomic-waker/1.1.2/download\"],\n strip_prefix = \"atomic-waker-1.1.2\",\n build_file = Label(\"@crates//crates:BUILD.atomic-waker-1.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__aws-lc-rs-1.17.0\",\n sha256 = \"5ec2f1fc3ec205783a5da9a7e6c1509cc69dedf09a1949e412c1e18469326d00\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/aws-lc-rs/1.17.0/download\"],\n strip_prefix = \"aws-lc-rs-1.17.0\",\n build_file = Label(\"@crates//crates:BUILD.aws-lc-rs-1.17.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__aws-lc-sys-0.41.0\",\n sha256 = \"1a2f9779ce85b93ab6170dd940ad0169b5766ff848247aff13bb788b832fe3f4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/aws-lc-sys/0.41.0/download\"],\n strip_prefix = \"aws-lc-sys-0.41.0\",\n build_file = Label(\"@crates//crates:BUILD.aws-lc-sys-0.41.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__base64-0.22.1\",\n sha256 = \"72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/base64/0.22.1/download\"],\n strip_prefix = \"base64-0.22.1\",\n build_file = Label(\"@crates//crates:BUILD.base64-0.22.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bitflags-2.13.0\",\n sha256 = \"b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bitflags/2.13.0/download\"],\n strip_prefix = \"bitflags-2.13.0\",\n build_file = Label(\"@crates//crates:BUILD.bitflags-2.13.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bstr-1.12.1\",\n sha256 = \"63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bstr/1.12.1/download\"],\n strip_prefix = \"bstr-1.12.1\",\n build_file = Label(\"@crates//crates:BUILD.bstr-1.12.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bumpalo-3.20.3\",\n sha256 = \"72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bumpalo/3.20.3/download\"],\n strip_prefix = \"bumpalo-3.20.3\",\n build_file = Label(\"@crates//crates:BUILD.bumpalo-3.20.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bytes-1.11.1\",\n sha256 = \"1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bytes/1.11.1/download\"],\n strip_prefix = \"bytes-1.11.1\",\n build_file = Label(\"@crates//crates:BUILD.bytes-1.11.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cc-1.2.64\",\n sha256 = \"dad887fd958be91b5098c0248def011f4523ab786cd411be668777e55063501f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cc/1.2.64/download\"],\n strip_prefix = \"cc-1.2.64\",\n build_file = Label(\"@crates//crates:BUILD.cc-1.2.64.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cfg-if-1.0.4\",\n sha256 = \"9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cfg-if/1.0.4/download\"],\n strip_prefix = \"cfg-if-1.0.4\",\n build_file = Label(\"@crates//crates:BUILD.cfg-if-1.0.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cfg_aliases-0.2.1\",\n sha256 = \"613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cfg_aliases/0.2.1/download\"],\n strip_prefix = \"cfg_aliases-0.2.1\",\n build_file = Label(\"@crates//crates:BUILD.cfg_aliases-0.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clap-4.6.1\",\n sha256 = \"1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap/4.6.1/download\"],\n strip_prefix = \"clap-4.6.1\",\n build_file = Label(\"@crates//crates:BUILD.clap-4.6.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clap_builder-4.6.0\",\n sha256 = \"714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap_builder/4.6.0/download\"],\n strip_prefix = \"clap_builder-4.6.0\",\n build_file = Label(\"@crates//crates:BUILD.clap_builder-4.6.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clap_derive-4.6.1\",\n sha256 = \"f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap_derive/4.6.1/download\"],\n strip_prefix = \"clap_derive-4.6.1\",\n build_file = Label(\"@crates//crates:BUILD.clap_derive-4.6.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clap_lex-1.1.0\",\n sha256 = \"c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap_lex/1.1.0/download\"],\n strip_prefix = \"clap_lex-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.clap_lex-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clap_mangen-0.2.33\",\n sha256 = \"7e30ffc187e2e3aeafcd1c6e2aa416e29739454c0ccaa419226d5ecd181f2d78\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap_mangen/0.2.33/download\"],\n strip_prefix = \"clap_mangen-0.2.33\",\n build_file = Label(\"@crates//crates:BUILD.clap_mangen-0.2.33.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cmake-0.1.58\",\n sha256 = \"c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cmake/0.1.58/download\"],\n strip_prefix = \"cmake-0.1.58\",\n build_file = Label(\"@crates//crates:BUILD.cmake-0.1.58.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__colorchoice-1.0.5\",\n sha256 = \"1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/colorchoice/1.0.5/download\"],\n strip_prefix = \"colorchoice-1.0.5\",\n build_file = Label(\"@crates//crates:BUILD.colorchoice-1.0.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__combine-4.6.7\",\n sha256 = \"ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/combine/4.6.7/download\"],\n strip_prefix = \"combine-4.6.7\",\n build_file = Label(\"@crates//crates:BUILD.combine-4.6.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__console-0.16.3\",\n sha256 = \"d64e8af5551369d19cf50138de61f1c42074ab970f74e99be916646777f8fc87\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/console/0.16.3/download\"],\n strip_prefix = \"console-0.16.3\",\n build_file = Label(\"@crates//crates:BUILD.console-0.16.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__core-foundation-0.10.1\",\n sha256 = \"b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/core-foundation/0.10.1/download\"],\n strip_prefix = \"core-foundation-0.10.1\",\n build_file = Label(\"@crates//crates:BUILD.core-foundation-0.10.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__core-foundation-0.9.4\",\n sha256 = \"91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/core-foundation/0.9.4/download\"],\n strip_prefix = \"core-foundation-0.9.4\",\n build_file = Label(\"@crates//crates:BUILD.core-foundation-0.9.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__core-foundation-sys-0.8.7\",\n sha256 = \"773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/core-foundation-sys/0.8.7/download\"],\n strip_prefix = \"core-foundation-sys-0.8.7\",\n build_file = Label(\"@crates//crates:BUILD.core-foundation-sys-0.8.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__csv-1.4.0\",\n sha256 = \"52cd9d68cf7efc6ddfaaee42e7288d3a99d613d4b50f76ce9827ae0c6e14f938\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/csv/1.4.0/download\"],\n strip_prefix = \"csv-1.4.0\",\n build_file = Label(\"@crates//crates:BUILD.csv-1.4.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__csv-core-0.1.13\",\n sha256 = \"704a3c26996a80471189265814dbc2c257598b96b8a7feae2d31ace646bb9782\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/csv-core/0.1.13/download\"],\n strip_prefix = \"csv-core-0.1.13\",\n build_file = Label(\"@crates//crates:BUILD.csv-core-0.1.13.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__displaydoc-0.2.6\",\n sha256 = \"1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/displaydoc/0.2.6/download\"],\n strip_prefix = \"displaydoc-0.2.6\",\n build_file = Label(\"@crates//crates:BUILD.displaydoc-0.2.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__dunce-1.0.5\",\n sha256 = \"92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/dunce/1.0.5/download\"],\n strip_prefix = \"dunce-1.0.5\",\n build_file = Label(\"@crates//crates:BUILD.dunce-1.0.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__encode_unicode-1.0.0\",\n sha256 = \"34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/encode_unicode/1.0.0/download\"],\n strip_prefix = \"encode_unicode-1.0.0\",\n build_file = Label(\"@crates//crates:BUILD.encode_unicode-1.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__encoding_rs-0.8.35\",\n sha256 = \"75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/encoding_rs/0.8.35/download\"],\n strip_prefix = \"encoding_rs-0.8.35\",\n build_file = Label(\"@crates//crates:BUILD.encoding_rs-0.8.35.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__equivalent-1.0.2\",\n sha256 = \"877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/equivalent/1.0.2/download\"],\n strip_prefix = \"equivalent-1.0.2\",\n build_file = Label(\"@crates//crates:BUILD.equivalent-1.0.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__errno-0.3.14\",\n sha256 = \"39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/errno/0.3.14/download\"],\n strip_prefix = \"errno-0.3.14\",\n build_file = Label(\"@crates//crates:BUILD.errno-0.3.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fastrand-2.4.1\",\n sha256 = \"9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fastrand/2.4.1/download\"],\n strip_prefix = \"fastrand-2.4.1\",\n build_file = Label(\"@crates//crates:BUILD.fastrand-2.4.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__find-msvc-tools-0.1.9\",\n sha256 = \"5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/find-msvc-tools/0.1.9/download\"],\n strip_prefix = \"find-msvc-tools-0.1.9\",\n build_file = Label(\"@crates//crates:BUILD.find-msvc-tools-0.1.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fnv-1.0.7\",\n sha256 = \"3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fnv/1.0.7/download\"],\n strip_prefix = \"fnv-1.0.7\",\n build_file = Label(\"@crates//crates:BUILD.fnv-1.0.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__foldhash-0.1.5\",\n sha256 = \"d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/foldhash/0.1.5/download\"],\n strip_prefix = \"foldhash-0.1.5\",\n build_file = Label(\"@crates//crates:BUILD.foldhash-0.1.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__form_urlencoded-1.2.2\",\n sha256 = \"cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/form_urlencoded/1.2.2/download\"],\n strip_prefix = \"form_urlencoded-1.2.2\",\n build_file = Label(\"@crates//crates:BUILD.form_urlencoded-1.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fs_extra-1.3.0\",\n sha256 = \"42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fs_extra/1.3.0/download\"],\n strip_prefix = \"fs_extra-1.3.0\",\n build_file = Label(\"@crates//crates:BUILD.fs_extra-1.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-channel-0.3.32\",\n sha256 = \"07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-channel/0.3.32/download\"],\n strip_prefix = \"futures-channel-0.3.32\",\n build_file = Label(\"@crates//crates:BUILD.futures-channel-0.3.32.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-core-0.3.32\",\n sha256 = \"7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-core/0.3.32/download\"],\n strip_prefix = \"futures-core-0.3.32\",\n build_file = Label(\"@crates//crates:BUILD.futures-core-0.3.32.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-io-0.3.32\",\n sha256 = \"cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-io/0.3.32/download\"],\n strip_prefix = \"futures-io-0.3.32\",\n build_file = Label(\"@crates//crates:BUILD.futures-io-0.3.32.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-sink-0.3.32\",\n sha256 = \"c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-sink/0.3.32/download\"],\n strip_prefix = \"futures-sink-0.3.32\",\n build_file = Label(\"@crates//crates:BUILD.futures-sink-0.3.32.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-task-0.3.32\",\n sha256 = \"037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-task/0.3.32/download\"],\n strip_prefix = \"futures-task-0.3.32\",\n build_file = Label(\"@crates//crates:BUILD.futures-task-0.3.32.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-util-0.3.32\",\n sha256 = \"389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-util/0.3.32/download\"],\n strip_prefix = \"futures-util-0.3.32\",\n build_file = Label(\"@crates//crates:BUILD.futures-util-0.3.32.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__getrandom-0.2.17\",\n sha256 = \"ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/getrandom/0.2.17/download\"],\n strip_prefix = \"getrandom-0.2.17\",\n build_file = Label(\"@crates//crates:BUILD.getrandom-0.2.17.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__getrandom-0.3.4\",\n sha256 = \"899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/getrandom/0.3.4/download\"],\n strip_prefix = \"getrandom-0.3.4\",\n build_file = Label(\"@crates//crates:BUILD.getrandom-0.3.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__getrandom-0.4.2\",\n sha256 = \"0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/getrandom/0.4.2/download\"],\n strip_prefix = \"getrandom-0.4.2\",\n build_file = Label(\"@crates//crates:BUILD.getrandom-0.4.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__h2-0.4.14\",\n sha256 = \"171fefbc92fe4a4de27e0698d6a5b392d6a0e333506bc49133760b3bcf948733\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/h2/0.4.14/download\"],\n strip_prefix = \"h2-0.4.14\",\n build_file = Label(\"@crates//crates:BUILD.h2-0.4.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hashbrown-0.15.5\",\n sha256 = \"9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hashbrown/0.15.5/download\"],\n strip_prefix = \"hashbrown-0.15.5\",\n build_file = Label(\"@crates//crates:BUILD.hashbrown-0.15.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hashbrown-0.17.1\",\n sha256 = \"ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hashbrown/0.17.1/download\"],\n strip_prefix = \"hashbrown-0.17.1\",\n build_file = Label(\"@crates//crates:BUILD.hashbrown-0.17.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__heck-0.5.0\",\n sha256 = \"2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/heck/0.5.0/download\"],\n strip_prefix = \"heck-0.5.0\",\n build_file = Label(\"@crates//crates:BUILD.heck-0.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__http-1.4.2\",\n sha256 = \"6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/http/1.4.2/download\"],\n strip_prefix = \"http-1.4.2\",\n build_file = Label(\"@crates//crates:BUILD.http-1.4.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__http-body-1.0.1\",\n sha256 = \"1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/http-body/1.0.1/download\"],\n strip_prefix = \"http-body-1.0.1\",\n build_file = Label(\"@crates//crates:BUILD.http-body-1.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__http-body-util-0.1.3\",\n sha256 = \"b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/http-body-util/0.1.3/download\"],\n strip_prefix = \"http-body-util-0.1.3\",\n build_file = Label(\"@crates//crates:BUILD.http-body-util-0.1.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__httparse-1.10.1\",\n sha256 = \"6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/httparse/1.10.1/download\"],\n strip_prefix = \"httparse-1.10.1\",\n build_file = Label(\"@crates//crates:BUILD.httparse-1.10.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hyper-1.10.1\",\n sha256 = \"55281c53a1894c864990125767da440a4e630446785086f52523b20033b74498\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hyper/1.10.1/download\"],\n strip_prefix = \"hyper-1.10.1\",\n build_file = Label(\"@crates//crates:BUILD.hyper-1.10.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hyper-rustls-0.27.9\",\n sha256 = \"33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hyper-rustls/0.27.9/download\"],\n strip_prefix = \"hyper-rustls-0.27.9\",\n build_file = Label(\"@crates//crates:BUILD.hyper-rustls-0.27.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hyper-util-0.1.20\",\n sha256 = \"96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hyper-util/0.1.20/download\"],\n strip_prefix = \"hyper-util-0.1.20\",\n build_file = Label(\"@crates//crates:BUILD.hyper-util-0.1.20.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_collections-2.2.0\",\n sha256 = \"2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_collections/2.2.0/download\"],\n strip_prefix = \"icu_collections-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_collections-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_locale_core-2.2.0\",\n sha256 = \"92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_locale_core/2.2.0/download\"],\n strip_prefix = \"icu_locale_core-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_locale_core-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_normalizer-2.2.0\",\n sha256 = \"c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_normalizer/2.2.0/download\"],\n strip_prefix = \"icu_normalizer-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_normalizer-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_normalizer_data-2.2.0\",\n sha256 = \"da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_normalizer_data/2.2.0/download\"],\n strip_prefix = \"icu_normalizer_data-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_normalizer_data-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_properties-2.2.0\",\n sha256 = \"bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_properties/2.2.0/download\"],\n strip_prefix = \"icu_properties-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_properties-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_properties_data-2.2.0\",\n sha256 = \"8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_properties_data/2.2.0/download\"],\n strip_prefix = \"icu_properties_data-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_properties_data-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_provider-2.2.0\",\n sha256 = \"139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_provider/2.2.0/download\"],\n strip_prefix = \"icu_provider-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_provider-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__id-arena-2.3.0\",\n sha256 = \"3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/id-arena/2.3.0/download\"],\n strip_prefix = \"id-arena-2.3.0\",\n build_file = Label(\"@crates//crates:BUILD.id-arena-2.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__idna-1.1.0\",\n sha256 = \"3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/idna/1.1.0/download\"],\n strip_prefix = \"idna-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.idna-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__idna_adapter-1.2.2\",\n sha256 = \"cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/idna_adapter/1.2.2/download\"],\n strip_prefix = \"idna_adapter-1.2.2\",\n build_file = Label(\"@crates//crates:BUILD.idna_adapter-1.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__indexmap-2.14.0\",\n sha256 = \"d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/indexmap/2.14.0/download\"],\n strip_prefix = \"indexmap-2.14.0\",\n build_file = Label(\"@crates//crates:BUILD.indexmap-2.14.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ipnet-2.12.0\",\n sha256 = \"d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ipnet/2.12.0/download\"],\n strip_prefix = \"ipnet-2.12.0\",\n build_file = Label(\"@crates//crates:BUILD.ipnet-2.12.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__is_terminal_polyfill-1.70.2\",\n sha256 = \"a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/is_terminal_polyfill/1.70.2/download\"],\n strip_prefix = \"is_terminal_polyfill-1.70.2\",\n build_file = Label(\"@crates//crates:BUILD.is_terminal_polyfill-1.70.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__itoa-1.0.18\",\n sha256 = \"8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/itoa/1.0.18/download\"],\n strip_prefix = \"itoa-1.0.18\",\n build_file = Label(\"@crates//crates:BUILD.itoa-1.0.18.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jni-0.22.4\",\n sha256 = \"5efd9a482cf3a427f00d6b35f14332adc7902ce91efb778580e180ff90fa3498\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jni/0.22.4/download\"],\n strip_prefix = \"jni-0.22.4\",\n build_file = Label(\"@crates//crates:BUILD.jni-0.22.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jni-macros-0.22.4\",\n sha256 = \"a00109accc170f0bdb141fed3e393c565b6f5e072365c3bd58f5b062591560a3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jni-macros/0.22.4/download\"],\n strip_prefix = \"jni-macros-0.22.4\",\n build_file = Label(\"@crates//crates:BUILD.jni-macros-0.22.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jni-sys-0.4.1\",\n sha256 = \"c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jni-sys/0.4.1/download\"],\n strip_prefix = \"jni-sys-0.4.1\",\n build_file = Label(\"@crates//crates:BUILD.jni-sys-0.4.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jni-sys-macros-0.4.1\",\n sha256 = \"38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jni-sys-macros/0.4.1/download\"],\n strip_prefix = \"jni-sys-macros-0.4.1\",\n build_file = Label(\"@crates//crates:BUILD.jni-sys-macros-0.4.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jobserver-0.1.34\",\n sha256 = \"9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jobserver/0.1.34/download\"],\n strip_prefix = \"jobserver-0.1.34\",\n build_file = Label(\"@crates//crates:BUILD.jobserver-0.1.34.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__js-sys-0.3.102\",\n sha256 = \"03d04c30968dffe80775bd4d7fb676131cd04a1fb46d2686dbffbaec2d9dfd31\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/js-sys/0.3.102/download\"],\n strip_prefix = \"js-sys-0.3.102\",\n build_file = Label(\"@crates//crates:BUILD.js-sys-0.3.102.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__leb128fmt-0.1.0\",\n sha256 = \"09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/leb128fmt/0.1.0/download\"],\n strip_prefix = \"leb128fmt-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.leb128fmt-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__libc-0.2.186\",\n sha256 = \"68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/libc/0.2.186/download\"],\n strip_prefix = \"libc-0.2.186\",\n build_file = Label(\"@crates//crates:BUILD.libc-0.2.186.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__linux-raw-sys-0.12.1\",\n sha256 = \"32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/linux-raw-sys/0.12.1/download\"],\n strip_prefix = \"linux-raw-sys-0.12.1\",\n build_file = Label(\"@crates//crates:BUILD.linux-raw-sys-0.12.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__litemap-0.8.2\",\n sha256 = \"92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/litemap/0.8.2/download\"],\n strip_prefix = \"litemap-0.8.2\",\n build_file = Label(\"@crates//crates:BUILD.litemap-0.8.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__log-0.4.32\",\n sha256 = \"953f07c43838f8e6f9758cab68bf5bed85465e7587ebe0b823f1bcd81978ad3a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/log/0.4.32/download\"],\n strip_prefix = \"log-0.4.32\",\n build_file = Label(\"@crates//crates:BUILD.log-0.4.32.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__lru-slab-0.1.2\",\n sha256 = \"112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/lru-slab/0.1.2/download\"],\n strip_prefix = \"lru-slab-0.1.2\",\n build_file = Label(\"@crates//crates:BUILD.lru-slab-0.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__memchr-2.8.2\",\n sha256 = \"88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/memchr/2.8.2/download\"],\n strip_prefix = \"memchr-2.8.2\",\n build_file = Label(\"@crates//crates:BUILD.memchr-2.8.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__mime-0.3.17\",\n sha256 = \"6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/mime/0.3.17/download\"],\n strip_prefix = \"mime-0.3.17\",\n build_file = Label(\"@crates//crates:BUILD.mime-0.3.17.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__mio-1.2.1\",\n sha256 = \"02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fda\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/mio/1.2.1/download\"],\n strip_prefix = \"mio-1.2.1\",\n build_file = Label(\"@crates//crates:BUILD.mio-1.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__natord-1.0.9\",\n sha256 = \"308d96db8debc727c3fd9744aac51751243420e46edf401010908da7f8d5e57c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/natord/1.0.9/download\"],\n strip_prefix = \"natord-1.0.9\",\n build_file = Label(\"@crates//crates:BUILD.natord-1.0.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__once_cell-1.21.4\",\n sha256 = \"9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/once_cell/1.21.4/download\"],\n strip_prefix = \"once_cell-1.21.4\",\n build_file = Label(\"@crates//crates:BUILD.once_cell-1.21.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__once_cell_polyfill-1.70.2\",\n sha256 = \"384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/once_cell_polyfill/1.70.2/download\"],\n strip_prefix = \"once_cell_polyfill-1.70.2\",\n build_file = Label(\"@crates//crates:BUILD.once_cell_polyfill-1.70.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__openssl-probe-0.2.1\",\n sha256 = \"7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/openssl-probe/0.2.1/download\"],\n strip_prefix = \"openssl-probe-0.2.1\",\n build_file = Label(\"@crates//crates:BUILD.openssl-probe-0.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__percent-encoding-2.3.2\",\n sha256 = \"9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/percent-encoding/2.3.2/download\"],\n strip_prefix = \"percent-encoding-2.3.2\",\n build_file = Label(\"@crates//crates:BUILD.percent-encoding-2.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pin-project-lite-0.2.17\",\n sha256 = \"a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pin-project-lite/0.2.17/download\"],\n strip_prefix = \"pin-project-lite-0.2.17\",\n build_file = Label(\"@crates//crates:BUILD.pin-project-lite-0.2.17.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__potential_utf-0.1.5\",\n sha256 = \"0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/potential_utf/0.1.5/download\"],\n strip_prefix = \"potential_utf-0.1.5\",\n build_file = Label(\"@crates//crates:BUILD.potential_utf-0.1.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ppv-lite86-0.2.21\",\n sha256 = \"85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ppv-lite86/0.2.21/download\"],\n strip_prefix = \"ppv-lite86-0.2.21\",\n build_file = Label(\"@crates//crates:BUILD.ppv-lite86-0.2.21.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__prettyplease-0.2.37\",\n sha256 = \"479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/prettyplease/0.2.37/download\"],\n strip_prefix = \"prettyplease-0.2.37\",\n build_file = Label(\"@crates//crates:BUILD.prettyplease-0.2.37.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__proc-macro2-1.0.106\",\n sha256 = \"8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/proc-macro2/1.0.106/download\"],\n strip_prefix = \"proc-macro2-1.0.106\",\n build_file = Label(\"@crates//crates:BUILD.proc-macro2-1.0.106.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__quinn-0.11.9\",\n sha256 = \"b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/quinn/0.11.9/download\"],\n strip_prefix = \"quinn-0.11.9\",\n build_file = Label(\"@crates//crates:BUILD.quinn-0.11.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__quinn-proto-0.11.14\",\n sha256 = \"434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/quinn-proto/0.11.14/download\"],\n strip_prefix = \"quinn-proto-0.11.14\",\n build_file = Label(\"@crates//crates:BUILD.quinn-proto-0.11.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__quinn-udp-0.5.14\",\n sha256 = \"addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/quinn-udp/0.5.14/download\"],\n strip_prefix = \"quinn-udp-0.5.14\",\n build_file = Label(\"@crates//crates:BUILD.quinn-udp-0.5.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__quote-1.0.45\",\n sha256 = \"41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/quote/1.0.45/download\"],\n strip_prefix = \"quote-1.0.45\",\n build_file = Label(\"@crates//crates:BUILD.quote-1.0.45.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__r-efi-5.3.0\",\n sha256 = \"69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/r-efi/5.3.0/download\"],\n strip_prefix = \"r-efi-5.3.0\",\n build_file = Label(\"@crates//crates:BUILD.r-efi-5.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__r-efi-6.0.0\",\n sha256 = \"f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/r-efi/6.0.0/download\"],\n strip_prefix = \"r-efi-6.0.0\",\n build_file = Label(\"@crates//crates:BUILD.r-efi-6.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rand-0.9.4\",\n sha256 = \"44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rand/0.9.4/download\"],\n strip_prefix = \"rand-0.9.4\",\n build_file = Label(\"@crates//crates:BUILD.rand-0.9.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rand_chacha-0.9.0\",\n sha256 = \"d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rand_chacha/0.9.0/download\"],\n strip_prefix = \"rand_chacha-0.9.0\",\n build_file = Label(\"@crates//crates:BUILD.rand_chacha-0.9.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rand_core-0.9.5\",\n sha256 = \"76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rand_core/0.9.5/download\"],\n strip_prefix = \"rand_core-0.9.5\",\n build_file = Label(\"@crates//crates:BUILD.rand_core-0.9.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__reqwest-0.13.4\",\n sha256 = \"219c5811de6525e5416c7d5d53bb656d3afdbc6c5af816e0802bcfa42dbdc1c3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/reqwest/0.13.4/download\"],\n strip_prefix = \"reqwest-0.13.4\",\n build_file = Label(\"@crates//crates:BUILD.reqwest-0.13.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ring-0.17.14\",\n sha256 = \"a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ring/0.17.14/download\"],\n strip_prefix = \"ring-0.17.14\",\n build_file = Label(\"@crates//crates:BUILD.ring-0.17.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__roff-1.1.1\",\n sha256 = \"323c417e1d9665a65b263ec744ba09030cfb277e9daa0b018a4ab62e57bc8189\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/roff/1.1.1/download\"],\n strip_prefix = \"roff-1.1.1\",\n build_file = Label(\"@crates//crates:BUILD.roff-1.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustc-hash-2.1.2\",\n sha256 = \"94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustc-hash/2.1.2/download\"],\n strip_prefix = \"rustc-hash-2.1.2\",\n build_file = Label(\"@crates//crates:BUILD.rustc-hash-2.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustc_version-0.4.1\",\n sha256 = \"cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustc_version/0.4.1/download\"],\n strip_prefix = \"rustc_version-0.4.1\",\n build_file = Label(\"@crates//crates:BUILD.rustc_version-0.4.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustix-1.1.4\",\n sha256 = \"b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustix/1.1.4/download\"],\n strip_prefix = \"rustix-1.1.4\",\n build_file = Label(\"@crates//crates:BUILD.rustix-1.1.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustls-0.23.40\",\n sha256 = \"ef86cd5876211988985292b91c96a8f2d298df24e75989a43a3c73f2d4d8168b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustls/0.23.40/download\"],\n strip_prefix = \"rustls-0.23.40\",\n build_file = Label(\"@crates//crates:BUILD.rustls-0.23.40.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustls-native-certs-0.8.4\",\n sha256 = \"dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustls-native-certs/0.8.4/download\"],\n strip_prefix = \"rustls-native-certs-0.8.4\",\n build_file = Label(\"@crates//crates:BUILD.rustls-native-certs-0.8.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustls-pki-types-1.14.1\",\n sha256 = \"30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustls-pki-types/1.14.1/download\"],\n strip_prefix = \"rustls-pki-types-1.14.1\",\n build_file = Label(\"@crates//crates:BUILD.rustls-pki-types-1.14.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustls-platform-verifier-0.7.0\",\n sha256 = \"26d1e2536ce4f35f4846aa13bff16bd0ff40157cdb14cc056c7b14ba41233ba0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustls-platform-verifier/0.7.0/download\"],\n strip_prefix = \"rustls-platform-verifier-0.7.0\",\n build_file = Label(\"@crates//crates:BUILD.rustls-platform-verifier-0.7.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustls-platform-verifier-android-0.1.1\",\n sha256 = \"f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustls-platform-verifier-android/0.1.1/download\"],\n strip_prefix = \"rustls-platform-verifier-android-0.1.1\",\n build_file = Label(\"@crates//crates:BUILD.rustls-platform-verifier-android-0.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustls-webpki-0.103.13\",\n sha256 = \"61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustls-webpki/0.103.13/download\"],\n strip_prefix = \"rustls-webpki-0.103.13\",\n build_file = Label(\"@crates//crates:BUILD.rustls-webpki-0.103.13.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustversion-1.0.22\",\n sha256 = \"b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustversion/1.0.22/download\"],\n strip_prefix = \"rustversion-1.0.22\",\n build_file = Label(\"@crates//crates:BUILD.rustversion-1.0.22.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ryu-1.0.23\",\n sha256 = \"9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ryu/1.0.23/download\"],\n strip_prefix = \"ryu-1.0.23\",\n build_file = Label(\"@crates//crates:BUILD.ryu-1.0.23.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__same-file-1.0.6\",\n sha256 = \"93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/same-file/1.0.6/download\"],\n strip_prefix = \"same-file-1.0.6\",\n build_file = Label(\"@crates//crates:BUILD.same-file-1.0.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__schannel-0.1.29\",\n sha256 = \"91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/schannel/0.1.29/download\"],\n strip_prefix = \"schannel-0.1.29\",\n build_file = Label(\"@crates//crates:BUILD.schannel-0.1.29.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__security-framework-3.7.0\",\n sha256 = \"b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/security-framework/3.7.0/download\"],\n strip_prefix = \"security-framework-3.7.0\",\n build_file = Label(\"@crates//crates:BUILD.security-framework-3.7.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__security-framework-sys-2.17.0\",\n sha256 = \"6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/security-framework-sys/2.17.0/download\"],\n strip_prefix = \"security-framework-sys-2.17.0\",\n build_file = Label(\"@crates//crates:BUILD.security-framework-sys-2.17.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__semver-1.0.28\",\n sha256 = \"8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/semver/1.0.28/download\"],\n strip_prefix = \"semver-1.0.28\",\n build_file = Label(\"@crates//crates:BUILD.semver-1.0.28.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde-1.0.228\",\n sha256 = \"9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde/1.0.228/download\"],\n strip_prefix = \"serde-1.0.228\",\n build_file = Label(\"@crates//crates:BUILD.serde-1.0.228.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_core-1.0.228\",\n sha256 = \"41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_core/1.0.228/download\"],\n strip_prefix = \"serde_core-1.0.228\",\n build_file = Label(\"@crates//crates:BUILD.serde_core-1.0.228.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_derive-1.0.228\",\n sha256 = \"d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_derive/1.0.228/download\"],\n strip_prefix = \"serde_derive-1.0.228\",\n build_file = Label(\"@crates//crates:BUILD.serde_derive-1.0.228.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_json-1.0.150\",\n sha256 = \"e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_json/1.0.150/download\"],\n strip_prefix = \"serde_json-1.0.150\",\n build_file = Label(\"@crates//crates:BUILD.serde_json-1.0.150.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__shlex-2.0.1\",\n sha256 = \"f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/shlex/2.0.1/download\"],\n strip_prefix = \"shlex-2.0.1\",\n build_file = Label(\"@crates//crates:BUILD.shlex-2.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__simd_cesu8-1.1.1\",\n sha256 = \"94f90157bb87cddf702797c5dadfa0be7d266cdf49e22da2fcaa32eff75b2c33\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/simd_cesu8/1.1.1/download\"],\n strip_prefix = \"simd_cesu8-1.1.1\",\n build_file = Label(\"@crates//crates:BUILD.simd_cesu8-1.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__simdutf8-0.1.5\",\n sha256 = \"e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/simdutf8/0.1.5/download\"],\n strip_prefix = \"simdutf8-0.1.5\",\n build_file = Label(\"@crates//crates:BUILD.simdutf8-0.1.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__similar-3.1.1\",\n sha256 = \"e6505efef05804732ed8a3f2d4f279429eb485bd69d5b0cc6b19cc02005cda16\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/similar/3.1.1/download\"],\n strip_prefix = \"similar-3.1.1\",\n build_file = Label(\"@crates//crates:BUILD.similar-3.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__slab-0.4.12\",\n sha256 = \"0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/slab/0.4.12/download\"],\n strip_prefix = \"slab-0.4.12\",\n build_file = Label(\"@crates//crates:BUILD.slab-0.4.12.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__smallvec-1.15.2\",\n sha256 = \"8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/smallvec/1.15.2/download\"],\n strip_prefix = \"smallvec-1.15.2\",\n build_file = Label(\"@crates//crates:BUILD.smallvec-1.15.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__socket2-0.6.4\",\n sha256 = \"52d1cfed4120b4d927bf7c0f86d2087a4a7d6027c906d9f9d525a80573b9be51\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/socket2/0.6.4/download\"],\n strip_prefix = \"socket2-0.6.4\",\n build_file = Label(\"@crates//crates:BUILD.socket2-0.6.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__stable_deref_trait-1.2.1\",\n sha256 = \"6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/stable_deref_trait/1.2.1/download\"],\n strip_prefix = \"stable_deref_trait-1.2.1\",\n build_file = Label(\"@crates//crates:BUILD.stable_deref_trait-1.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__strsim-0.11.1\",\n sha256 = \"7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/strsim/0.11.1/download\"],\n strip_prefix = \"strsim-0.11.1\",\n build_file = Label(\"@crates//crates:BUILD.strsim-0.11.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__subtle-2.6.1\",\n sha256 = \"13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/subtle/2.6.1/download\"],\n strip_prefix = \"subtle-2.6.1\",\n build_file = Label(\"@crates//crates:BUILD.subtle-2.6.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__syn-2.0.117\",\n sha256 = \"e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/syn/2.0.117/download\"],\n strip_prefix = \"syn-2.0.117\",\n build_file = Label(\"@crates//crates:BUILD.syn-2.0.117.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__sync_wrapper-1.0.2\",\n sha256 = \"0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/sync_wrapper/1.0.2/download\"],\n strip_prefix = \"sync_wrapper-1.0.2\",\n build_file = Label(\"@crates//crates:BUILD.sync_wrapper-1.0.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__synstructure-0.13.2\",\n sha256 = \"728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/synstructure/0.13.2/download\"],\n strip_prefix = \"synstructure-0.13.2\",\n build_file = Label(\"@crates//crates:BUILD.synstructure-0.13.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__system-configuration-0.7.0\",\n sha256 = \"a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/system-configuration/0.7.0/download\"],\n strip_prefix = \"system-configuration-0.7.0\",\n build_file = Label(\"@crates//crates:BUILD.system-configuration-0.7.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__system-configuration-sys-0.6.0\",\n sha256 = \"8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/system-configuration-sys/0.6.0/download\"],\n strip_prefix = \"system-configuration-sys-0.6.0\",\n build_file = Label(\"@crates//crates:BUILD.system-configuration-sys-0.6.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tempfile-3.27.0\",\n sha256 = \"32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tempfile/3.27.0/download\"],\n strip_prefix = \"tempfile-3.27.0\",\n build_file = Label(\"@crates//crates:BUILD.tempfile-3.27.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__thiserror-2.0.18\",\n sha256 = \"4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/thiserror/2.0.18/download\"],\n strip_prefix = \"thiserror-2.0.18\",\n build_file = Label(\"@crates//crates:BUILD.thiserror-2.0.18.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__thiserror-impl-2.0.18\",\n sha256 = \"ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/thiserror-impl/2.0.18/download\"],\n strip_prefix = \"thiserror-impl-2.0.18\",\n build_file = Label(\"@crates//crates:BUILD.thiserror-impl-2.0.18.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tinystr-0.8.3\",\n sha256 = \"c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tinystr/0.8.3/download\"],\n strip_prefix = \"tinystr-0.8.3\",\n build_file = Label(\"@crates//crates:BUILD.tinystr-0.8.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tinyvec-1.11.0\",\n sha256 = \"3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tinyvec/1.11.0/download\"],\n strip_prefix = \"tinyvec-1.11.0\",\n build_file = Label(\"@crates//crates:BUILD.tinyvec-1.11.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tinyvec_macros-0.1.1\",\n sha256 = \"1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tinyvec_macros/0.1.1/download\"],\n strip_prefix = \"tinyvec_macros-0.1.1\",\n build_file = Label(\"@crates//crates:BUILD.tinyvec_macros-0.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tokio-1.52.3\",\n sha256 = \"8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tokio/1.52.3/download\"],\n strip_prefix = \"tokio-1.52.3\",\n build_file = Label(\"@crates//crates:BUILD.tokio-1.52.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tokio-rustls-0.26.4\",\n sha256 = \"1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tokio-rustls/0.26.4/download\"],\n strip_prefix = \"tokio-rustls-0.26.4\",\n build_file = Label(\"@crates//crates:BUILD.tokio-rustls-0.26.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tokio-util-0.7.18\",\n sha256 = \"9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tokio-util/0.7.18/download\"],\n strip_prefix = \"tokio-util-0.7.18\",\n build_file = Label(\"@crates//crates:BUILD.tokio-util-0.7.18.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tower-0.5.3\",\n sha256 = \"ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tower/0.5.3/download\"],\n strip_prefix = \"tower-0.5.3\",\n build_file = Label(\"@crates//crates:BUILD.tower-0.5.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tower-http-0.6.11\",\n sha256 = \"4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tower-http/0.6.11/download\"],\n strip_prefix = \"tower-http-0.6.11\",\n build_file = Label(\"@crates//crates:BUILD.tower-http-0.6.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tower-layer-0.3.3\",\n sha256 = \"121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tower-layer/0.3.3/download\"],\n strip_prefix = \"tower-layer-0.3.3\",\n build_file = Label(\"@crates//crates:BUILD.tower-layer-0.3.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tower-service-0.3.3\",\n sha256 = \"8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tower-service/0.3.3/download\"],\n strip_prefix = \"tower-service-0.3.3\",\n build_file = Label(\"@crates//crates:BUILD.tower-service-0.3.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tracing-0.1.44\",\n sha256 = \"63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tracing/0.1.44/download\"],\n strip_prefix = \"tracing-0.1.44\",\n build_file = Label(\"@crates//crates:BUILD.tracing-0.1.44.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tracing-core-0.1.36\",\n sha256 = \"db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tracing-core/0.1.36/download\"],\n strip_prefix = \"tracing-core-0.1.36\",\n build_file = Label(\"@crates//crates:BUILD.tracing-core-0.1.36.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__try-lock-0.2.5\",\n sha256 = \"e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/try-lock/0.2.5/download\"],\n strip_prefix = \"try-lock-0.2.5\",\n build_file = Label(\"@crates//crates:BUILD.try-lock-0.2.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__unicode-ident-1.0.24\",\n sha256 = \"e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/unicode-ident/1.0.24/download\"],\n strip_prefix = \"unicode-ident-1.0.24\",\n build_file = Label(\"@crates//crates:BUILD.unicode-ident-1.0.24.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__unicode-width-0.2.2\",\n sha256 = \"b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/unicode-width/0.2.2/download\"],\n strip_prefix = \"unicode-width-0.2.2\",\n build_file = Label(\"@crates//crates:BUILD.unicode-width-0.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__unicode-xid-0.2.6\",\n sha256 = \"ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/unicode-xid/0.2.6/download\"],\n strip_prefix = \"unicode-xid-0.2.6\",\n build_file = Label(\"@crates//crates:BUILD.unicode-xid-0.2.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__untrusted-0.9.0\",\n sha256 = \"8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/untrusted/0.9.0/download\"],\n strip_prefix = \"untrusted-0.9.0\",\n build_file = Label(\"@crates//crates:BUILD.untrusted-0.9.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__url-2.5.8\",\n sha256 = \"ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/url/2.5.8/download\"],\n strip_prefix = \"url-2.5.8\",\n build_file = Label(\"@crates//crates:BUILD.url-2.5.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__utf8_iter-1.0.4\",\n sha256 = \"b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/utf8_iter/1.0.4/download\"],\n strip_prefix = \"utf8_iter-1.0.4\",\n build_file = Label(\"@crates//crates:BUILD.utf8_iter-1.0.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__utf8parse-0.2.2\",\n sha256 = \"06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/utf8parse/0.2.2/download\"],\n strip_prefix = \"utf8parse-0.2.2\",\n build_file = Label(\"@crates//crates:BUILD.utf8parse-0.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__walkdir-2.5.0\",\n sha256 = \"29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/walkdir/2.5.0/download\"],\n strip_prefix = \"walkdir-2.5.0\",\n build_file = Label(\"@crates//crates:BUILD.walkdir-2.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__want-0.3.1\",\n sha256 = \"bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/want/0.3.1/download\"],\n strip_prefix = \"want-0.3.1\",\n build_file = Label(\"@crates//crates:BUILD.want-0.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasi-0.11.1-wasi-snapshot-preview1\",\n sha256 = \"ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasi/0.11.1+wasi-snapshot-preview1/download\"],\n strip_prefix = \"wasi-0.11.1+wasi-snapshot-preview1\",\n build_file = Label(\"@crates//crates:BUILD.wasi-0.11.1+wasi-snapshot-preview1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasip2-1.0.4-wasi-0.2.12\",\n sha256 = \"b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasip2/1.0.4+wasi-0.2.12/download\"],\n strip_prefix = \"wasip2-1.0.4+wasi-0.2.12\",\n build_file = Label(\"@crates//crates:BUILD.wasip2-1.0.4+wasi-0.2.12.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasip3-0.4.0-wasi-0.3.0-rc-2026-01-06\",\n sha256 = \"5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasip3/0.4.0+wasi-0.3.0-rc-2026-01-06/download\"],\n strip_prefix = \"wasip3-0.4.0+wasi-0.3.0-rc-2026-01-06\",\n build_file = Label(\"@crates//crates:BUILD.wasip3-0.4.0+wasi-0.3.0-rc-2026-01-06.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-0.2.125\",\n sha256 = \"8ddb3f79143bced6de84270411622a2699cee572fc0875aeaf1e7867cf9fca1a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen/0.2.125/download\"],\n strip_prefix = \"wasm-bindgen-0.2.125\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-0.2.125.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-futures-0.4.75\",\n sha256 = \"503b14d284f2c8dac03b819967e155ea753f573586193b2b2c95990cb5d69280\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen-futures/0.4.75/download\"],\n strip_prefix = \"wasm-bindgen-futures-0.4.75\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-futures-0.4.75.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-macro-0.2.125\",\n sha256 = \"4e21a184b13fb19e157296e2c46056aec9092264fab83e4ba59e68c61b323c3d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen-macro/0.2.125/download\"],\n strip_prefix = \"wasm-bindgen-macro-0.2.125\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-macro-0.2.125.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-macro-support-0.2.125\",\n sha256 = \"fecefd9c35bd935a20fc3fc344b5f29138961e4f47fb03297d88f2587afb5ebd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen-macro-support/0.2.125/download\"],\n strip_prefix = \"wasm-bindgen-macro-support-0.2.125\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-macro-support-0.2.125.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-shared-0.2.125\",\n sha256 = \"23939e44bb9a5d7576fa2b563dc2e136628f1224e88a8deed09e04858b77871f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen-shared/0.2.125/download\"],\n strip_prefix = \"wasm-bindgen-shared-0.2.125\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-shared-0.2.125.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-encoder-0.244.0\",\n sha256 = \"990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-encoder/0.244.0/download\"],\n strip_prefix = \"wasm-encoder-0.244.0\",\n build_file = Label(\"@crates//crates:BUILD.wasm-encoder-0.244.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-metadata-0.244.0\",\n sha256 = \"bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-metadata/0.244.0/download\"],\n strip_prefix = \"wasm-metadata-0.244.0\",\n build_file = Label(\"@crates//crates:BUILD.wasm-metadata-0.244.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasmparser-0.244.0\",\n sha256 = \"47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasmparser/0.244.0/download\"],\n strip_prefix = \"wasmparser-0.244.0\",\n build_file = Label(\"@crates//crates:BUILD.wasmparser-0.244.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__web-sys-0.3.102\",\n sha256 = \"a6430a72df5eb332242960fe84b3002a241163998241eb596d4f739b9757061d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/web-sys/0.3.102/download\"],\n strip_prefix = \"web-sys-0.3.102\",\n build_file = Label(\"@crates//crates:BUILD.web-sys-0.3.102.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__web-time-1.1.0\",\n sha256 = \"5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/web-time/1.1.0/download\"],\n strip_prefix = \"web-time-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.web-time-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__webpki-root-certs-1.0.7\",\n sha256 = \"f31141ce3fc3e300ae89b78c0dd67f9708061d1d2eda54b8209346fd6be9a92c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/webpki-root-certs/1.0.7/download\"],\n strip_prefix = \"webpki-root-certs-1.0.7\",\n build_file = Label(\"@crates//crates:BUILD.webpki-root-certs-1.0.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__winapi-util-0.1.11\",\n sha256 = \"c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/winapi-util/0.1.11/download\"],\n strip_prefix = \"winapi-util-0.1.11\",\n build_file = Label(\"@crates//crates:BUILD.winapi-util-0.1.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-link-0.2.1\",\n sha256 = \"f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-link/0.2.1/download\"],\n strip_prefix = \"windows-link-0.2.1\",\n build_file = Label(\"@crates//crates:BUILD.windows-link-0.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-registry-0.6.1\",\n sha256 = \"02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-registry/0.6.1/download\"],\n strip_prefix = \"windows-registry-0.6.1\",\n build_file = Label(\"@crates//crates:BUILD.windows-registry-0.6.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-result-0.4.1\",\n sha256 = \"7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-result/0.4.1/download\"],\n strip_prefix = \"windows-result-0.4.1\",\n build_file = Label(\"@crates//crates:BUILD.windows-result-0.4.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-strings-0.5.1\",\n sha256 = \"7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-strings/0.5.1/download\"],\n strip_prefix = \"windows-strings-0.5.1\",\n build_file = Label(\"@crates//crates:BUILD.windows-strings-0.5.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-sys-0.52.0\",\n sha256 = \"282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-sys/0.52.0/download\"],\n strip_prefix = \"windows-sys-0.52.0\",\n build_file = Label(\"@crates//crates:BUILD.windows-sys-0.52.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-sys-0.60.2\",\n sha256 = \"f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-sys/0.60.2/download\"],\n strip_prefix = \"windows-sys-0.60.2\",\n build_file = Label(\"@crates//crates:BUILD.windows-sys-0.60.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-sys-0.61.2\",\n sha256 = \"ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-sys/0.61.2/download\"],\n strip_prefix = \"windows-sys-0.61.2\",\n build_file = Label(\"@crates//crates:BUILD.windows-sys-0.61.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-targets-0.52.6\",\n sha256 = \"9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-targets/0.52.6/download\"],\n strip_prefix = \"windows-targets-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows-targets-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-targets-0.53.5\",\n sha256 = \"4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-targets/0.53.5/download\"],\n strip_prefix = \"windows-targets-0.53.5\",\n build_file = Label(\"@crates//crates:BUILD.windows-targets-0.53.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_gnullvm-0.52.6\",\n sha256 = \"32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_gnullvm/0.52.6/download\"],\n strip_prefix = \"windows_aarch64_gnullvm-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_gnullvm-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_gnullvm-0.53.1\",\n sha256 = \"a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_gnullvm/0.53.1/download\"],\n strip_prefix = \"windows_aarch64_gnullvm-0.53.1\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_gnullvm-0.53.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_msvc-0.52.6\",\n sha256 = \"09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_msvc/0.52.6/download\"],\n strip_prefix = \"windows_aarch64_msvc-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_msvc-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_msvc-0.53.1\",\n sha256 = \"b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_msvc/0.53.1/download\"],\n strip_prefix = \"windows_aarch64_msvc-0.53.1\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_msvc-0.53.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnu-0.52.6\",\n sha256 = \"8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnu/0.52.6/download\"],\n strip_prefix = \"windows_i686_gnu-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnu-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnu-0.53.1\",\n sha256 = \"960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnu/0.53.1/download\"],\n strip_prefix = \"windows_i686_gnu-0.53.1\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnu-0.53.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnullvm-0.52.6\",\n sha256 = \"0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnullvm/0.52.6/download\"],\n strip_prefix = \"windows_i686_gnullvm-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnullvm-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnullvm-0.53.1\",\n sha256 = \"fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnullvm/0.53.1/download\"],\n strip_prefix = \"windows_i686_gnullvm-0.53.1\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnullvm-0.53.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_msvc-0.52.6\",\n sha256 = \"240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_msvc/0.52.6/download\"],\n strip_prefix = \"windows_i686_msvc-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_msvc-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_msvc-0.53.1\",\n sha256 = \"1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_msvc/0.53.1/download\"],\n strip_prefix = \"windows_i686_msvc-0.53.1\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_msvc-0.53.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnu-0.52.6\",\n sha256 = \"147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnu/0.52.6/download\"],\n strip_prefix = \"windows_x86_64_gnu-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnu-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnu-0.53.1\",\n sha256 = \"9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnu/0.53.1/download\"],\n strip_prefix = \"windows_x86_64_gnu-0.53.1\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnu-0.53.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnullvm-0.52.6\",\n sha256 = \"24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnullvm/0.52.6/download\"],\n strip_prefix = \"windows_x86_64_gnullvm-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnullvm-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnullvm-0.53.1\",\n sha256 = \"0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnullvm/0.53.1/download\"],\n strip_prefix = \"windows_x86_64_gnullvm-0.53.1\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnullvm-0.53.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_msvc-0.52.6\",\n sha256 = \"589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_msvc/0.52.6/download\"],\n strip_prefix = \"windows_x86_64_msvc-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_msvc-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_msvc-0.53.1\",\n sha256 = \"d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_msvc/0.53.1/download\"],\n strip_prefix = \"windows_x86_64_msvc-0.53.1\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_msvc-0.53.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wit-bindgen-0.51.0\",\n sha256 = \"d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wit-bindgen/0.51.0/download\"],\n strip_prefix = \"wit-bindgen-0.51.0\",\n build_file = Label(\"@crates//crates:BUILD.wit-bindgen-0.51.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wit-bindgen-0.57.1\",\n sha256 = \"1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wit-bindgen/0.57.1/download\"],\n strip_prefix = \"wit-bindgen-0.57.1\",\n build_file = Label(\"@crates//crates:BUILD.wit-bindgen-0.57.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wit-bindgen-core-0.51.0\",\n sha256 = \"ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wit-bindgen-core/0.51.0/download\"],\n strip_prefix = \"wit-bindgen-core-0.51.0\",\n build_file = Label(\"@crates//crates:BUILD.wit-bindgen-core-0.51.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wit-bindgen-rust-0.51.0\",\n sha256 = \"b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wit-bindgen-rust/0.51.0/download\"],\n strip_prefix = \"wit-bindgen-rust-0.51.0\",\n build_file = Label(\"@crates//crates:BUILD.wit-bindgen-rust-0.51.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wit-bindgen-rust-macro-0.51.0\",\n sha256 = \"0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wit-bindgen-rust-macro/0.51.0/download\"],\n strip_prefix = \"wit-bindgen-rust-macro-0.51.0\",\n build_file = Label(\"@crates//crates:BUILD.wit-bindgen-rust-macro-0.51.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wit-component-0.244.0\",\n sha256 = \"9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wit-component/0.244.0/download\"],\n strip_prefix = \"wit-component-0.244.0\",\n build_file = Label(\"@crates//crates:BUILD.wit-component-0.244.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wit-parser-0.244.0\",\n sha256 = \"ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wit-parser/0.244.0/download\"],\n strip_prefix = \"wit-parser-0.244.0\",\n build_file = Label(\"@crates//crates:BUILD.wit-parser-0.244.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__writeable-0.6.3\",\n sha256 = \"1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/writeable/0.6.3/download\"],\n strip_prefix = \"writeable-0.6.3\",\n build_file = Label(\"@crates//crates:BUILD.writeable-0.6.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__yoke-0.8.3\",\n sha256 = \"709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/yoke/0.8.3/download\"],\n strip_prefix = \"yoke-0.8.3\",\n build_file = Label(\"@crates//crates:BUILD.yoke-0.8.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__yoke-derive-0.8.2\",\n sha256 = \"de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/yoke-derive/0.8.2/download\"],\n strip_prefix = \"yoke-derive-0.8.2\",\n build_file = Label(\"@crates//crates:BUILD.yoke-derive-0.8.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerocopy-0.8.52\",\n sha256 = \"ce1022995ff5ff5d841ad7d994facc23098cd40152f2c1d11cd607c6f530653f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerocopy/0.8.52/download\"],\n strip_prefix = \"zerocopy-0.8.52\",\n build_file = Label(\"@crates//crates:BUILD.zerocopy-0.8.52.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerocopy-derive-0.8.52\",\n sha256 = \"1ae7f38b72ec2a254e2b87ef277cf2cd4fb97cbebf944faa6f33354da0867930\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerocopy-derive/0.8.52/download\"],\n strip_prefix = \"zerocopy-derive-0.8.52\",\n build_file = Label(\"@crates//crates:BUILD.zerocopy-derive-0.8.52.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerofrom-0.1.8\",\n sha256 = \"0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerofrom/0.1.8/download\"],\n strip_prefix = \"zerofrom-0.1.8\",\n build_file = Label(\"@crates//crates:BUILD.zerofrom-0.1.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerofrom-derive-0.1.7\",\n sha256 = \"11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerofrom-derive/0.1.7/download\"],\n strip_prefix = \"zerofrom-derive-0.1.7\",\n build_file = Label(\"@crates//crates:BUILD.zerofrom-derive-0.1.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zeroize-1.9.0\",\n sha256 = \"e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zeroize/1.9.0/download\"],\n strip_prefix = \"zeroize-1.9.0\",\n build_file = Label(\"@crates//crates:BUILD.zeroize-1.9.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerotrie-0.2.4\",\n sha256 = \"0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerotrie/0.2.4/download\"],\n strip_prefix = \"zerotrie-0.2.4\",\n build_file = Label(\"@crates//crates:BUILD.zerotrie-0.2.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerovec-0.11.6\",\n sha256 = \"90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerovec/0.11.6/download\"],\n strip_prefix = \"zerovec-0.11.6\",\n build_file = Label(\"@crates//crates:BUILD.zerovec-0.11.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerovec-derive-0.11.3\",\n sha256 = \"625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerovec-derive/0.11.3/download\"],\n strip_prefix = \"zerovec-derive-0.11.3\",\n build_file = Label(\"@crates//crates:BUILD.zerovec-derive-0.11.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zmij-1.0.21\",\n sha256 = \"b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zmij/1.0.21/download\"],\n strip_prefix = \"zmij-1.0.21\",\n build_file = Label(\"@crates//crates:BUILD.zmij-1.0.21.bazel\"),\n )\n\n return [\n struct(repo=\"crates__anyhow-1.0.102\", is_dev_dep = False),\n struct(repo=\"crates__clap-4.6.1\", is_dev_dep = False),\n struct(repo=\"crates__console-0.16.3\", is_dev_dep = False),\n struct(repo=\"crates__csv-1.4.0\", is_dev_dep = False),\n struct(repo=\"crates__natord-1.0.9\", is_dev_dep = False),\n struct(repo=\"crates__reqwest-0.13.4\", is_dev_dep = False),\n struct(repo=\"crates__serde-1.0.228\", is_dev_dep = False),\n struct(repo=\"crates__serde_json-1.0.150\", is_dev_dep = False),\n struct(repo=\"crates__similar-3.1.1\", is_dev_dep = False),\n struct(repo=\"crates__tempfile-3.27.0\", is_dev_dep = False),\n struct(repo = \"crates__clap_mangen-0.2.33\", is_dev_dep = True),\n ]\n" } } }, @@ -617,7 +617,7 @@ "https://static.crates.io/crates/clap/4.6.1/download" ], "strip_prefix": "clap-4.6.1", - "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'tools'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"clap\",\n deps = [\n \"@crates__clap_builder-4.6.0//:clap_builder\",\n ],\n proc_macro_deps = [\n \"@crates__clap_derive-4.6.1//:clap_derive\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"color\",\n \"default\",\n \"derive\",\n \"error-context\",\n \"help\",\n \"std\",\n \"suggestions\",\n \"usage\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2024\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=clap\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"4.6.1\",\n)\n" + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'tools'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"clap\",\n deps = [\n \"@crates__clap_builder-4.6.0//:clap_builder\",\n ],\n proc_macro_deps = [\n \"@crates__clap_derive-4.6.1//:clap_derive\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"color\",\n \"default\",\n \"derive\",\n \"env\",\n \"error-context\",\n \"help\",\n \"std\",\n \"suggestions\",\n \"usage\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2024\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=clap\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"4.6.1\",\n)\n" } }, "crates__clap_builder-4.6.0": { @@ -630,7 +630,7 @@ "https://static.crates.io/crates/clap_builder/4.6.0/download" ], "strip_prefix": "clap_builder-4.6.0", - "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'tools'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"clap_builder\",\n deps = [\n \"@crates__anstream-1.0.0//:anstream\",\n \"@crates__anstyle-1.0.14//:anstyle\",\n \"@crates__clap_lex-1.1.0//:clap_lex\",\n \"@crates__strsim-0.11.1//:strsim\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"color\",\n \"error-context\",\n \"help\",\n \"std\",\n \"suggestions\",\n \"usage\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2024\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=clap_builder\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"4.6.0\",\n)\n" + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'tools'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"clap_builder\",\n deps = [\n \"@crates__anstream-1.0.0//:anstream\",\n \"@crates__anstyle-1.0.14//:anstyle\",\n \"@crates__clap_lex-1.1.0//:clap_lex\",\n \"@crates__strsim-0.11.1//:strsim\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"color\",\n \"env\",\n \"error-context\",\n \"help\",\n \"std\",\n \"suggestions\",\n \"usage\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2024\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=clap_builder\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"4.6.0\",\n)\n" } }, "crates__clap_derive-4.6.1": { @@ -659,6 +659,19 @@ "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'tools'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"clap_lex\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2024\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=clap_lex\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"1.1.0\",\n)\n" } }, + "crates__clap_mangen-0.2.33": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "7e30ffc187e2e3aeafcd1c6e2aa416e29739454c0ccaa419226d5ecd181f2d78", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/clap_mangen/0.2.33/download" + ], + "strip_prefix": "clap_mangen-0.2.33", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'tools'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"clap_mangen\",\n deps = [\n \"@crates__clap-4.6.1//:clap\",\n \"@crates__roff-1.1.1//:roff\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"default\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2024\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=clap_mangen\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.2.33\",\n)\n" + } + }, "crates__cmake-0.1.58": { "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { @@ -1842,6 +1855,19 @@ "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'tools'\n###############################################################################\n\nload(\n \"@rules_rust//cargo:defs.bzl\",\n \"cargo_build_script\",\n \"cargo_toml_env_vars\",\n)\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"ring\",\n deps = [\n \"@crates__cfg-if-1.0.4//:cfg_if\",\n \"@crates__getrandom-0.2.17//:getrandom\",\n \"@crates__ring-0.17.14//:build_script_build\",\n \"@crates__untrusted-0.9.0//:untrusted\",\n ] + select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [\n \"@crates__libc-0.2.186//:libc\", # cfg(all(all(target_arch = \"aarch64\", target_endian = \"little\"), target_vendor = \"apple\", any(target_os = \"ios\", target_os = \"macos\", target_os = \"tvos\", target_os = \"visionos\", target_os = \"watchos\")))\n ],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [\n \"@crates__libc-0.2.186//:libc\", # cfg(all(any(all(target_arch = \"aarch64\", target_endian = \"little\"), all(target_arch = \"arm\", target_endian = \"little\")), any(target_os = \"android\", target_os = \"linux\")))\n ],\n \"//conditions:default\": [],\n }),\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=ring\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.17.14\",\n)\n\ncargo_build_script(\n name = \"_bs\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \"**/*.rs\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_name = \"build_script_build\",\n crate_root = \"build.rs\",\n data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n deps = [\n \"@crates__cc-1.2.64//:cc\",\n ],\n edition = \"2021\",\n links = \"ring_core_0_17_14_\",\n pkg_name = \"ring\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=ring\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n version = \"0.17.14\",\n visibility = [\"//visibility:private\"],\n)\n\nalias(\n name = \"build_script_build\",\n actual = \":_bs\",\n tags = [\"manual\"],\n)\n" } }, + "crates__roff-1.1.1": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "323c417e1d9665a65b263ec744ba09030cfb277e9daa0b018a4ab62e57bc8189", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/roff/1.1.1/download" + ], + "strip_prefix": "roff-1.1.1", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'tools'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"roff\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2024\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=roff\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"1.1.1\",\n)\n" + } + }, "crates__rustc-hash-2.1.2": { "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { diff --git a/bazel/rust.bzl b/bazel/rust.bzl @@ -1,6 +1,19 @@ -load("@rules_rust//rust:defs.bzl", "rust_binary", "rust_library", "rust_test") +load("@rules_rust//rust:defs.bzl", "rust_binary", "rust_clippy", "rust_library", "rust_test") load("//bazel:local-deploy.bzl", "local_deploy") +def _clippy(name, crates): + """ + Defines a `<name>_clippy` target that runs clippy over `crates`. + + Tagged `manual` so it is skipped by `//...` wildcard builds; run it + explicitly (e.g. `bazel build //dam:dam_clippy`) or via the clippy aspect. + """ + rust_clippy( + name = name + "_clippy", + deps = crates, + tags = ["manual"], + ) + def rust_app( name, srcs = None, @@ -12,7 +25,7 @@ def rust_app( **kwargs): """ Defines a standard Rust application with optimized, debug, and profiling builds, - along with unit tests and a local deployment target. + along with unit tests, a clippy target, and a local deployment target. """ if srcs == None: srcs = native.glob(["src/**/*.rs"]) @@ -67,6 +80,8 @@ def rust_app( deps = test_deps, ) + _clippy(name, [":" + name]) + local_deploy( name = "deploy", srcs = [":" + name], @@ -84,7 +99,7 @@ def rust_lib( **kwargs): """ Defines a standard Rust library with optimized and debug builds, - along with unit tests. + along with unit tests and a clippy target. """ if srcs == None: srcs = native.glob(["src/**/*.rs"]) @@ -117,3 +132,5 @@ def rust_lib( rustc_flags = common_flags, deps = test_deps, ) + + _clippy(name, [":" + name]) diff --git a/dam/BUILD b/dam/BUILD @@ -1,7 +1,41 @@ load("@crates//:defs.bzl", "all_crate_deps") -load("//bazel:rust.bzl", "rust_app") +load("@rules_rust//rust:defs.bzl", "rust_binary") +load("//bazel:rust.bzl", "rust_app", "rust_lib") + +# The library carries all the logic (and the unit tests); the binary is a thin +# entry point, so the same code can be reused to generate the man page. +rust_lib( + name = "dam_lib", + srcs = glob( + ["src/**/*.rs"], + exclude = ["src/main.rs"], + ), + crate_name = "dam", + deps = all_crate_deps(), +) rust_app( name = "dam", - deps = all_crate_deps(), + srcs = ["src/main.rs"], + deps = all_crate_deps() + [":dam_lib"], +) + +# Man-page generator (the `mangen` example). Tagged manual so `//...` builds and +# the shipped binary stay free of clap_mangen; it is built only when the man +# page is generated. +rust_binary( + name = "mangen", + srcs = ["examples/mangen.rs"], + edition = "2024", + tags = ["manual"], + deps = all_crate_deps() + all_crate_deps(normal_dev = True) + [":dam_lib"], +) + +# `bazel build //dam:man` renders the man page into bazel-out; to refresh the +# committed dam/dam.1 in place run `make man-gen` (cargo run --example mangen). +genrule( + name = "man", + outs = ["man/dam.1"], + cmd = "$(execpath :mangen) $@", + tools = [":mangen"], ) diff --git a/dam/Cargo.toml b/dam/Cargo.toml @@ -10,3 +10,8 @@ clap = { version = "4.5", features = ["derive"] } natord = "1.0" similar = "3.0.0" console = "0.16" + +# Only used by the `mangen` example (man-page generation), so it never reaches +# the shipped binary. +[dev-dependencies] +clap_mangen = "0.2" diff --git a/dam/Makefile b/dam/Makefile @@ -31,6 +31,10 @@ test: ## Run the test suite check: ## Type-check without building artifacts $(CARGO) check +.PHONY: man-gen +man-gen: ## Regenerate dam.1 from dam's CLI (clap_mangen) + $(CARGO) run --quiet --example mangen + .PHONY: man man: ## Open a preview of dam.1 man ./$(MANPAGE) diff --git a/dam/dam.1 b/dam/dam.1 @@ -1,244 +1,86 @@ -.TH DAM 1 2026-06-14 +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' +.TH dam 1 "dam 0.1.0" .SH NAME -dam \- diff-and-merge line-oriented text files between a local directory and a -remote host over rsync +dam \- Diff\-and\-merge line\-oriented text files between a local directory and a remote host over rsync .SH SYNOPSIS -.B dam -.B \-\-host -.I host -.B \-\-local -.I path -.B \-\-remote -.I path -.RB [ \-\-plan " | " \-\-pull " | " \-\-push ] -.RB [ \-\-sudo " | " \-\-doas ] -.RB [ \-\-exit-code ] -.RB [ \-\-timeout -.IR seconds ] +\fBdam\fR <\fB\-\-host\fR> <\fB\-\-local\fR> <\fB\-\-remote\fR> [\fB\-\-plan\fR] [\fB\-\-pull\fR] [\fB\-\-push\fR] [\fB\-\-sudo\fR] [\fB\-\-doas\fR] [\fB\-\-exit\-code\fR] [\fB\-\-timeout\fR] [\fB\-h\fR|\fB\-\-help\fR] [\fB\-V\fR|\fB\-\-version\fR] .SH DESCRIPTION -.B dam -synchronises line-oriented text files between a local directory and a remote -host over -.BR rsync (1), -using a plan/apply workflow. -By default it only previews the changes each direction would make; -.B \-\-pull -and -.B \-\-push -apply them. +dam (diff\-and\-merge) — sync line\-oriented text files between a local +directory and a remote host over rsync. .PP -.B dam -is intended for list-like data such as allow-lists, hosts files, and word -lists. -Blank lines, duplicates, and the original line ordering are -.I not -preserved by the merge, so it is unsuitable for arbitrary documents. +dam merges files as the sorted, de\-duplicated union of their local and +remote lines. It is intended for list\-like data (allow\-lists, hosts files, +word lists), not for arbitrary documents — blank lines, duplicates, and +original ordering are not preserved by the merge. .PP -.B \-\-local -and -.B \-\-remote -may be directories or single files. -When -.B \-\-local -is an existing directory, -.B dam -syncs the whole tree, recursing into subdirectories; otherwise it treats both -paths as a single file. -To mirror a directory into a new local location, create that directory first. -.SH MERGE STRATEGY -When a file exists on both sides, the merged result is the sorted, -de-duplicated -.I union -of its local and remote lines, using natural ordering (so -.I file2 -sorts before -.IR file10 ). -A trailing carriage return is stripped, so CRLF and LF inputs compare equal. +\-\-local and \-\-remote may be directories or single files. When \-\-local is +an existing directory dam syncs the whole tree (recursing into +subdirectories); otherwise it treats both paths as a single file. To mirror +a directory into a new local location, create that directory first. .PP -When a file exists on only one side, its contents are propagated verbatim, -without reordering. +Because the merge is a union, dam never removes a line: a line deleted on +one side reappears from the other. Removing data is a manual edit on both +sides, or a one\-shot rsync. .PP -The union is symmetric: the merged result is identical regardless of direction; -the mode only chooses which side gets written. +dam has a plan/apply workflow, with three mutually exclusive modes: .PP -.B dam never deletes. -Because the merge is a union, a line removed on one side reappears from the -other. -Removing data is a manual edit on both sides (or a one-shot -.BR rsync (1)), -not something -.B dam -does. -.SH MODES -.BR \-\-plan , -.BR \-\-pull , -and -.B \-\-push -are mutually exclusive. -.B \-\-plan -is the default when none is given. + \-\-plan (default) Show the changes each direction would make. Writes + nothing. + \-\-pull Apply the merge to the local directory (remote → local). + \-\-push Apply the merge to the remote host (local → remote). +.PP +Progress and the summary are written to stderr and the plan diff to stdout, +so `dam \-\-plan > changes.diff` captures just the differences. +.PP +Examples: + # See what would change on either side + dam \-\-host myserver \-\-local ~/lists \-\-remote /srv/lists +.PP + # Bring the local directory up to date + dam \-\-host myserver \-\-local ~/lists \-\-remote /srv/lists \-\-pull +.PP + # Bring the remote up to date + dam \-\-host myserver \-\-local ~/lists \-\-remote /srv/lists \-\-push +.PP + # Fail (exit 1) if the two sides have drifted — handy in CI + dam \-\-host myserver \-\-local ~/lists \-\-remote /srv/lists \-\-plan \-\-exit\-code +.SH OPTIONS .TP -.B \-\-plan -Show the changes each direction would make, without writing anything. +\fB\-\-host\fR \fI<HOST>\fR +SSH host alias (as configured in ~/.ssh/config) to sync with .TP -.B \-\-pull -Apply the merge to the local directory (remote -> local). +\fB\-\-local\fR \fI<LOCAL>\fR +Local directory (or single file) containing the line\-oriented text .TP -.B \-\-push -Apply the merge to the remote host (local -> remote). -.SH OPTIONS +\fB\-\-remote\fR \fI<REMOTE>\fR +Remote directory (or single file) to sync from/to .TP -.BI \-\-host " host" -SSH host alias, as configured in -.IR ~/.ssh/config , -to sync with. -Required. +\fB\-\-plan\fR +Show the changes each direction would make, without writing anything (the default) .TP -.BI \-\-local " path" -Local directory, or single file, containing the line-oriented text. -Required. +\fB\-\-pull\fR +Apply the merge to the local directory (remote → local) .TP -.BI \-\-remote " path" -Remote directory, or single file, to sync from and to. -Required. +\fB\-\-push\fR +Apply the merge to the remote host (local → remote) .TP -.B \-\-sudo -Elevate the -.I remote -rsync with -.BR sudo (8), -via rsync's -.BR \-\-rsync-path . -Mutually exclusive with -.BR \-\-doas . +\fB\-\-sudo\fR +Elevate the remote rsync with `sudo` (via \-\-rsync\-path) .TP -.B \-\-doas -Elevate the -.I remote -rsync with -.BR doas (1), -via rsync's -.BR \-\-rsync-path . -Mutually exclusive with -.BR \-\-sudo . -.IP -.BR \-\-sudo / \-\-doas -elevate only the rsync process on the remote host (for example, when the remote -path is root-owned). -The local rsync always runs unprivileged, so your own SSH config and keys are -used. +\fB\-\-doas\fR +Elevate the remote rsync with `doas` (via \-\-rsync\-path) .TP -.B \-\-exit-code -With -.BR \-\-plan , -exit 1 if pending changes are found. -Useful in CI. -Processing errors always exit 2. +\fB\-\-exit\-code\fR +Exit with status 1 if \-\-plan finds pending changes. Processing errors always exit with status 2 .TP -.BI \-\-timeout " seconds" -I/O timeout in seconds handed to rsync. -The default is 30; 0 disables the timeout. -.SH OUTPUT -For each file with pending changes, -.B \-\-plan -prints the file's path followed by a per-side summary for each side that would -change: a -.I local -or -.I remote -tag, then the count of lines that side would gain -.RB ( +N ) -and lose -.RB ( \-N ), -and the changed lines themselves. -For example: -.PP -.RS 4 -.EX -hosts/blocklist - local +1 -0 - +badsite.example - remote +2 -0 - +ads.example - +tracker.example -.EE -.RE -.PP -Progress and the run summary are written to standard error; the plan diff is -written to standard output, so the diff can be captured on its own: -.PP -.RS 4 -.EX -dam --host myserver --local ~/lists --remote /srv/lists > changes.diff -.EE -.RE -.PP -Local files are written atomically: each is staged in a temporary file in the -same directory and renamed into place, so an interrupted run cannot leave a -half-written file. -rsync runs with -.I ssh -o BatchMode=yes -and the I/O -.B \-\-timeout -so it fails fast in automation rather than blocking on a password or host-key -prompt. -.SH EXIT STATUS +\fB\-\-timeout\fR \fI<TIMEOUT>\fR [default: 30] +I/O timeout in seconds handed to rsync (0 disables the timeout) .TP -.B 0 -Success; nothing pending, or changes were applied with -.B \-\-pull -or -.BR \-\-push . +\fB\-h\fR, \fB\-\-help\fR +Print help (see a summary with \*(Aq\-h\*(Aq) .TP -.B 1 -.B \-\-exit-code -was set with -.B \-\-plan -and pending changes were found. -.TP -.B 2 -One or more files failed to process. -.SH EXAMPLES -See what would change on either side: -.PP -.RS 4 -.EX -dam --host myserver --local ~/lists --remote /srv/lists -.EE -.RE -.PP -Bring the local directory up to date: -.PP -.RS 4 -.EX -dam --host myserver --local ~/lists --remote /srv/lists --pull -.EE -.RE -.PP -Bring the remote up to date: -.PP -.RS 4 -.EX -dam --host myserver --local ~/lists --remote /srv/lists --push -.EE -.RE -.PP -Sync a single file: -.PP -.RS 4 -.EX -dam --host myserver --local ~/hosts.allow --remote /etc/hosts.allow --pull -.EE -.RE -.PP -Fail (exit 1) if the two sides have drifted, for use in CI: -.PP -.RS 4 -.EX -dam --host myserver --local ~/lists --remote /srv/lists --plan --exit-code -.EE -.RE -.SH SEE ALSO -.BR rsync (1), -.BR ssh (1), -.BR ssh_config (5) +\fB\-V\fR, \fB\-\-version\fR +Print version +.SH VERSION +v0.1.0 diff --git a/dam/examples/mangen.rs b/dam/examples/mangen.rs @@ -0,0 +1,29 @@ +//! Render dam's man page straight from its clap `Command`, so the page can +//! never drift from `dam --help`. +//! +//! Run `cargo run --example mangen` to refresh the in-tree dam.1, or pass an +//! output path (as the Bazel genrule does) to write elsewhere. + +use std::io::Write; + +use clap::CommandFactory; + +fn main() -> std::io::Result<()> { + let mut buffer = Vec::new(); + clap_mangen::Man::new(dam::Cli::command()).render(&mut buffer)?; + + match std::env::args().nth(1).or_else(default_out) { + Some(path) => { + std::fs::write(&path, buffer)?; + eprintln!("generated {path}"); + } + None => std::io::stdout().write_all(&buffer)?, + } + Ok(()) +} + +/// Default to dam.1 beside this crate's manifest when run through cargo; +/// `option_env!` keeps it compiling under Bazel, where the path is passed in. +fn default_out() -> Option<String> { + option_env!("CARGO_MANIFEST_DIR").map(|dir| format!("{dir}/dam.1")) +} diff --git a/dam/src/lib.rs b/dam/src/lib.rs @@ -0,0 +1,680 @@ +use anyhow::{Context, Result}; +use clap::{Args, Parser}; +use console::style; +use similar::{ChangeTag, TextDiff}; +use std::collections::{BTreeSet, HashSet}; +use std::fs; +use std::io::Write; +use std::path::{Path, PathBuf}; +use std::process::{Command, ExitCode}; + +/// dam (diff-and-merge) — sync line-oriented text files between a local +/// directory and a remote host over rsync. +/// +/// dam merges files as the sorted, de-duplicated union of their local and +/// remote lines. It is intended for list-like data (allow-lists, hosts files, +/// word lists), not for arbitrary documents — blank lines, duplicates, and +/// original ordering are not preserved by the merge. +/// +/// --local and --remote may be directories or single files. When --local is +/// an existing directory dam syncs the whole tree (recursing into +/// subdirectories); otherwise it treats both paths as a single file. To mirror +/// a directory into a new local location, create that directory first. +/// +/// Because the merge is a union, dam never removes a line: a line deleted on +/// one side reappears from the other. Removing data is a manual edit on both +/// sides, or a one-shot rsync. +/// +/// dam has a plan/apply workflow, with three mutually exclusive modes: +/// +/// --plan (default) Show the changes each direction would make. Writes +/// nothing. +/// --pull Apply the merge to the local directory (remote → local). +/// --push Apply the merge to the remote host (local → remote). +/// +/// Progress and the summary are written to stderr and the plan diff to stdout, +/// so `dam --plan > changes.diff` captures just the differences. +/// +/// Examples: +/// # See what would change on either side +/// dam --host myserver --local ~/lists --remote /srv/lists +/// +/// # Bring the local directory up to date +/// dam --host myserver --local ~/lists --remote /srv/lists --pull +/// +/// # Bring the remote up to date +/// dam --host myserver --local ~/lists --remote /srv/lists --push +/// +/// # Fail (exit 1) if the two sides have drifted — handy in CI +/// dam --host myserver --local ~/lists --remote /srv/lists --plan --exit-code +#[derive(Parser, Debug)] +#[command( + author, + version, + about = "Diff-and-merge line-oriented text files between a local directory and a remote host over rsync", + arg_required_else_help = true, + verbatim_doc_comment +)] +pub struct Cli { + /// SSH host alias (as configured in ~/.ssh/config) to sync with. + #[arg(long, required = true)] + host: String, + + /// Local directory (or single file) containing the line-oriented text. + #[arg(long, required = true)] + local: PathBuf, + + /// Remote directory (or single file) to sync from/to. + #[arg(long, required = true)] + remote: PathBuf, + + #[command(flatten)] + mode: ModeFlags, + + #[command(flatten)] + elevate: ElevateFlags, + + /// Exit with status 1 if --plan finds pending changes. Processing errors + /// always exit with status 2. + #[arg(long)] + exit_code: bool, + + /// I/O timeout in seconds handed to rsync (0 disables the timeout). + #[arg(long, default_value_t = 30)] + timeout: u64, +} + +/// The mutually exclusive plan/pull/push flags. `--plan` (preview) is the +/// default when none is given. +#[derive(Args, Debug)] +#[group(required = false, multiple = false)] +struct ModeFlags { + /// Show the changes each direction would make, without writing anything + /// (the default). + #[arg(long)] + plan: bool, + + /// Apply the merge to the local directory (remote → local). + #[arg(long)] + pull: bool, + + /// Apply the merge to the remote host (local → remote). + #[arg(long)] + push: bool, +} + +impl ModeFlags { + fn mode(&self) -> Mode { + if self.push { + Mode::Push + } else if self.pull { + Mode::Pull + } else { + Mode::Plan + } + } +} + +/// The optional privilege-elevation flags. The remote rsync runs unprivileged +/// unless one is given; the local rsync is never elevated. +#[derive(Args, Debug)] +#[group(required = false, multiple = false)] +struct ElevateFlags { + /// Elevate the remote rsync with `sudo` (via --rsync-path). + #[arg(long)] + sudo: bool, + + /// Elevate the remote rsync with `doas` (via --rsync-path). + #[arg(long)] + doas: bool, +} + +impl ElevateFlags { + /// The command to prefix rsync with, if any. + fn command(&self) -> Option<&'static str> { + if self.sudo { + Some("sudo") + } else if self.doas { + Some("doas") + } else { + None + } + } +} + +#[derive(Clone, Copy, PartialEq, Eq, Debug)] +enum Mode { + Plan, + Pull, + Push, +} + +#[derive(Clone, Copy, PartialEq, Eq, Debug)] +enum FileStatus { + Created, + Updated, + Unchanged, +} + +#[derive(Debug, Default)] +struct Tally { + created: u32, + updated: u32, + unchanged: u32, + errors: u32, +} + +impl Tally { + fn record(&mut self, status: FileStatus) { + match status { + FileStatus::Created => self.created += 1, + FileStatus::Updated => self.updated += 1, + FileStatus::Unchanged => self.unchanged += 1, + } + } + + /// Number of files that would change (or did change). + fn changed(&self) -> u32 { + self.created + self.updated + } + + fn print(&self, header: &str) { + eprintln!("\n{header}:"); + eprintln!(" Created: {}", self.created); + eprintln!(" Updated: {}", self.updated); + eprintln!(" Unchanged: {}", self.unchanged); + if self.errors > 0 { + eprintln!(" Errors: {}", self.errors); + } + } +} + +struct FileSyncWorker { + host_alias: String, + local_path: PathBuf, + remote_path: PathBuf, + mode: Mode, + timeout: u64, + elevate: Option<&'static str>, +} + +/// One file to reconcile: where it lives locally, where its downloaded remote +/// copy is, and where a push stages its merged result. `label` is used in +/// progress and diff output. +struct Pair { + label: String, + local: PathBuf, + remote: PathBuf, + staging: PathBuf, +} + +impl FileSyncWorker { + /// Single-file mode when --local is not an existing directory; otherwise + /// the whole directory tree is synced. + fn single_file(&self) -> bool { + !self.local_path.is_dir() + } + + fn run(&self) -> Result<Tally> { + let single_file = self.single_file(); + + // Always pull the remote into a temp dir so we have both sides to + // compare; nothing is uploaded unless --push has changes to apply. + let remote_tmp = tempfile::tempdir().context("Failed to create temporary directory")?; + let remote_dir = remote_tmp.path(); + self.download(remote_dir, single_file)?; + + let action = match self.mode { + Mode::Plan => "Planning", + Mode::Pull => "Pulling", + Mode::Push => "Pushing", + }; + let unit = if single_file { "file" } else { "files" }; + eprintln!("{action} {unit} for {}", self.host_alias); + + // Staging dir holds the files we will upload when pushing. + let staging_tmp = tempfile::tempdir().context("Failed to create staging directory")?; + let staging = staging_tmp.path(); + + let mut tally = Tally::default(); + for pair in self.build_pairs(remote_dir, staging, single_file)? { + match self.process(&pair) { + Ok(status) => tally.record(status), + Err(e) => { + eprintln!("Error processing {}: {e:#}", pair.label); + tally.errors += 1; + } + } + } + + let header = match self.mode { + Mode::Plan => "Plan summary", + Mode::Pull => "Pull complete", + Mode::Push => "Push complete", + }; + tally.print(header); + + if self.mode == Mode::Push && tally.changed() > 0 { + self.upload(staging, single_file)?; + } + + Ok(tally) + } + + /// Enumerate the file pair(s) to process: one per file in single-file + /// mode, or one per file present in either directory tree otherwise. + fn build_pairs( + &self, + remote_dir: &Path, + staging: &Path, + single_file: bool, + ) -> Result<Vec<Pair>> { + if single_file { + let name = self.remote_file_name()?; + return Ok(vec![Pair { + label: self.local_path.display().to_string(), + local: self.local_path.clone(), + remote: remote_dir.join(name), + staging: staging.join(name), + }]); + } + + let mut names = BTreeSet::new(); + collect_files(&self.local_path, &self.local_path, &mut names)?; + collect_files(remote_dir, remote_dir, &mut names)?; + Ok(names + .into_iter() + .map(|rel| Pair { + label: rel.display().to_string(), + local: self.local_path.join(&rel), + remote: remote_dir.join(&rel), + staging: staging.join(&rel), + }) + .collect()) + } + + fn process(&self, pair: &Pair) -> Result<FileStatus> { + let local = read_optional(&pair.local)?; + let remote = read_optional(&pair.remote)?; + let merged = merge(local.as_deref(), remote.as_deref()); + + match self.mode { + Mode::Plan => Ok(plan( + &pair.label, + local.as_deref(), + remote.as_deref(), + &merged, + )), + Mode::Pull => apply(&pair.label, local.as_deref(), &merged, &pair.local, "local"), + Mode::Push => apply( + &pair.label, + remote.as_deref(), + &merged, + &pair.staging, + "remote", + ), + } + } + + /// The file name component of --remote, required in single-file mode. + fn remote_file_name(&self) -> Result<&std::ffi::OsStr> { + self.remote_path + .file_name() + .context("--remote must name a file in single-file mode") + } + + fn download(&self, dest: &Path, single_file: bool) -> Result<()> { + // A trailing slash copies a directory's *contents*; without one rsync + // copies the single file into the temp dir under its own name. + let source = if single_file { + format!("{}:{}", self.host_alias, self.remote_path.display()) + } else { + format!("{}:{}/", self.host_alias, self.remote_path.display()) + }; + self.rsync(&source, &dest.to_string_lossy()) + } + + fn upload(&self, staging: &Path, single_file: bool) -> Result<()> { + let (source, dest) = if single_file { + let name = self.remote_file_name()?; + ( + staging.join(name).to_string_lossy().into_owned(), + format!("{}:{}", self.host_alias, self.remote_path.display()), + ) + } else { + ( + format!("{}/", staging.display()), + format!("{}:{}/", self.host_alias, self.remote_path.display()), + ) + }; + eprintln!("Uploading to {dest}"); + self.rsync(&source, &dest) + } + + /// Run rsync with non-interactive SSH so it fails fast in automation + /// instead of blocking on a password or host-key prompt. When elevation + /// is requested it is applied to the *remote* rsync via --rsync-path; the + /// local rsync always runs unprivileged. + fn rsync(&self, source: &str, dest: &str) -> Result<()> { + let mut cmd = Command::new("rsync"); + cmd.arg("-az").arg("-e").arg("ssh -o BatchMode=yes"); + if let Some(elevate) = self.elevate { + cmd.arg(format!("--rsync-path={elevate} rsync")); + } + if self.timeout > 0 { + cmd.arg(format!("--timeout={}", self.timeout)); + } + cmd.arg(source).arg(dest); + + let status = cmd + .status() + .context("Failed to execute rsync (is it installed?)")?; + if !status.success() { + anyhow::bail!("rsync exited with status: {status}"); + } + Ok(()) + } +} + +/// Which end of the sync a planned change applies to. +#[derive(Clone, Copy)] +enum Side { + Local, + Remote, +} + +impl Side { + /// The tag printed in front of this side's diff, colour-coded so local and + /// remote are easy to tell apart at a glance. + fn tag(self) -> console::StyledObject<&'static str> { + match self { + Side::Local => style(" local ").black().on_cyan().bold(), + Side::Remote => style(" remote ").black().on_magenta().bold(), + } + } +} + +/// Preview the changes both directions would make to a single file, printing +/// a per-side diff for each side that has pending changes. Writes nothing. +fn plan(label: &str, local: Option<&str>, remote: Option<&str>, merged: &str) -> FileStatus { + let local_current = local.unwrap_or(""); + let remote_current = remote.unwrap_or(""); + let local_changes = local_current != merged; + let remote_changes = remote_current != merged; + + if !local_changes && !remote_changes { + return FileStatus::Unchanged; + } + + println!("{}", style(label).bold().underlined()); + if local_changes { + print_side_diff(Side::Local, local_current, merged); + } + if remote_changes { + print_side_diff(Side::Remote, remote_current, merged); + } + println!(); + FileStatus::Updated +} + +/// Apply the merged content to one side, writing `dest` atomically. `current` +/// is that side's existing content (`None` if the file is absent there). +fn apply( + label: &str, + current: Option<&str>, + merged: &str, + dest: &Path, + side: &str, +) -> Result<FileStatus> { + let exists = current.is_some(); + if current.unwrap_or("") == merged { + return Ok(FileStatus::Unchanged); + } + + // Never create an empty new file. + if !merged.is_empty() || exists { + write_atomic(dest, merged)?; + } + + if exists { + eprintln!("Updating {label} on {side}"); + Ok(FileStatus::Updated) + } else { + eprintln!("Creating {label} on {side}"); + Ok(FileStatus::Created) + } +} + +/// Recursively collect the paths of regular files under `dir`, expressed +/// relative to `root`. Symlinks are skipped to avoid traversal loops. +fn collect_files(root: &Path, dir: &Path, out: &mut BTreeSet<PathBuf>) -> Result<()> { + for entry in fs::read_dir(dir).with_context(|| format!("Failed to read {}", dir.display()))? { + let entry = entry?; + let path = entry.path(); + let file_type = entry.file_type()?; + if file_type.is_dir() { + collect_files(root, &path, out)?; + } else if file_type.is_file() { + let rel = path + .strip_prefix(root) + .with_context(|| format!("{} is not under {}", path.display(), root.display()))?; + out.insert(rel.to_path_buf()); + } + } + Ok(()) +} + +/// Read a file, returning `None` if it does not exist. +fn read_optional(path: &Path) -> Result<Option<String>> { + match fs::read_to_string(path) { + Ok(s) => Ok(Some(s)), + Err(e) if e.kind() == std::io::ErrorKind::NotFound => Ok(None), + Err(e) => Err(e).with_context(|| format!("Failed to read {}", path.display())), + } +} + +/// Write `contents` to `path` atomically: stage in a temp file in the same +/// directory and rename into place, so a crash mid-write can't truncate or +/// corrupt the target. +fn write_atomic(path: &Path, contents: &str) -> Result<()> { + let dir = path + .parent() + .with_context(|| format!("{} has no parent directory", path.display()))?; + fs::create_dir_all(dir).with_context(|| format!("Failed to create {}", dir.display()))?; + + let mut tmp = tempfile::NamedTempFile::new_in(dir) + .with_context(|| format!("Failed to create temp file in {}", dir.display()))?; + tmp.write_all(contents.as_bytes()) + .with_context(|| format!("Failed to write {}", path.display()))?; + tmp.persist(path) + .map_err(|e| e.error) + .with_context(|| format!("Failed to persist {}", path.display()))?; + Ok(()) +} + +/// Merge two sides into the file content dam would write. +/// +/// When the file exists on both sides the result is the sorted, de-duplicated +/// union of their non-empty lines. When it exists on only one side that +/// side's content is propagated verbatim (no reordering of brand-new files). +fn merge(local: Option<&str>, remote: Option<&str>) -> String { + match (local, remote) { + (Some(l), Some(r)) => { + let merged = union_lines(l, r); + if merged.is_empty() { + String::new() + } else { + format!("{}\n", merged.join("\n")) + } + } + (Some(only), None) | (None, Some(only)) => only.to_string(), + (None, None) => String::new(), + } +} + +/// Sorted, de-duplicated union of the non-blank lines of `a` and `b`. A +/// trailing carriage return is stripped so CRLF and LF inputs compare equal. +fn union_lines(a: &str, b: &str) -> Vec<String> { + let mut seen = HashSet::new(); + let mut result: Vec<String> = a + .lines() + .chain(b.lines()) + .map(|line| line.trim_end_matches('\r')) + .filter(|line| !line.trim().is_empty()) + .filter(|line| seen.insert(*line)) + .map(str::to_string) + .collect(); + result.sort_by(|a, b| natord::compare(a, b)); + result +} + +/// Print one side's planned change to stdout: a tagged header naming the side +/// with its added/removed counts, followed by only the changed lines. +/// +/// `current` is that side's existing content and `merged` the proposed result, +/// so `+` lines are gained and `-` lines lost. Unchanged lines are omitted to +/// keep the plan focused on the delta. +fn print_side_diff(side: Side, current: &str, merged: &str) { + // Diff the lines themselves rather than the raw text: `lines()` drops the + // terminators, so a missing trailing newline never shows up as a change. + let current: Vec<&str> = current.lines().collect(); + let merged: Vec<&str> = merged.lines().collect(); + let diff = TextDiff::from_slices(&current, &merged); + + // `true` marks an inserted line, `false` a deleted one; equal lines are + // dropped here so the body below is purely the delta. + let mut changes: Vec<(bool, &str)> = Vec::new(); + let (mut added, mut removed) = (0u32, 0u32); + for change in diff.iter_all_changes() { + match change.tag() { + ChangeTag::Insert => added += 1, + ChangeTag::Delete => removed += 1, + ChangeTag::Equal => continue, + } + changes.push((change.tag() == ChangeTag::Insert, change.value())); + } + + println!( + " {} {} {}", + side.tag(), + style(format!("+{added}")).green(), + style(format!("-{removed}")).red(), + ); + for (inserted, line) in changes { + if inserted { + println!(" {}", style(format!("+{line}")).green()); + } else { + println!(" {}", style(format!("-{line}")).red()); + } + } +} + +/// Parse the command line and run the configured sync, returning the process +/// exit code. +pub fn run() -> Result<ExitCode> { + let cli = Cli::parse(); + + let mode = cli.mode.mode(); + + let worker = FileSyncWorker { + host_alias: cli.host, + local_path: cli.local, + remote_path: cli.remote, + mode, + timeout: cli.timeout, + elevate: cli.elevate.command(), + }; + let tally = worker.run()?; + + let code = if tally.errors > 0 { + ExitCode::from(2) + } else if cli.exit_code && mode == Mode::Plan && tally.changed() > 0 { + ExitCode::from(1) + } else { + ExitCode::SUCCESS + }; + Ok(code) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn union_dedups_sorts_and_drops_blank_lines() { + let got = union_lines("banana\napple\n\napple", "cherry\napple"); + assert_eq!(got, vec!["apple", "banana", "cherry"]); + } + + #[test] + fn union_uses_natural_ordering() { + let got = union_lines("file10\nfile2\nfile1", ""); + assert_eq!(got, vec!["file1", "file2", "file10"]); + } + + #[test] + fn union_normalises_crlf() { + let got = union_lines("a\r\nb\r\n", "b\r\nc\r"); + assert_eq!(got, vec!["a", "b", "c"]); + } + + #[test] + fn merge_unions_when_both_present() { + assert_eq!(merge(Some("b\na"), Some("c\na")), "a\nb\nc\n"); + } + + #[test] + fn merge_propagates_single_side_verbatim() { + // Order is preserved and nothing is sorted when only one side has it. + assert_eq!(merge(Some("z\na\n"), None), "z\na\n"); + assert_eq!(merge(None, Some("z\na\n")), "z\na\n"); + } + + #[test] + fn merge_is_empty_when_neither_present() { + assert_eq!(merge(None, None), ""); + } + + #[test] + fn merge_of_blank_only_content_is_empty() { + assert_eq!(merge(Some("\n\n"), Some(" ")), ""); + } + + #[test] + fn plan_reports_unchanged_when_sides_match() { + let merged = merge(Some("a\nb\n"), Some("a\nb\n")); + assert_eq!( + plan("f", Some("a\nb\n"), Some("a\nb\n"), &merged), + FileStatus::Unchanged + ); + } + + #[test] + fn plan_reports_change_when_sides_differ() { + let merged = merge(Some("a"), Some("b")); + assert_eq!( + plan("f", Some("a"), Some("b"), &merged), + FileStatus::Updated + ); + } + + #[test] + fn apply_creates_updates_and_skips() { + let dir = tempfile::tempdir().unwrap(); + let dest = dir.path().join("f"); + + // Absent target with content -> Created and written. + let created = apply("f", None, "a\nb\n", &dest, "local").unwrap(); + assert_eq!(created, FileStatus::Created); + assert_eq!(fs::read_to_string(&dest).unwrap(), "a\nb\n"); + + // Existing target, new content -> Updated. + let updated = apply("f", Some("a\nb\n"), "a\nb\nc\n", &dest, "local").unwrap(); + assert_eq!(updated, FileStatus::Updated); + assert_eq!(fs::read_to_string(&dest).unwrap(), "a\nb\nc\n"); + + // No difference -> Unchanged, no write needed. + let same = apply("f", Some("x"), "x", &dest, "local").unwrap(); + assert_eq!(same, FileStatus::Unchanged); + } +} diff --git a/dam/src/main.rs b/dam/src/main.rs @@ -1,672 +1,5 @@ -use anyhow::{Context, Result}; -use clap::{Args, Parser}; -use console::style; -use similar::{ChangeTag, TextDiff}; -use std::collections::{BTreeSet, HashSet}; -use std::fs; -use std::io::Write; -use std::path::{Path, PathBuf}; -use std::process::{Command, ExitCode}; +use std::process::ExitCode; -/// dam (diff-and-merge) — sync line-oriented text files between a local -/// directory and a remote host over rsync. -/// -/// dam merges files as the sorted, de-duplicated union of their local and -/// remote lines. It is intended for list-like data (allow-lists, hosts files, -/// word lists), not for arbitrary documents — blank lines, duplicates, and -/// original ordering are not preserved by the merge. -/// -/// --local and --remote may be directories or single files. When --local is -/// an existing directory dam syncs the whole tree (recursing into -/// subdirectories); otherwise it treats both paths as a single file. To mirror -/// a directory into a new local location, create that directory first. -/// -/// Because the merge is a union, dam never removes a line: a line deleted on -/// one side reappears from the other. Removing data is a manual edit on both -/// sides, or a one-shot rsync. -/// -/// dam has a plan/apply workflow, with three mutually exclusive modes: -/// -/// --plan (default) Show the changes each direction would make. Writes -/// nothing. -/// --pull Apply the merge to the local directory (remote → local). -/// --push Apply the merge to the remote host (local → remote). -/// -/// Progress and the summary are written to stderr and the plan diff to stdout, -/// so `dam --plan > changes.diff` captures just the differences. -/// -/// Examples: -/// # See what would change on either side -/// dam --host myserver --local ~/lists --remote /srv/lists -/// -/// # Bring the local directory up to date -/// dam --host myserver --local ~/lists --remote /srv/lists --pull -/// -/// # Bring the remote up to date -/// dam --host myserver --local ~/lists --remote /srv/lists --push -/// -/// # Fail (exit 1) if the two sides have drifted — handy in CI -/// dam --host myserver --local ~/lists --remote /srv/lists --plan --exit-code -#[derive(Parser, Debug)] -#[command(author, version, arg_required_else_help = true, verbatim_doc_comment)] -struct Cli { - /// SSH host alias (as configured in ~/.ssh/config) to sync with. - #[arg(long, required = true)] - host: String, - - /// Local directory (or single file) containing the line-oriented text. - #[arg(long, required = true)] - local: PathBuf, - - /// Remote directory (or single file) to sync from/to. - #[arg(long, required = true)] - remote: PathBuf, - - #[command(flatten)] - mode: ModeFlags, - - #[command(flatten)] - elevate: ElevateFlags, - - /// Exit with status 1 if --plan finds pending changes. Processing errors - /// always exit with status 2. - #[arg(long)] - exit_code: bool, - - /// I/O timeout in seconds handed to rsync (0 disables the timeout). - #[arg(long, default_value_t = 30)] - timeout: u64, -} - -/// The mutually exclusive plan/pull/push flags. `--plan` (preview) is the -/// default when none is given. -#[derive(Args, Debug)] -#[group(required = false, multiple = false)] -struct ModeFlags { - /// Show the changes each direction would make, without writing anything - /// (the default). - #[arg(long)] - plan: bool, - - /// Apply the merge to the local directory (remote → local). - #[arg(long)] - pull: bool, - - /// Apply the merge to the remote host (local → remote). - #[arg(long)] - push: bool, -} - -impl ModeFlags { - fn mode(&self) -> Mode { - if self.push { - Mode::Push - } else if self.pull { - Mode::Pull - } else { - Mode::Plan - } - } -} - -/// The optional privilege-elevation flags. The remote rsync runs unprivileged -/// unless one is given; the local rsync is never elevated. -#[derive(Args, Debug)] -#[group(required = false, multiple = false)] -struct ElevateFlags { - /// Elevate the remote rsync with `sudo` (via --rsync-path). - #[arg(long)] - sudo: bool, - - /// Elevate the remote rsync with `doas` (via --rsync-path). - #[arg(long)] - doas: bool, -} - -impl ElevateFlags { - /// The command to prefix rsync with, if any. - fn command(&self) -> Option<&'static str> { - if self.sudo { - Some("sudo") - } else if self.doas { - Some("doas") - } else { - None - } - } -} - -#[derive(Clone, Copy, PartialEq, Eq, Debug)] -enum Mode { - Plan, - Pull, - Push, -} - -#[derive(Clone, Copy, PartialEq, Eq, Debug)] -enum FileStatus { - Created, - Updated, - Unchanged, -} - -#[derive(Debug, Default)] -struct Tally { - created: u32, - updated: u32, - unchanged: u32, - errors: u32, -} - -impl Tally { - fn record(&mut self, status: FileStatus) { - match status { - FileStatus::Created => self.created += 1, - FileStatus::Updated => self.updated += 1, - FileStatus::Unchanged => self.unchanged += 1, - } - } - - /// Number of files that would change (or did change). - fn changed(&self) -> u32 { - self.created + self.updated - } - - fn print(&self, header: &str) { - eprintln!("\n{header}:"); - eprintln!(" Created: {}", self.created); - eprintln!(" Updated: {}", self.updated); - eprintln!(" Unchanged: {}", self.unchanged); - if self.errors > 0 { - eprintln!(" Errors: {}", self.errors); - } - } -} - -struct FileSyncWorker { - host_alias: String, - local_path: PathBuf, - remote_path: PathBuf, - mode: Mode, - timeout: u64, - elevate: Option<&'static str>, -} - -/// One file to reconcile: where it lives locally, where its downloaded remote -/// copy is, and where a push stages its merged result. `label` is used in -/// progress and diff output. -struct Pair { - label: String, - local: PathBuf, - remote: PathBuf, - staging: PathBuf, -} - -impl FileSyncWorker { - /// Single-file mode when --local is not an existing directory; otherwise - /// the whole directory tree is synced. - fn single_file(&self) -> bool { - !self.local_path.is_dir() - } - - fn run(&self) -> Result<Tally> { - let single_file = self.single_file(); - - // Always pull the remote into a temp dir so we have both sides to - // compare; nothing is uploaded unless --push has changes to apply. - let remote_tmp = tempfile::tempdir().context("Failed to create temporary directory")?; - let remote_dir = remote_tmp.path(); - self.download(remote_dir, single_file)?; - - let action = match self.mode { - Mode::Plan => "Planning", - Mode::Pull => "Pulling", - Mode::Push => "Pushing", - }; - let unit = if single_file { "file" } else { "files" }; - eprintln!("{action} {unit} for {}", self.host_alias); - - // Staging dir holds the files we will upload when pushing. - let staging_tmp = tempfile::tempdir().context("Failed to create staging directory")?; - let staging = staging_tmp.path(); - - let mut tally = Tally::default(); - for pair in self.build_pairs(remote_dir, staging, single_file)? { - match self.process(&pair) { - Ok(status) => tally.record(status), - Err(e) => { - eprintln!("Error processing {}: {e:#}", pair.label); - tally.errors += 1; - } - } - } - - let header = match self.mode { - Mode::Plan => "Plan summary", - Mode::Pull => "Pull complete", - Mode::Push => "Push complete", - }; - tally.print(header); - - if self.mode == Mode::Push && tally.changed() > 0 { - self.upload(staging, single_file)?; - } - - Ok(tally) - } - - /// Enumerate the file pair(s) to process: one per file in single-file - /// mode, or one per file present in either directory tree otherwise. - fn build_pairs( - &self, - remote_dir: &Path, - staging: &Path, - single_file: bool, - ) -> Result<Vec<Pair>> { - if single_file { - let name = self.remote_file_name()?; - return Ok(vec![Pair { - label: self.local_path.display().to_string(), - local: self.local_path.clone(), - remote: remote_dir.join(name), - staging: staging.join(name), - }]); - } - - let mut names = BTreeSet::new(); - collect_files(&self.local_path, &self.local_path, &mut names)?; - collect_files(remote_dir, remote_dir, &mut names)?; - Ok(names - .into_iter() - .map(|rel| Pair { - label: rel.display().to_string(), - local: self.local_path.join(&rel), - remote: remote_dir.join(&rel), - staging: staging.join(&rel), - }) - .collect()) - } - - fn process(&self, pair: &Pair) -> Result<FileStatus> { - let local = read_optional(&pair.local)?; - let remote = read_optional(&pair.remote)?; - let merged = merge(local.as_deref(), remote.as_deref()); - - match self.mode { - Mode::Plan => Ok(plan( - &pair.label, - local.as_deref(), - remote.as_deref(), - &merged, - )), - Mode::Pull => apply(&pair.label, local.as_deref(), &merged, &pair.local, "local"), - Mode::Push => apply( - &pair.label, - remote.as_deref(), - &merged, - &pair.staging, - "remote", - ), - } - } - - /// The file name component of --remote, required in single-file mode. - fn remote_file_name(&self) -> Result<&std::ffi::OsStr> { - self.remote_path - .file_name() - .context("--remote must name a file in single-file mode") - } - - fn download(&self, dest: &Path, single_file: bool) -> Result<()> { - // A trailing slash copies a directory's *contents*; without one rsync - // copies the single file into the temp dir under its own name. - let source = if single_file { - format!("{}:{}", self.host_alias, self.remote_path.display()) - } else { - format!("{}:{}/", self.host_alias, self.remote_path.display()) - }; - self.rsync(&source, &dest.to_string_lossy()) - } - - fn upload(&self, staging: &Path, single_file: bool) -> Result<()> { - let (source, dest) = if single_file { - let name = self.remote_file_name()?; - ( - staging.join(name).to_string_lossy().into_owned(), - format!("{}:{}", self.host_alias, self.remote_path.display()), - ) - } else { - ( - format!("{}/", staging.display()), - format!("{}:{}/", self.host_alias, self.remote_path.display()), - ) - }; - eprintln!("Uploading to {dest}"); - self.rsync(&source, &dest) - } - - /// Run rsync with non-interactive SSH so it fails fast in automation - /// instead of blocking on a password or host-key prompt. When elevation - /// is requested it is applied to the *remote* rsync via --rsync-path; the - /// local rsync always runs unprivileged. - fn rsync(&self, source: &str, dest: &str) -> Result<()> { - let mut cmd = Command::new("rsync"); - cmd.arg("-az").arg("-e").arg("ssh -o BatchMode=yes"); - if let Some(elevate) = self.elevate { - cmd.arg(format!("--rsync-path={elevate} rsync")); - } - if self.timeout > 0 { - cmd.arg(format!("--timeout={}", self.timeout)); - } - cmd.arg(source).arg(dest); - - let status = cmd - .status() - .context("Failed to execute rsync (is it installed?)")?; - if !status.success() { - anyhow::bail!("rsync exited with status: {status}"); - } - Ok(()) - } -} - -/// Which end of the sync a planned change applies to. -#[derive(Clone, Copy)] -enum Side { - Local, - Remote, -} - -impl Side { - /// The tag printed in front of this side's diff, colour-coded so local and - /// remote are easy to tell apart at a glance. - fn tag(self) -> console::StyledObject<&'static str> { - match self { - Side::Local => style(" local ").black().on_cyan().bold(), - Side::Remote => style(" remote ").black().on_magenta().bold(), - } - } -} - -/// Preview the changes both directions would make to a single file, printing -/// a per-side diff for each side that has pending changes. Writes nothing. -fn plan(label: &str, local: Option<&str>, remote: Option<&str>, merged: &str) -> FileStatus { - let local_current = local.unwrap_or(""); - let remote_current = remote.unwrap_or(""); - let local_changes = local_current != merged; - let remote_changes = remote_current != merged; - - if !local_changes && !remote_changes { - return FileStatus::Unchanged; - } - - println!("{}", style(label).bold().underlined()); - if local_changes { - print_side_diff(Side::Local, local_current, merged); - } - if remote_changes { - print_side_diff(Side::Remote, remote_current, merged); - } - println!(); - FileStatus::Updated -} - -/// Apply the merged content to one side, writing `dest` atomically. `current` -/// is that side's existing content (`None` if the file is absent there). -fn apply( - label: &str, - current: Option<&str>, - merged: &str, - dest: &Path, - side: &str, -) -> Result<FileStatus> { - let exists = current.is_some(); - if current.unwrap_or("") == merged { - return Ok(FileStatus::Unchanged); - } - - // Never create an empty new file. - if !merged.is_empty() || exists { - write_atomic(dest, merged)?; - } - - if exists { - eprintln!("Updating {label} on {side}"); - Ok(FileStatus::Updated) - } else { - eprintln!("Creating {label} on {side}"); - Ok(FileStatus::Created) - } -} - -/// Recursively collect the paths of regular files under `dir`, expressed -/// relative to `root`. Symlinks are skipped to avoid traversal loops. -fn collect_files(root: &Path, dir: &Path, out: &mut BTreeSet<PathBuf>) -> Result<()> { - for entry in fs::read_dir(dir).with_context(|| format!("Failed to read {}", dir.display()))? { - let entry = entry?; - let path = entry.path(); - let file_type = entry.file_type()?; - if file_type.is_dir() { - collect_files(root, &path, out)?; - } else if file_type.is_file() { - let rel = path - .strip_prefix(root) - .with_context(|| format!("{} is not under {}", path.display(), root.display()))?; - out.insert(rel.to_path_buf()); - } - } - Ok(()) -} - -/// Read a file, returning `None` if it does not exist. -fn read_optional(path: &Path) -> Result<Option<String>> { - match fs::read_to_string(path) { - Ok(s) => Ok(Some(s)), - Err(e) if e.kind() == std::io::ErrorKind::NotFound => Ok(None), - Err(e) => Err(e).with_context(|| format!("Failed to read {}", path.display())), - } -} - -/// Write `contents` to `path` atomically: stage in a temp file in the same -/// directory and rename into place, so a crash mid-write can't truncate or -/// corrupt the target. -fn write_atomic(path: &Path, contents: &str) -> Result<()> { - let dir = path - .parent() - .with_context(|| format!("{} has no parent directory", path.display()))?; - fs::create_dir_all(dir).with_context(|| format!("Failed to create {}", dir.display()))?; - - let mut tmp = tempfile::NamedTempFile::new_in(dir) - .with_context(|| format!("Failed to create temp file in {}", dir.display()))?; - tmp.write_all(contents.as_bytes()) - .with_context(|| format!("Failed to write {}", path.display()))?; - tmp.persist(path) - .map_err(|e| e.error) - .with_context(|| format!("Failed to persist {}", path.display()))?; - Ok(()) -} - -/// Merge two sides into the file content dam would write. -/// -/// When the file exists on both sides the result is the sorted, de-duplicated -/// union of their non-empty lines. When it exists on only one side that -/// side's content is propagated verbatim (no reordering of brand-new files). -fn merge(local: Option<&str>, remote: Option<&str>) -> String { - match (local, remote) { - (Some(l), Some(r)) => { - let merged = union_lines(l, r); - if merged.is_empty() { - String::new() - } else { - format!("{}\n", merged.join("\n")) - } - } - (Some(only), None) | (None, Some(only)) => only.to_string(), - (None, None) => String::new(), - } -} - -/// Sorted, de-duplicated union of the non-blank lines of `a` and `b`. A -/// trailing carriage return is stripped so CRLF and LF inputs compare equal. -fn union_lines(a: &str, b: &str) -> Vec<String> { - let mut seen = HashSet::new(); - let mut result: Vec<String> = a - .lines() - .chain(b.lines()) - .map(|line| line.trim_end_matches('\r')) - .filter(|line| !line.trim().is_empty()) - .filter(|line| seen.insert(*line)) - .map(str::to_string) - .collect(); - result.sort_by(|a, b| natord::compare(a, b)); - result -} - -/// Print one side's planned change to stdout: a tagged header naming the side -/// with its added/removed counts, followed by only the changed lines. -/// -/// `current` is that side's existing content and `merged` the proposed result, -/// so `+` lines are gained and `-` lines lost. Unchanged lines are omitted to -/// keep the plan focused on the delta. -fn print_side_diff(side: Side, current: &str, merged: &str) { - // Diff the lines themselves rather than the raw text: `lines()` drops the - // terminators, so a missing trailing newline never shows up as a change. - let current: Vec<&str> = current.lines().collect(); - let merged: Vec<&str> = merged.lines().collect(); - let diff = TextDiff::from_slices(&current, &merged); - - // `true` marks an inserted line, `false` a deleted one; equal lines are - // dropped here so the body below is purely the delta. - let mut changes: Vec<(bool, &str)> = Vec::new(); - let (mut added, mut removed) = (0u32, 0u32); - for change in diff.iter_all_changes() { - match change.tag() { - ChangeTag::Insert => added += 1, - ChangeTag::Delete => removed += 1, - ChangeTag::Equal => continue, - } - changes.push((change.tag() == ChangeTag::Insert, change.value())); - } - - println!( - " {} {} {}", - side.tag(), - style(format!("+{added}")).green(), - style(format!("-{removed}")).red(), - ); - for (inserted, line) in changes { - if inserted { - println!(" {}", style(format!("+{line}")).green()); - } else { - println!(" {}", style(format!("-{line}")).red()); - } - } -} - -fn main() -> Result<ExitCode> { - let cli = Cli::parse(); - - let mode = cli.mode.mode(); - - let worker = FileSyncWorker { - host_alias: cli.host, - local_path: cli.local, - remote_path: cli.remote, - mode, - timeout: cli.timeout, - elevate: cli.elevate.command(), - }; - let tally = worker.run()?; - - let code = if tally.errors > 0 { - ExitCode::from(2) - } else if cli.exit_code && mode == Mode::Plan && tally.changed() > 0 { - ExitCode::from(1) - } else { - ExitCode::SUCCESS - }; - Ok(code) -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn union_dedups_sorts_and_drops_blank_lines() { - let got = union_lines("banana\napple\n\napple", "cherry\napple"); - assert_eq!(got, vec!["apple", "banana", "cherry"]); - } - - #[test] - fn union_uses_natural_ordering() { - let got = union_lines("file10\nfile2\nfile1", ""); - assert_eq!(got, vec!["file1", "file2", "file10"]); - } - - #[test] - fn union_normalises_crlf() { - let got = union_lines("a\r\nb\r\n", "b\r\nc\r"); - assert_eq!(got, vec!["a", "b", "c"]); - } - - #[test] - fn merge_unions_when_both_present() { - assert_eq!(merge(Some("b\na"), Some("c\na")), "a\nb\nc\n"); - } - - #[test] - fn merge_propagates_single_side_verbatim() { - // Order is preserved and nothing is sorted when only one side has it. - assert_eq!(merge(Some("z\na\n"), None), "z\na\n"); - assert_eq!(merge(None, Some("z\na\n")), "z\na\n"); - } - - #[test] - fn merge_is_empty_when_neither_present() { - assert_eq!(merge(None, None), ""); - } - - #[test] - fn merge_of_blank_only_content_is_empty() { - assert_eq!(merge(Some("\n\n"), Some(" ")), ""); - } - - #[test] - fn plan_reports_unchanged_when_sides_match() { - let merged = merge(Some("a\nb\n"), Some("a\nb\n")); - assert_eq!( - plan("f", Some("a\nb\n"), Some("a\nb\n"), &merged), - FileStatus::Unchanged - ); - } - - #[test] - fn plan_reports_change_when_sides_differ() { - let merged = merge(Some("a"), Some("b")); - assert_eq!( - plan("f", Some("a"), Some("b"), &merged), - FileStatus::Updated - ); - } - - #[test] - fn apply_creates_updates_and_skips() { - let dir = tempfile::tempdir().unwrap(); - let dest = dir.path().join("f"); - - // Absent target with content -> Created and written. - let created = apply("f", None, "a\nb\n", &dest, "local").unwrap(); - assert_eq!(created, FileStatus::Created); - assert_eq!(fs::read_to_string(&dest).unwrap(), "a\nb\n"); - - // Existing target, new content -> Updated. - let updated = apply("f", Some("a\nb\n"), "a\nb\nc\n", &dest, "local").unwrap(); - assert_eq!(updated, FileStatus::Updated); - assert_eq!(fs::read_to_string(&dest).unwrap(), "a\nb\nc\n"); - - // No difference -> Unchanged, no write needed. - let same = apply("f", Some("x"), "x", &dest, "local").unwrap(); - assert_eq!(same, FileStatus::Unchanged); - } +fn main() -> anyhow::Result<ExitCode> { + dam::run() }