Squashed 'third_party/rules_rust/' content from commit bf59038ca
git-subtree-dir: third_party/rules_rust
git-subtree-split: bf59038cac11798cbaef9f3bf965bad8182b97fa
Signed-off-by: Brian Silverman <bsilver16384@gmail.com>
Change-Id: I5a20e403203d670df467ea97dde9a4ac40339a8d
diff --git a/rust/BUILD.bazel b/rust/BUILD.bazel
new file mode 100644
index 0000000..6fd4ced
--- /dev/null
+++ b/rust/BUILD.bazel
@@ -0,0 +1,30 @@
+load("@bazel_skylib//:bzl_library.bzl", "bzl_library")
+
+package(default_visibility = ["//visibility:public"])
+
+exports_files([
+ "known_shas.bzl",
+ "repositories.bzl",
+ "defs.bzl",
+ "toolchain.bzl",
+])
+
+toolchain_type(
+ name = "toolchain",
+)
+
+bzl_library(
+ name = "bzl_lib",
+ srcs = glob(["**/*.bzl"]),
+ deps = [
+ "//rust/platform:bzl_lib",
+ "//rust/private:bzl_lib",
+ "//rust/settings:bzl_lib",
+ ],
+)
+
+alias(
+ name = "rules",
+ actual = ":bzl_lib",
+ deprecation = "Please use the `@rules_rust//rust:bzl_lib` target instead",
+)
diff --git a/rust/defs.bzl b/rust/defs.bzl
new file mode 100644
index 0000000..dd1b445
--- /dev/null
+++ b/rust/defs.bzl
@@ -0,0 +1,124 @@
+# Copyright 2021 The Bazel Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Public entry point to all Rust rules and supported APIs."""
+
+load(
+ "//rust:toolchain.bzl",
+ _rust_stdlib_filegroup = "rust_stdlib_filegroup",
+)
+load(
+ "//rust/private:clippy.bzl",
+ _capture_clippy_output = "capture_clippy_output",
+ _rust_clippy = "rust_clippy",
+ _rust_clippy_aspect = "rust_clippy_aspect",
+)
+load("//rust/private:common.bzl", _rust_common = "rust_common")
+load(
+ "//rust/private:rust.bzl",
+ _rust_binary = "rust_binary",
+ _rust_library = "rust_library",
+ _rust_proc_macro = "rust_proc_macro",
+ _rust_shared_library = "rust_shared_library",
+ _rust_static_library = "rust_static_library",
+ _rust_test = "rust_test",
+ _rust_test_suite = "rust_test_suite",
+)
+load(
+ "//rust/private:rust_analyzer.bzl",
+ _rust_analyzer = "rust_analyzer",
+ _rust_analyzer_aspect = "rust_analyzer_aspect",
+)
+load(
+ "//rust/private:rustc.bzl",
+ _error_format = "error_format",
+ _extra_exec_rustc_flags = "extra_exec_rustc_flags",
+ _extra_rustc_flags = "extra_rustc_flags",
+)
+load(
+ "//rust/private:rustdoc.bzl",
+ _rust_doc = "rust_doc",
+)
+load(
+ "//rust/private:rustdoc_test.bzl",
+ _rust_doc_test = "rust_doc_test",
+)
+load(
+ "//rust/private:rustfmt.bzl",
+ _rustfmt_aspect = "rustfmt_aspect",
+ _rustfmt_test = "rustfmt_test",
+)
+
+rust_library = _rust_library
+# See @rules_rust//rust/private:rust.bzl for a complete description.
+
+rust_static_library = _rust_static_library
+# See @rules_rust//rust/private:rust.bzl for a complete description.
+
+rust_shared_library = _rust_shared_library
+# See @rules_rust//rust/private:rust.bzl for a complete description.
+
+rust_proc_macro = _rust_proc_macro
+# See @rules_rust//rust/private:rust.bzl for a complete description.
+
+rust_binary = _rust_binary
+# See @rules_rust//rust/private:rust.bzl for a complete description.
+
+rust_test = _rust_test
+# See @rules_rust//rust/private:rust.bzl for a complete description.
+
+rust_test_suite = _rust_test_suite
+# See @rules_rust//rust/private:rust.bzl for a complete description.
+
+rust_doc = _rust_doc
+# See @rules_rust//rust/private:rustdoc.bzl for a complete description.
+
+rust_doc_test = _rust_doc_test
+# See @rules_rust//rust/private:rustdoc_test.bzl for a complete description.
+
+rust_clippy_aspect = _rust_clippy_aspect
+# See @rules_rust//rust/private:clippy.bzl for a complete description.
+
+rust_clippy = _rust_clippy
+# See @rules_rust//rust/private:clippy.bzl for a complete description.
+
+capture_clippy_output = _capture_clippy_output
+# See @rules_rust//rust/private:clippy.bzl for a complete description.
+
+error_format = _error_format
+# See @rules_rust//rust/private:rustc.bzl for a complete description.
+
+extra_rustc_flags = _extra_rustc_flags
+# See @rules_rust//rust/private:rustc.bzl for a complete description.
+
+extra_exec_rustc_flags = _extra_exec_rustc_flags
+# See @rules_rust//rust/private:rustc.bzl for a complete description.
+
+rust_common = _rust_common
+# See @rules_rust//rust/private:common.bzl for a complete description.
+
+rust_analyzer_aspect = _rust_analyzer_aspect
+# See @rules_rust//rust/private:rust_analyzer.bzl for a complete description.
+
+rust_analyzer = _rust_analyzer
+# See @rules_rust//rust/private:rust_analyzer.bzl for a complete description.
+
+rustfmt_aspect = _rustfmt_aspect
+# See @rules_rust//rust/private:rustfmt.bzl for a complete description.
+
+rustfmt_test = _rustfmt_test
+# See @rules_rust//rust/private:rustfmt.bzl for a complete description.
+
+rust_stdlib_filegroup = _rust_stdlib_filegroup
+# See @rules_rust//rust:toolchain.bzl for a complete description.
diff --git a/rust/known_shas.bzl b/rust/known_shas.bzl
new file mode 100644
index 0000000..a4b5762
--- /dev/null
+++ b/rust/known_shas.bzl
@@ -0,0 +1,2470 @@
+"""A module containing a mapping of Rust tools to checksums
+
+This is a generated file -- see //util:fetch_shas
+"""
+
+FILE_KEY_TO_SHA = {
+ "2018-10-30/cargo-beta-aarch64-unknown-linux-gnu": "9d91fb3ee868421fbf8f4ed62cb7ee843dc6a1e70241331a9441e3ff09f3296d",
+ "2018-10-30/cargo-beta-x86_64-apple-darwin": "920d7218ded8ebd69628f7a7a1043117bec1ed6574ea8babbda66ddb7d0ea5f8",
+ "2018-10-30/cargo-beta-x86_64-pc-windows-msvc": "4f76c6264d36f1b0e9e23548d069386ff1b60a85a412596fc122484a4ed942fc",
+ "2018-10-30/cargo-beta-x86_64-unknown-freebsd": "be7ac5c344ca6038a7bcfbeb20c5847ce910ec39cf9a63b8b3e07cb6105dabb2",
+ "2018-10-30/cargo-beta-x86_64-unknown-linux-gnu": "097711a227d157c12a322dbe57f75eb28c7934869ce8aecc48d9946706234994",
+ "2018-10-30/clippy-beta-x86_64-apple-darwin": "84331ae735c78cd1d335b8b5da3c9232d70123197c62f3d7fe32b3bd7a97d1e6",
+ "2018-10-30/clippy-beta-x86_64-pc-windows-msvc": "a59573b3b71c318a75214876c30de03327c4b0409a2e9fa0127ef0ac4eab555d",
+ "2018-10-30/clippy-beta-x86_64-unknown-freebsd": "1fcc9d117d5721f3f4c6afb109c626fec238376666f448f61ed5aeaaa6c5a1d8",
+ "2018-10-30/clippy-beta-x86_64-unknown-linux-gnu": "eee913773c93ec0443aea1629d936b5a4e114e977318d4ef77b6bedf42cd4129",
+ "2018-10-30/llvm-tools-beta-aarch64-unknown-linux-gnu": "9417a07c501e173fe3848c815b8536cf70c6518c8040d45b19260ca3ab720760",
+ "2018-10-30/llvm-tools-beta-x86_64-apple-darwin": "b86d22bc723936f23186acaa94cd0738ff1c7b703d67712be62d99845a6ccc80",
+ "2018-10-30/llvm-tools-beta-x86_64-pc-windows-msvc": "cf74e15df51033370d4225fd9141f4cfc5c37145070d2296915fbecab9275b03",
+ "2018-10-30/llvm-tools-beta-x86_64-unknown-freebsd": "38ba85ec56c374b606a586221185ac351d04871892055f8936f28958e5e7a5cb",
+ "2018-10-30/llvm-tools-beta-x86_64-unknown-linux-gnu": "8d96f1475fc27f21d80bda80496783aa3181a4b33a138b7a89edcef2ddb6cf58",
+ "2018-10-30/rust-beta-aarch64-unknown-linux-gnu": "e9bc9d4a89299595ef42cde7303b50a7921e20a5ee4d131c4e1770a391611303",
+ "2018-10-30/rust-beta-x86_64-apple-darwin": "51acc0077d6abae5beed0e7b99c39ae9b8a0ff0f66daec227caef653046144e6",
+ "2018-10-30/rust-beta-x86_64-pc-windows-msvc": "07f3e42ba299b3b5341b410c4317161eba4b40bbc9fc449a9c187193fe49250c",
+ "2018-10-30/rust-beta-x86_64-unknown-freebsd": "49f1efe5bf10319446a298096dea73e478a466daca20a5b93d5263925e4ba9be",
+ "2018-10-30/rust-beta-x86_64-unknown-linux-gnu": "07963c2d6d56d077856f17e786414cf965832e7942f4ec72dec2eb51452e74b7",
+ "2018-10-30/rust-std-beta-aarch64-unknown-linux-gnu": "bf0895ccf65a86c1f51dbbebd0980bd07dcdc3919407fc84f5838cbbcb29e309",
+ "2018-10-30/rust-std-beta-aarch64-unknown-linux-musl": "53c07a1bdae00c0ad587349006e4080c50d511c0368f848fc98bf678dd3f6470",
+ "2018-10-30/rust-std-beta-wasm32-unknown-unknown": "5453e05993aaa90c8ac361086dd888a29a48f1b90b2c2184202c4b44b2e5569d",
+ "2018-10-30/rust-std-beta-x86_64-apple-darwin": "96fc1daea8868e176a14706333590b13a41193bd8ed5a711f23a15eceb5c6ce0",
+ "2018-10-30/rust-std-beta-x86_64-pc-windows-msvc": "6af758524d77288cb5c548d26467680d57aeb778063787662b1e00ef3887866a",
+ "2018-10-30/rust-std-beta-x86_64-unknown-freebsd": "5aef62464a5580ab6b38c9e54203db12f90ad42de538b7a5eefc7778b55b6497",
+ "2018-10-30/rust-std-beta-x86_64-unknown-linux-gnu": "34996a688d6a4c3587f873b0a8c86fe1d2fee2a269b6e669b1cb8c6908fb77b8",
+ "2018-10-30/rust-std-beta-x86_64-unknown-linux-musl": "6e9474546838c061288e8464d28a843814bc2ff4c9d06a5fba065c1b03650be4",
+ "2018-10-30/rustc-beta-aarch64-unknown-linux-gnu": "e6bb89261baa494ef98239bde9821b66671de5cd78352a9c100abce3a18ca250",
+ "2018-10-30/rustc-beta-x86_64-apple-darwin": "22153f359b8b98341aa0349233112fff2b9f092988f9d678626207ba29666b5b",
+ "2018-10-30/rustc-beta-x86_64-pc-windows-msvc": "9cd8225f1307aab95b439dbecd70aaa35e03c913ba0897dc7fe3a04755fc15b1",
+ "2018-10-30/rustc-beta-x86_64-unknown-freebsd": "e207562cd5e3a17497e029bcb1cab56d9fa474d788906f13e389a3cb804ea4d6",
+ "2018-10-30/rustc-beta-x86_64-unknown-linux-gnu": "63b69b000cda551f2499ffba6e3f1700acb2b22a47ca9ec9edcc3e578ed086e6",
+ "2018-10-30/rustfmt-beta-aarch64-unknown-linux-gnu": "bd97e8012277d49beececdf4125610c2d0112cd22f8add53f86fd7c6dac5dc0d",
+ "2018-10-30/rustfmt-beta-x86_64-apple-darwin": "2c213f43902104ebefe9eee6fa49aa36e16af972cb7aa1c63d772e5d05f74b59",
+ "2018-10-30/rustfmt-beta-x86_64-pc-windows-msvc": "316331e7aed82251ab3b701845e8b1e707947670498ce4fc364ce1d6813e1340",
+ "2018-10-30/rustfmt-beta-x86_64-unknown-freebsd": "17826e710d5912d23cd981b46b598733cf8833c20dc7d03d150c5e53ad0a38d3",
+ "2018-10-30/rustfmt-beta-x86_64-unknown-linux-gnu": "4af3f9faacd78deef2e8a06e2971ebc7540de07525ac805fcf334818a6ee0e97",
+ "2018-11-01/cargo-beta-aarch64-unknown-linux-gnu": "44802e459a0bc1677b52593d413959982c30786524412e9e1c61d67c8230d4f6",
+ "2018-11-01/cargo-beta-x86_64-apple-darwin": "e5130c79154056a451d95a3b213622d0e7e3dd3625735fa5ae725fa50849facb",
+ "2018-11-01/cargo-beta-x86_64-pc-windows-msvc": "481f845f171e4566c59d9a2df802c678b6102d2d661b731e2a71a50c597cbeca",
+ "2018-11-01/cargo-beta-x86_64-unknown-freebsd": "0b596632c675a277fac894b644ecdb86d6f44036dd089ce8d410fdd04354b8f1",
+ "2018-11-01/cargo-beta-x86_64-unknown-linux-gnu": "8519d3fca6aca45ed94daeecbd8d25c9bd1c75f1acc5078b64b771bce6986b44",
+ "2018-11-01/clippy-beta-x86_64-apple-darwin": "8672df2c6b8a18bbf9b654188de22bc8ce4c8bc407d2b3fe3ef208add4e27cdd",
+ "2018-11-01/clippy-beta-x86_64-pc-windows-msvc": "4cea4a9cbbc0b56efe11078711d244ab87de3397873c437f3f70614ef896ff83",
+ "2018-11-01/clippy-beta-x86_64-unknown-freebsd": "03fabba8670a06faeee0a944ca8e911e717a739c2bae0262c2257db69a7014f5",
+ "2018-11-01/clippy-beta-x86_64-unknown-linux-gnu": "0ad5f06495177901addb72d8eec3926986e10290969493eba0e8b465962985e7",
+ "2018-11-01/llvm-tools-beta-aarch64-unknown-linux-gnu": "7b3f5bb7f45052310efe275ed665b54b55e19b9020b04cec9240318c13c62c0d",
+ "2018-11-01/llvm-tools-beta-x86_64-apple-darwin": "b45ae0fb0b49385b555772a3faa9a5a85aa10f4bd24ba40c55048076d8cda314",
+ "2018-11-01/llvm-tools-beta-x86_64-pc-windows-msvc": "462668f55b85fa1224df30449eb67e8fe0d208caeea39d9339b44ac30867f452",
+ "2018-11-01/llvm-tools-beta-x86_64-unknown-freebsd": "acd86ceedad9f10b2cb3443df032d0b5a9b4eb6c4b30364bd3cb014449607577",
+ "2018-11-01/llvm-tools-beta-x86_64-unknown-linux-gnu": "4b4363c2d03d319e84a7f09fba5b58d188d9fdd62c9486cc4b66e9e63030ab27",
+ "2018-11-01/rust-beta-aarch64-unknown-linux-gnu": "f802784788c2e751d59d035363fb6be2b0450d650ec523115a51fea05fc8589b",
+ "2018-11-01/rust-beta-x86_64-apple-darwin": "0be8d634d17b2f92c86515a38e36f66a9f3d72bad226db58ff8cd09924092f53",
+ "2018-11-01/rust-beta-x86_64-pc-windows-msvc": "d86d633b67e6c0fba28963f5c991738575fee56c755570e505f702eed54150e9",
+ "2018-11-01/rust-beta-x86_64-unknown-freebsd": "869f1d01077a318ff0ac664a498354b079c2fc16cbec294161a56cabe6f3e194",
+ "2018-11-01/rust-beta-x86_64-unknown-linux-gnu": "7da7bd24c2f2dafa9d4baa6e7eba1547f62681fbd1dd89910d386b2260e65ca6",
+ "2018-11-01/rust-std-beta-aarch64-unknown-linux-gnu": "137d39872981d343829a8f3eecf0f33fe2f0d81ed18865004b52359d309a6b95",
+ "2018-11-01/rust-std-beta-aarch64-unknown-linux-musl": "5eb228ae2a53abfdfbfaa471a2afda29cc2b923adb82322a0c20af4592c226e5",
+ "2018-11-01/rust-std-beta-wasm32-unknown-unknown": "4f7fa7f3adafc2ec5de80cddfd3fc3072da43442cd15be9169b261f76a0a684b",
+ "2018-11-01/rust-std-beta-x86_64-apple-darwin": "bee742244d72ea7289d5d2dea519102994dbee97a5c296b2a8c6853e5450a7ab",
+ "2018-11-01/rust-std-beta-x86_64-pc-windows-msvc": "455ecff7f11499cd3822b82ecf0ab8ab34d866c4b5e17b0de84af815a782f226",
+ "2018-11-01/rust-std-beta-x86_64-unknown-freebsd": "eed13a5c36c0731b01b8926f26be5b054c341a0487628fca688e8e99f33b200b",
+ "2018-11-01/rust-std-beta-x86_64-unknown-linux-gnu": "f38a224bccfc89bd0d598764363271985d0b2696123ea10de6399c4cc7dd8adb",
+ "2018-11-01/rust-std-beta-x86_64-unknown-linux-musl": "b4f8c208a50e2640fc3761675bef31c9960e74976a1537c2fd8c9dc8a9d5fdd8",
+ "2018-11-01/rustc-beta-aarch64-unknown-linux-gnu": "acf359a4cecfc827f5ca4255c0492d46223d09d535444f0b303678918944c87c",
+ "2018-11-01/rustc-beta-x86_64-apple-darwin": "64b5a5fc8b3dc348395137df2c422adbf483168c58af5cd9acc8522dd9b4392b",
+ "2018-11-01/rustc-beta-x86_64-pc-windows-msvc": "71cbfd2793f6b55653f5ef4bdf0350dfe6d9b0952d518a3a355044ec7caa03c2",
+ "2018-11-01/rustc-beta-x86_64-unknown-freebsd": "51a5370f1776229bede506e5ab05da7cfeb5bd21a5374561acb4b7138c75d508",
+ "2018-11-01/rustc-beta-x86_64-unknown-linux-gnu": "01609bedca249906ba8e07fb681daffe094cdbf41b91e2221195474271d8e6d7",
+ "2018-11-01/rustfmt-beta-aarch64-unknown-linux-gnu": "0969e37628a3d5e56cfc0636db4d1aac7d0b01ab9df6bdeb3453adc1e2ae786e",
+ "2018-11-01/rustfmt-beta-x86_64-apple-darwin": "bbb45d6beddf8da270ab1ec6ea3b9dc2ffc03f5ba1ef3e99e87d004f652f2581",
+ "2018-11-01/rustfmt-beta-x86_64-pc-windows-msvc": "2d34424353e248173828898107e331acfbaa29a3686bb8121fdc72fbab7a37e8",
+ "2018-11-01/rustfmt-beta-x86_64-unknown-freebsd": "101a0903c5421df363420d73ebbdb52b3cb8b2bb5ecee9e383b271aa22446f95",
+ "2018-11-01/rustfmt-beta-x86_64-unknown-linux-gnu": "12d49bf16a8e5964163d12a58e8caa5bf81fedd106dc37bbd757aa4116f0d7b3",
+ "2018-11-02/cargo-beta-aarch64-unknown-linux-gnu": "808e7129f0f414e05def68ac72bb8f59871a0d21eaa9a6b9a59afa87502858bc",
+ "2018-11-02/cargo-beta-x86_64-apple-darwin": "72fce301579b799b392407c49e162285ba24ca17ad1d96ca701c7d03c83d69d0",
+ "2018-11-02/cargo-beta-x86_64-pc-windows-msvc": "f2a98c4c8928d7d3070c86c02ab93e6d78c85312e1eee2867efabf00ae235692",
+ "2018-11-02/cargo-beta-x86_64-unknown-freebsd": "8069c2b1657b3dc747912775b1569426bccf35fe6c23073408847ef232174419",
+ "2018-11-02/cargo-beta-x86_64-unknown-linux-gnu": "2e9418c06ea6dc3f869ebd12e31da2affe9568871e65f013b3695a92bdfa4c31",
+ "2018-11-02/clippy-beta-x86_64-apple-darwin": "921f5d07e73a5651173187012c476a7999f5cd78f52eafad4e8c15f2bab25b42",
+ "2018-11-02/clippy-beta-x86_64-pc-windows-msvc": "eee0ff30ede35ab957061b579836de5f9b91c36d57e71c22344c76d421abd4dc",
+ "2018-11-02/clippy-beta-x86_64-unknown-freebsd": "440576edb7ac7775d5511780662b8c820da8cfdcf71dfe7a169758547d5f94e4",
+ "2018-11-02/clippy-beta-x86_64-unknown-linux-gnu": "3ce406e0c2bb246c96940e4054b5fa9b049580ae4b61e170da2008ff945af970",
+ "2018-11-02/llvm-tools-beta-aarch64-unknown-linux-gnu": "f8021a8a0d302eb4774d31789932488e0897ec72b0d8c16cb746a2d72b749238",
+ "2018-11-02/llvm-tools-beta-x86_64-apple-darwin": "88693cabad55f568ca0c21276e76eb237215abdc9771f224ab807f8edd3aad08",
+ "2018-11-02/llvm-tools-beta-x86_64-pc-windows-msvc": "4b2f2c707bbd3506c55d48d1ff3cadd290445b227c868d596a535faa798f06cf",
+ "2018-11-02/llvm-tools-beta-x86_64-unknown-freebsd": "c8c48f8805b794ac63cbd60bb28d77c575d754c6c97af006bcf6b466adb5ecab",
+ "2018-11-02/llvm-tools-beta-x86_64-unknown-linux-gnu": "92472b453b0a6dbc38cef53cba6d38b5dbc79e3637743b77239543b33084d121",
+ "2018-11-02/rust-beta-aarch64-unknown-linux-gnu": "6e28b053d8ebcef7a19875089db13931ce89bb045d06b4bf834334df3fa43962",
+ "2018-11-02/rust-beta-x86_64-apple-darwin": "78e9fd57d2070cbe2a073758839d54b5535e14918c11260fb244bade3c1971a3",
+ "2018-11-02/rust-beta-x86_64-pc-windows-msvc": "68c0fcbd1f9887eff41c42b703fb2c34b99b2490f4e366efeee4a6bf0c1044c2",
+ "2018-11-02/rust-beta-x86_64-unknown-freebsd": "8313e8655fca87519c469c5699cf803fb0c1bd159ee335aac199ae76753f359d",
+ "2018-11-02/rust-beta-x86_64-unknown-linux-gnu": "76b2d14dc01a922b448019df7a24221f91c7eaa3e2034fcbd6189d5bac7836e4",
+ "2018-11-02/rust-std-beta-aarch64-unknown-linux-gnu": "0d57f4837af1443208abce604d74dcf6880d0cdf4e74eaf2368016f064dbc7ab",
+ "2018-11-02/rust-std-beta-aarch64-unknown-linux-musl": "0d5e585506b4cde724040d340e8e2d4a3ebe04950ca863adb238c83f9462e696",
+ "2018-11-02/rust-std-beta-wasm32-unknown-unknown": "25c7e8dbf27dd19d3d4f91062d9cb9bc6ad9aed8afacbd47dab92eba3a3d2533",
+ "2018-11-02/rust-std-beta-x86_64-apple-darwin": "fdc26de5db0e66e0f516069690a0c86ca0e4b8b75973a33dee67ce306e4c9115",
+ "2018-11-02/rust-std-beta-x86_64-pc-windows-msvc": "8c7dfe0692e2c0b9de130b64e8ab09946eff2eb419a22bb7a15cd9522995f420",
+ "2018-11-02/rust-std-beta-x86_64-unknown-freebsd": "4661fdd15b5cee0fafd4c9cb085d0614abab0b2b1d62a55540b3d4d2634c4ba7",
+ "2018-11-02/rust-std-beta-x86_64-unknown-linux-gnu": "3e2f68697620e501a9439bb7923f5676c82f7a4b4aaf822a141188c92619fe13",
+ "2018-11-02/rust-std-beta-x86_64-unknown-linux-musl": "88662ac89a6c9df7a5a77db8624777cb9ccf0ecdd9a0ced1ef9bc47e7c9e8eed",
+ "2018-11-02/rustc-beta-aarch64-unknown-linux-gnu": "d703f1cdecd77aba85024db5e94f13e50c74e66af21091107c7cd67a3179da15",
+ "2018-11-02/rustc-beta-x86_64-apple-darwin": "199a0776ad4f1406b8b6f477d12c58858816f07246d52842384e1084d8c9000e",
+ "2018-11-02/rustc-beta-x86_64-pc-windows-msvc": "a4fd3838f4459a151e83d540784953cd80c5a1a68fe3bf965399c1f07f6476bb",
+ "2018-11-02/rustc-beta-x86_64-unknown-freebsd": "f931cb44b892dc3899c9379238d8f51d35c9503db9e93ce5700f3121712c9b62",
+ "2018-11-02/rustc-beta-x86_64-unknown-linux-gnu": "7ebd46c431b8d9e8d22aa141122eaf301d5facdc449e04872019372598b04b19",
+ "2018-11-02/rustfmt-beta-aarch64-unknown-linux-gnu": "c13f8024e37f7b2b6d97586569bdefca53e99514e4b76b200b71932f4a7ce298",
+ "2018-11-02/rustfmt-beta-x86_64-apple-darwin": "0164c2c57b3ee975c571103dbf7074e24c997cc43df23920660f12de688e8c23",
+ "2018-11-02/rustfmt-beta-x86_64-pc-windows-msvc": "c33b4fe885e21f51b08dfa29d04179d0f138e87122f4f4a3898fa002567f2259",
+ "2018-11-02/rustfmt-beta-x86_64-unknown-freebsd": "ad280d28d4e7054063942cd5a60cc35538af5096f29e159ba13419b82be5560c",
+ "2018-11-02/rustfmt-beta-x86_64-unknown-linux-gnu": "60ec376659a4ad5b129307ffef4dfe9b717fcee6f5d929b1e3e423e599258be2",
+ "2018-11-07/cargo-nightly-aarch64-unknown-linux-gnu": "45f1fe31b55aac2de8fa98c5738704481e27c3bf206ca7a65b165b301f473a1e",
+ "2018-11-07/cargo-nightly-x86_64-apple-darwin": "35ad1d24795b3fe97dc06fe3b1a45c2e75cc9e62bdf491d4964863920b311e0d",
+ "2018-11-07/cargo-nightly-x86_64-pc-windows-msvc": "7147bc0363fb84aa2feda337a6bf7e3f16f26aef893218cd0b59c31793c06253",
+ "2018-11-07/cargo-nightly-x86_64-unknown-freebsd": "d537821f8acf2a89d44bc534fbf5efc27785df372005046be927c0d1ae088a23",
+ "2018-11-07/cargo-nightly-x86_64-unknown-linux-gnu": "7968167992937ad8e7284c9ea00040ddd873b759b2595eb67eea68ce81abf627",
+ "2018-11-07/clippy-nightly-x86_64-apple-darwin": "7ee34bc4e2b1121ecb8ad01bbebc54f83bafd72acb8e4f81bb3cd1106fc29cdb",
+ "2018-11-07/clippy-nightly-x86_64-pc-windows-msvc": "a65fd2d2c7e53d3876808b41491d2556a55e399a470d747427f6ece40251ca89",
+ "2018-11-07/clippy-nightly-x86_64-unknown-freebsd": "664296ae2a0226abcb58d01067b3a614fa6c66afb821e36be17faa205ef14f70",
+ "2018-11-07/clippy-nightly-x86_64-unknown-linux-gnu": "62cf4c3f179e14b6b26485d85ebf17ff676b87938c14bb1ce19d93c02197d091",
+ "2018-11-07/llvm-tools-nightly-aarch64-unknown-linux-gnu": "c2dd30b73e5e0495d7d4c05cf98f50197c00f542cef7f3ef37e095d0d8686991",
+ "2018-11-07/llvm-tools-nightly-x86_64-apple-darwin": "2cd61d0f54d3753777b019d09a2e88cc9a2fb027e947a14eb1f509e014ff19e9",
+ "2018-11-07/llvm-tools-nightly-x86_64-pc-windows-msvc": "14c6387239ee0bd8d9d9ca0c21c808a542de4133e8477fc2f1fc958eaf6c4428",
+ "2018-11-07/llvm-tools-nightly-x86_64-unknown-freebsd": "52a726f57b80cc7d29c15b93ad35e3a7ab62fcfbd7d89f91021a783be6ffbd18",
+ "2018-11-07/llvm-tools-nightly-x86_64-unknown-linux-gnu": "ddd007ee68b7468a12d240d0f08939efa262e8d96ad7f903cbef62b461a61417",
+ "2018-11-07/rust-nightly-aarch64-unknown-linux-gnu": "f4725077e948b6eda7d4cd482a8985037a2f8ddaecc964908a490deb9ac46e21",
+ "2018-11-07/rust-nightly-x86_64-apple-darwin": "b9aaefca51aa2d7e89f5d790e865d00ec4142c79cebee43ba0d575f9f52ee65b",
+ "2018-11-07/rust-nightly-x86_64-pc-windows-msvc": "5826f958e4826b0bd0069918185afc6db0802e6d3fe72a9be075f3408b707521",
+ "2018-11-07/rust-nightly-x86_64-unknown-freebsd": "38860320b7e97193493e45d362f34d311d7aa8fface77c93fadfa15e8361df3d",
+ "2018-11-07/rust-nightly-x86_64-unknown-linux-gnu": "c1d7542e90f76d074a7ea925b5ce40ec602c9e3e04822939623a98c4d020ea2e",
+ "2018-11-07/rust-std-nightly-aarch64-unknown-linux-gnu": "e7a4629ab15609fda17a9e16cb0f7538d4077f572ece200891726344e314295b",
+ "2018-11-07/rust-std-nightly-aarch64-unknown-linux-musl": "25b7b0cef1f802182ffd26e62defbc5f6fc79504739d14627bc74ca1db24bdaf",
+ "2018-11-07/rust-std-nightly-wasm32-unknown-unknown": "9d1bcbf50fdcd9912fd98901ec40c7fd5d73ef2262a70322b4ca52381363c34c",
+ "2018-11-07/rust-std-nightly-x86_64-apple-darwin": "0c988a60e72d545b19b5cef616ddd3411a278226abccceca622581871f2b5cce",
+ "2018-11-07/rust-std-nightly-x86_64-pc-windows-msvc": "0d04200b3bc5ad5f939d98f7af083c0576aae11876830492f9964de23dd33acd",
+ "2018-11-07/rust-std-nightly-x86_64-unknown-freebsd": "ca648e7eb243cec32dc5a1b4e2fe6d67c2a00be56326e4d7aec9f2bbeb4dc138",
+ "2018-11-07/rust-std-nightly-x86_64-unknown-linux-gnu": "bd8daba5c2d36e261da6f0ea8b5893e7fe94252eca7478d581c036fc1acb7c36",
+ "2018-11-07/rust-std-nightly-x86_64-unknown-linux-musl": "9d5bb908baa470e4da390f5b32f7db2c15fdc347d379b61522a33128bb486b12",
+ "2018-11-07/rustc-nightly-aarch64-unknown-linux-gnu": "11caf45fef229d85efb36cdbcf955d95fae648c27ca4ffd153bad316eb58793a",
+ "2018-11-07/rustc-nightly-x86_64-apple-darwin": "cddecdb0d595cb8b944bf70b2284f557743f5637536f2181ad0036806cf56217",
+ "2018-11-07/rustc-nightly-x86_64-pc-windows-msvc": "479f58f34616b83c003fa29e68ee84c91ee5521038f255a7cd3b597a2f5082d0",
+ "2018-11-07/rustc-nightly-x86_64-unknown-freebsd": "47f81ec8c4ebbcd4e948033b5db72c1e9bec6f284fdaa5bdf59bcc92b075333f",
+ "2018-11-07/rustc-nightly-x86_64-unknown-linux-gnu": "7f1aa11f8e503e6e9a03b6cd05ab12b46837bb7597167c72112abaf1481e46cd",
+ "2018-11-07/rustfmt-nightly-aarch64-unknown-linux-gnu": "9b64705de20633c73a39d47deacbacdce11181dc5e06fa632ef08b8a3a7136e0",
+ "2018-11-07/rustfmt-nightly-x86_64-apple-darwin": "bb86c58a5a12922ddd2d19a3cffe9cd8d87785e57f72cdc998e94926a68345a2",
+ "2018-11-07/rustfmt-nightly-x86_64-pc-windows-msvc": "4612d2961bc5d0b24863af21fd0764b8ec8d2a843f1a39b97b418bc283b8fa2b",
+ "2018-11-07/rustfmt-nightly-x86_64-unknown-freebsd": "b0677e91bb7c0645844f988e7f7b625768f0a72947536a27fce7f5a9a850c5e0",
+ "2018-11-07/rustfmt-nightly-x86_64-unknown-linux-gnu": "e1dbad0cb0afccdf5e05f97129f9d34bc62ce6475dd8f09fad2d31a8129acf64",
+ "2018-11-08/cargo-nightly-aarch64-unknown-linux-gnu": "df9cf735f2c0efc48356832b0a11ae3f6df0d78879fb93a3b9cfecb15e79010b",
+ "2018-11-08/cargo-nightly-x86_64-apple-darwin": "e0a585f21907bd78820c4fd0ac56625ba10053a9430e9fab014e90e42f4a1fab",
+ "2018-11-08/cargo-nightly-x86_64-pc-windows-msvc": "025741e19216a317d8c2bb27950fbd7c3eef6eae075c606fc4b0622d3a92b89c",
+ "2018-11-08/cargo-nightly-x86_64-unknown-freebsd": "7e9343a3885caa12c1fb7f3007e8c72ce0a11ea6696839e0882ef7e560aed6d8",
+ "2018-11-08/cargo-nightly-x86_64-unknown-linux-gnu": "b421dd73cac889804f9d3758f5ef32157885a043abfb21651182fc9f672b7491",
+ "2018-11-08/clippy-nightly-x86_64-apple-darwin": "a1b8fa097c8814ea239bc78f13df97a39d7361516b68ef340d9e42d0ee2905e3",
+ "2018-11-08/clippy-nightly-x86_64-pc-windows-msvc": "f863e10d8b82428771ac10a3219094f4252239df68f611a4dfa075a836f6be75",
+ "2018-11-08/clippy-nightly-x86_64-unknown-freebsd": "87cc3be056acb88e08d2dffbe7924aea58e39bb7380cda44e23748f790f15e95",
+ "2018-11-08/clippy-nightly-x86_64-unknown-linux-gnu": "b1f0ca2c7f5367dc044a3ca1702618e0e58f777369d470a8173355e2f4507127",
+ "2018-11-08/llvm-tools-nightly-aarch64-unknown-linux-gnu": "fe2283cabacf6b8dbcd8d11eddb11a2badb750091ec5b38926ad48d3577da601",
+ "2018-11-08/llvm-tools-nightly-x86_64-apple-darwin": "b173d662715ec4edacdb8e06570cd471a6f63d05b49c6867f95ec366f8a2e0db",
+ "2018-11-08/llvm-tools-nightly-x86_64-pc-windows-msvc": "558cd81ceb5e08766ade45cffc98a8d1a179d34f671f9b9518627e8358d65984",
+ "2018-11-08/llvm-tools-nightly-x86_64-unknown-freebsd": "7d77f85900b0aa276df746bc023b1211c4221e6183ef62663565b65b8fadd9f8",
+ "2018-11-08/llvm-tools-nightly-x86_64-unknown-linux-gnu": "c634eb65a3839b176563823d576b1f4705cfcb3e91b237f2c4f852ff5ba08d2a",
+ "2018-11-08/rust-nightly-aarch64-unknown-linux-gnu": "20ef5c5f59171df0335846c6c3315c5e3c495775e3c5b1060481d70421153412",
+ "2018-11-08/rust-nightly-x86_64-apple-darwin": "921f19787a155e5240e21fb2bc630e5907b964652b0f7553b64acf819a0a2d43",
+ "2018-11-08/rust-nightly-x86_64-pc-windows-msvc": "46d76bb12cedd53927cb35fb688540010b5152568467508fa92b0745f0e39463",
+ "2018-11-08/rust-nightly-x86_64-unknown-freebsd": "32c28d8e915086406a3493d59d0e3b4c4751f77a3b34d257a3341aa4e5f8ad4f",
+ "2018-11-08/rust-nightly-x86_64-unknown-linux-gnu": "5f33f1c01720e471b8293d304a01f354363418dc7ceebf206529a34f932c3a82",
+ "2018-11-08/rust-std-nightly-aarch64-unknown-linux-gnu": "e83ecf484a848053a8679c8164340f90bd6c5823d9340b4fc5318c6265e544f1",
+ "2018-11-08/rust-std-nightly-aarch64-unknown-linux-musl": "89e192bc7e9fad3eea6e24f967b9405b35c677b1fe3a6b8fb4ab4def4f6378d9",
+ "2018-11-08/rust-std-nightly-wasm32-unknown-unknown": "0e12ecd9a2bbff67b8d82c15200acdd32d1f91fc1761d0b72fbbb5d32ae629f9",
+ "2018-11-08/rust-std-nightly-x86_64-apple-darwin": "9d5e89e71f888247093b5615079da538a56c2758eac270173a4f85a57ef92967",
+ "2018-11-08/rust-std-nightly-x86_64-pc-windows-msvc": "e891a3ee103e65e8e337b3c9c9d1e410c4be97b1318f820b591565b5ae6340ff",
+ "2018-11-08/rust-std-nightly-x86_64-unknown-freebsd": "64aabfec15a2b773c27892e58514161cb05ab370e3291beb1cafc7d270772389",
+ "2018-11-08/rust-std-nightly-x86_64-unknown-linux-gnu": "efb8f6f6aa2c5a3f1c069e05b74fde6a85985837054faf3bc565d839902efedc",
+ "2018-11-08/rust-std-nightly-x86_64-unknown-linux-musl": "d2629d2ae1dae0b80bff33350f1bd469e145bfc4b935ff4bcb79240ff23ab279",
+ "2018-11-08/rustc-nightly-aarch64-unknown-linux-gnu": "494173aa705efeef4df2d88278608bd71b477183d85a670a577051c76c5ee99c",
+ "2018-11-08/rustc-nightly-x86_64-apple-darwin": "316e7727a136a82a20832a69b18f74add335e9b659fa7e0d8c7d12c0d11224b7",
+ "2018-11-08/rustc-nightly-x86_64-pc-windows-msvc": "489cb54446374eccc78eca18aa86b4159d47fdfa7bab0ea9a20cb68fa4d80071",
+ "2018-11-08/rustc-nightly-x86_64-unknown-freebsd": "874b7055e0cb609ce34d38456bda888865c63fcbc7abac5aad147f2a21a7d147",
+ "2018-11-08/rustc-nightly-x86_64-unknown-linux-gnu": "e50e43d71573e069503aa6157d1736d390345006965fa889842835ce80ae36e2",
+ "2018-11-08/rustfmt-nightly-aarch64-unknown-linux-gnu": "4f5f4077d0e1c888fa3366dad638b5e8c7aa032deab83334a170d8e4275d8e47",
+ "2018-11-08/rustfmt-nightly-x86_64-apple-darwin": "b6a0f812726134aea52e2b6ad708c0fb1052f80f1515a66cddeeef07052a67cb",
+ "2018-11-08/rustfmt-nightly-x86_64-pc-windows-msvc": "eb444b276ae5f6ed2c1e6dce994e17ebb94b130747a05c402e0c96b2623a554d",
+ "2018-11-08/rustfmt-nightly-x86_64-unknown-freebsd": "8b31f7677eb0e7bf6ab145a6347e0ff00e57ec3642db3269763d97020cad2ebb",
+ "2018-11-08/rustfmt-nightly-x86_64-unknown-linux-gnu": "bf4c5913c199a5cfeea53432c880a02ba1ec6b38eaa59f012a909a131cf11cf6",
+ "2018-11-09/cargo-nightly-aarch64-unknown-linux-gnu": "e2db9ce2b561d7fdc456431b661be0b68e0a97b932096595fad273a9dfaa8b05",
+ "2018-11-09/cargo-nightly-x86_64-apple-darwin": "696507e163c5ea342a3780da51efd51633dcfcc980b493479928b9a3e0894157",
+ "2018-11-09/cargo-nightly-x86_64-pc-windows-msvc": "0537061725164e1c344b73ec85a1983966537e7f0d4c231233bd6aa6a30428e0",
+ "2018-11-09/cargo-nightly-x86_64-unknown-freebsd": "07935c23f2f71e30092672010975ed16d34a9f50a9ab4deb86c9846d79a4729a",
+ "2018-11-09/cargo-nightly-x86_64-unknown-linux-gnu": "0f5448e37227d79689967658252a43d48c596ee875fff5d7a530b20cfd408bdc",
+ "2018-11-09/clippy-nightly-x86_64-apple-darwin": "42ee57c56b42dd837b9aaa4307cb9f57421cb430264048de9b291733438f6f85",
+ "2018-11-09/clippy-nightly-x86_64-pc-windows-msvc": "83b0f6b8423dd3061d5d9956371e6665f13bd857e711226f9684e29b88294593",
+ "2018-11-09/clippy-nightly-x86_64-unknown-freebsd": "0dc28f63ceea25edefb7b96bf5c8bf746b68505307ebd9c38a8aa7b6d3d2059e",
+ "2018-11-09/clippy-nightly-x86_64-unknown-linux-gnu": "f56e10ae1c09b0356514fdb411a9b38597d824e080e7cb050588fd627c4a544a",
+ "2018-11-09/llvm-tools-nightly-aarch64-unknown-linux-gnu": "83188eccc2b7067dcfc960492f91d23ad36ea6460005ac6b91c98d20694e60a6",
+ "2018-11-09/llvm-tools-nightly-x86_64-apple-darwin": "03e2e4ba7ffabe88b118f1207b820cc6c7ab0d79d478c1687ec5bb1c903b4045",
+ "2018-11-09/llvm-tools-nightly-x86_64-pc-windows-msvc": "63a4f2c85f3ef51efb0075944ad0249337cdd7c9593036995f79699393a458d7",
+ "2018-11-09/llvm-tools-nightly-x86_64-unknown-freebsd": "f9ddf5f1e02b800aaa0add32365d62e5dcf590cc130af5b209cdf8520f9262a1",
+ "2018-11-09/llvm-tools-nightly-x86_64-unknown-linux-gnu": "8b3e2e2bf77224e181a9b1987bd2ae940a0462f8b0af84b59de484f8fe96ffb8",
+ "2018-11-09/rust-nightly-aarch64-unknown-linux-gnu": "4d0f22349061a40a834ae6a40640c0f4e8a19f068a215af0fb0b9a7250942d3f",
+ "2018-11-09/rust-nightly-x86_64-apple-darwin": "934b83bbfcbca605875103293cf691a56429661e929e1c29fec2d3c5c1d65143",
+ "2018-11-09/rust-nightly-x86_64-pc-windows-msvc": "6659d7b9001a3613ca6b2bb64e5f6bd67cae51bf02e81b8b96dfe2299a180a21",
+ "2018-11-09/rust-nightly-x86_64-unknown-freebsd": "b50b1cf51e8bd138d55dc77f681904e1b431e7c956951ec603a3d94ff81a0783",
+ "2018-11-09/rust-nightly-x86_64-unknown-linux-gnu": "163e0666f2f7179caa9c5baa8b0280c618dc163007a73f5da0a0c917bd2b8902",
+ "2018-11-09/rust-std-nightly-aarch64-unknown-linux-gnu": "cb12c26ec032ede34f925ea7c57118c8694dee439f0e258f8655b83e08512a43",
+ "2018-11-09/rust-std-nightly-aarch64-unknown-linux-musl": "5e0d20f6f2b01bb661724cb5478fddd37c560f2848af9961da44d0ae75029b1c",
+ "2018-11-09/rust-std-nightly-wasm32-unknown-unknown": "a0084c768151b5cb7554085b77fdbbc014a1ba246335623a36b58e7f6bb95fb0",
+ "2018-11-09/rust-std-nightly-x86_64-apple-darwin": "dbc9ffa483484380e41b6514465523f6ef106be5708374b714458d14f76149c4",
+ "2018-11-09/rust-std-nightly-x86_64-pc-windows-msvc": "40e4194f3abd9c1eb97c3783009571f96d83e80018662c4ff6fd60e992b50ee4",
+ "2018-11-09/rust-std-nightly-x86_64-unknown-freebsd": "ab8a32d8efb0ab4686526c6cf1380161e87a89015464f5d5f5438c99723675c7",
+ "2018-11-09/rust-std-nightly-x86_64-unknown-linux-gnu": "1418ba09f97c6ba91e2df5ba0b11cf1c53498710bc6a147fe8f4be455a96c4d8",
+ "2018-11-09/rust-std-nightly-x86_64-unknown-linux-musl": "3262404dc8b0f509b3d47413340d825f99940f954ad4928fc0b39e2032c58230",
+ "2018-11-09/rustc-nightly-aarch64-unknown-linux-gnu": "167fec713804d8af1fa4f543e79ca5cee259f1b966b8e04c99efba75901f4c8e",
+ "2018-11-09/rustc-nightly-x86_64-apple-darwin": "55ca5ad85b0afd61a419e374f8e6320b4f4fe30f8092005cdec9e63103812ea7",
+ "2018-11-09/rustc-nightly-x86_64-pc-windows-msvc": "dd19c5a4b209a9f46dd2f99eb7ec0898bd00accf1c6e8a97222c580bcf62e32a",
+ "2018-11-09/rustc-nightly-x86_64-unknown-freebsd": "bd6bb0228aeab01f425cb2ad55b2e0409b43e79450c2830183a6878cc2d2bdc4",
+ "2018-11-09/rustc-nightly-x86_64-unknown-linux-gnu": "2c475f886123353c9388322da6e13a67b6ae902d8c249f8e95fde67429f7bf37",
+ "2018-11-09/rustfmt-nightly-aarch64-unknown-linux-gnu": "159353d0fc3b7d6aea127df348d7e824da79f995bf286df0bf03ed0615b7e875",
+ "2018-11-09/rustfmt-nightly-x86_64-apple-darwin": "940a39cc86d1cbb02535065d40993cc52acb223487c9efd4ce396950b6a72ed6",
+ "2018-11-09/rustfmt-nightly-x86_64-pc-windows-msvc": "896305dd7fb4975ccdf54c569faf05ce0ff9a13fb0b226904fb6594ed5e5c03a",
+ "2018-11-09/rustfmt-nightly-x86_64-unknown-freebsd": "7c313ee99e0bd3ac8ec13b576b07e6e64b0eed22505ddef1710bf2c7b1236378",
+ "2018-11-09/rustfmt-nightly-x86_64-unknown-linux-gnu": "4d1dbb88662353ea4bc353ec4d73600d72af0fc51f54dc3f0b8ee0b0aef05a15",
+ "2020-02-16/cargo-nightly-aarch64-unknown-linux-gnu": "2b9e7a1be3d4599e22e3070703e76643c12a60b16109f1bcba114d9453d41e48",
+ "2020-02-16/cargo-nightly-x86_64-apple-darwin": "c23632fbdc4a64b53bdc6a0c439a5b8a496e4450805b1ed421258822a4124175",
+ "2020-02-16/cargo-nightly-x86_64-pc-windows-msvc": "f81d3f8baecbe6b461836e667fc6035df50d645a84c58ba1d294a53a654323be",
+ "2020-02-16/cargo-nightly-x86_64-unknown-freebsd": "a2933a0e3092320705a0fa4a9dccf32e6a6566bd7c1440554a2285a98279ed50",
+ "2020-02-16/cargo-nightly-x86_64-unknown-linux-gnu": "658813da4742c713a7486e65d258c45492847c0a3508f041da187d03a50be8fd",
+ "2020-02-16/cargo-nightly-x86_64-unknown-linux-musl": "b197fce52a420f4d91c25794c4ffbc20d10a14918a299d1f8e8c93acb415c42c",
+ "2020-02-16/clippy-nightly-aarch64-unknown-linux-gnu": "47a8f75f95c105fa77fb2807224041801db639441608512be218c39acedf0001",
+ "2020-02-16/clippy-nightly-x86_64-apple-darwin": "d388e393a0cad72bdff876a99b2e5fe9f6c0d2c606a6184630aeda1ef4a06f76",
+ "2020-02-16/clippy-nightly-x86_64-pc-windows-msvc": "783fd1a17cf99c8193a3b884c80768175e7216b3e7c9a38a9fe4348e3bf66bd2",
+ "2020-02-16/clippy-nightly-x86_64-unknown-freebsd": "ff5e128ebd9fe15ae3cc4953f937f92338e332054c1deb3d42b967c2e2a345be",
+ "2020-02-16/clippy-nightly-x86_64-unknown-linux-gnu": "3e52e6fb619b84e3cb36cc42be3c21599c1e6b72fb8738a5c8703d401f69afcd",
+ "2020-02-16/clippy-nightly-x86_64-unknown-linux-musl": "1f1d448068a8bd58d8ace58ec201d5c55d492610ba74c4a8e0ed129060b290d6",
+ "2020-02-16/llvm-tools-nightly-aarch64-unknown-linux-gnu": "f0de4de8e364ee8e0aefc07500caca3917d79ceb4fd52a1602b5985b4c40ec71",
+ "2020-02-16/llvm-tools-nightly-x86_64-apple-darwin": "b9ec36e5c51f2dc1051e4b5831a49c096836f95c8bb87c19d6fa12bcacaaa914",
+ "2020-02-16/llvm-tools-nightly-x86_64-pc-windows-msvc": "4a2b966614e6bb7a1fc054ce42707c8a2b082b2f28c76c8954a19a65ea35476c",
+ "2020-02-16/llvm-tools-nightly-x86_64-unknown-freebsd": "235fa158239a4b498846eebff92639a87c708056e1a91215377f0d485e354c08",
+ "2020-02-16/llvm-tools-nightly-x86_64-unknown-linux-gnu": "f066cf2b315d0b6edc95d1b5b1b5b7a2275928045f4b2e4329144ca9cee85b6b",
+ "2020-02-16/llvm-tools-nightly-x86_64-unknown-linux-musl": "ad60578632fccc91b8503a1baa7f15629c07ffa0572c43a704cc1316ba138894",
+ "2020-02-16/rust-nightly-aarch64-unknown-linux-gnu": "9edd6c4c0d1b8626c905d91d36330fd9c2671d33f82d5bcd4413bb8696fb628f",
+ "2020-02-16/rust-nightly-x86_64-apple-darwin": "608d8747aa928b128b4da9565327fe791ebc787b96e80f09ef84676f3a0a3efc",
+ "2020-02-16/rust-nightly-x86_64-pc-windows-msvc": "735f5f2762ff94b04e70209e46a57202a13a65a8b12a403b620f0896c4fedaa2",
+ "2020-02-16/rust-nightly-x86_64-unknown-freebsd": "69dfcc2b029da84f68c5d543af8262a4735be574a29035d34e452932fcd66643",
+ "2020-02-16/rust-nightly-x86_64-unknown-linux-gnu": "b4f6ce68cc5fde78dc7ab06db6a6f30abde85ba6e5360ea3f75fb8c80232ad38",
+ "2020-02-16/rust-nightly-x86_64-unknown-linux-musl": "0e6b37f73853ac4cde22e883abf4251fc8af2c83565a949159c6c0c41177e8cd",
+ "2020-02-16/rust-std-nightly-aarch64-unknown-linux-gnu": "ef3c2edd450ef3ef214a5cc412de4527631f9324a28168997233a9ebea6f08c9",
+ "2020-02-16/rust-std-nightly-aarch64-unknown-linux-musl": "e1093f086fe07fb3bfb9e9a4c5298fa6eb505b9775f7667322de019b18296de8",
+ "2020-02-16/rust-std-nightly-wasm32-unknown-unknown": "dcc9ce64c62e2100b35194b6a9ed3d9a7572e1bbf28ca09da687af82ff1dbfc9",
+ "2020-02-16/rust-std-nightly-wasm32-wasi": "6e3c13f44ea6e997b5fb0a3818ee8cb850c9654857a438f6e8df42a6e1decf75",
+ "2020-02-16/rust-std-nightly-x86_64-apple-darwin": "d391be4bdb713356fb34cdc03475a830e6bd4476639c46ef19a8a4c05513bc4a",
+ "2020-02-16/rust-std-nightly-x86_64-pc-windows-msvc": "5881bc3954fe5c7a8080176aac4fae95bc079d020c9c68f9fc7d1064470c4493",
+ "2020-02-16/rust-std-nightly-x86_64-unknown-freebsd": "6575eabdfaed4b0490cdfffcbb5860036dcc36bebdabc58d839c088ff5556a6f",
+ "2020-02-16/rust-std-nightly-x86_64-unknown-linux-gnu": "28a169e9b0f0986a50254caf14be863cf6f1ed3aec8342a7fa756dc1af76f38b",
+ "2020-02-16/rust-std-nightly-x86_64-unknown-linux-musl": "fbcba5f59fc47157208a28786a9cafd4046359fc821c568afe798721f5bb4f68",
+ "2020-02-16/rustc-nightly-aarch64-unknown-linux-gnu": "e9cf265820f69331abc9a7c4da0c26febffd4017cf4e6d0840d4ed22b3dd332b",
+ "2020-02-16/rustc-nightly-x86_64-apple-darwin": "db0338b3e1934147dce0bf6420d9c147caa6aef2db1aca44ca8fef47b7247615",
+ "2020-02-16/rustc-nightly-x86_64-pc-windows-msvc": "d51440d4004e49670c5cf803f96aa222c68f09348bfca46f6e0d4c8728908065",
+ "2020-02-16/rustc-nightly-x86_64-unknown-freebsd": "c76fa125e6d17b16a96b01a875d826f20849b09970b49ed1183601a0e7803f6f",
+ "2020-02-16/rustc-nightly-x86_64-unknown-linux-gnu": "456af585ad4408ab5f0c7500264ebb4a5f6338c0aed642edb81224ec6146b546",
+ "2020-02-16/rustc-nightly-x86_64-unknown-linux-musl": "a98a07ecd9d291e3788d7e2d0dce82adb3777570afdfbe5707d05360d058fdb7",
+ "2020-02-16/rustfmt-nightly-aarch64-unknown-linux-gnu": "76b5fb48db5de274950f86a9b1cb69738311d2302da3e079ec772302aacfd999",
+ "2020-02-16/rustfmt-nightly-x86_64-apple-darwin": "77b467fec83ea6d8f2b4e4e186806d77ae7ecfab1de618f4a7d857aaa7f6823f",
+ "2020-02-16/rustfmt-nightly-x86_64-pc-windows-msvc": "eee4d08ac820d85491a9f13909f178dbdcc54edc5d98d2e433a073c6b1aa611a",
+ "2020-02-16/rustfmt-nightly-x86_64-unknown-freebsd": "a47062919f16888d2baa58a640299a5a9ece3f0d6537dea6e6241ac0d8877e7c",
+ "2020-02-16/rustfmt-nightly-x86_64-unknown-linux-gnu": "65513b8ca698f6859af19be665bead97271e7dbac3bc6058256ede1d7340aea5",
+ "2020-02-16/rustfmt-nightly-x86_64-unknown-linux-musl": "ac3275329a7f08749f8bbd08a9c183e24ad0a58c02e7cf70e81c41030a886900",
+ "2020-11-10/cargo-nightly-aarch64-apple-darwin": "cb4578ec077cfc56c3b23c59d4bf219aa05f0dbe5b431792d0860ed121e3619f",
+ "2020-11-10/cargo-nightly-aarch64-unknown-linux-gnu": "de75beda2e7c9501c88874e9769101204f1726eb7b26b79c4d8c162f4b2b7eec",
+ "2020-11-10/cargo-nightly-aarch64-unknown-linux-musl": "0292763ac22b539d4d17d7696fa649dccb8ba0f90c86f8ffeaac961add976c39",
+ "2020-11-10/cargo-nightly-x86_64-apple-darwin": "ad4add153d93e7db296560da01fe92c8c975d444e33bab4869ed10cdf2023e48",
+ "2020-11-10/cargo-nightly-x86_64-pc-windows-msvc": "ab5bd83e8fdb079f20c1f3623d334972d831bb5a339c8450f82a1034124ff72f",
+ "2020-11-10/cargo-nightly-x86_64-unknown-freebsd": "72ab8898aea8bf1f030da12ea3b4d1dbc18e5f7c2df28282fe915390f12d7939",
+ "2020-11-10/cargo-nightly-x86_64-unknown-linux-gnu": "82b6b0c0f20d4d23b769d79b6122cb7a074d9f222325b07503eddd73817452b5",
+ "2020-11-10/cargo-nightly-x86_64-unknown-linux-musl": "bae2a597c7c2ad907d49c6420bf85f91ea754cfb771d39d8b734c8d30563352d",
+ "2020-11-10/clippy-nightly-aarch64-apple-darwin": "c874202231fc418dc3fea539440d413c82d354957b25fb355e8afb01b8624d9a",
+ "2020-11-10/clippy-nightly-aarch64-unknown-linux-gnu": "f2730540761a100dcec0c36773411f69e74dc1ca96c67bc0ac61e6567f84a422",
+ "2020-11-10/clippy-nightly-aarch64-unknown-linux-musl": "be671660b1f8d347e69e7ae1e7d86f239b9d865245f97b790cd89738363f79b8",
+ "2020-11-10/clippy-nightly-x86_64-apple-darwin": "5ddbc1e21dbad3af73d8d0618439ec48b0432b392989f86b9e81d952badb4d16",
+ "2020-11-10/clippy-nightly-x86_64-pc-windows-msvc": "03232d753f7b5d5f384352bd4da99aa19d476e9d90fdb4975fed49f0fb4f1ba0",
+ "2020-11-10/clippy-nightly-x86_64-unknown-freebsd": "ba070cc03d05d50c00c106742fbd376ee770c0b81cdbdde549caba1535f290b5",
+ "2020-11-10/clippy-nightly-x86_64-unknown-linux-gnu": "02e23757d51c8fcedcedf02ca336a36bd13b45bdad5abb0931c9028e7228b406",
+ "2020-11-10/clippy-nightly-x86_64-unknown-linux-musl": "862dd065e8933b83c17902aaee3f20a48ff67e034f6b7c7ec05ea49e240d0ad3",
+ "2020-11-10/llvm-tools-nightly-aarch64-apple-darwin": "e2b1803548aeedb1e6b51724c9cbab123626fc88846eae53adf0a1c55d4a364e",
+ "2020-11-10/llvm-tools-nightly-aarch64-unknown-linux-gnu": "442255a2859c2e3345c8ceea7a28359fb02d42460ecf51d92395c1dd85c9a8af",
+ "2020-11-10/llvm-tools-nightly-aarch64-unknown-linux-musl": "85de8206f0ea17b51bf1ff3154d9afd6855c54e6b33babea22ec512cf837c283",
+ "2020-11-10/llvm-tools-nightly-x86_64-apple-darwin": "9ae35e98f8f930257bb103ae1cffda42476338838f490a62ba9d93638ce122ec",
+ "2020-11-10/llvm-tools-nightly-x86_64-pc-windows-msvc": "4106227bf29d1dbaa35ddc12f8a2c2f16ef27fe21971f6f7ed0d4356691a4055",
+ "2020-11-10/llvm-tools-nightly-x86_64-unknown-freebsd": "91dbd775c36f8b29bd688a1e75b10ab065928622985aee7e96848952ab6d85d9",
+ "2020-11-10/llvm-tools-nightly-x86_64-unknown-linux-gnu": "532a0883b16bbaa70bb2e9ba6c769594db35b1aaacbfa9ef06631a91bfe8048a",
+ "2020-11-10/llvm-tools-nightly-x86_64-unknown-linux-musl": "fc476f62ae3a917a634afaa3fba83ee756799de11b7bb0af38a9d85e75a1a66c",
+ "2020-11-10/rust-nightly-aarch64-apple-darwin": "bcb30524c7f4520bda573d31962ce5b058cd9b6d05db83431b182483071fb429",
+ "2020-11-10/rust-nightly-aarch64-unknown-linux-gnu": "7d6453eaf2640a9979707e6ef92b8dcfed33bd7bf5a7696d8efdab05bed182d0",
+ "2020-11-10/rust-nightly-aarch64-unknown-linux-musl": "b25c99b1b0f8aa36d17f86677b040bd73e2d2128938b0bfdf6cbcb1782783001",
+ "2020-11-10/rust-nightly-x86_64-apple-darwin": "106395f200ef0e6d08baad05d5da786dd17c612d25ba5d7c65a7031d52af9bd5",
+ "2020-11-10/rust-nightly-x86_64-pc-windows-msvc": "6a28970950157102e0ea6799da0235483cad141b2cf112718abcaa19ed81170e",
+ "2020-11-10/rust-nightly-x86_64-unknown-freebsd": "dce8b0971da6c265190d0c14cee3e4d82ad24ca224398ef3002a870f3db31fce",
+ "2020-11-10/rust-nightly-x86_64-unknown-linux-gnu": "29696ffa840261dec1a27018054599a93f49facfa6813f7ad1a875cfb1fc6fd7",
+ "2020-11-10/rust-nightly-x86_64-unknown-linux-musl": "a9f599adc294cbbd73e56efbec0d14306cb2da15f39fe0584969ffca4b00b86a",
+ "2020-11-10/rust-std-nightly-aarch64-apple-darwin": "80e57cd44992e0a9a29bb0233a4c7301369c7f00e9a63f89e944c5fd75931d40",
+ "2020-11-10/rust-std-nightly-aarch64-unknown-linux-gnu": "a4d0fa574f93e530f421651ec38f5374fdc8be20de717c435750bfcf0ae15f36",
+ "2020-11-10/rust-std-nightly-aarch64-unknown-linux-musl": "b1921c71b00cc8c8b665275ba4becaef16e860b88d4fcd2c6cae31cc6f929d14",
+ "2020-11-10/rust-std-nightly-wasm32-unknown-unknown": "636cb560095c23e12d629ea21dc85af954c2fcb2df57f25b40f11826d7547a46",
+ "2020-11-10/rust-std-nightly-wasm32-wasi": "baf705571736331dd5449e1473b590477e2a48ad0adc6a897516fb8f1a5780fd",
+ "2020-11-10/rust-std-nightly-x86_64-apple-darwin": "2b0d1758c20fea48e8afa5c9cc2844e9eb5c77376992f2af1e68261e1b0bd773",
+ "2020-11-10/rust-std-nightly-x86_64-pc-windows-msvc": "9e5f1089de87e9d54417038f7d5d30de5e604bf82f5be557361cd02b55abb018",
+ "2020-11-10/rust-std-nightly-x86_64-unknown-freebsd": "24a506f85e178be0799d12f9354c6129004068552c8f5321a519b033631b815d",
+ "2020-11-10/rust-std-nightly-x86_64-unknown-linux-gnu": "367c14b7fbe98e264b0e4b5a9ddaf3f78ce3ce09bbef4c7be33a3f2abade9ad9",
+ "2020-11-10/rust-std-nightly-x86_64-unknown-linux-musl": "b2e929d3821b104796dbc0521228cef25ce6f55e3494dfc7c3a852b6404c4acc",
+ "2020-11-10/rustc-nightly-aarch64-apple-darwin": "a461f2486013b5cec450c8f79230e83878689b803a38df7304adea27b025ef1b",
+ "2020-11-10/rustc-nightly-aarch64-unknown-linux-gnu": "900170006c4c2d88cadc0d915d410588cb80150817e53aa7fca41a459a5ec500",
+ "2020-11-10/rustc-nightly-aarch64-unknown-linux-musl": "bf8d81b551229263f52ecfdd561ba6698d7030832723e5c3721d5ada5d478e7a",
+ "2020-11-10/rustc-nightly-x86_64-apple-darwin": "7a443dfb068bb7e3854dd6475564da33a57d3f225ce03ad8bc973e8900960b69",
+ "2020-11-10/rustc-nightly-x86_64-pc-windows-msvc": "e7b325e55d372aaf4be400273673711fe78271b655c0b710d62a972b8044b9ef",
+ "2020-11-10/rustc-nightly-x86_64-unknown-freebsd": "3ef55f82aefad5eac4398977d34b1963feb05b1cd654005d385da26624cb2f7e",
+ "2020-11-10/rustc-nightly-x86_64-unknown-linux-gnu": "7498af27587f4ff235b0477199eec4128a65f54d4c05e4ddb9c632685ec526b4",
+ "2020-11-10/rustc-nightly-x86_64-unknown-linux-musl": "ecb5626e23ea84e1b14fe064b6fb1afc145ec280356a6f197ec410c23756f217",
+ "2020-11-10/rustfmt-nightly-aarch64-apple-darwin": "e4e992764d26792ba901fe4c9590cbb7a72a8a71b524f54ae7b1312d2824bca4",
+ "2020-11-10/rustfmt-nightly-aarch64-unknown-linux-gnu": "7ec62c4aaa8a89f94e037c39907caaea942c9fb44e5dbadd65be7b9c8650c594",
+ "2020-11-10/rustfmt-nightly-aarch64-unknown-linux-musl": "5324c21a1384ba88a2f2552386050b566a3c48673949218b65e26b6ecbe04c6a",
+ "2020-11-10/rustfmt-nightly-x86_64-apple-darwin": "c169fbd9b21ddff9e7558f8674755410d170aea6521cccadd06a14d1091870c3",
+ "2020-11-10/rustfmt-nightly-x86_64-pc-windows-msvc": "d3fa6a30d2be44c636478c0259337c6f449a55bd9f037cbe0600a18da143c2e5",
+ "2020-11-10/rustfmt-nightly-x86_64-unknown-freebsd": "3681fa62a68c50d0de839dfe424e30ae72d8635e15267042191bb10195d265fb",
+ "2020-11-10/rustfmt-nightly-x86_64-unknown-linux-gnu": "75e17c1e4bcfa70669aefda8ba34a7e8d6e0f5d842096b98135f3447b37d3538",
+ "2020-11-10/rustfmt-nightly-x86_64-unknown-linux-musl": "84bc7707f7ce989c1ed452817153c25fc7324d1795650787fde878ac862ecfda",
+ "2020-12-30/cargo-beta-aarch64-apple-darwin": "6c0f23ddbb4e75155d1dfc24fd9103651eea565626f8b4c292ae09b17ef287f5",
+ "2020-12-30/cargo-beta-aarch64-unknown-linux-gnu": "ae0c5595646ae7a532b5f14720b67a82875b6d4bfdc6c8a2982d7c40e0d9f318",
+ "2020-12-30/cargo-beta-aarch64-unknown-linux-musl": "e6d576a7690ec8f16c93899b3cf5daab1608c6e4bf18fdd8462a0a61180e13a9",
+ "2020-12-30/cargo-beta-x86_64-apple-darwin": "07b59728f4ac5f95ff8fec3813e8ae1afa4d00105e490866373ba99ff25bc142",
+ "2020-12-30/cargo-beta-x86_64-pc-windows-msvc": "cebcf3f6f2a502ac53be02cfc3522c9bb6ec4954ccf93cc12026028102706900",
+ "2020-12-30/cargo-beta-x86_64-unknown-freebsd": "9975b922979a74c48b8461d2c67086565fa84b4f2be8857b5027d9f1db9e7cb1",
+ "2020-12-30/cargo-beta-x86_64-unknown-linux-gnu": "cce34205c11ae5f6c1c2fe08aedf1448d0f7bd8e11d3a7e467c12e46595d5372",
+ "2020-12-30/cargo-beta-x86_64-unknown-linux-musl": "ba71eeb40ca9ccd8d8b356fad1b7d6cb7af4f982a00b5feffede345895104561",
+ "2020-12-30/cargo-nightly-aarch64-apple-darwin": "8ac787c50ad37ab398d504cb915987ca85d87372a224564935aa1203d4cb5477",
+ "2020-12-30/cargo-nightly-aarch64-unknown-linux-gnu": "81195f8efae71dd6f96bea9ba1881bb647d127a130570289d026ea55a43ce6e5",
+ "2020-12-30/cargo-nightly-aarch64-unknown-linux-musl": "220ef2d21821c6c358a1672d4895389e09b78d4ab7270453f48785b9974b1901",
+ "2020-12-30/cargo-nightly-x86_64-apple-darwin": "28cfbe0214e99e311c58ae2fbcd23ccf9d31d97fcae106adf174f8e697416d4f",
+ "2020-12-30/cargo-nightly-x86_64-pc-windows-msvc": "80678407f5b2bc1cd01b36fc06105b1035740b9002f728629f3555965d0a977f",
+ "2020-12-30/cargo-nightly-x86_64-unknown-freebsd": "812501b738c59027b61ef6ac2462f0be76d4a95b9c78a301ef6dd33b225ca5e8",
+ "2020-12-30/cargo-nightly-x86_64-unknown-linux-gnu": "3d16880431ec9a218808806d6b768c7e29cc9ee6298a4dfa796f0fd5bef9cac3",
+ "2020-12-30/cargo-nightly-x86_64-unknown-linux-musl": "c4798bc41dc9a65b23962b0250cff14c648fe6804d0b96df9f59460a0741e916",
+ "2020-12-30/clippy-beta-aarch64-apple-darwin": "b3535c7e1c72d5380518ab2568762f38c9a359310664b63ed14c15b9ff4b4528",
+ "2020-12-30/clippy-beta-aarch64-unknown-linux-gnu": "15330ccfd8462712546e34c07de4f921df74798204d1dcf325e1c2df9f741b00",
+ "2020-12-30/clippy-beta-aarch64-unknown-linux-musl": "61d7532e94d1837dda778e0140f42384696896ed7ff22a1922ace833a1cbf2c0",
+ "2020-12-30/clippy-beta-x86_64-apple-darwin": "70161007d54df7ee2cbd2f6fa115526f9a426c7f4dd9570c97577aafb33ff96b",
+ "2020-12-30/clippy-beta-x86_64-pc-windows-msvc": "9eef81fc0e6dddd105b871dc13834c99deaefc022a06844b191a6ebf3c266b4b",
+ "2020-12-30/clippy-beta-x86_64-unknown-freebsd": "519b646b3e23c38337e1a50275413580e697dea680a8ef40feb0fb1331ca5da2",
+ "2020-12-30/clippy-beta-x86_64-unknown-linux-gnu": "73aab1813c75c7efc14d957cbef40bd951e1b195ea2f025cec1fdd100acd3203",
+ "2020-12-30/clippy-beta-x86_64-unknown-linux-musl": "fd65821d39cf177493abf58063b2a2592403cadf4d319ed72ba99ff06b0503ab",
+ "2020-12-30/clippy-nightly-aarch64-apple-darwin": "15d33adcf937fddd4b27a86b0153d418fd1cfe148e901c11f69a7b62f9025363",
+ "2020-12-30/clippy-nightly-aarch64-unknown-linux-gnu": "09abbf8fa7d941ba4d815476b51ec96a3c138d4193971f1a765c7218da819e78",
+ "2020-12-30/clippy-nightly-aarch64-unknown-linux-musl": "e0e334fc4ffdce118cd2bcafea2cc49aef0bb9cf69e5775cee80c5950bc8f60a",
+ "2020-12-30/clippy-nightly-x86_64-apple-darwin": "1c18a16194a89a18ee727c18d655d613e05c3c115f6acb35ab4d2aa03ed047d1",
+ "2020-12-30/clippy-nightly-x86_64-pc-windows-msvc": "7a417a7e816a357ff09c711fda1c0f1c3b8dab10f81a9423e8e6ea63f1696030",
+ "2020-12-30/clippy-nightly-x86_64-unknown-freebsd": "71d41007415ea347dd347b34468cb307e88578bc095455d7d88e174a8546ae22",
+ "2020-12-30/clippy-nightly-x86_64-unknown-linux-gnu": "6dcc3aca82ff7830b89506386bd212724b265913d553c32c83ac534c500b7cf4",
+ "2020-12-30/clippy-nightly-x86_64-unknown-linux-musl": "ec2108da23dfb5f1799a1f42c2c8d6a5d72a92321b4000935d5ab29fcb9e67e2",
+ "2020-12-30/llvm-tools-beta-aarch64-apple-darwin": "d6e3e50a19aa45863ba5e37f316bf928f6eca96c3fa749b9ba87cddb3608a659",
+ "2020-12-30/llvm-tools-beta-aarch64-unknown-linux-gnu": "e1f3d55116386fbecdcaacb879dc19a62a9c9bb0d06581a366a53e84a5bc4d8e",
+ "2020-12-30/llvm-tools-beta-aarch64-unknown-linux-musl": "f0e7a5df202982f5ec91dd0d0bed875976906df8b64fe56702f452e7bda20654",
+ "2020-12-30/llvm-tools-beta-x86_64-apple-darwin": "b5a1a1b3d2d316e8d66876736462b6c8b08951e7fbfa3568da19caeb976e9fa9",
+ "2020-12-30/llvm-tools-beta-x86_64-pc-windows-msvc": "a10198ef08e9e58bb1a54ec23368d5df02c87b6618e16ab026afcc5c8f9cef6e",
+ "2020-12-30/llvm-tools-beta-x86_64-unknown-freebsd": "79df94c33935de84d0cd0e985c333c2516551a9fab3c8fb7c5b93cf3b0d0e22e",
+ "2020-12-30/llvm-tools-beta-x86_64-unknown-linux-gnu": "6e4d8501fc7c5c69b4a5b532021a0e39e125b6fedc12b1afe4ba22d07e0b995e",
+ "2020-12-30/llvm-tools-beta-x86_64-unknown-linux-musl": "19b0382c59426db81004a4386530fa4e8981dfc2feb5bc8224ad1924e092755f",
+ "2020-12-30/llvm-tools-nightly-aarch64-apple-darwin": "8e2f796ace0270fd2fde8bffe4db90fa1b09947032ee705bd99a1628a1138b95",
+ "2020-12-30/llvm-tools-nightly-aarch64-unknown-linux-gnu": "3f59253b666c05faef7a3b9b1b761ac6ae4f83833996495936629f41fc4c6959",
+ "2020-12-30/llvm-tools-nightly-aarch64-unknown-linux-musl": "e6a109c5d3c90969f37d7f0fbd43346616ba8322dca9046a0ea7d522230f71a3",
+ "2020-12-30/llvm-tools-nightly-x86_64-apple-darwin": "8aca7ddf73983bf2db4846721787547fed16c2ad4dc5c260f7f05f6b93cea8e7",
+ "2020-12-30/llvm-tools-nightly-x86_64-pc-windows-msvc": "f30202ade378ade7a1a4bf23381ae69525154ce009aa54b9d59d6507000bf301",
+ "2020-12-30/llvm-tools-nightly-x86_64-unknown-freebsd": "7f1837f6c8e26232cad456df8ce9104cbc6eea8a57e3290a8c72286c0e9fe803",
+ "2020-12-30/llvm-tools-nightly-x86_64-unknown-linux-gnu": "b1ee3b5cafd026432c74ab9eda4f797d1aa55d06a38438f84f29be528887e540",
+ "2020-12-30/llvm-tools-nightly-x86_64-unknown-linux-musl": "7f97270394c389db0feedc163c134518e1ec2f28910db22ed4fc50a61c2a9d4b",
+ "2020-12-30/rust-beta-aarch64-apple-darwin": "eb202137d6801bf50c3edc06b5bf16cd5215c66d24790a1168d22fb3a504adf9",
+ "2020-12-30/rust-beta-aarch64-unknown-linux-gnu": "c1d80d58cd0eb74f3db650285c808d18fb0a195fe7ad6461c38de098ff94fc77",
+ "2020-12-30/rust-beta-aarch64-unknown-linux-musl": "a7e852fa55fe8183d749196f72606c1541fb85de7bbd58a73df45454d5cb6e0c",
+ "2020-12-30/rust-beta-x86_64-apple-darwin": "ed1b3b8f5fe4e73ddef62a54ec41dada5fb2cd2519f5c5add06be6ea57c38d49",
+ "2020-12-30/rust-beta-x86_64-pc-windows-msvc": "0192de1b6cb415683e231caf3817127230828e6256150cf0a0c8f393cec50650",
+ "2020-12-30/rust-beta-x86_64-unknown-freebsd": "23515e664a0a87bd217bbcdec8785f52485ad8f74c7ff84b6949c0a16f09be1b",
+ "2020-12-30/rust-beta-x86_64-unknown-linux-gnu": "5ebe5cdf55eb79dad2c34fc770c5a35a6be2ef2a72865db291932ca193467b6d",
+ "2020-12-30/rust-beta-x86_64-unknown-linux-musl": "f33120cbe25113f956c035b3c2ca532eaf810ab6d85c6df69fff0eb69e1547f5",
+ "2020-12-30/rust-nightly-aarch64-apple-darwin": "4cc5ef6dc2e7524da659e416b68b353f61576aeefccc33c0f2564699d5d0cf91",
+ "2020-12-30/rust-nightly-aarch64-unknown-linux-gnu": "1539f5181c1993abb7a43b14dd1294d88453e48f8670c4574e0b5e98e6df28fe",
+ "2020-12-30/rust-nightly-aarch64-unknown-linux-musl": "7ef640112eb50bd77c7203d5fe56bcf3b2fba130e4acd5e707056686431a93a8",
+ "2020-12-30/rust-nightly-x86_64-apple-darwin": "2b5b885694d0d1a9bdd0473d9e2df1f2c6eac88986e3135e6573e1d71e7824dc",
+ "2020-12-30/rust-nightly-x86_64-pc-windows-msvc": "2c9086371cee98ce95cf10098cd655b2e33dd70e8e250759a1e8b0e8c42d659e",
+ "2020-12-30/rust-nightly-x86_64-unknown-freebsd": "79e5492d9a5f9f04ec5080be1fe305a3d7adde330f5c3fb9d7a3bae52720a027",
+ "2020-12-30/rust-nightly-x86_64-unknown-linux-gnu": "1a6b541f2d0ccda148a60d749e974cc545d9765b71d8dec59418b493f05209a2",
+ "2020-12-30/rust-nightly-x86_64-unknown-linux-musl": "fe9c7f0c0898b1f54d0a3492450580d2abb7682de74a9964e60eeabb7761a3b1",
+ "2020-12-30/rust-std-beta-aarch64-apple-darwin": "0065919e445e3eaa8d70561b949697b8e3af9beea62989c9ffc60856d46a9da3",
+ "2020-12-30/rust-std-beta-aarch64-unknown-linux-gnu": "426bd1cc7a0e94af5decd643d08c54fe9aab29e638cd79aca21ccb05ec00eaf8",
+ "2020-12-30/rust-std-beta-aarch64-unknown-linux-musl": "d9f779f46c182b37b185113f92e8a8a17ebf3b5ef4e11e137980fdf7139ab506",
+ "2020-12-30/rust-std-beta-wasm32-unknown-unknown": "3cf97eba1da6d14160e82de4c0302883fb2eb9c65151dd2a148c57cba430f5ec",
+ "2020-12-30/rust-std-beta-wasm32-wasi": "e86f3f58cc04bf4c4f9d94ac11e7244510a35f89795298658de2153a7fa60f86",
+ "2020-12-30/rust-std-beta-x86_64-apple-darwin": "12f5a181b6102f75e85b71259283d852777940cf82d1681fb19005b589076a83",
+ "2020-12-30/rust-std-beta-x86_64-pc-windows-msvc": "a02da2dbd7f3d14e4a2083a497aa7aa884b99e6ea941059102278dd2325c5b61",
+ "2020-12-30/rust-std-beta-x86_64-unknown-freebsd": "379f353e27b8218ed6bb54f1ef16314624705e9b28f5cd6047bc25259aeb0bf6",
+ "2020-12-30/rust-std-beta-x86_64-unknown-linux-gnu": "6929f00e1cb93b16bd2e3d76029b297f099818183ac2d7ff23eb532d4c31ebb6",
+ "2020-12-30/rust-std-beta-x86_64-unknown-linux-musl": "789ccd43b76e3f7af1675d24780281191be48991a2b2a217acd306b534bce4b9",
+ "2020-12-30/rust-std-nightly-aarch64-apple-darwin": "a01bcc6eb93b1883bc57739959d6f9e13fbb80e1867310272cdb1a1de496cf73",
+ "2020-12-30/rust-std-nightly-aarch64-unknown-linux-gnu": "3997bd9e5057851b9e49ebcba5886ca98bf736c062c122e677fcf40aa7ac5416",
+ "2020-12-30/rust-std-nightly-aarch64-unknown-linux-musl": "628f5ef4fd2e8b8d7e429a431127cb65321a69fbb69ed07b27df6ac4c8850784",
+ "2020-12-30/rust-std-nightly-wasm32-unknown-unknown": "b1669be863b7f419254382e9e3820e9ef0d69c60fa45f91d0625140229725484",
+ "2020-12-30/rust-std-nightly-wasm32-wasi": "8f2b0a30cdf50d748e57d23d94d54a4e175e864296c8048c8454bb6198b16fb0",
+ "2020-12-30/rust-std-nightly-x86_64-apple-darwin": "17912a6a5aa56daeb0aed5fca8698bacc54950351d9f91989a524588e37e41ca",
+ "2020-12-30/rust-std-nightly-x86_64-pc-windows-msvc": "4d2585cb12606f217150509971850330cc1b7f3e1a9c18ce03fd3b981021fa1f",
+ "2020-12-30/rust-std-nightly-x86_64-unknown-freebsd": "ac517f0ccc4b30f3a296a25a8b17f75f877052cd56ae5c5a043d88c0f5de972b",
+ "2020-12-30/rust-std-nightly-x86_64-unknown-linux-gnu": "5b1bd5fa31b9190c66b3446629c155d4896cffc8fb1f9f603a2e949162b7f791",
+ "2020-12-30/rust-std-nightly-x86_64-unknown-linux-musl": "3802d2c7271cdd3fc35921b0d9f999b9b34ac9d888b62085b976453a8b113700",
+ "2020-12-30/rustc-beta-aarch64-apple-darwin": "20107f4541be8822d428c402e010333f2f00aaf086d03b4e35ce8d1bd5c33d5a",
+ "2020-12-30/rustc-beta-aarch64-unknown-linux-gnu": "29e2808cadf8da481a0ace30bf107372dd108b0475706cbe2b9cdd4ff27e2315",
+ "2020-12-30/rustc-beta-aarch64-unknown-linux-musl": "035bd303601f588ebc23293e9c64050f7053eca1fb2f3266971bff71c4cc3a1e",
+ "2020-12-30/rustc-beta-x86_64-apple-darwin": "d65df5791d79e13037672d22055ec24583195554cdf7c3c2992cbcafa497e98f",
+ "2020-12-30/rustc-beta-x86_64-pc-windows-msvc": "7f934dd412207c0d776fb4e8ec4c5f4426e92b2a1854416a8ce7bbc2dc7f5908",
+ "2020-12-30/rustc-beta-x86_64-unknown-freebsd": "19818ab53bbd94c6d1723a52809bf1c3a271e258664ea2b3b7d00161965e058c",
+ "2020-12-30/rustc-beta-x86_64-unknown-linux-gnu": "4f5ac3311c913b79dca1a02cf42fd7326c63d53ee252447b61f113c043a82b5f",
+ "2020-12-30/rustc-beta-x86_64-unknown-linux-musl": "d688cfe617d18c132a051afe42ac0c759638b1d2b0003fe7970becd1cf30c8be",
+ "2020-12-30/rustc-nightly-aarch64-apple-darwin": "4610961ab77e1bb54bda95474b1c1f25f1fc5c1c103bc4f54758e5b2a5454d8b",
+ "2020-12-30/rustc-nightly-aarch64-unknown-linux-gnu": "c9997c01769a6371200e20639fcae99e6dec3d9062f65b2928429e04d4cb7930",
+ "2020-12-30/rustc-nightly-aarch64-unknown-linux-musl": "28a24668966faf46f0a79034446e54e2b86e4968e1a3a9381dbf5d9e916d8d9d",
+ "2020-12-30/rustc-nightly-x86_64-apple-darwin": "cf2f06d6c8d784a469561f6323b8b923fb6ad3a7c55c7ac90d5619b9d443ae9f",
+ "2020-12-30/rustc-nightly-x86_64-pc-windows-msvc": "8df3729f3b09cb39fc4b0ecfd90551625941d508f7e776ae4e16fcf02b0af4f3",
+ "2020-12-30/rustc-nightly-x86_64-unknown-freebsd": "f3818645265c3a08cb9fa04d1c2d42be72116974c9c34515feb7d5788e86ac41",
+ "2020-12-30/rustc-nightly-x86_64-unknown-linux-gnu": "79fc8d51bb6d298d292045eb77e1b2d0f7f97886604599a3e9dfc0c6956e49d7",
+ "2020-12-30/rustc-nightly-x86_64-unknown-linux-musl": "2627e995ff9d7e72ec46d9161d3b8f78d264671c507f10337f9ec714171dba5a",
+ "2020-12-30/rustfmt-beta-aarch64-apple-darwin": "75c957da65d459a02f29affd8fac867e14eb8eec98531fd2216ebcb54a5b6407",
+ "2020-12-30/rustfmt-beta-aarch64-unknown-linux-gnu": "b34fd3a8e80969df9ba71ef5b80f143b4e8f325a91d98b00db1ea86879074b22",
+ "2020-12-30/rustfmt-beta-aarch64-unknown-linux-musl": "10353a1a4c052509277625702e6f36a3561772760671728b406cd0d5c1f46e1a",
+ "2020-12-30/rustfmt-beta-x86_64-apple-darwin": "bfe5ef2349a226fe54d87658f55dad90b99ee6e36de4f5d1e381b1ca453e1919",
+ "2020-12-30/rustfmt-beta-x86_64-pc-windows-msvc": "ebac84095df62d8ed6b41454c07f043477479a1770cf156a5c9f351bebcbe6a4",
+ "2020-12-30/rustfmt-beta-x86_64-unknown-freebsd": "bfe8a34403fb19d88eb2b4528b3836a645239d239bf56cc9b916aefebd0199a1",
+ "2020-12-30/rustfmt-beta-x86_64-unknown-linux-gnu": "78ac7e3178068c6828765c295698cb79375266cec95b097c4603f8582bd24379",
+ "2020-12-30/rustfmt-beta-x86_64-unknown-linux-musl": "6d8f4685cc8bcee32c7e5e3b7524444d90c88486f81905e109fbe5cc47f99fc1",
+ "2020-12-30/rustfmt-nightly-aarch64-apple-darwin": "0c3cfa89787cc9fcdee39acc0b5c5cf3ef084d85fb0e2716926813852fb96a3f",
+ "2020-12-30/rustfmt-nightly-aarch64-unknown-linux-gnu": "5fb27d5f31411c242a8046de087b3dbd73e5829d7e07493858034139681c30c7",
+ "2020-12-30/rustfmt-nightly-aarch64-unknown-linux-musl": "19f6b831df8996666d9277396650909b06396fca3b37eeffbe0c763472cb076c",
+ "2020-12-30/rustfmt-nightly-x86_64-apple-darwin": "c7da578f3b70dbfa0ae1f06370c7c9f22a49127fed8a99b69dc9ac6e42491bb0",
+ "2020-12-30/rustfmt-nightly-x86_64-pc-windows-msvc": "ebae20dd198a36b657aa0486e6b557aba60c9b4fbff25c108246de312fd2963f",
+ "2020-12-30/rustfmt-nightly-x86_64-unknown-freebsd": "2e0f2e4adcc234d29859aa38088a02be2b2bb0a7e43863bca6d436a6712b8b3b",
+ "2020-12-30/rustfmt-nightly-x86_64-unknown-linux-gnu": "0fb77ae8a33fb83ea496654a52e55ab5245206322f09c1d396e0c5833a16b856",
+ "2020-12-30/rustfmt-nightly-x86_64-unknown-linux-musl": "a93e4b51ca3e87661edb62d8ceedf20446e7cb2fa700ab9f8cf765db6e5f9407",
+ "2021-06-16/cargo-nightly-aarch64-apple-darwin": "eaf4540191cbb0627b2f6bb4cb9fe94351bb7601d07cd2795b3f1386d32dca76",
+ "2021-06-16/cargo-nightly-aarch64-unknown-linux-gnu": "a46dd7f7d4532df2944056efab6b0f510224497be0993699ee59188b03b462a4",
+ "2021-06-16/cargo-nightly-aarch64-unknown-linux-musl": "11213aac3d92a05799892e94bcf632ea35418eb600bcf7ea71f9c8216c2cdb3b",
+ "2021-06-16/cargo-nightly-x86_64-apple-darwin": "09b55140b655ade515b4890c966e2f8b23e68d96a2deb557c23d520315dc72cb",
+ "2021-06-16/cargo-nightly-x86_64-pc-windows-msvc": "6180250887125396cb2dfae079bbe9a4e71e8432034f7d20428193cbbe4ccb4e",
+ "2021-06-16/cargo-nightly-x86_64-unknown-freebsd": "8d54457bb1d21dfe85889fa29c3fa8dc40d0a9a54b47ac853aaa2136efec8fca",
+ "2021-06-16/cargo-nightly-x86_64-unknown-linux-gnu": "4566ecb0c1b3131f44a14b1851702e6a6bdd06f80fbf0d5d768770a97b10cb3f",
+ "2021-06-16/cargo-nightly-x86_64-unknown-linux-musl": "9b491cb6472197db1f435e30c7b133f4da12e602d77e8ab82859c3181b214b90",
+ "2021-06-16/clippy-nightly-aarch64-apple-darwin": "4241a05e0a53c9385f83956241131c7c7ee4b75b5ce403f992dbd3512c8996e7",
+ "2021-06-16/clippy-nightly-aarch64-unknown-linux-gnu": "c942124cf5d48716e0cc85c8c328e6261b8903b4d86254233367de74036258a2",
+ "2021-06-16/clippy-nightly-aarch64-unknown-linux-musl": "87a5ccb283f5cc5a35271d0de17491e37c1694ab6b3015291a37c1b18cac3f49",
+ "2021-06-16/clippy-nightly-x86_64-apple-darwin": "fe4b7a3f596a118682d9b8fb58ddb1f9b222e679dfd8ad5072050aacc30280d0",
+ "2021-06-16/clippy-nightly-x86_64-pc-windows-msvc": "1605953eb558f6feccd13e13dba581c4336129f9714464148c0958b22cb12521",
+ "2021-06-16/clippy-nightly-x86_64-unknown-freebsd": "2248da8e036e410c124bc24564bb99679f05beff2ab1a6f866cdd111f43ca65e",
+ "2021-06-16/clippy-nightly-x86_64-unknown-linux-gnu": "3308e33e1ccbac22d03a279bb5112d5e089b482b096456e1cee550df651e558b",
+ "2021-06-16/clippy-nightly-x86_64-unknown-linux-musl": "928916f1e52107d92e40732bc8dc3162be1a445974249d5cc1be8c4be5f83dc1",
+ "2021-06-16/llvm-tools-nightly-aarch64-apple-darwin": "9ec6f8a300c7a5d49eecbce1f6a705edccb3b2197691334df4f7cb280e10c701",
+ "2021-06-16/llvm-tools-nightly-aarch64-unknown-linux-gnu": "66ce674917f40309033e8bb4316577679baad14929468c5f023d81b4225a6551",
+ "2021-06-16/llvm-tools-nightly-aarch64-unknown-linux-musl": "a8655b9e3726920a705081fee1add02c26fcbd4b3bdbca52642ad74b16be24ba",
+ "2021-06-16/llvm-tools-nightly-x86_64-apple-darwin": "e1aa13d71478684f83af6b3211b88cc2b370ac84a9f140a78af483c0aa235761",
+ "2021-06-16/llvm-tools-nightly-x86_64-pc-windows-msvc": "3cdd8e14fa4b31ba16aa6b330165babcca86082397c73262e060b19e4b84d871",
+ "2021-06-16/llvm-tools-nightly-x86_64-unknown-freebsd": "0bfe1a25041d7c74485691106b7ec72ba6c6178bc0fad780a57d8df1c21acd71",
+ "2021-06-16/llvm-tools-nightly-x86_64-unknown-linux-gnu": "7c42d2707ae20d8d8cd4a441c60bbb180ee7bd326fecb884220859dff1b26bc3",
+ "2021-06-16/llvm-tools-nightly-x86_64-unknown-linux-musl": "47728492d7d58cc125db0fe4bb8141e230404fab52fcf898178545de44b341fb",
+ "2021-06-16/rust-nightly-aarch64-apple-darwin": "9883ee9b5b5d4833ea6ad001b0205fecf536db3fc9b19931229922d3af8abf59",
+ "2021-06-16/rust-nightly-aarch64-unknown-linux-gnu": "6540dd65839da5af9106652c361b696b9ac1fe4a14f4ac5801d8d6186b6b031e",
+ "2021-06-16/rust-nightly-aarch64-unknown-linux-musl": "134134199171087947159c446e2c73ef2c5efee20b55cfbe20004c80479b5b29",
+ "2021-06-16/rust-nightly-x86_64-apple-darwin": "5cc5e38ee2ff4c8acc0e57a3bc6e19bbc679ca4f6d4737c137882af4184435d9",
+ "2021-06-16/rust-nightly-x86_64-pc-windows-msvc": "0de02a0fbf7621da7902cdc10a07781a8cebafc71d103ff7e2e3e6fe10c43d8c",
+ "2021-06-16/rust-nightly-x86_64-unknown-freebsd": "8a6245719a44080281713cad744bffd2a7e8ad4578028ffbe1c0999e782c8d66",
+ "2021-06-16/rust-nightly-x86_64-unknown-linux-gnu": "c3af6083060b123102a073028e0109e1585df6ee95003b70d8763f2aa470b3e4",
+ "2021-06-16/rust-nightly-x86_64-unknown-linux-musl": "19f50a5db4699a9dcb67a19cb6b1f559d3e39ce81446d42bad43fa02890cfdde",
+ "2021-06-16/rust-std-nightly-aarch64-apple-darwin": "978397a6ceba7117b89ce5a9822a2dc39b566084950c56954e0163e19afa3bb5",
+ "2021-06-16/rust-std-nightly-aarch64-unknown-linux-gnu": "d6369fa8ba1d649d08b38681234d6aec0f3871e71650ebcfcc59ea7c1bce2ee4",
+ "2021-06-16/rust-std-nightly-aarch64-unknown-linux-musl": "9fb786450e61f6e978efd2bcc238f2cc593b9057e8448feea032b435bf51d8b4",
+ "2021-06-16/rust-std-nightly-wasm32-unknown-unknown": "d53156cf7f97293ea0d2b3b08537b1b2c3b52cc91c5a8bf28e14f69a2bae73be",
+ "2021-06-16/rust-std-nightly-wasm32-wasi": "88dd233aa844d0fb9287576f35d628c617b54da7da04338a14f7abd5aa738a75",
+ "2021-06-16/rust-std-nightly-x86_64-apple-darwin": "60ecd0061a48198e2d890fb736c3059104ac4e88932f7f6b7e1cb59cde7de110",
+ "2021-06-16/rust-std-nightly-x86_64-pc-windows-msvc": "a9b5cd681e66a826fabe48f38630994710f43e3fbcf73c65c59b222a23fd1f4e",
+ "2021-06-16/rust-std-nightly-x86_64-unknown-freebsd": "e5758800722baeaaa0f1b61818564e8a21444dfcbe9602b142d0454218e68d82",
+ "2021-06-16/rust-std-nightly-x86_64-unknown-linux-gnu": "d863737b021c1ae1f1e0bafebf61088232a0c76d5665ce86a6fac8ca95c7bb22",
+ "2021-06-16/rust-std-nightly-x86_64-unknown-linux-musl": "7be512172a022f7011be352e90eb4106344af13e7a4d6b831961fd66f2f83581",
+ "2021-06-16/rustc-nightly-aarch64-apple-darwin": "e3dd00de0ec202c385c3c943dbec7157846314e04108c9496935ea4e273edda8",
+ "2021-06-16/rustc-nightly-aarch64-unknown-linux-gnu": "88b9470cc39c51f1869bcaea2738a71c32baa4f76099dec77d4ce343b486bf0d",
+ "2021-06-16/rustc-nightly-aarch64-unknown-linux-musl": "430e9c095cdba5341e3eb1d9bde03b90fd8dfc54a38c951a8e209b5013fc9e26",
+ "2021-06-16/rustc-nightly-x86_64-apple-darwin": "438e0615f993ddbf518848705c01fbae26f36139e7b48d9df5d1403586966f9d",
+ "2021-06-16/rustc-nightly-x86_64-pc-windows-msvc": "f54e69bf237c882c4d0ee730573e3ebef5eddc4a03730406cf082b43eb4cd008",
+ "2021-06-16/rustc-nightly-x86_64-unknown-freebsd": "6fda58af80d7c597d178b2137adecaf4e94c289f7f55464de0138ce76575987f",
+ "2021-06-16/rustc-nightly-x86_64-unknown-linux-gnu": "44a77db517c05e7b136c8f683e7a9c076fb7c5f15c2d2076a559398a4eeb33ae",
+ "2021-06-16/rustc-nightly-x86_64-unknown-linux-musl": "6eefe98ce50f897fbba0bee21efbc27c76adb108189872a384683bccb4b0aea9",
+ "2021-06-16/rustfmt-nightly-aarch64-apple-darwin": "ba8c2c5a171cb4361667584229fee13b1cfb5a901f00747f13c3b2af4fe72dd9",
+ "2021-06-16/rustfmt-nightly-aarch64-unknown-linux-gnu": "7e11932879ec3164e3042b1544259f93591cb36093f1f0e42324c480da8a58c9",
+ "2021-06-16/rustfmt-nightly-aarch64-unknown-linux-musl": "519e3efc3026780dc0ea3a3020b441a22ce7c497f0f9252aa6a748f2567f1e66",
+ "2021-06-16/rustfmt-nightly-x86_64-apple-darwin": "6e005433e4b5a46347b6ed28371fb97694087c4599447a04a7fe684fa22126a6",
+ "2021-06-16/rustfmt-nightly-x86_64-pc-windows-msvc": "a7606c5ddfca15e066bc844372e81912b256595b8bdbdd3ebea5622cf33bc6c0",
+ "2021-06-16/rustfmt-nightly-x86_64-unknown-freebsd": "239953675a43453195e7f6d7a106a3b65baf57230df0bb0ab19fb6839cf99d32",
+ "2021-06-16/rustfmt-nightly-x86_64-unknown-linux-gnu": "3edba45a2797a3361e575e7aca34284c5ed8154f8849e3da49b59e45317dc65d",
+ "2021-06-16/rustfmt-nightly-x86_64-unknown-linux-musl": "bdeca48139be92c824180e29b790cdb58a4d1e3c15b4c65e9ec93aaae46853aa",
+ "2021-09-08/cargo-nightly-aarch64-apple-darwin": "712aae52f55402ac17ca017dd337ca1aa13f063ecc666fc8c16448f42aa4519d",
+ "2021-09-08/cargo-nightly-aarch64-unknown-linux-gnu": "814ee506cce957c7371bff4961fcb97cc6ee7fc2da4189175be61a4990130824",
+ "2021-09-08/cargo-nightly-aarch64-unknown-linux-musl": "65edd1914dc1f7118f70a722cd7f555bd7e9afc8a1ebb447036ef8948d842742",
+ "2021-09-08/cargo-nightly-x86_64-apple-darwin": "2c539e3a02521842316202cabd37ac580e5d95ee48531435e49628d34217a8cb",
+ "2021-09-08/cargo-nightly-x86_64-pc-windows-msvc": "64c3ab2850c4039c58288cbc402243914eee40d35218665e6a02c8b45efe7704",
+ "2021-09-08/cargo-nightly-x86_64-unknown-freebsd": "c119dd05ee04dc1a0bb414f30036cce9dfb0456eb974bc991acc51122528dd7a",
+ "2021-09-08/cargo-nightly-x86_64-unknown-linux-gnu": "0382a83f1a93228e8fc2c68e396032f61bb431a73aecee75d461b2008c68a33f",
+ "2021-09-08/cargo-nightly-x86_64-unknown-linux-musl": "bfb2a9ea032c591f1c9c36cd2590427c684ebc95b573d919d477b6bd57d5bd37",
+ "2021-09-08/clippy-nightly-aarch64-apple-darwin": "7dade8377af304261199dadf7126afe0e5e50173a89e805567f9d833be59c37c",
+ "2021-09-08/clippy-nightly-aarch64-unknown-linux-gnu": "e36dce42b32982a550a0a575fe827e16e2ba6a53fc850a99f55d8319031625a5",
+ "2021-09-08/clippy-nightly-aarch64-unknown-linux-musl": "abce5645da1c5eeaa193d986f76531e5a3031210e3d94b66d32deba6f15943f6",
+ "2021-09-08/clippy-nightly-x86_64-apple-darwin": "5064e135a17afa8540b6073fda18f686c5bc6903e800ce2f508cf33f74b5b701",
+ "2021-09-08/clippy-nightly-x86_64-pc-windows-msvc": "b7a6dda0b9da65fd964c01ddf16a7b5a309673ad50095bd2c6efe4f62371a075",
+ "2021-09-08/clippy-nightly-x86_64-unknown-freebsd": "8846077e6bd3f96b87b0f341566d51108e4835f23c639e3d95fdb58d31d12033",
+ "2021-09-08/clippy-nightly-x86_64-unknown-linux-gnu": "577ba7ef53a84c296ef1244200af68523708e2ec0884f7e2f7978dae320cb661",
+ "2021-09-08/clippy-nightly-x86_64-unknown-linux-musl": "28365e89efffcd0cbbb7da8d922ebe5c07b2f991fef2c1d845f9f7cdbb014d45",
+ "2021-09-08/llvm-tools-nightly-aarch64-apple-darwin": "dbffc97784c96ba75d6da460d965bd705c7bee737f1d73a0bccf815cc046260a",
+ "2021-09-08/llvm-tools-nightly-aarch64-unknown-linux-gnu": "bc789aa0b012259baa8b5540aee96f1074d9ad6368a5031b556093da61fcd8d7",
+ "2021-09-08/llvm-tools-nightly-aarch64-unknown-linux-musl": "ed3019654dec2aa14233b9fe1a6c934d913acfd798725591ff02d97e10504be6",
+ "2021-09-08/llvm-tools-nightly-x86_64-apple-darwin": "b419d08a367fe4366202106161fa1ccc4dfead9639e582b36c71c3405dc58e8f",
+ "2021-09-08/llvm-tools-nightly-x86_64-pc-windows-msvc": "213cfa58059ba87e650acb240f6b1f9ed6948687fe12a236b16d0abe3e293fbe",
+ "2021-09-08/llvm-tools-nightly-x86_64-unknown-freebsd": "cef580a6e8efcea89bbf40de422e04c36546462ef9e90727da7e339bc9acb83c",
+ "2021-09-08/llvm-tools-nightly-x86_64-unknown-linux-gnu": "4a5ff52134c2dab1746c9d3d84bac92b5ea4fbbb4067c83ae20524eaf060e6db",
+ "2021-09-08/llvm-tools-nightly-x86_64-unknown-linux-musl": "f20f89d4f5c49e57c950770b9b83581534b9f64187f718b8392ff58559b72de0",
+ "2021-09-08/rust-nightly-aarch64-apple-darwin": "67f875cbaeb23dd0aabcedd0c80809cbe9d0799f6316a0b37353d16921f3319e",
+ "2021-09-08/rust-nightly-aarch64-unknown-linux-gnu": "e27d7a5cdb7076674d885ce034ae243fa77f7d1210c83d52c8f8e4c4be86d204",
+ "2021-09-08/rust-nightly-aarch64-unknown-linux-musl": "c4b9090ec6793d96443ba51b0e531d99e7dfe715e2a506e28aa8e070c4811050",
+ "2021-09-08/rust-nightly-x86_64-apple-darwin": "50e5552ae8c20b056b122d2bbc45030f10772498b3bf88b6c539c9bab9e4555c",
+ "2021-09-08/rust-nightly-x86_64-pc-windows-msvc": "2ba241a6982360ffabbc383f91a642dc42c59770253041d8634255543a84d5d3",
+ "2021-09-08/rust-nightly-x86_64-unknown-freebsd": "da6ceabe8dbbd1f92e0dc77a4a98ff1745bb21ea714d9f4eac090626d5a480d0",
+ "2021-09-08/rust-nightly-x86_64-unknown-linux-gnu": "ea4960a18a13815736fcfa33886fa9de8f07ee758339050ce676ef81e9cc0f0d",
+ "2021-09-08/rust-nightly-x86_64-unknown-linux-musl": "acdbb72ee7e579940df739755ac478e3a386431aa606a9ab08ad1c870a24794b",
+ "2021-09-08/rust-std-nightly-aarch64-apple-darwin": "8a08b1862d2e69d249d67fb5669983ae961bd07b9bfc80585ef84269380a317f",
+ "2021-09-08/rust-std-nightly-aarch64-unknown-linux-gnu": "0f2fafb6f4c4693380b3e8eaf4a08729b511cdb1f89c4976c2944b4f87e48b66",
+ "2021-09-08/rust-std-nightly-aarch64-unknown-linux-musl": "4b2c1b78637bb0ddb7f5e2ae16119f84e00f16e874955c34dd3684e67344ac99",
+ "2021-09-08/rust-std-nightly-wasm32-unknown-unknown": "ef19646fb38abfde637fbd619c4cc4b52826fce09074f427d3cdd7d5bbf89167",
+ "2021-09-08/rust-std-nightly-wasm32-wasi": "df7cf483b11358850a2f0f9d6816b8ebcf3813ff4c0cc75cc99171200b2f866a",
+ "2021-09-08/rust-std-nightly-x86_64-apple-darwin": "4d13a115d70efc84daa181bf7927b4531c5e40cfc1df8a99c04c9ebb4010b829",
+ "2021-09-08/rust-std-nightly-x86_64-pc-windows-msvc": "0c93f9734b776bf7c2e150fedc2811db108e732a4f3328aedb038969b435c071",
+ "2021-09-08/rust-std-nightly-x86_64-unknown-freebsd": "64ff9746ede66362f44aa5de62541a85a196e639a2cfb5d60be038579ddcd367",
+ "2021-09-08/rust-std-nightly-x86_64-unknown-linux-gnu": "b6d1ff428b1c0591ea7375f6ae3421630d4b6da7e8cb6bad071284b5d563abe8",
+ "2021-09-08/rust-std-nightly-x86_64-unknown-linux-musl": "1cb7c1f28e4fa5096aaea77e56006a1cee69b77c5fcb1fae993a961942ea16d0",
+ "2021-09-08/rustc-nightly-aarch64-apple-darwin": "4de0dde4a4499074c9c4ca3a9617c89376ccbc21429ce2af94147570844f5436",
+ "2021-09-08/rustc-nightly-aarch64-unknown-linux-gnu": "a34ca09afb230c0852b1765f4477ff1135f66cb4c41fe88ca79901c3adf30aca",
+ "2021-09-08/rustc-nightly-aarch64-unknown-linux-musl": "9594f62bd1e209725302318f372ea2c28cbd83ec2b29c60e5db933f60674b447",
+ "2021-09-08/rustc-nightly-x86_64-apple-darwin": "1a7eccf24dd1baecbe07c2999c917e54e7f213496a2ed542fc8ba5afbb43d1f2",
+ "2021-09-08/rustc-nightly-x86_64-pc-windows-msvc": "15667c4fe1d810b3b1979c19d1def41dc5484f7444517c4277aec2154404face",
+ "2021-09-08/rustc-nightly-x86_64-unknown-freebsd": "13b46879f9eb1a5c467458ab1eb3a65d295d9834f3fec42f0ad4a273d9fde926",
+ "2021-09-08/rustc-nightly-x86_64-unknown-linux-gnu": "73891cf0b7eb252b6b8486ddaad91f7ce4b18950befe7853bc3d20d38e5ae069",
+ "2021-09-08/rustc-nightly-x86_64-unknown-linux-musl": "ba94c257e93dab13beaf0a78168de64295ee0178fe76a8be10e18c5fb5d7c5fb",
+ "2021-09-08/rustfmt-nightly-aarch64-apple-darwin": "691922fb32f3da37532bb9be974ad1717af521ec2b71bca4bbb5e57f3c4cc3fa",
+ "2021-09-08/rustfmt-nightly-aarch64-unknown-linux-gnu": "98b2eaf259a1bfdc70e40a52e891920dec7fc6132ad8d2420f91655c793ea340",
+ "2021-09-08/rustfmt-nightly-aarch64-unknown-linux-musl": "a4df0726fba466a5180471d3e63735c2b5ee9794e9f42026b1e8ae404dd43ab6",
+ "2021-09-08/rustfmt-nightly-x86_64-apple-darwin": "20de8ad3aa7507dd9657c4a4b959c38cc7f732a87bb757183033f78a96288e45",
+ "2021-09-08/rustfmt-nightly-x86_64-pc-windows-msvc": "0cc0f10763b73c5e4c8bdcd15a563d7e9d705b192ed6e8edc50dd6a71b874761",
+ "2021-09-08/rustfmt-nightly-x86_64-unknown-freebsd": "e1c28472a81312560ca36719f0b61b7212a07d63e85d745f97cd8e3b9ea8f191",
+ "2021-09-08/rustfmt-nightly-x86_64-unknown-linux-gnu": "a7d579672b94978e8427584f7e9d2b6534f320719252db46fc6ee85082d646ff",
+ "2021-09-08/rustfmt-nightly-x86_64-unknown-linux-musl": "fba0e7bc1401b830223b5207b63808e28403f48d1591c7d47c1681519c1883f7",
+ "2021-10-21/cargo-nightly-aarch64-apple-darwin": "6eba28dffca35b3b8809c0f56e93931ecf75b539d3ca0f048607047b2f3a9588",
+ "2021-10-21/cargo-nightly-aarch64-unknown-linux-gnu": "c91ab0b98bdb80b9136a06e8d6fff33641fad1c9a005559c976db57a5939bb90",
+ "2021-10-21/cargo-nightly-aarch64-unknown-linux-musl": "f0705d665f0721e64673ea8f282980e968fa1186793b7d6530415e0bd05e1711",
+ "2021-10-21/cargo-nightly-x86_64-apple-darwin": "84d04dd97de2e288d7f449006fd81a930ab1d9fddc20299c9aa8f9bcf1b5cbcd",
+ "2021-10-21/cargo-nightly-x86_64-pc-windows-msvc": "2bdd1823caaf95e2bbf8942c35daeb9aed2bf69534bfdb18f2aa8d1e32a0741e",
+ "2021-10-21/cargo-nightly-x86_64-unknown-freebsd": "e578efd5bb719ef96435e2e24969f968ddc00ec1515c86a7fbd01a650976e028",
+ "2021-10-21/cargo-nightly-x86_64-unknown-linux-gnu": "7fc7f3649de6d8aea2304f286d2d1e5ef279b38d88d8fcbb8b81b1a355201273",
+ "2021-10-21/cargo-nightly-x86_64-unknown-linux-musl": "b022b8341aae8c7d698d44a9f69439569385fb6a3c6e5783cf68853513023c10",
+ "2021-10-21/clippy-nightly-aarch64-apple-darwin": "ee11bef6780c3c326ba39c4fb2de53c7b82f3461ad50131811919067bdbc6d21",
+ "2021-10-21/clippy-nightly-aarch64-unknown-linux-gnu": "3e5b3866242c1c3405ab102c205d07bb633fe1884a0b1ef72e1deada91143fa4",
+ "2021-10-21/clippy-nightly-aarch64-unknown-linux-musl": "8666c8dfd127d69531f723210e23675fd372bf72c2c4ea3f853f00e6784c17bc",
+ "2021-10-21/clippy-nightly-x86_64-apple-darwin": "0bfd130526f021f8ee9c003895af276c9978f9da7a03e50d0efe59a73bcda1e2",
+ "2021-10-21/clippy-nightly-x86_64-pc-windows-msvc": "713491e5f7d1a6bb8bfe5433706515fd639b359d5a589ff3ed98a23c187a875f",
+ "2021-10-21/clippy-nightly-x86_64-unknown-freebsd": "6db6b98be1093fdf97a11cec2a87f30c27a10c6e7e96652f7b758f2d7428832b",
+ "2021-10-21/clippy-nightly-x86_64-unknown-linux-gnu": "8deb9bc3831bb90cd49b9ec8763c5a98349b5b47b6622634e64d8d58a2bb33c0",
+ "2021-10-21/clippy-nightly-x86_64-unknown-linux-musl": "effdaf877422d4700dc2ebba543c4186a5e281336c8f415c20482e75abc7f602",
+ "2021-10-21/llvm-tools-nightly-aarch64-apple-darwin": "d6a2bb9d9c097fd3ff15477a95edb77aa6efdae12c5964398e232339b15a955e",
+ "2021-10-21/llvm-tools-nightly-aarch64-unknown-linux-gnu": "8c9d5b9fe646fb39448addf7ee370cbba2c2a229189d38443b17f369dac2f405",
+ "2021-10-21/llvm-tools-nightly-aarch64-unknown-linux-musl": "1dfa08db634e1276d48aa26e5dbc50bf2fde3f2f8ae52dbe5f8ec8fc80bacb76",
+ "2021-10-21/llvm-tools-nightly-x86_64-apple-darwin": "b2331bc949012a35da7c3caccf87dc41f176ffec3c2101f5f2dcc9f83d733483",
+ "2021-10-21/llvm-tools-nightly-x86_64-pc-windows-msvc": "d6aa710e9cb1a8c5913acf2addd40a261f68063e9983441d4396f4443657e467",
+ "2021-10-21/llvm-tools-nightly-x86_64-unknown-freebsd": "85a642dbccf6f8637a5a1ec63e92d61040a9c59319ac1f9e713f5b891b26793b",
+ "2021-10-21/llvm-tools-nightly-x86_64-unknown-linux-gnu": "fa9532d8bd4cfd19626c700601cb73011b00cdd4325c5f5417004a3124d277e1",
+ "2021-10-21/llvm-tools-nightly-x86_64-unknown-linux-musl": "ae10630bd5117da9f5fa5eea27b5624ad864d4d47a291a1f77ca5508c9691762",
+ "2021-10-21/rust-nightly-aarch64-apple-darwin": "5716c620dc210d2575b95f43e7dfe5100f2a8c21651fde66217a506bab96d640",
+ "2021-10-21/rust-nightly-aarch64-unknown-linux-gnu": "b375f0cc8e83dea3c8a32c843492930460736c8bdb6ca3db93e7fa563f312b20",
+ "2021-10-21/rust-nightly-aarch64-unknown-linux-musl": "ddc46ab912d69fe56cd68a74123a08404ce5f0f74551d4433e8632b45114b0dd",
+ "2021-10-21/rust-nightly-x86_64-apple-darwin": "75b66db55f4b0df4592651fc573e4251fa45b3b48b2fdff5a86186f138ff081b",
+ "2021-10-21/rust-nightly-x86_64-pc-windows-msvc": "b15a584bfb4a55719a91b33239664a8eeb55e7f7580e53d947c78bf95b8a034e",
+ "2021-10-21/rust-nightly-x86_64-unknown-freebsd": "74676a2604ca5032307b0dc7865d1833ffde41440d649fd8e083b39e291dbb24",
+ "2021-10-21/rust-nightly-x86_64-unknown-linux-gnu": "778d604ebb1407b59f3d331d986b2d5ead609b2cfe5db6f0ba098375eaee021f",
+ "2021-10-21/rust-nightly-x86_64-unknown-linux-musl": "e7b285da594860356b12d61a5cd6da54e3bffef52b1b5a4f8ffeb1fa86736343",
+ "2021-10-21/rust-std-nightly-aarch64-apple-darwin": "28e2aac0c80e4e62874fe4a97fbeea9dc4482e74964eb1f4e8a83d7531be1a58",
+ "2021-10-21/rust-std-nightly-aarch64-unknown-linux-gnu": "c810f89068c71626ba3326b26cc24d017a76f060eadcd84ad0152b66031bd9f6",
+ "2021-10-21/rust-std-nightly-aarch64-unknown-linux-musl": "212d4f2928e14280bd2ed7a5f35e1a731521da58823f186a685db53711d5db8b",
+ "2021-10-21/rust-std-nightly-wasm32-unknown-unknown": "3db3ab740447206c71e303a9098a0eac2fa14117e4d6e437308239e0d469cb3b",
+ "2021-10-21/rust-std-nightly-wasm32-wasi": "be3ccf5a00e7698b152df33d31406a533ef3fae545d4912e6c3c85b40afd4e25",
+ "2021-10-21/rust-std-nightly-x86_64-apple-darwin": "73a686b2577994bf641a6422338a0cddf4250058df74ccc7540bc6026c53bb3b",
+ "2021-10-21/rust-std-nightly-x86_64-pc-windows-msvc": "1d7f65a9b63a1756d5915c8305930eac747dce5da8583af00f9cff8b803a33ad",
+ "2021-10-21/rust-std-nightly-x86_64-unknown-freebsd": "2903783f094fb121a9171d999aa0d73a255fb5617e4cdad5d8470183758bbb23",
+ "2021-10-21/rust-std-nightly-x86_64-unknown-linux-gnu": "ea390777b60ccd6861e7d163cdf0c19be0b19944039f1b52283120b598f56258",
+ "2021-10-21/rust-std-nightly-x86_64-unknown-linux-musl": "182d763bc6e727f98673ab6ed9d707841e2ea8dd4571bab4f289afb5006b396a",
+ "2021-10-21/rustc-nightly-aarch64-apple-darwin": "1b6a6bf8652751f5123cb7741466cec2164302f3306da92241b2b64103398236",
+ "2021-10-21/rustc-nightly-aarch64-unknown-linux-gnu": "60510d5d77b2d55e3b676bc0e478455452133f3f5dc3c173ba3d251c6b780ec3",
+ "2021-10-21/rustc-nightly-aarch64-unknown-linux-musl": "eef17c07cd783c2a3556785245280b3e0a56290ae4620ce324dffd88caff9785",
+ "2021-10-21/rustc-nightly-x86_64-apple-darwin": "9218bbf8d37c9c6a015abade1129a3b5d37453f144b2999b2f6b569044982ac7",
+ "2021-10-21/rustc-nightly-x86_64-pc-windows-msvc": "62e82a4283298165a0a7d656494d9f6da83cf44e098c337cfd7032acf96d0ebb",
+ "2021-10-21/rustc-nightly-x86_64-unknown-freebsd": "af6c9b69129a4a81fd79481f16f9feb1d4f726859b8d888cffc6fa8231a67c10",
+ "2021-10-21/rustc-nightly-x86_64-unknown-linux-gnu": "0bf65939240f9acbdb08cc4d22b9fb14357d29ee36f4bfc11d4ecc87f07b01db",
+ "2021-10-21/rustc-nightly-x86_64-unknown-linux-musl": "1a9bb9f7cbb5465de5976e75a730dc88a4081ded1f9fb54af1fa514a15b88732",
+ "2021-10-21/rustfmt-nightly-aarch64-apple-darwin": "51d764ca7e1c60fed329b1cbbd2a6a56e5b41f7b728a170745f8a4b4bad10b52",
+ "2021-10-21/rustfmt-nightly-aarch64-unknown-linux-gnu": "2ff4e25789d019047ff451faaf44a67cd155b4c0ec6834487da6cea950bdc2db",
+ "2021-10-21/rustfmt-nightly-aarch64-unknown-linux-musl": "ad433ebb84627c18d4c8b13623f52c46b23f628ef9a3b12e712381c504324960",
+ "2021-10-21/rustfmt-nightly-x86_64-apple-darwin": "589c1412db27f90407147ce3acad3afdb1769d77c1f31156ad6101c317f28490",
+ "2021-10-21/rustfmt-nightly-x86_64-pc-windows-msvc": "49b0163001fd7dd7395f89b408c9909c5b33c4f3147902ec2f77e567bb9d6b9a",
+ "2021-10-21/rustfmt-nightly-x86_64-unknown-freebsd": "d76aca59bb56c6f2e01ab5da9461e058814ba2fed6ebc3abb6bf55ee44a241cf",
+ "2021-10-21/rustfmt-nightly-x86_64-unknown-linux-gnu": "d53c942dc0628ec0214f0eff51ebdd8c70f2bff1293909c908e063c9153144eb",
+ "2021-10-21/rustfmt-nightly-x86_64-unknown-linux-musl": "21b3db961750e8a6ff83d2773e0feb86292fd92fbcda9f3362976b04b9069254",
+ "2021-11-07/cargo-nightly-aarch64-apple-darwin": "1947ba0d6b97e097bad279bbbf891d7a65d3b1611280dd88e82fcdb9f832cb3f",
+ "2021-11-07/cargo-nightly-aarch64-unknown-linux-gnu": "fe70a3e01abd01738c51479a7bc834392005cce661969088dac220f1b5fce31e",
+ "2021-11-07/cargo-nightly-aarch64-unknown-linux-musl": "987df6c4597a26c1a9bc0f195312cc96dcf2fe1f3651e91bea72a34f6dbe4d82",
+ "2021-11-07/cargo-nightly-x86_64-apple-darwin": "968790a3027da539c57caf194b8feafc9b01d3482566d58f2e012e8d00c28265",
+ "2021-11-07/cargo-nightly-x86_64-pc-windows-msvc": "e56ce94434929c1a4eb2bdfdcfb19e4194ff177c1d5934403deadd3db4304f91",
+ "2021-11-07/cargo-nightly-x86_64-unknown-freebsd": "51b2935810f845a9c85c51344488fe403ce13d49196135318373888726752339",
+ "2021-11-07/cargo-nightly-x86_64-unknown-linux-gnu": "66f027e3245c2fb444a272c9429c6b6334da8afe1ed87ac5ecc68f357cd37c82",
+ "2021-11-07/cargo-nightly-x86_64-unknown-linux-musl": "f6b4e44c2abc28281da5e03c0a957b8b54e22de34f6cab94894efbace7343c02",
+ "2021-11-07/clippy-nightly-aarch64-apple-darwin": "f16cae78cd8cadb8389817489283a572021a5f944e80c5c328ee32a83fb869c7",
+ "2021-11-07/clippy-nightly-aarch64-unknown-linux-gnu": "b0cf7f65fb5a903e62551e49b9341690b4f800552b34a4709ab8630a5cbdb71b",
+ "2021-11-07/clippy-nightly-aarch64-unknown-linux-musl": "b320ed68f8af98cd4c857ab7e3b2e3bed38f580ed6b72cc0f71e90e8dbbfb72d",
+ "2021-11-07/clippy-nightly-x86_64-apple-darwin": "40f91067724c983bf6061a5db4ba90bd620718f564648287ec52b348d76d012c",
+ "2021-11-07/clippy-nightly-x86_64-pc-windows-msvc": "1279ba3f78951e5f2180f3f07fcdbf4eb561ba5cddf84afdf53ebdd4b8ca2e24",
+ "2021-11-07/clippy-nightly-x86_64-unknown-freebsd": "3aeedabc9dcf54048f59a8ba9e695495ea3f570b88df98ef03c8d1247fddeaf8",
+ "2021-11-07/clippy-nightly-x86_64-unknown-linux-gnu": "567b3a83390c893077b540cd07f4798d8d287e30025f437ff4e21609b1a773c1",
+ "2021-11-07/clippy-nightly-x86_64-unknown-linux-musl": "a97bddc05146f2c55016af4cc53cd06786a01eb111dfe139bc421eff1c54c645",
+ "2021-11-07/llvm-tools-nightly-aarch64-apple-darwin": "f3c5c93432ac2c7397ba5bf598f36a9e05ccec1ba8646e7127dde13741e91e78",
+ "2021-11-07/llvm-tools-nightly-aarch64-unknown-linux-gnu": "efc96c6a6d7cb0cbe254f1486c5b9678078aca950bdadfc36d8218fd0cd739fb",
+ "2021-11-07/llvm-tools-nightly-aarch64-unknown-linux-musl": "f760aeb71cab8abc582eed5766433a7851be2da80d20b75dbcae5df0d3c3be91",
+ "2021-11-07/llvm-tools-nightly-x86_64-apple-darwin": "3b95d04628e75c2ab43298db610e519fe4c00057757bce67461264e2479d265e",
+ "2021-11-07/llvm-tools-nightly-x86_64-pc-windows-msvc": "26a88a8d0e0b2fd9336b85e8a8cc7aa0aef72efca48c0acabf40a5f9f9b9902e",
+ "2021-11-07/llvm-tools-nightly-x86_64-unknown-freebsd": "064b8fef9689bb51cc6358e3239920117aa518e9d375be48d3d7e17ce4b7d2df",
+ "2021-11-07/llvm-tools-nightly-x86_64-unknown-linux-gnu": "a72f3f2034921baa4e8d2af412532df45d39d163ee6af77c1ed5da3be32efccd",
+ "2021-11-07/llvm-tools-nightly-x86_64-unknown-linux-musl": "da704644570b177093eb13486b3f34a6aa7c8b93fa565395eb15ad29bc75fb15",
+ "2021-11-07/rust-nightly-aarch64-apple-darwin": "ec27e6e751bf24916e53e3d601bf4e406e624f4ed894aeddef6b418622b41316",
+ "2021-11-07/rust-nightly-aarch64-unknown-linux-gnu": "cdafea25f36d618d754ddba007ffa0cc0e52df60c160187f68f7d41a91efaa12",
+ "2021-11-07/rust-nightly-aarch64-unknown-linux-musl": "b204d0979da8fa81a5be832868df4ccf9031e9582d2a9720bd17be5af845c055",
+ "2021-11-07/rust-nightly-x86_64-apple-darwin": "fca7b8c128fc2c0b8834d06f6ebf78e4d2030be83a87a08f2f9f5247d2be8470",
+ "2021-11-07/rust-nightly-x86_64-pc-windows-msvc": "bf441a201b48d61a5908952367f830fea0642993d518972fd3acff62b6c1e321",
+ "2021-11-07/rust-nightly-x86_64-unknown-freebsd": "bd0791a44cd3c8f2274b42b9206016ac948cac97b642f0303c0f19e0fffe6089",
+ "2021-11-07/rust-nightly-x86_64-unknown-linux-gnu": "ece5f02e4c1cbaf6801fab787d834166aee7676f7c3b2272ff9810d6d541af27",
+ "2021-11-07/rust-nightly-x86_64-unknown-linux-musl": "926a2b44e0c2f093e62e696b6e53e3b5a9d7882e8c426cfdb364a3e2a2541ebf",
+ "2021-11-07/rust-std-nightly-aarch64-apple-darwin": "478dd2f878e791185e565f9a6a2ae0e7a35c472cce873e50bd6b9cf56b364a38",
+ "2021-11-07/rust-std-nightly-aarch64-unknown-linux-gnu": "31e933401b920a16b797f8ebd3f7cdac43647db5b266f8e812a847f34f167b66",
+ "2021-11-07/rust-std-nightly-aarch64-unknown-linux-musl": "b27f126391825d7db36ccfb688ac3c1d3ded91b9b26446dd1da7ece05347f96d",
+ "2021-11-07/rust-std-nightly-wasm32-unknown-unknown": "da22f32ed22a44d1cf478b52e062494ae063cc3ccd06b12964d6000cbae54186",
+ "2021-11-07/rust-std-nightly-wasm32-wasi": "02fa9f517dea1f31eaa6366c3de5bea2a6c3c09f16758e7a70518727d77191d2",
+ "2021-11-07/rust-std-nightly-x86_64-apple-darwin": "983aa9ada64afb54453b39e572f5d622b2f390dcbeef1002aac1a5d11a50b3a8",
+ "2021-11-07/rust-std-nightly-x86_64-pc-windows-msvc": "408884156e55fe210880e7ee7612a5bbbb2300e4dc4d1ee0cd3726a1225343ca",
+ "2021-11-07/rust-std-nightly-x86_64-unknown-freebsd": "c42b5c495e216764f56e538f0cd54fb6cdf193cd3348a7f37b157f27f440ea43",
+ "2021-11-07/rust-std-nightly-x86_64-unknown-linux-gnu": "218743da51034586ed84ad43f95d95a38805403f0e31faaf247eedba883fa8b5",
+ "2021-11-07/rust-std-nightly-x86_64-unknown-linux-musl": "f5733b29a9c1102355cde885cebf5da42b738632e7dc5919e246c34551126c50",
+ "2021-11-07/rustc-nightly-aarch64-apple-darwin": "ccfd72ed6a189c490d22ea91e53ba7d217db123b6c4015de94ac88973a4f031c",
+ "2021-11-07/rustc-nightly-aarch64-unknown-linux-gnu": "3f5a445397f8a7dece4195b7c181398b6d7c06480bc59ce92058c97f68172353",
+ "2021-11-07/rustc-nightly-aarch64-unknown-linux-musl": "5588596a3ef4bd938802349faf64159fb661f04717fef2d08acfc50d35de4673",
+ "2021-11-07/rustc-nightly-x86_64-apple-darwin": "c3df9cac3419633ae1e9b6a41183a413a3a722a72124394d441d5c914aa9f91d",
+ "2021-11-07/rustc-nightly-x86_64-pc-windows-msvc": "e218ed52bcd57b25a0eeb8a9be4fe954ea226f785940409cc6fc378ad8f25876",
+ "2021-11-07/rustc-nightly-x86_64-unknown-freebsd": "c5f2cc78f5f59179e0fb3770e58eacc44eddcb0c3b2c143b8681776b4caead88",
+ "2021-11-07/rustc-nightly-x86_64-unknown-linux-gnu": "e7e6dbc8291d283a890c994ec9507dfce25aa93a47b2cc213f845b3bedcd2002",
+ "2021-11-07/rustc-nightly-x86_64-unknown-linux-musl": "95fcbd60d484725002c1d20134160201417cc6715ba4e320fa30f95afd95b4e0",
+ "2021-11-07/rustfmt-nightly-aarch64-apple-darwin": "3493f540161825feb81d022bfb6f84f2040f5ad014640e9bfd1a4b93902113c4",
+ "2021-11-07/rustfmt-nightly-aarch64-unknown-linux-gnu": "58291d3b3045b3c2f156d7547db3d5c117840663a6d10425580fe2936c1f7f9e",
+ "2021-11-07/rustfmt-nightly-aarch64-unknown-linux-musl": "85178f75658b69291bedfae0d7c27505f7b0aa0fe53de3922d2f3f671d601e13",
+ "2021-11-07/rustfmt-nightly-x86_64-apple-darwin": "71bcbd9b0e8417e8cbcece46701a3e023eaa596377bfa66507fad0ad383cfd46",
+ "2021-11-07/rustfmt-nightly-x86_64-pc-windows-msvc": "c082bc7eb8d04e4d7025e23b443b14aecc5d504e3de21c1c110c3e04d05d71f0",
+ "2021-11-07/rustfmt-nightly-x86_64-unknown-freebsd": "21815c052a39c5c5d361bbb473a2c36125eb657598359f6b343e352c278c0543",
+ "2021-11-07/rustfmt-nightly-x86_64-unknown-linux-gnu": "102e7e2300fd6dba8aaee468b887ea7fdc43f39f012db2815040586959f6aa36",
+ "2021-11-07/rustfmt-nightly-x86_64-unknown-linux-musl": "8ac20334b400e0a6e4b487e3536f7236f9238a45d63f490baeda7c47fac72504",
+ "2021-12-01/cargo-nightly-aarch64-apple-darwin": "424a002ad3d9b2974aebf3eea8400081e3aa66b1b4aea0e8b12534b0d6857bde",
+ "2021-12-01/cargo-nightly-aarch64-unknown-linux-gnu": "56ef3a6f98e063b7297f5a92ac9aa20fd8d1a235a4879a10c3b8a0ebe2e57245",
+ "2021-12-01/cargo-nightly-aarch64-unknown-linux-musl": "71d08d9ac3da4c628e91b0e9e0b34ad55d2f4904953003ea96d2b016837c5f1f",
+ "2021-12-01/cargo-nightly-x86_64-apple-darwin": "4d12c1d9034cf759c15d30d768a3010504621f5ccfc22026bf6591afc16bc780",
+ "2021-12-01/cargo-nightly-x86_64-pc-windows-msvc": "06b258fd6c10aa97bcfdfaa9e6d728b7024f1ca9bb4b69978ee433710e1235b6",
+ "2021-12-01/cargo-nightly-x86_64-unknown-freebsd": "924f3f0b15d8109261c4a28050e64eaed0d5f2dba9865920d7a3f94f613d2517",
+ "2021-12-01/cargo-nightly-x86_64-unknown-linux-gnu": "0757e9d7faa9b601b35294a44b6224087f6df384e157f8a80a8bd7f609532987",
+ "2021-12-01/cargo-nightly-x86_64-unknown-linux-musl": "bf5bcfbe47ccc49d830623a57b723a3c7436637c36d84b53f597d85ee1132cba",
+ "2021-12-01/clippy-nightly-aarch64-apple-darwin": "bcfd9191c6cc2b779ddb5c5bc5ceaf3fb8efa700123c175a0944662809357efa",
+ "2021-12-01/clippy-nightly-aarch64-unknown-linux-gnu": "4903c94d97700b9ad70689fbaaaa939a2f37d4736cf87bcf900ae5e909a6917a",
+ "2021-12-01/clippy-nightly-aarch64-unknown-linux-musl": "7453115f2b361db826c5a6def06bf9531876cdca77f9b3a8339c0446d0e88c8a",
+ "2021-12-01/clippy-nightly-x86_64-apple-darwin": "b9f69c5e50fda9d22d029f51e181971f9d7acdd81607fcbbec8da87ee2678acc",
+ "2021-12-01/clippy-nightly-x86_64-pc-windows-msvc": "fe56e5385392eb7109d2450eeea78a744a830f0df4bc08cef62ed70530c6f7ff",
+ "2021-12-01/clippy-nightly-x86_64-unknown-freebsd": "2fa59d32937de93d322a0c3458c6f732950bae75f7487ce10516b2a2299dba3a",
+ "2021-12-01/clippy-nightly-x86_64-unknown-linux-gnu": "238167df07be8b65f325d7409d3822c42832db3afa289fd303619acfa62ebd4d",
+ "2021-12-01/clippy-nightly-x86_64-unknown-linux-musl": "12cc9629b9fcb7760d38b38ddb19f6ab173994fa19bae9ea0ef10e560b36e9d6",
+ "2021-12-01/llvm-tools-nightly-aarch64-apple-darwin": "3889ad569be62d99cd0f1de0ccf404a7176c862ef6e001130438d86067aeb266",
+ "2021-12-01/llvm-tools-nightly-aarch64-unknown-linux-gnu": "d0e4f1e40c769376728fe5bbe1f3e254959c33513a18dea1e111cd2e2d2fe8c0",
+ "2021-12-01/llvm-tools-nightly-aarch64-unknown-linux-musl": "2960b9000f0c32deb12096e99ae26af4f85d2313c0227a95fae89637a10850b7",
+ "2021-12-01/llvm-tools-nightly-x86_64-apple-darwin": "1ac4f401421e7bc34a5c17aa5f8a0802f5e1bdb9341d4969ff058ae387e95eb4",
+ "2021-12-01/llvm-tools-nightly-x86_64-pc-windows-msvc": "f7bc73ef6cc909ad1a20a9c91386ebb67d0dd3b300698ed50a3fe314921f636c",
+ "2021-12-01/llvm-tools-nightly-x86_64-unknown-freebsd": "9755dd8b446a7fe327b28e699b43c64a8088e87b7f501869d8bc77c7bd17e80a",
+ "2021-12-01/llvm-tools-nightly-x86_64-unknown-linux-gnu": "845265609040d3a620e731a8d1f0f59f231ab6699ffd6132411437aa9b3c3060",
+ "2021-12-01/llvm-tools-nightly-x86_64-unknown-linux-musl": "68660d1226628edcbe80baeacc075d8d4f9c6ea87bb22fc55b6727e6807e5d6d",
+ "2021-12-01/rust-nightly-aarch64-apple-darwin": "c304a7a154b8bf44ff7a338996f1dd249678871bf1d24977e8763912197f89aa",
+ "2021-12-01/rust-nightly-aarch64-unknown-linux-gnu": "b0b3dbde13f8cea3086896efe8402b87cf281260ceb4bf8d3f1bfd1216a309d9",
+ "2021-12-01/rust-nightly-aarch64-unknown-linux-musl": "3e210d5da0384b90e90933683ac19ab1d2439c6b920db8c24e15faba484c86e9",
+ "2021-12-01/rust-nightly-x86_64-apple-darwin": "720d6058352322f1d59683236f0d5092d90ed64ed3f41cee80aa55d3d5a8c7ca",
+ "2021-12-01/rust-nightly-x86_64-pc-windows-msvc": "e4e42a29016982376a9e178cc83874480bd300e5fc6262ed3a1034ec0b80349f",
+ "2021-12-01/rust-nightly-x86_64-unknown-freebsd": "a85e08ec1a52a6bd496400de638bb2e57c7f1192c740e03a776a11e1e892620e",
+ "2021-12-01/rust-nightly-x86_64-unknown-linux-gnu": "ffcb8b45a95221f8d77bb93faf3fd0e2a7f18e6759e631a45295883f996a4d40",
+ "2021-12-01/rust-nightly-x86_64-unknown-linux-musl": "4d98286d2ca36cd348de7a78c8a127b6fec181e1b00fd045be0ad4fa2b466e83",
+ "2021-12-01/rust-std-nightly-aarch64-apple-darwin": "907bd677f494c0858803bcb3c00c1da60b9ec0ff25c71960a896dbf89a7a61a5",
+ "2021-12-01/rust-std-nightly-aarch64-unknown-linux-gnu": "3ae916ceef3364a49c3eb3e936af95aec043cad8cb293fa3f7703846728cd398",
+ "2021-12-01/rust-std-nightly-aarch64-unknown-linux-musl": "71421760124795171964945203719f7dec1924beacdb73b9658d01c8cab37b5c",
+ "2021-12-01/rust-std-nightly-wasm32-unknown-unknown": "e24999e365a8701b8466d2081ec61589b1c4a9333256779b60594688999d2334",
+ "2021-12-01/rust-std-nightly-wasm32-wasi": "5b31eb7ef9c580ebb751f4c41851ef3184261e2fc6c3481567cbb36a816681f1",
+ "2021-12-01/rust-std-nightly-x86_64-apple-darwin": "fc84ac87b089a198731e82a203d38a3a07b72e3f7399b0b47c1d0ec2be576e0d",
+ "2021-12-01/rust-std-nightly-x86_64-pc-windows-msvc": "9b6e945d5a42162b5f3ec792015084e4f349a338605478630b874e9388662300",
+ "2021-12-01/rust-std-nightly-x86_64-unknown-freebsd": "7a03e9faefc1f36d6b6c240371c7db539593cfbed47ca6dc141e3a0c2fc71bd5",
+ "2021-12-01/rust-std-nightly-x86_64-unknown-linux-gnu": "003b3e83e798d635206ca06c919696f2eea7277d9721c8623272fa33059ec2ab",
+ "2021-12-01/rust-std-nightly-x86_64-unknown-linux-musl": "f6c14b5df1fa6341a1b5f4dfd53c2795e2f7c43fc522aac57d055143ebe5e06c",
+ "2021-12-01/rustc-nightly-aarch64-apple-darwin": "ec3af041e4a8aa4bba5d8565502f983f358d9884cce61911e70bb2b12a63f9a5",
+ "2021-12-01/rustc-nightly-aarch64-unknown-linux-gnu": "0f863eb5a00810f140bd6a10ea74e9a2011e852958ac8f8ca50940325864afb4",
+ "2021-12-01/rustc-nightly-aarch64-unknown-linux-musl": "e0432ff13bdc00a36fa1fa20b736a385d6803795855214438d256f0678edbc94",
+ "2021-12-01/rustc-nightly-x86_64-apple-darwin": "6c1557e71cf3aeeb244855c32a7ec9b0297dc66ba57cf17af4e16fd1388f08a7",
+ "2021-12-01/rustc-nightly-x86_64-pc-windows-msvc": "41aebe787fb1a5699f0dd224e9e47270133fa4c971faa97cba2ac609c24828f6",
+ "2021-12-01/rustc-nightly-x86_64-unknown-freebsd": "33a34b95e7b541b51e5ca6f0c0096757c9afef0a0f71e0f7320352882937d240",
+ "2021-12-01/rustc-nightly-x86_64-unknown-linux-gnu": "3b83f5195aa3a73fc9b17acdffd67ff6198f26c075d8b1e6c82a8bd717c3a031",
+ "2021-12-01/rustc-nightly-x86_64-unknown-linux-musl": "a82281cca27567897b58b85a3dad0888b6ce13d7987fbff3397501469bca579e",
+ "2021-12-01/rustfmt-nightly-aarch64-apple-darwin": "42a7f5965d0af7df73c7629e701708ddd59f9a2a3fb4b8656c78d5b0dde0c0ef",
+ "2021-12-01/rustfmt-nightly-aarch64-unknown-linux-gnu": "e8cfd49797ac43557ee2eae7543d95c1f9ef5b2d651ae026152b0ee38748bc9e",
+ "2021-12-01/rustfmt-nightly-aarch64-unknown-linux-musl": "c4b392988b1e6330a9275248118a348ff029d83d37ad948c568de280c8fb016c",
+ "2021-12-01/rustfmt-nightly-x86_64-apple-darwin": "6993786d7fc1223be21f0b11cfedc7cdbc0cc951f52445e982445e38dc4a5f0d",
+ "2021-12-01/rustfmt-nightly-x86_64-pc-windows-msvc": "d96a8c2622b511179a6c1b4a00e9aeb015d9ce33de40788358a6ef7e4b50215e",
+ "2021-12-01/rustfmt-nightly-x86_64-unknown-freebsd": "5ac0969e1c2e3009f739ea5cb12b87808045f43a0635ee8ddec0b2b04be00814",
+ "2021-12-01/rustfmt-nightly-x86_64-unknown-linux-gnu": "51f23dd0f8e14cab67f8bbd3a4aa142988ca0ab1155ddd2f37a22576dda6089b",
+ "2021-12-01/rustfmt-nightly-x86_64-unknown-linux-musl": "a58f271f8859c79b33f8b30a33cf91879a85f740c3f8ec99c75f21933b220b8c",
+ "2022-01-12/cargo-nightly-aarch64-apple-darwin": "28b2465970234b721799d0d7893ba3bd82db60dbfe9fce3ee280ba31e0cc05d3",
+ "2022-01-12/cargo-nightly-aarch64-unknown-linux-gnu": "a48f67a2e9b3158579abe99218029f7add37927dd96b7ee297b19d898264c82c",
+ "2022-01-12/cargo-nightly-aarch64-unknown-linux-musl": "20ecedf9cd58870c315bb215529b70d5d7efcc3091cbcd933097dbe3de643395",
+ "2022-01-12/cargo-nightly-x86_64-apple-darwin": "2960a0f4ea742d6c1af1293f21d6b88e5d1d87fa5cf12950a44caf6f3efc31cc",
+ "2022-01-12/cargo-nightly-x86_64-pc-windows-msvc": "58b3c44263e2cfdddc6c71604c0a20f730363ac29e7d2f86570a7910f753ce6a",
+ "2022-01-12/cargo-nightly-x86_64-unknown-freebsd": "fc83fb1358e6fe796879077ac8b79168694a6ddd2d8a0b90ef8bcdb6fdaa6aa0",
+ "2022-01-12/cargo-nightly-x86_64-unknown-linux-gnu": "2dc110d1caca2829ccaaf51cf4e553a1f5954364b7087c881efce52d18580817",
+ "2022-01-12/cargo-nightly-x86_64-unknown-linux-musl": "36b1c88f08eb35048937ee29a681405852198cbfb17fb29117f27ed185d2aaa1",
+ "2022-01-12/clippy-nightly-aarch64-apple-darwin": "22518551453026be28657094dc4d364369357bdc59c1ac8c785bc67d59f24acc",
+ "2022-01-12/clippy-nightly-aarch64-unknown-linux-gnu": "f89ca2df2eacdc7466feb2d502f81d3640bf1295d590011385366e331bc862a1",
+ "2022-01-12/clippy-nightly-aarch64-unknown-linux-musl": "e310f7b854e365c63e9a9449802b428cd9f21af336fa763c311cf8a541977f8a",
+ "2022-01-12/clippy-nightly-x86_64-apple-darwin": "2daeed49f7e7e85b2187177fd1d18e14400a0d38a5a717620d4af92deb17b4d2",
+ "2022-01-12/clippy-nightly-x86_64-pc-windows-msvc": "86e92e3f785272c354c548cf5220dd355798b786e0e8630cadf7fff3b4aac3e3",
+ "2022-01-12/clippy-nightly-x86_64-unknown-freebsd": "7bc87fd4a2ea153342a6144849a7786398713255c0ffc94f17a62a1a5ea36387",
+ "2022-01-12/clippy-nightly-x86_64-unknown-linux-gnu": "1d244ea2f27d4fc7447d4126b965620e6f6cca916db15a8f1f5df0f8bcb6e4f3",
+ "2022-01-12/clippy-nightly-x86_64-unknown-linux-musl": "b6e157718df8219bfe0c2cc67182d451b644aa7f8e0a3060f7676c4a53af0df9",
+ "2022-01-12/llvm-tools-nightly-aarch64-apple-darwin": "4dea9eb7156cce2856f06ce58b76039edf5452dc2dcfe1dbf2ca3e4a2a4513ef",
+ "2022-01-12/llvm-tools-nightly-aarch64-unknown-linux-gnu": "c8a61bf792a6fe1a2e10ccdb1684059626cbf077b6d82883549e0a824ec00fb4",
+ "2022-01-12/llvm-tools-nightly-aarch64-unknown-linux-musl": "e49c63a89360598a1ccaa4b4d452d6fe4f4974b70c1774125b7d0864984af4d2",
+ "2022-01-12/llvm-tools-nightly-x86_64-apple-darwin": "efee2f08143fbff836e6517ea7457468da07380dcdf8a3a19cb9eb7b3b36da7a",
+ "2022-01-12/llvm-tools-nightly-x86_64-pc-windows-msvc": "d9748a16a855057201581ee1a3f6105ddd00511bd3129ca1175139f686b0a1da",
+ "2022-01-12/llvm-tools-nightly-x86_64-unknown-freebsd": "73dd634e5b9361c52fa1ad9b3ee1126b5ee5f988165eee6e47f7c80bb1d02f79",
+ "2022-01-12/llvm-tools-nightly-x86_64-unknown-linux-gnu": "dbea5a53828f590af592386d880ada84c55a072d5c2cf2148a0aec16c86afa45",
+ "2022-01-12/llvm-tools-nightly-x86_64-unknown-linux-musl": "f4fbe5809cfc6271297de76f78bdbe0591fad5daa747a78fe43019d088048f61",
+ "2022-01-12/rust-nightly-aarch64-apple-darwin": "2976b38351b6133dd20f940210a9d7a36da7a63b4991f3dd7a977629a4e30a19",
+ "2022-01-12/rust-nightly-aarch64-unknown-linux-gnu": "67f91c94ed84cdeeb5c3d09eea11a01056befe6f8f199974c779e4a7c5580f52",
+ "2022-01-12/rust-nightly-aarch64-unknown-linux-musl": "d976d6d7d102c6dad026680cabc4ed44e21405f6afa28879ec24a78ccf9232da",
+ "2022-01-12/rust-nightly-x86_64-apple-darwin": "49bed5d3078cfdd9c95184909f80da529edf83c4b256ef2191dada8a22ba2d03",
+ "2022-01-12/rust-nightly-x86_64-pc-windows-msvc": "b0ee56ad0245dee798bd4f268fde3bcee58b081c0ed16e212773f273e04e7b40",
+ "2022-01-12/rust-nightly-x86_64-unknown-freebsd": "7ba2e7f96735a9021de7f6817be33c8f9c269ef8666cc8267682b3dd3044e5f1",
+ "2022-01-12/rust-nightly-x86_64-unknown-linux-gnu": "414208e1f535d760faa1b8074e20b32f1b045f42efda741677bb718a80980b60",
+ "2022-01-12/rust-nightly-x86_64-unknown-linux-musl": "d9b2a94d67e6484a17b6f128cdc2ecc081068a7730b93cc480b9886dfbdaf523",
+ "2022-01-12/rust-std-nightly-aarch64-apple-darwin": "eead24d761bfa6ef0c926d59ed2cfeb51dc68fa4c13d59672289a6cc5795d990",
+ "2022-01-12/rust-std-nightly-aarch64-unknown-linux-gnu": "80ef127c8e0f8b2a9d4d6dd6c59e3b27c07ba7234e3fa2d8155227bdcaf18349",
+ "2022-01-12/rust-std-nightly-aarch64-unknown-linux-musl": "9716a07e0255737c1a5882cc8d053906bf82fc2cad0e86184d7dc12780811136",
+ "2022-01-12/rust-std-nightly-wasm32-unknown-unknown": "52f08158233d16c2b6b26b009f438ffbf2d60c4acbee4c8dba0718d363112637",
+ "2022-01-12/rust-std-nightly-wasm32-wasi": "318294f44e7dfe947445d03fe048465fce57a8acd4d39c45b04d64f8c5681950",
+ "2022-01-12/rust-std-nightly-x86_64-apple-darwin": "32a2f359a66e9257afb3166c3f3d03b46cccf15d081ff1962b6b6dc7589d16fa",
+ "2022-01-12/rust-std-nightly-x86_64-pc-windows-msvc": "fed0b46a7278a327827169f0dfc829ec3d11ca64c86b59b73e9a5164c6d4f865",
+ "2022-01-12/rust-std-nightly-x86_64-unknown-freebsd": "ad8c17b3a32d325a546bf22a6a5744e6dd448cdbb103c8687c9a7de622317474",
+ "2022-01-12/rust-std-nightly-x86_64-unknown-linux-gnu": "a0574b2ae49a860d69f66d8060ef42e764be73ccffe3ecbc1dbd5bbdbe9c06d4",
+ "2022-01-12/rust-std-nightly-x86_64-unknown-linux-musl": "ca442e0a9ca4c94ced9de08ece921be187ecc1b540518be76a7029fd7142eeb6",
+ "2022-01-12/rustc-nightly-aarch64-apple-darwin": "dc5fa145966daf5ec010e0b83f3b115866683ac418667e39663ea13a8e490d7c",
+ "2022-01-12/rustc-nightly-aarch64-unknown-linux-gnu": "d6183b88df1f868862bd3cf138f25179ba2fdab7f16e2d14577ddd56731ea18f",
+ "2022-01-12/rustc-nightly-aarch64-unknown-linux-musl": "1915a5b04ed3cde9f2566ca7f5205e37b706fc5cacc9ac64b7e6d818d882f39e",
+ "2022-01-12/rustc-nightly-x86_64-apple-darwin": "c51b1b7830d302fd352d4e105282da0c2aa01d98a7d8c0b0018db24539f2fb0c",
+ "2022-01-12/rustc-nightly-x86_64-pc-windows-msvc": "69edaeee958c53a2ae99813994f60b27198538e288217bc30862668975e01144",
+ "2022-01-12/rustc-nightly-x86_64-unknown-freebsd": "cca63c6998d9762616c74518dd870fe67432fe0442003211ba58f0f1e3953e46",
+ "2022-01-12/rustc-nightly-x86_64-unknown-linux-gnu": "4cc6346b16182c580c1fdee2ed35061d57140422d6e13f04b0f21db4ad9a9105",
+ "2022-01-12/rustc-nightly-x86_64-unknown-linux-musl": "1716aae4bf44c58ffa91121661e78fe112cfa5655dd2e98675e2dced7a4818cc",
+ "2022-01-12/rustfmt-nightly-aarch64-apple-darwin": "458b707f541a604cf4463a99e7c9f6dabb5222c815b7278735a8147ed6a6d8cd",
+ "2022-01-12/rustfmt-nightly-aarch64-unknown-linux-gnu": "edb9f32b1d8228362a17ffc83d47479bd247000d50f9cb4c0fbf4570557139c2",
+ "2022-01-12/rustfmt-nightly-aarch64-unknown-linux-musl": "34299938e1f5d06f048b992f5bc57f17b5d07d7417dceafdd67d64f893c609ab",
+ "2022-01-12/rustfmt-nightly-x86_64-apple-darwin": "eb6716d438d6923cb8b6cc1220fbfc30cca77548c19d1ec4656c4041dc680b73",
+ "2022-01-12/rustfmt-nightly-x86_64-pc-windows-msvc": "a29f9343d63ba3982eb3c783777430a864eee8bee0191c3899f7abcddfb0de0a",
+ "2022-01-12/rustfmt-nightly-x86_64-unknown-freebsd": "b53e01c1d038ce6ee92bbedd0d4c5ae9942521a36d937ec9cf43caaa73278eb8",
+ "2022-01-12/rustfmt-nightly-x86_64-unknown-linux-gnu": "edf5018504be0d79d77615a0c7e029a378446e2fd1a5360d86d97196519b510b",
+ "2022-01-12/rustfmt-nightly-x86_64-unknown-linux-musl": "237bef02a341db60e3af388feb7d7351d13da9728cc8fa10bda5631f812b2a58",
+ "2022-01-19/cargo-nightly-aarch64-apple-darwin": "e0bbae6fe4ea276773d426fb171fdca151c8877406476ef9200fbdc296d2f2ab",
+ "2022-01-19/cargo-nightly-aarch64-unknown-linux-gnu": "1fc5a3fe7ae76b2a332c95357f1b01c75341d022d66b918e8b2d9500fdbac74d",
+ "2022-01-19/cargo-nightly-aarch64-unknown-linux-musl": "06f0c843e0694a9fbd6f52d4257cea7a9ce7b0cfc519134cac03f85ac103839b",
+ "2022-01-19/cargo-nightly-x86_64-apple-darwin": "55e64aad2d07a7d1aecf3fe417039f20ef5b794e7597be0d5d0ab3098b439b39",
+ "2022-01-19/cargo-nightly-x86_64-pc-windows-msvc": "c8f22a3ce1edb3632148b0117198947f80f1173b5e034468d039db9734d727ca",
+ "2022-01-19/cargo-nightly-x86_64-unknown-freebsd": "f088c70c08c55564c11a10698881a7317d44e934fc4054e65f45c4e721c8c663",
+ "2022-01-19/cargo-nightly-x86_64-unknown-linux-gnu": "9dba5c80dc04089d3fffbd2bb066721a2ea3a4ef5772620d64083dec6fd7ba9e",
+ "2022-01-19/cargo-nightly-x86_64-unknown-linux-musl": "0019a2625020210edf0df9f77a805ee404d59c00bea1013020dfd9d1f63a428b",
+ "2022-01-19/clippy-nightly-aarch64-apple-darwin": "3e552735b0f7edad6333514da898a374f089045918916fc86ebd6d1b2f146813",
+ "2022-01-19/clippy-nightly-aarch64-unknown-linux-gnu": "261eaaf4cbe038fe99f437f41a6479f1c85178b68b86ba322363c3a988a41df5",
+ "2022-01-19/clippy-nightly-aarch64-unknown-linux-musl": "98ab9cbc764859416b199498cdaa29f3e0530b9fee37a00194575102d1d18614",
+ "2022-01-19/clippy-nightly-x86_64-apple-darwin": "57bbd4e12dfe619bb38ca51e0457c7a0458ead39a5f8b8009e82c3ff782ef534",
+ "2022-01-19/clippy-nightly-x86_64-pc-windows-msvc": "f9415462ee2982c546bf4cdebf513292dfe380366604b0da3533ffcb7b062f58",
+ "2022-01-19/clippy-nightly-x86_64-unknown-freebsd": "6732077fb8ae4cbf038c7d56ad2d73e08dc7fe214618c1b8048d5886a0e38782",
+ "2022-01-19/clippy-nightly-x86_64-unknown-linux-gnu": "8a84d8d4120ab3a9a1843fb4b343531ce2f66e472f2bd9b4adb6e825c336130b",
+ "2022-01-19/clippy-nightly-x86_64-unknown-linux-musl": "1472e5cd4b2950bd22a2e6feaafd01f7a2a8b726f12d6152b262474fa2cb57c3",
+ "2022-01-19/llvm-tools-nightly-aarch64-apple-darwin": "669057387a1515c3c4529786f60b9a25ac5c4eda911422fb023b73fa8a380a36",
+ "2022-01-19/llvm-tools-nightly-aarch64-unknown-linux-gnu": "7afb1e98626316cc1de6b62edb319b5f006da5c24601bb657c5cf567555b5730",
+ "2022-01-19/llvm-tools-nightly-aarch64-unknown-linux-musl": "e9bf498717ca2e8c7620957a5f7846b53dc09a7c720e8ec31e67c8da25fa59b0",
+ "2022-01-19/llvm-tools-nightly-x86_64-apple-darwin": "de72f572574a1238dbec6ee6b5c48e31b6770826cbcb6ecc61c568587c82ab66",
+ "2022-01-19/llvm-tools-nightly-x86_64-pc-windows-msvc": "97f9c947d726b72ab318705b539e11012a73a08dcb79e00c73d680d9a5166882",
+ "2022-01-19/llvm-tools-nightly-x86_64-unknown-freebsd": "2e42c56a825fa9bd640fbb3bafecb02cfe68877e09d1c0ddfdff794e4571a2a7",
+ "2022-01-19/llvm-tools-nightly-x86_64-unknown-linux-gnu": "bfd89e74330fc0f9d61b75852c96d644fe5ffd90636e8668f10480e27cb8593c",
+ "2022-01-19/llvm-tools-nightly-x86_64-unknown-linux-musl": "5dbbbbee7bc11793c320608b5c88398206b8803593e8906ac03b5651bb7b7a6c",
+ "2022-01-19/rust-nightly-aarch64-apple-darwin": "9a0a4323eba39da2c0ae9dd99eae994c90019b11e1020378781fb41521799b92",
+ "2022-01-19/rust-nightly-aarch64-unknown-linux-gnu": "c71d05f5ec4d1d118bab9b3155086328093b5b620b39de3e541294dbb64d4ace",
+ "2022-01-19/rust-nightly-aarch64-unknown-linux-musl": "9aca1ed8d3283403931991b4c46d5f57a0839bac3ac5283692ef67938d291470",
+ "2022-01-19/rust-nightly-x86_64-apple-darwin": "1102c26afe2de2c73079c30b038ac203e1b2d647383338f91782196b05a11116",
+ "2022-01-19/rust-nightly-x86_64-pc-windows-msvc": "bb63d762cac5570f98c4109c7d4cd86d5912b46d0779f44a27fd515e1b723961",
+ "2022-01-19/rust-nightly-x86_64-unknown-freebsd": "726dedec423c51031d5d481aa90f04cc68ed52f45cc33320a6932e02adaa8256",
+ "2022-01-19/rust-nightly-x86_64-unknown-linux-gnu": "db2ec42968696da58de511cb088ea0f879cc64551a8944e5673f73df0e252b7c",
+ "2022-01-19/rust-nightly-x86_64-unknown-linux-musl": "49e42ceb3358ee50863db105c680bbe35aae62b0c27d21db4124b29e82203137",
+ "2022-01-19/rust-std-nightly-aarch64-apple-darwin": "2640f188bda156f0c530c558e02b06dd1b362c7c0115ef8d9e585d451fd92c55",
+ "2022-01-19/rust-std-nightly-aarch64-unknown-linux-gnu": "500e3edb2fe3776ddbb85cbbfd3cea154f969d9b7b76df208dd39953a96d04db",
+ "2022-01-19/rust-std-nightly-aarch64-unknown-linux-musl": "1f93e986d03402e01d70bb443540049d641aa3bdc7376691ae4347addaf17642",
+ "2022-01-19/rust-std-nightly-wasm32-unknown-unknown": "419ecbb51cecc803299d3868b34e78cf08c589b9ce89edc58e9eb99a12140682",
+ "2022-01-19/rust-std-nightly-wasm32-wasi": "4a267c1c645e8269bdaf29b6edebe88bc2149217e9eaf0f9f87877c67540e9db",
+ "2022-01-19/rust-std-nightly-x86_64-apple-darwin": "b875843a7a5ec1b7f9a45672e44495b17972c0268a20d706610ee9c6ee12e408",
+ "2022-01-19/rust-std-nightly-x86_64-pc-windows-msvc": "316b1efb302c7f58f59aaa822fe07e809beafc4ab157d0dc53b92786292f7a4a",
+ "2022-01-19/rust-std-nightly-x86_64-unknown-freebsd": "632eba5d1ed2eed44fc61a1a69014e756426cad86accd2c372d44e07c764d1b8",
+ "2022-01-19/rust-std-nightly-x86_64-unknown-linux-gnu": "f1a26b04468f05a0239ff7d9bf4991ff6150650dfaf4d0a68b51d2146a1fe7e5",
+ "2022-01-19/rust-std-nightly-x86_64-unknown-linux-musl": "33f9b31abca43c27afe34800fcfa87fb66a059b4ed9a2ff6ba9767e0609ec2af",
+ "2022-01-19/rustc-nightly-aarch64-apple-darwin": "d1036828856da3195883e4c56b6596a08d3ed75ea5875cc26642e5b3b8caccd1",
+ "2022-01-19/rustc-nightly-aarch64-unknown-linux-gnu": "3f7edd43d97a6c63ad43db071989ed4114dff29c77b5b7ed7e1ea65339e170d0",
+ "2022-01-19/rustc-nightly-aarch64-unknown-linux-musl": "9d5d70aa8942786a61e4f7026abad946f5d965a99f44fcde54d5fde286461f52",
+ "2022-01-19/rustc-nightly-x86_64-apple-darwin": "0bb3422db5ebdbb36bd487ab6ec0b0bc89c960bf5b8bb1fadb9a7f3b827d0672",
+ "2022-01-19/rustc-nightly-x86_64-pc-windows-msvc": "2f15ce047f6c8ca20d4585ade8f66b7f296de7083da5636e5a09f04b02228435",
+ "2022-01-19/rustc-nightly-x86_64-unknown-freebsd": "1c8e731ee63cde0f5d6375590b234c5facf4070584494c24ae6d3c012e81b74e",
+ "2022-01-19/rustc-nightly-x86_64-unknown-linux-gnu": "8f96fbd32d86e0943a5d15c967c1e4d9832bd8682eeae1f333e9bcb77433acc8",
+ "2022-01-19/rustc-nightly-x86_64-unknown-linux-musl": "9ca8f7801aeea115aef2648313ed05f5755cb4fab2ca93e391dcc0b09f79528c",
+ "2022-01-19/rustfmt-nightly-aarch64-apple-darwin": "e1cd639473e54569e0282d68bd2270fa1f2e9713c8cdc95e1432097fabe3ab3d",
+ "2022-01-19/rustfmt-nightly-aarch64-unknown-linux-gnu": "f6e70a862dcdf24b035061602b1081163083ed022bf15366337fdf5af5b999b8",
+ "2022-01-19/rustfmt-nightly-aarch64-unknown-linux-musl": "eb028b9c1fda5730ad387312eb6fca48da94cb654edaa0a6a445092b1bd28af2",
+ "2022-01-19/rustfmt-nightly-x86_64-apple-darwin": "e205536ecdb2e15243a2436a41fc398b6a558be98d1ae8b281e9dd3748f3931f",
+ "2022-01-19/rustfmt-nightly-x86_64-pc-windows-msvc": "571d43d9091f87debf76102801a9d65842314532af34f08fec9de1b8346e532e",
+ "2022-01-19/rustfmt-nightly-x86_64-unknown-freebsd": "194f0c425d9188ceb69233069b162b25bb829c8fc155979433457d63b32df61d",
+ "2022-01-19/rustfmt-nightly-x86_64-unknown-linux-gnu": "3cab5f9cc9fb0681ce5c284b5ac98e92cbf73c2c9eb993d7d7d9faaf3363f01c",
+ "2022-01-19/rustfmt-nightly-x86_64-unknown-linux-musl": "41233d3f0fad709cc751def5342849564446cbc3a00045b39cb6a8c26d7dc436",
+ "2022-02-23/cargo-nightly-aarch64-apple-darwin": "16cc0baabdb131b3739d5db9d98a26db494a470afb15c29fb3f30a8a9701ffa7",
+ "2022-02-23/cargo-nightly-aarch64-unknown-linux-gnu": "c7b2643282f256f01224d93af31e722ff0ff64780fe391fdf1343aabe03b3a30",
+ "2022-02-23/cargo-nightly-aarch64-unknown-linux-musl": "3a4cda34180864cdf9505316e985460018756717878f8529c9141a982683c7aa",
+ "2022-02-23/cargo-nightly-x86_64-apple-darwin": "4952a58521c389ebbbf12d5c5f855d7ff63b6cbaa8b39f5d0410638ce18f91b5",
+ "2022-02-23/cargo-nightly-x86_64-pc-windows-msvc": "2909e511824b752f9137c1312076a3b570dcf9df19823c41b188db9859f44830",
+ "2022-02-23/cargo-nightly-x86_64-unknown-freebsd": "c5d47b6b075ff2bb881f1fe07f89e0927beb23cdb169c293e976853833421f96",
+ "2022-02-23/cargo-nightly-x86_64-unknown-linux-gnu": "ef101ce313d0d045ed121e312b12bb41c20bdc07963543ab77c5a5ab9802eb02",
+ "2022-02-23/cargo-nightly-x86_64-unknown-linux-musl": "dbb5a85a3d753473e5595b12c08b217aa8c13b01c64cffef5c702025d2557c38",
+ "2022-02-23/clippy-nightly-aarch64-apple-darwin": "59778a7fbd8a5fe3bade8b95d7ff7ec1419dfa95e2271afa6b32baa1d5c3710f",
+ "2022-02-23/clippy-nightly-aarch64-unknown-linux-gnu": "62d3027e541c8fc87acc076865469af0020b1ebff97ebf45dabf0fa3537ee7be",
+ "2022-02-23/clippy-nightly-aarch64-unknown-linux-musl": "dacaa625832e840e464ce5c0dc5bbefe5e15b1faa9fdf1fd29f4a5a9c6d955c6",
+ "2022-02-23/clippy-nightly-x86_64-apple-darwin": "7f98beae8363a2be260f2adaca025408abb092894138ae5a00cb43f8cffe5fab",
+ "2022-02-23/clippy-nightly-x86_64-pc-windows-msvc": "695c78fd375ca2e67d2b2dc679c242de32e7ec6366ac39c1060de9f4bb34c97e",
+ "2022-02-23/clippy-nightly-x86_64-unknown-freebsd": "674891a88d78046afb4da489ab47bf2994a7aab4c65eea42639611cc992114d0",
+ "2022-02-23/clippy-nightly-x86_64-unknown-linux-gnu": "b510582d9ea92fb059c89deff9a74a9725c8e935daedefef20443ce44e8d40d7",
+ "2022-02-23/clippy-nightly-x86_64-unknown-linux-musl": "f582add076fb61857c380258c0d854b7601381ba3dae7ae5b423978511159ed7",
+ "2022-02-23/llvm-tools-nightly-aarch64-apple-darwin": "b35cc47bd525e6664592f403905866c48bb9cb7b1b409bcf63c2b35d32993a79",
+ "2022-02-23/llvm-tools-nightly-aarch64-unknown-linux-gnu": "4c02f526bd993a9118ac0ac610b85e5cdfd42bc43d7ecf77d8c3067893c8a54d",
+ "2022-02-23/llvm-tools-nightly-aarch64-unknown-linux-musl": "b857b033803a4d6020c3425af9d4ea2b0462cc2db67f549e7dd426f81265d48c",
+ "2022-02-23/llvm-tools-nightly-x86_64-apple-darwin": "5e26961b8f803ca6d5be40622a8580164986bf54d8391b1a4524fcffbd1eeb10",
+ "2022-02-23/llvm-tools-nightly-x86_64-pc-windows-msvc": "dd5f7e54725d973423b3cb2ff3a0492da76491911591f6b34231af1dce332a7a",
+ "2022-02-23/llvm-tools-nightly-x86_64-unknown-freebsd": "dfb6f74016e677c28cf6eeb9e8430f5022e0c874619e2f5235728e82416e443c",
+ "2022-02-23/llvm-tools-nightly-x86_64-unknown-linux-gnu": "2746d97f126edf2045f012591c1262d725cf042c56c32caf7ecdcc0eb1ae001e",
+ "2022-02-23/llvm-tools-nightly-x86_64-unknown-linux-musl": "d307f34ba5fdfa7f4a4645e76a9bf8447c3baaf404017b0c698e516c3be5b56c",
+ "2022-02-23/rust-nightly-aarch64-apple-darwin": "e00ccb8acffe7450d78c5b2fc13cbc01a5210ad8edcaf27bf4a7961806942ae7",
+ "2022-02-23/rust-nightly-aarch64-unknown-linux-gnu": "f9b5613cb5ba524dfe8ba7325c2b8f8f112173d3e1a9bc5a75de49a604f4c379",
+ "2022-02-23/rust-nightly-aarch64-unknown-linux-musl": "a87bc336ca122847a998bcbfbcd9b1b7232c7cab7219a63948ec73bb2b9563bc",
+ "2022-02-23/rust-nightly-x86_64-apple-darwin": "a585cbad9e35c3a2da5d0037078501a01edaf66d9e52ac2e4394b733dd5ac81b",
+ "2022-02-23/rust-nightly-x86_64-pc-windows-msvc": "2df97bea4add36de47074a5d70d84f3f2cb29f038b6ca82af4e7986ef5bc9acf",
+ "2022-02-23/rust-nightly-x86_64-unknown-freebsd": "fa6b2300d71c7fab41a2c9a6b8a6b210eed8d3fe8263e8e17f2034072dd15c94",
+ "2022-02-23/rust-nightly-x86_64-unknown-linux-gnu": "d0fcb7b0e2b9b09ecca0954af53732c647859c3140b79fb2c1bd61af9846c3d3",
+ "2022-02-23/rust-nightly-x86_64-unknown-linux-musl": "00ed0db2ed84d6ab0347b663963b7ceba40483a9f40316e6f57872dbfc5ef395",
+ "2022-02-23/rust-std-nightly-aarch64-apple-darwin": "66623fbb88fb63ce610dfe1d5b3242620f1bd473386950b33c3383cc064f8743",
+ "2022-02-23/rust-std-nightly-aarch64-unknown-linux-gnu": "c6f82581224c8d968f0e747b07b6651f96ad8736aabe912ca9fadab7a82e7e5d",
+ "2022-02-23/rust-std-nightly-aarch64-unknown-linux-musl": "fda164074a8a6329835d99423a51a921948aaa67a2c6a3982940f73fe62b1a35",
+ "2022-02-23/rust-std-nightly-wasm32-unknown-unknown": "607a92b4e349601d6d7b4575b303324ec8af153fbfa19d6171eccd72388d6f63",
+ "2022-02-23/rust-std-nightly-wasm32-wasi": "4702cab8d82ae958c984686df053897ee53ae98650046016053261c922e848c4",
+ "2022-02-23/rust-std-nightly-x86_64-apple-darwin": "e6f2d3e182060387bba51540a6a8207f22cdf2f28f510143164bc755adf3d717",
+ "2022-02-23/rust-std-nightly-x86_64-pc-windows-msvc": "940c6687afd93a499e634fa31613d635f8f74ca6c16fb677a418f7288c8b80ad",
+ "2022-02-23/rust-std-nightly-x86_64-unknown-freebsd": "b685a785f022c76231c716d1ea305d03e46c7c785e5ce38be895d357e20b044f",
+ "2022-02-23/rust-std-nightly-x86_64-unknown-linux-gnu": "515506678fc829b3d418e124fa44ac29a5c485377d3fc753493e16aeed856f2d",
+ "2022-02-23/rust-std-nightly-x86_64-unknown-linux-musl": "5a9b8bf339631e33b45704a4f071991ba0694c7b00d94d35793a86ebdb5ad354",
+ "2022-02-23/rustc-nightly-aarch64-apple-darwin": "e967e5e396f7a931f53f7a9737591c4bbfdbeec869495b3cfbce8ccb18c54fa0",
+ "2022-02-23/rustc-nightly-aarch64-unknown-linux-gnu": "7a222bd902f3faa17b486027b357f461659a54f7ba81dc1b784a450d6b06f81a",
+ "2022-02-23/rustc-nightly-aarch64-unknown-linux-musl": "c898784e3e4e2fc0492c53148857ec7eff61bdda44b608a3d06e88b7e30372c9",
+ "2022-02-23/rustc-nightly-x86_64-apple-darwin": "4976dd96f04ef65f948deb988fa9ad7adfbfbd4873c0c78657830f18cd565d4b",
+ "2022-02-23/rustc-nightly-x86_64-pc-windows-msvc": "aa55308792edfdb41d1e7121e0343c05847b7e860ece9ff4c9534d64084b09bc",
+ "2022-02-23/rustc-nightly-x86_64-unknown-freebsd": "32b6dce6fabc18617d7b2295e45ff30221a68979b8302bde97c98596047f2a0e",
+ "2022-02-23/rustc-nightly-x86_64-unknown-linux-gnu": "d30ae66c6ad9f0292effe047d7977ecf1f2f6c5be783cfa110c54fdb5bd8396a",
+ "2022-02-23/rustc-nightly-x86_64-unknown-linux-musl": "355e30a7f4416a2db738d950b40d0eb57fc734f59871e1291349509e74f1be09",
+ "2022-02-23/rustfmt-nightly-aarch64-apple-darwin": "8f4bc35d8e2b03db96a5d9faedb5e25155082d96621c26b90734219468904c62",
+ "2022-02-23/rustfmt-nightly-aarch64-unknown-linux-gnu": "88691ff2cefa6880cb4bbe2d717b5419cd0440ee0d000ff8a70f9d86d714b866",
+ "2022-02-23/rustfmt-nightly-aarch64-unknown-linux-musl": "394ee236b37b687963a0c42e40b3c6863460c302429ad00ca37c7931ea896233",
+ "2022-02-23/rustfmt-nightly-x86_64-apple-darwin": "6e7ba1d83b61ce690c857bc197f3c0a1cf0cb2afd3c4c7f16fdb4079f460ce6f",
+ "2022-02-23/rustfmt-nightly-x86_64-pc-windows-msvc": "e1a81be6159fb9e28cb1f35ac4508a09a0be86edf6ab39db08988a5bbefa9e76",
+ "2022-02-23/rustfmt-nightly-x86_64-unknown-freebsd": "63a0018ed3b7bf94dca3db30be7a1d6940a7559cdd0ca408c366551e2f5e6863",
+ "2022-02-23/rustfmt-nightly-x86_64-unknown-linux-gnu": "7ab236ced294c39de4bb563e9ebaed04c906a4ccfd1932138d37d6d03f75cae7",
+ "2022-02-23/rustfmt-nightly-x86_64-unknown-linux-musl": "647da2183d93846ac5225b99117846a07a90975bdf1b5075e86601dcf97d1ecf",
+ "cargo-1.48.0-aarch64-unknown-linux-gnu": "71347016f0da96d4250225f7b52701274df958870b1a65482badb87d661035f9",
+ "cargo-1.48.0-aarch64-unknown-linux-musl": "873883a9f6eb2e0cae7dafdc6c4262157298b7bc6ac5c3ed899ed1f55cad7e82",
+ "cargo-1.48.0-x86_64-apple-darwin": "ce00d796cf5a9ac8d88d9df94c408e5d7ccd3541932a829eae833cc8e57efb15",
+ "cargo-1.48.0-x86_64-pc-windows-msvc": "c1287b03522828b527ba95a5bc9de0246efa4365a43d22a212f50a5ca2ea1487",
+ "cargo-1.48.0-x86_64-unknown-freebsd": "55fcdad2ac3a3f8066c323f75fb2b222822023f8b9961317d710f2f43771aa62",
+ "cargo-1.48.0-x86_64-unknown-linux-gnu": "52bf632e337a5e7464cb961766638e30dfa28edb3036428296678d1aaf7d8ede",
+ "cargo-1.48.0-x86_64-unknown-linux-musl": "0dd47d6342b17bc6c0fbf9ec007be0c90274e40e76d8e6a88cac73ecafc1583a",
+ "cargo-1.49.0-aarch64-apple-darwin": "2bd6eb276193b70b871c594ed74641235c8c4dcd77e9b8f193801c281b55478d",
+ "cargo-1.49.0-aarch64-unknown-linux-gnu": "fce2bd0eabf9a9958b02f5ede3c227c992ee7048ab34293cce57bc3d48e63fc0",
+ "cargo-1.49.0-aarch64-unknown-linux-musl": "18b4fa2d7a737754ae2d5ce3a2f8c8881fc4d9b5aae20109d7d3d622cf3ac145",
+ "cargo-1.49.0-x86_64-apple-darwin": "ab1bcd7840c715832dbe4a2c5cd64882908cc0d0e6686dd6aec43d2e4332a003",
+ "cargo-1.49.0-x86_64-pc-windows-msvc": "84b44835a3f275fef70cd86a527d086c537e59fb3209fe8bbef1eeb1da6edbb6",
+ "cargo-1.49.0-x86_64-unknown-freebsd": "320aac1e31eed2db657380bce2d8ff8b65fc8de59f4aadabf8219bcb6b4ce1a1",
+ "cargo-1.49.0-x86_64-unknown-linux-gnu": "900597323df24703a38f58e40ede5c3f70e105ddc296e2b90efe6fe2895278fe",
+ "cargo-1.49.0-x86_64-unknown-linux-musl": "c2a3d3b27ac105acf7bfc25d6e401b9ac369597f57220332377b98b2f8cb550b",
+ "cargo-1.50.0-aarch64-apple-darwin": "19d526ef3518fb0322f809deddbd4208a27d08efa41d2188348f1be8d3bcfe5e",
+ "cargo-1.50.0-aarch64-unknown-linux-gnu": "9b6fbfec7f6d14013387433f3a907b1f474027d7f32f626dc1c5ca83faefe573",
+ "cargo-1.50.0-aarch64-unknown-linux-musl": "7ec67e55fe541cfe32221e9b69349d2de83a24f7967f58eb4dc06e59f321babf",
+ "cargo-1.50.0-x86_64-apple-darwin": "45640bb1cef40f25ecb4bd2a3bb34fdf884c418e625d4f9c9595d2aca84fad78",
+ "cargo-1.50.0-x86_64-pc-windows-msvc": "dbd97ac5645668149d4a32b0b5f6274934d95f8b6d6e6926b7de13ee869aeedb",
+ "cargo-1.50.0-x86_64-unknown-freebsd": "97cbdc9b94123e940f7ed7304aba418a1a10ee1cca5acfe302e841ea39efa190",
+ "cargo-1.50.0-x86_64-unknown-linux-gnu": "3456cfd9be761907a4d3aae475bd79d93662b7aee4541f28df3d1f7c7d71a034",
+ "cargo-1.50.0-x86_64-unknown-linux-musl": "f1f99e1cfacaa69a12c4ee7ffd767bdcf80eb4d4b0e71af545e8e16b2b22d799",
+ "cargo-1.51.0-aarch64-apple-darwin": "3eb0eb6192635c4b844deb97004a7e38a631bb4507b1284c055df8533c00e77a",
+ "cargo-1.51.0-aarch64-unknown-linux-gnu": "eeeee860ec47ebe1c45f497ff99cfee9c869a592db573cd547a67681db695616",
+ "cargo-1.51.0-aarch64-unknown-linux-musl": "297a66f911298c55e7a494286769c045184e7b65fb3dc0a56d5a00d8655c6341",
+ "cargo-1.51.0-x86_64-apple-darwin": "37eb709e5ed8fe02d2c8d89bc0be3dc1d642cff223c25df311ff5a82eab53d4b",
+ "cargo-1.51.0-x86_64-pc-windows-msvc": "ee232ab24aa57f3c57218a5886af673725ecff38ad58e8d75257d4fd0c86b148",
+ "cargo-1.51.0-x86_64-unknown-freebsd": "fb2b8a5fd787944392adec0593f6921131069a5a95c1f53be75f98451d918300",
+ "cargo-1.51.0-x86_64-unknown-linux-gnu": "fe8abe2c2b467ac5f5021ff8020eda70de9e9f8f45b4a2e834afbd3b78323a31",
+ "cargo-1.51.0-x86_64-unknown-linux-musl": "3e3f1ca2aba2d7195bc447f4e446bbf6c8803f42ebaaf7a32e7f92268cf2f6ff",
+ "cargo-1.52.0-aarch64-apple-darwin": "86b3d0515e80515fd93612502049e630aeba3478e45c1d6ca765002b4c2e7fd8",
+ "cargo-1.52.0-aarch64-unknown-linux-gnu": "4a7f07bd9f30ed0409a21fad831afec0b9d0d10b5bca10cf826fdefe04a4f4f9",
+ "cargo-1.52.0-aarch64-unknown-linux-musl": "472cd83b79e173932ff436e77802c217599f73f672e88345bb61105dddf2a2eb",
+ "cargo-1.52.0-x86_64-apple-darwin": "02a4be4aae1c99ca1e325f9dbe4d65eba488fd11338d8620f8df46d010ffbf3a",
+ "cargo-1.52.0-x86_64-pc-windows-msvc": "866fc858fc422fa52afdabfb5feaf6e6aed41c575d6edfd4f343425faaf01023",
+ "cargo-1.52.0-x86_64-unknown-freebsd": "c732090f26a36211de084fba0ffcc8d1b49591d935d3b4ebd515a9570043aeb2",
+ "cargo-1.52.0-x86_64-unknown-linux-gnu": "85151d458672529692470eb85df30a46a4327e53a7e838ec65587f2c1680d559",
+ "cargo-1.52.0-x86_64-unknown-linux-musl": "ecb7b4968ca1b19c09ac3de9ea60420e8435c32e25f7412c19a0ac3f9dcb3363",
+ "cargo-1.52.1-aarch64-apple-darwin": "6787f8746cedd005b7abeabf6e2250ebc5fa767486c5bf23c597298e6965d576",
+ "cargo-1.52.1-aarch64-unknown-linux-gnu": "d2e15beebe22b6f6380d233f48599fc1b9228b064f0915eea02b2376f0bde1e1",
+ "cargo-1.52.1-aarch64-unknown-linux-musl": "dc8f6cf0c02f68b05b470087cd611cc4107060daae64f9d09677e97389c51281",
+ "cargo-1.52.1-x86_64-apple-darwin": "40d8fe950202763f633b6dd927f8e546e0a44b4b959945310c9eeb77f69e72d1",
+ "cargo-1.52.1-x86_64-pc-windows-msvc": "bb25d1ca297ac99a1dde7ce537880c1f5a37e392257b5aba589938b4f1bbf659",
+ "cargo-1.52.1-x86_64-unknown-freebsd": "67f858cf9e46fb7efe825adb854302e187ad194d05ded1e7b8ce165607869947",
+ "cargo-1.52.1-x86_64-unknown-linux-gnu": "f3225c27ce16296400389285358b61e138811c2e0eb1388593817688145ab64d",
+ "cargo-1.52.1-x86_64-unknown-linux-musl": "300c30d1ad47c84a8d806ef492db2478bc7c17793b92513533166bd9d9b51857",
+ "cargo-1.53.0-aarch64-apple-darwin": "5f0aea0cd507ff6e3b1e1ae54a8726172d055a8b6d8b1ba550ce9ebc96a8a891",
+ "cargo-1.53.0-aarch64-unknown-linux-gnu": "7c35c086e294af3ae82df5609c6833a36bd8e6634e8ecca18f863829cfe80ca7",
+ "cargo-1.53.0-aarch64-unknown-linux-musl": "9c0e9137aaf5c13f9d65487ec3216fe39280f387be4133da088355e263ce42da",
+ "cargo-1.53.0-x86_64-apple-darwin": "b42f4a7d054e219d8744af48cfab798473981455a050a320c46b164382726e50",
+ "cargo-1.53.0-x86_64-pc-windows-msvc": "7ab1bfdee65f19cb60671690566b89e3a0f210f04dd53078786f6c708b523223",
+ "cargo-1.53.0-x86_64-unknown-freebsd": "3e2c5681793c86f21133ac7b26aa5af4525b8471ec5df840d41d0e563fb675c8",
+ "cargo-1.53.0-x86_64-unknown-linux-gnu": "e79d9d0b03cb331428ef3cfc4cbe60ded9f90708a7dd1714d974dab9a03ee7b3",
+ "cargo-1.53.0-x86_64-unknown-linux-musl": "d8f632c0b2f8abafb1149446c695a8a7024134fa62faa37ac8922a41dd66c95a",
+ "cargo-1.54.0-aarch64-apple-darwin": "7bac3901d8eb6a4191ffeebe75b29c78bcb270158ec901addb31f588d965d35d",
+ "cargo-1.54.0-aarch64-unknown-linux-gnu": "d54d0bde0014e73a9c6943665bd236e5596c86d58869bc758aa6c24a9ad53061",
+ "cargo-1.54.0-aarch64-unknown-linux-musl": "2dd6ecd46b769efbb397794e5bad4249779be3e91738efd26a7673fa728a5ac0",
+ "cargo-1.54.0-x86_64-apple-darwin": "68564b771c94ed95705ef28ea30bfd917c4b225b476551c998a0b267152cd798",
+ "cargo-1.54.0-x86_64-pc-windows-msvc": "ad8808314e36af5de8e3e8e519c4e73d30b56a8020418aec2fd1f0f3d2d7a8f6",
+ "cargo-1.54.0-x86_64-unknown-freebsd": "3a2612b2073f5d3b45a4c88f359a8f5e2b86b85f7ef68bda518f532339f01227",
+ "cargo-1.54.0-x86_64-unknown-linux-gnu": "8c4f404e6fd3e26a535230d1d47d162d0e4a51a0ff82025ae526b5121bdbf6ad",
+ "cargo-1.54.0-x86_64-unknown-linux-musl": "d6e2d8e2075f433b3a607b95ef170a85fc0b44356905111004d23a9b72776b0a",
+ "cargo-1.55.0-aarch64-apple-darwin": "9e49c057f8020fa4f67e6530aa2929c175e5417d19fc9f3a14c9ffb168c2932d",
+ "cargo-1.55.0-aarch64-unknown-linux-gnu": "48bc8751f548b08643fbdea7756ccda35f0762492e95ea41ca41137290f56513",
+ "cargo-1.55.0-aarch64-unknown-linux-musl": "01ac6a21d74ac66a33e58d2d5766c4c90673be0e8385893da4e178a0ded56299",
+ "cargo-1.55.0-x86_64-apple-darwin": "4e004cb231c8efbd4241b012c6abeefc7d61e2b4357cfe69feb0d4a448d30f05",
+ "cargo-1.55.0-x86_64-pc-windows-msvc": "2bc59373437d25e5cb9d4f573fa187078c5a924a244366787ce04106d3972f6e",
+ "cargo-1.55.0-x86_64-unknown-freebsd": "f574b15dee6c52f25076bb657f3e3129b5828a2617c82f2e1c4101e0bd21a880",
+ "cargo-1.55.0-x86_64-unknown-linux-gnu": "bb18c74aea07fa29c7169ce78756dfd08c07da08c584874e09fa6929c8267ec1",
+ "cargo-1.55.0-x86_64-unknown-linux-musl": "d91efc8e7a71845dcec9ec7db1edb6765cba5ded69d3ab734f549d6875b52e97",
+ "cargo-1.56.0-aarch64-apple-darwin": "ced26df8edddcb7ebdedd2997b9005fc9a849e57b1b82f3aeba9241039f7b958",
+ "cargo-1.56.0-aarch64-unknown-linux-gnu": "3a3b0b74a18247db46badc1e94285fe5e60ad0e9c18fd2dbf15878aa56a5994a",
+ "cargo-1.56.0-aarch64-unknown-linux-musl": "bf24b7df97d93d61f6c1ed8382d99400c4197939502b14904c40ef96bb2abab5",
+ "cargo-1.56.0-x86_64-apple-darwin": "63b6558712050e7f8c57cac0b5b7cb2cafc125d157d9f4bd82f6f47b4648ed0d",
+ "cargo-1.56.0-x86_64-pc-windows-msvc": "319ae8cde721f611ddf673a4aad21b145aec6577ccb75d40ad0856cbab9a2cfe",
+ "cargo-1.56.0-x86_64-unknown-freebsd": "e1e7400a16c7cb1d2ac83e567c8c23f04fb6ccfcb7b6d1978d327da6edc879f6",
+ "cargo-1.56.0-x86_64-unknown-linux-gnu": "e74bd0038893e76393f67a58786ec33ef9251cdb65550b3a2a8117c7355ead71",
+ "cargo-1.56.0-x86_64-unknown-linux-musl": "efadb9f545b6ce49d4a861ae7e75f0ce02a6fedb9e5b30e7810dcb4854ca6799",
+ "cargo-1.56.1-aarch64-apple-darwin": "6ed30275214e956ee10b03db87b0b4297948fd102d39896cece01669555047ef",
+ "cargo-1.56.1-aarch64-unknown-linux-gnu": "9aa557436b0cf2a2f4f0d6c4aed5b95062c0637a4a94c000522402e59db1c93a",
+ "cargo-1.56.1-aarch64-unknown-linux-musl": "313f095df71bdd7cab5934641990cbcf325acdfefdcdf9d7a4a8aa950fc655d6",
+ "cargo-1.56.1-x86_64-apple-darwin": "cd60c32d0bb0ed59508df96bebb83cf6f85accb9908fb5d63ca95c983a190cf3",
+ "cargo-1.56.1-x86_64-pc-windows-msvc": "0606835d9c41137552ee63f339c5df1a2ed6f722c871f9fc5cb92b02c7372373",
+ "cargo-1.56.1-x86_64-unknown-freebsd": "a1656603049a4612cdf44179ac7ccdb3c342f0b152cb114f61a228d321b0f384",
+ "cargo-1.56.1-x86_64-unknown-linux-gnu": "c896c033bb1f430c4e200ae8af0f74d792e4909a458086b9597f076e1dcc2ab2",
+ "cargo-1.56.1-x86_64-unknown-linux-musl": "4ecdd39695d9e09c3f4efffff61d67451cd41f28f09155485ac7dcc8f7a65a26",
+ "cargo-1.57.0-aarch64-apple-darwin": "2171ecf2c18fadd90588252aa294272aeb740f065772076ef36d04b1b4bfcc4e",
+ "cargo-1.57.0-aarch64-unknown-linux-gnu": "8c046fc59feb1d670757b6de30990e346faa4b2ff49cd42f6d5f6a2b92a1ad6c",
+ "cargo-1.57.0-aarch64-unknown-linux-musl": "87f7b1fb2b1a270336fbeac0ed2ea2ceda1fde26467f133e059907b57ad2bdb6",
+ "cargo-1.57.0-x86_64-apple-darwin": "26129f0e3ecd42e730f62d9c693e1a89aedfe6b7c8108cf970b2f1ed51900fb8",
+ "cargo-1.57.0-x86_64-pc-windows-msvc": "23f4562605316f0c9002bb30d0e635f96577db9002052ef2f78b63e747b6b2cd",
+ "cargo-1.57.0-x86_64-unknown-freebsd": "c14839639299fce4e448629950c28de61fcfdd0393f9a751958c5c6d9c6d2ba7",
+ "cargo-1.57.0-x86_64-unknown-linux-gnu": "2b341034e4c30bede47a432751935549a28e40b566a1fd4b59c824ccd0a26ff6",
+ "cargo-1.57.0-x86_64-unknown-linux-musl": "0f14c6bb7c413c3be2db1917eb0109b7563bff0ba02a03d30089004811d87f2f",
+ "cargo-1.58.0-aarch64-apple-darwin": "9144ee0f614c8dcb5f34a774e47a24b676860fa442afda2a3c7f45abfe694e6a",
+ "cargo-1.58.0-aarch64-unknown-linux-gnu": "68e2e7493af55c5792636c2b2b0b497b1e43b12eb2e91da71e92426701884c24",
+ "cargo-1.58.0-aarch64-unknown-linux-musl": "269fd3730644890725b3affbf5ad97c3f1a186fcd22e7fc122b6b9b97388aaae",
+ "cargo-1.58.0-x86_64-apple-darwin": "60203fc7ec453f2a9eb93734c70a72f8ee88e349905edded04155c1646e283a6",
+ "cargo-1.58.0-x86_64-pc-windows-msvc": "ab0bdb95efa4084e19a706c14d826fa112306c25ec6304528dadff5f1017ab83",
+ "cargo-1.58.0-x86_64-unknown-freebsd": "8e280cfb6c7aa92d9c955fcfb80b6d09f067e779a5ca0b5799222f1a70ca4764",
+ "cargo-1.58.0-x86_64-unknown-linux-gnu": "940aa91ad2de39c18749e8d789d88846de2debbcf6207247225b42c6c3bf731a",
+ "cargo-1.58.0-x86_64-unknown-linux-musl": "926430f872e5a30b946bebe45df48ceb0d3dc8de04b35e295f33bb3b7dd394fe",
+ "cargo-1.58.1-aarch64-apple-darwin": "fe4507d345fea40e2157a6d7d69100c234a83b5904747ce976df577e63819134",
+ "cargo-1.58.1-aarch64-unknown-linux-gnu": "b4603fe8207c1ac2b5755a5f8da04c32a8a3d34ec1506df28de5dac9010350f1",
+ "cargo-1.58.1-aarch64-unknown-linux-musl": "1bf9187170e8cdaf52ddd45aa7c93248f4d8a6c730b20251cb182b57d6624bd0",
+ "cargo-1.58.1-x86_64-apple-darwin": "27087440329a7d3b0bd2b73870c76677e52c96390c3a7b76e151f8a86ce442be",
+ "cargo-1.58.1-x86_64-pc-windows-msvc": "4cbe75408c2745c72a27a37f77864745c7ce3e79c2d42708732c95fb3cbc9489",
+ "cargo-1.58.1-x86_64-unknown-freebsd": "f60d967c940400a92d142df1396a2031034374874a7575ad74bec2536e101fc4",
+ "cargo-1.58.1-x86_64-unknown-linux-gnu": "a6ca018e19eb25781b72e0ce9971be66c518adb6cebb0175ad88e6ff333f5118",
+ "cargo-1.58.1-x86_64-unknown-linux-musl": "45cca848155e2ef853de74329ee45948e4f6f28f797679d9070f4ffa767ef209",
+ "cargo-1.59.0-aarch64-apple-darwin": "4bdcb77ea084364b551a5cf969e263beb09afa39627f6dead262c8e2a7aed9c1",
+ "cargo-1.59.0-aarch64-unknown-linux-gnu": "857d0b4afa76773a68ebe616db01d1b97d24b6d02b55e7348c968aa48104793b",
+ "cargo-1.59.0-aarch64-unknown-linux-musl": "89ea1001d79ac7dc2158950c40a73aca6d1177d5e44562e9e5a8656b916e344c",
+ "cargo-1.59.0-x86_64-apple-darwin": "d0202b50b4f3d0e943a5d7e8d14420afeac8cf36e6136e8d5b7ddefb3538d62a",
+ "cargo-1.59.0-x86_64-pc-windows-msvc": "4cf585f1a3b295f6d51873c189c2b9d114861a4b41b44ad5245cbf119272a6f2",
+ "cargo-1.59.0-x86_64-unknown-freebsd": "a6732b18419efb4d246a35555f4ccbf904de261cde02f8e82fdbef67e70ddf80",
+ "cargo-1.59.0-x86_64-unknown-linux-gnu": "703c1c66f1d68549d1ee0b7a96f91935a3583af8ec13cc1722ff7a0f1c69ca70",
+ "cargo-1.59.0-x86_64-unknown-linux-musl": "ee2fa67e67395f9b8e1b52433ca281454c3e4f55db536414edfadfa2d649c8bf",
+ "clippy-1.48.0-aarch64-unknown-linux-gnu": "2cc894bf75d938c0f7b96c7711d93b6d5a0befed5c09232cdd8413a57942ed88",
+ "clippy-1.48.0-aarch64-unknown-linux-musl": "b3d740358470df6f4c1881a40db16c6fce4082bd251b012963147fdadab96879",
+ "clippy-1.48.0-x86_64-apple-darwin": "d70a5d224a90df3fc77d7bd38df931023a3966be755b888bf0888d6bfcbdc424",
+ "clippy-1.48.0-x86_64-pc-windows-msvc": "e52103f31fe8d4e067b28273ba0aed9ae352d88ad1c3b9860ec1e08b81241ebc",
+ "clippy-1.48.0-x86_64-unknown-freebsd": "14459e9629b09c83c38fe2366d996490c1691fb3ae9937f4a8de48219857e14a",
+ "clippy-1.48.0-x86_64-unknown-linux-gnu": "409c2e4a6b50f9a797379e687c2d0bcbda4a268e736fadd2be07f35a2fb9557f",
+ "clippy-1.48.0-x86_64-unknown-linux-musl": "cf6480cc206ef4b615f95de2f048e6bbf17072b39dd76246faf3440fccea3704",
+ "clippy-1.49.0-aarch64-apple-darwin": "d6f2782d600f1a25d1fb9fe828be0cf170fe5afad50184c30e8c32310f26fd8c",
+ "clippy-1.49.0-aarch64-unknown-linux-gnu": "ed805952ab975e9f395fa68544448ff7a6e823c4bf7e04952e4c1dae5a550be3",
+ "clippy-1.49.0-aarch64-unknown-linux-musl": "f4329c16a6f448abe7be50b2206ca7d8a21605d9d8e3f01303fbe737d0c3bf7a",
+ "clippy-1.49.0-x86_64-apple-darwin": "c4a7baeda3a558a65af3afe857aedb5f25e8dd0ba42ea02cdd1056d92e610b35",
+ "clippy-1.49.0-x86_64-pc-windows-msvc": "70eec30a80aebaa1f6f4dfc1a6fa681cdc833aa2281726319a06c9fb1af277fa",
+ "clippy-1.49.0-x86_64-unknown-freebsd": "835bb7c1d4f4d57453f69b35e758347ad02f22949cbce3265282d2059aea4166",
+ "clippy-1.49.0-x86_64-unknown-linux-gnu": "0be34ad7ddde82f54353d5322c6142b43d4dee54ea26b9428a3a34444aa4b9c4",
+ "clippy-1.49.0-x86_64-unknown-linux-musl": "c53a5e73e99ea9f3e14f2c1164f234eac4e60e428ed82502ffbfdd19be728f3f",
+ "clippy-1.50.0-aarch64-apple-darwin": "c0a335e4cc3b0775661c98937c767eb63f5cca4a8a224c164af2415158175025",
+ "clippy-1.50.0-aarch64-unknown-linux-gnu": "bfdd830f04b1dae6ffa71e750b391cdd43def5a9c266366eea8e6b8071509747",
+ "clippy-1.50.0-aarch64-unknown-linux-musl": "1fb4eaf6c2230ff138edb906ac55fbb47b638e412c83580a783749a38096cb98",
+ "clippy-1.50.0-x86_64-apple-darwin": "466be411c4eff28c006179ba5a45af5c37dc9a56395a24ad597fa54a475eb97e",
+ "clippy-1.50.0-x86_64-pc-windows-msvc": "65b3198dc0082d2ca77559047901dd102d100bf7fde513a0a3e81ab78c93d568",
+ "clippy-1.50.0-x86_64-unknown-freebsd": "f065a60cae99287eeed1ad479f159efeef7f79459b8b4369c451d966bc8b0bed",
+ "clippy-1.50.0-x86_64-unknown-linux-gnu": "ef4098fdb39d67366300a63370c513ca97fdce8f4d6ce9e2a5fbff32d3a8ea38",
+ "clippy-1.50.0-x86_64-unknown-linux-musl": "b921d64ab3a130240372c069f72b549ec5c0d566dd302c6b7593453536688ed9",
+ "clippy-1.51.0-aarch64-apple-darwin": "1d4769e522ec3275b6a1b6e63f0d48b6995cf3647df4d97fc1c20bf2969cac6d",
+ "clippy-1.51.0-aarch64-unknown-linux-gnu": "bbf4f53e8c9496524384cf8e3a9e56bd80b19aae12135c058ef113bec40fd30e",
+ "clippy-1.51.0-aarch64-unknown-linux-musl": "ede6e08307a91fb18feec8d4ea9e170dd3f522f79267ca39d258dd554af5eef0",
+ "clippy-1.51.0-x86_64-apple-darwin": "6c1d2c143720058a67da274b1579b4e7e955bd35de6d4714d884b55030ead225",
+ "clippy-1.51.0-x86_64-pc-windows-msvc": "9d7c25c031257ec62b0800e418252e4a53319a513deb9e682b438bef1abc4056",
+ "clippy-1.51.0-x86_64-unknown-freebsd": "db15a34b5d829338f63c436665c7106817b2577d9417615d75e4aa6b27633c3a",
+ "clippy-1.51.0-x86_64-unknown-linux-gnu": "61774912e775de826e4f9173c8f91a915d91319d353ecad46361775a035ed69f",
+ "clippy-1.51.0-x86_64-unknown-linux-musl": "4d3f51f4e1220e740e6d310c5f90652b8463e8897a9e4fe82d9c4b8e3315f9b5",
+ "clippy-1.52.0-aarch64-apple-darwin": "0e8a71e8567553ed625168f46e2253c04ef19f0ae7683b6500b3fc07cb81fefb",
+ "clippy-1.52.0-aarch64-unknown-linux-gnu": "06b0a9e579b93bcf5948f013c1e053f8ad6717b3349068b2dbe774215f4b0dd3",
+ "clippy-1.52.0-aarch64-unknown-linux-musl": "a2075592aeb37ad33ebcd93b228e79dabd8fb62eeee7aae531ac0d9682eb6abc",
+ "clippy-1.52.0-x86_64-apple-darwin": "baef3bd3c93872c67ddede8b657236f5f368a9e30b2ba9725c70881877c6db28",
+ "clippy-1.52.0-x86_64-pc-windows-msvc": "149418af4a93f3c4d8978eccf95a968d2fcef4cdd748b284c782d8efd06d38da",
+ "clippy-1.52.0-x86_64-unknown-freebsd": "db50b6ac0cfb3c8eca34e8059014bd5602dfd160246a51efef568165ff7bd4bc",
+ "clippy-1.52.0-x86_64-unknown-linux-gnu": "00a55613d1a47c12c08f6b101ca791052b07650b624c102acdda4569ba2652a9",
+ "clippy-1.52.0-x86_64-unknown-linux-musl": "95950b2455e706d500a2c2f02904e5d48394b998f5f486fe376a144edcd7f85b",
+ "clippy-1.52.1-aarch64-apple-darwin": "fa19b0115201c9462f36eb8f51db07cf58af02ba2c997f1431719f78bea30904",
+ "clippy-1.52.1-aarch64-unknown-linux-gnu": "91d914a83b5c6d1b551a4acfa96c9cd4365b674438fdd3d2114ee86f11f53849",
+ "clippy-1.52.1-aarch64-unknown-linux-musl": "0910ba13838bf80b5ae86c219078340fc02ba5e0b570c54a510aedf78cc6837d",
+ "clippy-1.52.1-x86_64-apple-darwin": "39264348d1246a9cff623eb511979b71831ff331e16be6bf3371ccefa19a23f5",
+ "clippy-1.52.1-x86_64-pc-windows-msvc": "2470d52eda90cd6f7a02901bb2144c40957b0decf2af8f6cf115265acc64c956",
+ "clippy-1.52.1-x86_64-unknown-freebsd": "d9b4aeb263668e95b3fff8d4125ce28905695c1c8ed3d9d5bf949d47d386d13c",
+ "clippy-1.52.1-x86_64-unknown-linux-gnu": "33d6d2446ec4d381057f404c7081686856a001bd91409d81c96aeeb6c452d289",
+ "clippy-1.52.1-x86_64-unknown-linux-musl": "f37ccdaf359f1ae4aa31324490a9ab2ebfe56e5f11245dfea04930eaa0b5c5c3",
+ "clippy-1.53.0-aarch64-apple-darwin": "311247f7aabd4d846d1220f26a6ea6478219d6549a9abc546ad69092dde2e1a7",
+ "clippy-1.53.0-aarch64-unknown-linux-gnu": "56842a410a38293a09cf4d880a5d237c10eaf8344a080bb1ea0d3e069ce12112",
+ "clippy-1.53.0-aarch64-unknown-linux-musl": "26db11ca69b33b3ac8e3379573f7e3bbc352f7920f98c4434465636c34d386dc",
+ "clippy-1.53.0-x86_64-apple-darwin": "ede5bceff1be27a21b12a3be4034d254925d3d58d39713fa4af9fa561f1ea671",
+ "clippy-1.53.0-x86_64-pc-windows-msvc": "dcff1fcdae5ca816a71c9f080246860e8e1d90022576d28d74d033f940ed8aa5",
+ "clippy-1.53.0-x86_64-unknown-freebsd": "4de1e957c3999a130ef3cb0362a28746ffaf79197cbb1ebabf7be6be115b2f29",
+ "clippy-1.53.0-x86_64-unknown-linux-gnu": "bf065f9c7710a5e7305fb511bd1e21bd248ab216230ec0c71d8bdd2383e0b088",
+ "clippy-1.53.0-x86_64-unknown-linux-musl": "ae84cd0677a5446dd07384d4006f52fc6e2d290728edabb5a169a56ca9bb388b",
+ "clippy-1.54.0-aarch64-apple-darwin": "086e52350792a8b4e3f3f40753948e7d067c38c9c0f22492f2c7d88ba7c94e95",
+ "clippy-1.54.0-aarch64-unknown-linux-gnu": "e25bdd281f3fa9cb194eaefe75cea7f4f0cd70c615ac7077a015764360d45953",
+ "clippy-1.54.0-aarch64-unknown-linux-musl": "8de3e94808e40540402aafed1343ce6cd058c86fa7ac174c6ec591e4a03d6c09",
+ "clippy-1.54.0-x86_64-apple-darwin": "b1548c2d6d524aad02865e98a367dc665cd5b1847a20d29b142cc13adfea43b8",
+ "clippy-1.54.0-x86_64-pc-windows-msvc": "36e03f67f45d83d66187df2380b4acaaa2cfe5924c53c724a83a2780f78212a1",
+ "clippy-1.54.0-x86_64-unknown-freebsd": "92569c0f9faab4501d47ab6958d6535d2039490e763cc65c1700b0c5436106b0",
+ "clippy-1.54.0-x86_64-unknown-linux-gnu": "4896d754064c781611901c459d326dfcc10d9916cad5c1dd6a0898bca7e6428e",
+ "clippy-1.54.0-x86_64-unknown-linux-musl": "8184892daa7b652af96c9634ad15f33e97b022c7aad16e1e95bb95bf3fa96972",
+ "clippy-1.55.0-aarch64-apple-darwin": "470c8c99050a7785c4b261ab95575141bb48f19dc135dec96b8424e175898670",
+ "clippy-1.55.0-aarch64-unknown-linux-gnu": "ace2cface85e199c5d1773a88ca5ba4d1527cf3936bc844113e4defb54fc13b8",
+ "clippy-1.55.0-aarch64-unknown-linux-musl": "f1dead08b21cc8a67a3d27c785e107d2aa5363e60dcfd74c7fb81fd663d288b8",
+ "clippy-1.55.0-x86_64-apple-darwin": "fff5969a2a6795e28e040eda2ab59d29a48ff5aad0f15bea194b61befbffec77",
+ "clippy-1.55.0-x86_64-pc-windows-msvc": "d7dfa77cc50348023d973311bf378181bdf18d5aff7c2fde69cf8031564667da",
+ "clippy-1.55.0-x86_64-unknown-freebsd": "ba035cd7f62468fc75a56f604ac3579adce4f90ba2e6df219299f21668def51f",
+ "clippy-1.55.0-x86_64-unknown-linux-gnu": "108ebbc6b311fc0cafc125f1fd7f35a82935000c60cad49a565958e47f63193f",
+ "clippy-1.55.0-x86_64-unknown-linux-musl": "e248a8b3987c2750439966ed5df385a089147079105d85041a8147b1044b4f3c",
+ "clippy-1.56.0-aarch64-apple-darwin": "70eb9ec3d9ab79c20030bd0df903ff972dea451dd2a4b55c7eaa8837c1782071",
+ "clippy-1.56.0-aarch64-unknown-linux-gnu": "fb62502c82cf35fecc55761fb3f7a816d2d355cb31ad89fa844be4a1368853de",
+ "clippy-1.56.0-aarch64-unknown-linux-musl": "fb1852dbeff93f1518ae3d0f7adfeb95596aa55069ad24dbcda14e59bd9ec9a2",
+ "clippy-1.56.0-x86_64-apple-darwin": "9410b2f7096ecc3f495fc8a36e14bd566fdd3e6fda2923b4732c3055da81fcf7",
+ "clippy-1.56.0-x86_64-pc-windows-msvc": "cdca7f40793889dca4eb19b846c7ca7bc60ffd8f5cc2fa20c6c71b66c26e9449",
+ "clippy-1.56.0-x86_64-unknown-freebsd": "c5751a4a7043c7a29755459193cde2a1468b4a0726fb3b188853afc6d6870510",
+ "clippy-1.56.0-x86_64-unknown-linux-gnu": "52b49ecc5d44d7f83983ad1aaa37ed9d0ac86a72395cef9e31d06f4ba2343c03",
+ "clippy-1.56.0-x86_64-unknown-linux-musl": "32b7b596225dedf38f9228edd1fde9211f6bd1969f924c3de7cc0d5150577487",
+ "clippy-1.56.1-aarch64-apple-darwin": "a3ea45a2c569bbfabe556c6d3c3ca6caa3aa84cd1c4897027a7ae17856ad9c9c",
+ "clippy-1.56.1-aarch64-unknown-linux-gnu": "2b9bea99c887b07b960325f51989600c120278ba658ada17ca9b9f8c75270265",
+ "clippy-1.56.1-aarch64-unknown-linux-musl": "578aeb964a07730e8f92b360e7e96c89728ff35d9d2bd21b1e7436b06960b0a6",
+ "clippy-1.56.1-x86_64-apple-darwin": "00690eb127e30b75992256481e75d4f3dd6afcedd0d00495eee88137cdbfc6a9",
+ "clippy-1.56.1-x86_64-pc-windows-msvc": "932cb41989bb9f72c1a8c37a306a663d311fba26e34f3759e3fe533c963c1571",
+ "clippy-1.56.1-x86_64-unknown-freebsd": "2e25fdf46fb4144115583cc2ee9a43d9d8a5ee8806a00ed676c89ab3f26ff799",
+ "clippy-1.56.1-x86_64-unknown-linux-gnu": "07bfe461a7da0631917a1c2ff0f319af85d1083ada911a089a76e792cf673d16",
+ "clippy-1.56.1-x86_64-unknown-linux-musl": "031f5118516ee442d9489ac32922cfa322b76629ba2dbcbd10047891651e8955",
+ "clippy-1.57.0-aarch64-apple-darwin": "1e29be461daed9196ffeabca4855501de118a503863f54873cb24b18ffb785ce",
+ "clippy-1.57.0-aarch64-unknown-linux-gnu": "c6f082eeb70580e293feb68a0bf415d8e490675a50e66c67384cbbf2c38539e2",
+ "clippy-1.57.0-aarch64-unknown-linux-musl": "f8ec644a01ef3f69db2b90e91640334de4b5b557ff2a085053e937f12d428f14",
+ "clippy-1.57.0-x86_64-apple-darwin": "f232a98a50cc0cb6237a09e59e12bf0ed67051e369d5371519085f91f7bd9411",
+ "clippy-1.57.0-x86_64-pc-windows-msvc": "e24ba652942e85bba965b61045f0515f4c7f3537eeea6ae7023c2110179545d5",
+ "clippy-1.57.0-x86_64-unknown-freebsd": "664d64fa5557717b7ea14fb3dfa8c7a32fc03296ff6ea38243e42dbb371776b7",
+ "clippy-1.57.0-x86_64-unknown-linux-gnu": "650a417e4adb00c29795110fb07d671e8fe79ef54a682a357defe7b402d09838",
+ "clippy-1.57.0-x86_64-unknown-linux-musl": "ba8eb172cc6435e396312509925058af6bc16ddd6da8abca7a89b8dbf4dd32d3",
+ "clippy-1.58.0-aarch64-apple-darwin": "8370af0cb5e274de23adab83eb62ce32bf117dfe4681a731719d2b3d1a9758b9",
+ "clippy-1.58.0-aarch64-unknown-linux-gnu": "d228ee69d7552d66f637d0afed4d43098fe0b87fc4cd15ff670f06aec642e171",
+ "clippy-1.58.0-aarch64-unknown-linux-musl": "5dd6ae5262d0b02f417d37698e9ed72a44880cf389e6ca4c2ad6fdcddbc87e3d",
+ "clippy-1.58.0-x86_64-apple-darwin": "98489c63d307db213c66d18f375c4feca49eaca1a48967d0b13e5395a1564924",
+ "clippy-1.58.0-x86_64-pc-windows-msvc": "52ca3e4cf88a39ed02aa573de29a88868b5bf326c4d148b12b791071d004c79a",
+ "clippy-1.58.0-x86_64-unknown-freebsd": "801695120c015e84980408fce40ce0797c7720c291a7d8b56ca0a642d133d336",
+ "clippy-1.58.0-x86_64-unknown-linux-gnu": "747524e25f22659447bef677083625657caa2138a945d44998eb375b4262f9c7",
+ "clippy-1.58.0-x86_64-unknown-linux-musl": "dd4bb678e1f48e6013b46e350355a4911dbef865d23613cb950cfe3691cae88c",
+ "clippy-1.58.1-aarch64-apple-darwin": "89e881ec4e8e2a54cef8999fc85bfec72fc749f4bf3eb292d0b6b7318652992b",
+ "clippy-1.58.1-aarch64-unknown-linux-gnu": "efc65bf92fc1011dc34805d6b2ae18ecebd85f9593fc4dffd9dd1e59daf6eb6a",
+ "clippy-1.58.1-aarch64-unknown-linux-musl": "d28e4e64aa8b96dea036165481ba0b3df118edad7cead3902b1bfe5becf0dd33",
+ "clippy-1.58.1-x86_64-apple-darwin": "e5a67b36bec6c0ba128f134fd08621a6a72b08db64020592b171ea66a1af300d",
+ "clippy-1.58.1-x86_64-pc-windows-msvc": "ee3186a2fe0dd68cfc4d63771d5cb67fd7c34bffcf8bc60fc7f0e70e0c37e94e",
+ "clippy-1.58.1-x86_64-unknown-freebsd": "e52bdea9a882c610b4510011f36b359df5dd0c6b33e3e6c7c1ea1336b59774e9",
+ "clippy-1.58.1-x86_64-unknown-linux-gnu": "8a750e67626799c6d7c2424f5ba47c9d9d4aa128bc2f7b78f9bedb8e4e8c46a3",
+ "clippy-1.58.1-x86_64-unknown-linux-musl": "74ee750364731d8a1f67a7dda33381e64f07adb8af782a5fd00f1b8b5f09b083",
+ "clippy-1.59.0-aarch64-apple-darwin": "37e2589cb182da7c7878eac4386973ee0539e11de6cea047d500247e57214573",
+ "clippy-1.59.0-aarch64-unknown-linux-gnu": "d4278d73c317d487ea4cdfbaf43ffe048744c0ce887c584eb396016b9cc007af",
+ "clippy-1.59.0-aarch64-unknown-linux-musl": "9f8e96d61a23c83cc59c44bac7b42b997f173974ee8b6cd4a9c3b4a54caa0107",
+ "clippy-1.59.0-x86_64-apple-darwin": "932e843d538f3775d7996ad2f9a4e412f431d413c6585521fc95dba85aca2bad",
+ "clippy-1.59.0-x86_64-pc-windows-msvc": "786751cdc3b1937c19e555255092c888509e81ab6295887da0e92f1de7f5900d",
+ "clippy-1.59.0-x86_64-unknown-freebsd": "d1c2ab40e6be423d4d4e29af85b56dec090cc49afb82684c07b0cb19317d043b",
+ "clippy-1.59.0-x86_64-unknown-linux-gnu": "aad54aae93bd8cad8fa1ae77a0e4f79b8439d471b1478a0fb67294497a782edb",
+ "clippy-1.59.0-x86_64-unknown-linux-musl": "23b57a9b3b30b6724df278860d9700e50e88b5dff5afd8b8ddaf0bf235695762",
+ "llvm-tools-1.36.0-aarch64-unknown-linux-gnu": "942856e49837a1c3b9c7d48b52cf0ac0fcb2bb31bb691fe53bfb934afb561c7f",
+ "llvm-tools-1.36.0-x86_64-apple-darwin": "ed702a4174a27fcf118f301e79835c3da205d3d98adb4acc294b72293a2ec790",
+ "llvm-tools-1.36.0-x86_64-pc-windows-msvc": "cf72242bcf873227c026505f56f3ffdaa2febde828d67ad7fc04c4a2e72d7587",
+ "llvm-tools-1.36.0-x86_64-unknown-freebsd": "37c19db740acbe462d878fe193b59653a5073b23a840c6a2e2924772c0642b56",
+ "llvm-tools-1.36.0-x86_64-unknown-linux-gnu": "beae1690418b4adffac166fbfde525be8f5e2b2ce220ffd19b420edb1efa4477",
+ "llvm-tools-1.36.0-x86_64-unknown-linux-musl": "6f2754a2305792e3160fe3d1710e8609b242fbe753b8b18867acf6f3d326dc95",
+ "llvm-tools-1.37.0-aarch64-unknown-linux-gnu": "fb7cea148816422466aee656d81b08f9cb819cff8c431574f08c281b58547413",
+ "llvm-tools-1.37.0-x86_64-apple-darwin": "b882607b0f181d3942eb00a13cb375d820d000ced456a0cfd626ad79f597f8ac",
+ "llvm-tools-1.37.0-x86_64-pc-windows-msvc": "804a1455879b72f9439e9f2d6469f328847ccb432f69b41ccbad2ecc0e124fb2",
+ "llvm-tools-1.37.0-x86_64-unknown-freebsd": "206bf31dc2851a27b697acd5ad978d2b0d1cfdf26e01b7798388030591fa7899",
+ "llvm-tools-1.37.0-x86_64-unknown-linux-gnu": "da54ade6c7e2776edab1b6f1216477168cadf30fe40e503cca8b4bce20d89bc6",
+ "llvm-tools-1.37.0-x86_64-unknown-linux-musl": "737f6f903340700c7953c46f3143418d90f8bc1f879cd940ce0bcc479109b7d4",
+ "llvm-tools-1.38.0-aarch64-unknown-linux-gnu": "dbbfdc0dd802feb94e8e0f0eb0dad2c2f3e6bf69bb58d371622c94e8c7e82e25",
+ "llvm-tools-1.38.0-x86_64-apple-darwin": "7a4f8502b93e6fc3a4d89ab94230a90c94778d17badcdde25ebb545f4e37a7c0",
+ "llvm-tools-1.38.0-x86_64-pc-windows-msvc": "da005a040ee70728c224eb23d1374420422ac64e2b4ba328ac6d7b5934389061",
+ "llvm-tools-1.38.0-x86_64-unknown-freebsd": "f4da25e84e31a78b6f761b3f597c98391bd6873298c7708dc886b2c72f56f874",
+ "llvm-tools-1.38.0-x86_64-unknown-linux-gnu": "0fff5bc69ebf49fec0372aa73f9b6757b8a6bb506f14f48d153e6f14de2fd19a",
+ "llvm-tools-1.38.0-x86_64-unknown-linux-musl": "5877d995125b6d17f25f23f9eaccb5775dc2bde5f3b7062fff8cad23221e80e8",
+ "llvm-tools-1.39.0-aarch64-unknown-linux-gnu": "9c7eae2e5770d20872f6012b273d2ca5dab09f97f497a0cc82ea5af8e2b08527",
+ "llvm-tools-1.39.0-x86_64-apple-darwin": "52c15480345a18d55a2141a9f440fe874a8686d3d94e4637b2c4884df7c88a43",
+ "llvm-tools-1.39.0-x86_64-pc-windows-msvc": "87b7cf10ebab53bb7fab625d603f80e35111afaeacd915df63c19ad68382f31f",
+ "llvm-tools-1.39.0-x86_64-unknown-freebsd": "f451ffb87b00a277264c5acf5267f8df61300089a9798607b4cdfebc88fabee1",
+ "llvm-tools-1.39.0-x86_64-unknown-linux-gnu": "0a87b543e3841d415887a4543587b783fce678a7097a774a56a2032cee842991",
+ "llvm-tools-1.39.0-x86_64-unknown-linux-musl": "da87e08670b7dad359f3d0b3f132d212713dcb21cf1c5e308acf257632de0075",
+ "llvm-tools-1.40.0-aarch64-unknown-linux-gnu": "caf36148d0f5a885cad05605d80cc2c805ce8456837b6dbb34b47420a4d52475",
+ "llvm-tools-1.40.0-x86_64-apple-darwin": "d4c4abb2a7b2800500ef4e0a46493c5340bb7b0be84d38897573281e93b8577f",
+ "llvm-tools-1.40.0-x86_64-pc-windows-msvc": "0fe4cfa0e4ce99e45c810b8301edcdfa694db75e291b497ce8c52ec5b89e4861",
+ "llvm-tools-1.40.0-x86_64-unknown-freebsd": "aa11c881fa728fa8df233c220fecd6b25cb27cbb673569cbd9a90865ae464d9f",
+ "llvm-tools-1.40.0-x86_64-unknown-linux-gnu": "40c5ad2c53802b8b722ebd5a06b9f51f32644d8a6d6fdc32aacc60a33bed5839",
+ "llvm-tools-1.40.0-x86_64-unknown-linux-musl": "8e98e884442ade699f951bdab603a012c683de5809cae6bcb25bdc81abc3c4db",
+ "llvm-tools-1.41.0-aarch64-unknown-linux-gnu": "279aedca8c3c12a0608de9a51fa38a33b910600e4f980487c1706cec29270c63",
+ "llvm-tools-1.41.0-x86_64-apple-darwin": "621676b4ae3d75662463876315a58bd188ceb4b22ff249ad033e0181fe30df74",
+ "llvm-tools-1.41.0-x86_64-pc-windows-msvc": "6d1b3a2a74497b0a4e9420d87a6fa462dc608a3b41d4dae9f164cf66c290a00d",
+ "llvm-tools-1.41.0-x86_64-unknown-freebsd": "311a056371edbad2194b5714f3e8d17e7a897f27b67bdbe2d827ed437d06d050",
+ "llvm-tools-1.41.0-x86_64-unknown-linux-gnu": "d2cfa10a162cd9b63c5b8eb3db49560532c11823bb15f836abc5e42cca1a1170",
+ "llvm-tools-1.41.0-x86_64-unknown-linux-musl": "dd176d66f6f04d2e1c0deeb11d07d5882937af6c72121cad4bc7e63bba3fa0ff",
+ "llvm-tools-1.42.0-aarch64-unknown-linux-gnu": "7601ef92b42a321fee08f6adce3ca0eb612ca8703fda1db63e30bd4952f7fcc9",
+ "llvm-tools-1.42.0-x86_64-apple-darwin": "c4c0319e8be687b104162ce3654249ed76040229a77d77016e32570fbfbd3439",
+ "llvm-tools-1.42.0-x86_64-pc-windows-msvc": "721b14d159d6df877991db62a0f5fcd11d8d9cd642d8f51311a2d2c99c0f9e43",
+ "llvm-tools-1.42.0-x86_64-unknown-freebsd": "4fc2bb1ab454b21750c78f9ce19d7138e4929a804770202319a3f457b1e5c2f9",
+ "llvm-tools-1.42.0-x86_64-unknown-linux-gnu": "d306ee9009eeab2062b813123628cc440f58c71c0e1d53afe1563f4eb1a5e0e4",
+ "llvm-tools-1.42.0-x86_64-unknown-linux-musl": "7fc21cc7f2a8879b052fed92fedff55df5afd528912c8405ec67640f663d716e",
+ "llvm-tools-1.43.0-aarch64-unknown-linux-gnu": "647dc36be8dc5130a703f6ba151bc79936503d0251481ba40bfacc5bfa251947",
+ "llvm-tools-1.43.0-x86_64-apple-darwin": "890bf12d80b72fc0c58966e1d229cfb24764eabe356762dcaf126afbd63fd47d",
+ "llvm-tools-1.43.0-x86_64-pc-windows-msvc": "e299dea627f89f6b14897d45f39dba3036298b2c94f35ba4dfea276996682977",
+ "llvm-tools-1.43.0-x86_64-unknown-freebsd": "6a64cc4b3dd0b8218b350b4fad36197edf2da33e5ab43c4670737e4d392ba586",
+ "llvm-tools-1.43.0-x86_64-unknown-linux-gnu": "4f62cab67e89d78d886cb03379d71f6722f8c5e5c069b3c243e334381c5948cf",
+ "llvm-tools-1.43.0-x86_64-unknown-linux-musl": "ea90e9540b5618698088171793dc571614d434571d6c81a80259a597d536a265",
+ "llvm-tools-1.44.0-aarch64-unknown-linux-gnu": "e25ee71a187d6c8969b17788fb678c9b358034ad2a2fb7557b755534eaf9cfa6",
+ "llvm-tools-1.44.0-x86_64-apple-darwin": "d684de7783ee15537f78231acacb9079f821c8c8b85b889e54c40b095ae6b0a1",
+ "llvm-tools-1.44.0-x86_64-pc-windows-msvc": "ac84fcc25d5d8d20592d6491576df7a72059fe9317889692badac2fc9028bd8a",
+ "llvm-tools-1.44.0-x86_64-unknown-freebsd": "3f4a17239b9dc9e84d98922ea4725f741249ba597ac1345b09c818b54b7a0765",
+ "llvm-tools-1.44.0-x86_64-unknown-linux-gnu": "1755b589718c652071e354c3629f41a9a90a84a3649078ed697e630ba19b3592",
+ "llvm-tools-1.44.0-x86_64-unknown-linux-musl": "c3abf2adba70a8cce16e4a6962b6868238858e54c9822cec64c5f981e43489b8",
+ "llvm-tools-1.45.0-aarch64-unknown-linux-gnu": "1432bf52b301e16a5a57398a7f59bcee43358913627c7caf7b1568cd8824c5c4",
+ "llvm-tools-1.45.0-x86_64-apple-darwin": "9c4e5488be910b8b5ded830ea4c8844090801d3f35e7d9cb1f272e3e7df90a0d",
+ "llvm-tools-1.45.0-x86_64-pc-windows-msvc": "5a2b5f49e04def6bc6bdb148412bf62ca7fd01d0e8ed61d07fe6716003425350",
+ "llvm-tools-1.45.0-x86_64-unknown-freebsd": "dbeaa09b90aab06a8450afaa9018a859a440be48d98e9437a7d827a138d3ae7a",
+ "llvm-tools-1.45.0-x86_64-unknown-linux-gnu": "54a2ac31ad53d3d346c571fa1d25b730b614a8214b5484c511f21f7dd0bdbd5f",
+ "llvm-tools-1.45.0-x86_64-unknown-linux-musl": "5e610db342edfb61ac702b36eebb4cfa1a4d2c0b89ca400b2ca89055167e07fc",
+ "llvm-tools-1.46.0-aarch64-unknown-linux-gnu": "1d8107ff0682d20c37a0d42f54fa1e2e96e70f7c4694fc71a84f7b32e3793247",
+ "llvm-tools-1.46.0-x86_64-apple-darwin": "1045f55a6e59326e0f5b46616e8c945f0cc04c4519f21aa095f87b3e35420422",
+ "llvm-tools-1.46.0-x86_64-pc-windows-msvc": "037719e7774bae1e3084949123a8a10d4d2c89134849333a53c7dcad00fe412e",
+ "llvm-tools-1.46.0-x86_64-unknown-freebsd": "55d9194cd9ac3f26f95f4f94db899c86b140753ef57aa2996dd8be528eaf8ae0",
+ "llvm-tools-1.46.0-x86_64-unknown-linux-gnu": "2a98e7290148575cdc6230610fca3ce68d1bd7b7dd105124f8a1673859ecc9ad",
+ "llvm-tools-1.46.0-x86_64-unknown-linux-musl": "431339bdd829224c0d3a3c835d65de95e52f042c1e0c3a286718055af4b2b977",
+ "llvm-tools-1.47.0-aarch64-unknown-linux-gnu": "6f9cc27ea4d33ef81be176392d169a2ca2ba6d3e6e8c037917133823cc4979c1",
+ "llvm-tools-1.47.0-x86_64-apple-darwin": "75a8381f7f521ad8afc8480e2bda27d3d3730b9ee154022deb26db3ca6216505",
+ "llvm-tools-1.47.0-x86_64-pc-windows-msvc": "e9a5d9db6f899904f094cc745a1b5cc47f7d7bbcb708217ad68933316e814880",
+ "llvm-tools-1.47.0-x86_64-unknown-freebsd": "47592da88536cf5c44085907c7e5d57bf695d5ac8add76d2c7d1c0518e6e05e6",
+ "llvm-tools-1.47.0-x86_64-unknown-linux-gnu": "a52c3cd18a6895c91a49d0a00f2cb4b12d64dd5b1ef6607fade1fed88fc36dac",
+ "llvm-tools-1.47.0-x86_64-unknown-linux-musl": "08ec337e44c1d83438d84e79dfacf6f123a8ed1af90c8130da784ded74966187",
+ "llvm-tools-1.48.0-aarch64-unknown-linux-gnu": "133e6b94d3c34d91ea9689c9288c66acf169d59877c0c924fc99b1fee283f4f4",
+ "llvm-tools-1.48.0-aarch64-unknown-linux-musl": "5a643eb72e06c4baa68ab38481b0e24ad40468e07dced9dfade04f469cce3b26",
+ "llvm-tools-1.48.0-x86_64-apple-darwin": "de0715d6cb0456da647750605ea1a3e3832278a4fa500d9c13bd148e7b278afe",
+ "llvm-tools-1.48.0-x86_64-pc-windows-msvc": "a0506c1619708e2bdf6bc198db5d130965613ec0609a9fe75556ce5effdf4f78",
+ "llvm-tools-1.48.0-x86_64-unknown-freebsd": "61a56f1436c7e4bfe68be160abb61989a8b4b4fef5e939764d488587484d6da3",
+ "llvm-tools-1.48.0-x86_64-unknown-linux-gnu": "a4932dafdc84a2c2f4f67a9aa207ce306c36a4ed8e682e6d79764d438ebd00b8",
+ "llvm-tools-1.48.0-x86_64-unknown-linux-musl": "904e1a0009819b626bd643cfe7f82d8de7e277e69aa0791de26fb3754d897046",
+ "llvm-tools-1.49.0-aarch64-apple-darwin": "78f666e9608c6b38f704447ef270170154c55dcda033e4fab00c42bebc3319a5",
+ "llvm-tools-1.49.0-aarch64-unknown-linux-gnu": "50228dd0c1ea9f483cac055fd1ff82f202427ef970266e904be01133c40f0c91",
+ "llvm-tools-1.49.0-aarch64-unknown-linux-musl": "0992328492832f96f4ee35661d8706e8e5f630bb92de117398f0b27556bc98cd",
+ "llvm-tools-1.49.0-x86_64-apple-darwin": "39c294fb87e6dc8c29975469a0566d4f8a47e50c1defe9f3dabbf1d598772bea",
+ "llvm-tools-1.49.0-x86_64-pc-windows-msvc": "3e57ff66c2a0091e3373e479fec699d3012e9249b7e0da36500fa0071308114f",
+ "llvm-tools-1.49.0-x86_64-unknown-freebsd": "c2b3c06bf4b2f6010f9927391c8e72f96642a528c486ec98f66c16066298e015",
+ "llvm-tools-1.49.0-x86_64-unknown-linux-gnu": "aecf6c322dc4064dcedf2315d443a69e099fc52e617711306fa1269cb180aa68",
+ "llvm-tools-1.49.0-x86_64-unknown-linux-musl": "c53b602056f48c38624942c1f6b6cc1a5a542cb56249a3a90c67355da531bd40",
+ "llvm-tools-1.50.0-aarch64-apple-darwin": "4a03b09dc15644fd5a10ac8aa1dc3ec32bc832f0c27bce4fa6128f18ac22a90d",
+ "llvm-tools-1.50.0-aarch64-unknown-linux-gnu": "25256ce02516667890abf82fa4d49a86f16dcea448d63c9a03782c0a3bbe05c1",
+ "llvm-tools-1.50.0-aarch64-unknown-linux-musl": "cfe980fe89486c78a5c88701e8ce6a9c7914030c703d2b3ee841b84c1ccdf31d",
+ "llvm-tools-1.50.0-x86_64-apple-darwin": "d8b018570e8ff163c4ab37a36ce16128b39c2ea55efd1be3caf14bdd85d03394",
+ "llvm-tools-1.50.0-x86_64-pc-windows-msvc": "728f7a656f27eb6361847d245d23b56b7109c7ef5f47117044e83aaf49fcc536",
+ "llvm-tools-1.50.0-x86_64-unknown-freebsd": "4300261729751c6a7353cc4a4bb3d6c448fcc24e90a82e3d626af037fb6aae4c",
+ "llvm-tools-1.50.0-x86_64-unknown-linux-gnu": "86871fb83afba38ba818286c20bc863798b64a7a403ecb0454535bf1a09df482",
+ "llvm-tools-1.50.0-x86_64-unknown-linux-musl": "98f2266ffbcf1d94e2d6961341ef6488ef3f49a81ae4c857c4b817cc9528535b",
+ "llvm-tools-1.51.0-aarch64-apple-darwin": "1a12dd5bd2c354a89737640ac105600f59fc038809ad4611b29eb0d225bd783d",
+ "llvm-tools-1.51.0-aarch64-unknown-linux-gnu": "5295ca2bbaa8d37942ed95f801107900d40f326f543edf4c80a1c2adf48fb077",
+ "llvm-tools-1.51.0-aarch64-unknown-linux-musl": "2dfbe582660bac4a674186a475a5a3d118aa2369dc70eb9d8e93cd13a66cb50f",
+ "llvm-tools-1.51.0-x86_64-apple-darwin": "1c52b39cae8fb17e64c311eb9ab66e475b6ae8190b35c6513344271b7e172d3e",
+ "llvm-tools-1.51.0-x86_64-pc-windows-msvc": "cb2dd2a21deb3228ce3e7e2495b95d34b5c985eae39126170d823ff1b585a240",
+ "llvm-tools-1.51.0-x86_64-unknown-freebsd": "a2f698841b8f860bf5a841f5f53dea8fd9df53c19c3b6d15cbe43a327696ffea",
+ "llvm-tools-1.51.0-x86_64-unknown-linux-gnu": "398a587c088ac159322bf47d1736409ab88d3a45eb9e09bfb7bacbbf20627e49",
+ "llvm-tools-1.51.0-x86_64-unknown-linux-musl": "0b7a9e46dd64fdef3ce22bd5a69d4599a17c120ae645fadadd7371b03f2dacd8",
+ "llvm-tools-1.52.0-aarch64-apple-darwin": "f3b3a9dbef7a00fe26a38d143585d3ca79b85c6dc6326c31ea3de178715d2456",
+ "llvm-tools-1.52.0-aarch64-unknown-linux-gnu": "9550b39d38ffdb32231fbc3893a362dc325448aa05b4197845d7fb799ec556e6",
+ "llvm-tools-1.52.0-aarch64-unknown-linux-musl": "7dd8f795ec2d9f2eeb67e98e08341ab46416bf8f307a8395d6c7d289f4f6a641",
+ "llvm-tools-1.52.0-x86_64-apple-darwin": "0160eca2c73cd54b47c226c6f0f6ae4841300bbf8384426bbfb03a814b30cf84",
+ "llvm-tools-1.52.0-x86_64-pc-windows-msvc": "baf0810ece6694ed431010a24d9c81386f150567b48f79fac952e411927d3058",
+ "llvm-tools-1.52.0-x86_64-unknown-freebsd": "cdb385cc036a9f354639050384584e64e6464a8ccfd422db17b3a2df82b88eb8",
+ "llvm-tools-1.52.0-x86_64-unknown-linux-gnu": "bd5056c50b92e48787d164d4d93db332c3f02e2913b3d86edabddfa248c3aeba",
+ "llvm-tools-1.52.0-x86_64-unknown-linux-musl": "2f5905d5b3198311d2b335ad59d6e14bde9e5eae201df5d723b8b07de37740eb",
+ "llvm-tools-1.52.1-aarch64-apple-darwin": "749d77f5877395081ccbdde25183a4934fa9f771191f1994ef67ab6b845b380f",
+ "llvm-tools-1.52.1-aarch64-unknown-linux-gnu": "94fad9186731f9428ec8a73165294810d63583a04798377298d1569ddf373503",
+ "llvm-tools-1.52.1-aarch64-unknown-linux-musl": "afd4fd18b981bda0a351bf5fff8f6cf76be877aa8840e5e5b159aaffa6979f69",
+ "llvm-tools-1.52.1-x86_64-apple-darwin": "ef5e0713fee477262bff9a8cb2212bd775050ea768a5ba50ceb33e13b58ede17",
+ "llvm-tools-1.52.1-x86_64-pc-windows-msvc": "6823c114ae05ebf515401e44d1ca6fb8d108cbaa495ace60c5fdbd7e81f2b32f",
+ "llvm-tools-1.52.1-x86_64-unknown-freebsd": "470789210cd51acab85662ea5d80f3275d0766f98f59399b6aa3741bde86e773",
+ "llvm-tools-1.52.1-x86_64-unknown-linux-gnu": "db70724d4010273644c4e0ef4739299940b47e307f3dbee094050703147b60f8",
+ "llvm-tools-1.52.1-x86_64-unknown-linux-musl": "ad0755ed04d3e17d11e99aab793a5752e6ef0943a92822874277a13f5b91373f",
+ "llvm-tools-1.53.0-aarch64-apple-darwin": "cd700c4ae2c6fe2a568f477a9db7d7c9cd1079456cd777aa04954fbb3bc64e37",
+ "llvm-tools-1.53.0-aarch64-unknown-linux-gnu": "916307648b13cd403e5d89e26dc0057a3d6517033b04199b905af7b216ff191b",
+ "llvm-tools-1.53.0-aarch64-unknown-linux-musl": "f19e5396e69a12c854294c61c2ba647e8d06a67750b4bc741c1ec8b44e27ad76",
+ "llvm-tools-1.53.0-x86_64-apple-darwin": "5a693b933e6755fc42983912c0a9197107b61c5ded051526aa0eed60cbb038cf",
+ "llvm-tools-1.53.0-x86_64-pc-windows-msvc": "8d2800c3460935386c0ea368460d0b4cadb152403d3125b9616a1b4fa856cfc4",
+ "llvm-tools-1.53.0-x86_64-unknown-freebsd": "221f677502c4d648e5578cf75224fb017dc4df486bbb15408100f6dc63fb72e9",
+ "llvm-tools-1.53.0-x86_64-unknown-linux-gnu": "4aa6e3c9ef91efc082a6741013fc7886dc669b1532c0c3b23f922e4307200800",
+ "llvm-tools-1.53.0-x86_64-unknown-linux-musl": "b5054bcd14e5a5361f29fe5efa970ab8340c75feebc3c6b7719ee4cf1cf1027a",
+ "llvm-tools-1.54.0-aarch64-apple-darwin": "61bb98566e77f998f59c2399c5db3b488cd88e4a7bcce74061bbbb6de5c85c62",
+ "llvm-tools-1.54.0-aarch64-unknown-linux-gnu": "95dd016daee815e6511ed09becba913e5aa1fc6b9ef42bc27d1a509f660dec99",
+ "llvm-tools-1.54.0-aarch64-unknown-linux-musl": "8cac2dd2d1ef582c77b37b6810122426369028351a66a355c38ff72efb8f6ec4",
+ "llvm-tools-1.54.0-x86_64-apple-darwin": "a287d049bf7beb3a3cddf62974e0450d21bb09da72ab453222dffc3f5ef72fef",
+ "llvm-tools-1.54.0-x86_64-pc-windows-msvc": "e1437993d0088f93871e2563c570fb62aec6109087227df7da8779ef226abbc3",
+ "llvm-tools-1.54.0-x86_64-unknown-freebsd": "024fcaabada32629381b5d1ec856d595eacf5cf506c43619d2ab454aeac7da4c",
+ "llvm-tools-1.54.0-x86_64-unknown-linux-gnu": "aa4000bccc5e463c9cc3aecb6b400813a0f122b5f14a747710f23b838b4fbcc8",
+ "llvm-tools-1.54.0-x86_64-unknown-linux-musl": "b0e2a74c6e1fb0c9fa888887996cb168c0d119ee4596736a4785b1200b79021b",
+ "llvm-tools-1.55.0-aarch64-apple-darwin": "00a0a90cd743480a192d3f1c905d57b98986d75c88fc738effcbc50c43b0ab85",
+ "llvm-tools-1.55.0-aarch64-unknown-linux-gnu": "259a183333a4f19eded8a2b6fa4382b7f36a9a23605d0f0a7b59a28d794c77d1",
+ "llvm-tools-1.55.0-aarch64-unknown-linux-musl": "a6a6756bb3091d15b772e57189c4279d17e218193b7d795b307effb88d269ef5",
+ "llvm-tools-1.55.0-x86_64-apple-darwin": "fce7354b071f2da56a100f89846e0c5bb3848f2e85e8583102f1d8b409214a95",
+ "llvm-tools-1.55.0-x86_64-pc-windows-msvc": "03307e359512652648b296cecf1e446befbeaf4a3a73db5cec1e6dfbc03f6376",
+ "llvm-tools-1.55.0-x86_64-unknown-freebsd": "f186caf30fadf738275f4daf077815445b4c3496cc7d3e85fbf53b5f8f57eb21",
+ "llvm-tools-1.55.0-x86_64-unknown-linux-gnu": "ebad576075c4dd039444ca7335ff244d6c0c566a7ee1532ac80d36a2de1217a5",
+ "llvm-tools-1.55.0-x86_64-unknown-linux-musl": "28de296a08d173bf5bad236935ccc547c8eb741fb91900cb10499e80e2472ec5",
+ "llvm-tools-1.56.0-aarch64-apple-darwin": "4ad514255a87b0aba52bf995cb999bc7b34d42419b675fd757664d6682a45210",
+ "llvm-tools-1.56.0-aarch64-unknown-linux-gnu": "9518804888281bd1b0c8d8467d7c3e312342649ce3660248728a8d4faa193564",
+ "llvm-tools-1.56.0-aarch64-unknown-linux-musl": "095acf10efb3a4561758da9f9374488ab73c88a2f78b6d1ee97147ac8f039fe9",
+ "llvm-tools-1.56.0-x86_64-apple-darwin": "e40341be6619513f50bf89d445e3b30696853f3553bbe98fa9aa3527cd7c49cd",
+ "llvm-tools-1.56.0-x86_64-pc-windows-msvc": "838bf630fdaa404f9899a92e58c1b5646f4f4b6d54729e4f1c3aade5585a74f7",
+ "llvm-tools-1.56.0-x86_64-unknown-freebsd": "05225a9aeb481757b470ee604a129bfc7707d85dc487fffcc2585f4124e012d9",
+ "llvm-tools-1.56.0-x86_64-unknown-linux-gnu": "ac54b5c1bae0955945cd779291bc443b3e6d52f217ce1078a3505bae1c0e2ff2",
+ "llvm-tools-1.56.0-x86_64-unknown-linux-musl": "9512db06f3090028b0ba26aeea21c3a80e6676177c92cfa1e60d13acd6871f0e",
+ "llvm-tools-1.56.1-aarch64-apple-darwin": "8feb4429f37d2c59a97a657052a8518492ea3e0c43b37af1e44407bb04d5fd8c",
+ "llvm-tools-1.56.1-aarch64-unknown-linux-gnu": "3c831ad4ee247ae29a5acecba1609d70b02777ba8181d40a945d2efedebc8126",
+ "llvm-tools-1.56.1-aarch64-unknown-linux-musl": "bf62fb69c222c41c83cb5e647dbce207519724c92de8e05015e7fe62396ad33e",
+ "llvm-tools-1.56.1-x86_64-apple-darwin": "75dc2fb8105e33e3f86753eb2f97615f62bc3433591c31f63fa7c4c12b643321",
+ "llvm-tools-1.56.1-x86_64-pc-windows-msvc": "34ff6e95ce6397b954691f5ae59068bf33f8ecf71fe8aa8b1ac2db6eaff81720",
+ "llvm-tools-1.56.1-x86_64-unknown-freebsd": "b8d281cdae768bdd87409e69c916612e1fed29334d861fd07b0d44dd8b6d086d",
+ "llvm-tools-1.56.1-x86_64-unknown-linux-gnu": "61e322fc405540fae66790a0317d3fe4bb500da20879ef53c14eb32e93590ee6",
+ "llvm-tools-1.56.1-x86_64-unknown-linux-musl": "880e2eae8998ee390c3cd325b1806adb627c7491a252af99fc87f43380e1f11a",
+ "llvm-tools-1.57.0-aarch64-apple-darwin": "712e59804a2dc7c0f0a91680c3ccd7463bfe75784e508b4a47b7eebff258867f",
+ "llvm-tools-1.57.0-aarch64-unknown-linux-gnu": "340fcbf4555cc56232225284b500679f33601689bde3122cd54af7648c9d0ce1",
+ "llvm-tools-1.57.0-aarch64-unknown-linux-musl": "5de4f546695db024c74ad8c4ffbd03f549ce6476bdad8d40bd8fce59e4c3d4ce",
+ "llvm-tools-1.57.0-x86_64-apple-darwin": "4ee2065bf9ca04894c6ea700f5fe13f222843dc34b1bf92fc94f37c03e47f6b3",
+ "llvm-tools-1.57.0-x86_64-pc-windows-msvc": "dd042fd62e75ff14c1638b9a63072eac42530d29deca2c0277964091f974d3b7",
+ "llvm-tools-1.57.0-x86_64-unknown-freebsd": "0d23df22a31816f5545b5af083dde75a74060889b42ebc8231795bd478f803ce",
+ "llvm-tools-1.57.0-x86_64-unknown-linux-gnu": "bb2f45e0efe77886da2b8b9d3519b6a2929d1654258158d847996867d5b4ab40",
+ "llvm-tools-1.57.0-x86_64-unknown-linux-musl": "7c53a882379938b319c859f41d1f5569b66f1b4f03e745dec2bb3dc8eb11f2b4",
+ "llvm-tools-1.58.0-aarch64-apple-darwin": "55b8ac5d42e3910d7f77f2022a964ec54e4c8082cc6624070d8664c4449b5161",
+ "llvm-tools-1.58.0-aarch64-unknown-linux-gnu": "765d797cc11d746616d71015a52e564220e4e10b8f10efa2fd5fb74ba308ce30",
+ "llvm-tools-1.58.0-aarch64-unknown-linux-musl": "e4b221ea279f698eab0bfebfd2dabca8e2b02c0423c48fb5d0ef281920771b99",
+ "llvm-tools-1.58.0-x86_64-apple-darwin": "7e3f807c85d8b6ff00747d20e88c115bb56a52ac1964593b5ff6bff84bf05647",
+ "llvm-tools-1.58.0-x86_64-pc-windows-msvc": "11aa6d93678766ea8a4625146de43290418f3b9076a69bb183b12613fafc7e5a",
+ "llvm-tools-1.58.0-x86_64-unknown-freebsd": "5950fe6c5a9c27ce0e85d07fd54cfa0ae0687a797e4cc957e91d2deb07451ad1",
+ "llvm-tools-1.58.0-x86_64-unknown-linux-gnu": "26cee659335a999d1c9dd47ac2bd2a8c94c2d42f7cda27b96b419f0c0c785bc7",
+ "llvm-tools-1.58.0-x86_64-unknown-linux-musl": "b20c27a6cfef891f4ac9bfcd06c38dd17f9f4021a7876599092da84c318b8b6b",
+ "llvm-tools-1.58.1-aarch64-apple-darwin": "c43a9166c2cbcc1858afe2de696ee3e6233316603e9f5963bedaaf200a531d29",
+ "llvm-tools-1.58.1-aarch64-unknown-linux-gnu": "bec9207417c9bafa311119565e2a38f36d3aca5f642b8f0e19eb6fa0898fca5c",
+ "llvm-tools-1.58.1-aarch64-unknown-linux-musl": "0faff43fbfc9806355861b906fa0a32dca786843874fcaa7cf911f3899fe9313",
+ "llvm-tools-1.58.1-x86_64-apple-darwin": "0810cbbe2c590ed03128075aaccc77fffb16ceb41bb92490dca2c018117040da",
+ "llvm-tools-1.58.1-x86_64-pc-windows-msvc": "8c5887ebb551ba392cbe915474b4c2494c4b36ece102683240cf4150c5dc1718",
+ "llvm-tools-1.58.1-x86_64-unknown-freebsd": "b33b2ffa80bb8e3f116b15532acafe56bfb799973ccd97fbe35cb5c8eaeeb8bb",
+ "llvm-tools-1.58.1-x86_64-unknown-linux-gnu": "3d003e6b2a38a6364667ce033ba3fe8029320acbb5b34f9bb103001ffcfef044",
+ "llvm-tools-1.58.1-x86_64-unknown-linux-musl": "a3206ec957f0e8728ad79203f700e4a7d64acccf8b83d11209ac5e459eadab2d",
+ "llvm-tools-1.59.0-aarch64-apple-darwin": "474ba73365de82fa00940887d945931dde56efeb28789c036ab62b90c2e528d1",
+ "llvm-tools-1.59.0-aarch64-unknown-linux-gnu": "e3bc96a602e8cb7768f279c020a3830417e767095dc784b1549510de42c37f5b",
+ "llvm-tools-1.59.0-aarch64-unknown-linux-musl": "5b28d1c6a73b99346dc9f29b4fb0b475814d8bcc3fd9661a2b53bedf606f1bc3",
+ "llvm-tools-1.59.0-x86_64-apple-darwin": "988593882b294423fbd88895b88887da8b47bf28946ae78263b0169a2b2b4597",
+ "llvm-tools-1.59.0-x86_64-pc-windows-msvc": "45f393a71799392ff73cfb17ee071b7304b304c8375db6cdd86f3025b4ba56b0",
+ "llvm-tools-1.59.0-x86_64-unknown-freebsd": "dbb0a7ad6c0e7a87e55a8e3fad05c1ed9ee5944e41e841267d0dfbb748060135",
+ "llvm-tools-1.59.0-x86_64-unknown-linux-gnu": "3bea89788f101b7ea1aca5dad94c3d2bd5f5133999ba78cea878ecad00c8c602",
+ "llvm-tools-1.59.0-x86_64-unknown-linux-musl": "db090aa8093efe163f54e1b211846b9061f835ba21e55cca2e37a5af7ad40e80",
+ "rust-1.26.0-aarch64-unknown-linux-gnu": "e12dc84bdb569cdb382268a5fe6ae6a8e2e53810cb890ec3a7133c20ba8451ac",
+ "rust-1.26.0-x86_64-apple-darwin": "38708803c3096b8f101d1919ee2d7e723b0adf1bc1bb986b060973b57d8c7c28",
+ "rust-1.26.0-x86_64-pc-windows-msvc": "20631bf942242d4be82363030839851bf18a2199b74a661bdc334f830e9e1d5a",
+ "rust-1.26.0-x86_64-unknown-freebsd": "a03cbe097670042c90d18654fbc852c9d473261d61c03d0f745bbaee759780ed",
+ "rust-1.26.0-x86_64-unknown-linux-gnu": "13691d7782577fc9f110924b26603ade1990de0b691a3ce2dc324b4a72a64a68",
+ "rust-1.26.1-aarch64-unknown-linux-gnu": "d4a369053c2dfd5f457de6853557dab563944579fa4bb55bc919bacf259bff6d",
+ "rust-1.26.1-x86_64-apple-darwin": "ebf898b9fa7e2aafc53682a41f18af5ca6660ebe82dd78f28cd9799fe4dc189a",
+ "rust-1.26.1-x86_64-pc-windows-msvc": "56c2398de358094606afba419c1e1a9e499cbe6f894315e99cfebda9f765c52f",
+ "rust-1.26.1-x86_64-unknown-freebsd": "910128f60c680e175ae93722272f491c6835f27652f9f3fe415dc0d9c482e204",
+ "rust-1.26.1-x86_64-unknown-linux-gnu": "b7e964bace1286696d511c287b945f3ece476ba77a231f0c31f1867dfa5080e0",
+ "rust-1.26.2-aarch64-unknown-linux-gnu": "3dfad0dc9c795f7ee54c2099c9b7edf06b942adbbf02e9ed9e5d4b5e3f1f3759",
+ "rust-1.26.2-x86_64-apple-darwin": "f193705d4c0572a358670dbacbf0ffadcd04b3989728b442f4680fa1e065fa72",
+ "rust-1.26.2-x86_64-pc-windows-msvc": "c4195cc0541db7cb08d503cc38917f6f40f53826001e86d613a48bd7387ac6a0",
+ "rust-1.26.2-x86_64-unknown-freebsd": "0ad985cf36b3946f086fd3c3c6eb97b0c94b24285147a04da22c00d4d522727a",
+ "rust-1.26.2-x86_64-unknown-linux-gnu": "d2b4fb0c544874a73c463993bde122f031c34897bb1eeb653d2ba2b336db83e6",
+ "rust-1.27.0-aarch64-unknown-linux-gnu": "e74ebc33dc3fc19e501a677a87b619746efdba2901949a0319176352f556673a",
+ "rust-1.27.0-x86_64-apple-darwin": "a1d48190992e01aac1a181bce490c80cb2c1421724b4ff0e2fb7e224a958ce0f",
+ "rust-1.27.0-x86_64-pc-windows-msvc": "795585a4f49dfcfd719dd6678713d0e84979b265ae9265dcb26b45c67b3a883a",
+ "rust-1.27.0-x86_64-unknown-freebsd": "f0754434f76f261ecdfd7ea3645b251b0188e263c0c7a7466aafac1b034d20ec",
+ "rust-1.27.0-x86_64-unknown-linux-gnu": "235ad78e220b10a2d0267aea1e2c0f19ef5eaaff53ad6ff8b12c1d4370dec9a3",
+ "rust-1.27.1-aarch64-unknown-linux-gnu": "d1146b240e6f628224c3a67e3aae2a57e6c25d544115e5ece9ce91861ec92b3a",
+ "rust-1.27.1-x86_64-apple-darwin": "475be237962d6aef1038a2faada26fda1e0eaea5d71d6950229a027a9c2bfe08",
+ "rust-1.27.1-x86_64-pc-windows-msvc": "24fb59a42277487ab1aaf8ac8b7a988843ae851ffe4a3386d9339e99e42d08d0",
+ "rust-1.27.1-x86_64-unknown-freebsd": "739d38036c9f08c13bc7425cc5cccd3dd37860fa6e9dfc7bcd9081c8d3c5ccdd",
+ "rust-1.27.1-x86_64-unknown-linux-gnu": "435778a837af764da2a7a7fb4d386b7b78516c7dfc732d892858e9a8a539989b",
+ "rust-1.27.2-aarch64-unknown-linux-gnu": "cf84da70269c0e50bb3cc3d248bae1ffcd70ee69dc5a4e3513b54fefc6685fb4",
+ "rust-1.27.2-x86_64-apple-darwin": "30c5cc58759caa4efdf2ea7d8438633139c98bee3408beb29ceb26985f3f5f70",
+ "rust-1.27.2-x86_64-pc-windows-msvc": "be1cccbd4cc00d473cb19fee4402d0ffde3b1e3ca3701926d47590878bc88508",
+ "rust-1.27.2-x86_64-unknown-freebsd": "b114c5eebc120b360d4d3c4360421ff181cc47bb311e161d3af6971b6d3e6244",
+ "rust-1.27.2-x86_64-unknown-linux-gnu": "5028a18e913ef3eb53e8d8119d2cc0594442725e055a9361012f8e26f754f2bf",
+ "rust-1.28.0-aarch64-unknown-linux-gnu": "9b6fbcee73070332c811c0ddff399fa31965bec62ef258656c0c90354f6231c1",
+ "rust-1.28.0-x86_64-apple-darwin": "5d7a70ed4701fe9410041c1eea025c95cad97e5b3d8acc46426f9ac4f9f02393",
+ "rust-1.28.0-x86_64-pc-windows-msvc": "5990e79259967a6a176aa5e4c55c6395f0c9262eed61ea858cfb909bac477542",
+ "rust-1.28.0-x86_64-unknown-freebsd": "cac701973239cbec802780855b172a3cc85ce15602e72873fe966d9d7d807e07",
+ "rust-1.28.0-x86_64-unknown-linux-gnu": "2a1390340db1d24a9498036884e6b2748e9b4b057fc5219694e298bdaa37b810",
+ "rust-1.29.0-aarch64-unknown-linux-gnu": "0ed3be0fd9f847afeb4e587fff61f6769ea61b53719d3ea999326284e8975b36",
+ "rust-1.29.0-x86_64-apple-darwin": "28a0473637585742f6d80ccd8afd88b6b400e65d623c33cb892412759444da93",
+ "rust-1.29.0-x86_64-pc-windows-msvc": "64f8c85540520c82d579d7eac5e2a524b42a6083cc46c7e80181512651a66fef",
+ "rust-1.29.0-x86_64-unknown-freebsd": "3500b1683849cbe526bb79f460147aa387b79a4f9a6a4760e276f73ddbffafd5",
+ "rust-1.29.0-x86_64-unknown-linux-gnu": "09f99986c17b1b6b1bfbc9dd8785e0e4693007c5feb67915395d115c1a3aea9d",
+ "rust-1.29.1-aarch64-unknown-linux-gnu": "2685224f67b2ef951e0e8b48829f786cbfed95e19448ba292ac33af719843dbe",
+ "rust-1.29.1-x86_64-apple-darwin": "07b07fbd6fab2390e19550beb8008745a8626cc5e97b72dc659061c1c3b3d008",
+ "rust-1.29.1-x86_64-pc-windows-msvc": "ec15b45be27b4406122518b2949f6186f0d9d422f23a946ab4de43716cc8e492",
+ "rust-1.29.1-x86_64-unknown-freebsd": "4055a9e9990f83f6c0d4f2040b2704edb8dbdaf82933f8598ab4ee31c541bbb9",
+ "rust-1.29.1-x86_64-unknown-linux-gnu": "b36998aea6d58525f25d89f1813b6bfd4cad6ff467e27bd11e761a20dde43745",
+ "rust-1.29.2-aarch64-unknown-linux-gnu": "e11461015ca7106ef8ebf00859842bf4be518ee170226cb8eedaaa666946509f",
+ "rust-1.29.2-x86_64-apple-darwin": "63f54e3013406b39fcb5b84bcf5e8ce85860d0b97a1e156700e467bf5fb5d5f2",
+ "rust-1.29.2-x86_64-pc-windows-msvc": "7813396fb99021e9a8bccb2fc7e71b1b730d5f3aebbb09ffcc2ecb838a1073b4",
+ "rust-1.29.2-x86_64-unknown-freebsd": "2e209d505c730df6e68575424eec03ed924e12114ad60595602cb2513c6a382a",
+ "rust-1.29.2-x86_64-unknown-linux-gnu": "e9809825c546969a9609ff94b2793c9107d7d9bed67d557ed9969e673137e8d8",
+ "rust-1.30.0-aarch64-unknown-linux-gnu": "9690c7c50eba5a8461184ee4138b4c284bad31ccc4aa1f2ddeec58b253e6363e",
+ "rust-1.30.0-x86_64-apple-darwin": "07008d90932712282bc599f1e9a226e97879c758dc1f935e6e2675e45694cc1b",
+ "rust-1.30.0-x86_64-pc-windows-msvc": "960ca17c0c62ee250647c20b617e75912badb67ca8ade08c3224410a7c320ade",
+ "rust-1.30.0-x86_64-unknown-freebsd": "b4e5d00b318d56edb7ba9182af4210fca9d7f44b64bc1380456ff3c17584af52",
+ "rust-1.30.0-x86_64-unknown-linux-gnu": "f620e3125cc505c842150bd873c0603432b6cee984cdae8b226cf92c8aa1a80f",
+ "rust-1.30.1-aarch64-unknown-linux-gnu": "6d87d81561285abd6c1987e07b60b2d723936f037c4b46eedcc12e8566fd3874",
+ "rust-1.30.1-x86_64-apple-darwin": "3ba1704a7defe3d9a6f0c1f68792c084da83bcba85e936d597bac0c019914b94",
+ "rust-1.30.1-x86_64-pc-windows-msvc": "b0110a5ad461532b2cce59bc04346af739b4660e7241f92dde6442a11a5391c2",
+ "rust-1.30.1-x86_64-unknown-freebsd": "480db9003f8e8c4ad12f2868af2c1489a05b18a8dcc62985c52310a7a15201ce",
+ "rust-1.30.1-x86_64-unknown-linux-gnu": "a01a493ed8946fc1c15f63e74fc53299b26ebf705938b4d04a388a746dfdbf9e",
+ "rust-1.31.0-aarch64-unknown-linux-gnu": "4e68c70aba58004d9e86c2b4463e88466affee51242349a038b456cf6f4be5c9",
+ "rust-1.31.0-x86_64-apple-darwin": "5d4035e3cecb7df13e728bcff125b52b43b126e91f8311c66b143f353362606f",
+ "rust-1.31.0-x86_64-pc-windows-msvc": "9288248f1821ab53557cbc5728ade7d221b1670547b0c0ec35099e0b2993dcf4",
+ "rust-1.31.0-x86_64-unknown-freebsd": "936ca1503ab1f18d9a4a1cc27fbc655f2c532ba819e1109bb03f5c52c5fb4fdd",
+ "rust-1.31.0-x86_64-unknown-linux-gnu": "c8a2016109ffdc12a488660edc5f30c1643729efc15abe311ebb187437e506bf",
+ "rust-1.31.1-aarch64-unknown-linux-gnu": "29a7c6eb536fefd0ca459e48dfaea006aa8bff8a87aa82a9b7d483487033632a",
+ "rust-1.31.1-x86_64-apple-darwin": "8398b1b303bdf0e7605d08b87070a514a4f588797c6fb3593718cb9cec233ad6",
+ "rust-1.31.1-x86_64-pc-windows-msvc": "4d2aa25c9d79dca5aba67b7b1df1c1f0ad40fcfb25a4c1d364fd64dd17a63cf3",
+ "rust-1.31.1-x86_64-unknown-freebsd": "5cbb465a0843b31da217c51c4f9ebbb2508aa2ece41e9b98303101e12571de42",
+ "rust-1.31.1-x86_64-unknown-linux-gnu": "a64685535d0c457f49a8712a096a5c21564cd66fd2f7da739487f028192ebe3c",
+ "rust-1.32.0-aarch64-unknown-linux-gnu": "60def40961728212da4b3a9767d5a2ddb748400e150a5f8a6d5aa0e1b8ba1cee",
+ "rust-1.32.0-x86_64-apple-darwin": "f0dfba507192f9b5c330b5984ba71d57d434475f3d62bd44a39201e36fa76304",
+ "rust-1.32.0-x86_64-pc-windows-msvc": "51b0b64cc843d6e443bf19f89b61addb532ea61e02777c7e80a185a9a263776b",
+ "rust-1.32.0-x86_64-unknown-freebsd": "20d062493d01f1816014fe9dbe883bda06f1828a6ddbfb7ee5e4f1df20eb1c3a",
+ "rust-1.32.0-x86_64-unknown-linux-gnu": "e024698320d76b74daf0e6e71be3681a1e7923122e3ebd03673fcac3ecc23810",
+ "rust-1.33.0-aarch64-unknown-linux-gnu": "a308044e4076b62f637313ea803fa0a8f340b0f1b53136856f2c43afcabe5387",
+ "rust-1.33.0-x86_64-apple-darwin": "864e7c074a0b88e38883c87c169513d072300bb52e1d320a067bd34cf14f66bd",
+ "rust-1.33.0-x86_64-pc-windows-msvc": "b477be7a27799397cf90f09ef5efe21b1af02f48ec9bc1be3306ad298aaf8841",
+ "rust-1.33.0-x86_64-unknown-freebsd": "31ab015c1807a7c231ee74b4fb367f3fa43551d6c49cd2f7b63541f1fef0cc72",
+ "rust-1.33.0-x86_64-unknown-linux-gnu": "6623168b9ee9de79deb0d9274c577d741ea92003768660aca184e04fe774393f",
+ "rust-1.34.0-aarch64-unknown-linux-gnu": "370c3a8fb9a69df36d645a95e622fb59ac5b513baecddde706cedaf20defa269",
+ "rust-1.34.0-x86_64-apple-darwin": "e6bea8d865cc7341c17fa3b8f25f7989e6b04f53e9da24878addc524f3a32664",
+ "rust-1.34.0-x86_64-pc-windows-msvc": "471325ceb9492239f7bb399cb88df230791966c0f76f01020aa9d2868bafcfb5",
+ "rust-1.34.0-x86_64-unknown-freebsd": "bc9048312bee935ae1e7417e2f6840ea76fe370752915ca605ec7dc5b606dba9",
+ "rust-1.34.0-x86_64-unknown-linux-gnu": "170647ed41b497dc937a6b2556700210bc4be187b1735029ef9ccf52e2cb5ab8",
+ "rust-1.35.0-aarch64-unknown-linux-gnu": "31e6da56e67838fd2874211ae896a433badf67c13a7b68481f1d5f7dedcc5952",
+ "rust-1.35.0-x86_64-apple-darwin": "ac14b1c7dc330dcb53d8641d74ebf9b32aa8b03b9d650bcb9258030d8b10dbd6",
+ "rust-1.35.0-x86_64-pc-windows-msvc": "4f8935cea6b68c447b5fcb5974e0df3fefc77d15ab4f7d535779f06c3e4adc84",
+ "rust-1.35.0-x86_64-unknown-freebsd": "a6a3c7983a880d8e9bf475735b725c47de68831abc22da980e44a3aca5c5bd89",
+ "rust-1.35.0-x86_64-unknown-linux-gnu": "cf600e2273644d8629ed57559c70ca8db4023fd0156346facca9ab3ad3e8f86c",
+ "rust-1.35.0-x86_64-unknown-linux-musl": "3704219a4d16e4e9df22051877274c7b246d12658b447a85efa0b16037e98093",
+ "rust-1.36.0-aarch64-unknown-linux-gnu": "db78c24d93756f9fe232f081dbc4a46d38f8eec98353a9e78b9b164f9628042d",
+ "rust-1.36.0-x86_64-apple-darwin": "91f151ec7e24f5b0645948d439fc25172ec4012f0584dd16c3fb1acb709aa325",
+ "rust-1.36.0-x86_64-pc-windows-msvc": "c7c9f7f996d195f464b84eaf0b6a068b41d1480e088b12e5134f85a5a144bd30",
+ "rust-1.36.0-x86_64-unknown-freebsd": "eeeb1e9d0d7823c55f00f434789696e7249f465ba5966a5ab479040e3912c0e7",
+ "rust-1.36.0-x86_64-unknown-linux-gnu": "15e592ec52f14a0586dcebc87a957e472c4544e07359314f6354e2b8bd284c55",
+ "rust-1.36.0-x86_64-unknown-linux-musl": "74931a19a4854642cd1593a3bdcf8a832ab5b134a3cfacea9003f9ea387ca88d",
+ "rust-1.37.0-aarch64-unknown-linux-gnu": "263ef98fa3a6b2911b56f89c06615cdebf6ef676eb9b2493ad1539602f79b6ba",
+ "rust-1.37.0-x86_64-apple-darwin": "b2310c97ffb964f253c4088c8d29865f876a49da2a45305493af5b5c7a3ca73d",
+ "rust-1.37.0-x86_64-pc-windows-msvc": "4e42652e7bf7ef13b7fdf8c64d0adf4e18c6a765e482e4c62a4dded36d4d08e1",
+ "rust-1.37.0-x86_64-unknown-freebsd": "58a794fa9da9c14cefda55e7d4d13276517265a05a49f3a048033aee8870388f",
+ "rust-1.37.0-x86_64-unknown-linux-gnu": "cb573229bfd32928177c3835fdeb62d52da64806b844bc1095c6225b0665a1cb",
+ "rust-1.37.0-x86_64-unknown-linux-musl": "d97da4f1c1f89142b6885b006f8686c4035d25e95cfb988f961ce844e5b80dbf",
+ "rust-1.38.0-aarch64-unknown-linux-gnu": "06afd6d525326cea95c3aa658aaa8542eab26f44235565bb16913ac9d12b7bda",
+ "rust-1.38.0-x86_64-apple-darwin": "bd301b78ddcd5d4553962b115e1dca5436dd3755ed323f86f4485769286a8a5a",
+ "rust-1.38.0-x86_64-pc-windows-msvc": "99e2e22084a7c6a114f5353800677e1f7eb4b8cecf1b8841e21ac9579fe8da8c",
+ "rust-1.38.0-x86_64-unknown-freebsd": "a765b1f01a387b15b576b67c77e02609a6d9a6769584742f66f0cac1944c0f7f",
+ "rust-1.38.0-x86_64-unknown-linux-gnu": "adda26b3f0609dbfbdc2019da4a20101879b9db2134fae322a4e863a069ec221",
+ "rust-1.38.0-x86_64-unknown-linux-musl": "14f064fbd34b332866d96db12329ddd6d40525d69d7b8532d3d5387da1217e79",
+ "rust-1.39.0-aarch64-unknown-linux-gnu": "e27dc8112fe577012bd88f30e7c92dffd8c796478ce386c49465c03b6db8209f",
+ "rust-1.39.0-x86_64-apple-darwin": "3736d49c5e9592844e1a5d5452883aeaf8f1e25d671c1bc8f01e81c1766603b5",
+ "rust-1.39.0-x86_64-pc-windows-msvc": "3c96b221af3343c04bf81e621a0b97a2452ae1803ecc2841a162690d8ebfe46f",
+ "rust-1.39.0-x86_64-unknown-freebsd": "9cb25742e727bab0da5feb957ef61f7ffc836b4d5d0e6cabfdf28fb68caf5fdd",
+ "rust-1.39.0-x86_64-unknown-linux-gnu": "b10a73e5ba90034fe51f0f02cb78f297ed3880deb7d3738aa09dc5a4d9704a25",
+ "rust-1.39.0-x86_64-unknown-linux-musl": "f6610742ad223cdd9420707454e4814baf14ab79d73dc033ef190eed28e05cbc",
+ "rust-1.40.0-aarch64-unknown-linux-gnu": "639271f59766d291ebdade6050e7d05d61cb5c822a3ef9a1e2ab185fed68d729",
+ "rust-1.40.0-x86_64-apple-darwin": "749ca5e0b94550369cc998416b8854c13157f5d11d35e9b3276064b6766bcb83",
+ "rust-1.40.0-x86_64-pc-windows-msvc": "64d98af9b9114a3aaea096ba74c43cad75a2502fb682e941b4701f5d2a2b9272",
+ "rust-1.40.0-x86_64-unknown-freebsd": "d1a58e9f743f4a55513f74e41c90ab7b291413ce46336c138762fd9aa6605b32",
+ "rust-1.40.0-x86_64-unknown-linux-gnu": "fc91f8b4bd18314e83a617f2389189fc7959146b7177b773370d62592d4b07d0",
+ "rust-1.40.0-x86_64-unknown-linux-musl": "4fbc6a60c31d89d922cb8c3630a92d7d959a8ec8fa48b51bed9eb67eb0d30b33",
+ "rust-1.41.0-aarch64-unknown-linux-gnu": "79ddfb5e2563d0ee09a567fbbe121a2aed3c3bc61255b2787f2dd42183a10f27",
+ "rust-1.41.0-x86_64-apple-darwin": "b6504003ab70b11f278e0243a43ba9d6bf75e8ad6819b4058a2b6e3991cc8d7a",
+ "rust-1.41.0-x86_64-pc-windows-msvc": "4c43a64e83c28bfb788782b01d95034ecc59bf9846006aa1deb6986c139b9f9d",
+ "rust-1.41.0-x86_64-unknown-freebsd": "ae1093a1e476f5c7b1c1f59f986d64b5f82a76b865c9823bcc3d5061bb93ff9f",
+ "rust-1.41.0-x86_64-unknown-linux-gnu": "343ba8ef7397eab7b3bb2382e5e4cb08835a87bff5c8074382c0b6930a41948b",
+ "rust-1.41.0-x86_64-unknown-linux-musl": "ff7345dde2f5bc295ed8ae50f0eee54b8dd697e712f86095a3378bb4dcfeea70",
+ "rust-1.42.0-aarch64-unknown-linux-gnu": "fdd39f856a062af265012861949ff6654e2b7103be034d046bec84ebe46e8d2d",
+ "rust-1.42.0-x86_64-apple-darwin": "db1055c46e0d54b99da05e88c71fea21b3897e74a4f5ff9390e934f3f050c0a8",
+ "rust-1.42.0-x86_64-pc-windows-msvc": "4a3131ff6d2b04d120069e0ba494a6418db1c691fc8e4627cf1aaf2ffbaf5ad9",
+ "rust-1.42.0-x86_64-unknown-freebsd": "230bcf17e4383fba85d3c87fe25d17737459fe561a5f4668fe70dcac2da4e17c",
+ "rust-1.42.0-x86_64-unknown-linux-gnu": "7d1e07ad9c8a33d8d039def7c0a131c5917aa3ea0af3d0cc399c6faf7b789052",
+ "rust-1.42.0-x86_64-unknown-linux-musl": "1c6bcdf5dfb51c52e7afd33fddd799a0814cd80b443137a8e9eec5563de6849d",
+ "rust-1.43.0-aarch64-unknown-linux-gnu": "e5fa55f333c10cdae43d147438a80ffb435d6c7b9681cd2e2f0857c024556856",
+ "rust-1.43.0-x86_64-apple-darwin": "504e8efb2cbb36f5a3db7bb36f339a1e5216082c910ad19039c370505cfbde99",
+ "rust-1.43.0-x86_64-pc-windows-msvc": "78dea49969addb3ef7a3a3816482534828a5140c866a828be69ccfeb44972a3b",
+ "rust-1.43.0-x86_64-unknown-freebsd": "2555aa83d1559af19054befdaea3ae560374376f9973aa3dad2c41fcd2eb84d4",
+ "rust-1.43.0-x86_64-unknown-linux-gnu": "069f34fa5cef92551724c83c36360df1ac66fe3942bc1d0e4d341ce79611a029",
+ "rust-1.43.0-x86_64-unknown-linux-musl": "dcb022649bc1998d8e103f42cb0847afc57fcd303bc9fdfde057b2b53436605a",
+ "rust-1.44.0-aarch64-unknown-linux-gnu": "bcc916003cb9c7ff44f5f9af348020b422dbc5bd4fe49bdbda2de6ce0a1bb745",
+ "rust-1.44.0-x86_64-apple-darwin": "f20388b80b2b0a8b122d89058f785a2cf3b14e93bcac53471d60fdb4106ffa35",
+ "rust-1.44.0-x86_64-pc-windows-msvc": "127cf6569c4958e362f06f850eec6cba0ad69474ab15fef2dee740aee45a3169",
+ "rust-1.44.0-x86_64-unknown-freebsd": "e2ad3224790d2283d7ef66d5e1f08cec688f1c29cf53326c9a6c28fb4914b6a1",
+ "rust-1.44.0-x86_64-unknown-linux-gnu": "eaa34271b4ac4d2c281831117d4d335eed0b37fe7a34477d9855a6f1d930a624",
+ "rust-1.44.0-x86_64-unknown-linux-musl": "dabcba42caeba91874cf10640f70fb580bdab136ce56211ac341f10d311f6ebc",
+ "rust-1.45.0-aarch64-unknown-linux-gnu": "b727be0ecdee5fb88775b784758a09ab696293048a80288999b8a6f78b160212",
+ "rust-1.45.0-x86_64-apple-darwin": "8e91f99ffbf5ae86d659d3515315a8e92ef44210102672c1536a9902cc182401",
+ "rust-1.45.0-x86_64-pc-windows-msvc": "7d1118568b83fd1da5312de95ca6f30d4f21dae57073c00a216437e4c02733cc",
+ "rust-1.45.0-x86_64-unknown-freebsd": "3d09db6a127558cfdb4fc44106e7d478bb8f6cc6148d536b90d30610181fc656",
+ "rust-1.45.0-x86_64-unknown-linux-gnu": "c34ed8722759fd60c94dbc9069833da5b3b873dcd19afaa9b34c1ce2c2cfa229",
+ "rust-1.45.0-x86_64-unknown-linux-musl": "ca5c4670f511ff225d097b5602d4a2ce984b4cd02c6aedc3be1279570c6475cb",
+ "rust-1.46.0-aarch64-unknown-linux-gnu": "f0c6d630f3dedb3db69d69ed9f833aa6b472363096f5164f1068c7001ca42aeb",
+ "rust-1.46.0-x86_64-apple-darwin": "82d61582a3772932432a99789c3b3bd4abe6baca339e355048ca9efb9ea5b4db",
+ "rust-1.46.0-x86_64-pc-windows-msvc": "3545eb66ed7c6222ca4eb9e990d4bef63edbac9b580387bf7035501ee35d453f",
+ "rust-1.46.0-x86_64-unknown-freebsd": "30d8b05073b23f0621ed00276208589dcd7669776b752a67c66c9c928ebbe258",
+ "rust-1.46.0-x86_64-unknown-linux-gnu": "e3b98bc3440fe92817881933f9564389eccb396f5f431f33d48b979fa2fbdcf5",
+ "rust-1.46.0-x86_64-unknown-linux-musl": "57aa5ca25bbd3da4eea6fc411b0fe7e1dbc683230a3f58ec84b9f70c5606909b",
+ "rust-1.47.0-aarch64-unknown-linux-gnu": "753c905e89a714ab9bce6fe1397b721f29c0760c32f09d2f328af3d39919c8e6",
+ "rust-1.47.0-x86_64-apple-darwin": "84e5be6c5c78734deba911dcf80316be1e4c7da2c59413124d039ad96620612f",
+ "rust-1.47.0-x86_64-pc-windows-msvc": "c9f93f8c821090e1c96384bef564e9c9d86bd13ef8d1116b3f17e124f07f55cc",
+ "rust-1.47.0-x86_64-unknown-freebsd": "650af0288d099c9debef7258a27caf15dd8aaf033ee1a099b4c5216c95ecfeaa",
+ "rust-1.47.0-x86_64-unknown-linux-gnu": "d0e11e1756a072e8e246b05d54593402813d047d12e44df281fbabda91035d96",
+ "rust-1.47.0-x86_64-unknown-linux-musl": "63be7601a9ecc552e3cb7a7b8f781bc122f756e8c61e4da4b76f995af039e53f",
+ "rust-1.48.0-aarch64-unknown-linux-gnu": "c4769418d8d89f432e4a3a21ad60f99629e4b13bbfc29aef7d9d51c4e8ee8a8a",
+ "rust-1.48.0-aarch64-unknown-linux-musl": "ac4de580a28e45a9773b389b296d13bfeeb08263cb1f8343859577a54940dae9",
+ "rust-1.48.0-x86_64-apple-darwin": "20e727cad10f43e3abcedb2a80979ae26923038e0e8a855e8a783da255054113",
+ "rust-1.48.0-x86_64-pc-windows-msvc": "0fdf41bb9b45e923000205b08329e15124f01b9b32986d73cd36625f3c7d883b",
+ "rust-1.48.0-x86_64-unknown-freebsd": "21e24489ffaabe517e5e87572707784d5b471646164109b248957a2d32e7a8b9",
+ "rust-1.48.0-x86_64-unknown-linux-gnu": "950420a35b2dd9091f1b93a9ccd5abc026ca7112e667f246b1deb79204e2038b",
+ "rust-1.48.0-x86_64-unknown-linux-musl": "4ed9627f57b4e0b9807fc5e7513d9731f4791668b7f875b9e44e65e21072c56f",
+ "rust-1.49.0-aarch64-apple-darwin": "ce7d689e6f73dd9c07b672ba23dabe5159fa8c194dce71b4f3f95baeaf564082",
+ "rust-1.49.0-aarch64-unknown-linux-gnu": "b551bd482041307fa3373a687d6d6a2c4c0931c2e0a68b8b75dc80bc5cf5f002",
+ "rust-1.49.0-aarch64-unknown-linux-musl": "0a43d96a508c720520328112d609916d062f866a5c35f1db8f906284035d6d98",
+ "rust-1.49.0-x86_64-apple-darwin": "fe3e248bc4b0ee0a2595693687ad845c8a8bda824a56c9321520bcca02433716",
+ "rust-1.49.0-x86_64-pc-windows-msvc": "5340831dcf98344de4a6888b50237f82568a97a46d9814f1400720dde0c7b6e5",
+ "rust-1.49.0-x86_64-unknown-freebsd": "dced98577e834f511cae8e58290539ad6b8dd40ae512e90d1371f650961bd930",
+ "rust-1.49.0-x86_64-unknown-linux-gnu": "8b14446df82f3707d69cf58fed92f18e0bff91621c62baf89288ef70e3e92981",
+ "rust-1.49.0-x86_64-unknown-linux-musl": "f92a5a4adcfac4206a223d089a364a8375d1b6f112f3f2efa3f6d53d08a61904",
+ "rust-1.50.0-aarch64-apple-darwin": "1ed91a867e7b86cc4bc84c0838240f1c25acd007100ec9f7a14c4873e4b56561",
+ "rust-1.50.0-aarch64-unknown-linux-gnu": "1db7a4fbddc68cd29eb9bca9fa7d0d2d9e3d59ede7ddaad66222fb4336a6bacf",
+ "rust-1.50.0-aarch64-unknown-linux-musl": "adcc6c76a8967bacb6687b565d3cf739e35fde066b03edb745b05b52fa8b5b36",
+ "rust-1.50.0-x86_64-apple-darwin": "1bf5a7ecf6468ce1bf9fe49c8083b3f648b40c16fbfb7539d106fe28eb0e792e",
+ "rust-1.50.0-x86_64-pc-windows-msvc": "e8857c30b43b7d92371f824303d18e90e67e1053497366ad3496fa7ba0e0de6e",
+ "rust-1.50.0-x86_64-unknown-freebsd": "83f9d093ab7f0f5abac15e0fcea6f22daef217a2b6240342b71ae52f99a7f31d",
+ "rust-1.50.0-x86_64-unknown-linux-gnu": "fa889b53918980aea2dea42bfae4e858dcb2104c6fdca6e4fe359f3a49767701",
+ "rust-1.50.0-x86_64-unknown-linux-musl": "867cbfb35f5dc9b43e230132ea9e7bfa98d471a9248e41b08ced2266e5ccd00f",
+ "rust-1.51.0-aarch64-apple-darwin": "95d0410bbd20b05f8b7d5adf70e8737873995bc86611a90e643d7081ca35147f",
+ "rust-1.51.0-aarch64-unknown-linux-gnu": "fd31c78fffad52c03cac5a7c1ee5db3f34b2a77d7bc862707c0f71e209180a84",
+ "rust-1.51.0-aarch64-unknown-linux-musl": "06cdaa1117dcdd392ede938b655b9bc45cf2a76bd42870ca223189e6eb29d435",
+ "rust-1.51.0-x86_64-apple-darwin": "765212098a415996b767d1e372ce266caf94027402b269fec33291fffc085ca4",
+ "rust-1.51.0-x86_64-pc-windows-msvc": "aa0a7c78c68a2f23b72a95976f74aa5b883feb20812698b8ee0b07a86314ebc5",
+ "rust-1.51.0-x86_64-unknown-freebsd": "d764ab80889460caca86cda7b7ca2ced80544bb477634adc8cade0e27f4f663b",
+ "rust-1.51.0-x86_64-unknown-linux-gnu": "9e125977aa13f012a68fdc6663629c685745091ae244f0587dd55ea4e3a3e42f",
+ "rust-1.51.0-x86_64-unknown-linux-musl": "cb65c3a19ba0e09a94ccfd8551e648efaa1db52b0db19ae475d35a46f8750871",
+ "rust-1.52.0-aarch64-apple-darwin": "3aa15896dd85d1746a23af1b9764b55edb3659823ec20f306a5f30271c6bac5d",
+ "rust-1.52.0-aarch64-unknown-linux-gnu": "d37152f9da1074cfa84407ff183ce0dfb298f2e474d5b0ae3a3065d44c442770",
+ "rust-1.52.0-aarch64-unknown-linux-musl": "af73b6e9a99151f60569411fedcf5dfefb89bbec61548a2b4a8157874da77816",
+ "rust-1.52.0-x86_64-apple-darwin": "18906ea9ef6d7afc493f0c4403ece9fb466b0971db8d37d837864676ef9b077b",
+ "rust-1.52.0-x86_64-pc-windows-msvc": "53ad54808b1320aff5cc772f007a7f6570afceeb9c5b70b4b09fec9363610d59",
+ "rust-1.52.0-x86_64-unknown-freebsd": "f0610d69f18f861b72240cd6d42dae43adf932eadc24619a48e5a9363f719cdb",
+ "rust-1.52.0-x86_64-unknown-linux-gnu": "c082b5eea81206ff207407b41a10348282362dd972e93c86b054952b66ca0e2b",
+ "rust-1.52.0-x86_64-unknown-linux-musl": "56e36a3e626dca9eb65a07109ecd65e0454d9882124a6cda66ad21e78b82f627",
+ "rust-1.52.1-aarch64-apple-darwin": "217e9723f828c5359467d69b363a342d702bdcbbcc4107be907e6bc4531f4912",
+ "rust-1.52.1-aarch64-unknown-linux-gnu": "17d9aa7bb73b819ef70d81013498727b7218533ee6cf3bd802c4eac29137fbcb",
+ "rust-1.52.1-aarch64-unknown-linux-musl": "f2bae2b32f05a90eec041352d9329deb3e907f5560b9fda525788df3b8008b6b",
+ "rust-1.52.1-x86_64-apple-darwin": "cfa73228ea54e2c94f75d1b142ea41444c463f4ee8562a3eca1b11b2fe8af95a",
+ "rust-1.52.1-x86_64-pc-windows-msvc": "c03fb39f39519abd65ce792cc3d2c038b6c4179089d21f9e26933b93cde402d9",
+ "rust-1.52.1-x86_64-unknown-freebsd": "74e8386d2a9b1363ac8f5b0637e4c38a305d4706babda5222801c5ec9d5a2e6d",
+ "rust-1.52.1-x86_64-unknown-linux-gnu": "617ae06e212cb65bc4abbf52b158b0328b9f1a6c2f822c27c95b274d6fbc0627",
+ "rust-1.52.1-x86_64-unknown-linux-musl": "c3eae6e78ee29e03416897f89b54448b2a03d063f07a78cde41757ad2e02c2f0",
+ "rust-1.53.0-aarch64-apple-darwin": "c519da905514c05240a8fe39e459de2c4ef5943535e3655502e8fb756070aee1",
+ "rust-1.53.0-aarch64-unknown-linux-gnu": "cba81d5c3d16deee04098ea18af8636bc7415315a44c9e44734fd669aa778040",
+ "rust-1.53.0-aarch64-unknown-linux-musl": "a0065a6313bf370f2844af6f3b47fe292360e9cca3da31b5f6cb32db311ba686",
+ "rust-1.53.0-x86_64-apple-darwin": "940a4488f907b871f9fb1be309086509e4a48efb19303f8b5fe115c6f12abf43",
+ "rust-1.53.0-x86_64-pc-windows-msvc": "4690fb3ff390eef30eca4b3b9193a74e0e00ef18f2d89b7981753aaa9b36d787",
+ "rust-1.53.0-x86_64-unknown-freebsd": "f87eee8fabffc5800d5285ce2116e9c0f39340fed4a3c77eeb9fbbf7659b25c4",
+ "rust-1.53.0-x86_64-unknown-linux-gnu": "5e9e556d2ccce27aa8f01a528f1348bf8cdd34496c35ec2abf131660b9792fed",
+ "rust-1.53.0-x86_64-unknown-linux-musl": "908b6163b62660f289bcd1eda1a0eb6d849b4b29da12546d24a033e5718e93ff",
+ "rust-1.54.0-aarch64-apple-darwin": "801b3b15b992b0321261de8b8ea2728e9a74822c6cb99bf978b34e217c7825ba",
+ "rust-1.54.0-aarch64-unknown-linux-gnu": "33a50c5366a57aaab43c1c19e4a49ab7d8ffcd99a72925c315fb1f9389139e6f",
+ "rust-1.54.0-aarch64-unknown-linux-musl": "49d94116a357ea13f5a3231de2472f59210028c3cf81f158b8a367c3155ac544",
+ "rust-1.54.0-x86_64-apple-darwin": "5eb27a4f5f7a4699bc70cf1848e340ddd74e151488bfcb26853fd584958e3d33",
+ "rust-1.54.0-x86_64-pc-windows-msvc": "1c01182f8d9ef1295eacf58e5b7ba2e3183d768b91f7f650a7421808779068a0",
+ "rust-1.54.0-x86_64-unknown-freebsd": "026a40470b9fddfbb4abff3546e620eceaa2812ffc13e180bbb9360c01501a16",
+ "rust-1.54.0-x86_64-unknown-linux-gnu": "350354495b1d4b6dd2ec7cf96aa9bc61d031951cf667a31e8cf401dc508639e6",
+ "rust-1.54.0-x86_64-unknown-linux-musl": "3571db0018fcd32f3b579a32b2301826dbd1cce44b373aed8e8a31c2a6f52fe8",
+ "rust-1.55.0-aarch64-apple-darwin": "70c71d30d0de76912fcd88d503a6cb4323cfe6250c1a255be7e0d4e644b3d40a",
+ "rust-1.55.0-aarch64-unknown-linux-gnu": "eebdb2e659ed14884a49f0457d44e5e8c9f89fca3414533752c6dbb96232c156",
+ "rust-1.55.0-aarch64-unknown-linux-musl": "2ce36a7d34f1f2aa43b4cbc0b437d96eefb45743828bf9ae699ff581ae257f28",
+ "rust-1.55.0-x86_64-apple-darwin": "2e345ac7724c192c9487a2c6bd4f6c52c884d791981510288830d27d9a0bf2f3",
+ "rust-1.55.0-x86_64-pc-windows-msvc": "c7f21e819d883306c3a06115b4d46a92c7310aed655a2f19b40c457a6f06ba62",
+ "rust-1.55.0-x86_64-unknown-freebsd": "7ddb8ec4d431f64dd6428df93d46f726516970b0ca83c71c3efbfe34a42d3113",
+ "rust-1.55.0-x86_64-unknown-linux-gnu": "2080253a2ec36ac8ed6e060d30802d888533124b8d16545cfd4af898b365eaac",
+ "rust-1.55.0-x86_64-unknown-linux-musl": "f24f68587253c4bfbe59d3d10fe4897068d9130538de6b2d02097a25718030c2",
+ "rust-1.56.0-aarch64-apple-darwin": "31b7e9c8b4ac3133b1952d1278077fa45250e26758625f972f9b2f4e2426709d",
+ "rust-1.56.0-aarch64-unknown-linux-gnu": "f3e9a9c8af7d17a2fbe0ce561a7dc42f65c5444025783f1f63cd47960a534a9e",
+ "rust-1.56.0-aarch64-unknown-linux-musl": "a97c8f305c0dd07925a00f90e135152769f1c97442874691ffc865602209066d",
+ "rust-1.56.0-x86_64-apple-darwin": "577faef3f118a4a259e5e61a415b06434081baeceeff7bbf2357456cfc5b8735",
+ "rust-1.56.0-x86_64-pc-windows-msvc": "7ebee9ae583d0723d945fe89244fbc6f51f8723d318a2be9bcbe1e4ffc33606f",
+ "rust-1.56.0-x86_64-unknown-freebsd": "e31a47ecdd223ef7c84fc50d2c51343f8a3e54d419b04e17d143bd81ed587a7f",
+ "rust-1.56.0-x86_64-unknown-linux-gnu": "5189cd56447f9d56fcd7a1966efe5a8efd19843fdfd6bf9a23a9acbc57b5e3f9",
+ "rust-1.56.0-x86_64-unknown-linux-musl": "6ad1c6fa11e3bce86368385d0b0512d723a426fa55bcaeafdab08d03f127275d",
+ "rust-1.56.1-aarch64-apple-darwin": "e71c14c1368048a22e4d1851f301872ac2e6f4c574f04d2a7ae4d64b0e7c7235",
+ "rust-1.56.1-aarch64-unknown-linux-gnu": "69792887357c8dd78c5424f0b4a624578296796d99edf6c30ebe2acc2b939aa3",
+ "rust-1.56.1-aarch64-unknown-linux-musl": "971d13d41657e50e3ac54f17f52b4198c3d8bc25ec489a6a9e6d12c18226dda5",
+ "rust-1.56.1-x86_64-apple-darwin": "8d65ef02a123c23be00101fb204d28b60498b9145dd2ee8edabf0afde6e01e55",
+ "rust-1.56.1-x86_64-pc-windows-msvc": "b39acf48e5d73279ca9485f50e6ec16c16fcef922eb17f2921ce807df11d3e5b",
+ "rust-1.56.1-x86_64-unknown-freebsd": "94e2c8b44af125ca8ba1a1ded7e7b9c5acb27e52acec4ab483d5ed9a8528c5a9",
+ "rust-1.56.1-x86_64-unknown-linux-gnu": "a6be5d045183a0b12dddf0d81633e2a64e63e4c2dfa44eb7593970c1ef93a98f",
+ "rust-1.56.1-x86_64-unknown-linux-musl": "3c09058d104d9a88943fb343af1fb70422f9c4a987e6703666ee8a8051211190",
+ "rust-1.57.0-aarch64-apple-darwin": "7511075e28b715e2d9c7ee74221779f8444681a4bb60ac3a0270a5fdf08bdd5a",
+ "rust-1.57.0-aarch64-unknown-linux-gnu": "d66847f7cf7b548ecb328c400ac4f691ee2aea6ff5cd9286ad8733239569556c",
+ "rust-1.57.0-aarch64-unknown-linux-musl": "91c8e5171e5715261f7f635142a10a9415a4e5ba55374daf76f0b713c8b08132",
+ "rust-1.57.0-x86_64-apple-darwin": "15ceffc4743434c19d08f73fb4edd6642b7fd8162ed7101d3e6ca2c691fcb699",
+ "rust-1.57.0-x86_64-pc-windows-msvc": "566374ae6c9f487726932f4d4ef3c9000147574f30365cfda265cbfd0c4ea5c6",
+ "rust-1.57.0-x86_64-unknown-freebsd": "ebe96fa1f15e8d70c91e81aab7e0c341717b909225029f37d52fbdfa506e3fab",
+ "rust-1.57.0-x86_64-unknown-linux-gnu": "ea0253784b2e5c22659ff148d492a68d2e11da734491714ebc61cc93896efcda",
+ "rust-1.57.0-x86_64-unknown-linux-musl": "56876ebca0e46236208c8bd3c3425dba553abe49639e1040ee8b95bc66a45d33",
+ "rust-1.58.0-aarch64-apple-darwin": "6fb564f03dc09fd0ede8cdc35803b9efdd0ee3b3769c392c63167f863e9512ce",
+ "rust-1.58.0-aarch64-unknown-linux-gnu": "38fafc97700dcb1d205d3db7d86e9eb404577ccc4054333f41ec52d508394043",
+ "rust-1.58.0-aarch64-unknown-linux-musl": "787655adcaf004cc1f6a438881a3964ec20fffa682b46418a2a87b564548d80b",
+ "rust-1.58.0-x86_64-apple-darwin": "1f35e32a70ced5019fef45d1073d8ac25c0c2f91537b2b3592e041542f582b84",
+ "rust-1.58.0-x86_64-pc-windows-msvc": "c15f4ac3ef3a3833b6394f3f102cc7896a82107d68c2f398aab2bfd70fbb096a",
+ "rust-1.58.0-x86_64-unknown-freebsd": "ce69d9e2b7f60d7805d7759f112a9a3d2c608715242041e7fecea033d557bab1",
+ "rust-1.58.0-x86_64-unknown-linux-gnu": "1d7ec4bceb0d31f163540fe7ebebed68ca8853e7982821108770eaec5d66f871",
+ "rust-1.58.0-x86_64-unknown-linux-musl": "d1d04e4c5a3299c1d4b3eac8785f7b77c23d4ed32da3c3f77a1e39d90264b386",
+ "rust-1.58.1-aarch64-apple-darwin": "00b44985bc87e53c53d92622fb10226f09e9f25c79db48a77c0a769a36f83b1e",
+ "rust-1.58.1-aarch64-unknown-linux-gnu": "ce557516593e4526709b0f33c2e1d7c932b3ddf76af94c2417d8d667921ce90c",
+ "rust-1.58.1-aarch64-unknown-linux-musl": "b1533fdeeda483a3633617fd18a79d8fad7821331614b8dc13efd8b22acc30f5",
+ "rust-1.58.1-x86_64-apple-darwin": "d0044680fc132a721481b130a0a4282a444867f423efdb890fe13e447966412f",
+ "rust-1.58.1-x86_64-pc-windows-msvc": "93cebf7a895420b3763dbc808c0772ef814add757eb689abe1da3690e876447f",
+ "rust-1.58.1-x86_64-unknown-freebsd": "124d056c3af35bd9a42c6ef3529c73a6b29b1d927f5498cec499e16ca4defe63",
+ "rust-1.58.1-x86_64-unknown-linux-gnu": "4fac6df9ea49447682c333e57945bebf4f9f45ec7b08849e507a64b2ccd5f8fb",
+ "rust-1.58.1-x86_64-unknown-linux-musl": "7036e34eadc8ce22d16b0625919d9f2244ca49a5441d6599f4822116c181d272",
+ "rust-1.59.0-aarch64-apple-darwin": "5449ae915982967bae97746ce8bea30844f9ab40b4ee4da392b9997e0e7b2926",
+ "rust-1.59.0-aarch64-unknown-linux-gnu": "ab5da30a3de5433e26cbc74c56b9d97b569769fc2e456fc54378adc8baaee4f0",
+ "rust-1.59.0-aarch64-unknown-linux-musl": "a3f8afdf23c98e6d25bf3b4bfcf5e9a4712f4c425f3754500931232d946204a9",
+ "rust-1.59.0-x86_64-apple-darwin": "d82204f536af0c7bfd2ea2213dc46b99911860cfc5517f7321244412ae96f159",
+ "rust-1.59.0-x86_64-pc-windows-msvc": "d781bfed7e3e5dc4959ce39df101fc476a3a70ab75e2fa1bbc3e59281f6e9e00",
+ "rust-1.59.0-x86_64-unknown-freebsd": "83f9c49b6e9025b712fc5d65e49f1b6ad959966534cd39c8dc2ce2c85a6ca484",
+ "rust-1.59.0-x86_64-unknown-linux-gnu": "0c1c2da3fa26372e5178123aa5bb0fdcd4933fbad9bfb268ffbd71807182ecae",
+ "rust-1.59.0-x86_64-unknown-linux-musl": "c0ae76fa4bb0f1c85b86b9f7637db0fddf5084ce4c8f86c4d4acc3c41813201f",
+ "rust-src-1.26.0": "d02fe6fd5c0f330656e9ff0a290ebf23cab7c909f96ce1838247fadc117eb1dd",
+ "rust-src-1.26.1": "19ef8113ae53ec7ea8f6772a5c9ce5a3dfc28b1bddd800841fb5bbec33fa3619",
+ "rust-src-1.26.2": "d63cb7ca67f1bb2101898b7ca33105eeb6d9d9cc3e7ff566b90b0321ec448e73",
+ "rust-src-1.27.0": "9a60d9f0c586a537129a741576370b90d9cce1999b4aa2623d5c1d9c3fdf5a73",
+ "rust-src-1.27.1": "8736577a84bf7263d333996b21ec49697a4a942ab1b5f6d1327241866481cdc0",
+ "rust-src-1.27.2": "03b4b09d855b2c393508f1e5d11c2cba147112a534193e62d6cb54e2b5a631f1",
+ "rust-src-1.28.0": "99ee2a227f27bf0136e7bc53790ef5e02ad9744a56f488b77579403b281b1d63",
+ "rust-src-1.29.0": "6f1a4457d2e75d2b3d3dda1f05e6ff5f37c4c416d25733cb3b008cad99247a42",
+ "rust-src-1.29.1": "89bddeeb0b38ec2715e287a4827179fc975d69bd6d223b05199321e9c0de8313",
+ "rust-src-1.29.2": "47b1ed6d19d5a14f20c1723218fcf073c3f790aceb780ffae9209c1a480f5b81",
+ "rust-src-1.30.0": "27e806396aa5ce2466929e06106a23b456a63f9dee2e9c378da326f1f88e6570",
+ "rust-src-1.30.1": "16dc694d49b22a58e766dfa5812d84000a6197cc6b1f1f7b4e553be8d9427d85",
+ "rust-src-1.31.0": "121909b2428487a31d6bef4ff92f6d63967b225310632fc60570874ba392feb1",
+ "rust-src-1.31.1": "097550782be7f201a44b842b74c6c2ec6851495454ada2d9ee693a8af4cdbc6a",
+ "rust-src-1.32.0": "6ece16e38b969606a5da8def53cae55d0c67d8502261086afbd5e303013ce92b",
+ "rust-src-1.33.0": "48b28b0cd9badcef24f1525b6a225db9018924567d6a998ae891996dc843fb22",
+ "rust-src-1.34.0": "6fe16aae312d3be5e0fec93e52918b7b03e0920e7d6d3e552a4fdd740556c4e9",
+ "rust-src-1.35.0": "7547d1e9a7ed236860e0a1ed7b9e428941fad7ff9bd3888e19db7e7a5fd53e38",
+ "rust-src-1.36.0": "c0099d763779ef095fcd32531a88a2af714670ec0b64f7b27aa027b2f51057b0",
+ "rust-src-1.37.0": "30e7bb28725b86b53b7dfe23ba4f3119889c30e38930f7c2dfdc74b1f62704a5",
+ "rust-src-1.38.0": "082891ceb8547c4a0fbadcd1309fb0219b935f3dc5a38d2b3b77f40a670a0a54",
+ "rust-src-1.39.0": "068186f866703ffeae804a0642588a78a492f03b62c0113e6cdfcb4eeca56df6",
+ "rust-src-1.40.0": "2a9be624ba682f1331cc4d764e161a1b18e007ded34ffcb1494804bc24e0fd62",
+ "rust-src-1.41.0": "6597a1f217c6a9cfcf41e34bba91d8d98b6736ab6a18b54ed2db1ce5634e176a",
+ "rust-src-1.42.0": "56d809eb9efb70e9444be88bd8e3ff54d94ab5fef24b13d5b17a75309190d84e",
+ "rust-src-1.43.0": "7999fad1e60609f76ebe589cab48451e35ecd54d5336bf70dfb0eb57c78e8bb7",
+ "rust-src-1.44.0": "6f748c303431126827fc3f262ba05ece2456e274eafeb9bd0b40bdf27c5f99da",
+ "rust-src-1.45.0": "96590b0a987098da05d38f8e3bb5e049a77c20f03689ffb7144f23136fd488b4",
+ "rust-src-1.46.0": "7478839072096041220c6ca9cc9031028cdf65fa8cb5bcf87178ea1351442bdc",
+ "rust-src-1.47.0": "64b27ba31f8956342e8ace0f949d06524d7013bf73bfbe6f9d18ec19e5a0c793",
+ "rust-src-1.48.0": "e8f15bdfcb5ced76ae40dd9aa6b387d5f9cece82b7a340cdcaa353fbc94f53da",
+ "rust-src-1.49.0": "474a0fd0c1da720eb9fa701c73ced702a7599eb265333a18c1b25feeb9566f8e",
+ "rust-src-1.50.0": "678e140e88656f19a49aa802eb6e1ea117a520c6f3eb0da265a7dc6e0c012a9c",
+ "rust-src-1.51.0": "18904ca04c5bc09fa1a88d32391c611bc60bc3a739551496cad0829e34301563",
+ "rust-src-1.52.0": "861dcbf1faf2faca5b5e3afea5bbcf453cbda4ae00bd34ae67bfc36463f9e227",
+ "rust-src-1.52.1": "34fb417e94aadbace368e934e1f079dd09f2423ccd6cc0cc519cdd55ef3fa8bf",
+ "rust-src-1.53.0": "26b1464bd313ae99de27a162ca96b4fb321e4414448ea8ce8abd715ef8c7ba2b",
+ "rust-src-1.54.0": "56d14ee97c59c543291154ab427cf96a1a82ef5cf32b89f14886dcfc01f5310b",
+ "rust-src-1.55.0": "3be79e301246b413e9e1cc4b5b4f53bcbc964482005381a899ab6c597bef7996",
+ "rust-src-1.56.0": "00c2225d0e1d430b1632373c46448b1b69839032b8384684091bb9cce19b2ce6",
+ "rust-src-1.56.1": "be4757c283f94a37cf38b9897f5513ebe3e2f4ef15f013630cdb845987324503",
+ "rust-src-1.57.0": "cc1fa22e939b14a6952deb7547fcfafa6670e727f942fb4ef77075d8e58e45a6",
+ "rust-src-1.58.0": "c91bb6df4ebbfea42a1c3940e38bc1c2c4768efbdada8205b12f6d9d383ee219",
+ "rust-src-1.58.1": "e7bb7325e5e71411aabfbd251acfd131d1ad6d9aee2b65d04b081702915cfe4f",
+ "rust-src-1.59.0": "127658a5237cce6dd43ce9d9113fc104ea6902cc8c850272fba07d92140fab12",
+ "rust-std-1.26.0-aarch64-unknown-linux-gnu": "a583ddc2d4b5f9516bf136f781268ae0e813295d1d145fab4b46a4220f448923",
+ "rust-std-1.26.0-aarch64-unknown-linux-musl": "6a112ecd4cdefee2688bf69fdceb785a4d08cea33ba32296539abe3cb7f5eae1",
+ "rust-std-1.26.0-wasm32-unknown-unknown": "0f8bb8bdb523cd05acd11006d47b14d7589e64fe25a43d1aec5df692988b400f",
+ "rust-std-1.26.0-x86_64-apple-darwin": "cb5a0114e9e383aa93267868482db84f791124ee4faafdaed08ec6782d000fc2",
+ "rust-std-1.26.0-x86_64-pc-windows-msvc": "88ae8697a84cfddc72429fb0880e6d8663d99ab98a69d27c06d21b4e668b13d9",
+ "rust-std-1.26.0-x86_64-unknown-freebsd": "38cd138eba2ccaff59513d154fec580b6663ca6ef38cd620c348364aa1e11a40",
+ "rust-std-1.26.0-x86_64-unknown-linux-gnu": "e27cb5c21541a500c8df919e15c8d3b002456ebbe573122e7b058cf5b4c3c13a",
+ "rust-std-1.26.0-x86_64-unknown-linux-musl": "943886ce013589b6dd9c9392c807881631cab4a8e04acc83e3a047134a9294f5",
+ "rust-std-1.26.1-aarch64-unknown-linux-gnu": "34077f14d1e8c9ce96a9c72e95599326187bd460b88f877794a8c19f9e1b56b4",
+ "rust-std-1.26.1-aarch64-unknown-linux-musl": "d4435fa89ff7575d8d70114a5841bf70d699294db707512d6f4f4d0a073b237d",
+ "rust-std-1.26.1-wasm32-unknown-unknown": "98af245301a921042997a433a618f58ae27b52340ad71c5502ecde7f29db79f9",
+ "rust-std-1.26.1-x86_64-apple-darwin": "d43e06674e645e120af6716e6d0db5771fa8818b5a48fbee9791360086cdec4a",
+ "rust-std-1.26.1-x86_64-pc-windows-msvc": "5223b7dde5b96d278072b4541fdffb7d33c64950af643eba385928763aca32bf",
+ "rust-std-1.26.1-x86_64-unknown-freebsd": "1d63cc1f6dc6dfa2644619cd8c264c3d1be0fe5c44c5454e8ea04bd7beb036fb",
+ "rust-std-1.26.1-x86_64-unknown-linux-gnu": "cc7cec9a121a97e8e23c350305a0e4cd4e3b475fd5a36fa6335a585d3c511f0d",
+ "rust-std-1.26.1-x86_64-unknown-linux-musl": "9d6a4191ad8ddfae10a05882cd0e867ecc2b64d26da2f38fbdcbdcbcf94139cf",
+ "rust-std-1.26.2-aarch64-unknown-linux-gnu": "6f629b8c3ef8aa4a6c9439a5c1d8719905853f321a1080bb9f8a8356a1b06364",
+ "rust-std-1.26.2-aarch64-unknown-linux-musl": "d70817352ebe34fab475ef3cd79ccbd56cf20e3b9ae0b34a285dd1c966bf2bde",
+ "rust-std-1.26.2-wasm32-unknown-unknown": "260e3267451c8098ac069376e2f4320e129ccec79602086a77f0798499cb5b3b",
+ "rust-std-1.26.2-x86_64-apple-darwin": "712a79cd10b96c7119980e535a36595e03c69a360f1541f690c09de858d92723",
+ "rust-std-1.26.2-x86_64-pc-windows-msvc": "41036c06e00ba038c5ec3940608370e93c6b9a731019d0349841fa78bc8ea125",
+ "rust-std-1.26.2-x86_64-unknown-freebsd": "f54b58bf941d794ee10ab7ee9e1c94a70012073b0ee633ec2be585b1be2e31de",
+ "rust-std-1.26.2-x86_64-unknown-linux-gnu": "91634f05bf2d0a20e627aed08a8450673acecb963869273221de17130540fb26",
+ "rust-std-1.26.2-x86_64-unknown-linux-musl": "5ba536ccc53bf550d7ae3f032cc743b2f13c1ac92e3be45f0843762ed8aa4ca0",
+ "rust-std-1.27.0-aarch64-unknown-linux-gnu": "a32ff8d2ab75a229b73076182978e8b97ac1c5447b9446b1d253685ef31652ec",
+ "rust-std-1.27.0-aarch64-unknown-linux-musl": "e64ee59e3c113483714c563a567532eba46c96ff7e7f3982e88fecf03d0c1cae",
+ "rust-std-1.27.0-wasm32-unknown-unknown": "aa1afca259ecbee3cf65368e8f9d5e9a0d8ea86be30edf4ecfedecc1db110380",
+ "rust-std-1.27.0-x86_64-apple-darwin": "15ee6418f9b564618e9c81a6dcd7706a2f8ae5ca24fd1b6d7527c97563a47e57",
+ "rust-std-1.27.0-x86_64-pc-windows-msvc": "77c9102d192ed2dda7128dea4e60992d1135c50b85f0ef8e989f0fda3ed3b73c",
+ "rust-std-1.27.0-x86_64-unknown-freebsd": "6e307cc3798b50b37beb9ff43e88b12fb565ddaf051925fffa35bfbeb091d660",
+ "rust-std-1.27.0-x86_64-unknown-linux-gnu": "b8cf36922315ca792929d515327c74b873358a64be4929b2ecfbe23af21e8043",
+ "rust-std-1.27.0-x86_64-unknown-linux-musl": "166b5286de202feebfbbfea18f2cc06b0a945dd7687985d6a14b3c811b18b202",
+ "rust-std-1.27.1-aarch64-unknown-linux-gnu": "00a553c4b5869db1acc4f5fb1f6f954893db507ae01ed754bb8654f8916588e9",
+ "rust-std-1.27.1-aarch64-unknown-linux-musl": "aabf69e0ed8a0a45a1dd7c52bf532cff37ab00c1aa5cd1555ca57e4fee9dc64d",
+ "rust-std-1.27.1-wasm32-unknown-unknown": "e16cfda8a8eb29c81d34ea3ca7b4c0815b46ddb85814cbf68320f2666ef44d78",
+ "rust-std-1.27.1-x86_64-apple-darwin": "a521599355e564984e43a63042b1de93dd7cf96730930501f86611dd766384e8",
+ "rust-std-1.27.1-x86_64-pc-windows-msvc": "4745f31711f18e06859946b932909a26d4593552c6631c5710e72d3da26f06ab",
+ "rust-std-1.27.1-x86_64-unknown-freebsd": "12902b61a4897ade258217f045dfac3fe83d49dd52d1e2250bd94c3a10642b08",
+ "rust-std-1.27.1-x86_64-unknown-linux-gnu": "9a1830b522117d68eeec703b50692093352212e035a46baceea666bb37739c2d",
+ "rust-std-1.27.1-x86_64-unknown-linux-musl": "c387d462fc07d4bace1355cfca70b68ff263432614cbe7c66d53ac25e1a47161",
+ "rust-std-1.27.2-aarch64-unknown-linux-gnu": "39bafd1db4f1e881cdbd8d81b757bfef1cad6c06f6aa4514f8b693d997764e2a",
+ "rust-std-1.27.2-aarch64-unknown-linux-musl": "5e8e6d5368ece8c822991c8b4437e83d0537f253cb70b39d627d17f012813122",
+ "rust-std-1.27.2-wasm32-unknown-unknown": "59ad2323afe090c43e41dce482a4abed1473a7997db5db2ee236d49eac208b70",
+ "rust-std-1.27.2-x86_64-apple-darwin": "eed3688d9f551066593b34f07e4d28846caa99624c2168387993acc6bddd003d",
+ "rust-std-1.27.2-x86_64-pc-windows-msvc": "f5dbee42f3fde455d79e759a4854da78a650df3bcf27f194da78670feb11e10a",
+ "rust-std-1.27.2-x86_64-unknown-freebsd": "6051f8bacbfbd2c3dceeddab8c66274bed7ef260cf346d367c53495cd1567572",
+ "rust-std-1.27.2-x86_64-unknown-linux-gnu": "68984f2233853d3e9c7c56edd72a91b5822157f28fdb42023fb311af68f842dd",
+ "rust-std-1.27.2-x86_64-unknown-linux-musl": "2ef23cad3779c8ee7abf7cbe7d93b0faa1ffd87e1ef5a378aa9ce566cd1b7644",
+ "rust-std-1.28.0-aarch64-unknown-linux-gnu": "9ba698f68c5643f53934e1085af40c79c6d1b3bfa01ca6dcdffdc5eec8f44cc0",
+ "rust-std-1.28.0-aarch64-unknown-linux-musl": "b1acdf055d534f4ce295271fe6101833c65261aeb52ffb619911a4db3de35663",
+ "rust-std-1.28.0-wasm32-unknown-unknown": "33f9b2d3f568859db28ab32ec4dd388390d408f6204ab44886eec04cc08af843",
+ "rust-std-1.28.0-x86_64-apple-darwin": "bd1b5110d35383349aafad904431d55656b13a3c02ed3b2020d2038557735ab9",
+ "rust-std-1.28.0-x86_64-pc-windows-msvc": "876d68628e6e91113117516621ae4773cdbebdaab1e899d3ec83c612683947b8",
+ "rust-std-1.28.0-x86_64-unknown-freebsd": "1fabaf71d21c1cdcddfb564950152ef862b519a175f7ee88d7e22bab31c4733e",
+ "rust-std-1.28.0-x86_64-unknown-linux-gnu": "c5aed4c7ef362b5754526d26acaccdc9300942fd12e5cc67cc56fc89576a9dab",
+ "rust-std-1.28.0-x86_64-unknown-linux-musl": "caea8f24197232c25de0e387567af452e0d57b9103ef8acef167814f9acda08c",
+ "rust-std-1.29.0-aarch64-unknown-linux-gnu": "72c0ab49bbdbf819da5018b620aeed22d34af558f4db9598059cb253fc6adec3",
+ "rust-std-1.29.0-aarch64-unknown-linux-musl": "63f9cef857800feae763ba5356f1aa67b6d2d5c8c13e03378d79014e41eacf17",
+ "rust-std-1.29.0-wasm32-unknown-unknown": "83449101356a3ae4abf8597913602b1c79dd76cc52bca7a6a3a9f4fdabc565d5",
+ "rust-std-1.29.0-x86_64-apple-darwin": "7fca06854f7c63d1d0da7c46c816af5dd23eb8010603b8cf3f07a61b162f02ae",
+ "rust-std-1.29.0-x86_64-pc-windows-msvc": "b05d04c684e070a820a0a3dc1128a24795895aecf25f6ffa0d68150e6209e424",
+ "rust-std-1.29.0-x86_64-unknown-freebsd": "a59a50a60b033c00cf36c3b8039f300b2997245c21f2d02074f9d3157b54b353",
+ "rust-std-1.29.0-x86_64-unknown-linux-gnu": "0bed2fcba596e1af6f56ed3f5d481b89b28a4ac26aea07128c6630c00c6a136b",
+ "rust-std-1.29.0-x86_64-unknown-linux-musl": "f45012af49d05990b0917c465a7986be466d2dcf6fb82100903ba0dc7f63469c",
+ "rust-std-1.29.1-aarch64-unknown-linux-gnu": "cf192e05192f79961b9f9e834e19c8b71654ac98b239408a6815d07ff2a96f19",
+ "rust-std-1.29.1-aarch64-unknown-linux-musl": "fa2f496ee03bff273eb88726e1faa2cbd6156b33ca19acb5e3b2f4c687a5594b",
+ "rust-std-1.29.1-wasm32-unknown-unknown": "48f31123614b5e0799200e0db640ff05c7236d0b6940bedf4043d5d19a2b22df",
+ "rust-std-1.29.1-x86_64-apple-darwin": "9c31fba3bfb816cf6aa8d9d4c3e7f235233035ada95417e130de8487faa507d3",
+ "rust-std-1.29.1-x86_64-pc-windows-msvc": "cb7825c2a1fa46696a429fc7e6afd3f2b396d1467a6e4b5f850ff8dedd73ac1b",
+ "rust-std-1.29.1-x86_64-unknown-freebsd": "aad9e36766284656449dad75cc1c77c7b86da99abfb0ec424689101679aa8a43",
+ "rust-std-1.29.1-x86_64-unknown-linux-gnu": "d05ddae0f05d721de00bf6e40f85f1ccdec902f864b9647e2e1cb08a8202d513",
+ "rust-std-1.29.1-x86_64-unknown-linux-musl": "7ef498c2c817afc7843d301431015931323af1759d325f46b4379bf4dccec331",
+ "rust-std-1.29.2-aarch64-unknown-linux-gnu": "f64b051f0b293ee66d7556231dcd70d143525bf6d0b2afc6fae945bf1ffd8073",
+ "rust-std-1.29.2-aarch64-unknown-linux-musl": "660dcc5252db28a3d46712606a299001fd9a0fe1f27333a88269ab4502315c43",
+ "rust-std-1.29.2-wasm32-unknown-unknown": "e8317f0677a3d4ee3b4e5f2dffdf0cdb930c77da20676a32099fde477b439d5e",
+ "rust-std-1.29.2-x86_64-apple-darwin": "72cd953cb8ea05667f5d58f5c4ba615a564611a86303c0f8f9235e7a53852692",
+ "rust-std-1.29.2-x86_64-pc-windows-msvc": "5f2320e89946208b14a34d96a2bfc652bf1debe2bbf139fda19f7dc3a5f91694",
+ "rust-std-1.29.2-x86_64-unknown-freebsd": "ddde8a33ddd902471c51f273087d90e9f7f184b7f09f5d14cab454c8c4965ec2",
+ "rust-std-1.29.2-x86_64-unknown-linux-gnu": "1fe9a0f354256483a354ee1b51c60bf9f3f48868581f7cb36d0cc51a82400605",
+ "rust-std-1.29.2-x86_64-unknown-linux-musl": "7588af2d23b4e2d342476acfd5fb95dc399777142cf1fb39a6ef0a40d70437bc",
+ "rust-std-1.30.0-aarch64-unknown-linux-gnu": "0166650de5072545c3945416638dec9beec5ae1f3c72069e314b7c50e18b4819",
+ "rust-std-1.30.0-aarch64-unknown-linux-musl": "03ea73844f2963e1716661142a15fc39b8dc026b2654ababe009d31df4e78363",
+ "rust-std-1.30.0-wasm32-unknown-unknown": "e85afbc075e162e9af71795e1dc81fa0d2cf657dd10b74751f1769585321a20f",
+ "rust-std-1.30.0-x86_64-apple-darwin": "33f4a7574c82db1b1bc3f829d0fecf9047bbac073c305500ada4aeaa08272ca9",
+ "rust-std-1.30.0-x86_64-pc-windows-msvc": "7b493d21ac115dc4a1ef85cf0d8e73f688bda065c3abbdf68ff3674c122fb9e4",
+ "rust-std-1.30.0-x86_64-unknown-freebsd": "4040fe677524e2ead69a2fcab4c16acaad3d4c4f1210ae36f400f82463bdfbc7",
+ "rust-std-1.30.0-x86_64-unknown-linux-gnu": "8514eedc0ed99ab75c61be3137c3e57c4115063ddc07aec842f687ebfc7ceda3",
+ "rust-std-1.30.0-x86_64-unknown-linux-musl": "c2fbdb20b81992220002d1c8a4b76b9363711370cc62a42811d2980f9b5c8401",
+ "rust-std-1.30.1-aarch64-unknown-linux-gnu": "64410910d73628a77dfe94dbcd0cd49709b518b5f641fbe4a2476b9af097d47b",
+ "rust-std-1.30.1-aarch64-unknown-linux-musl": "0bdcb6fcf904d0b047d75e0368caf1d29380c62ba5c54254ca8ad777e1e7b5ba",
+ "rust-std-1.30.1-wasm32-unknown-unknown": "0892ab95cdfb0bee3c9981e4a5c69a88c0fc5fb7e0c206638291e91a4c794ee0",
+ "rust-std-1.30.1-x86_64-apple-darwin": "a13d4a748914056f34c2e8691b4ca8ab6d16bb04e6e5fafc22ca594789f4e8b1",
+ "rust-std-1.30.1-x86_64-pc-windows-msvc": "177d887593e29847a1bb7afeb7924c3958248a9ec8604e66671d8036e8fbf9b1",
+ "rust-std-1.30.1-x86_64-unknown-freebsd": "66c91d14d8d3c1523f9b5c52b81e4293ba5378fcf8b3e5d0ed52e96afe6bdd31",
+ "rust-std-1.30.1-x86_64-unknown-linux-gnu": "12c4b164efed44c28096fcd141225ee9bf74e7e3395bc6a60c11c9115a0536c6",
+ "rust-std-1.30.1-x86_64-unknown-linux-musl": "1965d586f74bacb3b7332621c1040aa51efd65393da86da6c5296dafbe57602c",
+ "rust-std-1.31.0-aarch64-unknown-linux-gnu": "02e5b48d8fff293a95b591646e707a8c61399ab6c244508ed842f3d736ded641",
+ "rust-std-1.31.0-aarch64-unknown-linux-musl": "3cedc72a9754219f1684e7037ed10866f0cd756d6ecfaffcd2ef8d57374f85b0",
+ "rust-std-1.31.0-wasm32-unknown-unknown": "ff284b10844cdddca786d85fc3be48796f7286a14350e807fa9912e7748634f0",
+ "rust-std-1.31.0-x86_64-apple-darwin": "7dd4bea941cde8a5ece3286ed43733503c092a8edb50c8c31223a738a526c246",
+ "rust-std-1.31.0-x86_64-pc-windows-msvc": "625e1dbb5996cb9845cb6c779e4a6353faa1e05535471fc00aff6a6f84efeab5",
+ "rust-std-1.31.0-x86_64-unknown-freebsd": "3779f0732ee8fdc1d81663172a72219d59b716e8cc5a6b07bf1d5dd744f74b13",
+ "rust-std-1.31.0-x86_64-unknown-linux-gnu": "fe67a62c7a63acbf2458a36d7689ef41903187a472f0c28850f1fca7ea478da8",
+ "rust-std-1.31.0-x86_64-unknown-linux-musl": "f3bdef5a9e4974296965b36ced9fa3375eb9e3c3d51a305d64b9be47fa2ae55c",
+ "rust-std-1.31.1-aarch64-unknown-linux-gnu": "cc32d23cc2995c4838ab2ed4e709ca9748f13f912e9fbbb7cc78c41dbc4de268",
+ "rust-std-1.31.1-aarch64-unknown-linux-musl": "3d48648a2dad8fb6e7d4eed2d7df14eb20c79e654bc1fe666ab408cebc6e8b72",
+ "rust-std-1.31.1-wasm32-unknown-unknown": "a9b1774a6aed9387b12244d2ac0ea047506ffffee67cd834148f01c66ed24e98",
+ "rust-std-1.31.1-x86_64-apple-darwin": "91c3b12614f9795ef2e0092010f247a38d09c95d4089f75b44fad14679bd1cfb",
+ "rust-std-1.31.1-x86_64-pc-windows-msvc": "e84c961261fe70da68dc56effbb277eadeac51fb5bdd2287a168cbe2ba2b1a2e",
+ "rust-std-1.31.1-x86_64-unknown-freebsd": "89e551403f70eed976ac1dd91c3effc9434ef450da4c347d24a141529f83a101",
+ "rust-std-1.31.1-x86_64-unknown-linux-gnu": "699664b3a64959a2d75e486e19e7cc9934cbcbf2c57a977dd2a2b33cff367da1",
+ "rust-std-1.31.1-x86_64-unknown-linux-musl": "ea622d3bc171a23f704440ea99e96023888425d0c3d90bc6fcc592c17e9f8f54",
+ "rust-std-1.32.0-aarch64-unknown-linux-gnu": "346efe3aef2aff7b71a611bf7661bcec5f9bc4025a599c2866ec5fd330247cb9",
+ "rust-std-1.32.0-aarch64-unknown-linux-musl": "ca67a0ae151de83e077b95dfca459ca2445db461c7e6428c11a32e23e8ea9525",
+ "rust-std-1.32.0-wasm32-unknown-unknown": "5da2824a9404204ce2a72b44961e2dd8854fe2232f65851c1a8ff5c59ef537d5",
+ "rust-std-1.32.0-x86_64-apple-darwin": "b736d035a97f830585360e54e3f8877b68c942211cf0a75e805f34bfb36103a6",
+ "rust-std-1.32.0-x86_64-pc-windows-msvc": "cd9693213bcc2ca0ff1490861d3b52703b65df6f678c3f2ae9ad3f3717e08871",
+ "rust-std-1.32.0-x86_64-unknown-freebsd": "d50f674379791a93764d383153ed6533cea165ede7f233df4e17563bfdab273c",
+ "rust-std-1.32.0-x86_64-unknown-linux-gnu": "9f2705a3ed3217c13fd55569406c52f590030752f57520312e135223ae930caf",
+ "rust-std-1.32.0-x86_64-unknown-linux-musl": "d69a44623be904b48c72adbe0141401c4c1068b4a45502328f9e219e0f833c75",
+ "rust-std-1.33.0-aarch64-unknown-linux-gnu": "26f13cd80c95d484ccffecf517f1e05ce521072a00f1adea43d02b3f9d37f82a",
+ "rust-std-1.33.0-aarch64-unknown-linux-musl": "47c7ed55b77e161c9489ca903be32be80dd0efdf88d55f472bb54cce832629de",
+ "rust-std-1.33.0-wasm32-unknown-unknown": "ea1662a05f89f9fb725cba851f6636316cd80052fed610e4912432e4ee523db1",
+ "rust-std-1.33.0-x86_64-apple-darwin": "94247d4d11c631c9d4256f4b0aedd7fd0379fdb55174405c4c1c0dd0c40097ca",
+ "rust-std-1.33.0-x86_64-pc-windows-msvc": "36d94915b8aa9d3207d31ce77bbb790685cb8263920f0873875ae433fcb8709a",
+ "rust-std-1.33.0-x86_64-unknown-freebsd": "8eec7a21a3368890fdf0b826e7bc1928775724c0a4bd14d86304cc7e48309237",
+ "rust-std-1.33.0-x86_64-unknown-linux-gnu": "661c2ba717ae1502f002b4c6e7aeb8941685c7ea8fe7ac26ed9ede26f615b7af",
+ "rust-std-1.33.0-x86_64-unknown-linux-musl": "c3c0bf38140f7108705bbeeeaebd3dd9e23f556d36796779100c8ecf9142da7f",
+ "rust-std-1.34.0-aarch64-unknown-linux-gnu": "d175e91206aba9e2056a9c5af50f700502e70b2f8eb609854d660ac2f3bf1fff",
+ "rust-std-1.34.0-aarch64-unknown-linux-musl": "2b08cf5b0fdd2cd71e7aece36587fb4869e53faace966eaddb2e2c5fb908eb74",
+ "rust-std-1.34.0-wasm32-unknown-unknown": "4add0e23d048309cd284096c36342a6c2307a293072ced9fceeb6a2a48f3797f",
+ "rust-std-1.34.0-x86_64-apple-darwin": "f5a4fa8e86e1d4483bbe80d0adb08a7f5e466d8173bb5ea596ee698c75d0fd19",
+ "rust-std-1.34.0-x86_64-pc-windows-msvc": "3037d196ac175595de3ddb3c8d26e9795e1765bb083a33da30d2b6afb5b03e17",
+ "rust-std-1.34.0-x86_64-unknown-freebsd": "c012bcf9ee417308fb53b97e58d753f90699bd516bcafd6cc83d6f0a54423f3e",
+ "rust-std-1.34.0-x86_64-unknown-linux-gnu": "6565dbe18ee9fa972058b17744ec1129c4fcbf797443f2e16b999df3870d6281",
+ "rust-std-1.34.0-x86_64-unknown-linux-musl": "57e65e5679e7bc00a5bad52de0375f81f91f2f2c3fb1d25af626e4aa4510d80d",
+ "rust-std-1.35.0-aarch64-unknown-linux-gnu": "eee3c6a5c7ef5bc21b626ce350b0e1b02310e0463b6686683262f3fef400746d",
+ "rust-std-1.35.0-aarch64-unknown-linux-musl": "518ba1fb0c0020856eb06ecf3d4d11b94b2ffb0b5f318aac9e086be9b0be2ccd",
+ "rust-std-1.35.0-wasm32-unknown-unknown": "14f1640b35fe351dccd54fc459dea6b7ea199324a723e6d3efc42d519adca99b",
+ "rust-std-1.35.0-x86_64-apple-darwin": "93a640d065d761b85b0f770dfa865b2f86a671a7fac0d5079e4cdc9e4e031011",
+ "rust-std-1.35.0-x86_64-pc-windows-msvc": "2d9091b4a78d7f86b9db5d086b0eebbc2afad4bf828cfbc4b2cc44af86f52210",
+ "rust-std-1.35.0-x86_64-unknown-freebsd": "22e8a2deb83dac920237f810b612b7ea555b03f5830f413a94d007ec683de519",
+ "rust-std-1.35.0-x86_64-unknown-linux-gnu": "5dfa92661ff1a22680785bd6999b6117ae66841e2bd9e5318eb97002956131e4",
+ "rust-std-1.35.0-x86_64-unknown-linux-musl": "c9ac131020d4a422191f1e55c66ca5b1bf1b768180cbc2e717eefefec049bd37",
+ "rust-std-1.36.0-aarch64-unknown-linux-gnu": "22bfc32b5003c3d5259babb202f3f66be16fa6f3c75c20f429a16d7ef5eb1928",
+ "rust-std-1.36.0-aarch64-unknown-linux-musl": "42778ab5f87d2dbfc6849fcf0c6e0a3760b18e8c89385130da0a1953d5fed147",
+ "rust-std-1.36.0-wasm32-unknown-unknown": "7fc1d9f19f6674f73fb89c24aeb741adc59896da6d7ce2e16317aa1fb084bea4",
+ "rust-std-1.36.0-wasm32-wasi": "382dd29fa294ef53272984b9121e07d2b50cc131c561bb7ab72bdebda3abc031",
+ "rust-std-1.36.0-x86_64-apple-darwin": "7c6806809e010e5fba1780007ecff5c31f0ad2fcac1b414b98ca3baa0fb41b36",
+ "rust-std-1.36.0-x86_64-pc-windows-msvc": "2ef035a156b7f20a06677f3873631833afdf9cf755af3fc9466c02d9725755eb",
+ "rust-std-1.36.0-x86_64-unknown-freebsd": "a2a923cbfa3481af66c22673cac38e7cb70e26333318ad59c27b8b6ac16a84fe",
+ "rust-std-1.36.0-x86_64-unknown-linux-gnu": "f92425592c02d4681a5c5ae43ac3ad7ddcc218da50fc651ddc5c2240843a7f31",
+ "rust-std-1.36.0-x86_64-unknown-linux-musl": "4d36e7b52839cff72481b2b1858417f382be36ffa5f084f72f35c1a9117c94ea",
+ "rust-std-1.37.0-aarch64-unknown-linux-gnu": "60d64dde9178fdb698b44315b182375916116e30f5fe7f0d8278dd62eb15e7b3",
+ "rust-std-1.37.0-aarch64-unknown-linux-musl": "68db64972c1af5d4d0c4b3d62b644d158df149eed4197e1c26e93ae4a81e4860",
+ "rust-std-1.37.0-wasm32-unknown-unknown": "b55f82540aa900d2d1d1f6879c9374a8efc78d9eeb20af181ee30182b7f9688c",
+ "rust-std-1.37.0-wasm32-wasi": "551ee5f9adbf24c637e914148c0f161e9e2175aa7d39e5b486d1dd817fb47dec",
+ "rust-std-1.37.0-x86_64-apple-darwin": "0b3fe2575b55a739f409a9d76d05c4bb32494691bde5043d77ba4d39ac182f20",
+ "rust-std-1.37.0-x86_64-pc-windows-msvc": "e03f363296cd60e93110db517f3804631e49fd91de7c0d77b229e31b1135dff2",
+ "rust-std-1.37.0-x86_64-unknown-freebsd": "8783a667ea9c46f27027d494098c51563faa734c5ddb23c6b9b3eda804eb9742",
+ "rust-std-1.37.0-x86_64-unknown-linux-gnu": "09a531a97a16701eb794ecbeeded5d8f8da33da7f1bd372661ad385e3f31c048",
+ "rust-std-1.37.0-x86_64-unknown-linux-musl": "fa1d98bf18fb49ff58a70d51ff7924e4d1975f7812dc5217ea31652bf8b7bca4",
+ "rust-std-1.38.0-aarch64-unknown-linux-gnu": "0725ae9f55639c648fdaba06129de395ed839a7d1aab6aebfd21f26cbe1ce7ca",
+ "rust-std-1.38.0-aarch64-unknown-linux-musl": "56268f0c7c93a4f3436aa20af75e80e29e7d651c754b076c64f13219f2e6be8a",
+ "rust-std-1.38.0-wasm32-unknown-unknown": "9634130c797e8c1fd1d7bbdfd48a32e85e2dd3512ffb2b51974374308cf581cf",
+ "rust-std-1.38.0-wasm32-wasi": "becb178cecc2d2137e006c24e6988d79390f96dcd65cc2e8b2f475a8fdab4bfc",
+ "rust-std-1.38.0-x86_64-apple-darwin": "b1a986e8676aaed25959e9f6dd7c8c5aa67fb829d0d694edea34d8169658a125",
+ "rust-std-1.38.0-x86_64-pc-windows-msvc": "3f5b3c9a4f9015c9e1e12eed94752129d80448ea53f9d5ec1e332c2ffa2c4807",
+ "rust-std-1.38.0-x86_64-unknown-freebsd": "9f1d88449ef56c31ebc514873ba4d5889fa12697c4c2ea1071f15127f301ac4d",
+ "rust-std-1.38.0-x86_64-unknown-linux-gnu": "cd50ec3384d79aae89ffdacf09715b68b1b5562657e993f26f67b9458e92dfdd",
+ "rust-std-1.38.0-x86_64-unknown-linux-musl": "56b87fdca1f41b634285593cae42fdbd5fe9632ef502336679362b283ed53c22",
+ "rust-std-1.39.0-aarch64-unknown-linux-gnu": "adbecacf6cf0ed19df2496cc648b16192c0bd085d7e6f670edcea4dd28ab37df",
+ "rust-std-1.39.0-aarch64-unknown-linux-musl": "1d4a3640fa6e696180848ac2eb10ccc7904acac58784b27e5fcd8a79b2cdf0fa",
+ "rust-std-1.39.0-wasm32-unknown-unknown": "654905b39eae031282a9db9bfa47504c23aa4bbc7d22b769b9bd2f6ca8b61cee",
+ "rust-std-1.39.0-wasm32-wasi": "e7f008fd1f7c902f5ba7777d8a4346783392bd40813c79381bd7497fbcf19be0",
+ "rust-std-1.39.0-x86_64-apple-darwin": "ebd058b16590e2c1a73f5de59d169c8c11be6014934cb083afc84accdccd40d9",
+ "rust-std-1.39.0-x86_64-pc-windows-msvc": "cc704f4c26d5e215a8d98d0797a766fad959101776db69bb392317becd7472ea",
+ "rust-std-1.39.0-x86_64-unknown-freebsd": "94a71addd6983ae844be1cd403926c947766b72f032a083fd1be73f18cf329d9",
+ "rust-std-1.39.0-x86_64-unknown-linux-gnu": "2ddad802f048acaa5cd48f1105c18c7f4de32dc9569ac4d64bfcbb3d8c155cb7",
+ "rust-std-1.39.0-x86_64-unknown-linux-musl": "9c6b49e161e53c174b4fd46825a96b78854cfbcd0971ce846d4edd33c2b5f275",
+ "rust-std-1.40.0-aarch64-unknown-linux-gnu": "e1a1bc577d51556c53e39d4f11fb4918f0ebf27e166ff63321b2991754706d16",
+ "rust-std-1.40.0-aarch64-unknown-linux-musl": "5a269c83446da52c824b3c2047d66540f524e79901ac09b2ac80900a692849dc",
+ "rust-std-1.40.0-wasm32-unknown-unknown": "e3f68aa04c97fb8f5f595d47f417221afb4b0c49d177a2cde7935e3afdd45947",
+ "rust-std-1.40.0-wasm32-wasi": "814d780d7296cc8a8969536f99e8b591fc68d9290e399f01c59cf86d32303718",
+ "rust-std-1.40.0-x86_64-apple-darwin": "1eff41b353403cc284a09debb00cfd41d663447eabf5ad2d4cf736c8c8db0458",
+ "rust-std-1.40.0-x86_64-pc-windows-msvc": "10685476cf7d68e56564730a7d553bacd924717b9272875219da7b9f5ad6704d",
+ "rust-std-1.40.0-x86_64-unknown-freebsd": "90a41f80e2501ac2b036b7cdf269db19a5204aeec257bd585074508f1a6ba2c9",
+ "rust-std-1.40.0-x86_64-unknown-linux-gnu": "735affaca1370699f9bc3fd7b1320694afd250923d283d88c842b7913a97d083",
+ "rust-std-1.40.0-x86_64-unknown-linux-musl": "1183b1f698716409be6b48c8f98109723b5e9f5f2cab6c20f73d0b281c63aa80",
+ "rust-std-1.41.0-aarch64-unknown-linux-gnu": "59b8dab431af29dcd28c6e92e82a488ebb20dbb5dff93ca14119ba8e2fabd9c8",
+ "rust-std-1.41.0-aarch64-unknown-linux-musl": "775a256864417d93d20ae106b775564051be888a78e77a6a88c67ac86e401059",
+ "rust-std-1.41.0-wasm32-unknown-unknown": "0974d40a9f54bd9dda88c20ffa1778fa90ee77a549a8f30ed13477b55e142a63",
+ "rust-std-1.41.0-wasm32-wasi": "e50c63deae8a8bc81d438f73bc885e5de7fa282784171b53e3eebf8f41d8f7d1",
+ "rust-std-1.41.0-x86_64-apple-darwin": "c917af985d879376d8906e7c81ceacb06e65ea7b229ccf81505f8bd6cf5abf64",
+ "rust-std-1.41.0-x86_64-pc-windows-msvc": "aee5b98f0ac533471dc3d9ffdf6fcb22565c44d80c03c1c4df0c8b714931d1a9",
+ "rust-std-1.41.0-x86_64-unknown-freebsd": "4436e80598592398724daf0efc33b2a6505bebde59c021d3e894d605ae5255dd",
+ "rust-std-1.41.0-x86_64-unknown-linux-gnu": "b563fc979eea8372f5b371e10f0857e79cdffc34b124c7a7b0d89014d1b351b7",
+ "rust-std-1.41.0-x86_64-unknown-linux-musl": "6df5f52b7acb58d2123f2a6596741ae1857921ec747087bbd0b0cdf4cec5e369",
+ "rust-std-1.42.0-aarch64-unknown-linux-gnu": "1343f51fc87049327233cee8941629c3d7dfdc425d359385f93665de3d46711b",
+ "rust-std-1.42.0-aarch64-unknown-linux-musl": "77dd67761c8e2e17aaa837b714ddb9dd4433272b6b2980fa327faf23a6fc5bc1",
+ "rust-std-1.42.0-wasm32-unknown-unknown": "695439ef4099f2a1da7c9932e556b3985f4ede5b27e6ef260d670bfe4bc3894b",
+ "rust-std-1.42.0-wasm32-wasi": "077bb250b6df47f1350ea875645fd388d3e6df69830ab49627fe6f6bea5887ad",
+ "rust-std-1.42.0-x86_64-apple-darwin": "1d61e9ed5d29e1bb4c18e13d551c6d856c73fb8b410053245dc6e0d3b3a0e92c",
+ "rust-std-1.42.0-x86_64-pc-windows-msvc": "192d8e1277280df261bc917d1dcc8225b5fb507f281d05bbcf85f859679e1429",
+ "rust-std-1.42.0-x86_64-unknown-freebsd": "76e0f0f7275e114908b0ce2bf39813eaa580af92cc1fab31496ca37ba9d5703e",
+ "rust-std-1.42.0-x86_64-unknown-linux-gnu": "e6bf5495a8b1cfb849fce2753404b3b7ce7fba0c5d743d940fac3ee4558fda26",
+ "rust-std-1.42.0-x86_64-unknown-linux-musl": "c426957a3f2e3d51ee91b996c2c6b21a10d4ade7fb6b7c64d6e2f7100b6b994a",
+ "rust-std-1.43.0-aarch64-unknown-linux-gnu": "f4b80b12ecf14e97937cd24573e82f306f147db6266dc5a2cb27aaeaf49398a7",
+ "rust-std-1.43.0-aarch64-unknown-linux-musl": "5cc80aa5b5cf6dd40a5252de6c2d2cceebd930b80b02bdda7442f93ed6539a55",
+ "rust-std-1.43.0-wasm32-unknown-unknown": "efe2061e7b9711f51b560c7770ebe372003beb9beddb363f27c3960ee12135cd",
+ "rust-std-1.43.0-wasm32-wasi": "6ece090d05853a54bb7f6e4985840cf01dc4857eda0f375bc8e35846d1d533e9",
+ "rust-std-1.43.0-x86_64-apple-darwin": "c75d37579b9e143ebd98ae2fe42c818fd47e0a2763b2a9bdd7e6b9954509d735",
+ "rust-std-1.43.0-x86_64-pc-windows-msvc": "008ca995f429410248558cbfb0e77ebd062ca709a9e3a7d58d9f81c491395280",
+ "rust-std-1.43.0-x86_64-unknown-freebsd": "3c9b450b826874be5c3f35f7cb923f02d4769b81f763fef21c9c0d3a80532c2c",
+ "rust-std-1.43.0-x86_64-unknown-linux-gnu": "84fd8ddaaa217b82c563d4a32a690da2c399388258a3d2baf180992c21938af5",
+ "rust-std-1.43.0-x86_64-unknown-linux-musl": "496efe781a68c1ad75bb16e72b383fdcb9bf28ce448019dbf1ab4742fd4d4299",
+ "rust-std-1.44.0-aarch64-unknown-linux-gnu": "fafb49cc7264a8621c17e8954ec2e0a78e097395b285edb5c1639c61ffb8142c",
+ "rust-std-1.44.0-aarch64-unknown-linux-musl": "b32ccb5a8bf7c3ba9e7295e2986acad87c0eab9eff98a98f4dd3eaa4c8b74405",
+ "rust-std-1.44.0-wasm32-unknown-unknown": "8e12796a0c2fb083953042218f832bdeb78da1bfaf67b9dfe3d719920084d755",
+ "rust-std-1.44.0-wasm32-wasi": "ac0ffeb48bd4be6dd460c5665fc52bb4da2be15e5ecdefa4bf73c6db7392759a",
+ "rust-std-1.44.0-x86_64-apple-darwin": "af58f742764949765e09bb60bd1c16025a79a1be8152996fd5b3a44e5df90311",
+ "rust-std-1.44.0-x86_64-pc-windows-msvc": "1f52376c9a48ce76b24c7aad7a9817b0b4b2cf11a8581001c8d76285d9593340",
+ "rust-std-1.44.0-x86_64-unknown-freebsd": "a0315d028e72e221291dba257e8212e564574d87362cb07e06dc15950d1e6788",
+ "rust-std-1.44.0-x86_64-unknown-linux-gnu": "3b7a4eede0ca550c256ca6721877de0154c27e71196d8b9a980a480682ead0aa",
+ "rust-std-1.44.0-x86_64-unknown-linux-musl": "220877112bc1dafdaa1760c3d1c5b3529766faaa1e969d1a99d27648d3bf927d",
+ "rust-std-1.45.0-aarch64-unknown-linux-gnu": "816f6cc132db84617bfde6ad47336bfb020552a45bd0a10250c4e420d512d5ad",
+ "rust-std-1.45.0-aarch64-unknown-linux-musl": "c37bb023f496161ef3238f37b44606a93e15af225d70d3083bfd52e7f8fdd36a",
+ "rust-std-1.45.0-wasm32-unknown-unknown": "1b4f40be1d0f18a5a04f9f706fef74db0e299046557a706a4dc31a2b36d8de21",
+ "rust-std-1.45.0-wasm32-wasi": "1ef0e8e09ad39275a188bc88d4969c4d1e150cd728d9ff5955b42d6a643ac10c",
+ "rust-std-1.45.0-x86_64-apple-darwin": "e3ac5a3efc106ea13687aa1231609a5d61b1874f4b3a2f68b0e0ad70c89a2364",
+ "rust-std-1.45.0-x86_64-pc-windows-msvc": "f638c04f6709382ded2e78aebff03ae5e40e074d003786f083e6e3ccc438e0b5",
+ "rust-std-1.45.0-x86_64-unknown-freebsd": "68b28ad5488bfb051589c7079bdfa396aa42c29d463a5622fb5eb9d6ecc4a8e6",
+ "rust-std-1.45.0-x86_64-unknown-linux-gnu": "7ab1dbcdeab16dfea1ed024675e60429db9719f03648e6a09662de72b4ff730f",
+ "rust-std-1.45.0-x86_64-unknown-linux-musl": "f54b23b39308b6049644d0c8ac625724911ab423d09ed43dcbc52489b7636ea7",
+ "rust-std-1.46.0-aarch64-unknown-linux-gnu": "eaa7cfd73e96b6ce03498398f4bd9ded73870fe3c5db980038a4863c37157597",
+ "rust-std-1.46.0-aarch64-unknown-linux-musl": "5ad254082e3af2d301d3dd2c9af90942cb91eecb293f86778d163a75cd6bafd1",
+ "rust-std-1.46.0-wasm32-unknown-unknown": "0ef3344aff8ae3f2065ed8f15daa73514a26f934e160cb6974d43a8231fcc090",
+ "rust-std-1.46.0-wasm32-wasi": "44a37dfe4398e1c120a199b2ebbe86838171c38a29a0f76e10ede00bf1aeb16f",
+ "rust-std-1.46.0-x86_64-apple-darwin": "8c897982bc38c9528b448fe551f089fee7716e692dece98052f4459ccc6e591c",
+ "rust-std-1.46.0-x86_64-pc-windows-msvc": "06d92b12e2f4e6024971e99a7716423d4738c3e379fc82aa54de2a812de268b2",
+ "rust-std-1.46.0-x86_64-unknown-freebsd": "e37c06bbe2bf2501675101787388ab87d510ef80f2e091be3f50fc5d019add1e",
+ "rust-std-1.46.0-x86_64-unknown-linux-gnu": "ac04aef80423f612c0079829b504902de27a6997214eb58ab0765d02f7ec1dbc",
+ "rust-std-1.46.0-x86_64-unknown-linux-musl": "cc28b7807ceeb5a7f162edb933d825ed5f5880a45a2e920e1f1a846bfdc1b1a0",
+ "rust-std-1.47.0-aarch64-unknown-linux-gnu": "0019c302a0a02d8a9e40c3bcdd5a31b9b2704161563d72df3572521989182b0c",
+ "rust-std-1.47.0-aarch64-unknown-linux-musl": "69e27f17038a4eb99fe43781f0ca6432f64802bb24fd08fd4f2b90dc73987396",
+ "rust-std-1.47.0-wasm32-unknown-unknown": "b0d19ceb2b56105ee3407bdecaa779747abb1574990632e53a2aba681e964187",
+ "rust-std-1.47.0-wasm32-wasi": "0eab479faac83b9352af04ba4dea376fdeade3101f5e912f40ee3c93e32d1317",
+ "rust-std-1.47.0-x86_64-apple-darwin": "6b86bcdad5a6eff87a67b6387051d7f10a48e088b8f92d76869d201500b9ce13",
+ "rust-std-1.47.0-x86_64-pc-windows-msvc": "896614728a21128c335f632f2f45217320974f71cb4c7c23184610f0b587b7b5",
+ "rust-std-1.47.0-x86_64-unknown-freebsd": "80f5dee782bd74b41c55a676c624ce2260ab54c834102c90ea54e0c5e7e513c6",
+ "rust-std-1.47.0-x86_64-unknown-linux-gnu": "17ecad27d96b331608e4a96dfa3cad05ccb2ccecb888894ed35054e0d1f5207f",
+ "rust-std-1.47.0-x86_64-unknown-linux-musl": "fe4d2ee953979abd09aedaab25fa2ab646089caa6fd4ea9c78486a819729d777",
+ "rust-std-1.48.0-aarch64-unknown-linux-gnu": "3b0e5c4d03ddb97cd462947c539005427813f5ba91be81888db77e7d4bf36e45",
+ "rust-std-1.48.0-aarch64-unknown-linux-musl": "29be0b241bd14651bf9d470a9766000b424a112a0b4a6160f422b075e4668c4c",
+ "rust-std-1.48.0-wasm32-unknown-unknown": "6f981b353e096b8a54c86e6812c82db3b5fd45335b575396e3bfc29b03ffe959",
+ "rust-std-1.48.0-wasm32-wasi": "ed57645e5fe429ef99018759e1a89e090220a3197f30ea544070610ef73c19aa",
+ "rust-std-1.48.0-x86_64-apple-darwin": "430d0ca7c04b0e1140f39f2274e0072a3ba2373a99a230d14ab16361e19b6129",
+ "rust-std-1.48.0-x86_64-pc-windows-msvc": "a526c6f6c00d6a0cd4b6e3348e6329d204099983672862249593ba932b5ddf28",
+ "rust-std-1.48.0-x86_64-unknown-freebsd": "a5ea4ec9664f38a2464216031eeea01f723b4e0691f7d473d8f7ab663551f979",
+ "rust-std-1.48.0-x86_64-unknown-linux-gnu": "2e7152e5d24cea7e44e6645ebbc0387cbe1c7059b54d95d8ea3afe298ac8b2fc",
+ "rust-std-1.48.0-x86_64-unknown-linux-musl": "1bf2a0cfaa3e0cf8f743a48802c91d641a3289dffa1c44d7dc5365b68c8739c4",
+ "rust-std-1.49.0-aarch64-apple-darwin": "cf3308806fc3b6fe00ce49f1e63b1cb1d1443cc812eff7947257f31f590465d3",
+ "rust-std-1.49.0-aarch64-unknown-linux-gnu": "c58bd4f0738ff662f70e35c19bfa6b8eb12ad54b0fbdce32ee3e50186c04a969",
+ "rust-std-1.49.0-aarch64-unknown-linux-musl": "bc5501347598f48f55ba23011602a8fc1fe156c23c1c7b4d449c84eddd64d4ba",
+ "rust-std-1.49.0-wasm32-unknown-unknown": "803b4bd43c711753e3e73c210b88a30c4cfe6f3955902d76e2a15a70ad191ffd",
+ "rust-std-1.49.0-wasm32-wasi": "0c97a1f8470719b741186cbb89c4be6a61057fa013d815b2b97fc1043e269d22",
+ "rust-std-1.49.0-x86_64-apple-darwin": "c4389a8534b8da3ae3570646d68fea9a25268b17ed138867e31d4517312759af",
+ "rust-std-1.49.0-x86_64-pc-windows-msvc": "bb55ad626b9d304c0e080fc8731c7978a937c98e873a84834925c525acdbb5e3",
+ "rust-std-1.49.0-x86_64-unknown-freebsd": "ba97f1d751d6656d5efba4b0278a6571e6a56a489670f279bd2c647a90f1679c",
+ "rust-std-1.49.0-x86_64-unknown-linux-gnu": "f0d2c2d509c29ea9f7c24bb5a885321030281631e0bde0714e5cf881184d57e2",
+ "rust-std-1.49.0-x86_64-unknown-linux-musl": "07d5ebdb6c391631c168deea21c7f4d538ea93c86c2e5e1968508e90835c14e9",
+ "rust-std-1.50.0-aarch64-apple-darwin": "8a1cda91afd3a732d3737b6f933b0b6065949dd8fbc820245a7e2a97ae9a7711",
+ "rust-std-1.50.0-aarch64-unknown-linux-gnu": "83aeff923faa528e2ff5b582e4c3bdaefeda34078345e48878eba6ef95d41040",
+ "rust-std-1.50.0-aarch64-unknown-linux-musl": "fbfa90f58d9c96f91937666ff2495345f564955442109833189ab7dbb0facd89",
+ "rust-std-1.50.0-wasm32-unknown-unknown": "6b639eb5b07e1fee82e58e4fb74b2f40f5c76b02384d27f9675692a7e9656bf6",
+ "rust-std-1.50.0-wasm32-wasi": "205216840a1c286523342adc5c085819e8a4fc6de55efbfb70dc691a463fd8fb",
+ "rust-std-1.50.0-x86_64-apple-darwin": "a291354e78e8147b22e92c817a0dfee8d3342e07bfafa73a2904a1c99d22c5b8",
+ "rust-std-1.50.0-x86_64-pc-windows-msvc": "48e562e1de58bd45aa0d8a95173e159c588ee76b0164affdc0140c928b1994c1",
+ "rust-std-1.50.0-x86_64-unknown-freebsd": "b9b543a310adef1e8432f7edea63b684369b30dad1c30aa12a57ccdaf8ae0224",
+ "rust-std-1.50.0-x86_64-unknown-linux-gnu": "2aaf284a204d605f6685d2000cf83c25d0e1c789093009801ca16e1c659ae8c6",
+ "rust-std-1.50.0-x86_64-unknown-linux-musl": "f8924ff7378552c2f16faba6aea178c1b098f4cfcb07247c7c58533543980594",
+ "rust-std-1.51.0-aarch64-apple-darwin": "b9ed9468652417b375d24152eed9b87436f1ca0ad0311d8a1a802fdde263bdad",
+ "rust-std-1.51.0-aarch64-unknown-linux-gnu": "a6ed4abe59dfaf2119e2803f67fd8aef757a622ae3ac9a040946af2b02f4c269",
+ "rust-std-1.51.0-aarch64-unknown-linux-musl": "9c0dcae82c10d52d202052fa0fa912cd7a21dd286de01717f70e24dfa20a5b03",
+ "rust-std-1.51.0-wasm32-unknown-unknown": "27f4455f01911c2fa1a58cd2fdb3bf5699bf1521cbd462a457c4a1ccb8650e38",
+ "rust-std-1.51.0-wasm32-wasi": "6e96fef8f132934a37169296e7bd13e64ee73679014b47e7bdc399add9b10007",
+ "rust-std-1.51.0-x86_64-apple-darwin": "2856bc46d3624ae2658897c15388c0c353bea916963a2fc5991c23b920d5678c",
+ "rust-std-1.51.0-x86_64-pc-windows-msvc": "0e9300e21b61ec1adde0b48772a76f1c881015cf1e7885b641dcfa1dd8289e55",
+ "rust-std-1.51.0-x86_64-unknown-freebsd": "4d03de5911c533cd0ac2ab5ea9b9105e853ac0ee0f6aea22b6714a7dbe008f01",
+ "rust-std-1.51.0-x86_64-unknown-linux-gnu": "5e7738090baf6dc12c3ed62fb02cf51f80af2403f6df85feae0ebf157e2d8d35",
+ "rust-std-1.51.0-x86_64-unknown-linux-musl": "8e23cf075b514633226e73786bbcc0907853a2e9cba98ec208ca16ba3847b834",
+ "rust-std-1.52.0-aarch64-apple-darwin": "2bf799c9846c9e6308d777d30f38a54acde53b690bd12324dbba3e3b12c44822",
+ "rust-std-1.52.0-aarch64-unknown-linux-gnu": "f16adbfc562875aad7f6a4c9111519ee27eeca804fa575f8d274bd2dc1efa41a",
+ "rust-std-1.52.0-aarch64-unknown-linux-musl": "54d9f39a8a2ebcdec83b0102eac209439f846248cd6b9919421a51448b757bf0",
+ "rust-std-1.52.0-wasm32-unknown-unknown": "d4b059dd880b7c2418c454f6ff9b87f075f8634364d86ade1f4131083951592d",
+ "rust-std-1.52.0-wasm32-wasi": "37a48c39b8a5c41906b003dd803d5d4679a1321c0dd36c222e74b3384592a2d5",
+ "rust-std-1.52.0-x86_64-apple-darwin": "dfab59a96112512f8b3f6550ea932bdc4f09b0c0659545a938dbc334e96b9515",
+ "rust-std-1.52.0-x86_64-pc-windows-msvc": "28adfe2d59d37f179d82fa0ad9b2d0308607abd6c05de0f17458625d83997930",
+ "rust-std-1.52.0-x86_64-unknown-freebsd": "e721b2acb871722a0c36ae2e9d8d97a2ee8175c9c2e3cb80238c662be401b3e2",
+ "rust-std-1.52.0-x86_64-unknown-linux-gnu": "dcea50e20596a698bf534d37f28cabbe6ca6fa31bee9c4c186b0874d1d67d4ed",
+ "rust-std-1.52.0-x86_64-unknown-linux-musl": "6d9883520f6d3cc540114a0246849234a6f801bdfb0346340426b02f4c677063",
+ "rust-std-1.52.1-aarch64-apple-darwin": "3b8914c1e9a51407690661032b059fb87482e93f10f2160f3b042ecc4cb97c38",
+ "rust-std-1.52.1-aarch64-unknown-linux-gnu": "b87ef86a241626cc86bf98fa0e70483f96d1bb9bbb4da7d9c589ac2094393a8d",
+ "rust-std-1.52.1-aarch64-unknown-linux-musl": "fe8091e71cde5e3a344d204a6627765ab79ccf19321348dbfa27768ac5f2abf9",
+ "rust-std-1.52.1-wasm32-unknown-unknown": "83953390e0d1e99cd6572e825888020f91d095b07eb744539a59891837b6fe9b",
+ "rust-std-1.52.1-wasm32-wasi": "7f90fb6336d679ddcce034201645f254d8b97c6352926f5122e38329fd6e1aa6",
+ "rust-std-1.52.1-x86_64-apple-darwin": "3567ec015a498b8d5c6e8f47aaa3ec469a418ea0e0f163249e825ef24457e38b",
+ "rust-std-1.52.1-x86_64-pc-windows-msvc": "ca95b1ddeae98af71439574fdd9fd9b233ffaea7792c1b654c212a1821d33986",
+ "rust-std-1.52.1-x86_64-unknown-freebsd": "5ac8a9dc61421dc4f39380a5d4380130fa176047eef48b3aba205103363b9774",
+ "rust-std-1.52.1-x86_64-unknown-linux-gnu": "ba9cf6570d509b3e4c4d821db4caf304f2ffacf5377b7ca55dc1ef9788ae5b58",
+ "rust-std-1.52.1-x86_64-unknown-linux-musl": "1f3155180a1a143119fd7b1eae3eeed0a0758ca095fd6533918d87cefeb93fe0",
+ "rust-std-1.53.0-aarch64-apple-darwin": "a6191c9b5adab64832c0e0c0ea24f64b32db07ac5f56faf21239055ce38041ed",
+ "rust-std-1.53.0-aarch64-unknown-linux-gnu": "9e5c09d14fec5609bfd042299900f20a44c52d53c64e76e184faadf67d07590d",
+ "rust-std-1.53.0-aarch64-unknown-linux-musl": "7501cc0787a63e550f9918dc5d23ee9fa9f3f3162088b33213694be2d6e2aa32",
+ "rust-std-1.53.0-wasm32-unknown-unknown": "d9539af508a484d7da6b9683aaeb9b50ca63730a14c90837100d668c2591a697",
+ "rust-std-1.53.0-wasm32-wasi": "e75188931308e2dbd6cf85c802d28bbd175a0696cec241b134c17f2ffdfcf10d",
+ "rust-std-1.53.0-x86_64-apple-darwin": "ef9b2d8b467a29c8d5621ca804dfd6b9eb38ceae6ed86c763ddece0a38714697",
+ "rust-std-1.53.0-x86_64-pc-windows-msvc": "b5dc9771dd9b8c2a9fb10769e64c962cea01cc3e0b0057b78ce8a9ba0477a4d0",
+ "rust-std-1.53.0-x86_64-unknown-freebsd": "238bf461d866b5ef4614609462356304eb0225b0c61668d51a7b1844561df845",
+ "rust-std-1.53.0-x86_64-unknown-linux-gnu": "b3428b9ffd5a8f8f13506eedf2fc865665a53894408f0b64314686e8a08d06b2",
+ "rust-std-1.53.0-x86_64-unknown-linux-musl": "e91abd171f35951f1fc56b10af817c9e83833eec5c3712dae8bc1e5e63cb7100",
+ "rust-std-1.54.0-aarch64-apple-darwin": "469b832c7d33c1edfefe705a2ad27172f6906a73b56be789fcc30629792f75b4",
+ "rust-std-1.54.0-aarch64-unknown-linux-gnu": "2d90cd90734a2d057b2a4eeee36a72d96569fb5fff0ac1e22eeb5fab93e66848",
+ "rust-std-1.54.0-aarch64-unknown-linux-musl": "4c689f32444afa8faef2f7eb896b59f76827e9950f795988d626c9e4552e3d4b",
+ "rust-std-1.54.0-wasm32-unknown-unknown": "6e454b700234a0b33df15e6936c1c27c643101a3c4253f5e41b8e8a48a9f7ab2",
+ "rust-std-1.54.0-wasm32-wasi": "052220fdf7ea1988b6cc6445f8ea58d2c29335feb442842014f161e618534331",
+ "rust-std-1.54.0-x86_64-apple-darwin": "3908ff438cdf39c3f46a103f3a0fa04a0d8add996c87e4290c80f1a766df6a04",
+ "rust-std-1.54.0-x86_64-pc-windows-msvc": "13f7595449308c4ffe79a6111d5fd2e7a4c6a56174d6c295437676e29951ce90",
+ "rust-std-1.54.0-x86_64-unknown-freebsd": "f504cad489fe606dd1a7d064253d6e0d0e5450674cfd941b8f848953efce99e5",
+ "rust-std-1.54.0-x86_64-unknown-linux-gnu": "487c51ac97e7f7deceae904b70e9bb031574dbeefe07b39b24e3fb00740962eb",
+ "rust-std-1.54.0-x86_64-unknown-linux-musl": "7cbe73472390e0e63d1812dd86d5024350e0e8dae36a6bf52585ad0136148818",
+ "rust-std-1.55.0-aarch64-apple-darwin": "bd364710331b34f454258b73e5cfc0583d3c0763ecce0994d8a990c1847604a4",
+ "rust-std-1.55.0-aarch64-unknown-linux-gnu": "e30063a259e32cd0e31baadcee82112ef840e0f654d5128dd79fc715ede92058",
+ "rust-std-1.55.0-aarch64-unknown-linux-musl": "f540bf8238b46cefc5490eb6e626f8712ff5a49d8fdb7e75e838a5c1e1b3046d",
+ "rust-std-1.55.0-wasm32-unknown-unknown": "275d7a1032f709d186bb8bd66a96f17f5c8d6c1a4c3b51b7ce60a4f3dccefdf4",
+ "rust-std-1.55.0-wasm32-wasi": "69696faaa29bdffc58a71707a4547a85a09199218411302afa7554073357f576",
+ "rust-std-1.55.0-x86_64-apple-darwin": "8888fb0a1cbc645f86e1551d27cc127697361fecab9cd414691e434976412733",
+ "rust-std-1.55.0-x86_64-pc-windows-msvc": "8507fe0f2059d68bc0cfabae1cc96cfc3d0357f04522942c5d4fdcdc1cbc23a8",
+ "rust-std-1.55.0-x86_64-unknown-freebsd": "522f4f75c50a0fde08d6235ed80c7cac30c922943954aad1e7c154cd8762ddd3",
+ "rust-std-1.55.0-x86_64-unknown-linux-gnu": "c07c5ce96b86364601c0c471bb85105e80a5e345b3e4b3e2674e541cc2fdefcf",
+ "rust-std-1.55.0-x86_64-unknown-linux-musl": "357b8f56ffa3858e2f32be837bd84e3d89403f17c55bf0c105f34a0b796bceed",
+ "rust-std-1.56.0-aarch64-apple-darwin": "88ae1a2da1c7bbabeab3bce392ed9cdf1403c1f6cef5a8bc9a6813e480127fc6",
+ "rust-std-1.56.0-aarch64-unknown-linux-gnu": "061c8a855696b3e23fb48ad69aa90e70ead825825e4cc02374d3cb1df4486258",
+ "rust-std-1.56.0-aarch64-unknown-linux-musl": "2a83ec23e14e0b578b636c3c95283c92fd034e8b56a564c043db3f8b746eeb2e",
+ "rust-std-1.56.0-wasm32-unknown-unknown": "3e0f1282549f09f9f9062f8fa8ca197eba5407c4422378688d78075bdfaf3358",
+ "rust-std-1.56.0-wasm32-wasi": "f819c096dcfc3fd0466eff346ea4291fe0ef86a08529b9be6843017c79256237",
+ "rust-std-1.56.0-x86_64-apple-darwin": "58c6fad6f09706f2940cd501a1d0dbd984ce4926000009aed313dd2cd3c1a7ad",
+ "rust-std-1.56.0-x86_64-pc-windows-msvc": "7d3961a5115f29738061d9c22e2472082a5e2de7bfe550a04a22180c3caa472c",
+ "rust-std-1.56.0-x86_64-unknown-freebsd": "e059d39f15cea58fd89d860a06504f48234ae2aff2c1eb5e4463b50367827ff7",
+ "rust-std-1.56.0-x86_64-unknown-linux-gnu": "3c314efa230f95f5d9e3357e5f915a4f40d2a21b10ba7b92fcc9036cbcd9fbac",
+ "rust-std-1.56.0-x86_64-unknown-linux-musl": "03b7a319a3d3e5f86278753f2780c7b3fa3f1b60bc2b8ddf6fd18a36540b8601",
+ "rust-std-1.56.1-aarch64-apple-darwin": "59fcdb16c264fce206a1a59261fc576f547fa0a807d3370b542ab25261ae5158",
+ "rust-std-1.56.1-aarch64-unknown-linux-gnu": "d577c25879cf160ec1a04d5101971dd684f9b4f87b3cb463a7521b676dc3df89",
+ "rust-std-1.56.1-aarch64-unknown-linux-musl": "444d5cb43bb82322562afe54c249c3d85b5b1cf215fcd0cfdabd2e657fcda687",
+ "rust-std-1.56.1-wasm32-unknown-unknown": "4e62beca963a5b8c98913dd10abc493126675a0a35c2817afdf6975a49cc1bce",
+ "rust-std-1.56.1-wasm32-wasi": "a7eaf9bf238671f7a54afe00cd76dbb354933e525ab5bceb10d156a2bc414dd7",
+ "rust-std-1.56.1-x86_64-apple-darwin": "a1cedfaea1508bf3bfc8a77d82d15c693b41e70e56fad930d24f21f0bce5052a",
+ "rust-std-1.56.1-x86_64-pc-windows-msvc": "ace5ea90e70b9d035b28b405175d52e1796fb1bb36cfbdead1048ff00e9ec1fe",
+ "rust-std-1.56.1-x86_64-unknown-freebsd": "1382799af56e1ec48cf3971f84122c9d445996422055b822d9d6226a31a20737",
+ "rust-std-1.56.1-x86_64-unknown-linux-gnu": "afd959b295e17640d1e94648278a944dc5f349ebdd9e59e2404729db0810c531",
+ "rust-std-1.56.1-x86_64-unknown-linux-musl": "88bfd0dce45d4321b0781550a300f90da5344dda20744219b6b23072b6cb03af",
+ "rust-std-1.57.0-aarch64-apple-darwin": "3b442d3f546524aef4fe8483c5ddcec1c5dbd52216d98aabc066883db31088d8",
+ "rust-std-1.57.0-aarch64-unknown-linux-gnu": "4c70901d1cbddec9ea99fbd62b20f454d30e1ffbb48a21169ac823b3f02a1fbc",
+ "rust-std-1.57.0-aarch64-unknown-linux-musl": "4f0c6533186b8fb596ee11b49bd6c9ffb76be59eb8bbdf26f25a47d297666c02",
+ "rust-std-1.57.0-wasm32-unknown-unknown": "3e0525d9e16f1a58e847080f2d3c02e275c2d5563b7980311e39382bb6c8441d",
+ "rust-std-1.57.0-wasm32-wasi": "391d814379cf117e927e5deb17bf44e964adee4f5f7208eaee1ddc8927da1fbc",
+ "rust-std-1.57.0-x86_64-apple-darwin": "c1eb892ddb50ebeed288b7aa8171ad46d62362bb26b2d82d2b463dfd45606dc2",
+ "rust-std-1.57.0-x86_64-pc-windows-msvc": "c3984148c561297f804238f6f1e4dd06302c6b3465d3744074016bc23a9f078b",
+ "rust-std-1.57.0-x86_64-unknown-freebsd": "1528a4bc7e3ba42da164bcc7b952dfa73048333c5b9254ce2d03db6bab6081e8",
+ "rust-std-1.57.0-x86_64-unknown-linux-gnu": "9140ad6f46a903345d4297a987ccaf37b9c5ca594cd6fd5a27d0be482116fe7f",
+ "rust-std-1.57.0-x86_64-unknown-linux-musl": "e59345c7ba6bde5e1d2950b846c097511998d5897c63a7cea078ece4b8507f5b",
+ "rust-std-1.58.0-aarch64-apple-darwin": "7c1d58bdc87b79f439b1083348a0e492305f8737ad1931755c26b2834a854f42",
+ "rust-std-1.58.0-aarch64-unknown-linux-gnu": "3a1283a2dce7abf2816dc70d622215f5769c416abf3e94dd94dd6a5d1109f506",
+ "rust-std-1.58.0-aarch64-unknown-linux-musl": "2e0589157f7f5055f4f295886f9161cdd239d845b7e021a0a59bf338facf9dba",
+ "rust-std-1.58.0-wasm32-unknown-unknown": "cb668772798a811de6e6d5823398abf888f29319bd3803621b0f4ff8c1693de0",
+ "rust-std-1.58.0-wasm32-wasi": "4d86cf175ebeb3002fa940447b52ff6fdad99f9fb2ba6a56e42ef961e685c3f5",
+ "rust-std-1.58.0-x86_64-apple-darwin": "fa89e9ab2e3645d6732811dae3828c86fbd65cb7447ec33c84137e61b168396a",
+ "rust-std-1.58.0-x86_64-pc-windows-msvc": "20738c0c92fbb59800926ab2fda5191b03537a3d6574ba4b6534de3ebc12d043",
+ "rust-std-1.58.0-x86_64-unknown-freebsd": "99016932b881df2a579d52761d4851ed538e34c39b47e882505892bb50d930bd",
+ "rust-std-1.58.0-x86_64-unknown-linux-gnu": "0517b0cb57a311bbe1997e9b87fc6bae1f9e1eadec4f7d97374740f17f890842",
+ "rust-std-1.58.0-x86_64-unknown-linux-musl": "10d911a65381b624cd1d33a913c9a2270355dbcd6db66b847e63f0f9b0f85f35",
+ "rust-std-1.58.1-aarch64-apple-darwin": "307f4d430f3491098b7d73db618408eadc22b0e290d2e22fbcf2909c5ec96c2b",
+ "rust-std-1.58.1-aarch64-unknown-linux-gnu": "1f81a91f29d1a5dd4bbedbb76be74582553bb363103bc390c2f8f1f26c2a24bf",
+ "rust-std-1.58.1-aarch64-unknown-linux-musl": "feeb863de2688b70b98eafaf7e707b2192373b649ad147aa07d1e95d8cde825d",
+ "rust-std-1.58.1-wasm32-unknown-unknown": "ef92a50952a03111c59745b8732f55f209da12e5dd8cd15072ad4ed96ad048e7",
+ "rust-std-1.58.1-wasm32-wasi": "09e3b15ebff0a68e83b36913e4711db5ffb4c8dd3d7fa827988c1bdde6b9ee32",
+ "rust-std-1.58.1-x86_64-apple-darwin": "aaa1e34c45394abaa943499e56047f6e678e42e7fcf5fe065000fb33559961cf",
+ "rust-std-1.58.1-x86_64-pc-windows-msvc": "b8c335eb2ac500f59f2259b3ac9095647566725ad133509732d3f4a5a7d53139",
+ "rust-std-1.58.1-x86_64-unknown-freebsd": "946c4bc834a89b30deb82664b04b67aee0fa65c232447b3adb4c29e89a559b4d",
+ "rust-std-1.58.1-x86_64-unknown-linux-gnu": "649bda48542f211d77afab4b71505572a4712b6b5c5bdee94533e2e7a9a832f1",
+ "rust-std-1.58.1-x86_64-unknown-linux-musl": "c4e56dfcf9d3d8466eb7d065af44763369df6e641a812a0a6974f94c98ef9a12",
+ "rust-std-1.59.0-aarch64-apple-darwin": "e70bd0c56f8f716238a1395c54dd9d993a3168e2764e404dc65553babf7aa127",
+ "rust-std-1.59.0-aarch64-unknown-linux-gnu": "81dbd37919f631f962ac0798111803eb8f06ffde608f0e5dd3682d701cf5566d",
+ "rust-std-1.59.0-aarch64-unknown-linux-musl": "e4f73617db73df7cb3b97984e38184f57292cc527654b52451293cd70f36f5a4",
+ "rust-std-1.59.0-wasm32-unknown-unknown": "d79f31c54eab23c24e245e8988efa2f73451dc8537d386c52dcc1d7a6db246dc",
+ "rust-std-1.59.0-wasm32-wasi": "b62d02df72e2129c64b35a5d531525d4f51f96eb550cc6705f618968218a7ed6",
+ "rust-std-1.59.0-x86_64-apple-darwin": "959af8bafbc9f3916a1d1111d7378fdd7aa459410cdd2d3bbfc2d9d9a6db0683",
+ "rust-std-1.59.0-x86_64-pc-windows-msvc": "fae30c5c9ac491380b556377fb0e804b35707118c5e69f8190debf828c9ad863",
+ "rust-std-1.59.0-x86_64-unknown-freebsd": "cf5e4303dd7c3b70a738a2336097c9f2189c8b702a89a8c453d83ac0dee4602c",
+ "rust-std-1.59.0-x86_64-unknown-linux-gnu": "3927fd7a094ba063daaf3163fa1b3b0b196968356845fe31c901a23ecc5048d4",
+ "rust-std-1.59.0-x86_64-unknown-linux-musl": "dfad080e9d86d97929f040a3e2a113a17d4906809c47e9ab6410418b492116af",
+ "rustc-1.26.0-aarch64-unknown-linux-gnu": "ddddaddb585b95d81854171ac4e02d07790505853cee3034f199c8b7897f32e2",
+ "rustc-1.26.0-x86_64-apple-darwin": "5cb67314656d16cf2a1bdc84213aaaf6afdb5811825c7afba916e2d42d3d641f",
+ "rustc-1.26.0-x86_64-pc-windows-msvc": "427ae4a43a901be288ff3a4dc85d3a14f7e95108cfdaae63e8dbb4a227e07cdd",
+ "rustc-1.26.0-x86_64-unknown-freebsd": "9499ce5b68d631f8345c387e1f59b21892d97e0acb5650deb61a34719310bd38",
+ "rustc-1.26.0-x86_64-unknown-linux-gnu": "7ca9a30010602aaf2244c376a3cc5baa89429d54da17b8ba1cb0cdfdc846cc61",
+ "rustc-1.26.1-aarch64-unknown-linux-gnu": "7a06bd5312cbe8bb19e526b4c9ab04de1628019815a566ce0ff9401515bc2c04",
+ "rustc-1.26.1-x86_64-apple-darwin": "e5f4291c3709b170fbeb17fab7fae50fe0c626dbdc5c42ddb1f342ea03acbad4",
+ "rustc-1.26.1-x86_64-pc-windows-msvc": "e84dca395837aa24b4ea87d46d06a333c2e87d0be5fc5259476a95fbcb05accc",
+ "rustc-1.26.1-x86_64-unknown-freebsd": "dc3dc36010d73349152e6158522e82830fda173007b9299b0a947c90769c54ff",
+ "rustc-1.26.1-x86_64-unknown-linux-gnu": "45bc1c30e0c473c42889f22b182ec6f0b0fc3be0825e1607c64933592486eb2a",
+ "rustc-1.26.2-aarch64-unknown-linux-gnu": "b09fea72e259811fcbc6aade942329bc4588356470765987ee37d6108a82f7b6",
+ "rustc-1.26.2-x86_64-apple-darwin": "5b0a3d94a4fa76ed28859123e35c09a91d7eb8ff65f40ec4c50dfa56ffed8ae5",
+ "rustc-1.26.2-x86_64-pc-windows-msvc": "15eb657747a86a4481501bb21e2dbcf56a06c0beea00e8677c86ef74b8812576",
+ "rustc-1.26.2-x86_64-unknown-freebsd": "48f20a8dc6bc54c90aae685d0c3fa2caf3677f1c4a4d0c53aee9d15588bd0735",
+ "rustc-1.26.2-x86_64-unknown-linux-gnu": "1ebdafe52b581a63cea217a036fd6e77706d2715ae9cfe10a8c715d753326004",
+ "rustc-1.27.0-aarch64-unknown-linux-gnu": "b58c0373df43623adcc990d36190ee157f46f6fba650d0242632f3df2dfbc425",
+ "rustc-1.27.0-x86_64-apple-darwin": "0b00c6971ef524f68b911f621d199e60c339c390b18e12700d55e012b62aa90c",
+ "rustc-1.27.0-x86_64-pc-windows-msvc": "22eeac4f4b4d91c28cf18c6a4a8b477091e6661e3e827c0b32355d52e634a517",
+ "rustc-1.27.0-x86_64-unknown-freebsd": "24c193213450ffacffebdd1413d77fc3c1ed00049cf1ede2d0f3f370dd86b462",
+ "rustc-1.27.0-x86_64-unknown-linux-gnu": "29f399a1a208ea3f27f21e57f2d832e9d801c397a986aaea17e3a2ddeded6c3c",
+ "rustc-1.27.1-aarch64-unknown-linux-gnu": "c48d19ff5474ce75ebbb97e1b26ca8dc23d38f635ae7a3e21b8a4139df5cfb8e",
+ "rustc-1.27.1-x86_64-apple-darwin": "747f616e07e5da9323a21c1cf9d76b53bb46094a68223d461a7333f26c714f19",
+ "rustc-1.27.1-x86_64-pc-windows-msvc": "76abfd523f876516e589f62a83eaaa6e55496745e32f2e9f3f87aca55da3e8b8",
+ "rustc-1.27.1-x86_64-unknown-freebsd": "9b199c21094f996fd9d4b620a5ff2c4bc5b8dab13e96bdf7c113291f601ec944",
+ "rustc-1.27.1-x86_64-unknown-linux-gnu": "a6bf6205b345b854d705d0028a4e7161a0f5b209e464130e7d135fa01a296dc1",
+ "rustc-1.27.2-aarch64-unknown-linux-gnu": "c1a5ddc6e40be5eef7afad8c126c6f426d07eb1a297902c7ef871279fdbeea49",
+ "rustc-1.27.2-x86_64-apple-darwin": "b5c5edd2094afd0a92ad776dbd12cb6ee37800b940437dece10229ccacd1f561",
+ "rustc-1.27.2-x86_64-pc-windows-msvc": "c00dde7df7475340f5574b09c86d0e19f6707f838bf95d2ff463a8f4d4d76d33",
+ "rustc-1.27.2-x86_64-unknown-freebsd": "66d739632574fa52e82b40aca0eb4cef7a38047ed67cd6a240d8798a3cf9b6a6",
+ "rustc-1.27.2-x86_64-unknown-linux-gnu": "ec3efc17ddbe6625840957049e15ebae960f447c8e8feb7da40c28dd6adf655f",
+ "rustc-1.28.0-aarch64-unknown-linux-gnu": "09d1fa08d7403495ca07565eaabfcbe6703e842b765a68d5110cf4e64e988476",
+ "rustc-1.28.0-x86_64-apple-darwin": "10a5bf35177508c72050149663ff679a770eafa8557c6be0052603ca1267ae4d",
+ "rustc-1.28.0-x86_64-pc-windows-msvc": "39871017768fe779dbffaaff8696baf0788bb9c4d6c4caa3d2564e1153ab2199",
+ "rustc-1.28.0-x86_64-unknown-freebsd": "5eeaa17844f87e59aab821dc98dd15a920df0d1d7da3ef5808d2c586331c92a7",
+ "rustc-1.28.0-x86_64-unknown-linux-gnu": "008bb3d714544bc991594b29a98a154441914c4771007130361bbadfb54143d0",
+ "rustc-1.29.0-aarch64-unknown-linux-gnu": "c7480c0b98ae84151ffa8cadcb06d1ed2a11a755b6619ac1b89e7c886e98b7ff",
+ "rustc-1.29.0-x86_64-apple-darwin": "3462ba7e841485f93251762ce0b36a3922830a1249e5d79d6d010ceb43e4ee3f",
+ "rustc-1.29.0-x86_64-pc-windows-msvc": "b27c38cb60092e9cac8afc4ad760349821e6b068d986e13ad46233b9676ab35e",
+ "rustc-1.29.0-x86_64-unknown-freebsd": "38f30c96f0fa7ebfe94cd2db57e9b99961feca0a09045dbc1e955404b5d7f40a",
+ "rustc-1.29.0-x86_64-unknown-linux-gnu": "229c51d51efc239e6eb9b428795bb7f57309f11287705dcba4877d5e220102a0",
+ "rustc-1.29.1-aarch64-unknown-linux-gnu": "784ea61ff852225be622141600c79621456f1ad9f9becdf7070eb0217b8635aa",
+ "rustc-1.29.1-x86_64-apple-darwin": "64b86c923786dfafe8bbb5fcbef0d854132f29f0bf635830cd2d95ff225d2317",
+ "rustc-1.29.1-x86_64-pc-windows-msvc": "2675bf444df8fe900b84098917db3e765c87ad3c812ef2a818c7e622d77db457",
+ "rustc-1.29.1-x86_64-unknown-freebsd": "ed9b2ccbfc6028ce2c73105cebebdb9f2e2332018c687951639176358bfed9a2",
+ "rustc-1.29.1-x86_64-unknown-linux-gnu": "b99324394ba20bd12efa9d30dad72b10747bd075f97c7a9fd0ce3f9394383fa7",
+ "rustc-1.29.2-aarch64-unknown-linux-gnu": "54a8c54f04dec72d7f8655ce1c3037dc23ded2f9ada26e7ea77aa45fc8b0d0c5",
+ "rustc-1.29.2-x86_64-apple-darwin": "d9c0dd8127ed632e27d751f051bca933578317ffe891e39155ae721bc1d3ec05",
+ "rustc-1.29.2-x86_64-pc-windows-msvc": "53dcf97ed9461784d713c5a413df7e8e5aa4c9158a4d5921a038b77b17120a17",
+ "rustc-1.29.2-x86_64-unknown-freebsd": "94fba7a7b88ca86c037a48376b7e09bb4ca66e1268fc8d664796cdbdee97c0fa",
+ "rustc-1.29.2-x86_64-unknown-linux-gnu": "b04146b09edc4bad0de7c8fa1a5a2aa4416d365c03c5962b8a5b26c7047b7cc9",
+ "rustc-1.30.0-aarch64-unknown-linux-gnu": "ccff6c6d8386655955265f586862314dd3b646bbeccd1369877f4343b1960a53",
+ "rustc-1.30.0-x86_64-apple-darwin": "d4fcbc61c7323e6fa1001ae268c5db1693ff07e5ef1ac25907138a2ee7bd8faf",
+ "rustc-1.30.0-x86_64-pc-windows-msvc": "2d2d1a51bb15794920a2f0cccf7fd2c8bfb037d00975e799ff4a4ac3b83032ce",
+ "rustc-1.30.0-x86_64-unknown-freebsd": "68a74949e34118406673cf8cc0098b011907c840890e0640aa3b145ce91c521d",
+ "rustc-1.30.0-x86_64-unknown-linux-gnu": "cc45058e9963d33ca28220e752d9e360b7e05f17e34284f5f8197738c3a88444",
+ "rustc-1.30.1-aarch64-unknown-linux-gnu": "f3569c0a74f07aa2e56bf93c9f2aaddf7434ce17f85d6d6ff854fb9245888bcf",
+ "rustc-1.30.1-x86_64-apple-darwin": "fd8ca09595e9d686aef9e3b94259500b482cf7a01de167a8c72a4f8d19a604f3",
+ "rustc-1.30.1-x86_64-pc-windows-msvc": "8ad1551132de8c766d2d7c66d9bb93a959ebbfa7d86c47f196227fea914583dd",
+ "rustc-1.30.1-x86_64-unknown-freebsd": "2f79e386bed201eb9b6ffa58240742617ec6006accb559dab7b6424f33b65b5f",
+ "rustc-1.30.1-x86_64-unknown-linux-gnu": "d84de208499b59e4a3c074f9f3f2fcbb26fb20d6bfd19262e6d5f4181ddbe34d",
+ "rustc-1.31.0-aarch64-unknown-linux-gnu": "1e480d8cadceff39ad39d30fe874bfd485386c98842f16423310cb2ada1923c0",
+ "rustc-1.31.0-x86_64-apple-darwin": "250fd3f3aba7d38c4af9682a12a37c733dbd6dde127665b0f493551e6c4aea8b",
+ "rustc-1.31.0-x86_64-pc-windows-msvc": "418abc285870ab4d85d53769eac229cd66b7fc7cdaa6e73699530e88ee5dfaf4",
+ "rustc-1.31.0-x86_64-unknown-freebsd": "9ec40454e22e3494b9859c03e37e8851077f897845bcf838d69d4393900e7b33",
+ "rustc-1.31.0-x86_64-unknown-linux-gnu": "5c4581f0fc05f0f5076db6231b0c1a4d27eb61c0b36bfb42d97243ad8f4e43a0",
+ "rustc-1.31.1-aarch64-unknown-linux-gnu": "315ea9c981e4320a557f6c75b58242c0598a90316f610b4dfef5d06e82b927f2",
+ "rustc-1.31.1-x86_64-apple-darwin": "e3f9c5ccd0e6e09da8012f30ee9a1880efebc0c039cc1f3866cf50c984be16a7",
+ "rustc-1.31.1-x86_64-pc-windows-msvc": "0320b7544de463d4444c6445fd2e23044e28fde1173f614145a72a4bcfc6ccd9",
+ "rustc-1.31.1-x86_64-unknown-freebsd": "fb38ad94976c273c0fb95d0b5ba2d1ce90684e58fa06fafc9f8050ba00559f50",
+ "rustc-1.31.1-x86_64-unknown-linux-gnu": "77d47ce7e27a146e4301f11befd43f3fc5ac195ace0dfc07ac8154f130b057ea",
+ "rustc-1.32.0-aarch64-unknown-linux-gnu": "193cbe67161e20a0bf4eeb8bafeb302f3e61a59ca939a0454fc3fbc76e9524cc",
+ "rustc-1.32.0-x86_64-apple-darwin": "0334c4568f09cae984e53e4a3f4ff207e2bcc50fce13ad32b8eca89f014e5e61",
+ "rustc-1.32.0-x86_64-pc-windows-msvc": "a7799495d3032c5ad6b5f712f7d7a9538f695c6d8d2e5258c0f7aadac8cea1d4",
+ "rustc-1.32.0-x86_64-unknown-freebsd": "a14a0e288be8ce894a85810151a2eb70fc86afa36e4a5fae4e903c744b888687",
+ "rustc-1.32.0-x86_64-unknown-linux-gnu": "75c31f32e19548c1608611d08b82b87560e02f15caac7b2663a8189a4609977c",
+ "rustc-1.33.0-aarch64-unknown-linux-gnu": "e23141cc65d1d8e3957a96f3a601bdb7a9d09026ac20396aeaebd2613ea0d08e",
+ "rustc-1.33.0-x86_64-apple-darwin": "ea1f0a95015bbefba9eac5890b12ee2887f464822ab579c8bbc2db3023c6dd08",
+ "rustc-1.33.0-x86_64-pc-windows-msvc": "b935a78d072b9ae91ff8ddf9155df95d77fd8a1c6293e39df3c65b18d860320e",
+ "rustc-1.33.0-x86_64-unknown-freebsd": "8bfc7fc50c50294cf4ded35360b41b590180401a0d2e84256f5931c7c1ff35cd",
+ "rustc-1.33.0-x86_64-unknown-linux-gnu": "54a342f718b712d8a17fd7878ebd37d22a82ebc70b59c421168cd4153fd04c2b",
+ "rustc-1.34.0-aarch64-unknown-linux-gnu": "364328a40c7aa5749be80b13a14466149a559205e34aef3d8823dc2580f55921",
+ "rustc-1.34.0-x86_64-apple-darwin": "2044d44f01a8aa7fb3382f35fc839facfde4fc1eb6f951ead42aef954e317088",
+ "rustc-1.34.0-x86_64-pc-windows-msvc": "371f9abd2bc615b339dfd606d93e6b4892594fd86084d513e07a9f80ff21a828",
+ "rustc-1.34.0-x86_64-unknown-freebsd": "522662f147d0550e4f4f49026b4ebcc5e05a0935fa88acc9b99da5d7435755aa",
+ "rustc-1.34.0-x86_64-unknown-linux-gnu": "5852e84dd30e4a552a7cd4d7c0172648d7ffb4d9ac7078871adbb902c183ffc2",
+ "rustc-1.35.0-aarch64-unknown-linux-gnu": "dc06d77e6cdc06693d3b87ce473f151c96bda2c1e5dbba8c0354c54990c64fc2",
+ "rustc-1.35.0-x86_64-apple-darwin": "5b2fb7581332f349c041860479ffdbfec0eebf87fc3016146836b8868afc3ae5",
+ "rustc-1.35.0-x86_64-pc-windows-msvc": "df4f94d29d10fde2486d9fac3247a566d99a2b7f97fa6ebd416f308b804f7693",
+ "rustc-1.35.0-x86_64-unknown-freebsd": "d3b5a6cfa41264e1873287bdb89892a7edc40333d581f468890c68336f50a601",
+ "rustc-1.35.0-x86_64-unknown-linux-gnu": "bb3a07a1f2fdc3eeeee25fc40131d3f05494e3838dfd4e9275475ffc500d7a9e",
+ "rustc-1.35.0-x86_64-unknown-linux-musl": "a975395127a2abf727a7c6b6ed2656e90368b46c5e6ccdc53fd50acca3cd3f94",
+ "rustc-1.36.0-aarch64-unknown-linux-gnu": "62e40e0677032ae0cd91a7f8b4450dbaaf5223050a05b28a9174802d09691da6",
+ "rustc-1.36.0-x86_64-apple-darwin": "97568272717ffa62dbf4459dff6086e69c808df252a912146e28468412667013",
+ "rustc-1.36.0-x86_64-pc-windows-msvc": "4c131f68eac74bc20315eda097578c43de2b695445739462a4b273f90a131ffc",
+ "rustc-1.36.0-x86_64-unknown-freebsd": "c2dd0cec49b054ed9439762fb31555b8df9a3d81747b194f7d3afbc6d8adb8de",
+ "rustc-1.36.0-x86_64-unknown-linux-gnu": "7c149fa1695b41e8e1edcb95dca199522889f119be99f922741084d50470a9e5",
+ "rustc-1.36.0-x86_64-unknown-linux-musl": "913b7097e13c4e616edb8f83a3a976908c8c12295472f65a5682465145ced552",
+ "rustc-1.37.0-aarch64-unknown-linux-gnu": "721ba21dbe9b350a8c50a4c783c76ba3f6926525480518851dd6ba92ecdb042c",
+ "rustc-1.37.0-x86_64-apple-darwin": "00d4d15b4d9a4d188e0db8bbc17cd5f0c3c3a87ad681e80ef15580c0d5bd4ff3",
+ "rustc-1.37.0-x86_64-pc-windows-msvc": "790bdb5b57f397d7481151ad8715f7ac3f32b343efaf2922650f4fc6e374d7d7",
+ "rustc-1.37.0-x86_64-unknown-freebsd": "a4dd357a0b39abf1ebbe8a0f64973c3b0c5bc527e374c12afe51266279fc1ca6",
+ "rustc-1.37.0-x86_64-unknown-linux-gnu": "c759b318f333639a45f29c1551ca7ce55b1bf64e0fc3a3357d6b9356885d1626",
+ "rustc-1.37.0-x86_64-unknown-linux-musl": "1981b67c0cbcaf37f40ee9576d6d1b9a554019e571fc4c49ee9457cf011e0f75",
+ "rustc-1.38.0-aarch64-unknown-linux-gnu": "0c787eaf01b5779b5a0c12bd0573901cf1b58e5e484ad44c3530b7ed51754d15",
+ "rustc-1.38.0-x86_64-apple-darwin": "ac34aee5a5f67003b8f7f857ddb1fa68f89a32680a591ab77561282721b75256",
+ "rustc-1.38.0-x86_64-pc-windows-msvc": "6e00ee5f34c552c1b9fafec3b7a1330140c820a2ae4bd4213d2c4f135341a88d",
+ "rustc-1.38.0-x86_64-unknown-freebsd": "1d99318bbdc947c6dc375215f0eddcd767348c309811cd141e5d18e17d5aaaa4",
+ "rustc-1.38.0-x86_64-unknown-linux-gnu": "790a611695fabd12c3a141efa58b3dc5913d749947c1a95d3f5b6eb5476ee612",
+ "rustc-1.38.0-x86_64-unknown-linux-musl": "bb0166cbb1d31bcb09d79224e7ac43a80d9448b7199b5392a3852b3ec71840aa",
+ "rustc-1.39.0-aarch64-unknown-linux-gnu": "c64fc482404277fdb160a4b593b0be5a1b0c32d985464595015295321d111621",
+ "rustc-1.39.0-x86_64-apple-darwin": "9347ffb47e936fb44666ada525f8bfb86758a719e7c0330e93e17bbd5f3623be",
+ "rustc-1.39.0-x86_64-pc-windows-msvc": "9a94785fdb473079d02f32bded6691322688001dcc16f5bfb582c1d181d3ef67",
+ "rustc-1.39.0-x86_64-unknown-freebsd": "3714bf7bd4163a3bfe18291d49acaeda02f4bf2beb9fe36c520d2ecdc29ca031",
+ "rustc-1.39.0-x86_64-unknown-linux-gnu": "333399dbf96dd6b8a9dc9cc56b1cb5d8aac2296b4e4aa857bd59d906d6df6fa1",
+ "rustc-1.39.0-x86_64-unknown-linux-musl": "07a9705dd77c6859ef921389dc6a958a297030e53571fe015163c79aa93d1e43",
+ "rustc-1.40.0-aarch64-unknown-linux-gnu": "8981d500261ecfec93c4b52e8f96a81c705b56ff9317d63e0363d11a72ee09a0",
+ "rustc-1.40.0-x86_64-apple-darwin": "f45bb00a9a59ca819a8266e9de77f7232f4b704d64f1c45d3870e2db4f646a77",
+ "rustc-1.40.0-x86_64-pc-windows-msvc": "16299638792b7bffb63ca20674a7196a33d1fb25e91083b90f8015be010eec19",
+ "rustc-1.40.0-x86_64-unknown-freebsd": "65810804d3e4cf8f845978c6226f8e23d77a7ccf35ebafdd5f8dac027627f396",
+ "rustc-1.40.0-x86_64-unknown-linux-gnu": "5085a26abdc932fd9339aab2078084f9ab654f8298ad9f301611ac41ba8eca19",
+ "rustc-1.40.0-x86_64-unknown-linux-musl": "acd01559a875b57f6fc7e27beafd8d011f8295c627ab276d814700082088f2ed",
+ "rustc-1.41.0-aarch64-unknown-linux-gnu": "9d994935f92088c968f520f558a88b140bb7d60e917fc4ad69019e2b830b1db7",
+ "rustc-1.41.0-x86_64-apple-darwin": "25ee8865e21007c282cd1f3457c3bf932591337c3044e55ba574fc988bead3ad",
+ "rustc-1.41.0-x86_64-pc-windows-msvc": "b338afb534be113f179252f8de29195e201dcd8bf4053b1d5e8eef928c457ca3",
+ "rustc-1.41.0-x86_64-unknown-freebsd": "de3386f79a0e261b8f6133dc0d5a7d51b70ad73dba5a14dd30204ac285d04f3a",
+ "rustc-1.41.0-x86_64-unknown-linux-gnu": "531b4cc77cc25e960aafa2ebaee073c137fceb0004447c6b7274557281c62a6d",
+ "rustc-1.41.0-x86_64-unknown-linux-musl": "18c0f6d263d3a54a6842e2feab7c90ce5d8e5136b67cedabb98756f029122c8a",
+ "rustc-1.42.0-aarch64-unknown-linux-gnu": "612c10793852fd0c2e52b30f3d50dd6aef6f8181032b820eddefc93e3bf4d97b",
+ "rustc-1.42.0-x86_64-apple-darwin": "778dea93d7e46261e2c06cadec35b68f9857604f279ce6fbd1b37c1a89634625",
+ "rustc-1.42.0-x86_64-pc-windows-msvc": "d132f99df49cb0d421f6d8948a268d4eddb1ae23e0af2641272438998503708b",
+ "rustc-1.42.0-x86_64-unknown-freebsd": "e6e36a7df9886b18cce32752f5ac7a8da6977c6a1878fae696340f3843176fe5",
+ "rustc-1.42.0-x86_64-unknown-linux-gnu": "4242a728b850bf6e74db9a95c68e8ed316fa4813b38e6b8bc296396b5f47ea5a",
+ "rustc-1.42.0-x86_64-unknown-linux-musl": "60945b79fdf8be51c87967368245380a64d0d331ef1aefa778712f3695028c39",
+ "rustc-1.43.0-aarch64-unknown-linux-gnu": "99f26a2b4376fc08203d129d65e15f01b2630db40dd2d4d6a7b917df8d512e72",
+ "rustc-1.43.0-x86_64-apple-darwin": "3723b8194e38d7238262b4cc49762a22037f53f58ab1df199c1d710dad5728a5",
+ "rustc-1.43.0-x86_64-pc-windows-msvc": "c6d1aa60cf2056c4fb35a5a197fb4e1a42887eb4ad1615b00398524ff78ce74c",
+ "rustc-1.43.0-x86_64-unknown-freebsd": "69d572e80e13da85599557f662ce71909823194c874eea0fe91f82da0958fa68",
+ "rustc-1.43.0-x86_64-unknown-linux-gnu": "950b323044ae9a7932b697a2e4f4f62b59248f58faa320e22dc20f8ad9521f6b",
+ "rustc-1.43.0-x86_64-unknown-linux-musl": "7b9ff3fdc2024d044f19bfd5353441fa5fe7409c9ca4883726b5c8fdece3a7a6",
+ "rustc-1.44.0-aarch64-unknown-linux-gnu": "b0fc4cee7119c10f79fe2701ca0d19ab738bd20954352ae5b1dcc4c6f432779a",
+ "rustc-1.44.0-x86_64-apple-darwin": "4fd09afcae85f656d4a545ee415e19546e03e34f1ca23be5eaa68c489e3186ab",
+ "rustc-1.44.0-x86_64-pc-windows-msvc": "0b3aec27d86034cbadf4adbaf36308bcf98d97c0979d162ffccf4328fb4f96cd",
+ "rustc-1.44.0-x86_64-unknown-freebsd": "6f3c4e16bbda8719e5c07dc687e84a7236e097da55c4fabea13ef1cbd6a30c40",
+ "rustc-1.44.0-x86_64-unknown-linux-gnu": "52671652e7045df0702d8f2e8af60bf6f20da3e3a5db1aa6022bf9545e914449",
+ "rustc-1.44.0-x86_64-unknown-linux-musl": "71440388e5e4affe11fddf3c3a706ac6f129d9ea47717894b586290e553223fa",
+ "rustc-1.45.0-aarch64-unknown-linux-gnu": "b1ef2ea19142d851f2ee6936cd46a30ec8f157ba53048bc2748279d1e9e0ad17",
+ "rustc-1.45.0-x86_64-apple-darwin": "fd17d99c3e827f0b4f01b9122d4bf2fca0f1144827300a1eda93718d8642b39f",
+ "rustc-1.45.0-x86_64-pc-windows-msvc": "f65fb383f2c6f979a19acbd4e099e6eea8addc0e76f1fd988582dfc0daa4a121",
+ "rustc-1.45.0-x86_64-unknown-freebsd": "b5d263c53320f8a5dd5daceac1e60da172fd21614ada67f584565430d9d1c9c6",
+ "rustc-1.45.0-x86_64-unknown-linux-gnu": "3ef2fcf818c133c3e9957441917b23ea536805efd0ff9ac6ee0bea349d703a90",
+ "rustc-1.45.0-x86_64-unknown-linux-musl": "596f04e0774225ca85b5c99575854dd66973854ebcdd0b7a60d3c2cff4d415db",
+ "rustc-1.46.0-aarch64-unknown-linux-gnu": "41239ece19c79250a205e5b2fae60b242bba4bf72b687bccc88f011e66a872b6",
+ "rustc-1.46.0-x86_64-apple-darwin": "f690b375df7b1399e5baa69b64932e3e4a3f2b651e5ef2ebc85509bee777a9d9",
+ "rustc-1.46.0-x86_64-pc-windows-msvc": "56badce580b65f59d676b20b4e5f138969e5039182b7f6052ac7da9d38bd0aca",
+ "rustc-1.46.0-x86_64-unknown-freebsd": "e76d3e18d1826753395d881bc37be3d43e9ff8d2d34d49d7ed6105f228d56284",
+ "rustc-1.46.0-x86_64-unknown-linux-gnu": "4c0c740cfb86047ae8131019597f26382a9b8c289eab2f21069f74a5a4976a26",
+ "rustc-1.46.0-x86_64-unknown-linux-musl": "6ab2664edc93122b7a93a1b72025e869d088445af65d3df286258c3860090114",
+ "rustc-1.47.0-aarch64-unknown-linux-gnu": "2e143bfa59eca5c3f3e995c5997ae55c7defe824fb4dbe7e77896e132f42c24b",
+ "rustc-1.47.0-x86_64-apple-darwin": "4773ad46b912c859984f1e4466e506dd8102603d1ffcd8b63cfe7522f49e5987",
+ "rustc-1.47.0-x86_64-pc-windows-msvc": "f2010e4500602d0efc431c0853692733415bedb58652376023d7d6ac204f8c7c",
+ "rustc-1.47.0-x86_64-unknown-freebsd": "811f298c07fb32a6a01f9960f2d7dc403f6f288a3f475ed9806648e2cc5938ca",
+ "rustc-1.47.0-x86_64-unknown-linux-gnu": "d96be0ae1deada01f41372ab2c2f485a9f8625069aeaff33c5b513061e9706d4",
+ "rustc-1.47.0-x86_64-unknown-linux-musl": "4c6979e2b01fc8da0f83b30e9ccf869f692ad84cf517e300362624d9eaac8635",
+ "rustc-1.48.0-aarch64-unknown-linux-gnu": "9c83a5d18f6ca913eeffd78c53913da288b171ff245137b646a8fd280fe72340",
+ "rustc-1.48.0-aarch64-unknown-linux-musl": "eba49211f2e0aae157e18258edacb3031dc8b4bb6db0bca142c919d9042c7ba4",
+ "rustc-1.48.0-x86_64-apple-darwin": "846f45f9bd6676e9d1f6758279b48e32564ba23773e69aa89692dbc123dbea5a",
+ "rustc-1.48.0-x86_64-pc-windows-msvc": "395b2a8e6824b3e56a8a9b4598273be5410b4ea64e92c8aeaf900d9ff21f470f",
+ "rustc-1.48.0-x86_64-unknown-freebsd": "fbaff313c2423f1ababc9792332560ca0e3749abf3749e7eb5289bc6515d9424",
+ "rustc-1.48.0-x86_64-unknown-linux-gnu": "aa4a96b010e0d4573e6a1fec230beaadaae6cdce2bb4befeee7b1c081ee9ef8c",
+ "rustc-1.48.0-x86_64-unknown-linux-musl": "5513813bdbd1aa5e4c4a0a0e680953b72d24829595920fec4e69da3682abdc0b",
+ "rustc-1.49.0-aarch64-apple-darwin": "3e8c0c9101f27623f7607f2d8acef5f28dcb2bdfcded56f210d9d370cf9a9c06",
+ "rustc-1.49.0-aarch64-unknown-linux-gnu": "b72699cdf74c03ccc0aabab937a69807f2ceb5861f3508593e1c222190c4efc7",
+ "rustc-1.49.0-aarch64-unknown-linux-musl": "b76b7f687ffceed03a86e69dafd251e8e069c31c31dbe70c0fcad1ace5398956",
+ "rustc-1.49.0-x86_64-apple-darwin": "09333f9aacb9c5959e2a2798d7e283cae674255f063a35ea28f91595caa0a78b",
+ "rustc-1.49.0-x86_64-pc-windows-msvc": "800b7571438850074aeb0fb9a0e7d890c6785f9f4823b3052b9b0b098bb9ddd4",
+ "rustc-1.49.0-x86_64-unknown-freebsd": "66427837606aba2cda99d4f52161bee1086e98b226a5cb99be8e9a7bf896495f",
+ "rustc-1.49.0-x86_64-unknown-linux-gnu": "42300556b987934e5e4677972c1dfc57eb07731dc62fa9f4f561935a1c84ed0e",
+ "rustc-1.49.0-x86_64-unknown-linux-musl": "4c56ed1fcee28a6f35c98d14edd34a33a60f52ac583c98313623760de093bf7d",
+ "rustc-1.50.0-aarch64-apple-darwin": "3abc090591fb7fd0a292eeff4cc6a029841d39b0a768eaf1f0b9e4e06cba8ed7",
+ "rustc-1.50.0-aarch64-unknown-linux-gnu": "9afe0e968da845981b463beb75f91d6da0d4de5443d1abb6002b75a8cf066ea7",
+ "rustc-1.50.0-aarch64-unknown-linux-musl": "abafb6bb1d2f065b72b43331e6cb00f3c98c78af00f261e1c53828c26528a078",
+ "rustc-1.50.0-x86_64-apple-darwin": "3637ee8d8bc0f8e922b1f9ec7b6fc00b6efcceae97c337d205a3bc472be7b936",
+ "rustc-1.50.0-x86_64-pc-windows-msvc": "d7f7607c9cd3e137a335904e1186345f4328a971588ee8a54838e32a35a38e3a",
+ "rustc-1.50.0-x86_64-unknown-freebsd": "916e616188638738ff217a047b3fbe372d9ad3734bb466d0e56d2fcefd1da5c6",
+ "rustc-1.50.0-x86_64-unknown-linux-gnu": "160a91a3f545f96b2b955cf48811080d8e0accbd9d9a9732b080e1ffa72113bf",
+ "rustc-1.50.0-x86_64-unknown-linux-musl": "528d02fa77fc0da26904ff10da2d6f94c6da618c323b37247b49fe28fd950240",
+ "rustc-1.51.0-aarch64-apple-darwin": "110db4985d7cb18ce6879f34fc02422f5f074b3a2b40b62e6bfd54ceaaa56d33",
+ "rustc-1.51.0-aarch64-unknown-linux-gnu": "b63b21d56cab87133c9cd149f7c8ca3b3399a877cb16496a86f7a87d8b15c784",
+ "rustc-1.51.0-aarch64-unknown-linux-musl": "58305d3fffa1662114587a6144afff9a872496aef6073b23dc5da9676d315d5a",
+ "rustc-1.51.0-x86_64-apple-darwin": "abca027d4e45870ac97f220e5f60f4e849dd53f575f902046952a127da739aa2",
+ "rustc-1.51.0-x86_64-pc-windows-msvc": "a6fee78393f3ee78bc81b5437122f7fd220d8d6686c9cfd41848bd699c9758f4",
+ "rustc-1.51.0-x86_64-unknown-freebsd": "572e7c13bb5951a12a9f6f422e636da8468747d29ab6901ef3b5b03932482e1a",
+ "rustc-1.51.0-x86_64-unknown-linux-gnu": "6b1298ef220302a33cad21fad7c8e1535264872b18e2ece733ac37ed31571dda",
+ "rustc-1.51.0-x86_64-unknown-linux-musl": "77614b115eac2ec975f29a8e2d60d8a77834f11689ff6b0d94eb74d4999df285",
+ "rustc-1.52.0-aarch64-apple-darwin": "9e17debb80c85695aef2b76f1b4ff3a10ab40947b386b2590fe168c4ba77ea42",
+ "rustc-1.52.0-aarch64-unknown-linux-gnu": "cbfec2d4cfd38a04e1945beb4736a6ad2eb22f3a18743865158c4e0a4da43450",
+ "rustc-1.52.0-aarch64-unknown-linux-musl": "fdf8be2fd4c4505155f81099e171fca5300f14cd1a343b4e11753bea99f2764f",
+ "rustc-1.52.0-x86_64-apple-darwin": "abed71e08d05a47f7a54495212ef67e020cc61edd6c90cb1589bb4c7f771a821",
+ "rustc-1.52.0-x86_64-pc-windows-msvc": "bcad3eaaac6f8bc117346047b3efa088977927ca668477b6e51cd037428ceed2",
+ "rustc-1.52.0-x86_64-unknown-freebsd": "5883388f0d1abc7e187d03bb213a4f34b8487ae4b665d9a76acd80c86fa5d3de",
+ "rustc-1.52.0-x86_64-unknown-linux-gnu": "76f16908c37c719abc1cd28e9cb4cd484aa88ba00152b2de3188b6ce86eea848",
+ "rustc-1.52.0-x86_64-unknown-linux-musl": "13e1ef7a3db7a90a2756e423cda10ae0b95510f041d543d8c00a91a2ffbb68dc",
+ "rustc-1.52.1-aarch64-apple-darwin": "d9f76477db98aebcbfd5ebbe4ce5c3aff30d7ac0185b25cec27e4ecc376ef4b8",
+ "rustc-1.52.1-aarch64-unknown-linux-gnu": "5218780009126b391786280f76b98aea743fd7cead8d48befc03791c095f88d6",
+ "rustc-1.52.1-aarch64-unknown-linux-musl": "a1dea60ad703c424f99becef772b97ea3966974002427ad8baf3ff5473fd7ada",
+ "rustc-1.52.1-x86_64-apple-darwin": "bc896a1c701ca10328671710c4a06ec4774b398cdeb64cf55fcf247f31dd275f",
+ "rustc-1.52.1-x86_64-pc-windows-msvc": "1828ce5c7ca28e7cdc9cb75105dd3489ea1e3648f800d3db0e99c248292d816e",
+ "rustc-1.52.1-x86_64-unknown-freebsd": "2de1df845045a8c6dc3832e7d615c9124c52eb5626b1aff1219e66fd3116623b",
+ "rustc-1.52.1-x86_64-unknown-linux-gnu": "52002b050485674e87fdd72c7b49dac8783dfa36575be7e6265a69b4e66f8570",
+ "rustc-1.52.1-x86_64-unknown-linux-musl": "195711077d44392a13e57c6695489e71cf811538eba02758dbea7c4ca2a72047",
+ "rustc-1.53.0-aarch64-apple-darwin": "a7f9c48adb4062c43bfad8fe608551c98d538529cbd13cb979578532a91edbe2",
+ "rustc-1.53.0-aarch64-unknown-linux-gnu": "a54267708a1e80bab2c0a919284b9387f4b70ca61a96dce7544b2c8001adc5dd",
+ "rustc-1.53.0-aarch64-unknown-linux-musl": "b26c35cc651c9233c58d08c12c076413a9637875a7fceef3f6b582629e169282",
+ "rustc-1.53.0-x86_64-apple-darwin": "ad3d181deafb4bfeaf3d313828b258b89ad2fece3623bb4c4488e282db802e39",
+ "rustc-1.53.0-x86_64-pc-windows-msvc": "27b895346c458c141d1cd277b3e87380ad3e304c62c7240d778a0cd3dc245581",
+ "rustc-1.53.0-x86_64-unknown-freebsd": "304eb5d1b4a8a98fb67cc1a9599c1c0ef7553d939945a6a80d768e3b69ff8c75",
+ "rustc-1.53.0-x86_64-unknown-linux-gnu": "c2c24b41602a589886f87276d4d46e42efddbad820917dc4dcbf6625cdf9ff52",
+ "rustc-1.53.0-x86_64-unknown-linux-musl": "6ab5694ac8ed7ccb79b7689e5dcf9198ddb937e123d31289e7b385bb60b3848f",
+ "rustc-1.54.0-aarch64-apple-darwin": "f18bbe09d8e08be5753e5f536ddfe15d4141b3ce968a2809a9869c91d492292b",
+ "rustc-1.54.0-aarch64-unknown-linux-gnu": "595e8db56e68247ee3caf29f6a3d3c72d7955ed45f1291e7e596d63923427a86",
+ "rustc-1.54.0-aarch64-unknown-linux-musl": "02360abef6aebef211a3e6fccfbc81f27c83e930c3291f95e033c8c9eb6c07b1",
+ "rustc-1.54.0-x86_64-apple-darwin": "b3ac970d31893a192c8ec46fd6c9b8409751246cba029a212c4cd84115086a13",
+ "rustc-1.54.0-x86_64-pc-windows-msvc": "9fd8ed58b28cc6554dc7ae17e8b96770cc4736460c4a0047c78fb7ff54d53f10",
+ "rustc-1.54.0-x86_64-unknown-freebsd": "a2974a15b2b284c09eeac39396728544700fdb8689e8b662ee062e68daa0b554",
+ "rustc-1.54.0-x86_64-unknown-linux-gnu": "cd4c1c5db3b8ca3f76fac42d209e83640794eb8c2bbfb71b71e5f93b584d159c",
+ "rustc-1.54.0-x86_64-unknown-linux-musl": "896b4eb229259005410311a29587aaab4ed7d5d590d810b06abd7601a004a953",
+ "rustc-1.55.0-aarch64-apple-darwin": "4d782c947f1a35f5fb60799f019b4b82ad121a017746c935ab37fbd105c66c8f",
+ "rustc-1.55.0-aarch64-unknown-linux-gnu": "31dbbc1395f5a545c114e778552159713977dec423bca5705bd4c92ee3840cb1",
+ "rustc-1.55.0-aarch64-unknown-linux-musl": "a5170d72af554b1d39a0db46cb2bd55911132705e3cf8e38d16a382f3b9d4215",
+ "rustc-1.55.0-x86_64-apple-darwin": "7d1197687c72d4c72ae04905b96a7205ec4ad7c9da0231ea6f3bbbc8399adb84",
+ "rustc-1.55.0-x86_64-pc-windows-msvc": "2cb681fa074386af8dd2cc6c79b57e1a8048acb1dda18e04fedff1c2dd84d70b",
+ "rustc-1.55.0-x86_64-unknown-freebsd": "ad50ba2c87acb59020959df594aadc207f4fa527b2b2cd8849f3b1d3f666986f",
+ "rustc-1.55.0-x86_64-unknown-linux-gnu": "9da098b2df01124f2c4b9789767151521f4bab98f50befdc75a691cece0c0d00",
+ "rustc-1.55.0-x86_64-unknown-linux-musl": "f7c1fe2393db842630b23ecf6164fac471b11235fdb62a35a86e7cd3cf8d749c",
+ "rustc-1.56.0-aarch64-apple-darwin": "c588dc2cd352eaf27ae74ee593bd0aaa65ac2742416c714f5827f395bb7c19df",
+ "rustc-1.56.0-aarch64-unknown-linux-gnu": "eb7283729bc4c336aa23b020489e8feb78eed70831213ee2e4121ce7d6ac33f4",
+ "rustc-1.56.0-aarch64-unknown-linux-musl": "e312187386bfb39fde04ca007faf656179e8c2b1bb1a0d59007db7a247b54b4e",
+ "rustc-1.56.0-x86_64-apple-darwin": "a724945de2bb0ba78e56217ba02f67ad0cb07a01c2438b01b91f85fb94d273d2",
+ "rustc-1.56.0-x86_64-pc-windows-msvc": "1034b2f6150d892649c1eb8fb10dbb4228ca2010f88720795e6a12696cab369a",
+ "rustc-1.56.0-x86_64-unknown-freebsd": "4e7a2f62ef2873b3bd45749133c1690c4b0e037af5a586e9ea691e480f8d2d40",
+ "rustc-1.56.0-x86_64-unknown-linux-gnu": "aa66db89c3f89325e40ba0bfe481f4d631559884ae4812c3c3d091d80ba7c245",
+ "rustc-1.56.0-x86_64-unknown-linux-musl": "5f7ed6c289b56c129d6dbb407348f566caf39cfc5db35a4b6253cf514940482e",
+ "rustc-1.56.1-aarch64-apple-darwin": "fcb2c2e46e3cc7e7cba3abbb78ba87131aea56770145f8d97944b675a491312a",
+ "rustc-1.56.1-aarch64-unknown-linux-gnu": "9e7461908d0b3e6f4bbb158b71d85e536c186fe571c9960f8ef4300328b25a11",
+ "rustc-1.56.1-aarch64-unknown-linux-musl": "1e913b7f39d0f478c48ff9b9dd6a05dfe67a6ad58e478509cafb20e106512965",
+ "rustc-1.56.1-x86_64-apple-darwin": "876b9ed13a71ada3c00878c6006d837b852973cba84419753445c8a8a76efe00",
+ "rustc-1.56.1-x86_64-pc-windows-msvc": "709fa5ad9723e233025ab0cd142b628cd8a4bb8d11fcdbb97a779d78a60604e5",
+ "rustc-1.56.1-x86_64-unknown-freebsd": "b6a440bf5c3b1e4930effc07c6e50bf03cc44c0465f0c379d626b800f4971700",
+ "rustc-1.56.1-x86_64-unknown-linux-gnu": "d09557a497a4f3b0726cae4c8e193843e403c80615f25f6ef740c79d7e4c122b",
+ "rustc-1.56.1-x86_64-unknown-linux-musl": "b49ef5d9d8a2c49e48dda8bf08fc5a95ac87095a8895df9dbce0ecfb1a97c70a",
+ "rustc-1.57.0-aarch64-apple-darwin": "cfd28be33d8669c85dc177775de6c4aa94289bba7cc65b90cbd2d9cd5486c860",
+ "rustc-1.57.0-aarch64-unknown-linux-gnu": "91f1e29387fc53430592985b0620c8587e4aacc8ac582de4ef96c45c9ae930d4",
+ "rustc-1.57.0-aarch64-unknown-linux-musl": "e5289c930ed72c08310108f543deafc319c27389523c6c6905fa35283e9ab725",
+ "rustc-1.57.0-x86_64-apple-darwin": "4417eea141bb915f39305cf2d812579f503422fa2e712eddf11427ce91c48294",
+ "rustc-1.57.0-x86_64-pc-windows-msvc": "073bbc3f8f71fb20bf6c7bd2e4cf6e2758c8ee6f08d3eef51a615d5b5b8a516b",
+ "rustc-1.57.0-x86_64-unknown-freebsd": "ef9af581c88b5d52f3b91f8781fbea77426364ac035bb7cb274f41fa3bf60706",
+ "rustc-1.57.0-x86_64-unknown-linux-gnu": "92257646cd85b7c03520c838920851c879845ed8dfd2b339d2ebb4480ee4d4d3",
+ "rustc-1.57.0-x86_64-unknown-linux-musl": "49ff02cdc94bd8732c2969b06006773311c8e41c188a9cef627b37eefb0b73d7",
+ "rustc-1.58.0-aarch64-apple-darwin": "7b3291177d4f8a73c8e20185a04bbc88775fc85eeb271c19bc8f37fb5051ae0c",
+ "rustc-1.58.0-aarch64-unknown-linux-gnu": "34d8fdaec504efe6e9448ad5a118ac0e7ef3bd9a8f6c49ea68204f2f9a9dae4e",
+ "rustc-1.58.0-aarch64-unknown-linux-musl": "2c6ee3dfdd496a01f55f6b0ae683d3acdecbd42ee386c4000b336351e89b3cac",
+ "rustc-1.58.0-x86_64-apple-darwin": "3d3815385dda1c1d8617ee14b682ec3804307b0f5a0ac5604a7dc5efc783263f",
+ "rustc-1.58.0-x86_64-pc-windows-msvc": "2296e7bd3e4977917e1cfd021a618064e3bac955338193fba89e84705306aed9",
+ "rustc-1.58.0-x86_64-unknown-freebsd": "89969a81fd9c9cfb94e6554bf1a8884417b0d5dde5e7c45bd4e9b1887771f5d5",
+ "rustc-1.58.0-x86_64-unknown-linux-gnu": "94e3a5e6dca2ae2516d6496568b6791b9501ac500c3e5faf6f42baaead41d404",
+ "rustc-1.58.0-x86_64-unknown-linux-musl": "1134b85ce578ac017650d8e7c360d14a85a1d6185c164678f95440cac1f6786d",
+ "rustc-1.58.1-aarch64-apple-darwin": "cbcc922fa499131b4f9b0ff6c656792edd34452dc902552a0d0dfa8f4690b996",
+ "rustc-1.58.1-aarch64-unknown-linux-gnu": "ad97b6e3ed1e6701ceaa1bad7f2da391546d27b121d967b606bd48542f21c669",
+ "rustc-1.58.1-aarch64-unknown-linux-musl": "156c5909cb6c9b5d96662f2eec87edefcdf019783082745b9abaeb97d1d45307",
+ "rustc-1.58.1-x86_64-apple-darwin": "859ea96ca53ed6480333273ccd39c0f9a487d7f288a5fd2646c3907353402fce",
+ "rustc-1.58.1-x86_64-pc-windows-msvc": "31bc5359886854fccf16956a92c4205372df0ba1be19642879a0e9d6441a069c",
+ "rustc-1.58.1-x86_64-unknown-freebsd": "ccc043fbf337adda1dc66611f8b8eea3d2fd9e1cee9adc1a07d1a3c4c0b4711b",
+ "rustc-1.58.1-x86_64-unknown-linux-gnu": "1bab764b75bec5b83ec88f6cf7e6127f0bc5bf64307277d1f5ce8838a8b8a415",
+ "rustc-1.58.1-x86_64-unknown-linux-musl": "626cfaf717b3e05d2e20726ecbbd7026edf8a816de06ef0f499e5a27339c1310",
+ "rustc-1.59.0-aarch64-apple-darwin": "caac78491d8f0844bb9a512989a409c35ff681a131495e7ebfacb69ba006bbc1",
+ "rustc-1.59.0-aarch64-unknown-linux-gnu": "04d4add5530d247214ec8afd32f2c91d75b219035130b877e4769cebcd4174d8",
+ "rustc-1.59.0-aarch64-unknown-linux-musl": "a50567a08ec5a33bdb60b4a6c4572cb85c2e48429ed6d98a28580ca7ed82d8ed",
+ "rustc-1.59.0-x86_64-apple-darwin": "eb5b613800c75882bed9e3bb48c325aac0e5ce418ae2b19f51e4ccf7e4781e0b",
+ "rustc-1.59.0-x86_64-pc-windows-msvc": "e838ecdba060b4ad3d0becc08027c9598977db40ac1f4e5fa9231725110ea06b",
+ "rustc-1.59.0-x86_64-unknown-freebsd": "053fe53aa72e9400b3657049cb0352a26268bd5a81a2b09500ff2cb150c32767",
+ "rustc-1.59.0-x86_64-unknown-linux-gnu": "e7ed041c93b77a7d986aa198d28f63ab96493fdf164bd28c8785c5b31a9e62d9",
+ "rustc-1.59.0-x86_64-unknown-linux-musl": "34e7b33acbffd2012906249509a0d364692767a15a54d10e67122361703ee811",
+ "rustfmt-1.48.0-aarch64-unknown-linux-gnu": "28f7d1ef37c034033eb0e30a13e5f0ad5bbc506adb8a8a9c03adce2b0d4842d5",
+ "rustfmt-1.48.0-aarch64-unknown-linux-musl": "e6efa0fae347f97dca3b892565302d35b4cedfee7cb6e2b5fcdb2801074fe018",
+ "rustfmt-1.48.0-x86_64-apple-darwin": "cfe593a9446e7dfa52ded8a7cca174ba0c2d1cac6e865d04e0890282f25d22e2",
+ "rustfmt-1.48.0-x86_64-pc-windows-msvc": "96d779befe8bca88d3cb69723d401d290a4a637746e8cc119126cfe9d5c773ee",
+ "rustfmt-1.48.0-x86_64-unknown-freebsd": "ae84ca6d0841e6be0f140efd67693a1a50520e6610f26e5ee57a15b5a9947588",
+ "rustfmt-1.48.0-x86_64-unknown-linux-gnu": "12d185cfd6ce15e4df3590bf1b9b3233df75e7aa14b42a9269b4235347a14b2b",
+ "rustfmt-1.48.0-x86_64-unknown-linux-musl": "1a8674af3fbe9616426a02fa4115057e411e7dfcc0f7bb377ee27e3a3bec15f4",
+ "rustfmt-1.49.0-aarch64-apple-darwin": "4f03d2913ecff9b534bc6c2c7684d0884958a1c8f12668fea86c0aa4371231ae",
+ "rustfmt-1.49.0-aarch64-unknown-linux-gnu": "9ef9c477911b3718539defa18ef5838b6f479e646d82e410643e5e8cb21791dc",
+ "rustfmt-1.49.0-aarch64-unknown-linux-musl": "40dbcf80a23055cf2245a6bbf5e16c0fd0300076e279b8e29d66de8af1d5409a",
+ "rustfmt-1.49.0-x86_64-apple-darwin": "e505092d5525dca1012d57e9c9dfd048cbbe2890e02e1327c1a0af44cd3d7aa1",
+ "rustfmt-1.49.0-x86_64-pc-windows-msvc": "e094798983f77ef95e28db1c561915f992f3a190813162b33e2bc6942485a485",
+ "rustfmt-1.49.0-x86_64-unknown-freebsd": "ed7465ddcc654b32822e48a8e91cd58391c36210b332f054a9ab5c1e5733ae74",
+ "rustfmt-1.49.0-x86_64-unknown-linux-gnu": "a1b1a9c06b9958116c37e212c5e04d921f78967e9f9956f6249a16e033f67a03",
+ "rustfmt-1.49.0-x86_64-unknown-linux-musl": "cad26f7f7f9c67f32e03a07ad84f9dc9b7f755213cc0cc596d2971836bcc0cc1",
+ "rustfmt-1.50.0-aarch64-apple-darwin": "1dd932c23b3e70c1183dcb58c431ddd97df72c173b4e28d3a3b008132079a914",
+ "rustfmt-1.50.0-aarch64-unknown-linux-gnu": "0bddf9a1b55bcdae7cef3b37c56ba5816a2b2c932d57dbe7cfc73acce65f5aff",
+ "rustfmt-1.50.0-aarch64-unknown-linux-musl": "c885b27194ad8405d2c75ff134d81c5a51c24ffcab2ce5f3684e8de8b353f66b",
+ "rustfmt-1.50.0-x86_64-apple-darwin": "90108b9bf4b529d12096d7e7c3ef97e77d2304ea142cd0352d0b9814df80c7d2",
+ "rustfmt-1.50.0-x86_64-pc-windows-msvc": "4ee791749b1312091ecb66bee916b0f70fa71cfae1315de8d3351c6da913d5f2",
+ "rustfmt-1.50.0-x86_64-unknown-freebsd": "037c575d92f87ee372b2bfb3b802c8a86690133ee1c82a5a8402ef9e97780f77",
+ "rustfmt-1.50.0-x86_64-unknown-linux-gnu": "2537e788067e56f263ab52869a6efbbf6be9f57ad6b14fc33ddab7cff79a3768",
+ "rustfmt-1.50.0-x86_64-unknown-linux-musl": "6f412c518e078f8891578b174d884cddf992b5fb72b14952f71d5ee8c2a743d8",
+ "rustfmt-1.51.0-aarch64-apple-darwin": "2f6966b51abc33a76b497776f061d049dc9c928aa09ea773a3404396002b33d8",
+ "rustfmt-1.51.0-aarch64-unknown-linux-gnu": "5dfa947dfc221ecb282a082263d79c5faf0c586acfcf7e416357d3e5107675c8",
+ "rustfmt-1.51.0-aarch64-unknown-linux-musl": "0fbca6b470e8c888b03adb501d45db68a5c19dcc05b8f5a1d73d5f9a4d1b3c01",
+ "rustfmt-1.51.0-x86_64-apple-darwin": "b30448ce429f2920b5a4d1bf50b40f4d251188f29ffaa6af12bfb131d993c5e0",
+ "rustfmt-1.51.0-x86_64-pc-windows-msvc": "520e8eaa186acc4f978fd30a34566b11073ed3396628e3dc192aa2862be42edd",
+ "rustfmt-1.51.0-x86_64-unknown-freebsd": "3693bd333303984ce0854452c31b5720cf6d8fa02f69062dc28b7db3b677bec2",
+ "rustfmt-1.51.0-x86_64-unknown-linux-gnu": "e50c03cbf104de7788eed8d5d923b5dc7555f12a3c045275751633121ce74d43",
+ "rustfmt-1.51.0-x86_64-unknown-linux-musl": "6798ff8f805cf1ddc187c4567fa7f3e32b9f347477b0956869caf1f31a99c374",
+ "rustfmt-1.52.0-aarch64-apple-darwin": "263296e44decd784b468de22519f7a22fa3dce3358bd96aab627f60b1f9778db",
+ "rustfmt-1.52.0-aarch64-unknown-linux-gnu": "f70260c7f6e39e20b376389d75e8c3518608860a3ce7647abeff626204341ea7",
+ "rustfmt-1.52.0-aarch64-unknown-linux-musl": "97190a6c8b6044c0fb375c71d672204adcf62d1b6c5d747715cc94a0ae631e04",
+ "rustfmt-1.52.0-x86_64-apple-darwin": "c3841b8568c00068ce6d264688320466c95307971a64adbb2b6ca6d5e54e158f",
+ "rustfmt-1.52.0-x86_64-pc-windows-msvc": "eba78266b8a381c2fbb07c4b3a1571a6fc102e1b9fc298ae362ab8da0aca41e5",
+ "rustfmt-1.52.0-x86_64-unknown-freebsd": "e150cd81ac2e7036ed9ff55b93c62cbcbd6fa2025371fda568a32a071cf94020",
+ "rustfmt-1.52.0-x86_64-unknown-linux-gnu": "7563b04b2900e9bef6360fb445baf00a8584072142d4554eb54f8109ac7486c5",
+ "rustfmt-1.52.0-x86_64-unknown-linux-musl": "ba74b93b4a70a7070d516a332a589b10bd161ab8b36826052ffa0569b1d6b5e6",
+ "rustfmt-1.52.1-aarch64-apple-darwin": "b02cf93d230a4147f2551e012b314b93d2d448ebc4ee71896918c488d8e6e446",
+ "rustfmt-1.52.1-aarch64-unknown-linux-gnu": "727d227f5e1e0ab3bcaa4f4adfe6b5e21fb70279b4d5825cb95fc6983c3cd9ae",
+ "rustfmt-1.52.1-aarch64-unknown-linux-musl": "f707919fb5ad7d0db02fd2e63293153b20043c4511385840835d6a8ae7087d96",
+ "rustfmt-1.52.1-x86_64-apple-darwin": "fc2d3cfd2742800745a97a3cb69a005166992c756dc9fd191add1f37842210e4",
+ "rustfmt-1.52.1-x86_64-pc-windows-msvc": "d5cf3e6be769dd266e66e0351062ff1317b537bf0f4e95def2a8f518f6e6571b",
+ "rustfmt-1.52.1-x86_64-unknown-freebsd": "ecfebd807b2addc80d102f4909f42c71104039e1f7d9b7bd7e6ebdb5072d8d6f",
+ "rustfmt-1.52.1-x86_64-unknown-linux-gnu": "1717c5eeae799b0ceee7f8b7180543713d08ad72e03af77b05dd1e69e32b06bc",
+ "rustfmt-1.52.1-x86_64-unknown-linux-musl": "5b19c462dc70b632e44189c1384aa753bdc20f9a9ad66d35dd34d321cfb19b1c",
+ "rustfmt-1.53.0-aarch64-apple-darwin": "4a29c3663a2c0f5133ca21e1c12223e9ef4fa3f8b1f29b98709ad588aa52c140",
+ "rustfmt-1.53.0-aarch64-unknown-linux-gnu": "d5157ddaf978a3619292a5b133390eea3a049b7903eeef25ded9f24c995a7c58",
+ "rustfmt-1.53.0-aarch64-unknown-linux-musl": "91006e773898a40af2f0e843e7f1111ce07320f1507e61d8c9a4ae216dfe245b",
+ "rustfmt-1.53.0-x86_64-apple-darwin": "b4db708e078615e1d21ad13acfc4b5943b3548d094d397c3b14e24dda3bd78ca",
+ "rustfmt-1.53.0-x86_64-pc-windows-msvc": "adead783882f055129268f11d137857bdcac5eb1ccc20ea8ff8edbb67026f6ff",
+ "rustfmt-1.53.0-x86_64-unknown-freebsd": "569c6185ad0868f855b1414a51f9e9eba52a0cbf270c0b674bcb4580eece668b",
+ "rustfmt-1.53.0-x86_64-unknown-linux-gnu": "e4e826c678f16c6a896e1226309c12c3677ff9c4bc8065ac6932fc616bb67572",
+ "rustfmt-1.53.0-x86_64-unknown-linux-musl": "6d2778b35149971308717e6f10c29f189f46003a1bb9490d495906c0ae6aad45",
+ "rustfmt-1.54.0-aarch64-apple-darwin": "1823b397d89bc23b1a8ec4df113c5f765a0e91cae655dc59fbf13be4616c0f3f",
+ "rustfmt-1.54.0-aarch64-unknown-linux-gnu": "82f45f13c8885663461f27ca7d590c341e41cdf2ea76f40d23b90d38d374cb46",
+ "rustfmt-1.54.0-aarch64-unknown-linux-musl": "fbdfde8d13d08718364a5dfd97f8b99898134a630a4ec13fe8405402688f746d",
+ "rustfmt-1.54.0-x86_64-apple-darwin": "e33122e00fa2ba319e229f3a92380e31b2b813398f3a681d0e1b2e6fbe3f135e",
+ "rustfmt-1.54.0-x86_64-pc-windows-msvc": "608da9f9cc59d24c14897febeb0983d0ace04264d91e3ff9dd8b57bb546a2965",
+ "rustfmt-1.54.0-x86_64-unknown-freebsd": "4b5098c749c547516ca2c81aabf87617d589ae674cdc48d7636b37cc5017d29b",
+ "rustfmt-1.54.0-x86_64-unknown-linux-gnu": "0205d6af87d381b93aa69bc75c0bd44ac5eb006832f0f505a851dc8d22aaf101",
+ "rustfmt-1.54.0-x86_64-unknown-linux-musl": "34a2321d2f7f57398b6f588f2e219639f0958d444ca283ff0c8d0144d8c09fc1",
+ "rustfmt-1.55.0-aarch64-apple-darwin": "dad1bcea851e509f289178c7bbd8fca5152efd1876450e353cc77fe5fccd2f46",
+ "rustfmt-1.55.0-aarch64-unknown-linux-gnu": "a0a24a0e5618997218cced0632dfe776315225ee394e8412ef5dcf9e21325b9c",
+ "rustfmt-1.55.0-aarch64-unknown-linux-musl": "736208df67d87b3ced05764d52de07470f44502c901c48ab6cc6dfe3cab6046f",
+ "rustfmt-1.55.0-x86_64-apple-darwin": "b38a096a59ecc6309bcbea67ed4e50de6d48cdc124ff5b721bf7e929ef4c4fa7",
+ "rustfmt-1.55.0-x86_64-pc-windows-msvc": "49f58043700b33578963faa22dcb993b5d604d7d8cc852ff53f11138f9a20f35",
+ "rustfmt-1.55.0-x86_64-unknown-freebsd": "5317af05afbcfde0fae7ba4ad5404901b0c611d826c7dd38926a8b08ade53c72",
+ "rustfmt-1.55.0-x86_64-unknown-linux-gnu": "ecb58add71d3f3cf8a213fe7b531bc230f8da5cecd835cee6429e76798b548cc",
+ "rustfmt-1.55.0-x86_64-unknown-linux-musl": "33bd862bbc9b54745c3e1d400440996fd0e6759c4d482f1a888ba8fafab29c3a",
+ "rustfmt-1.56.0-aarch64-apple-darwin": "0c1dcc80d2028748c38a4c3360048940a887ca899af577e9f3026c3d1a359469",
+ "rustfmt-1.56.0-aarch64-unknown-linux-gnu": "3dabc693866f74a956b99f8cac1f1beca6dbc38de6cc095ccdacbdccc18b4350",
+ "rustfmt-1.56.0-aarch64-unknown-linux-musl": "9d1b9405dc2cbeb7ff7f2ecb468a42d7a36429e642714de1605eb242947afc88",
+ "rustfmt-1.56.0-x86_64-apple-darwin": "f8fc28492af2fece8915db0959bb5af354706d63556854f4c149e6dbc9f3c11b",
+ "rustfmt-1.56.0-x86_64-pc-windows-msvc": "1080a5e5f3957eed2799ce65adf93b8bd8c0a9233c5149d8992c339fe7acab31",
+ "rustfmt-1.56.0-x86_64-unknown-freebsd": "a5e58bbf9407ac7da18df4d385f0988d299b1a71d18ce39fb7d1de15c007f5a6",
+ "rustfmt-1.56.0-x86_64-unknown-linux-gnu": "ce14465427e5919e407af9e58fea0a638aa02515f182a1a1c0b740cbd52a5e5a",
+ "rustfmt-1.56.0-x86_64-unknown-linux-musl": "98dbc11edb80de0c1303823f890434406c36501d89ee45ba2137d4ef4220db8a",
+ "rustfmt-1.56.1-aarch64-apple-darwin": "25e64095594e6aa4c25b2dfb8830108ba32af2917c1b1a4a1a966114d85199d2",
+ "rustfmt-1.56.1-aarch64-unknown-linux-gnu": "b6d1479d66c16eabcd708246521539a60eee31b1b3b492c20676ebbbcbca23fd",
+ "rustfmt-1.56.1-aarch64-unknown-linux-musl": "441f9df760f65a79ce15d79938cf984961cb712639d85e91765abadfc616002f",
+ "rustfmt-1.56.1-x86_64-apple-darwin": "fa4e086107b5219228cdd928fd4671f5ab7a1165c39ca79874fd99a0f865b12b",
+ "rustfmt-1.56.1-x86_64-pc-windows-msvc": "a18c253e6d29ea8575e9b25a1fe43c913082c0036e2532f372e376b8d0c0e15a",
+ "rustfmt-1.56.1-x86_64-unknown-freebsd": "b3f184b3cbe2139407e977838e98a843d90409cdebe86d64338841fb919281c9",
+ "rustfmt-1.56.1-x86_64-unknown-linux-gnu": "6dce6eced612048180892fa9016a06a901c9fc275da046d8e229986f4dd97115",
+ "rustfmt-1.56.1-x86_64-unknown-linux-musl": "0a307bd9a4b08a91f1fee0e90e412d92c9b55b75084c2e9b24ed99dd9469f4fb",
+ "rustfmt-1.57.0-aarch64-apple-darwin": "85fc5eedb0bb4d6ac599e567ae84debc05a3a5d2c162f73c59df5bf0d5d3fb19",
+ "rustfmt-1.57.0-aarch64-unknown-linux-gnu": "f8f4c4c16a24aaf4e0b9752395bf8b20154832ef6d0b9e98687de44b699ff5ff",
+ "rustfmt-1.57.0-aarch64-unknown-linux-musl": "093bda1fc0c087dffbdddafb9a2fe9f67e49cfc7794aaca22a92aab5d0f0c789",
+ "rustfmt-1.57.0-x86_64-apple-darwin": "83a928a03d484121531852a591b76a13c631e275ef376d57b9b23cf6e855f6b1",
+ "rustfmt-1.57.0-x86_64-pc-windows-msvc": "7c61a46df59d6c9386a5647df54a1a725d81dc924fb24fa7f7e1b51ad7ced047",
+ "rustfmt-1.57.0-x86_64-unknown-freebsd": "0d0bd640445e1e45a93ca0d0f5b0f03c464f6a91c9b5353c3ac136ba366bbf36",
+ "rustfmt-1.57.0-x86_64-unknown-linux-gnu": "48b09dbf1c7fc16e31123e8c83eede18c3577811762f574a5b24a2f759a172bb",
+ "rustfmt-1.57.0-x86_64-unknown-linux-musl": "6ed302cafc1363c8ba0bb789467a80be8558b3ed712331a0da2477f8d53f0794",
+ "rustfmt-1.58.0-aarch64-apple-darwin": "79f391f725e598163407df09570c3c2bfffc89250a08b3143c7f72db8ec0c632",
+ "rustfmt-1.58.0-aarch64-unknown-linux-gnu": "ddb03ea92c4274b2eccb43d0f25bb6ccd8beab53123715c3c51de7220b60b21e",
+ "rustfmt-1.58.0-aarch64-unknown-linux-musl": "8749c82a655e2f99bfc7b8c3d1f12c384edb8cee7b26078a7ddf87da57a31429",
+ "rustfmt-1.58.0-x86_64-apple-darwin": "83fb3514eec03049daadb2623f27b92d029b292c0ed6102c06f1a4a39f81b1f8",
+ "rustfmt-1.58.0-x86_64-pc-windows-msvc": "661a53930cfd8b74f9a66df0871a0bd8534829d845d5253292f7f223d17f0aa8",
+ "rustfmt-1.58.0-x86_64-unknown-freebsd": "a91b4561ca1cb756da40e17a2d270c464bb177289c2cc8352e2b5fcd26c0c63a",
+ "rustfmt-1.58.0-x86_64-unknown-linux-gnu": "4c4f0972406bf4a0a83be4cf2ee0a3556db1aa6aefedab4851ed19a3dd2e88bc",
+ "rustfmt-1.58.0-x86_64-unknown-linux-musl": "7075b11ab68bbdebce0884e42432d7599680fe023ea2ab4e81c2629d25fd32e7",
+ "rustfmt-1.58.1-aarch64-apple-darwin": "ede8f0bb46047e3e106b20bdd4e181fc81f810eed26d5f1816b0b0b4a9a5458a",
+ "rustfmt-1.58.1-aarch64-unknown-linux-gnu": "71dec8f396d87ec57e353000331e62c7ab0e431e26c42644d43d78fd8d6df3f5",
+ "rustfmt-1.58.1-aarch64-unknown-linux-musl": "f605d5cf81369a51cacb6ce17d57dd553096b6843c249c37f996d0c768476429",
+ "rustfmt-1.58.1-x86_64-apple-darwin": "6ec7ef5c492531714f42936f7e03ffa9b428953692c64575b45da1dfaa3905b4",
+ "rustfmt-1.58.1-x86_64-pc-windows-msvc": "c2d30d3791e612f2f2a6e9eef52707ce79e7bf2ff5c6150bdf91039686988eda",
+ "rustfmt-1.58.1-x86_64-unknown-freebsd": "d2a32f7479dcb5bb71ec8151912cfa315bfaeb7c3b45ad10afcb6bb7b9652d75",
+ "rustfmt-1.58.1-x86_64-unknown-linux-gnu": "09328241bd46a21793a5a76ba6a1a5b862c6bfa29afdabdc9c889b08c81ee8ba",
+ "rustfmt-1.58.1-x86_64-unknown-linux-musl": "8189d38bdd1225241ecbd75b0869c1945450a5c28b675713892ae32cf0b77750",
+ "rustfmt-1.59.0-aarch64-apple-darwin": "70a677515845f9b22b464d022958a2d0ba7c927a4979f3631b1f851ea2e9b2a8",
+ "rustfmt-1.59.0-aarch64-unknown-linux-gnu": "e79b98a6bb51ed225436375fd095610b88093f287404836949d394a5d315e834",
+ "rustfmt-1.59.0-aarch64-unknown-linux-musl": "dc977d6459b1d4d9e761dc20a60f1f734e6081b1b17670eb4bbe9d2fc292b9de",
+ "rustfmt-1.59.0-x86_64-apple-darwin": "52d5579999e146e999426d57be78a8b26ace6ab7810aefb968f69e6b2c9ecf53",
+ "rustfmt-1.59.0-x86_64-pc-windows-msvc": "cd923eae91c5652fa983abbc07ceb67d6f5b8f98664f86cfc1bff7ec1374e0c1",
+ "rustfmt-1.59.0-x86_64-unknown-freebsd": "026abe662bf0ca734796e93224bed7ad9015a3e2613ca7db59c9b89e3d6088bb",
+ "rustfmt-1.59.0-x86_64-unknown-linux-gnu": "2932efec54b152e094e557c351aa5844b87e61bbcb4d4b7bf0a2dd7ad457df39",
+ "rustfmt-1.59.0-x86_64-unknown-linux-musl": "868aebea8792baa964b5300e6c34b5006660abd4d7aeb93f2d7104de1cfad134",
+}
diff --git a/rust/platform/BUILD.bazel b/rust/platform/BUILD.bazel
new file mode 100644
index 0000000..459b9fb
--- /dev/null
+++ b/rust/platform/BUILD.bazel
@@ -0,0 +1,26 @@
+load("@bazel_skylib//:bzl_library.bzl", "bzl_library")
+load(":platform.bzl", "declare_config_settings")
+
+package(default_visibility = ["//visibility:public"])
+
+declare_config_settings()
+
+package_group(
+ name = "function_transition_allowlist",
+ packages = [
+ "//...",
+ ],
+)
+
+bzl_library(
+ name = "bzl_lib",
+ srcs = glob(["**/*.bzl"]),
+ visibility = ["//rust:__subpackages__"],
+)
+
+alias(
+ name = "rules",
+ actual = ":bzl_lib",
+ deprecation = "Please use the `@rules_rust//platform:bzl_lib` target instead",
+ visibility = ["//rust:__subpackages__"],
+)
diff --git a/rust/platform/channel/BUILD.bazel b/rust/platform/channel/BUILD.bazel
new file mode 100644
index 0000000..84fc8c7
--- /dev/null
+++ b/rust/platform/channel/BUILD.bazel
@@ -0,0 +1,22 @@
+package(default_visibility = ["//visibility:public"])
+
+# Allows toolchains and targets to constrain themselves based on Rust release
+# channels, for example when depending on features only available in Nightly.
+#
+# https://doc.rust-lang.org/book/appendix-07-nightly-rust.html
+constraint_setting(name = "channel")
+
+constraint_value(
+ name = "beta",
+ constraint_setting = ":channel",
+)
+
+constraint_value(
+ name = "nightly",
+ constraint_setting = ":channel",
+)
+
+constraint_value(
+ name = "stable",
+ constraint_setting = ":channel",
+)
diff --git a/rust/platform/cpu/BUILD.bazel b/rust/platform/cpu/BUILD.bazel
new file mode 100644
index 0000000..476f8cf
--- /dev/null
+++ b/rust/platform/cpu/BUILD.bazel
@@ -0,0 +1,5 @@
+constraint_value(
+ name = "wasm32",
+ constraint_setting = "@platforms//cpu",
+ visibility = ["//visibility:public"],
+)
diff --git a/rust/platform/os/BUILD.bazel b/rust/platform/os/BUILD.bazel
new file mode 100644
index 0000000..7692abe
--- /dev/null
+++ b/rust/platform/os/BUILD.bazel
@@ -0,0 +1,11 @@
+constraint_value(
+ name = "unknown",
+ constraint_setting = "@platforms//os",
+ visibility = ["//visibility:public"],
+)
+
+constraint_value(
+ name = "wasi",
+ constraint_setting = "@platforms//os",
+ visibility = ["//visibility:public"],
+)
diff --git a/rust/platform/platform.bzl b/rust/platform/platform.bzl
new file mode 100644
index 0000000..ca3bef9
--- /dev/null
+++ b/rust/platform/platform.bzl
@@ -0,0 +1,89 @@
+"""Definitions for support config settings and platform definitions"""
+
+load("@bazel_skylib//lib:selects.bzl", "selects")
+load(
+ ":triple_mappings.bzl",
+ "SUPPORTED_PLATFORM_TRIPLES",
+ "cpu_arch_to_constraints",
+ "system_to_constraints",
+ "triple_to_constraint_set",
+)
+
+_SUPPORTED_CPU_ARCH = [
+ "aarch64",
+ "arm",
+ "i686",
+ "powerpc",
+ "s390x",
+ "x86_64",
+]
+
+_SUPPORTED_SYSTEMS = [
+ "android",
+ "darwin",
+ "freebsd",
+ "ios",
+ "linux",
+ "windows",
+]
+
+# buildifier: disable=unnamed-macro
+def declare_config_settings():
+ """Helper function for declaring `config_setting`s"""
+ for cpu_arch in _SUPPORTED_CPU_ARCH:
+ native.config_setting(
+ name = cpu_arch,
+ constraint_values = cpu_arch_to_constraints(cpu_arch),
+ )
+
+ for system in _SUPPORTED_SYSTEMS:
+ native.config_setting(
+ name = system,
+ constraint_values = system_to_constraints(system),
+ )
+
+ # Add alias for OSX to "darwin" to match what users will be expecting.
+ native.alias(
+ name = "osx",
+ actual = ":darwin",
+ )
+
+ # Add alias for OSX to "macos" to be consistent with the long-term
+ # direction of `@platforms` in using the OS's modern name.
+ native.alias(
+ name = "macos",
+ actual = ":darwin",
+ )
+
+ all_supported_triples = SUPPORTED_PLATFORM_TRIPLES
+ for triple in all_supported_triples:
+ native.config_setting(
+ name = triple,
+ constraint_values = triple_to_constraint_set(triple),
+ )
+
+ native.platform(
+ name = "wasm",
+ constraint_values = [
+ str(Label("//rust/platform/cpu:wasm32")),
+ str(Label("//rust/platform/os:unknown")),
+ ],
+ )
+
+ native.platform(
+ name = "wasi",
+ constraint_values = [
+ str(Label("//rust/platform/cpu:wasm32")),
+ str(Label("//rust/platform/os:wasi")),
+ ],
+ )
+
+ selects.config_setting_group(
+ name = "unix",
+ match_any = [
+ ":android",
+ ":darwin",
+ ":freebsd",
+ ":linux",
+ ],
+ )
diff --git a/rust/platform/triple.bzl b/rust/platform/triple.bzl
new file mode 100644
index 0000000..13a59a4
--- /dev/null
+++ b/rust/platform/triple.bzl
@@ -0,0 +1,54 @@
+"""Triples are a way to define information about a platform/system. This module provides
+a way to convert a triple string into a well structured object to avoid constant string
+parsing in starlark code.
+
+Triples can be described at the following link:
+https://clang.llvm.org/docs/CrossCompilation.html#target-triple
+"""
+
+def triple(triple):
+ """Constructs a struct containing each component of the provided triple
+
+ Args:
+ triple (str): A platform triple. eg: `x86_64-unknown-linux-gnu`
+
+ Returns:
+ struct:
+ - arch (str): The triple's CPU architecture
+ - vendor (str): The vendor of the system
+ - system (str): The name of the system
+ - abi (str, optional): The abi to use or None if abi does not apply.
+ - triple (str): The original triple
+ """
+ if triple == "wasm32-wasi":
+ return struct(
+ arch = "wasm32",
+ system = "wasi",
+ vendor = "wasi",
+ abi = None,
+ triple = triple,
+ )
+
+ component_parts = triple.split("-")
+ if len(component_parts) < 3:
+ fail("Expected target triple to contain at least three sections separated by '-'")
+
+ cpu_arch = component_parts[0]
+ vendor = component_parts[1]
+ system = component_parts[2]
+ abi = None
+
+ if system == "androideabi":
+ system = "android"
+ abi = "eabi"
+
+ if len(component_parts) == 4:
+ abi = component_parts[3]
+
+ return struct(
+ arch = cpu_arch,
+ vendor = vendor,
+ system = system,
+ abi = abi,
+ triple = triple,
+ )
diff --git a/rust/platform/triple_mappings.bzl b/rust/platform/triple_mappings.bzl
new file mode 100644
index 0000000..852ffe7
--- /dev/null
+++ b/rust/platform/triple_mappings.bzl
@@ -0,0 +1,280 @@
+"""Helpers for constructing supported Rust platform triples"""
+
+load("//rust/platform:triple.bzl", "triple")
+
+# All T1 Platforms should be supported, but aren't, see inline notes.
+SUPPORTED_T1_PLATFORM_TRIPLES = [
+ "i686-apple-darwin",
+ "i686-pc-windows-msvc",
+ "i686-unknown-linux-gnu",
+ "x86_64-apple-darwin",
+ "x86_64-pc-windows-msvc",
+ "x86_64-unknown-linux-gnu",
+ # N.B. These "alternative" envs are not supported, as bazel cannot distinguish between them
+ # and others using existing @platforms// config_values
+ #
+ #"i686-pc-windows-gnu",
+ #"x86_64-pc-windows-gnu",
+]
+
+# Some T2 Platforms are supported, provided we have mappings to @platforms// entries.
+# See @rules_rust//rust/platform:triple_mappings.bzl for the complete list.
+SUPPORTED_T2_PLATFORM_TRIPLES = [
+ "aarch64-apple-darwin",
+ "aarch64-apple-ios",
+ "aarch64-linux-android",
+ "aarch64-unknown-linux-gnu",
+ "arm-unknown-linux-gnueabi",
+ "armv7-unknown-linux-gnueabi",
+ "i686-linux-android",
+ "i686-unknown-freebsd",
+ "powerpc-unknown-linux-gnu",
+ "s390x-unknown-linux-gnu",
+ "wasm32-unknown-unknown",
+ "wasm32-wasi",
+ "x86_64-apple-ios",
+ "x86_64-linux-android",
+ "x86_64-unknown-freebsd",
+]
+
+SUPPORTED_PLATFORM_TRIPLES = SUPPORTED_T1_PLATFORM_TRIPLES + SUPPORTED_T2_PLATFORM_TRIPLES
+
+# CPUs that map to a "@platforms//cpu entry
+_CPU_ARCH_TO_BUILTIN_PLAT_SUFFIX = {
+ "aarch64": "aarch64",
+ "arm": "arm",
+ "armv7": "armv7",
+ "armv7s": None,
+ "asmjs": None,
+ "i386": "i386",
+ "i586": None,
+ "i686": "x86_32",
+ "le32": None,
+ "mips": None,
+ "mipsel": None,
+ "powerpc": "ppc",
+ "powerpc64": None,
+ "powerpc64le": None,
+ "s390": None,
+ "s390x": "s390x",
+ "thumbv7m": "armv7",
+ "wasm32": None,
+ "x86_64": "x86_64",
+}
+
+# Systems that map to a "@platforms//os entry
+_SYSTEM_TO_BUILTIN_SYS_SUFFIX = {
+ "android": "android",
+ "bitrig": None,
+ "darwin": "osx",
+ "dragonfly": None,
+ "eabi": "none",
+ "emscripten": None,
+ "freebsd": "freebsd",
+ "ios": "ios",
+ "linux": "linux",
+ "nacl": None,
+ "netbsd": None,
+ "openbsd": "openbsd",
+ "solaris": None,
+ "unknown": None,
+ "wasi": None,
+ "windows": "windows",
+}
+
+_SYSTEM_TO_BINARY_EXT = {
+ "android": "",
+ "darwin": "",
+ "eabi": "",
+ "emscripten": ".js",
+ "freebsd": "",
+ "ios": "",
+ "linux": "",
+ # This is currently a hack allowing us to have the proper
+ # generated extension for the wasm target, similarly to the
+ # windows target
+ "unknown": ".wasm",
+ "wasi": ".wasm",
+ "windows": ".exe",
+}
+
+_SYSTEM_TO_STATICLIB_EXT = {
+ "android": ".a",
+ "darwin": ".a",
+ "eabi": ".a",
+ "emscripten": ".js",
+ "freebsd": ".a",
+ "ios": ".a",
+ "linux": ".a",
+ "unknown": "",
+ "wasi": "",
+ "windows": ".lib",
+}
+
+_SYSTEM_TO_DYLIB_EXT = {
+ "android": ".so",
+ "darwin": ".dylib",
+ "eabi": ".so",
+ "emscripten": ".js",
+ "freebsd": ".so",
+ "ios": ".dylib",
+ "linux": ".so",
+ "unknown": ".wasm",
+ "wasi": ".wasm",
+ "windows": ".dll",
+}
+
+# See https://github.com/rust-lang/rust/blob/master/src/libstd/build.rs
+_SYSTEM_TO_STDLIB_LINKFLAGS = {
+ # NOTE: Rust stdlib `build.rs` treats android as a subset of linux, rust rules treat android
+ # as its own system.
+ "android": ["-ldl", "-llog", "-lgcc"],
+ "bitrig": [],
+ # TODO(gregbowyer): If rust stdlib is compiled for cloudabi with the backtrace feature it
+ # includes `-lunwind` but this might not actually be required.
+ # I am not sure which is the common configuration or how we encode it as a link flag.
+ "cloudabi": ["-lunwind", "-lc", "-lcompiler_rt"],
+ "darwin": ["-lSystem", "-lresolv"],
+ "dragonfly": ["-lpthread"],
+ "eabi": [],
+ "emscripten": [],
+ # TODO(bazelbuild/rules_cc#75):
+ #
+ # Right now bazel cc rules does not specify the exact flag setup needed for calling out system
+ # libs, that is we dont know given a toolchain if it should be, for example,
+ # `-lxxx` or `/Lxxx` or `xxx.lib` etc.
+ #
+ # We include the flag setup as they are _commonly seen_ on various platforms with a cc_rules
+ # style override for people doing things like gnu-mingw on windows.
+ #
+ # If you are reading this ... sorry! set the env var `BAZEL_RUST_STDLIB_LINKFLAGS` to
+ # what you need for your specific setup, for example like so
+ # `BAZEL_RUST_STDLIB_LINKFLAGS="-ladvapi32:-lws2_32:-luserenv"`
+ "freebsd": ["-lexecinfo", "-lpthread"],
+ "fuchsia": ["-lzircon", "-lfdio"],
+ "illumos": ["-lsocket", "-lposix4", "-lpthread", "-lresolv", "-lnsl", "-lumem"],
+ "ios": ["-lSystem", "-lobjc", "-framework Security", "-framework Foundation", "-lresolv"],
+ # TODO: This ignores musl. Longer term what does Bazel think about musl?
+ "linux": ["-ldl", "-lpthread"],
+ "nacl": [],
+ "netbsd": ["-lpthread", "-lrt"],
+ "openbsd": ["-lpthread"],
+ "solaris": ["-lsocket", "-lposix4", "-lpthread", "-lresolv"],
+ "unknown": [],
+ "uwp": ["ws2_32.lib"],
+ "wasi": [],
+ "windows": ["advapi32.lib", "ws2_32.lib", "userenv.lib"],
+}
+
+def cpu_arch_to_constraints(cpu_arch):
+ plat_suffix = _CPU_ARCH_TO_BUILTIN_PLAT_SUFFIX[cpu_arch]
+
+ if not plat_suffix:
+ fail("CPU architecture \"{}\" is not supported by rules_rust".format(cpu_arch))
+
+ return ["@platforms//cpu:{}".format(plat_suffix)]
+
+def vendor_to_constraints(_vendor):
+ # TODO(acmcarther): Review:
+ #
+ # My current understanding is that vendors can't have a material impact on
+ # constraint sets.
+ return []
+
+def system_to_constraints(system):
+ sys_suffix = _SYSTEM_TO_BUILTIN_SYS_SUFFIX[system]
+
+ if not sys_suffix:
+ fail("System \"{}\" is not supported by rules_rust".format(sys_suffix))
+
+ return ["@platforms//os:{}".format(sys_suffix)]
+
+def abi_to_constraints(abi):
+ # iOS simulator
+ if abi == "sim":
+ return ["@build_bazel_apple_support//constraints:simulator"]
+ else:
+ # TODO(acmcarther): Implement when C++ toolchain is more mature and we
+ # figure out how they're doing this
+ return []
+
+def triple_to_system(target_triple):
+ """Returns a system name for a given platform triple
+
+ **Deprecated**: Use triple() from triple.bzl directly.
+
+ Args:
+ target_triple (str): A platform triple. eg: `x86_64-unknown-linux-gnu`
+
+ Returns:
+ str: A system name
+ """
+ return triple(target_triple).system
+
+def triple_to_arch(target_triple):
+ """Returns a system architecture name for a given platform triple
+
+ **Deprecated**: Use triple() from triple.bzl directly.
+
+ Args:
+ target_triple (str): A platform triple. eg: `x86_64-unknown-linux-gnu`
+
+ Returns:
+ str: A cpu architecture
+ """
+ return triple(target_triple).arch
+
+def triple_to_abi(target_triple):
+ """Returns a system abi name for a given platform triple
+
+ **Deprecated**: Use triple() from triple.bzl directly.
+
+ Args:
+ target_triple (str): A platform triple. eg: `x86_64-unknown-linux-gnu`
+
+ Returns:
+ str: The triple's abi
+ """
+ return triple(target_triple).system
+
+def system_to_dylib_ext(system):
+ return _SYSTEM_TO_DYLIB_EXT[system]
+
+def system_to_staticlib_ext(system):
+ return _SYSTEM_TO_STATICLIB_EXT[system]
+
+def system_to_binary_ext(system):
+ return _SYSTEM_TO_BINARY_EXT[system]
+
+def system_to_stdlib_linkflags(system):
+ return _SYSTEM_TO_STDLIB_LINKFLAGS[system]
+
+def triple_to_constraint_set(target_triple):
+ """Returns a set of constraints for a given platform triple
+
+ Args:
+ target_triple (str): A platform triple. eg: `x86_64-unknown-linux-gnu`
+
+ Returns:
+ list: A list of constraints (each represented by a list of strings)
+ """
+ if target_triple == "wasm32-wasi":
+ return [
+ "@rules_rust//rust/platform/cpu:wasm32",
+ "@rules_rust//rust/platform/os:wasi",
+ ]
+ if target_triple == "wasm32-unknown-unknown":
+ return [
+ "@rules_rust//rust/platform/cpu:wasm32",
+ "@rules_rust//rust/platform/os:unknown",
+ ]
+
+ triple_struct = triple(target_triple)
+
+ constraint_set = []
+ constraint_set += cpu_arch_to_constraints(triple_struct.arch)
+ constraint_set += vendor_to_constraints(triple_struct.vendor)
+ constraint_set += system_to_constraints(triple_struct.system)
+ constraint_set += abi_to_constraints(triple_struct.abi)
+
+ return constraint_set
diff --git a/rust/private/BUILD.bazel b/rust/private/BUILD.bazel
new file mode 100644
index 0000000..929a39e
--- /dev/null
+++ b/rust/private/BUILD.bazel
@@ -0,0 +1,24 @@
+load("@bazel_skylib//:bzl_library.bzl", "bzl_library")
+load("//rust/private:rust_analyzer.bzl", "rust_analyzer_detect_sysroot")
+load("//rust/private:stamp.bzl", "stamp_build_setting")
+
+bzl_library(
+ name = "bzl_lib",
+ srcs = glob(["**/*.bzl"]),
+ visibility = ["//rust:__subpackages__"],
+ deps = ["//rust/platform:bzl_lib"],
+)
+
+alias(
+ name = "rules",
+ actual = ":bzl_lib",
+ deprecation = "Please use the `@rules_rust//private:bzl_lib` target instead",
+ visibility = ["//rust:__subpackages__"],
+)
+
+stamp_build_setting(name = "stamp")
+
+rust_analyzer_detect_sysroot(
+ name = "rust_analyzer_detect_sysroot",
+ visibility = ["//visibility:public"],
+)
diff --git a/rust/private/README.md b/rust/private/README.md
new file mode 100644
index 0000000..a7a45c6
--- /dev/null
+++ b/rust/private/README.md
@@ -0,0 +1 @@
+Implementation details of the rules that are not publicly exposed.
\ No newline at end of file
diff --git a/rust/private/clippy.bzl b/rust/private/clippy.bzl
new file mode 100644
index 0000000..d1464e9
--- /dev/null
+++ b/rust/private/clippy.bzl
@@ -0,0 +1,304 @@
+# Copyright 2020 The Bazel Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""A module defining clippy rules"""
+
+load("//rust/private:common.bzl", "rust_common")
+load("//rust/private:providers.bzl", "CaptureClippyOutputInfo", "ClippyInfo")
+load(
+ "//rust/private:rustc.bzl",
+ "collect_deps",
+ "collect_inputs",
+ "construct_arguments",
+)
+load(
+ "//rust/private:utils.bzl",
+ "determine_output_hash",
+ "find_cc_toolchain",
+ "find_toolchain",
+)
+
+def _get_clippy_ready_crate_info(target, aspect_ctx):
+ """Check that a target is suitable for clippy and extract the `CrateInfo` provider from it.
+
+ Args:
+ target (Target): The target the aspect is running on.
+ aspect_ctx (ctx, optional): The aspect's context object.
+
+ Returns:
+ CrateInfo, optional: A `CrateInfo` provider if clippy should be run or `None`.
+ """
+
+ # Ignore external targets
+ if target.label.workspace_root.startswith("external"):
+ return None
+
+ # Targets annotated with `noclippy` will not be formatted
+ if aspect_ctx and "noclippy" in aspect_ctx.rule.attr.tags:
+ return None
+
+ # Obviously ignore any targets that don't contain `CrateInfo`
+ if rust_common.crate_info not in target:
+ return None
+
+ return target[rust_common.crate_info]
+
+def _clippy_aspect_impl(target, ctx):
+ crate_info = _get_clippy_ready_crate_info(target, ctx)
+ if not crate_info:
+ return [ClippyInfo(output = depset([]))]
+
+ toolchain = find_toolchain(ctx)
+ cc_toolchain, feature_configuration = find_cc_toolchain(ctx)
+
+ dep_info, build_info, linkstamps = collect_deps(
+ deps = crate_info.deps,
+ proc_macro_deps = crate_info.proc_macro_deps,
+ aliases = crate_info.aliases,
+ # Clippy doesn't need to invoke transitive linking, therefore doesn't need linkstamps.
+ are_linkstamps_supported = False,
+ )
+
+ compile_inputs, out_dir, build_env_files, build_flags_files, linkstamp_outs, ambiguous_libs = collect_inputs(
+ ctx,
+ ctx.rule.file,
+ ctx.rule.files,
+ linkstamps,
+ toolchain,
+ cc_toolchain,
+ feature_configuration,
+ crate_info,
+ dep_info,
+ build_info,
+ )
+
+ args, env = construct_arguments(
+ ctx = ctx,
+ attr = ctx.rule.attr,
+ file = ctx.file,
+ toolchain = toolchain,
+ tool_path = toolchain.clippy_driver.path,
+ cc_toolchain = cc_toolchain,
+ feature_configuration = feature_configuration,
+ crate_info = crate_info,
+ dep_info = dep_info,
+ linkstamp_outs = linkstamp_outs,
+ ambiguous_libs = ambiguous_libs,
+ output_hash = determine_output_hash(crate_info.root, ctx.label),
+ rust_flags = [],
+ out_dir = out_dir,
+ build_env_files = build_env_files,
+ build_flags_files = build_flags_files,
+ emit = ["dep-info", "metadata"],
+ )
+
+ if crate_info.is_test:
+ args.rustc_flags.add("--test")
+
+ # For remote execution purposes, the clippy_out file must be a sibling of crate_info.output
+ # or rustc may fail to create intermediate output files because the directory does not exist.
+ if ctx.attr._capture_output[CaptureClippyOutputInfo].capture_output:
+ clippy_out = ctx.actions.declare_file(ctx.label.name + ".clippy.out", sibling = crate_info.output)
+ args.process_wrapper_flags.add("--stderr-file", clippy_out.path)
+
+ # If we are capturing the output, we want the build system to be able to keep going
+ # and consume the output. Some clippy lints are denials, so we treat them as warnings.
+ args.rustc_flags.add("-Wclippy::all")
+ else:
+ # A marker file indicating clippy has executed successfully.
+ # This file is necessary because "ctx.actions.run" mandates an output.
+ clippy_out = ctx.actions.declare_file(ctx.label.name + ".clippy.ok", sibling = crate_info.output)
+ args.process_wrapper_flags.add("--touch-file", clippy_out.path)
+
+ # Turn any warnings from clippy or rustc into an error, as otherwise
+ # Bazel will consider the execution result of the aspect to be "success",
+ # and Clippy won't be re-triggered unless the source file is modified.
+ if "__bindgen" in ctx.rule.attr.tags:
+ # bindgen-generated content is likely to trigger warnings, so
+ # only fail on clippy warnings
+ args.rustc_flags.add("-Dclippy::style")
+ args.rustc_flags.add("-Dclippy::correctness")
+ args.rustc_flags.add("-Dclippy::complexity")
+ args.rustc_flags.add("-Dclippy::perf")
+ else:
+ # fail on any warning
+ args.rustc_flags.add("-Dwarnings")
+
+ # Upstream clippy requires one of these two filenames or it silently uses
+ # the default config. Enforce the naming so users are not confused.
+ valid_config_file_names = [".clippy.toml", "clippy.toml"]
+ if ctx.file._config.basename not in valid_config_file_names:
+ fail("The clippy config file must be named one of: {}".format(valid_config_file_names))
+ env["CLIPPY_CONF_DIR"] = "${{pwd}}/{}".format(ctx.file._config.dirname)
+ compile_inputs = depset([ctx.file._config], transitive = [compile_inputs])
+
+ ctx.actions.run(
+ executable = ctx.executable._process_wrapper,
+ inputs = compile_inputs,
+ outputs = [clippy_out],
+ env = env,
+ tools = [toolchain.clippy_driver],
+ arguments = args.all,
+ mnemonic = "Clippy",
+ )
+
+ return [
+ OutputGroupInfo(clippy_checks = depset([clippy_out])),
+ ClippyInfo(output = depset([clippy_out])),
+ ]
+
+# Example: Run the clippy checker on all targets in the codebase.
+# bazel build --aspects=@rules_rust//rust:defs.bzl%rust_clippy_aspect \
+# --output_groups=clippy_checks \
+# //...
+rust_clippy_aspect = aspect(
+ fragments = ["cpp"],
+ host_fragments = ["cpp"],
+ attrs = {
+ "_capture_output": attr.label(
+ doc = "Value of the `capture_clippy_output` build setting",
+ default = Label("//:capture_clippy_output"),
+ ),
+ "_cc_toolchain": attr.label(
+ doc = (
+ "Required attribute to access the cc_toolchain. See [Accessing the C++ toolchain]" +
+ "(https://docs.bazel.build/versions/master/integrating-with-rules-cc.html#accessing-the-c-toolchain)"
+ ),
+ default = Label("@bazel_tools//tools/cpp:current_cc_toolchain"),
+ ),
+ "_config": attr.label(
+ doc = "The `clippy.toml` file used for configuration",
+ allow_single_file = True,
+ default = Label("//:clippy.toml"),
+ ),
+ "_error_format": attr.label(
+ doc = "The desired `--error-format` flags for clippy",
+ default = "//:error_format",
+ ),
+ "_extra_rustc_flags": attr.label(default = "//:extra_rustc_flags"),
+ "_process_wrapper": attr.label(
+ doc = "A process wrapper for running clippy on all platforms",
+ default = Label("//util/process_wrapper"),
+ executable = True,
+ cfg = "exec",
+ ),
+ },
+ provides = [ClippyInfo],
+ toolchains = [
+ str(Label("//rust:toolchain")),
+ "@bazel_tools//tools/cpp:toolchain_type",
+ ],
+ incompatible_use_toolchain_transition = True,
+ implementation = _clippy_aspect_impl,
+ doc = """\
+Executes the clippy checker on specified targets.
+
+This aspect applies to existing rust_library, rust_test, and rust_binary rules.
+
+As an example, if the following is defined in `examples/hello_lib/BUILD.bazel`:
+
+```python
+load("@rules_rust//rust:defs.bzl", "rust_library", "rust_test")
+
+rust_library(
+ name = "hello_lib",
+ srcs = ["src/lib.rs"],
+)
+
+rust_test(
+ name = "greeting_test",
+ srcs = ["tests/greeting.rs"],
+ deps = [":hello_lib"],
+)
+```
+
+Then the targets can be analyzed with clippy using the following command:
+
+```output
+$ bazel build --aspects=@rules_rust//rust:defs.bzl%rust_clippy_aspect \
+ --output_groups=clippy_checks //hello_lib:all
+```
+""",
+)
+
+def _rust_clippy_rule_impl(ctx):
+ clippy_ready_targets = [dep for dep in ctx.attr.deps if "clippy_checks" in dir(dep[OutputGroupInfo])]
+ files = depset([], transitive = [dep[OutputGroupInfo].clippy_checks for dep in clippy_ready_targets])
+ return [DefaultInfo(files = files)]
+
+rust_clippy = rule(
+ implementation = _rust_clippy_rule_impl,
+ attrs = {
+ "deps": attr.label_list(
+ doc = "Rust targets to run clippy on.",
+ providers = [rust_common.crate_info],
+ aspects = [rust_clippy_aspect],
+ ),
+ },
+ doc = """\
+Executes the clippy checker on a specific target.
+
+Similar to `rust_clippy_aspect`, but allows specifying a list of dependencies \
+within the build system.
+
+For example, given the following example targets:
+
+```python
+load("@rules_rust//rust:defs.bzl", "rust_library", "rust_test")
+
+rust_library(
+ name = "hello_lib",
+ srcs = ["src/lib.rs"],
+)
+
+rust_test(
+ name = "greeting_test",
+ srcs = ["tests/greeting.rs"],
+ deps = [":hello_lib"],
+)
+```
+
+Rust clippy can be set as a build target with the following:
+
+```python
+load("@rules_rust//rust:defs.bzl", "rust_clippy")
+
+rust_clippy(
+ name = "hello_library_clippy",
+ testonly = True,
+ deps = [
+ ":hello_lib",
+ ":greeting_test",
+ ],
+)
+```
+""",
+)
+
+def _capture_clippy_output_impl(ctx):
+ """Implementation of the `capture_clippy_output` rule
+
+ Args:
+ ctx (ctx): The rule's context object
+
+ Returns:
+ list: A list containing the CaptureClippyOutputInfo provider
+ """
+ return [CaptureClippyOutputInfo(capture_output = ctx.build_setting_value)]
+
+capture_clippy_output = rule(
+ doc = "Control whether to print clippy output or store it to a file, using the configured error_format.",
+ implementation = _capture_clippy_output_impl,
+ build_setting = config.bool(flag = True),
+)
diff --git a/rust/private/common.bzl b/rust/private/common.bzl
new file mode 100644
index 0000000..78a3011
--- /dev/null
+++ b/rust/private/common.bzl
@@ -0,0 +1,60 @@
+# Copyright 2021 The Bazel Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""A resilient API layer wrapping compilation and other logic for Rust rules.
+
+This module is meant to be used by custom rules that need to compile Rust code
+and cannot simply rely on writing a macro that wraps `rust_library`. This module
+provides the lower-level interface to Rust providers, actions, and functions.
+Do not load this file directly; instead, load the top-level `defs.bzl` file,
+which exports the `rust_common` struct.
+
+In the Bazel lingo, `rust_common` gives the access to the Rust Sandwich API.
+"""
+
+load(":providers.bzl", "CrateInfo", "DepInfo", "StdLibInfo")
+
+# These constants only represent the default value for attributes and macros
+# defiend in `rules_rust`. Like any attribute public attribute, they can be
+# overwritten by the user on the rules they're defiend on.
+#
+# Note: Code in `.github/workflows/crate_universe.yaml` looks for this line, if
+# you remove it or change its format, you will also need to update that code.
+DEFAULT_RUST_VERSION = "1.59.0"
+DEFAULT_RUST_EDITION = "2018"
+
+def _create_crate_info(**kwargs):
+ """A constructor for a `CrateInfo` provider
+
+ This function should be used in place of directly creating a `CrateInfo`
+ provider to improve API stability.
+
+ Args:
+ **kwargs: An inital set of keyword arguments.
+
+ Returns:
+ CrateInfo: A provider
+ """
+ if not "wrapped_crate_type" in kwargs:
+ kwargs.update({"wrapped_crate_type": None})
+ return CrateInfo(**kwargs)
+
+rust_common = struct(
+ create_crate_info = _create_crate_info,
+ crate_info = CrateInfo,
+ dep_info = DepInfo,
+ stdlib_info = StdLibInfo,
+ default_edition = DEFAULT_RUST_EDITION,
+ default_version = DEFAULT_RUST_VERSION,
+)
diff --git a/rust/private/dummy_cc_toolchain/BUILD.bazel b/rust/private/dummy_cc_toolchain/BUILD.bazel
new file mode 100644
index 0000000..004d233
--- /dev/null
+++ b/rust/private/dummy_cc_toolchain/BUILD.bazel
@@ -0,0 +1,13 @@
+load(":dummy_cc_toolchain.bzl", "dummy_cc_toolchain")
+
+dummy_cc_toolchain(name = "dummy_cc_wasm32")
+
+# When compiling Rust code for wasm32, we avoid linking to cpp code so we introduce a dummy cc
+# toolchain since we know we'll never look it up.
+# TODO(jedmonds@spotify.com): Need to support linking C code to rust code when compiling for wasm32.
+toolchain(
+ name = "dummy_cc_wasm32_toolchain",
+ target_compatible_with = ["//rust/platform/cpu:wasm32"],
+ toolchain = ":dummy_cc_wasm32",
+ toolchain_type = "@bazel_tools//tools/cpp:toolchain_type",
+)
diff --git a/rust/private/dummy_cc_toolchain/dummy_cc_toolchain.bzl b/rust/private/dummy_cc_toolchain/dummy_cc_toolchain.bzl
new file mode 100644
index 0000000..8ca8c8f
--- /dev/null
+++ b/rust/private/dummy_cc_toolchain/dummy_cc_toolchain.bzl
@@ -0,0 +1,9 @@
+# buildifier: disable=module-docstring
+def _dummy_cc_toolchain_impl(_ctx):
+ # The `all_files` attribute is referenced by rustc_compile_action().
+ return [platform_common.ToolchainInfo(all_files = depset([]))]
+
+dummy_cc_toolchain = rule(
+ implementation = _dummy_cc_toolchain_impl,
+ attrs = {},
+)
diff --git a/rust/private/providers.bzl b/rust/private/providers.bzl
new file mode 100644
index 0000000..b471ac0
--- /dev/null
+++ b/rust/private/providers.bzl
@@ -0,0 +1,109 @@
+# Copyright 2021 The Bazel Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Module containing definitions of all Rust providers."""
+
+CrateInfo = provider(
+ doc = "A provider containing general Crate information.",
+ fields = {
+ "aliases": "Dict[Label, String]: Renamed and aliased crates",
+ "compile_data": "depset[File]: Compile data required by this crate.",
+ "deps": "depset[DepVariantInfo]: This crate's (rust or cc) dependencies' providers.",
+ "edition": "str: The edition of this crate.",
+ "is_test": "bool: If the crate is being compiled in a test context",
+ "name": "str: The name of this crate.",
+ "output": "File: The output File that will be produced, depends on crate type.",
+ "owner": "Label: The label of the target that produced this CrateInfo",
+ "proc_macro_deps": "depset[DepVariantInfo]: This crate's rust proc_macro dependencies' providers.",
+ "root": "File: The source File entrypoint to this crate, eg. lib.rs",
+ "rustc_env": "Dict[String, String]: Additional `\"key\": \"value\"` environment variables to set for rustc.",
+ "srcs": "depset[File]: All source Files that are part of the crate.",
+ "type": (
+ "str: The type of this crate " +
+ "(see [rustc --crate-type](https://doc.rust-lang.org/rustc/command-line-arguments.html#--crate-type-a-list-of-types-of-crates-for-the-compiler-to-emit))."
+ ),
+ "wrapped_crate_type": (
+ "str, optional: The original crate type for targets generated using a previously defined " +
+ "crate (typically tests using the `rust_test::crate` attribute)"
+ ),
+ },
+)
+
+DepInfo = provider(
+ doc = "A provider containing information about a Crate's dependencies.",
+ fields = {
+ "dep_env": "File: File with environment variables direct dependencies build scripts rely upon.",
+ "direct_crates": "depset[AliasableDepInfo]",
+ "link_search_path_files": "depset[File]: All transitive files containing search paths to pass to the linker",
+ "transitive_build_infos": "depset[BuildInfo]",
+ "transitive_crate_outputs": "depset[File]: All transitive crate outputs.",
+ "transitive_crates": "depset[CrateInfo]",
+ "transitive_noncrates": "depset[LinkerInput]: All transitive dependencies that aren't crates.",
+ },
+)
+
+BuildInfo = provider(
+ doc = "A provider containing `rustc` build settings for a given Crate.",
+ fields = {
+ "dep_env": "File: extra build script environment varibles to be set to direct dependencies.",
+ "flags": "File: file containing additional flags to pass to rustc",
+ "link_flags": "File: file containing flags to pass to the linker",
+ "link_search_paths": "File: file containing search paths to pass to the linker",
+ "out_dir": "File: directory containing the result of a build script",
+ "rustc_env": "File: file containing additional environment variables to set for rustc.",
+ },
+)
+
+DepVariantInfo = provider(
+ doc = "A wrapper provider for a dependency of a crate. The dependency can be a Rust " +
+ "dependency, in which case the `crate_info` and `dep_info` fields will be populated, " +
+ "a Rust build script dependency, in which case `build_info` will be populated, or a " +
+ "C/C++ dependency, in which case `cc_info` will be populated.",
+ fields = {
+ "build_info": "BuildInfo: The BuildInfo of a Rust dependency",
+ "cc_info": "CcInfo: The CcInfo of a C/C++ dependency",
+ "crate_info": "CrateInfo: The CrateInfo of a Rust dependency",
+ "dep_info": "DepInfo: The DepInfo of a Rust dependency",
+ },
+)
+
+StdLibInfo = provider(
+ doc = (
+ "A collection of files either found within the `rust-stdlib` artifact or " +
+ "generated based on existing files."
+ ),
+ fields = {
+ "alloc_files": "List[File]: `.a` files related to the `alloc` module.",
+ "between_alloc_and_core_files": "List[File]: `.a` files related to the `compiler_builtins` module.",
+ "between_core_and_std_files": "List[File]: `.a` files related to all modules except `adler`, `alloc`, `compiler_builtins`, `core`, and `std`.",
+ "core_files": "List[File]: `.a` files related to the `core` and `adler` modules",
+ "dot_a_files": "Depset[File]: Generated `.a` files",
+ "self_contained_files": "List[File]: All `.o` files from the `self-contained` directory.",
+ "srcs": "List[Target]: All targets from the original `srcs` attribute.",
+ "std_files": "Depset[File]: `.a` files associated with the `std` module.",
+ "std_rlibs": "List[File]: All `.rlib` files",
+ },
+)
+
+CaptureClippyOutputInfo = provider(
+ doc = "Value of the `capture_clippy_output` build setting",
+ fields = {"capture_output": "Value of the `capture_clippy_output` build setting"},
+)
+
+ClippyInfo = provider(
+ doc = "Provides information on a clippy run.",
+ fields = {
+ "output": "File with the clippy output.",
+ },
+)
diff --git a/rust/private/repository_utils.bzl b/rust/private/repository_utils.bzl
new file mode 100644
index 0000000..b6c83aa
--- /dev/null
+++ b/rust/private/repository_utils.bzl
@@ -0,0 +1,587 @@
+"""Utility macros for use in rules_rust repository rules"""
+
+load("//rust:known_shas.bzl", "FILE_KEY_TO_SHA")
+load(
+ "//rust/platform:triple_mappings.bzl",
+ "system_to_binary_ext",
+ "system_to_dylib_ext",
+ "system_to_staticlib_ext",
+ "system_to_stdlib_linkflags",
+ "triple_to_constraint_set",
+ "triple_to_system",
+)
+
+DEFAULT_TOOLCHAIN_NAME_PREFIX = "toolchain_for"
+DEFAULT_STATIC_RUST_URL_TEMPLATES = ["https://static.rust-lang.org/dist/{}.tar.gz"]
+
+_build_file_for_compiler_template = """\
+load("@rules_rust//rust:toolchain.bzl", "rust_toolchain")
+
+filegroup(
+ name = "rustc",
+ srcs = ["bin/rustc{binary_ext}"],
+ visibility = ["//visibility:public"],
+)
+
+filegroup(
+ name = "rustc_lib",
+ srcs = glob(
+ [
+ "bin/*{dylib_ext}",
+ "lib/*{dylib_ext}",
+ "lib/rustlib/{target_triple}/codegen-backends/*{dylib_ext}",
+ "lib/rustlib/{target_triple}/bin/rust-lld{binary_ext}",
+ "lib/rustlib/{target_triple}/lib/*{dylib_ext}",
+ ],
+ allow_empty = True,
+ ),
+ visibility = ["//visibility:public"],
+)
+
+filegroup(
+ name = "rustdoc",
+ srcs = ["bin/rustdoc{binary_ext}"],
+ visibility = ["//visibility:public"],
+)
+"""
+
+def BUILD_for_compiler(target_triple):
+ """Emits a BUILD file the compiler `.tar.gz`.
+
+ Args:
+ target_triple (str): The triple of the target platform
+
+ Returns:
+ str: The contents of a BUILD file
+ """
+ system = triple_to_system(target_triple)
+ return _build_file_for_compiler_template.format(
+ binary_ext = system_to_binary_ext(system),
+ staticlib_ext = system_to_staticlib_ext(system),
+ dylib_ext = system_to_dylib_ext(system),
+ target_triple = target_triple,
+ )
+
+_build_file_for_cargo_template = """\
+load("@rules_rust//rust:toolchain.bzl", "rust_toolchain")
+
+filegroup(
+ name = "cargo",
+ srcs = ["bin/cargo{binary_ext}"],
+ visibility = ["//visibility:public"],
+)"""
+
+def BUILD_for_cargo(target_triple):
+ """Emits a BUILD file the cargo `.tar.gz`.
+
+ Args:
+ target_triple (str): The triple of the target platform
+
+ Returns:
+ str: The contents of a BUILD file
+ """
+ system = triple_to_system(target_triple)
+ return _build_file_for_cargo_template.format(
+ binary_ext = system_to_binary_ext(system),
+ )
+
+_build_file_for_rustfmt_template = """\
+load("@rules_rust//rust:toolchain.bzl", "rust_toolchain")
+
+filegroup(
+ name = "rustfmt_bin",
+ srcs = ["bin/rustfmt{binary_ext}"],
+ visibility = ["//visibility:public"],
+)
+
+sh_binary(
+ name = "rustfmt",
+ srcs = [":rustfmt_bin"],
+ visibility = ["//visibility:public"],
+)
+"""
+
+def BUILD_for_rustfmt(target_triple):
+ """Emits a BUILD file the rustfmt `.tar.gz`.
+
+ Args:
+ target_triple (str): The triple of the target platform
+
+ Returns:
+ str: The contents of a BUILD file
+ """
+ system = triple_to_system(target_triple)
+ return _build_file_for_rustfmt_template.format(
+ binary_ext = system_to_binary_ext(system),
+ )
+
+_build_file_for_clippy_template = """\
+load("@rules_rust//rust:toolchain.bzl", "rust_toolchain")
+
+filegroup(
+ name = "clippy_driver_bin",
+ srcs = ["bin/clippy-driver{binary_ext}"],
+ visibility = ["//visibility:public"],
+)
+"""
+
+def BUILD_for_clippy(target_triple):
+ """Emits a BUILD file the clippy `.tar.gz`.
+
+ Args:
+ target_triple (str): The triple of the target platform
+
+ Returns:
+ str: The contents of a BUILD file
+ """
+ system = triple_to_system(target_triple)
+ return _build_file_for_clippy_template.format(binary_ext = system_to_binary_ext(system))
+
+_build_file_for_stdlib_template = """\
+load("@rules_rust//rust:toolchain.bzl", "rust_stdlib_filegroup")
+
+rust_stdlib_filegroup(
+ name = "rust_std-{target_triple}",
+ srcs = glob(
+ [
+ "lib/rustlib/{target_triple}/lib/*.rlib",
+ "lib/rustlib/{target_triple}/lib/*{dylib_ext}",
+ "lib/rustlib/{target_triple}/lib/*{staticlib_ext}",
+ "lib/rustlib/{target_triple}/lib/self-contained/**",
+ ],
+ # Some patterns (e.g. `lib/*.a`) don't match anything, see https://github.com/bazelbuild/rules_rust/pull/245
+ allow_empty = True,
+ ),
+ visibility = ["//visibility:public"],
+)
+
+# For legacy support
+alias(
+ name = "rust_lib-{target_triple}",
+ actual = "rust_std-{target_triple}",
+ visibility = ["//visibility:public"],
+)
+"""
+
+def BUILD_for_stdlib(target_triple):
+ """Emits a BUILD file the stdlib `.tar.gz`.
+
+ Args:
+ target_triple (str): The triple of the target platform
+
+ Returns:
+ str: The contents of a BUILD file
+ """
+ system = triple_to_system(target_triple)
+ return _build_file_for_stdlib_template.format(
+ binary_ext = system_to_binary_ext(system),
+ staticlib_ext = system_to_staticlib_ext(system),
+ dylib_ext = system_to_dylib_ext(system),
+ target_triple = target_triple,
+ )
+
+_build_file_for_rust_toolchain_template = """\
+rust_toolchain(
+ name = "{toolchain_name}_impl",
+ rust_doc = "@{workspace_name}//:rustdoc",
+ rust_std = "@{workspace_name}//:rust_std-{target_triple}",
+ rustc = "@{workspace_name}//:rustc",
+ rustfmt = {rustfmt_label},
+ cargo = "@{workspace_name}//:cargo",
+ clippy_driver = "@{workspace_name}//:clippy_driver_bin",
+ rustc_lib = "@{workspace_name}//:rustc_lib",
+ rustc_srcs = {rustc_srcs},
+ binary_ext = "{binary_ext}",
+ staticlib_ext = "{staticlib_ext}",
+ dylib_ext = "{dylib_ext}",
+ stdlib_linkflags = [{stdlib_linkflags}],
+ os = "{system}",
+ default_edition = "{default_edition}",
+ exec_triple = "{exec_triple}",
+ target_triple = "{target_triple}",
+ visibility = ["//visibility:public"],
+)
+"""
+
+def BUILD_for_rust_toolchain(
+ workspace_name,
+ name,
+ exec_triple,
+ target_triple,
+ include_rustc_srcs,
+ default_edition,
+ include_rustfmt,
+ stdlib_linkflags = None):
+ """Emits a toolchain declaration to match an existing compiler and stdlib.
+
+ Args:
+ workspace_name (str): The name of the workspace that this toolchain resides in
+ name (str): The name of the toolchain declaration
+ exec_triple (str): The rust-style target that this compiler runs on
+ target_triple (str): The rust-style target triple of the tool
+ include_rustc_srcs (bool, optional): Whether to download rustc's src code. This is required in order to use rust-analyzer support. Defaults to False.
+ default_edition (str): Default Rust edition.
+ include_rustfmt (bool): Whether rustfmt is present in the toolchain.
+ stdlib_linkflags (list, optional): Overriden flags needed for linking to rust
+ stdlib, akin to BAZEL_LINKLIBS. Defaults to
+ None.
+
+
+ Returns:
+ str: A rendered template of a `rust_toolchain` declaration
+ """
+ system = triple_to_system(target_triple)
+ if stdlib_linkflags == None:
+ stdlib_linkflags = ", ".join(['"%s"' % x for x in system_to_stdlib_linkflags(system)])
+
+ rustc_srcs = "None"
+ if include_rustc_srcs:
+ rustc_srcs = "\"@{workspace_name}//lib/rustlib/src:rustc_srcs\"".format(workspace_name = workspace_name)
+ rustfmt_label = "None"
+ if include_rustfmt:
+ rustfmt_label = "\"@{workspace_name}//:rustfmt_bin\"".format(workspace_name = workspace_name)
+
+ return _build_file_for_rust_toolchain_template.format(
+ toolchain_name = name,
+ workspace_name = workspace_name,
+ binary_ext = system_to_binary_ext(system),
+ staticlib_ext = system_to_staticlib_ext(system),
+ dylib_ext = system_to_dylib_ext(system),
+ rustc_srcs = rustc_srcs,
+ stdlib_linkflags = stdlib_linkflags,
+ system = system,
+ default_edition = default_edition,
+ exec_triple = exec_triple,
+ target_triple = target_triple,
+ rustfmt_label = rustfmt_label,
+ )
+
+_build_file_for_toolchain_template = """\
+toolchain(
+ name = "{name}",
+ exec_compatible_with = {exec_constraint_sets_serialized},
+ target_compatible_with = {target_constraint_sets_serialized},
+ toolchain = "@{parent_workspace_name}//:{name}_impl",
+ toolchain_type = "@rules_rust//rust:toolchain",
+)
+"""
+
+def BUILD_for_toolchain(name, parent_workspace_name, exec_triple, target_triple):
+ return _build_file_for_toolchain_template.format(
+ name = name,
+ exec_constraint_sets_serialized = serialized_constraint_set_from_triple(exec_triple),
+ target_constraint_sets_serialized = serialized_constraint_set_from_triple(target_triple),
+ parent_workspace_name = parent_workspace_name,
+ )
+
+def load_rustfmt(ctx):
+ """Loads a rustfmt binary and yields corresponding BUILD for it
+
+ Args:
+ ctx (repository_ctx): The repository rule's context object
+
+ Returns:
+ str: The BUILD file contents for this rustfmt binary
+ """
+ target_triple = ctx.attr.exec_triple
+
+ load_arbitrary_tool(
+ ctx,
+ iso_date = ctx.attr.iso_date,
+ target_triple = target_triple,
+ tool_name = "rustfmt",
+ tool_subdirectories = ["rustfmt-preview"],
+ version = ctx.attr.rustfmt_version,
+ )
+
+ return BUILD_for_rustfmt(target_triple)
+
+def load_rust_compiler(ctx):
+ """Loads a rust compiler and yields corresponding BUILD for it
+
+ Args:
+ ctx (repository_ctx): A repository_ctx.
+
+ Returns:
+ str: The BUILD file contents for this compiler and compiler library
+ """
+
+ target_triple = ctx.attr.exec_triple
+ load_arbitrary_tool(
+ ctx,
+ iso_date = ctx.attr.iso_date,
+ target_triple = target_triple,
+ tool_name = "rust",
+ tool_subdirectories = ["rustc", "clippy-preview", "cargo"],
+ version = ctx.attr.version,
+ )
+
+ compiler_build_file = BUILD_for_compiler(target_triple) + BUILD_for_clippy(target_triple) + BUILD_for_cargo(target_triple)
+
+ return compiler_build_file
+
+def should_include_rustc_srcs(repository_ctx):
+ """Determing whether or not to include rustc sources in the toolchain.
+
+ Args:
+ repository_ctx (repository_ctx): The repository rule's context object
+
+ Returns:
+ bool: Whether or not to include rustc source files in a `rustc_toolchain`
+ """
+
+ # The environment variable will always take precedence over the attribute.
+ include_rustc_srcs_env = repository_ctx.os.environ.get("RULES_RUST_TOOLCHAIN_INCLUDE_RUSTC_SRCS")
+ if include_rustc_srcs_env != None:
+ return include_rustc_srcs_env.lower() in ["true", "1"]
+
+ return getattr(repository_ctx.attr, "include_rustc_srcs", False)
+
+def load_rust_src(ctx):
+ """Loads the rust source code. Used by the rust-analyzer rust-project.json generator.
+
+ Args:
+ ctx (ctx): A repository_ctx.
+ """
+ tool_suburl = produce_tool_suburl("rust-src", None, ctx.attr.version, ctx.attr.iso_date)
+ static_rust = ctx.os.environ.get("STATIC_RUST_URL", "https://static.rust-lang.org")
+ url = "{}/dist/{}.tar.gz".format(static_rust, tool_suburl)
+
+ tool_path = produce_tool_path("rust-src", None, ctx.attr.version)
+ archive_path = tool_path + ".tar.gz"
+ ctx.download(
+ url,
+ output = archive_path,
+ sha256 = ctx.attr.sha256s.get(tool_suburl) or FILE_KEY_TO_SHA.get(tool_suburl) or "",
+ auth = _make_auth_dict(ctx, [url]),
+ )
+ ctx.extract(
+ archive_path,
+ output = "lib/rustlib/src",
+ stripPrefix = "{}/rust-src/lib/rustlib/src/rust".format(tool_path),
+ )
+ ctx.file(
+ "lib/rustlib/src/BUILD.bazel",
+ """\
+filegroup(
+ name = "rustc_srcs",
+ srcs = glob(["**/*"]),
+ visibility = ["//visibility:public"],
+)""",
+ )
+
+def load_rust_stdlib(ctx, target_triple):
+ """Loads a rust standard library and yields corresponding BUILD for it
+
+ Args:
+ ctx (repository_ctx): A repository_ctx.
+ target_triple (str): The rust-style target triple of the tool
+
+ Returns:
+ str: The BUILD file contents for this stdlib, and a toolchain decl to match
+ """
+
+ load_arbitrary_tool(
+ ctx,
+ iso_date = ctx.attr.iso_date,
+ target_triple = target_triple,
+ tool_name = "rust-std",
+ tool_subdirectories = ["rust-std-{}".format(target_triple)],
+ version = ctx.attr.version,
+ )
+
+ toolchain_prefix = ctx.attr.toolchain_name_prefix or DEFAULT_TOOLCHAIN_NAME_PREFIX
+ stdlib_build_file = BUILD_for_stdlib(target_triple)
+
+ stdlib_linkflags = None
+ if "BAZEL_RUST_STDLIB_LINKFLAGS" in ctx.os.environ:
+ stdlib_linkflags = ctx.os.environ["BAZEL_RUST_STDLIB_LINKFLAGS"].split(":")
+
+ toolchain_build_file = BUILD_for_rust_toolchain(
+ name = "{toolchain_prefix}_{target_triple}".format(
+ toolchain_prefix = toolchain_prefix,
+ target_triple = target_triple,
+ ),
+ exec_triple = ctx.attr.exec_triple,
+ include_rustc_srcs = should_include_rustc_srcs(ctx),
+ target_triple = target_triple,
+ stdlib_linkflags = stdlib_linkflags,
+ workspace_name = ctx.attr.name,
+ default_edition = ctx.attr.edition,
+ include_rustfmt = not (not ctx.attr.rustfmt_version),
+ )
+
+ return stdlib_build_file + toolchain_build_file
+
+def load_rustc_dev_nightly(ctx, target_triple):
+ """Loads the nightly rustc dev component
+
+ Args:
+ ctx: A repository_ctx.
+ target_triple: The rust-style target triple of the tool
+ """
+
+ subdir_name = "rustc-dev"
+ if ctx.attr.iso_date < "2020-12-24":
+ subdir_name = "rustc-dev-{}".format(target_triple)
+
+ load_arbitrary_tool(
+ ctx,
+ iso_date = ctx.attr.iso_date,
+ target_triple = target_triple,
+ tool_name = "rustc-dev",
+ tool_subdirectories = [subdir_name],
+ version = ctx.attr.version,
+ )
+
+def load_llvm_tools(ctx, target_triple):
+ """Loads the llvm tools
+
+ Args:
+ ctx: A repository_ctx.
+ target_triple: The rust-style target triple of the tool
+ """
+ load_arbitrary_tool(
+ ctx,
+ iso_date = ctx.attr.iso_date,
+ target_triple = target_triple,
+ tool_name = "llvm-tools",
+ tool_subdirectories = ["llvm-tools-preview"],
+ version = ctx.attr.version,
+ )
+
+def check_version_valid(version, iso_date, param_prefix = ""):
+ """Verifies that the provided rust version and iso_date make sense.
+
+ Args:
+ version (str): The rustc version
+ iso_date (str): The rustc nightly version's iso date
+ param_prefix (str, optional): The name of the tool who's version is being checked.
+ """
+
+ if not version and iso_date:
+ fail("{param_prefix}iso_date must be paired with a {param_prefix}version".format(param_prefix = param_prefix))
+
+ if version in ("beta", "nightly") and not iso_date:
+ fail("{param_prefix}iso_date must be specified if version is 'beta' or 'nightly'".format(param_prefix = param_prefix))
+
+def serialized_constraint_set_from_triple(target_triple):
+ """Returns a string representing a set of constraints
+
+ Args:
+ target_triple (str): The target triple of the constraint set
+
+ Returns:
+ str: Formatted string representing the serialized constraint
+ """
+ constraint_set = triple_to_constraint_set(target_triple)
+ constraint_set_strs = []
+ for constraint in constraint_set:
+ constraint_set_strs.append("\"{}\"".format(constraint))
+ return "[{}]".format(", ".join(constraint_set_strs))
+
+def produce_tool_suburl(tool_name, target_triple, version, iso_date = None):
+ """Produces a fully qualified Rust tool name for URL
+
+ Args:
+ tool_name: The name of the tool per static.rust-lang.org
+ target_triple: The rust-style target triple of the tool
+ version: The version of the tool among "nightly", "beta', or an exact version.
+ iso_date: The date of the tool (or None, if the version is a specific version).
+
+ Returns:
+ str: The fully qualified url path for the specified tool.
+ """
+ path = produce_tool_path(tool_name, target_triple, version)
+ return iso_date + "/" + path if (iso_date and version in ("beta", "nightly")) else path
+
+def produce_tool_path(tool_name, target_triple, version):
+ """Produces a qualified Rust tool name
+
+ Args:
+ tool_name: The name of the tool per static.rust-lang.org
+ target_triple: The rust-style target triple of the tool
+ version: The version of the tool among "nightly", "beta', or an exact version.
+
+ Returns:
+ str: The qualified path for the specified tool.
+ """
+ if not tool_name:
+ fail("No tool name was provided")
+ if not version:
+ fail("No tool version was provided")
+ return "-".join([e for e in [tool_name, version, target_triple] if e])
+
+def load_arbitrary_tool(ctx, tool_name, tool_subdirectories, version, iso_date, target_triple, sha256 = ""):
+ """Loads a Rust tool, downloads, and extracts into the common workspace.
+
+ This function sources the tool from the Rust-lang static file server. The index is available at:
+ - https://static.rust-lang.org/dist/channel-rust-stable.toml
+ - https://static.rust-lang.org/dist/channel-rust-beta.toml
+ - https://static.rust-lang.org/dist/channel-rust-nightly.toml
+
+ The environment variable `STATIC_RUST_URL` can be used to replace the schema and hostname of
+ the URLs used for fetching assets. `https://static.rust-lang.org/dist/channel-rust-stable.toml`
+ becomes `${STATIC_RUST_URL}/dist/channel-rust-stable.toml`
+
+ Args:
+ ctx (repository_ctx): A repository_ctx (no attrs required).
+ tool_name (str): The name of the given tool per the archive naming.
+ tool_subdirectories (str): The subdirectories of the tool files (at a level below the root directory of
+ the archive). The root directory of the archive is expected to match
+ $TOOL_NAME-$VERSION-$TARGET_TRIPLE.
+ Example:
+ tool_name
+ | version
+ | | target_triple
+ v v v
+ rust-1.39.0-x86_64-unknown-linux-gnu/clippy-preview
+ .../rustc
+ .../etc
+ tool_subdirectories = ["clippy-preview", "rustc"]
+ version (str): The version of the tool among "nightly", "beta', or an exact version.
+ iso_date (str): The date of the tool (ignored if the version is a specific version).
+ target_triple (str): The rust-style target triple of the tool
+ sha256 (str, optional): The expected hash of hash of the Rust tool. Defaults to "".
+ """
+ check_version_valid(version, iso_date, param_prefix = tool_name + "_")
+
+ # View the indices mentioned in the docstring to find the tool_suburl for a given
+ # tool.
+ tool_suburl = produce_tool_suburl(tool_name, target_triple, version, iso_date)
+ urls = []
+
+ static_rust_url_from_env = ctx.os.environ.get("STATIC_RUST_URL")
+ if static_rust_url_from_env:
+ urls.append("{}/dist/{}.tar.gz".format(static_rust_url_from_env, tool_suburl))
+
+ for url in getattr(ctx.attr, "urls", DEFAULT_STATIC_RUST_URL_TEMPLATES):
+ new_url = url.format(tool_suburl)
+ if new_url not in urls:
+ urls.append(new_url)
+
+ tool_path = produce_tool_path(tool_name, target_triple, version)
+ archive_path = "{}.tar.gz".format(tool_path)
+ ctx.download(
+ urls,
+ output = archive_path,
+ sha256 = getattr(ctx.attr, "sha256s", dict()).get(tool_suburl) or
+ FILE_KEY_TO_SHA.get(tool_suburl) or
+ sha256,
+ auth = _make_auth_dict(ctx, urls),
+ )
+ for subdirectory in tool_subdirectories:
+ ctx.extract(
+ archive_path,
+ output = "",
+ stripPrefix = "{}/{}".format(tool_path, subdirectory),
+ )
+
+def _make_auth_dict(ctx, urls):
+ auth = getattr(ctx.attr, "auth", {})
+ if not auth:
+ return {}
+ ret = {}
+ for url in urls:
+ ret[url] = auth
+ return ret
diff --git a/rust/private/rust.bzl b/rust/private/rust.bzl
new file mode 100644
index 0000000..58cc9c4
--- /dev/null
+++ b/rust/private/rust.bzl
@@ -0,0 +1,1151 @@
+# Copyright 2015 The Bazel Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# buildifier: disable=module-docstring
+load("//rust/private:common.bzl", "rust_common")
+load("//rust/private:rustc.bzl", "rustc_compile_action")
+load(
+ "//rust/private:utils.bzl",
+ "compute_crate_name",
+ "dedent",
+ "determine_output_hash",
+ "expand_dict_value_locations",
+ "find_toolchain",
+ "get_import_macro_deps",
+ "transform_deps",
+)
+
+# TODO(marco): Separate each rule into its own file.
+
+def _assert_no_deprecated_attributes(_ctx):
+ """Forces a failure if any deprecated attributes were specified
+
+ Args:
+ _ctx (ctx): The current rule's context object
+ """
+ pass
+
+def _assert_correct_dep_mapping(ctx):
+ """Forces a failure if proc_macro_deps and deps are mixed inappropriately
+
+ Args:
+ ctx (ctx): The current rule's context object
+ """
+ for dep in ctx.attr.deps:
+ if rust_common.crate_info in dep:
+ if dep[rust_common.crate_info].type == "proc-macro":
+ fail(
+ "{} listed {} in its deps, but it is a proc-macro. It should instead be in the bazel property proc_macro_deps.".format(
+ ctx.label,
+ dep.label,
+ ),
+ )
+ for dep in ctx.attr.proc_macro_deps:
+ type = dep[rust_common.crate_info].type
+ if type != "proc-macro":
+ fail(
+ "{} listed {} in its proc_macro_deps, but it is not proc-macro, it is a {}. It should probably instead be listed in deps.".format(
+ ctx.label,
+ dep.label,
+ type,
+ ),
+ )
+
+def _determine_lib_name(name, crate_type, toolchain, lib_hash = None):
+ """See https://github.com/bazelbuild/rules_rust/issues/405
+
+ Args:
+ name (str): The name of the current target
+ crate_type (str): The `crate_type`
+ toolchain (rust_toolchain): The current `rust_toolchain`
+ lib_hash (str, optional): The hashed crate root path
+
+ Returns:
+ str: A unique library name
+ """
+ extension = None
+ prefix = ""
+ if crate_type in ("dylib", "cdylib", "proc-macro"):
+ extension = toolchain.dylib_ext
+ elif crate_type == "staticlib":
+ extension = toolchain.staticlib_ext
+ elif crate_type in ("lib", "rlib"):
+ # All platforms produce 'rlib' here
+ extension = ".rlib"
+ prefix = "lib"
+ elif crate_type == "bin":
+ fail("crate_type of 'bin' was detected in a rust_library. Please compile " +
+ "this crate as a rust_binary instead.")
+
+ if not extension:
+ fail(("Unknown crate_type: {}. If this is a cargo-supported crate type, " +
+ "please file an issue!").format(crate_type))
+
+ prefix = "lib"
+ if (toolchain.target_triple.find("windows") != -1) and crate_type not in ("lib", "rlib"):
+ prefix = ""
+ if toolchain.target_arch == "wasm32" and crate_type == "cdylib":
+ prefix = ""
+
+ return "{prefix}{name}{lib_hash}{extension}".format(
+ prefix = prefix,
+ name = name,
+ lib_hash = "-" + lib_hash if lib_hash else "",
+ extension = extension,
+ )
+
+def get_edition(attr, toolchain):
+ """Returns the Rust edition from either the current rule's attirbutes or the current `rust_toolchain`
+
+ Args:
+ attr (struct): The current rule's attributes
+ toolchain (rust_toolchain): The `rust_toolchain` for the current target
+
+ Returns:
+ str: The target Rust edition
+ """
+ if getattr(attr, "edition"):
+ return attr.edition
+ else:
+ return toolchain.default_edition
+
+def crate_root_src(attr, srcs, crate_type):
+ """Finds the source file for the crate root.
+
+ Args:
+ attr (struct): The attributes of the current target
+ srcs (list): A list of all sources for the target Crate.
+ crate_type (str): The type of this crate ("bin", "lib", "rlib", "cdylib", etc).
+
+ Returns:
+ File: The root File object for a given crate. See the following links for more details:
+ - https://doc.rust-lang.org/cargo/reference/cargo-targets.html#library
+ - https://doc.rust-lang.org/cargo/reference/cargo-targets.html#binaries
+ """
+ default_crate_root_filename = "main.rs" if crate_type == "bin" else "lib.rs"
+
+ crate_root = None
+ if hasattr(attr, "crate_root"):
+ if attr.crate_root:
+ crate_root = attr.crate_root.files.to_list()[0]
+
+ if not crate_root:
+ crate_root = (
+ (srcs[0] if len(srcs) == 1 else None) or
+ _shortest_src_with_basename(srcs, default_crate_root_filename) or
+ _shortest_src_with_basename(srcs, attr.name + ".rs")
+ )
+ if not crate_root:
+ file_names = [default_crate_root_filename, attr.name + ".rs"]
+ fail("No {} source file found.".format(" or ".join(file_names)), "srcs")
+ return crate_root
+
+def _shortest_src_with_basename(srcs, basename):
+ """Finds the shortest among the paths in srcs that match the desired basename.
+
+ Args:
+ srcs (list): A list of File objects
+ basename (str): The target basename to match against.
+
+ Returns:
+ File: The File object with the shortest path that matches `basename`
+ """
+ shortest = None
+ for f in srcs:
+ if f.basename == basename:
+ if not shortest or len(f.dirname) < len(shortest.dirname):
+ shortest = f
+ return shortest
+
+def _rust_library_impl(ctx):
+ """The implementation of the `rust_library` rule.
+
+ This rule provides CcInfo, so it can be used everywhere Bazel
+ expects rules_cc, but care must be taken to have the correct
+ dependencies on an allocator and std implemetation as needed.
+
+ Args:
+ ctx (ctx): The rule's context object
+
+ Returns:
+ list: A list of providers.
+ """
+ return _rust_library_common(ctx, "rlib")
+
+def _rust_static_library_impl(ctx):
+ """The implementation of the `rust_static_library` rule.
+
+ This rule provides CcInfo, so it can be used everywhere Bazel
+ expects rules_cc.
+
+ Args:
+ ctx (ctx): The rule's context object
+
+ Returns:
+ list: A list of providers.
+ """
+ return _rust_library_common(ctx, "staticlib")
+
+def _rust_shared_library_impl(ctx):
+ """The implementation of the `rust_shared_library` rule.
+
+ This rule provides CcInfo, so it can be used everywhere Bazel
+ expects rules_cc.
+
+ On Windows, a PDB file containing debugging information is available under
+ the key `pdb_file` in `OutputGroupInfo`. Similarly on macOS, a dSYM folder
+ is available under the key `dsym_folder` in `OutputGroupInfo`.
+
+ Args:
+ ctx (ctx): The rule's context object
+
+ Returns:
+ list: A list of providers.
+ """
+ return _rust_library_common(ctx, "cdylib")
+
+def _rust_proc_macro_impl(ctx):
+ """The implementation of the `rust_proc_macro` rule.
+
+ Args:
+ ctx (ctx): The rule's context object
+
+ Returns:
+ list: A list of providers.
+ """
+ return _rust_library_common(ctx, "proc-macro")
+
+def _rust_library_common(ctx, crate_type):
+ """The common implementation of the library-like rules.
+
+ Args:
+ ctx (ctx): The rule's context object
+ crate_type (String): one of lib|rlib|dylib|staticlib|cdylib|proc-macro
+
+ Returns:
+ list: A list of providers. See `rustc_compile_action`
+ """
+
+ # Find lib.rs
+ crate_root = crate_root_src(ctx.attr, ctx.files.srcs, "lib")
+ _assert_no_deprecated_attributes(ctx)
+ _assert_correct_dep_mapping(ctx)
+
+ toolchain = find_toolchain(ctx)
+
+ # Determine unique hash for this rlib.
+ # Note that we don't include a hash for `cdylib` since they are meant to be consumed externally and having a
+ # deterministic name is important since it ends up embedded in the executable. This is problematic when one needs
+ # to include the library with a specific filename into a larger application.
+ # (see https://github.com/bazelbuild/rules_rust/issues/405#issuecomment-993089889 for more details)
+ if crate_type != "cdylib":
+ output_hash = determine_output_hash(crate_root, ctx.label)
+ else:
+ output_hash = None
+
+ crate_name = compute_crate_name(ctx.workspace_name, ctx.label, toolchain, ctx.attr.crate_name)
+ rust_lib_name = _determine_lib_name(
+ crate_name,
+ crate_type,
+ toolchain,
+ output_hash,
+ )
+ rust_lib = ctx.actions.declare_file(rust_lib_name)
+
+ deps = transform_deps(ctx.attr.deps)
+ proc_macro_deps = transform_deps(ctx.attr.proc_macro_deps + get_import_macro_deps(ctx))
+
+ return rustc_compile_action(
+ ctx = ctx,
+ attr = ctx.attr,
+ toolchain = toolchain,
+ crate_info = rust_common.create_crate_info(
+ name = crate_name,
+ type = crate_type,
+ root = crate_root,
+ srcs = depset(ctx.files.srcs),
+ deps = depset(deps),
+ proc_macro_deps = depset(proc_macro_deps),
+ aliases = ctx.attr.aliases,
+ output = rust_lib,
+ edition = get_edition(ctx.attr, toolchain),
+ rustc_env = ctx.attr.rustc_env,
+ is_test = False,
+ compile_data = depset(ctx.files.compile_data),
+ owner = ctx.label,
+ ),
+ output_hash = output_hash,
+ )
+
+def _rust_binary_impl(ctx):
+ """The implementation of the `rust_binary` rule
+
+ Args:
+ ctx (ctx): The rule's context object
+
+ Returns:
+ list: A list of providers. See `rustc_compile_action`
+ """
+ toolchain = find_toolchain(ctx)
+ crate_name = compute_crate_name(ctx.workspace_name, ctx.label, toolchain, ctx.attr.crate_name)
+ _assert_correct_dep_mapping(ctx)
+
+ output = ctx.actions.declare_file(ctx.label.name + toolchain.binary_ext)
+
+ deps = transform_deps(ctx.attr.deps)
+ proc_macro_deps = transform_deps(ctx.attr.proc_macro_deps + get_import_macro_deps(ctx))
+
+ return rustc_compile_action(
+ ctx = ctx,
+ attr = ctx.attr,
+ toolchain = toolchain,
+ crate_info = rust_common.create_crate_info(
+ name = crate_name,
+ type = ctx.attr.crate_type,
+ root = crate_root_src(ctx.attr, ctx.files.srcs, ctx.attr.crate_type),
+ srcs = depset(ctx.files.srcs),
+ deps = depset(deps),
+ proc_macro_deps = depset(proc_macro_deps),
+ aliases = ctx.attr.aliases,
+ output = output,
+ edition = get_edition(ctx.attr, toolchain),
+ rustc_env = ctx.attr.rustc_env,
+ is_test = False,
+ compile_data = depset(ctx.files.compile_data),
+ owner = ctx.label,
+ ),
+ )
+
+def _rust_test_common(ctx, toolchain, output):
+ """Builds a Rust test binary.
+
+ Args:
+ ctx (ctx): The ctx object for the current target.
+ toolchain (rust_toolchain): The current `rust_toolchain`
+ output (File): The output File that will be produced, depends on crate type.
+
+ Returns:
+ list: The list of providers. See `rustc_compile_action`
+ """
+ _assert_no_deprecated_attributes(ctx)
+ _assert_correct_dep_mapping(ctx)
+
+ crate_name = compute_crate_name(ctx.workspace_name, ctx.label, toolchain, ctx.attr.crate_name)
+ crate_type = "bin"
+
+ deps = transform_deps(ctx.attr.deps)
+ proc_macro_deps = transform_deps(ctx.attr.proc_macro_deps + get_import_macro_deps(ctx))
+
+ if ctx.attr.crate:
+ # Target is building the crate in `test` config
+ crate = ctx.attr.crate[rust_common.crate_info]
+
+ # Optionally join compile data
+ if crate.compile_data:
+ compile_data = depset(ctx.files.compile_data, transitive = [crate.compile_data])
+ else:
+ compile_data = depset(ctx.files.compile_data)
+
+ # Build the test binary using the dependency's srcs.
+ crate_info = rust_common.create_crate_info(
+ name = crate_name,
+ type = crate_type,
+ root = crate.root,
+ srcs = depset(ctx.files.srcs, transitive = [crate.srcs]),
+ deps = depset(deps, transitive = [crate.deps]),
+ proc_macro_deps = depset(proc_macro_deps, transitive = [crate.proc_macro_deps]),
+ aliases = ctx.attr.aliases,
+ output = output,
+ edition = crate.edition,
+ rustc_env = ctx.attr.rustc_env,
+ is_test = True,
+ compile_data = compile_data,
+ wrapped_crate_type = crate.type,
+ owner = ctx.label,
+ )
+ else:
+ # Target is a standalone crate. Build the test binary as its own crate.
+ crate_info = rust_common.create_crate_info(
+ name = crate_name,
+ type = crate_type,
+ root = crate_root_src(ctx.attr, ctx.files.srcs, "lib"),
+ srcs = depset(ctx.files.srcs),
+ deps = depset(deps),
+ proc_macro_deps = depset(proc_macro_deps),
+ aliases = ctx.attr.aliases,
+ output = output,
+ edition = get_edition(ctx.attr, toolchain),
+ rustc_env = ctx.attr.rustc_env,
+ is_test = True,
+ compile_data = depset(ctx.files.compile_data),
+ owner = ctx.label,
+ )
+
+ providers = rustc_compile_action(
+ ctx = ctx,
+ attr = ctx.attr,
+ toolchain = toolchain,
+ crate_info = crate_info,
+ rust_flags = ["--test"] if ctx.attr.use_libtest_harness else ["--cfg", "test"],
+ )
+ data = getattr(ctx.attr, "data", [])
+
+ env = expand_dict_value_locations(
+ ctx,
+ getattr(ctx.attr, "env", {}),
+ data,
+ )
+ providers.append(testing.TestEnvironment(env))
+
+ return providers
+
+def _rust_test_impl(ctx):
+ """The implementation of the `rust_test` rule
+
+ Args:
+ ctx (ctx): The rule's context object
+
+ Returns:
+ list: A list of providers. See `_rust_test_common`
+ """
+ toolchain = find_toolchain(ctx)
+
+ output = ctx.actions.declare_file(
+ ctx.label.name + toolchain.binary_ext,
+ )
+
+ return _rust_test_common(ctx, toolchain, output)
+
+_common_attrs = {
+ "aliases": attr.label_keyed_string_dict(
+ doc = dedent("""\
+ Remap crates to a new name or moniker for linkage to this target
+
+ These are other `rust_library` targets and will be presented as the new name given.
+ """),
+ ),
+ "compile_data": attr.label_list(
+ doc = dedent("""\
+ List of files used by this rule at compile time.
+
+ This attribute can be used to specify any data files that are embedded into
+ the library, such as via the
+ [`include_str!`](https://doc.rust-lang.org/std/macro.include_str!.html)
+ macro.
+ """),
+ allow_files = True,
+ ),
+ "crate_features": attr.string_list(
+ doc = dedent("""\
+ List of features to enable for this crate.
+
+ Features are defined in the code using the `#[cfg(feature = "foo")]`
+ configuration option. The features listed here will be passed to `rustc`
+ with `--cfg feature="${feature_name}"` flags.
+ """),
+ ),
+ "crate_name": attr.string(
+ doc = dedent("""\
+ Crate name to use for this target.
+
+ This must be a valid Rust identifier, i.e. it may contain only alphanumeric characters and underscores.
+ Defaults to the target name, with any hyphens replaced by underscores.
+ """),
+ ),
+ "crate_root": attr.label(
+ doc = dedent("""\
+ The file that will be passed to `rustc` to be used for building this crate.
+
+ If `crate_root` is not set, then this rule will look for a `lib.rs` file (or `main.rs` for rust_binary)
+ or the single file in `srcs` if `srcs` contains only one file.
+ """),
+ allow_single_file = [".rs"],
+ ),
+ "data": attr.label_list(
+ doc = dedent("""\
+ List of files used by this rule at compile time and runtime.
+
+ If including data at compile time with include_str!() and similar,
+ prefer `compile_data` over `data`, to prevent the data also being included
+ in the runfiles.
+ """),
+ allow_files = True,
+ ),
+ "deps": attr.label_list(
+ doc = dedent("""\
+ List of other libraries to be linked to this library target.
+
+ These can be either other `rust_library` targets or `cc_library` targets if
+ linking a native library.
+ """),
+ ),
+ "edition": attr.string(
+ doc = "The rust edition to use for this crate. Defaults to the edition specified in the rust_toolchain.",
+ ),
+ # Previously `proc_macro_deps` were a part of `deps`, and then proc_macro_host_transition was
+ # used into cfg="host" using `@local_config_platform//:host`.
+ # This fails for remote execution, which needs cfg="exec", and there isn't anything like
+ # `@local_config_platform//:exec` exposed.
+ "proc_macro_deps": attr.label_list(
+ doc = dedent("""\
+ List of `rust_library` targets with kind `proc-macro` used to help build this library target.
+ """),
+ cfg = "exec",
+ providers = [rust_common.crate_info],
+ ),
+ "rustc_env": attr.string_dict(
+ doc = dedent("""\
+ Dictionary of additional `"key": "value"` environment variables to set for rustc.
+
+ rust_test()/rust_binary() rules can use $(rootpath //package:target) to pass in the
+ location of a generated file or external tool. Cargo build scripts that wish to
+ expand locations should use cargo_build_script()'s build_script_env argument instead,
+ as build scripts are run in a different environment - see cargo_build_script()'s
+ documentation for more.
+ """),
+ ),
+ "rustc_env_files": attr.label_list(
+ doc = dedent("""\
+ Files containing additional environment variables to set for rustc.
+
+ These files should contain a single variable per line, of format
+ `NAME=value`, and newlines may be included in a value by ending a
+ line with a trailing back-slash (`\\\\`).
+
+ The order that these files will be processed is unspecified, so
+ multiple definitions of a particular variable are discouraged.
+
+ Note that the variables here are subject to
+ [workspace status](https://docs.bazel.build/versions/main/user-manual.html#workspace_status)
+ stamping should the `stamp` attribute be enabled. Stamp variables
+ should be wrapped in brackets in order to be resolved. E.g.
+ `NAME={WORKSPACE_STATUS_VARIABLE}`.
+ """),
+ allow_files = True,
+ ),
+ "rustc_flags": attr.string_list(
+ doc = dedent("""\
+ List of compiler flags passed to `rustc`.
+
+ These strings are subject to Make variable expansion for predefined
+ source/output path variables like `$location`, `$execpath`, and
+ `$rootpath`. This expansion is useful if you wish to pass a generated
+ file of arguments to rustc: `@$(location //package:target)`.
+ """),
+ ),
+ # TODO(stardoc): How do we provide additional documentation to an inherited attribute?
+ # "name": attr.string(
+ # doc = "This name will also be used as the name of the crate built by this rule.",
+ # `),
+ "srcs": attr.label_list(
+ doc = dedent("""\
+ List of Rust `.rs` source files used to build the library.
+
+ If `srcs` contains more than one file, then there must be a file either
+ named `lib.rs`. Otherwise, `crate_root` must be set to the source file that
+ is the root of the crate to be passed to rustc to build this crate.
+ """),
+ allow_files = [".rs"],
+ ),
+ "stamp": attr.int(
+ doc = dedent("""\
+ Whether to encode build information into the `Rustc` action. Possible values:
+
+ - `stamp = 1`: Always stamp the build information into the `Rustc` action, even in \
+ [--nostamp](https://docs.bazel.build/versions/main/user-manual.html#flag--stamp) builds. \
+ This setting should be avoided, since it potentially kills remote caching for the target and \
+ any downstream actions that depend on it.
+
+ - `stamp = 0`: Always replace build information by constant values. This gives good build result caching.
+
+ - `stamp = -1`: Embedding of build information is controlled by the \
+ [--[no]stamp](https://docs.bazel.build/versions/main/user-manual.html#flag--stamp) flag.
+
+ Stamped targets are not rebuilt unless their dependencies change.
+
+ For example if a `rust_library` is stamped, and a `rust_binary` depends on that library, the stamped
+ library won't be rebuilt when we change sources of the `rust_binary`. This is different from how
+ [`cc_library.linkstamps`](https://docs.bazel.build/versions/main/be/c-cpp.html#cc_library.linkstamp)
+ behaves.
+ """),
+ default = -1,
+ values = [1, 0, -1],
+ ),
+ "version": attr.string(
+ doc = "A version to inject in the cargo environment variable.",
+ default = "0.0.0",
+ ),
+ "_cc_toolchain": attr.label(
+ default = "@bazel_tools//tools/cpp:current_cc_toolchain",
+ ),
+ "_error_format": attr.label(default = "//:error_format"),
+ "_extra_exec_rustc_flags": attr.label(default = "//:extra_exec_rustc_flags"),
+ "_extra_rustc_flags": attr.label(default = "//:extra_rustc_flags"),
+ "_import_macro_dep": attr.label(
+ default = "@rules_rust//util/import",
+ ),
+ "_process_wrapper": attr.label(
+ default = Label("//util/process_wrapper"),
+ executable = True,
+ allow_single_file = True,
+ cfg = "exec",
+ ),
+ "_stamp_flag": attr.label(
+ doc = "A setting used to determine whether or not the `--stamp` flag is enabled",
+ default = Label("//rust/private:stamp"),
+ ),
+}
+
+_rust_test_attrs = {
+ "crate": attr.label(
+ mandatory = False,
+ doc = dedent("""\
+ Target inline tests declared in the given crate
+
+ These tests are typically those that would be held out under
+ `#[cfg(test)]` declarations.
+ """),
+ ),
+ "env": attr.string_dict(
+ mandatory = False,
+ doc = dedent("""\
+ Specifies additional environment variables to set when the test is executed by bazel test.
+ Values are subject to `$(rootpath)`, `$(execpath)`, location, and
+ ["Make variable"](https://docs.bazel.build/versions/master/be/make-variables.html) substitution.
+
+ Execpath returns absolute path, and in order to be able to construct the absolute path we
+ need to wrap the test binary in a launcher. Using a launcher comes with complications, such as
+ more complicated debugger attachment.
+ """),
+ ),
+ "use_libtest_harness": attr.bool(
+ mandatory = False,
+ default = True,
+ doc = dedent("""\
+ Whether to use `libtest`. For targets using this flag, individual tests can be run by using the
+ [--test_arg](https://docs.bazel.build/versions/4.0.0/command-line-reference.html#flag--test_arg) flag.
+ E.g. `bazel test //src:rust_test --test_arg=foo::test::test_fn`.
+ """),
+ ),
+ "_grep_includes": attr.label(
+ allow_single_file = True,
+ cfg = "exec",
+ default = Label("@bazel_tools//tools/cpp:grep-includes"),
+ executable = True,
+ ),
+}
+
+_common_providers = [
+ rust_common.crate_info,
+ rust_common.dep_info,
+ DefaultInfo,
+]
+
+rust_library = rule(
+ implementation = _rust_library_impl,
+ provides = _common_providers,
+ attrs = dict(_common_attrs.items()),
+ fragments = ["cpp"],
+ host_fragments = ["cpp"],
+ toolchains = [
+ str(Label("//rust:toolchain")),
+ "@bazel_tools//tools/cpp:toolchain_type",
+ ],
+ incompatible_use_toolchain_transition = True,
+ doc = dedent("""\
+ Builds a Rust library crate.
+
+ Example:
+
+ Suppose you have the following directory structure for a simple Rust library crate:
+
+ ```output
+ [workspace]/
+ WORKSPACE
+ hello_lib/
+ BUILD
+ src/
+ greeter.rs
+ lib.rs
+ ```
+
+ `hello_lib/src/greeter.rs`:
+ ```rust
+ pub struct Greeter {
+ greeting: String,
+ }
+
+ impl Greeter {
+ pub fn new(greeting: &str) -> Greeter {
+ Greeter { greeting: greeting.to_string(), }
+ }
+
+ pub fn greet(&self, thing: &str) {
+ println!("{} {}", &self.greeting, thing);
+ }
+ }
+ ```
+
+ `hello_lib/src/lib.rs`:
+
+ ```rust
+ pub mod greeter;
+ ```
+
+ `hello_lib/BUILD`:
+ ```python
+ package(default_visibility = ["//visibility:public"])
+
+ load("@rules_rust//rust:defs.bzl", "rust_library")
+
+ rust_library(
+ name = "hello_lib",
+ srcs = [
+ "src/greeter.rs",
+ "src/lib.rs",
+ ],
+ )
+ ```
+
+ Build the library:
+ ```output
+ $ bazel build //hello_lib
+ INFO: Found 1 target...
+ Target //examples/rust/hello_lib:hello_lib up-to-date:
+ bazel-bin/examples/rust/hello_lib/libhello_lib.rlib
+ INFO: Elapsed time: 1.245s, Critical Path: 1.01s
+ ```
+ """),
+)
+
+rust_static_library = rule(
+ implementation = _rust_static_library_impl,
+ provides = _common_providers,
+ attrs = dict(_common_attrs.items()),
+ fragments = ["cpp"],
+ host_fragments = ["cpp"],
+ toolchains = [
+ str(Label("//rust:toolchain")),
+ "@bazel_tools//tools/cpp:toolchain_type",
+ ],
+ incompatible_use_toolchain_transition = True,
+ doc = dedent("""\
+ Builds a Rust static library.
+
+ This static library will contain all transitively reachable crates and native objects.
+ It is meant to be used when producing an artifact that is then consumed by some other build system
+ (for example to produce an archive that Python program links against).
+
+ This rule provides CcInfo, so it can be used everywhere Bazel expects `rules_cc`.
+
+ When building the whole binary in Bazel, use `rust_library` instead.
+ """),
+)
+
+rust_shared_library = rule(
+ implementation = _rust_shared_library_impl,
+ provides = _common_providers,
+ attrs = dict(_common_attrs.items()),
+ fragments = ["cpp"],
+ host_fragments = ["cpp"],
+ toolchains = [
+ str(Label("//rust:toolchain")),
+ "@bazel_tools//tools/cpp:toolchain_type",
+ ],
+ incompatible_use_toolchain_transition = True,
+ doc = dedent("""\
+ Builds a Rust shared library.
+
+ This shared library will contain all transitively reachable crates and native objects.
+ It is meant to be used when producing an artifact that is then consumed by some other build system
+ (for example to produce a shared library that Python program links against).
+
+ This rule provides CcInfo, so it can be used everywhere Bazel expects `rules_cc`.
+
+ When building the whole binary in Bazel, use `rust_library` instead.
+ """),
+)
+
+rust_proc_macro = rule(
+ implementation = _rust_proc_macro_impl,
+ provides = _common_providers,
+ attrs = dict(_common_attrs.items()),
+ fragments = ["cpp"],
+ host_fragments = ["cpp"],
+ toolchains = [
+ str(Label("//rust:toolchain")),
+ "@bazel_tools//tools/cpp:toolchain_type",
+ ],
+ incompatible_use_toolchain_transition = True,
+ doc = dedent("""\
+ Builds a Rust proc-macro crate.
+ """),
+)
+
+_rust_binary_attrs = {
+ "crate_type": attr.string(
+ doc = dedent("""\
+ Crate type that will be passed to `rustc` to be used for building this crate.
+
+ This option is a temporary workaround and should be used only when building
+ for WebAssembly targets (//rust/platform:wasi and //rust/platform:wasm).
+ """),
+ default = "bin",
+ ),
+ "linker_script": attr.label(
+ doc = dedent("""\
+ Link script to forward into linker via rustc options.
+ """),
+ cfg = "exec",
+ allow_single_file = True,
+ ),
+ "out_binary": attr.bool(
+ doc = (
+ "Force a target, regardless of it's `crate_type`, to always mark the " +
+ "file as executable. This attribute is only used to support wasm targets but is " +
+ "expected to be removed following a resolution to https://github.com/bazelbuild/rules_rust/issues/771."
+ ),
+ default = False,
+ ),
+ "_grep_includes": attr.label(
+ allow_single_file = True,
+ cfg = "exec",
+ default = Label("@bazel_tools//tools/cpp:grep-includes"),
+ executable = True,
+ ),
+}
+
+rust_binary = rule(
+ implementation = _rust_binary_impl,
+ provides = _common_providers,
+ attrs = dict(_common_attrs.items() + _rust_binary_attrs.items()),
+ executable = True,
+ fragments = ["cpp"],
+ host_fragments = ["cpp"],
+ toolchains = [
+ str(Label("//rust:toolchain")),
+ "@bazel_tools//tools/cpp:toolchain_type",
+ ],
+ incompatible_use_toolchain_transition = True,
+ doc = dedent("""\
+ Builds a Rust binary crate.
+
+ Example:
+
+ Suppose you have the following directory structure for a Rust project with a
+ library crate, `hello_lib`, and a binary crate, `hello_world` that uses the
+ `hello_lib` library:
+
+ ```output
+ [workspace]/
+ WORKSPACE
+ hello_lib/
+ BUILD
+ src/
+ lib.rs
+ hello_world/
+ BUILD
+ src/
+ main.rs
+ ```
+
+ `hello_lib/src/lib.rs`:
+ ```rust
+ pub struct Greeter {
+ greeting: String,
+ }
+
+ impl Greeter {
+ pub fn new(greeting: &str) -> Greeter {
+ Greeter { greeting: greeting.to_string(), }
+ }
+
+ pub fn greet(&self, thing: &str) {
+ println!("{} {}", &self.greeting, thing);
+ }
+ }
+ ```
+
+ `hello_lib/BUILD`:
+ ```python
+ package(default_visibility = ["//visibility:public"])
+
+ load("@rules_rust//rust:defs.bzl", "rust_library")
+
+ rust_library(
+ name = "hello_lib",
+ srcs = ["src/lib.rs"],
+ )
+ ```
+
+ `hello_world/src/main.rs`:
+ ```rust
+ extern crate hello_lib;
+
+ fn main() {
+ let hello = hello_lib::Greeter::new("Hello");
+ hello.greet("world");
+ }
+ ```
+
+ `hello_world/BUILD`:
+ ```python
+ load("@rules_rust//rust:defs.bzl", "rust_binary")
+
+ rust_binary(
+ name = "hello_world",
+ srcs = ["src/main.rs"],
+ deps = ["//hello_lib"],
+ )
+ ```
+
+ Build and run `hello_world`:
+ ```
+ $ bazel run //hello_world
+ INFO: Found 1 target...
+ Target //examples/rust/hello_world:hello_world up-to-date:
+ bazel-bin/examples/rust/hello_world/hello_world
+ INFO: Elapsed time: 1.308s, Critical Path: 1.22s
+
+ INFO: Running command line: bazel-bin/examples/rust/hello_world/hello_world
+ Hello world
+ ```
+
+ On Windows, a PDB file containing debugging information is available under
+ the key `pdb_file` in `OutputGroupInfo`. Similarly on macOS, a dSYM folder
+ is available under the key `dsym_folder` in `OutputGroupInfo`.
+"""),
+)
+
+rust_test = rule(
+ implementation = _rust_test_impl,
+ provides = _common_providers,
+ attrs = dict(_common_attrs.items() +
+ _rust_test_attrs.items()),
+ executable = True,
+ fragments = ["cpp"],
+ host_fragments = ["cpp"],
+ test = True,
+ toolchains = [
+ str(Label("//rust:toolchain")),
+ "@bazel_tools//tools/cpp:toolchain_type",
+ ],
+ incompatible_use_toolchain_transition = True,
+ doc = dedent("""\
+ Builds a Rust test crate.
+
+ Examples:
+
+ Suppose you have the following directory structure for a Rust library crate \
+ with unit test code in the library sources:
+
+ ```output
+ [workspace]/
+ WORKSPACE
+ hello_lib/
+ BUILD
+ src/
+ lib.rs
+ ```
+
+ `hello_lib/src/lib.rs`:
+ ```rust
+ pub struct Greeter {
+ greeting: String,
+ }
+
+ impl Greeter {
+ pub fn new(greeting: &str) -> Greeter {
+ Greeter { greeting: greeting.to_string(), }
+ }
+
+ pub fn greet(&self, thing: &str) -> String {
+ format!("{} {}", &self.greeting, thing)
+ }
+ }
+
+ #[cfg(test)]
+ mod test {
+ use super::Greeter;
+
+ #[test]
+ fn test_greeting() {
+ let hello = Greeter::new("Hi");
+ assert_eq!("Hi Rust", hello.greet("Rust"));
+ }
+ }
+ ```
+
+ To build and run the tests, simply add a `rust_test` rule with no `srcs` and \
+ only depends on the `hello_lib` `rust_library` target:
+
+ `hello_lib/BUILD`:
+ ```python
+ load("@rules_rust//rust:defs.bzl", "rust_library", "rust_test")
+
+ rust_library(
+ name = "hello_lib",
+ srcs = ["src/lib.rs"],
+ )
+
+ rust_test(
+ name = "hello_lib_test",
+ deps = [":hello_lib"],
+ )
+ ```
+
+ Run the test with `bazel build //hello_lib:hello_lib_test`.
+
+ To run a crate or lib with the `#[cfg(test)]` configuration, handling inline \
+ tests, you should specify the crate directly like so.
+
+ ```python
+ rust_test(
+ name = "hello_lib_test",
+ crate = ":hello_lib",
+ # You may add other deps that are specific to the test configuration
+ deps = ["//some/dev/dep"],
+ )
+ ```
+
+ ### Example: `test` directory
+
+ Integration tests that live in the [`tests` directory][int-tests], they are \
+ essentially built as separate crates. Suppose you have the following directory \
+ structure where `greeting.rs` is an integration test for the `hello_lib` \
+ library crate:
+
+ [int-tests]: http://doc.rust-lang.org/book/testing.html#the-tests-directory
+
+ ```output
+ [workspace]/
+ WORKSPACE
+ hello_lib/
+ BUILD
+ src/
+ lib.rs
+ tests/
+ greeting.rs
+ ```
+
+ `hello_lib/tests/greeting.rs`:
+ ```rust
+ extern crate hello_lib;
+
+ use hello_lib;
+
+ #[test]
+ fn test_greeting() {
+ let hello = greeter::Greeter::new("Hello");
+ assert_eq!("Hello world", hello.greeting("world"));
+ }
+ ```
+
+ To build the `greeting.rs` integration test, simply add a `rust_test` target
+ with `greeting.rs` in `srcs` and a dependency on the `hello_lib` target:
+
+ `hello_lib/BUILD`:
+ ```python
+ load("@rules_rust//rust:defs.bzl", "rust_library", "rust_test")
+
+ rust_library(
+ name = "hello_lib",
+ srcs = ["src/lib.rs"],
+ )
+
+ rust_test(
+ name = "greeting_test",
+ srcs = ["tests/greeting.rs"],
+ deps = [":hello_lib"],
+ )
+ ```
+
+ Run the test with `bazel build //hello_lib:hello_lib_test`.
+"""),
+)
+
+def rust_test_suite(name, srcs, **kwargs):
+ """A rule for creating a test suite for a set of `rust_test` targets.
+
+ This rule can be used for setting up typical rust [integration tests][it]. Given the following
+ directory structure:
+
+ ```text
+ [crate]/
+ BUILD.bazel
+ src/
+ lib.rs
+ main.rs
+ tests/
+ integrated_test_a.rs
+ integrated_test_b.rs
+ integrated_test_c.rs
+ patterns/
+ fibonacci_test.rs
+ ```
+
+ The rule can be used to generate [rust_test](#rust_test) targets for each source file under `tests`
+ and a [test_suite][ts] which encapsulates all tests.
+
+ ```python
+ load("//rust:defs.bzl", "rust_binary", "rust_library", "rust_test_suite")
+
+ rust_library(
+ name = "math_lib",
+ srcs = ["src/lib.rs"],
+ )
+
+ rust_binary(
+ name = "math_bin",
+ srcs = ["src/main.rs"],
+ )
+
+ rust_test_suite(
+ name = "integrated_tests_suite",
+ srcs = glob(["tests/**"]),
+ deps = [":math_lib"],
+ )
+ ```
+
+ [it]: https://doc.rust-lang.org/rust-by-example/testing/integration_testing.html
+ [ts]: https://docs.bazel.build/versions/master/be/general.html#test_suite
+
+ Args:
+ name (str): The name of the `test_suite`.
+ srcs (list): All test sources, typically `glob(["tests/**/*.rs"])`.
+ **kwargs (dict): Additional keyword arguments for the underyling [rust_test](#rust_test) targets. The
+ `tags` argument is also passed to the generated `test_suite` target.
+ """
+ tests = []
+
+ for src in srcs:
+ if not src.endswith(".rs"):
+ fail("srcs should have `.rs` extensions")
+
+ # Prefixed with `name` to allow parameterization with macros
+ # The test name should not end with `.rs`
+ test_name = name + "_" + src[:-3]
+ rust_test(
+ name = test_name,
+ crate_name = test_name.replace("/", "_"),
+ srcs = [src],
+ **kwargs
+ )
+ tests.append(test_name)
+
+ native.test_suite(
+ name = name,
+ tests = tests,
+ tags = kwargs.get("tags", None),
+ )
diff --git a/rust/private/rust_analyzer.bzl b/rust/private/rust_analyzer.bzl
new file mode 100644
index 0000000..e28ca30
--- /dev/null
+++ b/rust/private/rust_analyzer.bzl
@@ -0,0 +1,240 @@
+# Copyright 2020 Google
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""
+Rust Analyzer Bazel rules.
+
+rust_analyzer will generate a rust-project.json file for the
+given targets. This file can be consumed by rust-analyzer as an alternative
+to Cargo.toml files.
+"""
+
+load("//rust/platform:triple_mappings.bzl", "system_to_dylib_ext", "triple_to_system")
+load("//rust/private:common.bzl", "rust_common")
+load("//rust/private:rustc.bzl", "BuildInfo")
+load("//rust/private:utils.bzl", "dedent", "find_toolchain")
+
+RustAnalyzerInfo = provider(
+ doc = "RustAnalyzerInfo holds rust crate metadata for targets",
+ fields = {
+ "build_info": "BuildInfo: build info for this crate if present",
+ "cfgs": "List[String]: features or other compilation --cfg settings",
+ "crate": "rust_common.crate_info",
+ "crate_specs": "Depset[File]: transitive closure of OutputGroupInfo files",
+ "deps": "List[RustAnalyzerInfo]: direct dependencies",
+ "env": "Dict{String: String}: Environment variables, used for the `env!` macro",
+ "proc_macro_dylib_path": "File: compiled shared library output of proc-macro rule",
+ },
+)
+
+def _rust_analyzer_aspect_impl(target, ctx):
+ if rust_common.crate_info not in target:
+ return []
+
+ toolchain = find_toolchain(ctx)
+
+ # Always add `test` & `debug_assertions`. See rust-analyzer source code:
+ # https://github.com/rust-analyzer/rust-analyzer/blob/2021-11-15/crates/project_model/src/workspace.rs#L529-L531
+ cfgs = ["test", "debug_assertions"]
+ if hasattr(ctx.rule.attr, "crate_features"):
+ cfgs += ['feature="{}"'.format(f) for f in ctx.rule.attr.crate_features]
+ if hasattr(ctx.rule.attr, "rustc_flags"):
+ cfgs += [f[6:] for f in ctx.rule.attr.rustc_flags if f.startswith("--cfg ") or f.startswith("--cfg=")]
+
+ # Save BuildInfo if we find any (for build script output)
+ build_info = None
+ for dep in ctx.rule.attr.deps:
+ if BuildInfo in dep:
+ build_info = dep[BuildInfo]
+
+ dep_infos = [dep[RustAnalyzerInfo] for dep in ctx.rule.attr.deps if RustAnalyzerInfo in dep]
+ if hasattr(ctx.rule.attr, "proc_macro_deps"):
+ dep_infos += [dep[RustAnalyzerInfo] for dep in ctx.rule.attr.proc_macro_deps if RustAnalyzerInfo in dep]
+ if hasattr(ctx.rule.attr, "crate") and ctx.rule.attr.crate != None:
+ dep_infos.append(ctx.rule.attr.crate[RustAnalyzerInfo])
+
+ crate_spec = ctx.actions.declare_file(ctx.label.name + ".rust_analyzer_crate_spec")
+
+ crate_info = target[rust_common.crate_info]
+
+ rust_analyzer_info = RustAnalyzerInfo(
+ crate = crate_info,
+ cfgs = cfgs,
+ env = getattr(ctx.rule.attr, "rustc_env", {}),
+ deps = dep_infos,
+ crate_specs = depset(direct = [crate_spec], transitive = [dep.crate_specs for dep in dep_infos]),
+ proc_macro_dylib_path = find_proc_macro_dylib_path(toolchain, target),
+ build_info = build_info,
+ )
+
+ ctx.actions.write(
+ output = crate_spec,
+ content = json.encode(_create_single_crate(ctx, rust_analyzer_info)),
+ )
+
+ return [
+ rust_analyzer_info,
+ OutputGroupInfo(rust_analyzer_crate_spec = rust_analyzer_info.crate_specs),
+ ]
+
+def find_proc_macro_dylib_path(toolchain, target):
+ """Find the proc_macro_dylib_path of target. Returns None if target crate is not type proc-macro.
+
+ Args:
+ toolchain: The current rust toolchain.
+ target: The current target.
+ Returns:
+ (path): The path to the proc macro dylib, or None if this crate is not a proc-macro.
+ """
+ if target[rust_common.crate_info].type != "proc-macro":
+ return None
+
+ dylib_ext = system_to_dylib_ext(triple_to_system(toolchain.target_triple))
+ for action in target.actions:
+ for output in action.outputs.to_list():
+ if output.extension == dylib_ext[1:]:
+ return output.path
+
+ # Failed to find the dylib path inside a proc-macro crate.
+ # TODO: Should this be an error?
+ return None
+
+rust_analyzer_aspect = aspect(
+ attr_aspects = ["deps", "proc_macro_deps", "crate"],
+ implementation = _rust_analyzer_aspect_impl,
+ toolchains = [str(Label("//rust:toolchain"))],
+ incompatible_use_toolchain_transition = True,
+ doc = "Annotates rust rules with RustAnalyzerInfo later used to build a rust-project.json",
+)
+
+_exec_root_tmpl = "__EXEC_ROOT__/"
+
+def _crate_id(crate_info):
+ """Returns a unique stable identifier for a crate
+
+ Returns:
+ (string): This crate's unique stable id.
+ """
+ return "ID-" + crate_info.root.path
+
+def _create_single_crate(ctx, info):
+ """Creates a crate in the rust-project.json format.
+
+ Args:
+ ctx (ctx): The rule context
+ info (RustAnalyzerInfo): RustAnalyzerInfo for the current crate
+
+ Returns:
+ (dict) The crate rust-project.json representation
+ """
+ crate_name = info.crate.name
+ crate = dict()
+ crate_id = _crate_id(info.crate)
+ crate["crate_id"] = crate_id
+ crate["display_name"] = crate_name
+ crate["edition"] = info.crate.edition
+ crate["env"] = {}
+ crate["crate_type"] = info.crate.type
+
+ # Switch on external/ to determine if crates are in the workspace or remote.
+ # TODO: Some folks may want to override this for vendored dependencies.
+ root_path = info.crate.root.path
+ root_dirname = info.crate.root.dirname
+ if root_path.startswith("external/"):
+ crate["is_workspace_member"] = False
+ crate["root_module"] = _exec_root_tmpl + root_path
+ crate_root = _exec_root_tmpl + root_dirname
+ else:
+ crate["is_workspace_member"] = True
+ crate["root_module"] = root_path
+ crate_root = root_dirname
+
+ if info.build_info != None:
+ out_dir_path = info.build_info.out_dir.path
+ crate["env"].update({"OUT_DIR": _exec_root_tmpl + out_dir_path})
+ crate["source"] = {
+ # We have to tell rust-analyzer about our out_dir since it's not under the crate root.
+ "exclude_dirs": [],
+ "include_dirs": [crate_root, _exec_root_tmpl + out_dir_path],
+ }
+
+ # TODO: The only imagined use case is an env var holding a filename in the workspace passed to a
+ # macro like include_bytes!. Other use cases might exist that require more complex logic.
+ expand_targets = getattr(ctx.rule.attr, "data", []) + getattr(ctx.rule.attr, "compile_data", [])
+ crate["env"].update({k: ctx.expand_location(v, expand_targets) for k, v in info.env.items()})
+
+ # Omit when a crate appears to depend on itself (e.g. foo_test crates).
+ # It can happen a single source file is present in multiple crates - there can
+ # be a `rust_library` with a `lib.rs` file, and a `rust_test` for the `test`
+ # module in that file. Tests can declare more dependencies than what library
+ # had. Therefore we had to collect all RustAnalyzerInfos for a given crate
+ # and take deps from all of them.
+
+ # There's one exception - if the dependency is the same crate name as the
+ # the crate being processed, we don't add it as a dependency to itself. This is
+ # common and expected - `rust_test.crate` pointing to the `rust_library`.
+ crate["deps"] = [_crate_id(dep.crate) for dep in info.deps if _crate_id(dep.crate) != crate_id]
+ crate["cfg"] = info.cfgs
+ crate["target"] = find_toolchain(ctx).target_triple
+ if info.proc_macro_dylib_path != None:
+ crate["proc_macro_dylib_path"] = _exec_root_tmpl + info.proc_macro_dylib_path
+ return crate
+
+def _rust_analyzer_detect_sysroot_impl(ctx):
+ rust_toolchain = find_toolchain(ctx)
+
+ if not rust_toolchain.rustc_srcs:
+ fail(
+ "Current Rust toolchain doesn't contain rustc sources in `rustc_srcs` attribute.",
+ "These are needed by rust analyzer.",
+ "If you are using the default Rust toolchain, add `rust_repositories(include_rustc_srcs = True, ...).` to your WORKSPACE file.",
+ )
+ sysroot_src = rust_toolchain.rustc_srcs.label.package + "/library"
+ if rust_toolchain.rustc_srcs.label.workspace_root:
+ sysroot_src = _exec_root_tmpl + rust_toolchain.rustc_srcs.label.workspace_root + "/" + sysroot_src
+
+ sysroot_src_file = ctx.actions.declare_file(ctx.label.name + ".rust_analyzer_sysroot_src")
+ ctx.actions.write(
+ output = sysroot_src_file,
+ content = sysroot_src,
+ )
+
+ return [DefaultInfo(files = depset([sysroot_src_file]))]
+
+rust_analyzer_detect_sysroot = rule(
+ implementation = _rust_analyzer_detect_sysroot_impl,
+ toolchains = ["@rules_rust//rust:toolchain"],
+ incompatible_use_toolchain_transition = True,
+ doc = dedent("""\
+ Detect the sysroot and store in a file for use by the gen_rust_project tool.
+ """),
+)
+
+def _rust_analyzer_impl(_ctx):
+ pass
+
+rust_analyzer = rule(
+ attrs = {
+ "targets": attr.label_list(
+ aspects = [rust_analyzer_aspect],
+ doc = "List of all targets to be included in the index",
+ ),
+ },
+ implementation = _rust_analyzer_impl,
+ toolchains = [str(Label("//rust:toolchain"))],
+ incompatible_use_toolchain_transition = True,
+ doc = dedent("""\
+ Deprecated: gen_rust_project can now create a rust-project.json without a rust_analyzer rule.
+ """),
+)
diff --git a/rust/private/rustc.bzl b/rust/private/rustc.bzl
new file mode 100644
index 0000000..596c10d
--- /dev/null
+++ b/rust/private/rustc.bzl
@@ -0,0 +1,1436 @@
+# Copyright 2018 The Bazel Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Functionality for constructing actions that invoke the Rust compiler"""
+
+load(
+ "@bazel_tools//tools/build_defs/cc:action_names.bzl",
+ "CPP_LINK_EXECUTABLE_ACTION_NAME",
+)
+load("//rust/private:common.bzl", "rust_common")
+load("//rust/private:providers.bzl", _BuildInfo = "BuildInfo")
+load("//rust/private:stamp.bzl", "is_stamping_enabled")
+load(
+ "//rust/private:utils.bzl",
+ "abs",
+ "expand_dict_value_locations",
+ "expand_list_element_locations",
+ "find_cc_toolchain",
+ "get_lib_name",
+ "get_preferred_artifact",
+ "is_exec_configuration",
+ "make_static_lib_symlink",
+ "relativize",
+)
+
+BuildInfo = _BuildInfo
+
+AliasableDepInfo = provider(
+ doc = "A provider mapping an alias name to a Crate's information.",
+ fields = {
+ "dep": "CrateInfo",
+ "name": "str",
+ },
+)
+
+_error_format_values = ["human", "json", "short"]
+
+ErrorFormatInfo = provider(
+ doc = "Set the --error-format flag for all rustc invocations",
+ fields = {"error_format": "(string) [" + ", ".join(_error_format_values) + "]"},
+)
+
+ExtraRustcFlagsInfo = provider(
+ doc = "Pass each value as an additional flag to non-exec rustc invocations",
+ fields = {"extra_rustc_flags": "List[string] Extra flags to pass to rustc in non-exec configuration"},
+)
+
+ExtraExecRustcFlagsInfo = provider(
+ doc = "Pass each value as an additional flag to exec rustc invocations",
+ fields = {"extra_exec_rustc_flags": "List[string] Extra flags to pass to rustc in exec configuration"},
+)
+
+def _get_rustc_env(attr, toolchain, crate_name):
+ """Gathers rustc environment variables
+
+ Args:
+ attr (struct): The current target's attributes
+ toolchain (rust_toolchain): The current target's rust toolchain context
+ crate_name (str): The name of the crate to be compiled
+
+ Returns:
+ dict: Rustc environment variables
+ """
+ version = attr.version if hasattr(attr, "version") else "0.0.0"
+ major, minor, patch = version.split(".", 2)
+ if "-" in patch:
+ patch, pre = patch.split("-", 1)
+ else:
+ pre = ""
+ return {
+ "CARGO_CFG_TARGET_ARCH": toolchain.target_arch,
+ "CARGO_CFG_TARGET_OS": toolchain.os,
+ "CARGO_CRATE_NAME": crate_name,
+ "CARGO_PKG_AUTHORS": "",
+ "CARGO_PKG_DESCRIPTION": "",
+ "CARGO_PKG_HOMEPAGE": "",
+ "CARGO_PKG_NAME": attr.name,
+ "CARGO_PKG_VERSION": version,
+ "CARGO_PKG_VERSION_MAJOR": major,
+ "CARGO_PKG_VERSION_MINOR": minor,
+ "CARGO_PKG_VERSION_PATCH": patch,
+ "CARGO_PKG_VERSION_PRE": pre,
+ }
+
+def get_compilation_mode_opts(ctx, toolchain):
+ """Gathers rustc flags for the current compilation mode (opt/debug)
+
+ Args:
+ ctx (ctx): The current rule's context object
+ toolchain (rust_toolchain): The current rule's `rust_toolchain`
+
+ Returns:
+ struct: See `_rust_toolchain_impl` for more details
+ """
+ comp_mode = ctx.var["COMPILATION_MODE"]
+ if not comp_mode in toolchain.compilation_mode_opts:
+ fail("Unrecognized compilation mode {} for toolchain.".format(comp_mode))
+
+ return toolchain.compilation_mode_opts[comp_mode]
+
+def _are_linkstamps_supported(feature_configuration, has_grep_includes):
+ # Are linkstamps supported by the C++ toolchain?
+ return (cc_common.is_enabled(feature_configuration = feature_configuration, feature_name = "linkstamps") and
+ # Is Bazel recent enough to support Starlark linkstamps?
+ hasattr(cc_common, "register_linkstamp_compile_action") and
+ # The current rule doesn't define _grep_includes attribute; this
+ # attribute is required for compiling linkstamps.
+ has_grep_includes)
+
+def _should_use_pic(cc_toolchain, feature_configuration, crate_type):
+ if crate_type in ("cdylib" or "dylib"):
+ return cc_toolchain.needs_pic_for_dynamic_libraries(feature_configuration = feature_configuration)
+ return False
+
+def collect_deps(
+ deps,
+ proc_macro_deps,
+ aliases,
+ are_linkstamps_supported = False):
+ """Walks through dependencies and collects the transitive dependencies.
+
+ Args:
+ deps (list): The deps from ctx.attr.deps.
+ proc_macro_deps (list): The proc_macro deps from ctx.attr.proc_macro_deps.
+ aliases (dict): A dict mapping aliased targets to their actual Crate information.
+ are_linkstamps_supported (bool): Whether the current rule and the toolchain support building linkstamps..
+
+ Returns:
+ tuple: Returns a tuple of:
+ DepInfo,
+ BuildInfo,
+ linkstamps (depset[CcLinkstamp]): A depset of CcLinkstamps that need to be compiled and linked into all linked binaries.
+
+ """
+ direct_crates = []
+ transitive_crates = []
+ transitive_noncrates = []
+ transitive_build_infos = []
+ transitive_link_search_paths = []
+ build_info = None
+ linkstamps = []
+ transitive_crate_outputs = []
+
+ aliases = {k.label: v for k, v in aliases.items()}
+ for dep in depset(transitive = [deps, proc_macro_deps]).to_list():
+ (crate_info, dep_info) = _get_crate_and_dep_info(dep)
+ cc_info = _get_cc_info(dep)
+ dep_build_info = _get_build_info(dep)
+
+ if cc_info and are_linkstamps_supported:
+ linkstamps.append(cc_info.linking_context.linkstamps())
+
+ if crate_info:
+ # This dependency is a rust_library
+
+ # When crate_info.owner is set, we use it. When the dep type is Target we get the
+ # label from dep.label
+ owner = getattr(crate_info, "owner", dep.label if type(dep) == "Target" else None)
+
+ direct_crates.append(AliasableDepInfo(
+ name = aliases.get(owner, crate_info.name),
+ dep = crate_info,
+ ))
+
+ transitive_crates.append(depset([crate_info], transitive = [dep_info.transitive_crates]))
+ transitive_crate_outputs.append(
+ depset(
+ [crate_info.output],
+ transitive = [dep_info.transitive_crate_outputs],
+ ),
+ )
+ transitive_noncrates.append(dep_info.transitive_noncrates)
+ transitive_build_infos.append(dep_info.transitive_build_infos)
+ transitive_link_search_paths.append(dep_info.link_search_path_files)
+
+ elif cc_info:
+ # This dependency is a cc_library
+ transitive_noncrates.append(cc_info.linking_context.linker_inputs)
+ elif dep_build_info:
+ if build_info:
+ fail("Several deps are providing build information, " +
+ "only one is allowed in the dependencies")
+ build_info = dep_build_info
+ transitive_build_infos.append(depset([build_info]))
+ transitive_link_search_paths.append(depset([build_info.link_search_paths]))
+ else:
+ fail("rust targets can only depend on rust_library, rust_*_library or cc_library " +
+ "targets.")
+
+ transitive_crates_depset = depset(transitive = transitive_crates)
+
+ return (
+ rust_common.dep_info(
+ direct_crates = depset(direct_crates),
+ transitive_crates = transitive_crates_depset,
+ transitive_noncrates = depset(
+ transitive = transitive_noncrates,
+ order = "topological", # dylib link flag ordering matters.
+ ),
+ transitive_crate_outputs = depset(transitive = transitive_crate_outputs),
+ transitive_build_infos = depset(transitive = transitive_build_infos),
+ link_search_path_files = depset(transitive = transitive_link_search_paths),
+ dep_env = build_info.dep_env if build_info else None,
+ ),
+ build_info,
+ depset(transitive = linkstamps),
+ )
+
+def _collect_libs_from_linker_inputs(linker_inputs, use_pic):
+ # TODO: We could let the user choose how to link, instead of always preferring to link static libraries.
+ return [
+ get_preferred_artifact(lib, use_pic)
+ for li in linker_inputs
+ for lib in li.libraries
+ ]
+
+def _get_crate_and_dep_info(dep):
+ if type(dep) == "Target" and rust_common.crate_info in dep:
+ return (dep[rust_common.crate_info], dep[rust_common.dep_info])
+ elif type(dep) == "struct" and hasattr(dep, "crate_info"):
+ return (dep.crate_info, dep.dep_info)
+ return (None, None)
+
+def _get_cc_info(dep):
+ if type(dep) == "Target" and CcInfo in dep:
+ return dep[CcInfo]
+ elif type(dep) == "struct" and hasattr(dep, "cc_info"):
+ return dep.cc_info
+ return None
+
+def _get_build_info(dep):
+ if type(dep) == "Target" and BuildInfo in dep:
+ return dep[BuildInfo]
+ elif type(dep) == "struct" and hasattr(dep, "build_info"):
+ return dep.build_info
+ return None
+
+def get_cc_user_link_flags(ctx):
+ """Get the current target's linkopt flags
+
+ Args:
+ ctx (ctx): The current rule's context object
+
+ Returns:
+ depset: The flags passed to Bazel by --linkopt option.
+ """
+ return ctx.fragments.cpp.linkopts
+
+def get_linker_and_args(ctx, attr, cc_toolchain, feature_configuration, rpaths):
+ """Gathers cc_common linker information
+
+ Args:
+ ctx (ctx): The current target's context object
+ attr (struct): Attributes to use in gathering linker args
+ cc_toolchain (CcToolchain): cc_toolchain for which we are creating build variables.
+ feature_configuration (FeatureConfiguration): Feature configuration to be queried.
+ rpaths (depset): Depset of directories where loader will look for libraries at runtime.
+
+
+ Returns:
+ tuple: A tuple of the following items:
+ - (str): The tool path for given action.
+ - (sequence): A flattened command line flags for given action.
+ - (dict): Environment variables to be set for given action.
+ """
+ user_link_flags = get_cc_user_link_flags(ctx)
+
+ # Add linkopt's from dependencies. This includes linkopts from transitive
+ # dependencies since they get merged up.
+ for dep in getattr(attr, "deps", []):
+ if CcInfo in dep and dep[CcInfo].linking_context:
+ for linker_input in dep[CcInfo].linking_context.linker_inputs.to_list():
+ for flag in linker_input.user_link_flags:
+ user_link_flags.append(flag)
+ link_variables = cc_common.create_link_variables(
+ feature_configuration = feature_configuration,
+ cc_toolchain = cc_toolchain,
+ is_linking_dynamic_library = False,
+ runtime_library_search_directories = rpaths,
+ user_link_flags = user_link_flags,
+ )
+ link_args = cc_common.get_memory_inefficient_command_line(
+ feature_configuration = feature_configuration,
+ action_name = CPP_LINK_EXECUTABLE_ACTION_NAME,
+ variables = link_variables,
+ )
+ link_env = cc_common.get_environment_variables(
+ feature_configuration = feature_configuration,
+ action_name = CPP_LINK_EXECUTABLE_ACTION_NAME,
+ variables = link_variables,
+ )
+ ld = cc_common.get_tool_for_action(
+ feature_configuration = feature_configuration,
+ action_name = CPP_LINK_EXECUTABLE_ACTION_NAME,
+ )
+
+ return ld, link_args, link_env
+
+def _process_build_scripts(
+ build_info,
+ dep_info,
+ compile_inputs):
+ """Gathers the outputs from a target's `cargo_build_script` action.
+
+ Args:
+ build_info (BuildInfo): The target Build's dependency info.
+ dep_info (DepInfo): The Depinfo provider form the target Crate's set of inputs.
+ compile_inputs (depset): A set of all files that will participate in the build.
+
+ Returns:
+ tuple: A tuple: A tuple of the following items:
+ - (depset[File]): A list of all build info `OUT_DIR` File objects
+ - (str): The `OUT_DIR` of the current build info
+ - (File): An optional path to a generated environment file from a `cargo_build_script` target
+ - (depset[File]): All direct and transitive build flags from the current build info.
+ """
+ extra_inputs, out_dir, build_env_file, build_flags_files = _create_extra_input_args(build_info, dep_info)
+ compile_inputs = depset(transitive = [extra_inputs, compile_inputs])
+ return compile_inputs, out_dir, build_env_file, build_flags_files
+
+def _symlink_for_ambiguous_lib(actions, toolchain, crate_info, lib):
+ """Constructs a disambiguating symlink for a library dependency.
+
+ Args:
+ actions (Actions): The rule's context actions object.
+ toolchain: The Rust toolchain object.
+ crate_info (CrateInfo): The target crate's info.
+ lib (File): The library to symlink to.
+
+ Returns:
+ (File): The disambiguating symlink for the library.
+ """
+ # FIXME: Once the relative order part of the native-link-modifiers rustc
+ # feature is stable, we should be able to eliminate the need to construct
+ # symlinks by passing the full paths to the libraries.
+ # https://github.com/rust-lang/rust/issues/81490.
+
+ # Take the absolute value of hash() since it could be negative.
+ path_hash = abs(hash(lib.path))
+ lib_name = get_lib_name(lib)
+
+ prefix = "lib"
+ extension = ".a"
+ if toolchain.os.startswith("windows"):
+ prefix = ""
+ extension = ".lib"
+
+ # Ensure the symlink follows the lib<name>.a pattern on Unix-like platforms
+ # or <name>.lib on Windows.
+ # Add a hash of the original library path to disambiguate libraries with the same basename.
+ symlink_name = "{}{}-{}{}".format(prefix, lib_name, path_hash, extension)
+
+ # Add the symlink to a target crate-specific _ambiguous_libs/ subfolder,
+ # to avoid possible collisions with sibling crates that may depend on the
+ # same ambiguous libraries.
+ symlink = actions.declare_file("_ambiguous_libs/" + crate_info.output.basename + "/" + symlink_name)
+ actions.symlink(
+ output = symlink,
+ target_file = lib,
+ progress_message = "Creating symlink to ambiguous lib: {}".format(lib.path),
+ )
+ return symlink
+
+def _disambiguate_libs(actions, toolchain, crate_info, dep_info, use_pic):
+ """Constructs disambiguating symlinks for ambiguous library dependencies.
+
+ The symlinks are all created in a _ambiguous_libs/ subfolder specific to
+ the target crate to avoid possible collisions with sibling crates that may
+ depend on the same ambiguous libraries.
+
+ Args:
+ actions (Actions): The rule's context actions object.
+ toolchain: The Rust toolchain object.
+ crate_info (CrateInfo): The target crate's info.
+ dep_info: (DepInfo): The target crate's dependency info.
+ use_pic: (boolean): Whether the build should use PIC.
+
+ Returns:
+ dict[String, File]: A mapping from ambiguous library paths to their
+ disambiguating symlink.
+ """
+ # FIXME: Once the relative order part of the native-link-modifiers rustc
+ # feature is stable, we should be able to eliminate the need to construct
+ # symlinks by passing the full paths to the libraries.
+ # https://github.com/rust-lang/rust/issues/81490.
+
+ # A dictionary from file paths of ambiguous libraries to the corresponding
+ # symlink.
+ ambiguous_libs = {}
+
+ # A dictionary maintaining a mapping from preferred library name to the
+ # last visited artifact with that name.
+ visited_libs = {}
+ for link_input in dep_info.transitive_noncrates.to_list():
+ for lib in link_input.libraries:
+ # FIXME: Dynamic libs are not disambiguated right now, there are
+ # cases where those have a non-standard name with version (e.g.,
+ # //test/unit/versioned_libs). We hope that the link modifiers
+ # stabilization will come before we need to make this work.
+ if _is_dylib(lib):
+ continue
+ artifact = get_preferred_artifact(lib, use_pic)
+ name = get_lib_name(artifact)
+
+ # On Linux-like platforms, normally library base names start with
+ # `lib`, following the pattern `lib[name].(a|lo)` and we pass
+ # -lstatic=name.
+ # On Windows, the base name looks like `name.lib` and we pass
+ # -lstatic=name.
+ # FIXME: Under the native-link-modifiers unstable rustc feature,
+ # we could use -lstatic:+verbatim instead.
+ needs_symlink_to_standardize_name = (
+ (toolchain.os.startswith("linux") or toolchain.os.startswith("mac") or toolchain.os.startswith("darwin")) and
+ artifact.basename.endswith(".a") and not artifact.basename.startswith("lib")
+ ) or (
+ toolchain.os.startswith("windows") and not artifact.basename.endswith(".lib")
+ )
+
+ # Detect cases where we need to disambiguate library dependencies
+ # by constructing symlinks.
+ if (
+ needs_symlink_to_standardize_name or
+ # We have multiple libraries with the same name.
+ (name in visited_libs and visited_libs[name].path != artifact.path)
+ ):
+ # Disambiguate the previously visited library (if we just detected
+ # that it is ambiguous) and the current library.
+ if name in visited_libs:
+ old_path = visited_libs[name].path
+ if old_path not in ambiguous_libs:
+ ambiguous_libs[old_path] = _symlink_for_ambiguous_lib(actions, toolchain, crate_info, visited_libs[name])
+ ambiguous_libs[artifact.path] = _symlink_for_ambiguous_lib(actions, toolchain, crate_info, artifact)
+
+ visited_libs[name] = artifact
+ return ambiguous_libs
+
+def collect_inputs(
+ ctx,
+ file,
+ files,
+ linkstamps,
+ toolchain,
+ cc_toolchain,
+ feature_configuration,
+ crate_info,
+ dep_info,
+ build_info,
+ stamp = False):
+ """Gather's the inputs and required input information for a rustc action
+
+ Args:
+ ctx (ctx): The rule's context object.
+ file (struct): A struct containing files defined in label type attributes marked as `allow_single_file`.
+ files (list): A list of all inputs (`ctx.files`).
+ linkstamps (depset): A depset of CcLinkstamps that need to be compiled and linked into all linked binaries.
+ toolchain (rust_toolchain): The current `rust_toolchain`.
+ cc_toolchain (CcToolchainInfo): The current `cc_toolchain`.
+ feature_configuration (FeatureConfiguration): Feature configuration to be queried.
+ crate_info (CrateInfo): The Crate information of the crate to process build scripts for.
+ dep_info (DepInfo): The target Crate's dependency information.
+ build_info (BuildInfo): The target Crate's build settings.
+ stamp (bool, optional): Whether or not workspace status stamping is enabled. For more details see
+ https://docs.bazel.build/versions/main/user-manual.html#flag--stamp
+
+ Returns:
+ tuple: A tuple: A tuple of the following items:
+ - (list): A list of all build info `OUT_DIR` File objects
+ - (str): The `OUT_DIR` of the current build info
+ - (File): An optional path to a generated environment file from a `cargo_build_script` target
+ - (depset[File]): All direct and transitive build flag files from the current build info
+ - (list[File]): Linkstamp outputs
+ - (dict[String, File]): Ambiguous libs, see `_disambiguate_libs`.
+ """
+ linker_script = getattr(file, "linker_script") if hasattr(file, "linker_script") else None
+
+ linker_depset = cc_toolchain.all_files
+
+ use_pic = _should_use_pic(cc_toolchain, feature_configuration, crate_info.type)
+
+ # Pass linker inputs only for linking-like actions, not for example where
+ # the output is rlib. This avoids quadratic behavior where transitive noncrates are
+ # flattened on each transitive rust_library dependency.
+ additional_transitive_inputs = []
+ ambiguous_libs = {}
+ if crate_info.type in ("staticlib", "proc-macro"):
+ additional_transitive_inputs = _collect_libs_from_linker_inputs(
+ dep_info.transitive_noncrates.to_list(),
+ use_pic,
+ )
+ elif crate_info.type in ("bin", "dylib", "cdylib"):
+ linker_inputs = dep_info.transitive_noncrates.to_list()
+ ambiguous_libs = _disambiguate_libs(ctx.actions, toolchain, crate_info, dep_info, use_pic)
+ additional_transitive_inputs = _collect_libs_from_linker_inputs(linker_inputs, use_pic) + [
+ additional_input
+ for linker_input in linker_inputs
+ for additional_input in linker_input.additional_inputs
+ ] + ambiguous_libs.values()
+
+ # Compute linkstamps. Use the inputs of the binary as inputs to the
+ # linkstamp action to ensure linkstamps are rebuilt whenever binary inputs
+ # change.
+ linkstamp_outs = []
+
+ nolinkstamp_compile_inputs = depset(
+ getattr(files, "data", []) +
+ ([build_info.rustc_env, build_info.flags] if build_info else []) +
+ ([toolchain.target_json] if toolchain.target_json else []) +
+ ([] if linker_script == None else [linker_script]),
+ transitive = [
+ linker_depset,
+ crate_info.srcs,
+ dep_info.transitive_crate_outputs,
+ depset(additional_transitive_inputs),
+ crate_info.compile_data,
+ toolchain.all_files,
+ ],
+ )
+
+ if crate_info.type in ("bin", "cdylib"):
+ # There is no other way to register an action for each member of a depset than
+ # flattening the depset as of 2021-10-12. Luckily, usually there is only one linkstamp
+ # in a build, and we only flatten the list on binary targets that perform transitive linking,
+ # so it's extremely unlikely that this call to `to_list()` will ever be a performance
+ # problem.
+ for linkstamp in linkstamps.to_list():
+ # The linkstamp output path is based on the binary crate
+ # name and the input linkstamp path. This is to disambiguate
+ # the linkstamp outputs produced by multiple binary crates
+ # that depend on the same linkstamp. We use the same pattern
+ # for the output name as the one used by native cc rules.
+ out_name = "_objs/" + crate_info.output.basename + "/" + linkstamp.file().path[:-len(linkstamp.file().extension)] + "o"
+ linkstamp_out = ctx.actions.declare_file(out_name)
+ linkstamp_outs.append(linkstamp_out)
+ cc_common.register_linkstamp_compile_action(
+ actions = ctx.actions,
+ cc_toolchain = cc_toolchain,
+ feature_configuration = feature_configuration,
+ grep_includes = ctx.file._grep_includes,
+ source_file = linkstamp.file(),
+ output_file = linkstamp_out,
+ compilation_inputs = linkstamp.hdrs(),
+ inputs_for_validation = nolinkstamp_compile_inputs,
+ label_replacement = str(ctx.label),
+ output_replacement = crate_info.output.path,
+ )
+
+ # If stamping is enabled include the volatile status info file
+ stamp_info = [ctx.version_file] if stamp else []
+
+ compile_inputs = depset(
+ linkstamp_outs + stamp_info,
+ transitive = [
+ nolinkstamp_compile_inputs,
+ ],
+ )
+
+ build_env_files = getattr(files, "rustc_env_files", [])
+ compile_inputs, out_dir, build_env_file, build_flags_files = _process_build_scripts(build_info, dep_info, compile_inputs)
+ if build_env_file:
+ build_env_files = [f for f in build_env_files] + [build_env_file]
+ compile_inputs = depset(build_env_files, transitive = [compile_inputs])
+
+ return compile_inputs, out_dir, build_env_files, build_flags_files, linkstamp_outs, ambiguous_libs
+
+def construct_arguments(
+ ctx,
+ attr,
+ file,
+ toolchain,
+ tool_path,
+ cc_toolchain,
+ feature_configuration,
+ crate_info,
+ dep_info,
+ linkstamp_outs,
+ ambiguous_libs,
+ output_hash,
+ rust_flags,
+ out_dir,
+ build_env_files,
+ build_flags_files,
+ emit = ["dep-info", "link"],
+ force_all_deps_direct = False,
+ force_link = False,
+ stamp = False,
+ remap_path_prefix = "."):
+ """Builds an Args object containing common rustc flags
+
+ Args:
+ ctx (ctx): The rule's context object
+ attr (struct): The attributes for the target. These may be different from ctx.attr in an aspect context.
+ file (struct): A struct containing files defined in label type attributes marked as `allow_single_file`.
+ toolchain (rust_toolchain): The current target's `rust_toolchain`
+ tool_path (str): Path to rustc
+ cc_toolchain (CcToolchain): The CcToolchain for the current target.
+ feature_configuration (FeatureConfiguration): Class used to construct command lines from CROSSTOOL features.
+ crate_info (CrateInfo): The CrateInfo provider of the target crate
+ dep_info (DepInfo): The DepInfo provider of the target crate
+ linkstamp_outs (list): Linkstamp outputs of native dependencies
+ ambiguous_libs (dict): Ambiguous libs, see `_disambiguate_libs`
+ output_hash (str): The hashed path of the crate root
+ rust_flags (list): Additional flags to pass to rustc
+ out_dir (str): The path to the output directory for the target Crate.
+ build_env_files (list): Files containing rustc environment variables, for instance from `cargo_build_script` actions.
+ build_flags_files (depset): The output files of a `cargo_build_script` actions containing rustc build flags
+ emit (list): Values for the --emit flag to rustc.
+ force_all_deps_direct (bool, optional): Whether to pass the transitive rlibs with --extern
+ to the commandline as opposed to -L.
+ force_link (bool, optional): Whether to add link flags to the command regardless of `emit`.
+ stamp (bool, optional): Whether or not workspace status stamping is enabled. For more details see
+ https://docs.bazel.build/versions/main/user-manual.html#flag--stamp
+ remap_path_prefix (str, optional): A value used to remap `${pwd}` to. If set to a falsey value, no prefix will be set.
+
+ Returns:
+ tuple: A tuple of the following items
+ - (struct): A struct of arguments used to run the `Rustc` action
+ - process_wrapper_flags (Args): Arguments for the process wrapper
+ - rustc_path (Args): Arguments for invoking rustc via the process wrapper
+ - rustc_flags (Args): Rust flags for the Rust compiler
+ - all (list): A list of all `Args` objects in the order listed above.
+ This is to be passed to the `arguments` parameter of actions
+ - (dict): Common rustc environment variables
+ """
+ output_dir = getattr(crate_info.output, "dirname", None)
+ linker_script = getattr(file, "linker_script", None)
+
+ env = _get_rustc_env(attr, toolchain, crate_info.name)
+
+ # Wrapper args first
+ process_wrapper_flags = ctx.actions.args()
+
+ for build_env_file in build_env_files:
+ process_wrapper_flags.add("--env-file", build_env_file)
+
+ process_wrapper_flags.add_all(build_flags_files, before_each = "--arg-file")
+
+ # Certain rust build processes expect to find files from the environment
+ # variable `$CARGO_MANIFEST_DIR`. Examples of this include pest, tera,
+ # asakuma.
+ #
+ # The compiler and by extension proc-macros see the current working
+ # directory as the Bazel exec root. This is what `$CARGO_MANIFEST_DIR`
+ # would default to but is often the wrong value (e.g. if the source is in a
+ # sub-package or if we are building something in an external repository).
+ # Hence, we need to set `CARGO_MANIFEST_DIR` explicitly.
+ #
+ # Since we cannot get the `exec_root` from starlark, we cheat a little and
+ # use `${pwd}` which resolves the `exec_root` at action execution time.
+ process_wrapper_flags.add("--subst", "pwd=${pwd}")
+
+ # If stamping is enabled, enable the functionality in the process wrapper
+ if stamp:
+ process_wrapper_flags.add("--volatile-status-file", ctx.version_file)
+
+ # Both ctx.label.workspace_root and ctx.label.package are relative paths
+ # and either can be empty strings. Avoid trailing/double slashes in the path.
+ components = "${{pwd}}/{}/{}".format(ctx.label.workspace_root, ctx.label.package).split("/")
+ env["CARGO_MANIFEST_DIR"] = "/".join([c for c in components if c])
+
+ if out_dir != None:
+ env["OUT_DIR"] = "${pwd}/" + out_dir
+
+ # Handle that the binary name and crate name may be different.
+ #
+ # If a target name contains a - then cargo (and rules_rust) will generate a
+ # crate name with _ instead. Accordingly, rustc will generate a output
+ # file (executable, or rlib, or whatever) with _ not -. But when cargo
+ # puts a binary in the target/${config} directory, and sets environment
+ # variables like `CARGO_BIN_EXE_${binary_name}` it will use the - version
+ # not the _ version. So we rename the rustc-generated file (with _s) to
+ # have -s if needed.
+ emit_with_paths = emit
+ if crate_info.type == "bin" and crate_info.output != None:
+ generated_file = crate_info.name + toolchain.binary_ext
+ src = "/".join([crate_info.output.dirname, generated_file])
+ dst = crate_info.output.path
+ if src != dst:
+ emit_with_paths = [("link=" + dst if val == "link" else val) for val in emit]
+
+ # Arguments for launching rustc from the process wrapper
+ rustc_path = ctx.actions.args()
+ rustc_path.add("--")
+ rustc_path.add(tool_path)
+
+ # Rustc arguments
+ rustc_flags = ctx.actions.args()
+ rustc_flags.set_param_file_format("multiline")
+ rustc_flags.use_param_file("@%s", use_always = False)
+ rustc_flags.add(crate_info.root)
+ rustc_flags.add("--crate-name=" + crate_info.name)
+ rustc_flags.add("--crate-type=" + crate_info.type)
+ if hasattr(attr, "_error_format"):
+ rustc_flags.add("--error-format=" + attr._error_format[ErrorFormatInfo].error_format)
+
+ # Mangle symbols to disambiguate crates with the same name
+ extra_filename = "-" + output_hash if output_hash else ""
+ rustc_flags.add("--codegen=metadata=" + extra_filename)
+ if output_dir:
+ rustc_flags.add("--out-dir=" + output_dir)
+ rustc_flags.add("--codegen=extra-filename=" + extra_filename)
+
+ compilation_mode = get_compilation_mode_opts(ctx, toolchain)
+ rustc_flags.add("--codegen=opt-level=" + compilation_mode.opt_level)
+ rustc_flags.add("--codegen=debuginfo=" + compilation_mode.debug_info)
+
+ # For determinism to help with build distribution and such
+ if remap_path_prefix:
+ rustc_flags.add("--remap-path-prefix=${{pwd}}={}".format(remap_path_prefix))
+
+ if emit:
+ rustc_flags.add("--emit=" + ",".join(emit_with_paths))
+ rustc_flags.add("--color=always")
+ rustc_flags.add("--target=" + toolchain.target_flag_value)
+ if hasattr(attr, "crate_features"):
+ rustc_flags.add_all(getattr(attr, "crate_features"), before_each = "--cfg", format_each = 'feature="%s"')
+ if linker_script:
+ rustc_flags.add(linker_script.path, format = "--codegen=link-arg=-T%s")
+
+ # Gets the paths to the folders containing the standard library (or libcore)
+ rust_std_paths = toolchain.rust_std_paths.to_list()
+
+ # Tell Rustc where to find the standard library
+ rustc_flags.add_all(rust_std_paths, before_each = "-L", format_each = "%s")
+ rustc_flags.add_all(rust_flags)
+
+ # Deduplicate data paths due to https://github.com/bazelbuild/bazel/issues/14681
+ data_paths = depset(direct = getattr(attr, "data", []) + getattr(attr, "compile_data", [])).to_list()
+
+ rustc_flags.add_all(
+ expand_list_element_locations(
+ ctx,
+ getattr(attr, "rustc_flags", []),
+ data_paths,
+ ),
+ )
+ add_edition_flags(rustc_flags, crate_info)
+
+ # Link!
+ if ("link" in emit and crate_info.type not in ["rlib", "lib"]) or force_link:
+ # Rust's built-in linker can handle linking wasm files. We don't want to attempt to use the cc
+ # linker since it won't understand.
+ if toolchain.target_arch != "wasm32":
+ if output_dir:
+ use_pic = _should_use_pic(cc_toolchain, feature_configuration, crate_info.type)
+ rpaths = _compute_rpaths(toolchain, output_dir, dep_info, use_pic)
+ else:
+ rpaths = depset([])
+ ld, link_args, link_env = get_linker_and_args(ctx, attr, cc_toolchain, feature_configuration, rpaths)
+ env.update(link_env)
+ rustc_flags.add("--codegen=linker=" + ld)
+ rustc_flags.add_joined("--codegen", link_args, join_with = " ", format_joined = "link-args=%s")
+
+ _add_native_link_flags(rustc_flags, dep_info, linkstamp_outs, ambiguous_libs, crate_info.type, toolchain, cc_toolchain, feature_configuration)
+
+ # These always need to be added, even if not linking this crate.
+ add_crate_link_flags(rustc_flags, dep_info, force_all_deps_direct)
+
+ needs_extern_proc_macro_flag = "proc-macro" in [crate_info.type, crate_info.wrapped_crate_type] and \
+ crate_info.edition != "2015"
+ if needs_extern_proc_macro_flag:
+ rustc_flags.add("--extern")
+ rustc_flags.add("proc_macro")
+
+ # Make bin crate data deps available to tests.
+ for data in getattr(attr, "data", []):
+ if rust_common.crate_info in data:
+ dep_crate_info = data[rust_common.crate_info]
+ if dep_crate_info.type == "bin":
+ # Trying to make CARGO_BIN_EXE_{} canonical across platform by strip out extension if exists
+ env_basename = dep_crate_info.output.basename[:-(1 + len(dep_crate_info.output.extension))] if len(dep_crate_info.output.extension) > 0 else dep_crate_info.output.basename
+ env["CARGO_BIN_EXE_" + env_basename] = dep_crate_info.output.short_path
+
+ # Update environment with user provided variables.
+ env.update(expand_dict_value_locations(
+ ctx,
+ crate_info.rustc_env,
+ data_paths,
+ ))
+
+ # Ensure the sysroot is set for the target platform
+ env["SYSROOT"] = toolchain.sysroot
+
+ if toolchain._rename_first_party_crates:
+ env["RULES_RUST_THIRD_PARTY_DIR"] = toolchain._third_party_dir
+
+ # extra_rustc_flags apply to the target configuration, not the exec configuration.
+ if hasattr(ctx.attr, "_extra_rustc_flags") and not is_exec_configuration(ctx):
+ rustc_flags.add_all(ctx.attr._extra_rustc_flags[ExtraRustcFlagsInfo].extra_rustc_flags)
+
+ if hasattr(ctx.attr, "_extra_exec_rustc_flags") and is_exec_configuration(ctx):
+ rustc_flags.add_all(ctx.attr._extra_exec_rustc_flags[ExtraExecRustcFlagsInfo].extra_exec_rustc_flags)
+
+ # Create a struct which keeps the arguments separate so each may be tuned or
+ # replaced where necessary
+ args = struct(
+ process_wrapper_flags = process_wrapper_flags,
+ rustc_path = rustc_path,
+ rustc_flags = rustc_flags,
+ all = [process_wrapper_flags, rustc_path, rustc_flags],
+ )
+
+ return args, env
+
+def rustc_compile_action(
+ ctx,
+ attr,
+ toolchain,
+ crate_info,
+ output_hash = None,
+ rust_flags = [],
+ force_all_deps_direct = False):
+ """Create and run a rustc compile action based on the current rule's attributes
+
+ Args:
+ ctx (ctx): The rule's context object
+ attr (struct): Attributes to use for the rust compile action
+ toolchain (rust_toolchain): The current `rust_toolchain`
+ crate_info (CrateInfo): The CrateInfo provider for the current target.
+ output_hash (str, optional): The hashed path of the crate root. Defaults to None.
+ rust_flags (list, optional): Additional flags to pass to rustc. Defaults to [].
+ force_all_deps_direct (bool, optional): Whether to pass the transitive rlibs with --extern
+ to the commandline as opposed to -L.
+
+ Returns:
+ list: A list of the following providers:
+ - (CrateInfo): info for the crate we just built; same as `crate_info` parameter.
+ - (DepInfo): The transitive dependencies of this crate.
+ - (DefaultInfo): The output file for this crate, and its runfiles.
+ """
+ cc_toolchain, feature_configuration = find_cc_toolchain(ctx)
+
+ dep_info, build_info, linkstamps = collect_deps(
+ deps = crate_info.deps,
+ proc_macro_deps = crate_info.proc_macro_deps,
+ aliases = crate_info.aliases,
+ are_linkstamps_supported = _are_linkstamps_supported(
+ feature_configuration = feature_configuration,
+ has_grep_includes = hasattr(ctx.attr, "_grep_includes"),
+ ),
+ )
+
+ # Determine if the build is currently running with --stamp
+ stamp = is_stamping_enabled(attr)
+
+ compile_inputs, out_dir, build_env_files, build_flags_files, linkstamp_outs, ambiguous_libs = collect_inputs(
+ ctx = ctx,
+ file = ctx.file,
+ files = ctx.files,
+ linkstamps = linkstamps,
+ toolchain = toolchain,
+ cc_toolchain = cc_toolchain,
+ feature_configuration = feature_configuration,
+ crate_info = crate_info,
+ dep_info = dep_info,
+ build_info = build_info,
+ stamp = stamp,
+ )
+
+ args, env_from_args = construct_arguments(
+ ctx = ctx,
+ attr = attr,
+ file = ctx.file,
+ toolchain = toolchain,
+ tool_path = toolchain.rustc.path,
+ cc_toolchain = cc_toolchain,
+ feature_configuration = feature_configuration,
+ crate_info = crate_info,
+ dep_info = dep_info,
+ linkstamp_outs = linkstamp_outs,
+ ambiguous_libs = ambiguous_libs,
+ output_hash = output_hash,
+ rust_flags = rust_flags,
+ out_dir = out_dir,
+ build_env_files = build_env_files,
+ build_flags_files = build_flags_files,
+ force_all_deps_direct = force_all_deps_direct,
+ stamp = stamp,
+ )
+
+ env = dict(ctx.configuration.default_shell_env)
+ env.update(env_from_args)
+
+ if hasattr(attr, "version") and attr.version != "0.0.0":
+ formatted_version = " v{}".format(attr.version)
+ else:
+ formatted_version = ""
+
+ outputs = [crate_info.output]
+
+ # For a cdylib that might be added as a dependency to a cc_* target on Windows, it is important to include the
+ # interface library that rustc generates in the output files.
+ interface_library = None
+ if toolchain.os == "windows" and crate_info.type == "cdylib":
+ # Rustc generates the import library with a `.dll.lib` extension rather than the usual `.lib` one that msvc
+ # expects (see https://github.com/rust-lang/rust/pull/29520 for more context).
+ interface_library = ctx.actions.declare_file(crate_info.output.basename + ".lib")
+ outputs.append(interface_library)
+
+ # The action might generate extra output that we don't want to include in the `DefaultInfo` files.
+ action_outputs = list(outputs)
+
+ # Rustc generates a pdb file (on Windows) or a dsym folder (on macos) so provide it in an output group for crate
+ # types that benefit from having debug information in a separate file.
+ pdb_file = None
+ dsym_folder = None
+ if crate_info.type in ("cdylib", "bin") and not crate_info.is_test:
+ if toolchain.os == "windows":
+ pdb_file = ctx.actions.declare_file(crate_info.output.basename[:-len(crate_info.output.extension)] + "pdb")
+ action_outputs.append(pdb_file)
+ elif toolchain.os == "darwin":
+ dsym_folder = ctx.actions.declare_directory(crate_info.output.basename + ".dSYM")
+ action_outputs.append(dsym_folder)
+
+ # This uses startswith as on windows the basename will be process_wrapper_fake.exe.
+ if not ctx.executable._process_wrapper.basename.startswith("process_wrapper_fake"):
+ # Run as normal
+ ctx.actions.run(
+ executable = ctx.executable._process_wrapper,
+ inputs = compile_inputs,
+ outputs = action_outputs,
+ env = env,
+ arguments = args.all,
+ mnemonic = "Rustc",
+ progress_message = "Compiling Rust {} {}{} ({} files)".format(
+ crate_info.type,
+ ctx.label.name,
+ formatted_version,
+ len(crate_info.srcs.to_list()),
+ ),
+ )
+ else:
+ # Run without process_wrapper
+ if build_env_files or build_flags_files or stamp:
+ fail("build_env_files, build_flags_files, stamp are not supported if use_process_wrapper is False")
+ ctx.actions.run(
+ executable = toolchain.rustc,
+ inputs = compile_inputs,
+ outputs = action_outputs,
+ env = env,
+ arguments = [args.rustc_flags],
+ mnemonic = "Rustc",
+ progress_message = "Compiling Rust (without process_wrapper) {} {}{} ({} files)".format(
+ crate_info.type,
+ ctx.label.name,
+ formatted_version,
+ len(crate_info.srcs.to_list()),
+ ),
+ )
+
+ runfiles = ctx.runfiles(
+ files = getattr(ctx.files, "data", []),
+ collect_data = True,
+ )
+
+ # TODO: Remove after some resolution to
+ # https://github.com/bazelbuild/rules_rust/issues/771
+ out_binary = getattr(attr, "out_binary", False)
+
+ providers = [
+ crate_info,
+ dep_info,
+ DefaultInfo(
+ # nb. This field is required for cc_library to depend on our output.
+ files = depset(outputs),
+ runfiles = runfiles,
+ executable = crate_info.output if crate_info.type == "bin" or crate_info.is_test or out_binary else None,
+ ),
+ ]
+ if toolchain.target_arch != "wasm32":
+ providers += establish_cc_info(ctx, attr, crate_info, toolchain, cc_toolchain, feature_configuration, interface_library)
+ if pdb_file:
+ providers.append(OutputGroupInfo(pdb_file = depset([pdb_file])))
+ if dsym_folder:
+ providers.append(OutputGroupInfo(dsym_folder = depset([dsym_folder])))
+
+ return providers
+
+def _is_dylib(dep):
+ return not bool(dep.static_library or dep.pic_static_library)
+
+def establish_cc_info(ctx, attr, crate_info, toolchain, cc_toolchain, feature_configuration, interface_library):
+ """If the produced crate is suitable yield a CcInfo to allow for interop with cc rules
+
+ Args:
+ ctx (ctx): The rule's context object
+ attr (struct): Attributes to use in gathering CcInfo
+ crate_info (CrateInfo): The CrateInfo provider of the target crate
+ toolchain (rust_toolchain): The current `rust_toolchain`
+ cc_toolchain (CcToolchainInfo): The current `CcToolchainInfo`
+ feature_configuration (FeatureConfiguration): Feature configuration to be queried.
+ interface_library (File): Optional interface library for cdylib crates on Windows.
+
+ Returns:
+ list: A list containing the CcInfo provider
+ """
+
+ # A test will not need to produce CcInfo as nothing can depend on test targets
+ if crate_info.is_test:
+ return []
+
+ # Only generate CcInfo for particular crate types
+ if crate_info.type not in ("staticlib", "cdylib", "rlib", "lib"):
+ return []
+
+ # TODO: Remove after some resolution to
+ # https://github.com/bazelbuild/rules_rust/issues/771
+ if getattr(attr, "out_binary", False):
+ return []
+
+ if crate_info.type == "staticlib":
+ library_to_link = cc_common.create_library_to_link(
+ actions = ctx.actions,
+ feature_configuration = feature_configuration,
+ cc_toolchain = cc_toolchain,
+ static_library = crate_info.output,
+ # TODO(hlopko): handle PIC/NOPIC correctly
+ pic_static_library = crate_info.output,
+ )
+ elif crate_info.type in ("rlib", "lib"):
+ # bazel hard-codes a check for endswith((".a", ".pic.a",
+ # ".lib")) in create_library_to_link, so we work around that
+ # by creating a symlink to the .rlib with a .a extension.
+ dot_a = make_static_lib_symlink(ctx.actions, crate_info.output)
+
+ # TODO(hlopko): handle PIC/NOPIC correctly
+ library_to_link = cc_common.create_library_to_link(
+ actions = ctx.actions,
+ feature_configuration = feature_configuration,
+ cc_toolchain = cc_toolchain,
+ static_library = dot_a,
+ # TODO(hlopko): handle PIC/NOPIC correctly
+ pic_static_library = dot_a,
+ )
+ elif crate_info.type == "cdylib":
+ library_to_link = cc_common.create_library_to_link(
+ actions = ctx.actions,
+ feature_configuration = feature_configuration,
+ cc_toolchain = cc_toolchain,
+ dynamic_library = crate_info.output,
+ interface_library = interface_library,
+ )
+ else:
+ fail("Unexpected case")
+
+ link_input = cc_common.create_linker_input(
+ owner = ctx.label,
+ libraries = depset([library_to_link]),
+ )
+
+ linking_context = cc_common.create_linking_context(
+ # TODO - What to do for no_std?
+ linker_inputs = depset([link_input]),
+ )
+
+ cc_infos = [
+ CcInfo(linking_context = linking_context),
+ toolchain.stdlib_linkflags,
+ ]
+ for dep in getattr(attr, "deps", []):
+ if CcInfo in dep:
+ cc_infos.append(dep[CcInfo])
+
+ if crate_info.type in ("rlib", "lib") and toolchain.libstd_and_allocator_ccinfo:
+ # TODO: if we already have an rlib in our deps, we could skip this
+ cc_infos.append(toolchain.libstd_and_allocator_ccinfo)
+
+ return [cc_common.merge_cc_infos(cc_infos = cc_infos)]
+
+def add_edition_flags(args, crate):
+ """Adds the Rust edition flag to an arguments object reference
+
+ Args:
+ args (Args): A reference to an Args object
+ crate (CrateInfo): A CrateInfo provider
+ """
+ if crate.edition != "2015":
+ args.add("--edition={}".format(crate.edition))
+
+def _create_extra_input_args(build_info, dep_info):
+ """Gather additional input arguments from transitive dependencies
+
+ Args:
+ build_info (BuildInfo): The BuildInfo provider from the target Crate's set of inputs.
+ dep_info (DepInfo): The Depinfo provider form the target Crate's set of inputs.
+
+ Returns:
+ tuple: A tuple of the following items:
+ - (depset[File]): A list of all build info `OUT_DIR` File objects
+ - (str): The `OUT_DIR` of the current build info
+ - (File): An optional generated environment file from a `cargo_build_script` target
+ - (depset[File]): All direct and transitive build flag files from the current build info.
+ """
+ input_files = []
+
+ # Arguments to the commandline line wrapper that are going to be used
+ # to create the final command line
+ out_dir = None
+ build_env_file = None
+ build_flags_files = []
+
+ if build_info:
+ out_dir = build_info.out_dir.path
+ build_env_file = build_info.rustc_env
+ build_flags_files.append(build_info.flags)
+ build_flags_files.append(build_info.link_flags)
+ input_files.append(build_info.out_dir)
+ input_files.append(build_info.link_flags)
+
+ return (
+ depset(input_files, transitive = [dep_info.link_search_path_files]),
+ out_dir,
+ build_env_file,
+ depset(build_flags_files, transitive = [dep_info.link_search_path_files]),
+ )
+
+def _compute_rpaths(toolchain, output_dir, dep_info, use_pic):
+ """Determine the artifact's rpaths relative to the bazel root for runtime linking of shared libraries.
+
+ Args:
+ toolchain (rust_toolchain): The current `rust_toolchain`
+ output_dir (str): The output directory of the current target
+ dep_info (DepInfo): The current target's dependency info
+ use_pic: If set, prefers pic_static_library over static_library.
+
+ Returns:
+ depset: A set of relative paths from the output directory to each dependency
+ """
+
+ # Windows has no rpath equivalent, so always return an empty depset.
+ if toolchain.os == "windows":
+ return depset([])
+
+ dylibs = [
+ get_preferred_artifact(lib, use_pic)
+ for linker_input in dep_info.transitive_noncrates.to_list()
+ for lib in linker_input.libraries
+ if _is_dylib(lib)
+ ]
+ if not dylibs:
+ return depset([])
+
+ # For darwin, dylibs compiled by Bazel will fail to be resolved at runtime
+ # without a version of Bazel that includes
+ # https://github.com/bazelbuild/bazel/pull/13427. This is known to not be
+ # included in Bazel 4.1 and below.
+ if toolchain.os != "linux" and toolchain.os != "darwin":
+ fail("Runtime linking is not supported on {}, but found {}".format(
+ toolchain.os,
+ dep_info.transitive_noncrates,
+ ))
+
+ # Multiple dylibs can be present in the same directory, so deduplicate them.
+ return depset([
+ relativize(lib_dir, output_dir)
+ for lib_dir in _get_dir_names(dylibs)
+ ])
+
+def _get_dir_names(files):
+ """Returns a list of directory names from the given list of File objects
+
+ Args:
+ files (list): A list of File objects
+
+ Returns:
+ list: A list of directory names for all files
+ """
+ dirs = {}
+ for f in files:
+ dirs[f.dirname] = None
+ return dirs.keys()
+
+def add_crate_link_flags(args, dep_info, force_all_deps_direct = False):
+ """Adds link flags to an Args object reference
+
+ Args:
+ args (Args): An arguments object reference
+ dep_info (DepInfo): The current target's dependency info
+ force_all_deps_direct (bool, optional): Whether to pass the transitive rlibs with --extern
+ to the commandline as opposed to -L.
+ """
+
+ if force_all_deps_direct:
+ args.add_all(
+ depset(
+ transitive = [
+ dep_info.direct_crates,
+ dep_info.transitive_crates,
+ ],
+ ),
+ uniquify = True,
+ map_each = _crate_to_link_flag,
+ )
+ else:
+ # nb. Direct crates are linked via --extern regardless of their crate_type
+ args.add_all(dep_info.direct_crates, map_each = _crate_to_link_flag)
+ args.add_all(
+ dep_info.transitive_crates,
+ map_each = _get_crate_dirname,
+ uniquify = True,
+ format_each = "-Ldependency=%s",
+ )
+
+def _crate_to_link_flag(crate):
+ """A helper macro used by `add_crate_link_flags` for adding crate link flags to a Arg object
+
+ Args:
+ crate (CrateInfo|AliasableDepInfo): A CrateInfo or an AliasableDepInfo provider
+
+ Returns:
+ list: Link flags for the given provider
+ """
+
+ # This is AliasableDepInfo, we should use the alias as a crate name
+ if hasattr(crate, "dep"):
+ name = crate.name
+ crate_info = crate.dep
+ else:
+ name = crate.name
+ crate_info = crate
+ return ["--extern={}={}".format(name, crate_info.output.path)]
+
+def _get_crate_dirname(crate):
+ """A helper macro used by `add_crate_link_flags` for getting the directory name of the current crate's output path
+
+ Args:
+ crate (CrateInfo): A CrateInfo provider from the current rule
+
+ Returns:
+ str: The directory name of the the output File that will be produced.
+ """
+ return crate.output.dirname
+
+def _portable_link_flags(lib, use_pic, ambiguous_libs):
+ artifact = get_preferred_artifact(lib, use_pic)
+ if ambiguous_libs and artifact.path in ambiguous_libs:
+ artifact = ambiguous_libs[artifact.path]
+ if lib.static_library or lib.pic_static_library:
+ return [
+ "-lstatic=%s" % get_lib_name(artifact),
+ ]
+ elif _is_dylib(lib):
+ return [
+ "-ldylib=%s" % get_lib_name(artifact),
+ ]
+
+ return []
+
+def _make_link_flags_windows(linker_input_and_use_pic_and_ambiguous_libs):
+ linker_input, use_pic, ambiguous_libs = linker_input_and_use_pic_and_ambiguous_libs
+ ret = []
+ for lib in linker_input.libraries:
+ if lib.alwayslink:
+ ret.extend(["-C", "link-arg=/WHOLEARCHIVE:%s" % get_preferred_artifact(lib, use_pic).path])
+ else:
+ ret.extend(_portable_link_flags(lib, use_pic, ambiguous_libs))
+ return ret
+
+def _make_link_flags_darwin(linker_input_and_use_pic_and_ambiguous_libs):
+ linker_input, use_pic, ambiguous_libs = linker_input_and_use_pic_and_ambiguous_libs
+ ret = []
+ for lib in linker_input.libraries:
+ if lib.alwayslink:
+ ret.extend([
+ "-C",
+ ("link-arg=-Wl,-force_load,%s" % get_preferred_artifact(lib, use_pic).path),
+ ])
+ else:
+ ret.extend(_portable_link_flags(lib, use_pic, ambiguous_libs))
+ return ret
+
+def _make_link_flags_default(linker_input_and_use_pic_and_ambiguous_libs):
+ linker_input, use_pic, ambiguous_libs = linker_input_and_use_pic_and_ambiguous_libs
+ ret = []
+ for lib in linker_input.libraries:
+ if lib.alwayslink:
+ ret.extend([
+ "-C",
+ "link-arg=-Wl,--whole-archive",
+ "-C",
+ ("link-arg=%s" % get_preferred_artifact(lib, use_pic).path),
+ "-C",
+ "link-arg=-Wl,--no-whole-archive",
+ ])
+ else:
+ ret.extend(_portable_link_flags(lib, use_pic, ambiguous_libs))
+ return ret
+
+def _libraries_dirnames(linker_input_and_use_pic_and_ambiguous_libs):
+ link_input, use_pic, _ = linker_input_and_use_pic_and_ambiguous_libs
+
+ # De-duplicate names.
+ return depset([get_preferred_artifact(lib, use_pic).dirname for lib in link_input.libraries]).to_list()
+
+def _add_native_link_flags(args, dep_info, linkstamp_outs, ambiguous_libs, crate_type, toolchain, cc_toolchain, feature_configuration):
+ """Adds linker flags for all dependencies of the current target.
+
+ Args:
+ args (Args): The Args struct for a ctx.action
+ dep_info (DepInfo): Dependency Info provider
+ linkstamp_outs (list): Linkstamp outputs of native dependencies
+ ambiguous_libs (dict): Ambiguous libs, see `_disambiguate_libs`
+ crate_type: Crate type of the current target
+ toolchain (rust_toolchain): The current `rust_toolchain`
+ cc_toolchain (CcToolchainInfo): The current `cc_toolchain`
+ feature_configuration (FeatureConfiguration): feature configuration to use with cc_toolchain
+
+ """
+ if crate_type in ["lib", "rlib"]:
+ return
+
+ use_pic = _should_use_pic(cc_toolchain, feature_configuration, crate_type)
+
+ if toolchain.os == "windows":
+ make_link_flags = _make_link_flags_windows
+ elif toolchain.os.startswith("mac") or toolchain.os.startswith("darwin"):
+ make_link_flags = _make_link_flags_darwin
+ else:
+ make_link_flags = _make_link_flags_default
+
+ # TODO(hlopko): Remove depset flattening by using lambdas once we are on >=Bazel 5.0
+ args_and_pic_and_ambiguous_libs = [(arg, use_pic, ambiguous_libs) for arg in dep_info.transitive_noncrates.to_list()]
+ args.add_all(args_and_pic_and_ambiguous_libs, map_each = _libraries_dirnames, uniquify = True, format_each = "-Lnative=%s")
+ if ambiguous_libs:
+ # If there are ambiguous libs, the disambiguation symlinks to them are
+ # all created in the same directory. Add it to the library search path.
+ ambiguous_libs_dirname = ambiguous_libs.values()[0].dirname
+ args.add("-Lnative={}".format(ambiguous_libs_dirname))
+
+ args.add_all(args_and_pic_and_ambiguous_libs, map_each = make_link_flags)
+
+ for linkstamp_out in linkstamp_outs:
+ args.add_all(["-C", "link-arg=%s" % linkstamp_out.path])
+
+ if crate_type in ["dylib", "cdylib"]:
+ # For shared libraries we want to link C++ runtime library dynamically
+ # (for example libstdc++.so or libc++.so).
+ args.add_all(
+ cc_toolchain.dynamic_runtime_lib(feature_configuration = feature_configuration),
+ map_each = _get_dirname,
+ format_each = "-Lnative=%s",
+ )
+ args.add_all(
+ cc_toolchain.dynamic_runtime_lib(feature_configuration = feature_configuration),
+ map_each = get_lib_name,
+ format_each = "-ldylib=%s",
+ )
+ else:
+ # For all other crate types we want to link C++ runtime library statically
+ # (for example libstdc++.a or libc++.a).
+ args.add_all(
+ cc_toolchain.static_runtime_lib(feature_configuration = feature_configuration),
+ map_each = _get_dirname,
+ format_each = "-Lnative=%s",
+ )
+ args.add_all(
+ cc_toolchain.static_runtime_lib(feature_configuration = feature_configuration),
+ map_each = get_lib_name,
+ format_each = "-lstatic=%s",
+ )
+
+def _get_dirname(file):
+ """A helper function for `_add_native_link_flags`.
+
+ Args:
+ file (File): The target file
+
+ Returns:
+ str: Directory name of `file`
+ """
+ return file.dirname
+
+def _error_format_impl(ctx):
+ """Implementation of the `error_format` rule
+
+ Args:
+ ctx (ctx): The rule's context object
+
+ Returns:
+ list: A list containing the ErrorFormatInfo provider
+ """
+ raw = ctx.build_setting_value
+ if raw not in _error_format_values:
+ fail("{} expected a value in `{}` but got `{}`".format(
+ ctx.label,
+ _error_format_values,
+ raw,
+ ))
+ return [ErrorFormatInfo(error_format = raw)]
+
+error_format = rule(
+ doc = (
+ "Change the [--error-format](https://doc.rust-lang.org/rustc/command-line-arguments.html#option-error-format) " +
+ "flag from the command line with `--@rules_rust//:error_format`. See rustc documentation for valid values."
+ ),
+ implementation = _error_format_impl,
+ build_setting = config.string(flag = True),
+)
+
+def _extra_rustc_flags_impl(ctx):
+ return ExtraRustcFlagsInfo(extra_rustc_flags = ctx.build_setting_value)
+
+extra_rustc_flags = rule(
+ doc = (
+ "Add additional rustc_flags from the command line with `--@rules_rust//:extra_rustc_flags`. " +
+ "This flag should only be used for flags that need to be applied across the entire build. For options that " +
+ "apply to individual crates, use the rustc_flags attribute on the individual crate's rule instead. NOTE: " +
+ "These flags not applied to the exec configuration (proc-macros, cargo_build_script, etc); " +
+ "use `--@rules_rust//:extra_exec_rustc_flags` to apply flags to the exec configuration."
+ ),
+ implementation = _extra_rustc_flags_impl,
+ build_setting = config.string_list(flag = True),
+)
+
+def _extra_exec_rustc_flags_impl(ctx):
+ return ExtraExecRustcFlagsInfo(extra_exec_rustc_flags = ctx.build_setting_value)
+
+extra_exec_rustc_flags = rule(
+ doc = (
+ "Add additional rustc_flags in the exec configuration from the command line with `--@rules_rust//:extra_exec_rustc_flags`. " +
+ "This flag should only be used for flags that need to be applied across the entire build. " +
+ "These flags only apply to the exec configuration (proc-macros, cargo_build_script, etc)."
+ ),
+ implementation = _extra_exec_rustc_flags_impl,
+ build_setting = config.string_list(flag = True),
+)
diff --git a/rust/private/rustdoc.bzl b/rust/private/rustdoc.bzl
new file mode 100644
index 0000000..86c2acd
--- /dev/null
+++ b/rust/private/rustdoc.bzl
@@ -0,0 +1,318 @@
+# Copyright 2018 The Bazel Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Rules for generating documentation with `rustdoc` for Bazel built crates"""
+
+load("//rust/private:common.bzl", "rust_common")
+load("//rust/private:rustc.bzl", "collect_deps", "collect_inputs", "construct_arguments")
+load("//rust/private:utils.bzl", "dedent", "find_cc_toolchain", "find_toolchain")
+
+def _strip_crate_info_output(crate_info):
+ """Set the CrateInfo.output to None for a given CrateInfo provider.
+
+ Args:
+ crate_info (CrateInfo): A provider
+
+ Returns:
+ CrateInfo: A modified CrateInfo provider
+ """
+ return rust_common.create_crate_info(
+ name = crate_info.name,
+ type = crate_info.type,
+ root = crate_info.root,
+ srcs = crate_info.srcs,
+ deps = crate_info.deps,
+ proc_macro_deps = crate_info.proc_macro_deps,
+ aliases = crate_info.aliases,
+ # This crate info should have no output
+ output = None,
+ edition = crate_info.edition,
+ rustc_env = crate_info.rustc_env,
+ is_test = crate_info.is_test,
+ compile_data = crate_info.compile_data,
+ )
+
+def rustdoc_compile_action(
+ ctx,
+ toolchain,
+ crate_info,
+ output = None,
+ rustdoc_flags = [],
+ is_test = False):
+ """Create a struct of information needed for a `rustdoc` compile action based on crate passed to the rustdoc rule.
+
+ Args:
+ ctx (ctx): The rule's context object.
+ toolchain (rust_toolchain): The currently configured `rust_toolchain`.
+ crate_info (CrateInfo): The provider of the crate passed to a rustdoc rule.
+ output (File, optional): An optional output a `rustdoc` action is intended to produce.
+ rustdoc_flags (list, optional): A list of `rustdoc` specific flags.
+ is_test (bool, optional): If True, the action will be configured for `rust_doc_test` targets
+
+ Returns:
+ struct: A struct of some `ctx.actions.run` arguments.
+ """
+
+ # If an output was provided, ensure it's used in rustdoc arguments
+ if output:
+ rustdoc_flags = [
+ "--output",
+ output.path,
+ ] + rustdoc_flags
+
+ cc_toolchain, feature_configuration = find_cc_toolchain(ctx)
+
+ dep_info, build_info, linkstamps = collect_deps(
+ deps = crate_info.deps,
+ proc_macro_deps = crate_info.proc_macro_deps,
+ aliases = crate_info.aliases,
+ )
+
+ compile_inputs, out_dir, build_env_files, build_flags_files, linkstamp_outs, ambiguous_libs = collect_inputs(
+ ctx = ctx,
+ file = ctx.file,
+ files = ctx.files,
+ linkstamps = linkstamps,
+ toolchain = toolchain,
+ cc_toolchain = cc_toolchain,
+ feature_configuration = feature_configuration,
+ crate_info = crate_info,
+ dep_info = dep_info,
+ build_info = build_info,
+ )
+
+ # Since this crate is not actually producing the output described by the
+ # given CrateInfo, this attribute needs to be stripped to allow the rest
+ # of the rustc functionality in `construct_arguments` to avoid generating
+ # arguments expecting to do so.
+ rustdoc_crate_info = _strip_crate_info_output(crate_info)
+
+ args, env = construct_arguments(
+ ctx = ctx,
+ attr = ctx.attr,
+ file = ctx.file,
+ toolchain = toolchain,
+ tool_path = toolchain.rust_doc.short_path if is_test else toolchain.rust_doc.path,
+ cc_toolchain = cc_toolchain,
+ feature_configuration = feature_configuration,
+ crate_info = rustdoc_crate_info,
+ dep_info = dep_info,
+ linkstamp_outs = linkstamp_outs,
+ ambiguous_libs = ambiguous_libs,
+ output_hash = None,
+ rust_flags = rustdoc_flags,
+ out_dir = out_dir,
+ build_env_files = build_env_files,
+ build_flags_files = build_flags_files,
+ emit = [],
+ remap_path_prefix = None,
+ force_link = True,
+ )
+
+ # Because rustdoc tests compile tests outside of the sandbox, the sysroot
+ # must be updated to the `short_path` equivilant as it will now be
+ # a part of runfiles.
+ if is_test:
+ if "SYSROOT" in env:
+ env.update({"SYSROOT": "${{pwd}}/{}".format(toolchain.sysroot_short_path)})
+
+ # `rustdoc` does not support the SYSROOT environment variable. To account
+ # for this, the flag must be explicitly passed to the `rustdoc` binary.
+ args.rustc_flags.add("--sysroot=${{pwd}}/{}".format(toolchain.sysroot_short_path))
+
+ return struct(
+ executable = ctx.executable._process_wrapper,
+ inputs = depset([crate_info.output], transitive = [compile_inputs]),
+ env = env,
+ arguments = args.all,
+ tools = [toolchain.rust_doc],
+ )
+
+def _zip_action(ctx, input_dir, output_zip, crate_label):
+ """Creates an archive of the generated documentation from `rustdoc`
+
+ Args:
+ ctx (ctx): The `rust_doc` rule's context object
+ input_dir (File): A directory containing the outputs from rustdoc
+ output_zip (File): The location of the output archive containing generated documentation
+ crate_label (Label): The label of the crate docs are being generated for.
+ """
+ args = ctx.actions.args()
+ args.add(ctx.executable._zipper)
+ args.add(output_zip)
+ args.add(ctx.bin_dir.path)
+ args.add_all([input_dir], expand_directories = True)
+ ctx.actions.run(
+ executable = ctx.executable._dir_zipper,
+ inputs = [input_dir],
+ outputs = [output_zip],
+ arguments = [args],
+ mnemonic = "RustdocZip",
+ progress_message = "Creating RustdocZip for {}".format(crate_label),
+ tools = [ctx.executable._zipper],
+ )
+
+def _rust_doc_impl(ctx):
+ """The implementation of the `rust_doc` rule
+
+ Args:
+ ctx (ctx): The rule's context object
+ """
+
+ crate = ctx.attr.crate
+ crate_info = crate[rust_common.crate_info]
+
+ output_dir = ctx.actions.declare_directory("{}.rustdoc".format(ctx.label.name))
+
+ # Add the current crate as an extern for the compile action
+ rustdoc_flags = [
+ "--extern",
+ "{}={}".format(crate_info.name, crate_info.output.path),
+ ]
+
+ action = rustdoc_compile_action(
+ ctx = ctx,
+ toolchain = find_toolchain(ctx),
+ crate_info = crate_info,
+ output = output_dir,
+ rustdoc_flags = rustdoc_flags,
+ )
+
+ ctx.actions.run(
+ mnemonic = "Rustdoc",
+ progress_message = "Generating Rustdoc for {}".format(crate.label),
+ outputs = [output_dir],
+ executable = action.executable,
+ inputs = action.inputs,
+ env = action.env,
+ arguments = action.arguments,
+ tools = action.tools,
+ )
+
+ # This rule does nothing without a single-file output, though the directory should've sufficed.
+ _zip_action(ctx, output_dir, ctx.outputs.rust_doc_zip, crate.label)
+
+ return [
+ DefaultInfo(
+ files = depset([ctx.outputs.rust_doc_zip]),
+ ),
+ OutputGroupInfo(
+ rustdoc_dir = depset([output_dir]),
+ rustdoc_zip = depset([ctx.outputs.rust_doc_zip]),
+ ),
+ ]
+
+rust_doc = rule(
+ doc = dedent("""\
+ Generates code documentation.
+
+ Example:
+ Suppose you have the following directory structure for a Rust library crate:
+
+ ```
+ [workspace]/
+ WORKSPACE
+ hello_lib/
+ BUILD
+ src/
+ lib.rs
+ ```
+
+ To build [`rustdoc`][rustdoc] documentation for the `hello_lib` crate, define \
+ a `rust_doc` rule that depends on the the `hello_lib` `rust_library` target:
+
+ [rustdoc]: https://doc.rust-lang.org/book/documentation.html
+
+ ```python
+ package(default_visibility = ["//visibility:public"])
+
+ load("@rules_rust//rust:defs.bzl", "rust_library", "rust_doc")
+
+ rust_library(
+ name = "hello_lib",
+ srcs = ["src/lib.rs"],
+ )
+
+ rust_doc(
+ name = "hello_lib_doc",
+ crate = ":hello_lib",
+ )
+ ```
+
+ Running `bazel build //hello_lib:hello_lib_doc` will build a zip file containing \
+ the documentation for the `hello_lib` library crate generated by `rustdoc`.
+ """),
+ implementation = _rust_doc_impl,
+ attrs = {
+ "crate": attr.label(
+ doc = (
+ "The label of the target to generate code documentation for.\n" +
+ "\n" +
+ "`rust_doc` can generate HTML code documentation for the source files of " +
+ "`rust_library` or `rust_binary` targets."
+ ),
+ providers = [rust_common.crate_info],
+ mandatory = True,
+ ),
+ "html_after_content": attr.label(
+ doc = "File to add in `<body>`, after content.",
+ allow_single_file = [".html", ".md"],
+ ),
+ "html_before_content": attr.label(
+ doc = "File to add in `<body>`, before content.",
+ allow_single_file = [".html", ".md"],
+ ),
+ "html_in_header": attr.label(
+ doc = "File to add to `<head>`.",
+ allow_single_file = [".html", ".md"],
+ ),
+ "markdown_css": attr.label_list(
+ doc = "CSS files to include via `<link>` in a rendered Markdown file.",
+ allow_files = [".css"],
+ ),
+ "_cc_toolchain": attr.label(
+ doc = "In order to use find_cpp_toolchain, you must define the '_cc_toolchain' attribute on your rule or aspect.",
+ default = "@bazel_tools//tools/cpp:current_cc_toolchain",
+ ),
+ "_dir_zipper": attr.label(
+ doc = "A tool that orchestrates the creation of zip archives for rustdoc outputs.",
+ default = Label("//util/dir_zipper"),
+ cfg = "exec",
+ executable = True,
+ ),
+ "_process_wrapper": attr.label(
+ doc = "A process wrapper for running rustdoc on all platforms",
+ default = Label("@rules_rust//util/process_wrapper"),
+ executable = True,
+ allow_single_file = True,
+ cfg = "exec",
+ ),
+ "_zipper": attr.label(
+ doc = "A Bazel provided tool for creating archives",
+ default = Label("@bazel_tools//tools/zip:zipper"),
+ cfg = "exec",
+ executable = True,
+ ),
+ },
+ fragments = ["cpp"],
+ host_fragments = ["cpp"],
+ outputs = {
+ "rust_doc_zip": "%{name}.zip",
+ },
+ toolchains = [
+ str(Label("//rust:toolchain")),
+ "@bazel_tools//tools/cpp:toolchain_type",
+ ],
+ incompatible_use_toolchain_transition = True,
+)
diff --git a/rust/private/rustdoc_test.bzl b/rust/private/rustdoc_test.bzl
new file mode 100644
index 0000000..663c65f
--- /dev/null
+++ b/rust/private/rustdoc_test.bzl
@@ -0,0 +1,225 @@
+# Copyright 2018 The Bazel Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Rules for performing `rustdoc --test` on Bazel built crates"""
+
+load("//rust/private:common.bzl", "rust_common")
+load("//rust/private:rustdoc.bzl", "rustdoc_compile_action")
+load("//rust/private:utils.bzl", "dedent", "find_toolchain")
+
+def _construct_writer_arguments(ctx, test_runner, action, crate_info):
+ """Construct arguments and environment variables specific to `rustdoc_test_writer`.
+
+ This is largely solving for the fact that tests run from a runfiles directory
+ where actions run in an execroot. But it also tracks what environment variables
+ were explicitly added to the action.
+
+ Args:
+ ctx (ctx): The rule's context object.
+ test_runner (File): The test_runner output file declared by `rustdoc_test`.
+ action (struct): Action arguments generated by `rustdoc_compile_action`.
+ crate_info (CrateInfo): The provider of the crate who's docs are being tested.
+
+ Returns:
+ tuple: A tuple of `rustdoc_test_writer` specific inputs
+ - Args: Arguments for the test writer
+ - dict: Required environment variables
+ """
+
+ writer_args = ctx.actions.args()
+
+ # Track the output path where the test writer should write the test
+ writer_args.add("--output={}".format(test_runner.path))
+
+ # Track what environment variables should be written to the test runner
+ writer_args.add("--action_env=DEVELOPER_DIR")
+ writer_args.add("--action_env=PATHEXT")
+ writer_args.add("--action_env=SDKROOT")
+ writer_args.add("--action_env=SYSROOT")
+ for var in action.env.keys():
+ writer_args.add("--action_env={}".format(var))
+
+ # Since the test runner will be running from a runfiles directory, the
+ # paths originally generated for the build action will not map to any
+ # files. To ensure rustdoc can find the appropriate dependencies, the
+ # file roots are identified and tracked for each dependency so it can be
+ # stripped from the test runner.
+ for dep in crate_info.deps.to_list():
+ dep_crate_info = getattr(dep, "crate_info", None)
+ dep_dep_info = getattr(dep, "dep_info", None)
+ if dep_crate_info:
+ root = dep_crate_info.output.root.path
+ writer_args.add("--strip_substring={}/".format(root))
+ if dep_dep_info:
+ for direct_dep in dep_dep_info.direct_crates.to_list():
+ root = direct_dep.dep.output.root.path
+ writer_args.add("--strip_substring={}/".format(root))
+ for transitive_dep in dep_dep_info.transitive_crates.to_list():
+ root = transitive_dep.output.root.path
+ writer_args.add("--strip_substring={}/".format(root))
+
+ # Indicate that the rustdoc_test args are over.
+ writer_args.add("--")
+
+ # Prepare for the process runner to ingest the rest of the arguments
+ # to match the expectations of `rustc_compile_action`.
+ writer_args.add(ctx.executable._process_wrapper.short_path)
+
+ return (writer_args, action.env)
+
+def _rust_doc_test_impl(ctx):
+ """The implementation for the `rust_doc_test` rule
+
+ Args:
+ ctx (ctx): The rule's context object
+
+ Returns:
+ list: A list containing a DefaultInfo provider
+ """
+
+ toolchain = find_toolchain(ctx)
+
+ crate = ctx.attr.crate
+ crate_info = crate[rust_common.crate_info]
+
+ if toolchain.os == "windows":
+ test_runner = ctx.actions.declare_file(ctx.label.name + ".rustdoc_test.bat")
+ else:
+ test_runner = ctx.actions.declare_file(ctx.label.name + ".rustdoc_test.sh")
+
+ # Add the current crate as an extern for the compile action
+ rustdoc_flags = [
+ "--extern",
+ "{}={}".format(crate_info.name, crate_info.output.short_path),
+ "--test",
+ ]
+
+ action = rustdoc_compile_action(
+ ctx = ctx,
+ toolchain = toolchain,
+ crate_info = crate_info,
+ rustdoc_flags = rustdoc_flags,
+ is_test = True,
+ )
+
+ tools = action.tools + [ctx.executable._process_wrapper]
+
+ writer_args, env = _construct_writer_arguments(
+ ctx = ctx,
+ test_runner = test_runner,
+ action = action,
+ crate_info = crate_info,
+ )
+
+ # Allow writer environment variables to override those from the action.
+ action.env.update(env)
+
+ ctx.actions.run(
+ mnemonic = "RustdocTestWriter",
+ progress_message = "Generating Rustdoc test runner for {}".format(crate.label),
+ executable = ctx.executable._test_writer,
+ inputs = action.inputs,
+ tools = tools,
+ arguments = [writer_args] + action.arguments,
+ env = action.env,
+ outputs = [test_runner],
+ )
+
+ return [DefaultInfo(
+ files = depset([test_runner]),
+ runfiles = ctx.runfiles(files = tools, transitive_files = action.inputs),
+ executable = test_runner,
+ )]
+
+rust_doc_test = rule(
+ implementation = _rust_doc_test_impl,
+ attrs = {
+ "crate": attr.label(
+ doc = (
+ "The label of the target to generate code documentation for. " +
+ "`rust_doc_test` can generate HTML code documentation for the " +
+ "source files of `rust_library` or `rust_binary` targets."
+ ),
+ providers = [rust_common.crate_info],
+ mandatory = True,
+ ),
+ "_cc_toolchain": attr.label(
+ doc = (
+ "In order to use find_cc_toolchain, your rule has to depend " +
+ "on C++ toolchain. See @rules_cc//cc:find_cc_toolchain.bzl " +
+ "docs for details."
+ ),
+ default = "@bazel_tools//tools/cpp:current_cc_toolchain",
+ ),
+ "_process_wrapper": attr.label(
+ doc = "A process wrapper for running rustdoc on all platforms",
+ cfg = "exec",
+ default = Label("//util/process_wrapper"),
+ executable = True,
+ ),
+ "_test_writer": attr.label(
+ doc = "A binary used for writing script for use as the test executable.",
+ cfg = "exec",
+ default = Label("//tools/rustdoc:rustdoc_test_writer"),
+ executable = True,
+ ),
+ },
+ test = True,
+ fragments = ["cpp"],
+ host_fragments = ["cpp"],
+ toolchains = [
+ str(Label("//rust:toolchain")),
+ "@bazel_tools//tools/cpp:toolchain_type",
+ ],
+ incompatible_use_toolchain_transition = True,
+ doc = dedent("""\
+ Runs Rust documentation tests.
+
+ Example:
+
+ Suppose you have the following directory structure for a Rust library crate:
+
+ ```output
+ [workspace]/
+ WORKSPACE
+ hello_lib/
+ BUILD
+ src/
+ lib.rs
+ ```
+
+ To run [documentation tests][doc-test] for the `hello_lib` crate, define a `rust_doc_test` \
+ target that depends on the `hello_lib` `rust_library` target:
+
+ [doc-test]: https://doc.rust-lang.org/book/documentation.html#documentation-as-tests
+
+ ```python
+ package(default_visibility = ["//visibility:public"])
+
+ load("@rules_rust//rust:defs.bzl", "rust_library", "rust_doc_test")
+
+ rust_library(
+ name = "hello_lib",
+ srcs = ["src/lib.rs"],
+ )
+
+ rust_doc_test(
+ name = "hello_lib_doc_test",
+ crate = ":hello_lib",
+ )
+ ```
+
+ Running `bazel test //hello_lib:hello_lib_doc_test` will run all documentation tests for the `hello_lib` library crate.
+ """),
+)
diff --git a/rust/private/rustfmt.bzl b/rust/private/rustfmt.bzl
new file mode 100644
index 0000000..9c59f48
--- /dev/null
+++ b/rust/private/rustfmt.bzl
@@ -0,0 +1,186 @@
+"""A module defining rustfmt rules"""
+
+load(":common.bzl", "rust_common")
+load(":utils.bzl", "find_toolchain")
+
+def _find_rustfmtable_srcs(target, aspect_ctx = None):
+ """Parse a target for rustfmt formattable sources.
+
+ Args:
+ target (Target): The target the aspect is running on.
+ aspect_ctx (ctx, optional): The aspect's context object.
+
+ Returns:
+ list: A list of formattable sources (`File`).
+ """
+ if rust_common.crate_info not in target:
+ return []
+
+ # Ignore external targets
+ if target.label.workspace_root.startswith("external"):
+ return []
+
+ # Targets annotated with `norustfmt` will not be formatted
+ if aspect_ctx and "norustfmt" in aspect_ctx.rule.attr.tags:
+ return []
+
+ crate_info = target[rust_common.crate_info]
+
+ # Filter out any generated files
+ srcs = [src for src in crate_info.srcs.to_list() if src.is_source]
+
+ return srcs
+
+def _generate_manifest(edition, srcs, ctx):
+ # Gather the source paths to non-generated files
+ src_paths = [src.path for src in srcs]
+
+ # Write the rustfmt manifest
+ manifest = ctx.actions.declare_file(ctx.label.name + ".rustfmt")
+ ctx.actions.write(
+ output = manifest,
+ content = "\n".join(src_paths + [
+ edition,
+ ]),
+ )
+
+ return manifest
+
+def _perform_check(edition, srcs, ctx):
+ toolchain = find_toolchain(ctx)
+ config = ctx.file._config
+ marker = ctx.actions.declare_file(ctx.label.name + ".rustfmt.ok")
+
+ args = ctx.actions.args()
+ args.add("--touch-file")
+ args.add(marker)
+ args.add("--")
+ args.add(toolchain.rustfmt)
+ args.add("--config-path")
+ args.add(config)
+ args.add("--edition")
+ args.add(edition)
+ args.add("--check")
+ args.add_all(srcs)
+
+ ctx.actions.run(
+ executable = ctx.executable._process_wrapper,
+ inputs = srcs + [config],
+ outputs = [marker],
+ tools = [toolchain.rustfmt],
+ arguments = [args],
+ mnemonic = "Rustfmt",
+ )
+
+ return marker
+
+def _rustfmt_aspect_impl(target, ctx):
+ srcs = _find_rustfmtable_srcs(target, ctx)
+
+ # If there are no formattable sources, do nothing.
+ if not srcs:
+ return []
+
+ # Parse the edition to use for formatting from the target
+ edition = target[rust_common.crate_info].edition
+
+ manifest = _generate_manifest(edition, srcs, ctx)
+ marker = _perform_check(edition, srcs, ctx)
+
+ return [
+ OutputGroupInfo(
+ rustfmt_manifest = depset([manifest]),
+ rustfmt_checks = depset([marker]),
+ ),
+ ]
+
+rustfmt_aspect = aspect(
+ implementation = _rustfmt_aspect_impl,
+ doc = """\
+This aspect is used to gather information about a crate for use in rustfmt and perform rustfmt checks
+
+Output Groups:
+
+- `rustfmt_manifest`: A manifest used by rustfmt binaries to provide crate specific settings.
+- `rustfmt_checks`: Executes `rustfmt --check` on the specified target.
+
+The build setting `@rules_rust//:rustfmt.toml` is used to control the Rustfmt [configuration settings][cs]
+used at runtime.
+
+[cs]: https://rust-lang.github.io/rustfmt/
+
+This aspect is executed on any target which provides the `CrateInfo` provider. However
+users may tag a target with `norustfmt` to have it skipped. Additionally, generated
+source files are also ignored by this aspect.
+""",
+ attrs = {
+ "_config": attr.label(
+ doc = "The `rustfmt.toml` file used for formatting",
+ allow_single_file = True,
+ default = Label("//:rustfmt.toml"),
+ ),
+ "_process_wrapper": attr.label(
+ doc = "A process wrapper for running rustfmt on all platforms",
+ cfg = "exec",
+ executable = True,
+ default = Label("//util/process_wrapper"),
+ ),
+ },
+ incompatible_use_toolchain_transition = True,
+ fragments = ["cpp"],
+ host_fragments = ["cpp"],
+ toolchains = [
+ str(Label("//rust:toolchain")),
+ ],
+)
+
+def _rustfmt_test_impl(ctx):
+ # The executable of a test target must be the output of an action in
+ # the rule implementation. This file is simply a symlink to the real
+ # rustfmt test runner.
+ runner = ctx.actions.declare_file("{}{}".format(
+ ctx.label.name,
+ ctx.executable._runner.extension,
+ ))
+
+ ctx.actions.symlink(
+ output = runner,
+ target_file = ctx.executable._runner,
+ is_executable = True,
+ )
+
+ manifests = [target[OutputGroupInfo].rustfmt_manifest for target in ctx.attr.targets]
+ srcs = [depset(_find_rustfmtable_srcs(target)) for target in ctx.attr.targets]
+
+ runfiles = ctx.runfiles(
+ transitive_files = depset(transitive = manifests + srcs),
+ )
+
+ runfiles = runfiles.merge(
+ ctx.attr._runner[DefaultInfo].default_runfiles,
+ )
+
+ return [DefaultInfo(
+ files = depset([runner]),
+ runfiles = runfiles,
+ executable = runner,
+ )]
+
+rustfmt_test = rule(
+ implementation = _rustfmt_test_impl,
+ doc = "A test rule for performing `rustfmt --check` on a set of targets",
+ attrs = {
+ "targets": attr.label_list(
+ doc = "Rust targets to run `rustfmt --check` on.",
+ providers = [rust_common.crate_info],
+ aspects = [rustfmt_aspect],
+ ),
+ "_runner": attr.label(
+ doc = "The rustfmt test runner",
+ cfg = "exec",
+ executable = True,
+ default = Label("//tools/rustfmt:rustfmt_test"),
+ ),
+ },
+ test = True,
+)
diff --git a/rust/private/stamp.bzl b/rust/private/stamp.bzl
new file mode 100644
index 0000000..1a7cab6
--- /dev/null
+++ b/rust/private/stamp.bzl
@@ -0,0 +1,75 @@
+"""A small utility module dedicated to detecting whether or not the `--stamp` flag is enabled
+
+This module can be removed likely after the following PRs ar addressed:
+- https://github.com/bazelbuild/bazel/issues/11164
+"""
+
+load("//rust/private:utils.bzl", "dedent")
+
+StampSettingInfo = provider(
+ doc = "Information about the `--stamp` command line flag",
+ fields = {
+ "value": "bool: Whether or not the `--stamp` flag was enabled",
+ },
+)
+
+def _stamp_build_setting_impl(ctx):
+ return StampSettingInfo(value = ctx.attr.value)
+
+_stamp_build_setting = rule(
+ doc = dedent("""\
+ Whether to encode build information into the binary. Possible values:
+
+ - stamp = 1: Always stamp the build information into the binary, even in [--nostamp][stamp] builds. \
+ This setting should be avoided, since it potentially kills remote caching for the binary and \
+ any downstream actions that depend on it.
+ - stamp = 0: Always replace build information by constant values. This gives good build result caching.
+ - stamp = -1: Embedding of build information is controlled by the [--[no]stamp][stamp] flag.
+
+ Stamped binaries are not rebuilt unless their dependencies change.
+ [stamp]: https://docs.bazel.build/versions/main/user-manual.html#flag--stamp
+ """),
+ implementation = _stamp_build_setting_impl,
+ attrs = {
+ "value": attr.bool(
+ doc = "The default value of the stamp build flag",
+ mandatory = True,
+ ),
+ },
+)
+
+def stamp_build_setting(name, visibility = ["//visibility:public"]):
+ native.config_setting(
+ name = "stamp_detect",
+ values = {"stamp": "1"},
+ visibility = visibility,
+ )
+
+ _stamp_build_setting(
+ name = name,
+ value = select({
+ ":stamp_detect": True,
+ "//conditions:default": False,
+ }),
+ visibility = visibility,
+ )
+
+def is_stamping_enabled(attr):
+ """Determine whether or not build stamping is enabled
+
+ Args:
+ attr (struct): A rule's struct of attributes (`ctx.attr`)
+
+ Returns:
+ bool: The stamp value
+ """
+ stamp_num = getattr(attr, "stamp", -1)
+ if stamp_num == 1:
+ return True
+ elif stamp_num == 0:
+ return False
+ elif stamp_num == -1:
+ stamp_flag = getattr(attr, "_stamp_flag", None)
+ return stamp_flag[StampSettingInfo].value if stamp_flag else False
+ else:
+ fail("Unexpected `stamp` value: {}".format(stamp_num))
diff --git a/rust/private/toolchain_utils.bzl b/rust/private/toolchain_utils.bzl
new file mode 100644
index 0000000..fcd4fb7
--- /dev/null
+++ b/rust/private/toolchain_utils.bzl
@@ -0,0 +1,82 @@
+"""A module defining toolchain utilities"""
+
+def _toolchain_files_impl(ctx):
+ toolchain = ctx.toolchains[str(Label("//rust:toolchain"))]
+
+ runfiles = None
+ if ctx.attr.tool == "cargo":
+ files = depset([toolchain.cargo])
+ runfiles = ctx.runfiles(
+ files = [
+ toolchain.cargo,
+ toolchain.rustc,
+ ],
+ transitive_files = toolchain.rustc_lib,
+ )
+ elif ctx.attr.tool == "clippy":
+ files = depset([toolchain.clippy_driver])
+ runfiles = ctx.runfiles(
+ files = [
+ toolchain.clippy_driver,
+ toolchain.rustc,
+ ],
+ transitive_files = toolchain.rustc_lib,
+ )
+ elif ctx.attr.tool == "rustc":
+ files = depset([toolchain.rustc])
+ runfiles = ctx.runfiles(
+ files = [toolchain.rustc],
+ transitive_files = toolchain.rustc_lib,
+ )
+ elif ctx.attr.tool == "rustdoc":
+ files = depset([toolchain.rust_doc])
+ runfiles = ctx.runfiles(
+ files = [toolchain.rust_doc],
+ transitive_files = toolchain.rustc_lib,
+ )
+ elif ctx.attr.tool == "rustfmt":
+ files = depset([toolchain.rustfmt])
+ runfiles = ctx.runfiles(
+ files = [toolchain.rustfmt],
+ transitive_files = toolchain.rustc_lib,
+ )
+ elif ctx.attr.tool == "rustc_lib":
+ files = toolchain.rustc_lib
+ elif ctx.attr.tool == "rustc_srcs":
+ files = toolchain.rustc_srcs.files
+ elif ctx.attr.tool == "rust_std" or ctx.attr.tool == "rust_stdlib" or ctx.attr.tool == "rust_lib":
+ files = toolchain.rust_std
+ else:
+ fail("Unsupported tool: ", ctx.attr.tool)
+
+ return [DefaultInfo(
+ files = files,
+ runfiles = runfiles,
+ )]
+
+toolchain_files = rule(
+ doc = "A rule for fetching files from a rust toolchain.",
+ implementation = _toolchain_files_impl,
+ attrs = {
+ "tool": attr.string(
+ doc = "The desired tool to get form the current rust_toolchain",
+ values = [
+ "cargo",
+ "clippy",
+ "rust_lib",
+ "rust_std",
+ "rust_stdlib",
+ "rustc_lib",
+ "rustc_srcs",
+ "rustc",
+ "rustdoc",
+ "rustfmt",
+ ],
+ mandatory = True,
+ ),
+ },
+ toolchains = [
+ str(Label("//rust:toolchain")),
+ ],
+ incompatible_use_toolchain_transition = True,
+)
diff --git a/rust/private/transitions.bzl b/rust/private/transitions.bzl
new file mode 100644
index 0000000..cd28efd
--- /dev/null
+++ b/rust/private/transitions.bzl
@@ -0,0 +1,111 @@
+# buildifier: disable=module-docstring
+load("//rust:defs.bzl", "rust_common")
+
+def _wasm_bindgen_transition(_settings, _attr):
+ """The implementation of the `wasm_bindgen_transition` transition
+
+ Args:
+ _settings (dict): A dict {String:Object} of all settings declared
+ in the inputs parameter to `transition()`
+ _attr (dict): A dict of attributes and values of the rule to which
+ the transition is attached
+
+ Returns:
+ dict: A dict of new build settings values to apply
+ """
+ return {"//command_line_option:platforms": str(Label("//rust/platform:wasm"))}
+
+wasm_bindgen_transition = transition(
+ implementation = _wasm_bindgen_transition,
+ inputs = [],
+ outputs = ["//command_line_option:platforms"],
+)
+
+def _import_macro_dep_bootstrap_transition(_settings, _attr):
+ """The implementation of the `import_macro_dep_bootstrap_transition` transition.
+
+ This transition modifies the config to start using the fake macro
+ implementation, so that the macro itself can be bootstrapped without
+ creating a dependency cycle, even while every Rust target has an implicit
+ dependency on the "import" macro (either real or fake).
+
+ Args:
+ _settings (dict): a dict {String:Object} of all settings declared in the
+ inputs parameter to `transition()`.
+ _attr (dict): A dict of attributes and values of the rule to which the
+ transition is attached.
+
+ Returns:
+ dict: A dict of new build settings values to apply.
+ """
+ return {"@rules_rust//rust/settings:use_real_import_macro": False}
+
+import_macro_dep_bootstrap_transition = transition(
+ implementation = _import_macro_dep_bootstrap_transition,
+ inputs = [],
+ outputs = ["@rules_rust//rust/settings:use_real_import_macro"],
+)
+
+def _with_import_macro_bootstrapping_mode_impl(ctx):
+ target = ctx.attr.target[0]
+ return [target[rust_common.crate_info], target[rust_common.dep_info]]
+
+with_import_macro_bootstrapping_mode = rule(
+ implementation = _with_import_macro_bootstrapping_mode_impl,
+ attrs = {
+ "target": attr.label(
+ cfg = import_macro_dep_bootstrap_transition,
+ allow_single_file = True,
+ mandatory = True,
+ executable = False,
+ ),
+ "_allowlist_function_transition": attr.label(
+ default = Label("//tools/allowlists/function_transition_allowlist"),
+ ),
+ },
+)
+
+def _without_process_wrapper_transition_impl(_settings, _attr):
+ """This transition allows rust_* rules to invoke rustc without process_wrapper."""
+ return {
+ "//rust/settings:use_process_wrapper": False,
+ }
+
+without_process_wrapper_transition = transition(
+ implementation = _without_process_wrapper_transition_impl,
+ inputs = [],
+ outputs = ["//rust/settings:use_process_wrapper"],
+)
+
+def _without_process_wrapper_impl(ctx):
+ executable = ctx.executable.target
+ link_name = ctx.label.name
+
+ # Append .exe if on windows
+ if executable.extension:
+ link_name = link_name + "." + executable.extension
+ link = ctx.actions.declare_file(link_name)
+ ctx.actions.symlink(
+ output = link,
+ target_file = executable,
+ )
+ return [
+ DefaultInfo(
+ executable = link,
+ ),
+ ]
+
+without_process_wrapper = rule(
+ implementation = _without_process_wrapper_impl,
+ attrs = {
+ "target": attr.label(
+ cfg = without_process_wrapper_transition,
+ allow_single_file = True,
+ mandatory = True,
+ executable = True,
+ ),
+ "_allowlist_function_transition": attr.label(
+ default = Label("//tools/allowlists/function_transition_allowlist"),
+ ),
+ },
+)
diff --git a/rust/private/utils.bzl b/rust/private/utils.bzl
new file mode 100644
index 0000000..fa7318b
--- /dev/null
+++ b/rust/private/utils.bzl
@@ -0,0 +1,576 @@
+# Copyright 2015 The Bazel Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Utility functions not specific to the rust toolchain."""
+
+load("@bazel_tools//tools/cpp:toolchain_utils.bzl", find_rules_cc_toolchain = "find_cpp_toolchain")
+load(":providers.bzl", "BuildInfo", "CrateInfo", "DepInfo", "DepVariantInfo")
+
+def find_toolchain(ctx):
+ """Finds the first rust toolchain that is configured.
+
+ Args:
+ ctx (ctx): The ctx object for the current target.
+
+ Returns:
+ rust_toolchain: A Rust toolchain context.
+ """
+ return ctx.toolchains[Label("//rust:toolchain")]
+
+def find_cc_toolchain(ctx):
+ """Extracts a CcToolchain from the current target's context
+
+ Args:
+ ctx (ctx): The current target's rule context object
+
+ Returns:
+ tuple: A tuple of (CcToolchain, FeatureConfiguration)
+ """
+ cc_toolchain = find_rules_cc_toolchain(ctx)
+
+ feature_configuration = cc_common.configure_features(
+ ctx = ctx,
+ cc_toolchain = cc_toolchain,
+ requested_features = ctx.features,
+ unsupported_features = ctx.disabled_features,
+ )
+ return cc_toolchain, feature_configuration
+
+# TODO: Replace with bazel-skylib's `path.dirname`. This requires addressing some
+# dependency issues or generating docs will break.
+def relativize(path, start):
+ """Returns the relative path from start to path.
+
+ Args:
+ path (str): The path to relativize.
+ start (str): The ancestor path against which to relativize.
+
+ Returns:
+ str: The portion of `path` that is relative to `start`.
+ """
+ src_parts = _path_parts(start)
+ dest_parts = _path_parts(path)
+ n = 0
+ for src_part, dest_part in zip(src_parts, dest_parts):
+ if src_part != dest_part:
+ break
+ n += 1
+
+ relative_path = ""
+ for _ in range(n, len(src_parts)):
+ relative_path += "../"
+ relative_path += "/".join(dest_parts[n:])
+
+ return relative_path
+
+def _path_parts(path):
+ """Takes a path and returns a list of its parts with all "." elements removed.
+
+ The main use case of this function is if one of the inputs to relativize()
+ is a relative path, such as "./foo".
+
+ Args:
+ path (str): A string representing a unix path
+
+ Returns:
+ list: A list containing the path parts with all "." elements removed.
+ """
+ path_parts = path.split("/")
+ return [part for part in path_parts if part != "."]
+
+def get_lib_name(lib):
+ """Returns the name of a library artifact, eg. libabc.a -> abc
+
+ Args:
+ lib (File): A library file
+
+ Returns:
+ str: The name of the library
+ """
+ # On macos and windows, dynamic/static libraries always end with the
+ # extension and potential versions will be before the extension, and should
+ # be part of the library name.
+ # On linux, the version usually comes after the extension.
+ # So regardless of the platform we want to find the extension and make
+ # everything left to it the library name.
+
+ # Search for the extension - starting from the right - by removing any
+ # trailing digit.
+ comps = lib.basename.split(".")
+ for comp in reversed(comps):
+ if comp.isdigit():
+ comps.pop()
+ else:
+ break
+
+ # The library name is now everything minus the extension.
+ libname = ".".join(comps[:-1])
+
+ if libname.startswith("lib"):
+ return libname[3:]
+ else:
+ return libname
+
+def abs(value):
+ """Returns the absolute value of a number.
+
+ Args:
+ value (int): A number.
+
+ Returns:
+ int: The absolute value of the number.
+ """
+ if value < 0:
+ return -value
+ return value
+
+def determine_output_hash(crate_root, label):
+ """Generates a hash of the crate root file's path.
+
+ Args:
+ crate_root (File): The crate's root file (typically `lib.rs`).
+ label (Label): The label of the target.
+
+ Returns:
+ str: A string representation of the hash.
+ """
+
+ # Take the absolute value of hash() since it could be negative.
+ h = abs(hash(crate_root.path) + hash(repr(label)))
+ return repr(h)
+
+def get_preferred_artifact(library_to_link, use_pic):
+ """Get the first available library to link from a LibraryToLink object.
+
+ Args:
+ library_to_link (LibraryToLink): See the followg links for additional details:
+ https://docs.bazel.build/versions/master/skylark/lib/LibraryToLink.html
+ use_pic: If set, prefers pic_static_library over static_library.
+
+ Returns:
+ File: Returns the first valid library type (only one is expected)
+ """
+ if use_pic:
+ return (
+ library_to_link.pic_static_library or
+ library_to_link.interface_library or
+ library_to_link.dynamic_library
+ )
+ else:
+ return (
+ library_to_link.static_library or
+ library_to_link.pic_static_library or
+ library_to_link.interface_library or
+ library_to_link.dynamic_library
+ )
+
+def _expand_location(ctx, env, data):
+ """A trivial helper for `_expand_locations`
+
+ Args:
+ ctx (ctx): The rule's context object
+ env (str): The value possibly containing location macros to expand.
+ data (sequence of Targets): see `_expand_locations`
+
+ Returns:
+ string: The location-macro expanded version of the string.
+ """
+ for directive in ("$(execpath ", "$(location "):
+ if directive in env:
+ # build script runner will expand pwd to execroot for us
+ env = env.replace(directive, "${pwd}/" + directive)
+ return ctx.expand_location(env, data)
+
+def expand_dict_value_locations(ctx, env, data):
+ """Performs location-macro expansion on string values.
+
+ $(execroot ...) and $(location ...) are prefixed with ${pwd},
+ which process_wrapper and build_script_runner will expand at run time
+ to the absolute path. This is necessary because include_str!() is relative
+ to the currently compiled file, and build scripts run relative to the
+ manifest dir, so we can not use execroot-relative paths.
+
+ $(rootpath ...) is unmodified, and is useful for passing in paths via
+ rustc_env that are encoded in the binary with env!(), but utilized at
+ runtime, such as in tests. The absolute paths are not usable in this case,
+ as compilation happens in a separate sandbox folder, so when it comes time
+ to read the file at runtime, the path is no longer valid.
+
+ See [`expand_location`](https://docs.bazel.build/versions/main/skylark/lib/ctx.html#expand_location) for detailed documentation.
+
+ Args:
+ ctx (ctx): The rule's context object
+ env (dict): A dict whose values we iterate over
+ data (sequence of Targets): The targets which may be referenced by
+ location macros. This is expected to be the `data` attribute of
+ the target, though may have other targets or attributes mixed in.
+
+ Returns:
+ dict: A dict of environment variables with expanded location macros
+ """
+ return dict([(k, _expand_location(ctx, v, data)) for (k, v) in env.items()])
+
+def expand_list_element_locations(ctx, args, data):
+ """Performs location-macro expansion on a list of string values.
+
+ $(execroot ...) and $(location ...) are prefixed with ${pwd},
+ which process_wrapper and build_script_runner will expand at run time
+ to the absolute path.
+
+ See [`expand_location`](https://docs.bazel.build/versions/main/skylark/lib/ctx.html#expand_location) for detailed documentation.
+
+ Args:
+ ctx (ctx): The rule's context object
+ args (list): A list we iterate over
+ data (sequence of Targets): The targets which may be referenced by
+ location macros. This is expected to be the `data` attribute of
+ the target, though may have other targets or attributes mixed in.
+
+ Returns:
+ list: A list of arguments with expanded location macros
+ """
+ return [_expand_location(ctx, arg, data) for arg in args]
+
+def name_to_crate_name(name):
+ """Converts a build target's name into the name of its associated crate.
+
+ Crate names cannot contain certain characters, such as -, which are allowed
+ in build target names. All illegal characters will be converted to
+ underscores.
+
+ This is a similar conversion as that which cargo does, taking a
+ `Cargo.toml`'s `package.name` and canonicalizing it
+
+ Note that targets can specify the `crate_name` attribute to customize their
+ crate name; in situations where this is important, use the
+ compute_crate_name() function instead.
+
+ Args:
+ name (str): The name of the target.
+
+ Returns:
+ str: The name of the crate for this target.
+ """
+ return name.replace("-", "_")
+
+def _invalid_chars_in_crate_name(name):
+ """Returns any invalid chars in the given crate name.
+
+ Args:
+ name (str): Name to test.
+
+ Returns:
+ list: List of invalid characters in the crate name.
+ """
+
+ return dict([(c, ()) for c in name.elems() if not (c.isalnum() or c == "_")]).keys()
+
+def compute_crate_name(workspace_name, label, toolchain, name_override = None):
+ """Returns the crate name to use for the current target.
+
+ Args:
+ workspace_name (string): The current workspace name.
+ label (struct): The label of the current target.
+ toolchain (struct): The toolchain in use for the target.
+ name_override (String): An optional name to use (as an override of label.name).
+
+ Returns:
+ str: The crate name to use for this target.
+ """
+ if name_override:
+ invalid_chars = _invalid_chars_in_crate_name(name_override)
+ if invalid_chars:
+ fail("Crate name '{}' contains invalid character(s): {}".format(
+ name_override,
+ " ".join(invalid_chars),
+ ))
+ return name_override
+
+ if (toolchain and label and toolchain._rename_first_party_crates and
+ should_encode_label_in_crate_name(workspace_name, label, toolchain._third_party_dir)):
+ crate_name = encode_label_as_crate_name(label.package, label.name)
+ else:
+ crate_name = name_to_crate_name(label.name)
+
+ invalid_chars = _invalid_chars_in_crate_name(crate_name)
+ if invalid_chars:
+ fail(
+ "Crate name '{}' ".format(crate_name) +
+ "derived from Bazel target name '{}' ".format(label.name) +
+ "contains invalid character(s): {}\n".format(" ".join(invalid_chars)) +
+ "Consider adding a crate_name attribute to set a valid crate name",
+ )
+ return crate_name
+
+def dedent(doc_string):
+ """Remove any common leading whitespace from every line in text.
+
+ This functionality is similar to python's `textwrap.dedent` functionality
+ https://docs.python.org/3/library/textwrap.html#textwrap.dedent
+
+ Args:
+ doc_string (str): A docstring style string
+
+ Returns:
+ str: A string optimized for stardoc rendering
+ """
+ lines = doc_string.splitlines()
+ if not lines:
+ return doc_string
+
+ # If the first line is empty, use the second line
+ first_line = lines[0]
+ if not first_line:
+ first_line = lines[1]
+
+ # Detect how much space prepends the first line and subtract that from all lines
+ space_count = len(first_line) - len(first_line.lstrip())
+
+ # If there are no leading spaces, do not alter the docstring
+ if space_count == 0:
+ return doc_string
+ else:
+ # Remove the leading block of spaces from the current line
+ block = " " * space_count
+ return "\n".join([line.replace(block, "", 1).rstrip() for line in lines])
+
+def make_static_lib_symlink(actions, rlib_file):
+ """Add a .a symlink to an .rlib file.
+
+ The name of the symlink is derived from the <name> of the <name>.rlib file as follows:
+ * `<name>.a`, if <name> starts with `lib`
+ * `lib<name>.a`, otherwise.
+
+ For example, the name of the symlink for
+ * `libcratea.rlib` is `libcratea.a`
+ * `crateb.rlib` is `libcrateb.a`.
+
+ Args:
+ actions (actions): The rule's context actions object.
+ rlib_file (File): The file to symlink, which must end in .rlib.
+
+ Returns:
+ The symlink's File.
+ """
+ if not rlib_file.basename.endswith(".rlib"):
+ fail("file is not an .rlib: ", rlib_file.basename)
+ basename = rlib_file.basename[:-5]
+ if not basename.startswith("lib"):
+ basename = "lib" + basename
+ dot_a = actions.declare_file(basename + ".a", sibling = rlib_file)
+ actions.symlink(output = dot_a, target_file = rlib_file)
+ return dot_a
+
+def is_exec_configuration(ctx):
+ """Determine if a context is building for the exec configuration.
+
+ This is helpful when processing command line flags that should apply
+ to the target configuration but not the exec configuration.
+
+ Args:
+ ctx (ctx): The ctx object for the current target.
+
+ Returns:
+ True if the exec configuration is detected, False otherwise.
+ """
+
+ # TODO(djmarcin): Is there any better way to determine cfg=exec?
+ return ctx.genfiles_dir.path.find("-exec-") != -1
+
+def transform_deps(deps):
+ """Transforms a [Target] into [DepVariantInfo].
+
+ This helper function is used to transform ctx.attr.deps and ctx.attr.proc_macro_deps into
+ [DepVariantInfo].
+
+ Args:
+ deps (list of Targets): Dependencies coming from ctx.attr.deps or ctx.attr.proc_macro_deps
+
+ Returns:
+ list of DepVariantInfos.
+ """
+ return [DepVariantInfo(
+ crate_info = dep[CrateInfo] if CrateInfo in dep else None,
+ dep_info = dep[DepInfo] if DepInfo in dep else None,
+ build_info = dep[BuildInfo] if BuildInfo in dep else None,
+ cc_info = dep[CcInfo] if CcInfo in dep else None,
+ ) for dep in deps]
+
+def get_import_macro_deps(ctx):
+ """Returns a list of targets to be added to proc_macro_deps.
+
+ Args:
+ ctx (struct): the ctx of the current target.
+
+ Returns:
+ list of Targets. Either empty (if the fake import macro implementation
+ is being used), or a singleton list with the real implementation.
+ """
+ if ctx.attr._import_macro_dep.label.name == "fake_import_macro_impl":
+ return []
+
+ return [ctx.attr._import_macro_dep]
+
+def should_encode_label_in_crate_name(workspace_name, label, third_party_dir):
+ """Determines if the crate's name should include the Bazel label, encoded.
+
+ Crate names may only encode the label if the target is in the current repo,
+ the target is not in the third_party_dir, and the current repo is not
+ rules_rust.
+
+ Args:
+ workspace_name (string): The name of the current workspace.
+ label (Label): The package in question.
+ third_party_dir (string): The directory in which third-party packages are kept.
+
+ Returns:
+ True if the crate name should encode the label, False otherwise.
+ """
+
+ # TODO(hlopko): This code assumes a monorepo; make it work with external
+ # repositories as well.
+ return (
+ workspace_name != "rules_rust" and
+ not label.workspace_root and
+ not ("//" + label.package + "/").startswith(third_party_dir + "/")
+ )
+
+# This is a list of pairs, where the first element of the pair is a character
+# that is allowed in Bazel package or target names but not in crate names; and
+# the second element is an encoding of that char suitable for use in a crate
+# name.
+_encodings = (
+ (":", "colon"),
+ ("!", "bang"),
+ ("%", "percent"),
+ ("@", "at"),
+ ("^", "caret"),
+ ("`", "backtick"),
+ (" ", "space"),
+ ("\"", "quote"),
+ ("#", "hash"),
+ ("$", "dollar"),
+ ("&", "ampersand"),
+ ("'", "backslash"),
+ ("(", "lparen"),
+ (")", "rparen"),
+ ("*", "star"),
+ ("-", "dash"),
+ ("+", "plus"),
+ (",", "comma"),
+ (";", "semicolon"),
+ ("<", "langle"),
+ ("=", "equal"),
+ (">", "rangle"),
+ ("?", "question"),
+ ("[", "lbracket"),
+ ("]", "rbracket"),
+ ("{", "lbrace"),
+ ("|", "pipe"),
+ ("}", "rbrace"),
+ ("~", "tilde"),
+ ("/", "slash"),
+ (".", "dot"),
+)
+
+# For each of the above encodings, we generate two substitution rules: one that
+# ensures any occurrences of the encodings themselves in the package/target
+# aren't clobbered by this translation, and one that does the encoding itself.
+# We also include a rule that protects the clobbering-protection rules from
+# getting clobbered.
+_substitutions = [("_quote", "_quotequote_")] + [
+ subst
+ for (pattern, replacement) in _encodings
+ for subst in (
+ ("_{}_".format(replacement), "_quote{}_".format(replacement)),
+ (pattern, "_{}_".format(replacement)),
+ )
+]
+
+def encode_label_as_crate_name(package, name):
+ """Encodes the package and target names in a format suitable for a crate name.
+
+ Args:
+ package (string): The package of the target in question.
+ name (string): The name of the target in question.
+
+ Returns:
+ A string that encodes the package and target name, to be used as the crate's name.
+ """
+ full_name = package + ":" + name
+ return _replace_all(full_name, _substitutions)
+
+def decode_crate_name_as_label_for_testing(crate_name):
+ """Decodes a crate_name that was encoded by encode_label_as_crate_name.
+
+ This is used to check that the encoding is bijective; it is expected to only
+ be used in tests.
+
+ Args:
+ crate_name (string): The name of the crate.
+
+ Returns:
+ A string representing the Bazel label (package and target).
+ """
+ return _replace_all(crate_name, [(t[1], t[0]) for t in _substitutions])
+
+def _replace_all(string, substitutions):
+ """Replaces occurrences of the given patterns in `string`.
+
+ There are a few reasons this looks complicated:
+ * The substitutions are performed with some priority, i.e. patterns that are
+ listed first in `substitutions` are higher priority than patterns that are
+ listed later.
+ * We also take pains to avoid doing replacements that overlap with each
+ other, since overlaps invalidate pattern matches.
+ * To avoid hairy offset invalidation, we apply the substitutions
+ right-to-left.
+ * To avoid the "_quote" -> "_quotequote_" rule introducing new pattern
+ matches later in the string during decoding, we take the leftmost
+ replacement, in cases of overlap. (Note that no rule can induce new
+ pattern matches *earlier* in the string.) (E.g. "_quotedot_" encodes to
+ "_quotequote_dot_". Note that "_quotequote_" and "_dot_" both occur in
+ this string, and overlap.).
+
+ Args:
+ string (string): the string in which the replacements should be performed.
+ substitutions: the list of patterns and replacements to apply.
+
+ Returns:
+ A string with the appropriate substitutions performed.
+ """
+
+ # Find the highest-priority pattern matches for each string index, going
+ # left-to-right and skipping indices that are already involved in a
+ # pattern match.
+ plan = {}
+ matched_indices_set = {}
+ for pattern_start in range(len(string)):
+ if pattern_start in matched_indices_set:
+ continue
+ for (pattern, replacement) in substitutions:
+ if not string.startswith(pattern, pattern_start):
+ continue
+ length = len(pattern)
+ plan[pattern_start] = (length, replacement)
+ matched_indices_set.update([(pattern_start + i, True) for i in range(length)])
+ break
+
+ # Execute the replacement plan, working from right to left.
+ for pattern_start in sorted(plan.keys(), reverse = True):
+ length, replacement = plan[pattern_start]
+ after_pattern = pattern_start + length
+ string = string[:pattern_start] + replacement + string[after_pattern:]
+
+ return string
diff --git a/rust/repositories.bzl b/rust/repositories.bzl
new file mode 100644
index 0000000..99f2f51
--- /dev/null
+++ b/rust/repositories.bzl
@@ -0,0 +1,368 @@
+# buildifier: disable=module-docstring
+load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
+load("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe")
+load("//rust/private:common.bzl", "rust_common")
+load(
+ "//rust/private:repository_utils.bzl",
+ "BUILD_for_toolchain",
+ "DEFAULT_STATIC_RUST_URL_TEMPLATES",
+ "DEFAULT_TOOLCHAIN_NAME_PREFIX",
+ "check_version_valid",
+ "load_llvm_tools",
+ "load_rust_compiler",
+ "load_rust_src",
+ "load_rust_stdlib",
+ "load_rustc_dev_nightly",
+ "load_rustfmt",
+ "should_include_rustc_srcs",
+ _load_arbitrary_tool = "load_arbitrary_tool",
+)
+
+# Reexport `load_arbitrary_tool` as it's currently in use in https://github.com/google/cargo-raze
+load_arbitrary_tool = _load_arbitrary_tool
+
+# Note: Code in `.github/workflows/crate_universe.yaml` looks for this line, if you remove it or change its format, you will also need to update that code.
+DEFAULT_TOOLCHAIN_TRIPLES = {
+ "aarch64-apple-darwin": "rust_darwin_aarch64",
+ "aarch64-unknown-linux-gnu": "rust_linux_aarch64",
+ "x86_64-apple-darwin": "rust_darwin_x86_64",
+ "x86_64-pc-windows-msvc": "rust_windows_x86_64",
+ "x86_64-unknown-freebsd": "rust_freebsd_x86_64",
+ "x86_64-unknown-linux-gnu": "rust_linux_x86_64",
+}
+
+def rules_rust_dependencies():
+ """Dependencies used in the implementation of `rules_rust`."""
+ maybe(
+ http_archive,
+ name = "rules_cc",
+ urls = ["https://github.com/bazelbuild/rules_cc/releases/download/0.0.1/rules_cc-0.0.1.tar.gz"],
+ sha256 = "4dccbfd22c0def164c8f47458bd50e0c7148f3d92002cdb459c2a96a68498241",
+ )
+
+ maybe(
+ http_archive,
+ name = "bazel_skylib",
+ urls = [
+ "https://github.com/bazelbuild/bazel-skylib/releases/download/1.2.0/bazel-skylib-1.2.0.tar.gz",
+ "https://mirror.bazel.build/github.com/bazelbuild/bazel-skylib/releases/download/1.2.0/bazel-skylib-1.2.0.tar.gz",
+ ],
+ sha256 = "af87959afe497dc8dfd4c6cb66e1279cb98ccc84284619ebfec27d9c09a903de",
+ )
+
+ # Make the iOS simulator constraint available, which is referenced in abi_to_constraints()
+ # rules_rust does not require this dependency; it is just imported as a convenience for users.
+ maybe(
+ http_archive,
+ name = "build_bazel_apple_support",
+ sha256 = "76df040ade90836ff5543888d64616e7ba6c3a7b33b916aa3a4b68f342d1b447",
+ url = "https://github.com/bazelbuild/apple_support/releases/download/0.11.0/apple_support.0.11.0.tar.gz",
+ )
+
+# buildifier: disable=unnamed-macro
+def rust_register_toolchains(
+ dev_components = False,
+ edition = None,
+ include_rustc_srcs = False,
+ iso_date = None,
+ register_toolchains = True,
+ rustfmt_version = None,
+ sha256s = None,
+ extra_target_triples = ["wasm32-unknown-unknown", "wasm32-wasi"],
+ urls = DEFAULT_STATIC_RUST_URL_TEMPLATES,
+ version = rust_common.default_version):
+ """Emits a default set of toolchains for Linux, MacOS, and Freebsd
+
+ Skip this macro and call the `rust_repository_set` macros directly if you need a compiler for \
+ other hosts or for additional target triples.
+
+ The `sha256` attribute represents a dict associating tool subdirectories to sha256 hashes. As an example:
+ ```python
+ {
+ "rust-1.46.0-x86_64-unknown-linux-gnu": "e3b98bc3440fe92817881933f9564389eccb396f5f431f33d48b979fa2fbdcf5",
+ "rustfmt-1.4.12-x86_64-unknown-linux-gnu": "1894e76913303d66bf40885a601462844eec15fca9e76a6d13c390d7000d64b0",
+ "rust-std-1.46.0-x86_64-unknown-linux-gnu": "ac04aef80423f612c0079829b504902de27a6997214eb58ab0765d02f7ec1dbc",
+ }
+ ```
+ This would match for `exec_triple = "x86_64-unknown-linux-gnu"`. If not specified, rules_rust pulls from a non-exhaustive \
+ list of known checksums..
+
+ See `load_arbitrary_tool` in `@rules_rust//rust:repositories.bzl` for more details.
+
+ Args:
+ dev_components (bool, optional): Whether to download the rustc-dev components (defaults to False). Requires version to be "nightly".
+ edition (str, optional): The rust edition to be used by default (2015, 2018 (default), or 2021)
+ include_rustc_srcs (bool, optional): Whether to download rustc's src code. This is required in order to use rust-analyzer support.
+ See [rust_toolchain_repository.include_rustc_srcs](#rust_toolchain_repository-include_rustc_srcs). for more details
+ iso_date (str, optional): The date of the nightly or beta release (ignored if the version is a specific version).
+ register_toolchains (bool): If true, repositories will be generated to produce and register `rust_toolchain` targets.
+ rustfmt_version (str, optional): The version of rustfmt. Either "nightly", "beta", or an exact version. Defaults to `version` if not specified.
+ sha256s (str, optional): A dict associating tool subdirectories to sha256 hashes.
+ extra_target_triples (list, optional): Additional rust-style targets that rust toolchains should support.
+ urls (list, optional): A list of mirror urls containing the tools from the Rust-lang static file server. These must contain the '{}' used to substitute the tool being fetched (using .format).
+ version (str, optional): The version of Rust. Either "nightly", "beta", or an exact version. Defaults to a modern version.
+ """
+ if dev_components and version != "nightly":
+ fail("Rust version must be set to \"nightly\" to enable rustc-dev components")
+
+ if not rustfmt_version:
+ rustfmt_version = version
+
+ for exec_triple, name in DEFAULT_TOOLCHAIN_TRIPLES.items():
+ maybe(
+ rust_repository_set,
+ name = name,
+ dev_components = dev_components,
+ edition = edition,
+ exec_triple = exec_triple,
+ extra_target_triples = extra_target_triples,
+ include_rustc_srcs = include_rustc_srcs,
+ iso_date = iso_date,
+ register_toolchain = register_toolchains,
+ rustfmt_version = rustfmt_version,
+ sha256s = sha256s,
+ urls = urls,
+ version = version,
+ )
+
+# buildifier: disable=unnamed-macro
+def rust_repositories(**kwargs):
+ """**Deprecated**: Use [rules_rust_dependencies](#rules_rust_dependencies) \
+ and [rust_register_toolchains](#rust_register_toolchains) directly.
+
+ Args:
+ **kwargs (dict): Keyword arguments for the `rust_register_toolchains` macro.
+ """
+ rules_rust_dependencies()
+
+ rust_register_toolchains(**kwargs)
+
+def _rust_toolchain_repository_impl(ctx):
+ """The implementation of the rust toolchain repository rule."""
+
+ check_version_valid(ctx.attr.version, ctx.attr.iso_date)
+
+ # Conditionally download rustc sources. Generally used for `rust-analyzer`
+ if should_include_rustc_srcs(ctx):
+ load_rust_src(ctx)
+
+ build_components = [load_rust_compiler(ctx)]
+
+ if ctx.attr.rustfmt_version:
+ build_components.append(load_rustfmt(ctx))
+
+ # Rust 1.45.0 and nightly builds after 2020-05-22 need the llvm-tools gzip to get the libLLVM dylib
+ if ctx.attr.version >= "1.45.0" or (ctx.attr.version == "nightly" and ctx.attr.iso_date > "2020-05-22"):
+ load_llvm_tools(ctx, ctx.attr.exec_triple)
+
+ for target_triple in [ctx.attr.exec_triple] + ctx.attr.extra_target_triples:
+ build_components.append(load_rust_stdlib(ctx, target_triple))
+
+ # extra_target_triples contains targets such as wasm, which don't have rustc_dev components
+ if ctx.attr.dev_components and target_triple not in ctx.attr.extra_target_triples:
+ load_rustc_dev_nightly(ctx, target_triple)
+
+ ctx.file("WORKSPACE.bazel", "")
+ ctx.file("BUILD.bazel", "\n".join(build_components))
+
+def _rust_toolchain_repository_proxy_impl(ctx):
+ build_components = []
+ for target_triple in [ctx.attr.exec_triple] + ctx.attr.extra_target_triples:
+ build_components.append(BUILD_for_toolchain(
+ name = "{toolchain_prefix}_{target_triple}".format(
+ toolchain_prefix = ctx.attr.toolchain_name_prefix,
+ target_triple = target_triple,
+ ),
+ exec_triple = ctx.attr.exec_triple,
+ parent_workspace_name = ctx.attr.parent_workspace_name,
+ target_triple = target_triple,
+ ))
+
+ ctx.file("WORKSPACE.bazel", "")
+ ctx.file("BUILD.bazel", "\n".join(build_components))
+
+rust_toolchain_repository = repository_rule(
+ doc = (
+ "Composes a single workspace containing the toolchain components for compiling on a given " +
+ "platform to a series of target platforms.\n" +
+ "\n" +
+ "A given instance of this rule should be accompanied by a rust_toolchain_repository_proxy " +
+ "invocation to declare its toolchains to Bazel; the indirection allows separating toolchain " +
+ "selection from toolchain fetching."
+ ),
+ attrs = {
+ "auth": attr.string_dict(
+ doc = (
+ "Auth object compatible with repository_ctx.download to use when downloading files. " +
+ "See [repository_ctx.download](https://docs.bazel.build/versions/main/skylark/lib/repository_ctx.html#download) for more details."
+ ),
+ ),
+ "dev_components": attr.bool(
+ doc = "Whether to download the rustc-dev components (defaults to False). Requires version to be \"nightly\".",
+ default = False,
+ ),
+ "edition": attr.string(
+ doc = "The rust edition to be used by default.",
+ default = rust_common.default_edition,
+ ),
+ "exec_triple": attr.string(
+ doc = "The Rust-style target that this compiler runs on",
+ mandatory = True,
+ ),
+ "extra_target_triples": attr.string_list(
+ doc = "Additional rust-style targets that this set of toolchains should support.",
+ ),
+ "include_rustc_srcs": attr.bool(
+ doc = (
+ "Whether to download and unpack the rustc source files. These are very large, and " +
+ "slow to unpack, but are required to support rust analyzer. An environment variable " +
+ "`RULES_RUST_TOOLCHAIN_INCLUDE_RUSTC_SRCS` can also be used to control this attribute. " +
+ "This variable will take precedence over the hard coded attribute. Setting it to `true` to " +
+ "activates this attribute where all other values deactivate it."
+ ),
+ default = False,
+ ),
+ "iso_date": attr.string(
+ doc = "The date of the tool (or None, if the version is a specific version).",
+ ),
+ "rustfmt_version": attr.string(
+ doc = "The version of the tool among \"nightly\", \"beta\", or an exact version.",
+ ),
+ "sha256s": attr.string_dict(
+ doc = "A dict associating tool subdirectories to sha256 hashes. See [rust_repositories](#rust_repositories) for more details.",
+ ),
+ "toolchain_name_prefix": attr.string(
+ doc = "The per-target prefix expected for the rust_toolchain declarations in the parent workspace.",
+ ),
+ "urls": attr.string_list(
+ doc = "A list of mirror urls containing the tools from the Rust-lang static file server. These must contain the '{}' used to substitute the tool being fetched (using .format).",
+ default = DEFAULT_STATIC_RUST_URL_TEMPLATES,
+ ),
+ "version": attr.string(
+ doc = "The version of the tool among \"nightly\", \"beta\", or an exact version.",
+ mandatory = True,
+ ),
+ },
+ implementation = _rust_toolchain_repository_impl,
+ environ = ["RULES_RUST_TOOLCHAIN_INCLUDE_RUSTC_SRCS"],
+)
+
+rust_toolchain_repository_proxy = repository_rule(
+ doc = (
+ "Generates a toolchain-bearing repository that declares the toolchains from some other " +
+ "rust_toolchain_repository."
+ ),
+ attrs = {
+ "exec_triple": attr.string(
+ doc = "The Rust-style target triple for the compilation platform",
+ mandatory = True,
+ ),
+ "extra_target_triples": attr.string_list(
+ doc = "The Rust-style triples for extra compilation targets",
+ ),
+ "parent_workspace_name": attr.string(
+ doc = "The name of the other rust_toolchain_repository",
+ mandatory = True,
+ ),
+ "toolchain_name_prefix": attr.string(
+ doc = "The per-target prefix expected for the rust_toolchain declarations in the parent workspace.",
+ ),
+ },
+ implementation = _rust_toolchain_repository_proxy_impl,
+)
+
+def rust_repository_set(
+ name,
+ version,
+ exec_triple,
+ include_rustc_srcs = False,
+ extra_target_triples = [],
+ iso_date = None,
+ rustfmt_version = None,
+ edition = None,
+ dev_components = False,
+ sha256s = None,
+ urls = DEFAULT_STATIC_RUST_URL_TEMPLATES,
+ auth = None,
+ register_toolchain = True):
+ """Assembles a remote repository for the given toolchain params, produces a proxy repository \
+ to contain the toolchain declaration, and registers the toolchains.
+
+ N.B. A "proxy repository" is needed to allow for registering the toolchain (with constraints) \
+ without actually downloading the toolchain.
+
+ Args:
+ name (str): The name of the generated repository
+ version (str): The version of the tool among "nightly", "beta', or an exact version.
+ exec_triple (str): The Rust-style target that this compiler runs on
+ include_rustc_srcs (bool, optional): Whether to download rustc's src code. This is required in order to use rust-analyzer support. Defaults to False.
+ extra_target_triples (list, optional): Additional rust-style targets that this set of
+ toolchains should support. Defaults to [].
+ iso_date (str, optional): The date of the tool. Defaults to None.
+ rustfmt_version (str, optional): The version of rustfmt to be associated with the
+ toolchain. Defaults to None.
+ edition (str, optional): The rust edition to be used by default (2015, 2018 (if None), or 2021).
+ dev_components (bool, optional): Whether to download the rustc-dev components.
+ Requires version to be "nightly". Defaults to False.
+ sha256s (str, optional): A dict associating tool subdirectories to sha256 hashes. See
+ [rust_repositories](#rust_repositories) for more details.
+ urls (list, optional): A list of mirror urls containing the tools from the Rust-lang static file server. These must contain the '{}' used to substitute the tool being fetched (using .format). Defaults to ['https://static.rust-lang.org/dist/{}.tar.gz']
+ auth (dict): Auth object compatible with repository_ctx.download to use when downloading files.
+ See [repository_ctx.download](https://docs.bazel.build/versions/main/skylark/lib/repository_ctx.html#download) for more details.
+ register_toolchain (bool): If True, the generated `rust_toolchain` target will become a registered toolchain.
+ """
+
+ rust_toolchain_repository(
+ name = name,
+ exec_triple = exec_triple,
+ include_rustc_srcs = include_rustc_srcs,
+ extra_target_triples = extra_target_triples,
+ iso_date = iso_date,
+ toolchain_name_prefix = DEFAULT_TOOLCHAIN_NAME_PREFIX,
+ version = version,
+ rustfmt_version = rustfmt_version,
+ edition = edition,
+ dev_components = dev_components,
+ sha256s = sha256s,
+ urls = urls,
+ auth = auth,
+ )
+
+ rust_toolchain_repository_proxy(
+ name = name + "_toolchains",
+ exec_triple = exec_triple,
+ extra_target_triples = extra_target_triples,
+ parent_workspace_name = name,
+ toolchain_name_prefix = DEFAULT_TOOLCHAIN_NAME_PREFIX,
+ )
+
+ all_toolchain_names = []
+ for target_triple in [exec_triple] + extra_target_triples:
+ all_toolchain_names.append("@{name}_toolchains//:{toolchain_name_prefix}_{triple}".format(
+ name = name,
+ toolchain_name_prefix = DEFAULT_TOOLCHAIN_NAME_PREFIX,
+ triple = target_triple,
+ ))
+
+ # Register toolchains
+ if register_toolchain:
+ native.register_toolchains(*all_toolchain_names)
+ native.register_toolchains(str(Label("//rust/private/dummy_cc_toolchain:dummy_cc_wasm32_toolchain")))
+
+ # Inform users that they should be using the canonical name if it's not detected
+ if "rules_rust" not in native.existing_rules():
+ message = "\n" + ("=" * 79) + "\n"
+ message += (
+ "It appears that you are trying to import rules_rust without using its\n" +
+ "canonical name, \"@rules_rust\" Please change your WORKSPACE file to\n" +
+ "import this repo with `name = \"rules_rust\"` instead."
+ )
+
+ if "io_bazel_rules_rust" in native.existing_rules():
+ message += "\n\n" + (
+ "Note that the previous name of \"@io_bazel_rules_rust\" is deprecated.\n" +
+ "See https://github.com/bazelbuild/rules_rust/issues/499 for context."
+ )
+
+ message += "\n" + ("=" * 79)
+ fail(message)
diff --git a/rust/rust_common.bzl b/rust/rust_common.bzl
new file mode 100644
index 0000000..4777ba1
--- /dev/null
+++ b/rust/rust_common.bzl
@@ -0,0 +1,20 @@
+# Copyright 2015 The Bazel Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Module with Rust definitions required to write custom Rust rules."""
+
+load("//rust/private:providers.bzl", _ClippyInfo = "ClippyInfo", _CrateInfo = "CrateInfo")
+
+CrateInfo = _CrateInfo
+ClippyInfo = _ClippyInfo
diff --git a/rust/settings/BUILD.bazel b/rust/settings/BUILD.bazel
new file mode 100644
index 0000000..474237a
--- /dev/null
+++ b/rust/settings/BUILD.bazel
@@ -0,0 +1,49 @@
+load("@bazel_skylib//:bzl_library.bzl", "bzl_library")
+load("@bazel_skylib//rules:common_settings.bzl", "bool_flag", "string_flag")
+
+package(default_visibility = ["//visibility:public"])
+
+# A flag controlling whether to rename first-party crates such that their names
+# encode the Bazel package and target name, instead of just the target name.
+#
+# First-party vs. third-party crates are identified using the value of
+# //settings:third_party_dir.
+bool_flag(
+ name = "rename_first_party_crates",
+ build_setting_default = False,
+)
+
+# A flag specifying the location of vendored third-party rust crates within this
+# repository that must not be renamed when `rename_first_party_crates` is enabled.
+#
+# Must be specified as a Bazel package, e.g. "//some/location/in/repo".
+string_flag(
+ name = "third_party_dir",
+ build_setting_default = "//third_party/rust",
+)
+
+# A flag to control whether rust_library and rust_binary targets should
+# implicitly depend on the *real* import macro, or on a no-op target.
+bool_flag(
+ name = "use_real_import_macro",
+ build_setting_default = False,
+)
+
+# A flag that enables/disables the use of process_wrapper when invoking rustc.
+# This is useful for building process_wrapper itself without causing dependency cycles.
+bool_flag(
+ name = "use_process_wrapper",
+ build_setting_default = True,
+)
+
+bzl_library(
+ name = "bzl_lib",
+ srcs = glob(["**/*.bzl"]),
+)
+
+alias(
+ name = "rules",
+ actual = ":bzl_lib",
+ deprecation = "Please use the `@rules_rust//settings:bzl_lib` target instead",
+ visibility = ["//rust:__subpackages__"],
+)
diff --git a/rust/settings/incompatible.bzl b/rust/settings/incompatible.bzl
new file mode 100644
index 0000000..d1d3f16
--- /dev/null
+++ b/rust/settings/incompatible.bzl
@@ -0,0 +1,27 @@
+"""This file contains definitions of all current incompatible flags.
+
+See COMPATIBILITY.md for the backwards compatibility policy.
+"""
+
+IncompatibleFlagInfo = provider(
+ doc = "Provider for the current value of an incompatible flag.",
+ fields = {
+ "enabled": "(bool) whether the flag is enabled",
+ "issue": "(string) link to the github issue associated with this flag",
+ },
+)
+
+def _incompatible_flag_impl(ctx):
+ return [IncompatibleFlagInfo(enabled = ctx.build_setting_value, issue = ctx.attr.issue)]
+
+incompatible_flag = rule(
+ doc = "A rule defining an incompatible flag.",
+ implementation = _incompatible_flag_impl,
+ build_setting = config.bool(flag = True),
+ attrs = {
+ "issue": attr.string(
+ doc = "The link to the github issue associated with this flag",
+ mandatory = True,
+ ),
+ },
+)
diff --git a/rust/toolchain.bzl b/rust/toolchain.bzl
new file mode 100644
index 0000000..687e0df
--- /dev/null
+++ b/rust/toolchain.bzl
@@ -0,0 +1,662 @@
+"""The rust_toolchain rule definition and implementation."""
+
+load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo")
+load("//rust/private:common.bzl", "rust_common")
+load("//rust/private:utils.bzl", "dedent", "find_cc_toolchain", "make_static_lib_symlink")
+
+def _rust_stdlib_filegroup_impl(ctx):
+ rust_std = ctx.files.srcs
+ dot_a_files = []
+ between_alloc_and_core_files = []
+ core_files = []
+ between_core_and_std_files = []
+ std_files = []
+ alloc_files = []
+ self_contained_files = [
+ file
+ for file in rust_std
+ if file.basename.endswith(".o") and "self-contained" in file.path
+ ]
+
+ std_rlibs = [f for f in rust_std if f.basename.endswith(".rlib")]
+ if std_rlibs:
+ # std depends on everything
+ #
+ # core only depends on alloc, but we poke adler in there
+ # because that needs to be before miniz_oxide
+ #
+ # alloc depends on the allocator_library if it's configured, but we
+ # do that later.
+ dot_a_files = [make_static_lib_symlink(ctx.actions, f) for f in std_rlibs]
+
+ alloc_files = [f for f in dot_a_files if "alloc" in f.basename and "std" not in f.basename]
+ between_alloc_and_core_files = [f for f in dot_a_files if "compiler_builtins" in f.basename]
+ core_files = [f for f in dot_a_files if ("core" in f.basename or "adler" in f.basename) and "std" not in f.basename]
+ between_core_and_std_files = [
+ f
+ for f in dot_a_files
+ if "alloc" not in f.basename and "compiler_builtins" not in f.basename and "core" not in f.basename and "adler" not in f.basename and "std" not in f.basename
+ ]
+ std_files = [f for f in dot_a_files if "std" in f.basename]
+
+ partitioned_files_len = len(alloc_files) + len(between_alloc_and_core_files) + len(core_files) + len(between_core_and_std_files) + len(std_files)
+ if partitioned_files_len != len(dot_a_files):
+ partitioned = alloc_files + between_alloc_and_core_files + core_files + between_core_and_std_files + std_files
+ for f in sorted(partitioned):
+ # buildifier: disable=print
+ print("File partitioned: {}".format(f.basename))
+ fail("rust_toolchain couldn't properly partition rlibs in rust_std. Partitioned {} out of {} files. This is probably a bug in the rule implementation.".format(partitioned_files_len, len(dot_a_files)))
+
+ return [
+ DefaultInfo(
+ files = depset(ctx.files.srcs),
+ ),
+ rust_common.stdlib_info(
+ std_rlibs = std_rlibs,
+ dot_a_files = dot_a_files,
+ between_alloc_and_core_files = between_alloc_and_core_files,
+ core_files = core_files,
+ between_core_and_std_files = between_core_and_std_files,
+ std_files = std_files,
+ alloc_files = alloc_files,
+ self_contained_files = self_contained_files,
+ srcs = ctx.attr.srcs,
+ ),
+ ]
+
+rust_stdlib_filegroup = rule(
+ doc = "A dedicated filegroup-like rule for Rust stdlib artifacts.",
+ implementation = _rust_stdlib_filegroup_impl,
+ attrs = {
+ "srcs": attr.label_list(
+ allow_files = True,
+ doc = "The list of targets/files that are components of the rust-stdlib file group",
+ mandatory = True,
+ ),
+ },
+)
+
+def _ltl(library, ctx, cc_toolchain, feature_configuration):
+ """A helper to generate `LibraryToLink` objects
+
+ Args:
+ library (File): A rust library file to link.
+ ctx (ctx): The rule's context object.
+ cc_toolchain (CcToolchainInfo): A cc toolchain provider to be used.
+ feature_configuration (feature_configuration): feature_configuration to be queried.
+
+ Returns:
+ LibraryToLink: A provider containing information about libraries to link.
+ """
+ return cc_common.create_library_to_link(
+ actions = ctx.actions,
+ feature_configuration = feature_configuration,
+ cc_toolchain = cc_toolchain,
+ static_library = library,
+ pic_static_library = library,
+ )
+
+def _make_libstd_and_allocator_ccinfo(ctx, rust_std, allocator_library):
+ """Make the CcInfo (if possible) for libstd and allocator libraries.
+
+ Args:
+ ctx (ctx): The rule's context object.
+ rust_std: The Rust standard library.
+ allocator_library: The target to use for providing allocator functions.
+
+
+ Returns:
+ A CcInfo object for the required libraries, or None if no such libraries are available.
+ """
+ cc_toolchain, feature_configuration = find_cc_toolchain(ctx)
+ cc_infos = []
+
+ if not rust_common.stdlib_info in rust_std:
+ fail(dedent("""\
+ {} --
+ The `rust_lib` ({}) must be a target providing `rust_common.stdlib_info`
+ (typically `rust_stdlib_filegroup` rule from @rules_rust//rust:defs.bzl).
+ See https://github.com/bazelbuild/rules_rust/pull/802 for more information.
+ """).format(ctx.label, rust_std))
+ rust_stdlib_info = rust_std[rust_common.stdlib_info]
+
+ if rust_stdlib_info.self_contained_files:
+ compilation_outputs = cc_common.create_compilation_outputs(
+ objects = depset(rust_stdlib_info.self_contained_files),
+ )
+
+ linking_context, _linking_outputs = cc_common.create_linking_context_from_compilation_outputs(
+ name = ctx.label.name,
+ actions = ctx.actions,
+ feature_configuration = feature_configuration,
+ cc_toolchain = cc_toolchain,
+ compilation_outputs = compilation_outputs,
+ )
+
+ cc_infos.append(CcInfo(
+ linking_context = linking_context,
+ ))
+
+ if rust_stdlib_info.std_rlibs:
+ alloc_inputs = depset(
+ [_ltl(f, ctx, cc_toolchain, feature_configuration) for f in rust_stdlib_info.alloc_files],
+ )
+ between_alloc_and_core_inputs = depset(
+ [_ltl(f, ctx, cc_toolchain, feature_configuration) for f in rust_stdlib_info.between_alloc_and_core_files],
+ transitive = [alloc_inputs],
+ order = "topological",
+ )
+ core_inputs = depset(
+ [_ltl(f, ctx, cc_toolchain, feature_configuration) for f in rust_stdlib_info.core_files],
+ transitive = [between_alloc_and_core_inputs],
+ order = "topological",
+ )
+
+ # The libraries panic_abort and panic_unwind are alternatives.
+ # The std by default requires panic_unwind.
+ # Exclude panic_abort if panic_unwind is present.
+ # TODO: Provide a setting to choose between panic_abort and panic_unwind.
+ filtered_between_core_and_std_files = rust_stdlib_info.between_core_and_std_files
+ has_panic_unwind = [
+ f
+ for f in filtered_between_core_and_std_files
+ if "panic_unwind" in f.basename
+ ]
+ if has_panic_unwind:
+ filtered_between_core_and_std_files = [
+ f
+ for f in filtered_between_core_and_std_files
+ if "panic_abort" not in f.basename
+ ]
+ between_core_and_std_inputs = depset(
+ [
+ _ltl(f, ctx, cc_toolchain, feature_configuration)
+ for f in filtered_between_core_and_std_files
+ ],
+ transitive = [core_inputs],
+ order = "topological",
+ )
+ std_inputs = depset(
+ [
+ _ltl(f, ctx, cc_toolchain, feature_configuration)
+ for f in rust_stdlib_info.std_files
+ ],
+ transitive = [between_core_and_std_inputs],
+ order = "topological",
+ )
+
+ link_inputs = cc_common.create_linker_input(
+ owner = rust_std.label,
+ libraries = std_inputs,
+ )
+
+ allocator_inputs = None
+ if allocator_library:
+ allocator_inputs = [allocator_library[CcInfo].linking_context.linker_inputs]
+
+ cc_infos.append(CcInfo(
+ linking_context = cc_common.create_linking_context(
+ linker_inputs = depset(
+ [link_inputs],
+ transitive = allocator_inputs,
+ order = "topological",
+ ),
+ ),
+ ))
+
+ if cc_infos:
+ return cc_common.merge_cc_infos(
+ direct_cc_infos = cc_infos,
+ )
+ return None
+
+def _symlink_sysroot_tree(ctx, name, target):
+ """Generate a set of symlinks to files from another target
+
+ Args:
+ ctx (ctx): The toolchain's context object
+ name (str): The name of the sysroot directory (typically `ctx.label.name`)
+ target (Target): A target owning files to symlink
+
+ Returns:
+ depset[File]: A depset of the generated symlink files
+ """
+ tree_files = []
+ for file in target.files.to_list():
+ # Parse the path to the file relative to the workspace root so a
+ # symlink matching this path can be created within the sysroot.
+
+ # The code blow attempts to parse any workspace names out of the
+ # path. For local targets, this code is a noop.
+ if target.label.workspace_root:
+ file_path = file.path.split(target.label.workspace_root, 1)[-1]
+ else:
+ file_path = file.path
+
+ symlink = ctx.actions.declare_file("{}/{}".format(name, file_path.lstrip("/")))
+
+ ctx.actions.symlink(
+ output = symlink,
+ target_file = file,
+ )
+
+ tree_files.append(symlink)
+
+ return depset(tree_files)
+
+def _symlink_sysroot_bin(ctx, name, directory, target):
+ """Crete a symlink to a target file.
+
+ Args:
+ ctx (ctx): The rule's context object
+ name (str): A common name for the output directory
+ directory (str): The directory under `name` to put the file in
+ target (File): A File object to symlink to
+
+ Returns:
+ File: A newly generated symlink file
+ """
+ symlink = ctx.actions.declare_file("{}/{}/{}".format(
+ name,
+ directory,
+ target.basename,
+ ))
+
+ ctx.actions.symlink(
+ output = symlink,
+ target_file = target,
+ is_executable = True,
+ )
+
+ return symlink
+
+def _generate_sysroot(
+ ctx,
+ rustc,
+ rustdoc,
+ rustc_lib,
+ cargo = None,
+ clippy = None,
+ llvm_tools = None,
+ rust_std = None,
+ rustfmt = None):
+ """Generate a rust sysroot from collection of toolchain components
+
+ Args:
+ ctx (ctx): A context object from a `rust_toolchain` rule.
+ rustc (File): The path to a `rustc` executable.
+ rustdoc (File): The path to a `rustdoc` executable.
+ rustc_lib (Target): A collection of Files containing dependencies of `rustc`.
+ cargo (File, optional): The path to a `cargo` executable.
+ clippy (File, optional): The path to a `clippy-driver` executable.
+ llvm_tools (Target, optional): A collection of llvm tools used by `rustc`.
+ rust_std (Target, optional): A collection of Files containing Rust standard library components.
+ rustfmt (File, optional): The path to a `rustfmt` executable.
+
+ Returns:
+ struct: A struct of generated files representing the new sysroot
+ """
+ name = ctx.label.name
+
+ # Define runfiles
+ direct_files = []
+ transitive_file_sets = []
+
+ # Rustc
+ sysroot_rustc = _symlink_sysroot_bin(ctx, name, "bin", rustc)
+ direct_files.extend([sysroot_rustc])
+
+ # Rustc dependencies
+ sysroot_rustc_lib = None
+ if rustc_lib:
+ sysroot_rustc_lib = _symlink_sysroot_tree(ctx, name, rustc_lib)
+ transitive_file_sets.extend([sysroot_rustc_lib])
+
+ # Rustdoc
+ sysroot_rustdoc = _symlink_sysroot_bin(ctx, name, "bin", rustdoc)
+ direct_files.extend([sysroot_rustdoc])
+
+ # Clippy
+ sysroot_clippy = None
+ if clippy:
+ sysroot_clippy = _symlink_sysroot_bin(ctx, name, "bin", clippy)
+ direct_files.extend([sysroot_clippy])
+
+ # Cargo
+ sysroot_cargo = None
+ if cargo:
+ sysroot_cargo = _symlink_sysroot_bin(ctx, name, "bin", cargo)
+ direct_files.extend([sysroot_cargo])
+
+ # Rustfmt
+ sysroot_rustfmt = None
+ if rustfmt:
+ sysroot_rustfmt = _symlink_sysroot_bin(ctx, name, "bin", rustfmt)
+ direct_files.extend([sysroot_rustfmt])
+
+ # Llvm tools
+ sysroot_llvm_tools = None
+ if llvm_tools:
+ sysroot_llvm_tools = _symlink_sysroot_tree(ctx, name, llvm_tools)
+ transitive_file_sets.extend([sysroot_llvm_tools])
+
+ # Rust standard library
+ sysroot_rust_std = None
+ if rust_std:
+ sysroot_rust_std = _symlink_sysroot_tree(ctx, name, rust_std)
+ transitive_file_sets.extend([sysroot_rust_std])
+
+ # Declare a file in the root of the sysroot to make locating the sysroot easy
+ sysroot_anchor = ctx.actions.declare_file("{}/rust.sysroot".format(name))
+ ctx.actions.write(
+ output = sysroot_anchor,
+ content = "\n".join([
+ "cargo: {}".format(cargo),
+ "clippy: {}".format(clippy),
+ "llvm_tools: {}".format(llvm_tools),
+ "rust_std: {}".format(rust_std),
+ "rustc_lib: {}".format(rustc_lib),
+ "rustc: {}".format(rustc),
+ "rustdoc: {}".format(rustdoc),
+ "rustfmt: {}".format(rustfmt),
+ ]),
+ )
+
+ # Create a depset of all sysroot files (symlinks and their real paths)
+ all_files = depset(direct_files, transitive = transitive_file_sets)
+
+ return struct(
+ all_files = all_files,
+ cargo = sysroot_cargo,
+ clippy = sysroot_clippy,
+ rust_std = sysroot_rust_std,
+ rustc = sysroot_rustc,
+ rustc_lib = sysroot_rustc_lib,
+ rustdoc = sysroot_rustdoc,
+ rustfmt = sysroot_rustfmt,
+ sysroot_anchor = sysroot_anchor,
+ )
+
+def _rust_toolchain_impl(ctx):
+ """The rust_toolchain implementation
+
+ Args:
+ ctx (ctx): The rule's context object
+
+ Returns:
+ list: A list containing the target's toolchain Provider info
+ """
+ compilation_mode_opts = {}
+ for k, v in ctx.attr.opt_level.items():
+ if not k in ctx.attr.debug_info:
+ fail("Compilation mode {} is not defined in debug_info but is defined opt_level".format(k))
+ compilation_mode_opts[k] = struct(debug_info = ctx.attr.debug_info[k], opt_level = v)
+ for k, v in ctx.attr.debug_info.items():
+ if not k in ctx.attr.opt_level:
+ fail("Compilation mode {} is not defined in opt_level but is defined debug_info".format(k))
+
+ if ctx.attr.target_triple and ctx.file.target_json:
+ fail("Do not specify both target_triple and target_json, either use a builtin triple or provide a custom specification file.")
+
+ rename_first_party_crates = ctx.attr._rename_first_party_crates[BuildSettingInfo].value
+ third_party_dir = ctx.attr._third_party_dir[BuildSettingInfo].value
+
+ if ctx.attr.rust_lib:
+ # buildifier: disable=print
+ print("`rust_toolchain.rust_lib` is deprecated. Please update {} to use `rust_toolchain.rust_std`".format(
+ ctx.label,
+ ))
+ rust_std = ctx.attr.rust_lib
+ else:
+ rust_std = ctx.attr.rust_std
+
+ sysroot = _generate_sysroot(
+ ctx = ctx,
+ rustc = ctx.file.rustc,
+ rustdoc = ctx.file.rust_doc,
+ rustc_lib = ctx.attr.rustc_lib,
+ rust_std = rust_std,
+ rustfmt = ctx.file.rustfmt,
+ clippy = ctx.file.clippy_driver,
+ cargo = ctx.file.cargo,
+ llvm_tools = ctx.attr.llvm_tools,
+ )
+
+ expanded_stdlib_linkflags = []
+ for flag in ctx.attr.stdlib_linkflags:
+ expanded_stdlib_linkflags.append(
+ ctx.expand_location(
+ flag,
+ targets = rust_std[rust_common.stdlib_info].srcs,
+ ),
+ )
+
+ linking_context = cc_common.create_linking_context(
+ linker_inputs = depset([
+ cc_common.create_linker_input(
+ owner = ctx.label,
+ user_link_flags = depset(expanded_stdlib_linkflags),
+ ),
+ ]),
+ )
+
+ # Contains linker flags needed to link Rust standard library.
+ # These need to be added to linker command lines when the linker is not rustc
+ # (rustc does this automatically). Linker flags wrapped in an otherwise empty
+ # `CcInfo` to provide the flags in a way that doesn't duplicate them per target
+ # providing a `CcInfo`.
+ stdlib_linkflags_cc_info = CcInfo(
+ compilation_context = cc_common.create_compilation_context(),
+ linking_context = linking_context,
+ )
+
+ # Determine the path and short_path of the sysroot
+ sysroot_path = sysroot.sysroot_anchor.dirname
+ sysroot_short_path, _, _ = sysroot.sysroot_anchor.short_path.rpartition("/")
+
+ toolchain = platform_common.ToolchainInfo(
+ all_files = sysroot.all_files,
+ binary_ext = ctx.attr.binary_ext,
+ cargo = sysroot.cargo,
+ clippy_driver = sysroot.clippy,
+ compilation_mode_opts = compilation_mode_opts,
+ crosstool_files = ctx.files._cc_toolchain,
+ default_edition = ctx.attr.default_edition,
+ dylib_ext = ctx.attr.dylib_ext,
+ exec_triple = ctx.attr.exec_triple,
+ libstd_and_allocator_ccinfo = _make_libstd_and_allocator_ccinfo(ctx, rust_std, ctx.attr.allocator_library),
+ os = ctx.attr.os,
+ rust_doc = sysroot.rustdoc,
+ rust_lib = sysroot.rust_std, # `rust_lib` is deprecated and only exists for legacy support.
+ rust_std = sysroot.rust_std,
+ rust_std_paths = depset([file.dirname for file in sysroot.rust_std.to_list()]),
+ rustc = sysroot.rustc,
+ rustc_lib = sysroot.rustc_lib,
+ rustc_srcs = ctx.attr.rustc_srcs,
+ rustfmt = sysroot.rustfmt,
+ staticlib_ext = ctx.attr.staticlib_ext,
+ stdlib_linkflags = stdlib_linkflags_cc_info,
+ sysroot = sysroot_path,
+ sysroot_short_path = sysroot_short_path,
+ target_arch = ctx.attr.target_triple.split("-")[0],
+ target_flag_value = ctx.file.target_json.path if ctx.file.target_json else ctx.attr.target_triple,
+ target_json = ctx.file.target_json,
+ target_triple = ctx.attr.target_triple,
+
+ # Experimental and incompatible flags
+ _rename_first_party_crates = rename_first_party_crates,
+ _third_party_dir = third_party_dir,
+ )
+ return [toolchain]
+
+rust_toolchain = rule(
+ implementation = _rust_toolchain_impl,
+ fragments = ["cpp"],
+ attrs = {
+ "allocator_library": attr.label(
+ doc = "Target that provides allocator functions when rust_library targets are embedded in a cc_binary.",
+ ),
+ "binary_ext": attr.string(
+ doc = "The extension for binaries created from rustc.",
+ mandatory = True,
+ ),
+ "cargo": attr.label(
+ doc = "The location of the `cargo` binary. Can be a direct source or a filegroup containing one item.",
+ allow_single_file = True,
+ cfg = "exec",
+ ),
+ "clippy_driver": attr.label(
+ doc = "The location of the `clippy-driver` binary. Can be a direct source or a filegroup containing one item.",
+ allow_single_file = True,
+ cfg = "exec",
+ ),
+ "debug_info": attr.string_dict(
+ doc = "Rustc debug info levels per opt level",
+ default = {
+ "dbg": "2",
+ "fastbuild": "0",
+ "opt": "0",
+ },
+ ),
+ "default_edition": attr.string(
+ doc = "The edition to use for rust_* rules that don't specify an edition.",
+ default = rust_common.default_edition,
+ ),
+ "dylib_ext": attr.string(
+ doc = "The extension for dynamic libraries created from rustc.",
+ mandatory = True,
+ ),
+ "exec_triple": attr.string(
+ doc = (
+ "The platform triple for the toolchains execution environment. " +
+ "For more details see: https://docs.bazel.build/versions/master/skylark/rules.html#configurations"
+ ),
+ mandatory = True,
+ ),
+ "llvm_tools": attr.label(
+ doc = "LLVM tools that are shipped with the Rust toolchain.",
+ allow_files = True,
+ ),
+ "opt_level": attr.string_dict(
+ doc = "Rustc optimization levels.",
+ default = {
+ "dbg": "0",
+ "fastbuild": "0",
+ "opt": "3",
+ },
+ ),
+ "os": attr.string(
+ doc = "The operating system for the current toolchain",
+ mandatory = True,
+ ),
+ "rust_doc": attr.label(
+ doc = "The location of the `rustdoc` binary. Can be a direct source or a filegroup containing one item.",
+ allow_single_file = True,
+ cfg = "exec",
+ mandatory = True,
+ ),
+ "rust_lib": attr.label(
+ doc = "**Deprecated**: Use `rust_std`",
+ ),
+ "rust_std": attr.label(
+ doc = "The Rust standard library.",
+ ),
+ "rustc": attr.label(
+ doc = "The location of the `rustc` binary. Can be a direct source or a filegroup containing one item.",
+ allow_single_file = True,
+ cfg = "exec",
+ mandatory = True,
+ ),
+ "rustc_lib": attr.label(
+ doc = "The libraries used by rustc during compilation.",
+ cfg = "exec",
+ ),
+ "rustc_srcs": attr.label(
+ doc = "The source code of rustc.",
+ ),
+ "rustfmt": attr.label(
+ doc = "The location of the `rustfmt` binary. Can be a direct source or a filegroup containing one item.",
+ allow_single_file = True,
+ cfg = "exec",
+ ),
+ "staticlib_ext": attr.string(
+ doc = "The extension for static libraries created from rustc.",
+ mandatory = True,
+ ),
+ "stdlib_linkflags": attr.string_list(
+ doc = (
+ "Additional linker flags to use when Rust standard library is linked by a C++ linker " +
+ "(rustc will deal with these automatically). Subject to location expansion with respect " +
+ "to the srcs of the `rust_std` attribute."
+ ),
+ mandatory = True,
+ ),
+ "target_json": attr.label(
+ doc = ("Override the target_triple with a custom target specification. " +
+ "For more details see: https://doc.rust-lang.org/rustc/targets/custom.html"),
+ allow_single_file = True,
+ ),
+ "target_triple": attr.string(
+ doc = (
+ "The platform triple for the toolchains target environment. " +
+ "For more details see: https://docs.bazel.build/versions/master/skylark/rules.html#configurations"
+ ),
+ ),
+ "_cc_toolchain": attr.label(
+ default = "@bazel_tools//tools/cpp:current_cc_toolchain",
+ ),
+ "_rename_first_party_crates": attr.label(
+ default = "@rules_rust//rust/settings:rename_first_party_crates",
+ ),
+ "_third_party_dir": attr.label(
+ default = "@rules_rust//rust/settings:third_party_dir",
+ ),
+ },
+ toolchains = [
+ "@bazel_tools//tools/cpp:toolchain_type",
+ ],
+ incompatible_use_toolchain_transition = True,
+ doc = """Declares a Rust toolchain for use.
+
+This is for declaring a custom toolchain, eg. for configuring a particular version of rust or supporting a new platform.
+
+Example:
+
+Suppose the core rust team has ported the compiler to a new target CPU, called `cpuX`. This \
+support can be used in Bazel by defining a new toolchain definition and declaration:
+
+```python
+load('@rules_rust//rust:toolchain.bzl', 'rust_toolchain')
+
+rust_toolchain(
+ name = "rust_cpuX_impl",
+ rustc = "@rust_cpuX//:rustc",
+ rustc_lib = "@rust_cpuX//:rustc_lib",
+ rust_std = "@rust_cpuX//:rust_std",
+ rust_doc = "@rust_cpuX//:rustdoc",
+ binary_ext = "",
+ staticlib_ext = ".a",
+ dylib_ext = ".so",
+ stdlib_linkflags = ["-lpthread", "-ldl"],
+ os = "linux",
+)
+
+toolchain(
+ name = "rust_cpuX",
+ exec_compatible_with = [
+ "@platforms//cpu:cpuX",
+ ],
+ target_compatible_with = [
+ "@platforms//cpu:cpuX",
+ ],
+ toolchain = ":rust_cpuX_impl",
+)
+```
+
+Then, either add the label of the toolchain rule to `register_toolchains` in the WORKSPACE, or pass \
+it to the `"--extra_toolchains"` flag for Bazel, and it will be used.
+
+See @rules_rust//rust:repositories.bzl for examples of defining the @rust_cpuX repository \
+with the actual binaries and libraries.
+""",
+)
diff --git a/rust/toolchain/BUILD.bazel b/rust/toolchain/BUILD.bazel
new file mode 100644
index 0000000..daccd08
--- /dev/null
+++ b/rust/toolchain/BUILD.bazel
@@ -0,0 +1,43 @@
+load("//rust/private:toolchain_utils.bzl", "toolchain_files")
+
+package(default_visibility = ["//visibility:public"])
+
+toolchain_files(
+ name = "current_exec_cargo_files",
+ tool = "cargo",
+)
+
+toolchain_files(
+ name = "current_exec_clippy_files",
+ tool = "clippy",
+)
+
+toolchain_files(
+ name = "current_exec_rustc_files",
+ tool = "rustc",
+)
+
+toolchain_files(
+ name = "current_exec_rustdoc_files",
+ tool = "rustdoc",
+)
+
+toolchain_files(
+ name = "current_exec_rustfmt_files",
+ tool = "rustfmt",
+)
+
+toolchain_files(
+ name = "current_exec_rustc_lib_files",
+ tool = "rustc_lib",
+)
+
+toolchain_files(
+ name = "current_exec_rustc_srcs_files",
+ tool = "rustc_srcs",
+)
+
+toolchain_files(
+ name = "current_exec_rust_stdlib_files",
+ tool = "rust_stdlib",
+)