From abfefefbb63aec99633811c45fe33343c976ff73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philipp=20Kr=C3=BCger?= Date: Thu, 25 Apr 2024 16:00:52 +0200 Subject: [PATCH] feat: Implement conflict reconciliation for private directories (#431) * feat: Implement conflict reconciliation for private directories * fix: Make `header` public again * chore: write basic reconciliation unit tests * chore: Write proptest state machine utilities & proptest private reconciliation * chore: Write better `Debug` impls * feat: Prioritize directories over files during private directory merge * chore: Try extracting out a failing testcase * fix: Regression test & mock file system merge * chore: Found failing test case * chore: Try associating replicas with a vector clock * refactor: Don't try to state machine proptest private reconciliation * refactor: Remove unused dependency * feat: Commit `Cargo.lock` and update lockfile * chore: docs --- .gitignore | 1 - Cargo.lock | 3341 +++++++++++++++++ wnfs/Cargo.toml | 1 + wnfs/src/private/directory.rs | 317 +- wnfs/src/private/encrypted.rs | 15 +- wnfs/src/private/file.rs | 132 +- wnfs/src/private/forest/traits.rs | 4 +- wnfs/src/private/keys/privateref.rs | 4 +- wnfs/src/private/link.rs | 29 +- wnfs/src/private/node/header.rs | 79 +- wnfs/src/private/node/keys.rs | 20 +- wnfs/src/private/node/node.rs | 113 +- ...directory__snapshot_tests__private_fs.snap | 320 +- ...ree__snapshot_tests__root_filesystems.snap | 134 +- wnfs/src/utils/common.rs | 9 + 15 files changed, 4247 insertions(+), 272 deletions(-) create mode 100644 Cargo.lock diff --git a/.gitignore b/.gitignore index 931af814..8d2493f4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ -Cargo.lock **/target/ **/.DS_Store diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 00000000..f652232b --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,3341 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "addr2line" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "aead" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" +dependencies = [ + "crypto-common", + "generic-array", +] + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "aes-kw" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69fa2b352dcefb5f7f3a5fb840e02665d311d878955380515e4fd50095dd3d8c" +dependencies = [ + "aes", +] + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "getrandom", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anes" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" + +[[package]] +name = "anstream" +version = "0.6.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d96bd03f33fe50a863e394ee9718a706f988b9079b20c3784fb726e7678b62fb" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" + +[[package]] +name = "anstyle-parse" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" +dependencies = [ + "anstyle", + "windows-sys 0.52.0", +] + +[[package]] +name = "anyhow" +version = "1.0.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519" + +[[package]] +name = "arrayref" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" + +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" + +[[package]] +name = "async-attributes" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3203e79f4dd9bdda415ed03cf14dae5a2bf775c683a00f94e9cd1faf0f596e5" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "async-channel" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +dependencies = [ + "concurrent-queue", + "event-listener 2.5.3", + "futures-core", +] + +[[package]] +name = "async-channel" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "136d4d23bcc79e27423727b36823d86233aad06dfea531837b038394d11e9928" +dependencies = [ + "concurrent-queue", + "event-listener 5.3.0", + "event-listener-strategy 0.5.1", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b10202063978b3351199d68f8b22c4e47e4b1b822f8d43fd862d5ea8c006b29a" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand 2.0.2", + "futures-lite 2.3.0", + "slab", +] + +[[package]] +name = "async-global-executor" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" +dependencies = [ + "async-channel 2.2.1", + "async-executor", + "async-io 2.3.2", + "async-lock 3.3.0", + "blocking", + "futures-lite 2.3.0", + "once_cell", +] + +[[package]] +name = "async-io" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" +dependencies = [ + "async-lock 2.8.0", + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-lite 1.13.0", + "log", + "parking", + "polling 2.8.0", + "rustix 0.37.27", + "slab", + "socket2", + "waker-fn", +] + +[[package]] +name = "async-io" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcccb0f599cfa2f8ace422d3555572f47424da5648a4382a9dd0310ff8210884" +dependencies = [ + "async-lock 3.3.0", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite 2.3.0", + "parking", + "polling 3.7.0", + "rustix 0.38.34", + "slab", + "tracing", + "windows-sys 0.52.0", +] + +[[package]] +name = "async-lock" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" +dependencies = [ + "event-listener 2.5.3", +] + +[[package]] +name = "async-lock" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d034b430882f8381900d3fe6f0aaa3ad94f2cb4ac519b429692a1bc2dda4ae7b" +dependencies = [ + "event-listener 4.0.3", + "event-listener-strategy 0.4.0", + "pin-project-lite", +] + +[[package]] +name = "async-once-cell" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9338790e78aa95a416786ec8389546c4b6a1dfc3dc36071ed9518a9413a542eb" + +[[package]] +name = "async-recursion" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30c5ef0ede93efbf733c1a727f3b6b5a1060bbedd5600183e66f6e4be4af0ec5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.60", +] + +[[package]] +name = "async-std" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62565bb4402e926b29953c785397c6dc0391b7b446e45008b0049eb43cec6f5d" +dependencies = [ + "async-attributes", + "async-channel 1.9.0", + "async-global-executor", + "async-io 1.13.0", + "async-lock 2.8.0", + "crossbeam-utils", + "futures-channel", + "futures-core", + "futures-io", + "futures-lite 1.13.0", + "gloo-timers", + "kv-log-macro", + "log", + "memchr", + "once_cell", + "pin-project-lite", + "pin-utils", + "slab", + "wasm-bindgen-futures", +] + +[[package]] +name = "async-stream" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.60", +] + +[[package]] +name = "async-task" +version = "4.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbb36e985947064623dbd357f727af08ffd077f93d696782f3c56365fa2e2799" + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi 0.1.19", + "libc", + "winapi", +] + +[[package]] +name = "autocfg" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" + +[[package]] +name = "az" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b7e4c2464d97fe331d41de9d5db0def0a96f4d823b8b32a2efd503578988973" + +[[package]] +name = "backtrace" +version = "0.3.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "base-x" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64-serde" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba368df5de76a5bea49aaf0cf1b39ccfbbef176924d1ba5db3e4135216cbe3c7" +dependencies = [ + "base64", + "serde", +] + +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "serde", + "tap", + "wyz", +] + +[[package]] +name = "blake2b_simd" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23285ad32269793932e830392f2fe2f83e26488fd3ec778883a93c8323735780" +dependencies = [ + "arrayref", + "arrayvec", + "constant_time_eq", +] + +[[package]] +name = "blake2s_simd" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94230421e395b9920d23df13ea5d77a20e1725331f90fbbf6df6040b33f756ae" +dependencies = [ + "arrayref", + "arrayvec", + "constant_time_eq", +] + +[[package]] +name = "blake3" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30cca6d3674597c30ddf2c587bf8d9d65c9a84d2326d941cc79c9842dfe0ef52" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", + "digest", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "blocking" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a37913e8dc4ddcc604f0c6d3bf2887c995153af3611de9e23c352b44c1b9118" +dependencies = [ + "async-channel 2.2.1", + "async-lock 3.3.0", + "async-task", + "fastrand 2.0.2", + "futures-io", + "futures-lite 2.3.0", + "piper", + "tracing", +] + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" +dependencies = [ + "serde", +] + +[[package]] +name = "cast" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" + +[[package]] +name = "cbor4ii" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544cf8c89359205f4f990d0e6f3828db42df85b5dac95d09157a250eb0749c4" +dependencies = [ + "serde", +] + +[[package]] +name = "cc" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d32a725bc159af97c3e629873bb9f88fb8cf8a4867175f76dc987815ea07c83b" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chacha20" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "chacha20poly1305" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" +dependencies = [ + "aead", + "chacha20", + "cipher", + "poly1305", + "zeroize", +] + +[[package]] +name = "chrono" +version = "0.4.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "wasm-bindgen", + "windows-targets 0.52.5", +] + +[[package]] +name = "ciborium" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" + +[[package]] +name = "ciborium-ll" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" +dependencies = [ + "ciborium-io", + "half", +] + +[[package]] +name = "cid" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd94671561e36e4e7de75f753f577edafb0e7c05d6e4547229fdf7938fbcd2c3" +dependencies = [ + "core2", + "multibase", + "multihash 0.18.1", + "serde", + "serde_bytes", + "unsigned-varint 0.7.2", +] + +[[package]] +name = "cid" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3147d8272e8fa0ccd29ce51194dd98f79ddfb8191ba9e3409884e751798acf3a" +dependencies = [ + "core2", + "multibase", + "multihash 0.19.1", + "serde", + "serde_bytes", + "unsigned-varint 0.8.0", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", + "zeroize", +] + +[[package]] +name = "clap" +version = "3.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" +dependencies = [ + "bitflags 1.3.2", + "clap_lex", + "indexmap", + "textwrap", +] + +[[package]] +name = "clap_lex" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" +dependencies = [ + "os_str_bytes", +] + +[[package]] +name = "colorchoice" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" + +[[package]] +name = "concurrent-queue" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "console" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" +dependencies = [ + "encode_unicode", + "lazy_static", + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if", + "wasm-bindgen", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "constant_time_eq" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" + +[[package]] +name = "core-foundation-sys" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" + +[[package]] +name = "core2" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" +dependencies = [ + "memchr", +] + +[[package]] +name = "cpufeatures" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +dependencies = [ + "libc", +] + +[[package]] +name = "criterion" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c76e09c1aae2bc52b3d2f29e13c6572553b30c4aa1b8a49fd70de6412654cb" +dependencies = [ + "anes", + "async-std", + "atty", + "cast", + "ciborium", + "clap", + "criterion-plot", + "futures", + "itertools 0.10.5", + "lazy_static", + "num-traits", + "oorandom", + "plotters", + "rayon", + "regex", + "serde", + "serde_derive", + "serde_json", + "tinytemplate", + "walkdir", +] + +[[package]] +name = "criterion-plot" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" +dependencies = [ + "cast", + "itertools 0.10.5", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "rand_core", + "typenum", +] + +[[package]] +name = "dashmap" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +dependencies = [ + "cfg-if", + "hashbrown 0.14.3", + "lock_api", + "once_cell", + "parking_lot_core", +] + +[[package]] +name = "data-encoding" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" + +[[package]] +name = "data-encoding-macro" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20c01c06f5f429efdf2bae21eb67c28b3df3cf85b7dd2d8ef09c0838dac5d33e" +dependencies = [ + "data-encoding", + "data-encoding-macro-internal", +] + +[[package]] +name = "data-encoding-macro-internal" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0047d07f2c89b17dd631c80450d69841a6b5d7fb17278cbc43d7e4cfcf2576f3" +dependencies = [ + "data-encoding", + "syn 1.0.109", +] + +[[package]] +name = "der" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + +[[package]] +name = "deunicode" +version = "1.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "322ef0094744e63628e6f0eb2295517f79276a5b342a4c2ff3042566ca181d4e" + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "either" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" + +[[package]] +name = "encode_unicode" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" + +[[package]] +name = "env_filter" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a009aa4810eb158359dda09d0c87378e4bbb89b5a801f016885a4707ba24f7ea" +dependencies = [ + "log", + "regex", +] + +[[package]] +name = "env_logger" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b35839ba51819680ba087cd351788c9a3c476841207e0b8cee0b04722343b9" +dependencies = [ + "anstream", + "anstyle", + "env_filter", + "humantime", + "log", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + +[[package]] +name = "event-listener" +version = "4.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d9944b8ca13534cdfb2800775f8dd4902ff3fc75a50101466decadfdf322a24" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" +dependencies = [ + "event-listener 4.0.3", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "332f51cb23d20b0de8458b86580878211da09bcd4503cb579c225b3d124cabb3" +dependencies = [ + "event-listener 5.3.0", + "pin-project-lite", +] + +[[package]] +name = "fake" +version = "2.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c25829bde82205da46e1823b2259db6273379f626fc211f126f65654a2669be" +dependencies = [ + "chrono", + "deunicode", + "rand", +] + +[[package]] +name = "fastrand" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +dependencies = [ + "instant", +] + +[[package]] +name = "fastrand" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" + +[[package]] +name = "futures-executor" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" + +[[package]] +name = "futures-lite" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" +dependencies = [ + "fastrand 1.9.0", + "futures-core", + "futures-io", + "memchr", + "parking", + "pin-project-lite", + "waker-fn", +] + +[[package]] +name = "futures-lite" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" +dependencies = [ + "fastrand 2.0.2", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-macro" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.60", +] + +[[package]] +name = "futures-sink" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" + +[[package]] +name = "futures-task" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" + +[[package]] +name = "futures-util" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "gimli" +version = "0.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" + +[[package]] +name = "gloo-timers" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "gmp-mpfr-sys" +version = "1.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "362a6cc3cbe9f41aebe49c03b91aee8fa8fc69d32fb90533f6ed965a882e08e3" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "half" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" +dependencies = [ + "cfg-if", + "crunchy", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + +[[package]] +name = "iana-time-zone" +version = "0.1.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", +] + +[[package]] +name = "inout" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +dependencies = [ + "generic-array", +] + +[[package]] +name = "insta" +version = "1.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eab73f58e59ca6526037208f0e98851159ec1633cf17b6cd2e1f2c3fd5d53cc" +dependencies = [ + "console", + "lazy_static", + "linked-hash-map", + "serde", + "similar", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "io-lifetimes" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +dependencies = [ + "hermit-abi 0.3.9", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "ipld-core" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ede82a79e134f179f4b29b5fdb1eb92bd1b38c4dfea394c539051150a21b9b" +dependencies = [ + "cid 0.11.1", + "serde", + "serde_bytes", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "js-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "kv-log-macro" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" +dependencies = [ + "log", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +dependencies = [ + "spin", +] + +[[package]] +name = "libc" +version = "0.2.153" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" + +[[package]] +name = "libipld" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1ccd6b8ffb3afee7081fcaec00e1b099fd1c7ccf35ba5729d88538fcc3b4599" +dependencies = [ + "fnv", + "libipld-cbor", + "libipld-cbor-derive", + "libipld-core", + "libipld-json", + "libipld-macro", + "libipld-pb", + "log", + "multihash 0.18.1", + "thiserror", +] + +[[package]] +name = "libipld-cbor" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77d98c9d1747aa5eef1cf099cd648c3fd2d235249f5fed07522aaebc348e423b" +dependencies = [ + "byteorder", + "libipld-core", + "thiserror", +] + +[[package]] +name = "libipld-cbor-derive" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5ba3a729b72973e456a1812b0afe2e176a376c1836cc1528e9fc98ae8cb838" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", + "synstructure", +] + +[[package]] +name = "libipld-core" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5acd707e8d8b092e967b2af978ed84709eaded82b75effe6cb6f6cc797ef8158" +dependencies = [ + "anyhow", + "cid 0.10.1", + "core2", + "multibase", + "multihash 0.18.1", + "serde", + "thiserror", +] + +[[package]] +name = "libipld-json" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25856def940047b07b25c33d4e66d248597049ab0202085215dc4dca0487731c" +dependencies = [ + "libipld-core", + "multihash 0.18.1", + "serde", + "serde_json", +] + +[[package]] +name = "libipld-macro" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71171c54214f866ae6722f3027f81dff0931e600e5a61e6b1b6a49ca0b5ed4ae" +dependencies = [ + "libipld-core", +] + +[[package]] +name = "libipld-pb" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f2d0f866c4cd5dc9aa8068c429ba478d2882a3a4b70ab56f7e9a0eddf5d16f" +dependencies = [ + "bytes", + "libipld-core", + "quick-protobuf", + "thiserror", +] + +[[package]] +name = "libm" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" + +[[package]] +name = "linked-hash-map" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" + +[[package]] +name = "linux-raw-sys" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" + +[[package]] +name = "linux-raw-sys" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" + +[[package]] +name = "lock_api" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" +dependencies = [ + "value-bag", +] + +[[package]] +name = "memchr" +version = "2.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" + +[[package]] +name = "miniz_oxide" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +dependencies = [ + "adler", +] + +[[package]] +name = "multibase" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b3539ec3c1f04ac9748a260728e855f261b4977f5c3406612c884564f329404" +dependencies = [ + "base-x", + "data-encoding", + "data-encoding-macro", +] + +[[package]] +name = "multihash" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfd8a792c1694c6da4f68db0a9d707c72bd260994da179e6030a5dcee00bb815" +dependencies = [ + "blake2b_simd", + "blake2s_simd", + "blake3", + "core2", + "digest", + "multihash-derive", + "serde", + "serde-big-array", + "sha2", + "sha3", + "unsigned-varint 0.7.2", +] + +[[package]] +name = "multihash" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "076d548d76a0e2a0d4ab471d0b1c36c577786dfc4471242035d97a12a735c492" +dependencies = [ + "core2", + "serde", + "unsigned-varint 0.7.2", +] + +[[package]] +name = "multihash-derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6d4752e6230d8ef7adf7bd5d8c4b1f6561c1014c5ba9a37445ccefe18aa1db" +dependencies = [ + "proc-macro-crate", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", + "synstructure", +] + +[[package]] +name = "num-bigint-dig" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" +dependencies = [ + "byteorder", + "lazy_static", + "libm", + "num-integer", + "num-iter", + "num-traits", + "rand", + "serde", + "smallvec", + "zeroize", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d869c01cc0c455284163fd0092f1f93835385ccab5a98a0dcc497b2f8bf055a9" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_enum" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "object" +version = "0.32.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "oorandom" +version = "11.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" + +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + +[[package]] +name = "os_str_bytes" +version = "6.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" + +[[package]] +name = "parking" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.48.5", +] + +[[package]] +name = "pbkdf2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" +dependencies = [ + "digest", +] + +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "piper" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4" +dependencies = [ + "atomic-waker", + "fastrand 2.0.2", + "futures-io", +] + +[[package]] +name = "pkcs1" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" +dependencies = [ + "der", + "pkcs8", + "spki", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "plotters" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2c224ba00d7cadd4d5c660deaf2098e5e80e07846537c51f9cfa4be50c1fd45" +dependencies = [ + "num-traits", + "plotters-backend", + "plotters-svg", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "plotters-backend" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e76628b4d3a7581389a35d5b6e2139607ad7c75b17aed325f210aa91f4a9609" + +[[package]] +name = "plotters-svg" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38f6d39893cca0701371e3c27294f09797214b86f1fb951b89ade8ec04e2abab" +dependencies = [ + "plotters-backend", +] + +[[package]] +name = "polling" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" +dependencies = [ + "autocfg", + "bitflags 1.3.2", + "cfg-if", + "concurrent-queue", + "libc", + "log", + "pin-project-lite", + "windows-sys 0.48.0", +] + +[[package]] +name = "polling" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645493cf344456ef24219d02a768cf1fb92ddf8c92161679ae3d91b91a637be3" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi 0.3.9", + "pin-project-lite", + "rustix 0.38.34", + "tracing", + "windows-sys 0.52.0", +] + +[[package]] +name = "poly1305" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" +dependencies = [ + "cpufeatures", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "proc-macro-crate" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17d47ce914bf4de440332250b0edd23ce48c005f59fab39d3335866b114f11a" +dependencies = [ + "thiserror", + "toml", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proptest" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf" +dependencies = [ + "bit-set", + "bit-vec", + "bitflags 2.5.0", + "lazy_static", + "num-traits", + "rand", + "rand_chacha", + "rand_xorshift", + "regex-syntax", + "rusty-fork", + "tempfile", + "unarray", +] + +[[package]] +name = "prost" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0f5d036824e4761737860779c906171497f6d55681139d8312388f8fe398922" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-derive" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19de2de2a00075bf566bee3bd4db014b11587e84184d3f7a791bc17f1a8e9e48" +dependencies = [ + "anyhow", + "itertools 0.12.1", + "proc-macro2", + "quote", + "syn 2.0.60", +] + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quick-protobuf" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d6da84cc204722a989e01ba2f6e1e276e190f22263d0cb6ce8526fcdb0d2e1f" +dependencies = [ + "byteorder", +] + +[[package]] +name = "quick_cache" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "347e1a588d1de074eeb3c00eadff93db4db65aeb62aee852b1efd0949fe65b6c" +dependencies = [ + "ahash", + "equivalent", + "hashbrown 0.14.3", + "parking_lot", +] + +[[package]] +name = "quote" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_xorshift" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" +dependencies = [ + "rand_core", +] + +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "regex" +version = "1.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" + +[[package]] +name = "rsa" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc" +dependencies = [ + "const-oid", + "digest", + "num-bigint-dig", + "num-integer", + "num-traits", + "pkcs1", + "pkcs8", + "rand_core", + "signature", + "spki", + "subtle", + "zeroize", +] + +[[package]] +name = "rug" +version = "1.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8df4099c6fa90a1a7f5ddc0c7fba50991080fa2084d5a78808a5a3cab406bb9" +dependencies = [ + "az", + "gmp-mpfr-sys", + "libc", + "libm", + "num-integer", + "num-traits", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustix" +version = "0.37.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea8ca367a3a01fe35e6943c400addf443c0f57670e6ec51196f71a4b8762dd2" +dependencies = [ + "bitflags 1.3.2", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys 0.3.8", + "windows-sys 0.48.0", +] + +[[package]] +name = "rustix" +version = "0.38.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +dependencies = [ + "bitflags 2.5.0", + "errno", + "libc", + "linux-raw-sys 0.4.13", + "windows-sys 0.52.0", +] + +[[package]] +name = "rusty-fork" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" +dependencies = [ + "fnv", + "quick-error", + "tempfile", + "wait-timeout", +] + +[[package]] +name = "ryu" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "semver" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" +dependencies = [ + "serde", +] + +[[package]] +name = "serde" +version = "1.0.198" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9846a40c979031340571da2545a4e5b7c4163bdae79b301d5f86d03979451fcc" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-big-array" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd31f59f6fe2b0c055371bb2f16d7f0aa7d8881676c04a55b1596d1a17cd10a4" +dependencies = [ + "serde", +] + +[[package]] +name = "serde-byte-array" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63213ee4ed648dbd87db6fa993d4275b46bfb4ddfd95b3756045007c2b28f742" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_bytes" +version = "0.11.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b8497c313fd43ab992087548117643f6fcd935cbf36f176ffda0aacf9591734" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_derive" +version = "1.0.198" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e88edab869b01783ba905e7d0153f9fc1a6505a96e4ad3018011eedb838566d9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.60", +] + +[[package]] +name = "serde_ipld_dagcbor" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e880e0b1f9c7a8db874642c1217f7e19b29e325f24ab9f0fcb11818adec7f01" +dependencies = [ + "cbor4ii", + "cid 0.10.1", + "scopeguard", + "serde", +] + +[[package]] +name = "serde_ipld_dagcbor" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded35fbe4ab8fdec1f1d14b4daff2206b1eada4d6e708cb451d464d2d965f493" +dependencies = [ + "cbor4ii", + "ipld-core", + "scopeguard", + "serde", +] + +[[package]] +name = "serde_json" +version = "1.0.116" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest", + "keccak", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core", +] + +[[package]] +name = "similar" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa42c91313f1d05da9b26f267f931cf178d4aba455b4c4622dd7355eb80c6640" + +[[package]] +name = "skip_ratchet" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "395f41f8cb666c0a1e559b816e07f3e396505483c1863cd211534feac29141b7" +dependencies = [ + "blake3", + "hex", + "rand_core", + "serde", + "serde_bytes", +] + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "socket2" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "structmeta" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ad9e09554f0456d67a69c1584c9798ba733a5b50349a6c0d0948710523922d" +dependencies = [ + "proc-macro2", + "quote", + "structmeta-derive", + "syn 2.0.60", +] + +[[package]] +name = "structmeta-derive" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a60bcaff7397072dca0017d1db428e30d5002e00b6847703e2e42005c95fbe00" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.60", +] + +[[package]] +name = "subtle" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "synstructure" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "unicode-xid", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "tempfile" +version = "3.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +dependencies = [ + "cfg-if", + "fastrand 2.0.2", + "rustix 0.38.34", + "windows-sys 0.52.0", +] + +[[package]] +name = "test-log" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b319995299c65d522680decf80f2c108d85b861d81dfe340a10d16cee29d9e6" +dependencies = [ + "env_logger", + "test-log-macros", +] + +[[package]] +name = "test-log-macros" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8f546451eaa38373f549093fe9fd05e7d2bade739e2ddf834b9968621d60107" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.60", +] + +[[package]] +name = "test-strategy" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8361c808554228ad09bfed70f5c823caf8a3450b6881cc3a38eb57e8c08c1d9" +dependencies = [ + "proc-macro2", + "quote", + "structmeta", + "syn 2.0.60", +] + +[[package]] +name = "testresult" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52e045f5cf9ad69772c1c9652f5567a75df88bbb5a1310a64e53cab140c5c459" + +[[package]] +name = "testresult" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d72e255c0541f86589b0287139b70bd941a197ea4cea8fd8f87afe9c965a99e4" + +[[package]] +name = "textwrap" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" + +[[package]] +name = "thiserror" +version = "1.0.59" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0126ad08bff79f29fc3ae6a55cc72352056dfff61e3ff8bb7129476d44b23aa" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.59" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1cd413b5d558b4c5bf3680e324a6fa5014e7b7c067a51e69dbdf47eb7148b66" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.60", +] + +[[package]] +name = "tiny-bip39" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62cc94d358b5a1e84a5cb9109f559aa3c4d634d2b1b4de3d0fa4adc7c78e2861" +dependencies = [ + "anyhow", + "hmac", + "once_cell", + "pbkdf2", + "rand", + "rustc-hash", + "sha2", + "thiserror", + "unicode-normalization", + "wasm-bindgen", + "zeroize", +] + +[[package]] +name = "tinytemplate" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" +dependencies = [ + "backtrace", + "bytes", + "pin-project-lite", + "tokio-macros", +] + +[[package]] +name = "tokio-macros" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.60", +] + +[[package]] +name = "tokio-stream" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-test" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2468baabc3311435b55dd935f702f42cd1b8abb7e754fb7dfb16bd36aa88f9f7" +dependencies = [ + "async-stream", + "bytes", + "futures-core", + "tokio", + "tokio-stream", +] + +[[package]] +name = "tokio-util" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +dependencies = [ + "bytes", + "futures-core", + "futures-io", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-normalization" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-xid" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" + +[[package]] +name = "universal-hash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" +dependencies = [ + "crypto-common", + "subtle", +] + +[[package]] +name = "unsigned-varint" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6889a77d49f1f013504cec6bf97a2c730394adedaeb1deb5ea08949a50541105" + +[[package]] +name = "unsigned-varint" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb066959b24b5196ae73cb057f45598450d2c5f71460e98c49b738086eff9c06" + +[[package]] +name = "utf8parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" + +[[package]] +name = "value-bag" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74797339c3b98616c009c7c3eb53a0ce41e85c8ec66bd3db96ed132d20cfdee8" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "wait-timeout" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" +dependencies = [ + "libc", +] + +[[package]] +name = "waker-fn" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3c4517f54858c779bbcbf228f4fca63d121bf85fbecb2dc578cdf4a39395690" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +dependencies = [ + "cfg-if", + "serde", + "serde_json", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.60", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.60", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" + +[[package]] +name = "wasm-bindgen-test" +version = "0.3.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9bf62a58e0780af3e852044583deee40983e5886da43a271dd772379987667b" +dependencies = [ + "console_error_panic_hook", + "js-sys", + "scoped-tls", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-bindgen-test-macro", +] + +[[package]] +name = "wasm-bindgen-test-macro" +version = "0.3.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7f89739351a2e03cb94beb799d47fb2cac01759b40ec441f7de39b00cbf7ef0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.60", +] + +[[package]] +name = "web-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.5", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.5", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" +dependencies = [ + "windows_aarch64_gnullvm 0.52.5", + "windows_aarch64_msvc 0.52.5", + "windows_i686_gnu 0.52.5", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.5", + "windows_x86_64_gnu 0.52.5", + "windows_x86_64_gnullvm 0.52.5", + "windows_x86_64_msvc 0.52.5", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" + +[[package]] +name = "wnfs" +version = "0.2.2" +dependencies = [ + "aes-kw", + "anyhow", + "async-once-cell", + "async-recursion", + "async-std", + "async-stream", + "blake3", + "bytes", + "chacha20poly1305", + "chrono", + "env_logger", + "fake", + "futures", + "hex", + "insta", + "libipld-core", + "multihash 0.19.1", + "once_cell", + "proptest", + "quick_cache", + "rand", + "rand_chacha", + "rand_core", + "rsa", + "semver", + "serde", + "serde-byte-array", + "serde_bytes", + "serde_ipld_dagcbor 0.6.1", + "serde_json", + "sha2", + "sha3", + "skip_ratchet", + "test-log", + "test-strategy", + "testresult 0.4.0", + "thiserror", + "tiny-bip39", + "tokio", + "tokio-util", + "wnfs-common", + "wnfs-hamt", + "wnfs-nameaccumulator", + "wnfs-unixfs-file", +] + +[[package]] +name = "wnfs-bench" +version = "0.2.0" +dependencies = [ + "async-std", + "blake3", + "chrono", + "criterion", + "proptest", + "rand", + "wnfs", + "wnfs-common", + "wnfs-hamt", + "wnfs-nameaccumulator", +] + +[[package]] +name = "wnfs-common" +version = "0.2.0" +dependencies = [ + "anyhow", + "async-once-cell", + "async-std", + "base64", + "base64-serde", + "bytes", + "chrono", + "cid 0.10.1", + "dashmap", + "futures", + "libipld", + "multihash 0.18.1", + "once_cell", + "parking_lot", + "proptest", + "rand", + "rand_core", + "serde", + "serde_ipld_dagcbor 0.4.2", + "serde_json", + "thiserror", +] + +[[package]] +name = "wnfs-hamt" +version = "0.2.0" +dependencies = [ + "anyhow", + "async-once-cell", + "async-recursion", + "async-std", + "bitvec", + "blake3", + "chrono", + "either", + "futures", + "insta", + "libipld", + "log", + "multihash 0.18.1", + "once_cell", + "proptest", + "rand", + "rand_core", + "semver", + "serde", + "serde-byte-array", + "serde_bytes", + "serde_ipld_dagcbor 0.4.2", + "serde_json", + "test-strategy", + "testresult 0.3.0", + "thiserror", + "wnfs-common", +] + +[[package]] +name = "wnfs-nameaccumulator" +version = "0.2.0" +dependencies = [ + "anyhow", + "async-std", + "blake3", + "hex", + "insta", + "libipld", + "num-bigint-dig", + "num-integer", + "num-traits", + "once_cell", + "proptest", + "rand", + "rand_chacha", + "rand_core", + "rug", + "serde", + "serde_bytes", + "serde_json", + "test-strategy", + "thiserror", + "wnfs-common", + "zeroize", +] + +[[package]] +name = "wnfs-unixfs-file" +version = "0.2.0" +dependencies = [ + "anyhow", + "async-std", + "async-stream", + "bytes", + "data-encoding", + "futures", + "libipld", + "num_enum", + "proptest", + "prost", + "rand", + "rand_chacha", + "rand_core", + "tempfile", + "test-strategy", + "testresult 0.3.0", + "tokio", + "tokio-test", + "tokio-util", + "wnfs-common", +] + +[[package]] +name = "wnfs-wasm" +version = "0.2.2" +dependencies = [ + "anyhow", + "bytes", + "cfg-if", + "chrono", + "console_error_panic_hook", + "getrandom", + "js-sys", + "libipld-core", + "rand_core", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-bindgen-test", + "web-sys", + "wnfs", + "wnfs-nameaccumulator", +] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "zerocopy" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.60", +] + +[[package]] +name = "zeroize" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63381fa6624bf92130a6b87c0d07380116f80b565c42cf0d754136f0238359ef" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.60", +] diff --git a/wnfs/Cargo.toml b/wnfs/Cargo.toml index 22a629cb..3d777d26 100644 --- a/wnfs/Cargo.toml +++ b/wnfs/Cargo.toml @@ -28,6 +28,7 @@ bytes = "1.4.0" chacha20poly1305 = "0.10" chrono = { version = "0.4", default-features = false, features = ["clock", "std"] } futures = "0.3" +hex = "0.4.3" insta = { version = "1.30", features = ["json"] } libipld-core = { version = "0.16" } multihash = "0.19" diff --git a/wnfs/src/private/directory.rs b/wnfs/src/private/directory.rs index 171d4246..734ec94c 100644 --- a/wnfs/src/private/directory.rs +++ b/wnfs/src/private/directory.rs @@ -10,7 +10,8 @@ use chrono::{DateTime, Utc}; use libipld_core::cid::Cid; use rand_core::CryptoRngCore; use std::{ - collections::{BTreeMap, BTreeSet}, + cmp::Ordering, + collections::{btree_map::Entry, BTreeMap, BTreeSet}, fmt::Debug, }; use wnfs_common::{ @@ -48,7 +49,6 @@ pub struct PrivateDirectory { pub(crate) content: PrivateDirectoryContent, } -#[derive(Debug)] pub(crate) struct PrivateDirectoryContent { pub(crate) persisted_as: OnceCell, pub(crate) previous: BTreeSet<(usize, Encrypted)>, @@ -260,7 +260,7 @@ impl PrivateDirectory { .resolve_node(forest, store, Some(self.header.name.clone())) .await?; if search_latest { - Some(private_node.search_latest(forest, store).await?) + Some(private_node.search_latest_reconciled(forest, store).await?) } else { Some(private_node.clone()) } @@ -283,7 +283,7 @@ impl PrivateDirectory { .resolve_node_mut(forest, store, Some(self.header.name.clone())) .await?; if search_latest { - *private_node = private_node.search_latest(forest, store).await?; + *private_node = private_node.search_latest_reconciled(forest, store).await?; } Some(private_node) @@ -302,7 +302,7 @@ impl PrivateDirectory { let mut working_dir = Arc::clone(self); if search_latest { - working_dir = working_dir.search_latest(forest, store).await?; + working_dir = working_dir.search_latest_reconciled(forest, store).await?; } for (depth, segment) in path_segments.iter().enumerate() { @@ -329,7 +329,7 @@ impl PrivateDirectory { store: &impl BlockStore, ) -> Result> { if search_latest { - *self = self.clone().search_latest(forest, store).await?; + *self = self.clone().search_latest_reconciled(forest, store).await?; } let mut working_dir = self.prepare_next_revision()?; @@ -422,6 +422,49 @@ impl PrivateDirectory { Ok(cloned) } + /// Call this function to prepare this directory for conflict reconciliation merge changes. + /// Advances this node to the revision given in `target_header`. + /// Generates another previous link, unless this node is already a merge node, then this + /// simply updates all previous links to use the correct steps back. + /// Merge nodes preferably just grow in size. This allows them to combine more nicely + /// without causing further conflicts. + pub(crate) fn prepare_next_merge<'a>( + self: &'a mut Arc, + current_cid: Cid, + target_header: PrivateNodeHeader, + ) -> Result<&'a mut Self> { + let ratchet_diff = target_header.ratchet_diff_for_merge(&self.header)?; + + if self.content.previous.len() > 1 { + // This is a merge node + let cloned = Arc::make_mut(self); + cloned.content.persisted_as = OnceCell::new(); + cloned.header = target_header; + cloned.content.previous = std::mem::take(&mut cloned.content.previous) + .into_iter() + .map(|(ratchet_steps, link)| (ratchet_steps + ratchet_diff, link)) + .collect(); + + return Ok(cloned); + } + + // It's not a merge node, we need to advance the revision + + let temporal_key = self.header.derive_temporal_key(); + let previous_link = ( + ratchet_diff, + Encrypted::from_value(current_cid, &temporal_key)?, + ); + let cloned = Arc::make_mut(self); + + // We make sure to clear any cached states. + cloned.content.persisted_as = OnceCell::new(); + cloned.header = target_header; + cloned.content.previous = [previous_link].into_iter().collect(); + + Ok(cloned) + } + /// This prepares this directory for key rotation, usually for moving or /// copying the directory to some other place. /// @@ -802,6 +845,21 @@ impl PrivateDirectory { .as_dir() } + /// Like `search_latest`, but does a linear search and picks up any + /// writes that may need to be reconciled in the process. + /// If it finds that there's multiple concurrent writes to reconcile, then + /// it creates a merged directory and returns that. + pub async fn search_latest_reconciled( + self: Arc, + forest: &impl PrivateForest, + store: &impl BlockStore, + ) -> Result> { + PrivateNode::Dir(self) + .search_latest_reconciled(forest, store) + .await? + .as_dir() + } + /// Creates a new directory at the specified path. /// /// # Examples @@ -1307,6 +1365,128 @@ impl PrivateDirectory { pub fn as_node(self: &Arc) -> PrivateNode { PrivateNode::Dir(Arc::clone(self)) } + + /// Merges two directories that have been stored before together + /// (their CIDs must be passed in). + /// This only merges the directories shallowly. It doesn't recursively merge + /// them. This is handled by directories calling `search_latest_reconciled` + /// on every level. + /// Every directory should have a corresponding "identity directory" which is the + /// empty directory, which when merged, results in no change. + /// This function is both commutative and associative. + /// If there's a conflict, it prefers keeping the directory, then tie-breaks on + /// the private ref. + pub(crate) async fn merge( + self: &mut Arc, + target_header: PrivateNodeHeader, + our_cid: Cid, + other: &Arc, + other_cid: Cid, + forest: &impl PrivateForest, + store: &impl BlockStore, + ) -> Result<()> { + if our_cid == other_cid { + return Ok(()); + } + + let other_ratchet_diff = target_header.ratchet_diff_for_merge(&other.header)?; + + let parent_name = Some(self.header.name.clone()); + + let our = self.prepare_next_merge(our_cid, target_header)?; + + if our.content.previous.len() > 1 { + // This is a merge node. We'll just add its previous links. + our.content.previous.extend( + other + .content + .previous + .iter() + .cloned() + .map(|(rev_back, link)| (rev_back + other_ratchet_diff, link)), + ); + } else { + // The other node represents a write - we need to store a link to its CID + let temporal_key = &other.header.derive_temporal_key(); + our.content.previous.insert(( + other_ratchet_diff, + Encrypted::from_value(other_cid, temporal_key)?, + )); + } + + our.content + .metadata + .tie_break_with(&other.content.metadata)?; + + for (name, other_link) in other.content.entries.iter() { + match our.content.entries.entry(name.clone()) { + Entry::Vacant(vacant) => { + vacant.insert(other_link.clone()); + } + Entry::Occupied(mut occupied) => { + let our_link = occupied.get_mut(); + + // We just tie-break on the content cid. + // It's assumed both links have been resolved to their + // PrivateRef before, and we can tie-break on their content_cid. + // Otherwise, how would we have gotten `our_cid` and `other_cid` + // in this context? Both of these were gotten from `.store()`ing the + // nodes, which includes resolving the children to `PrivateRef`s. + let our_content_hash = our_link.crdt_tiebreaker()?; + let other_content_hash = other_link.crdt_tiebreaker()?; + + let ord = our_content_hash.cmp(&other_content_hash); + if ord == Ordering::Equal { + // there's nothing for us to do, they're equal + } else { + let our_node = our_link + .resolve_node_mut(forest, store, parent_name.clone()) + .await?; + + let other_node = other_link + .resolve_node(forest, store, parent_name.clone()) + .await?; + + match (our_node, other_node) { + (PrivateNode::Dir(_), PrivateNode::File(_)) => { + // our node wins, we don't need to do anything. + } + (PrivateNode::File(_), PrivateNode::Dir(_)) => { + // a directory wins over a file + *our_link = other_link.clone(); + } + // file vs. file and dir vs. dir cases + _ => { + // We tie-break as usual + if ord == Ordering::Greater { + *our_link = other_link.clone(); + } + } + } + } + } + } + } + + Ok(()) + } +} + +impl Debug for PrivateDirectoryContent { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("PrivateDirectoryContent") + .field( + "persisted_as", + &self + .persisted_as + .get() + .map_or("None".to_string(), |cid| format!("Some({cid})")), + ) + .field("previous", &self.previous) + .field("metadata", &self.metadata) + .field("entries", &self.entries) + .finish() + } } impl PrivateDirectoryContent { @@ -1421,6 +1601,7 @@ mod tests { use rand_chacha::ChaCha12Rng; use rand_core::SeedableRng; use test_log::test; + use testresult::TestResult; use wnfs_common::MemoryBlockStore; #[test(async_std::test)] @@ -2239,6 +2420,130 @@ mod tests { Ok(()) } + + #[async_std::test] + async fn test_conflict_reconciliation_merges_dirs() -> TestResult { + let rng = &mut ChaCha12Rng::from_entropy(); + let store = &MemoryBlockStore::new(); + let forest = &mut Arc::new(HamtForest::new_rsa_2048(rng)); + let mut dir = + PrivateDirectory::new_and_store(&forest.empty_name(), Utc::now(), forest, store, rng) + .await?; + + // Another client works on a fork + let mut fork = Arc::clone(&dir); + let forest_fork = &mut Arc::clone(forest); + + dir.write( + &["first_client.txt".into()], + true, + Utc::now(), + b"first".to_vec(), + forest, + store, + rng, + ) + .await?; + + dir.store(forest, store, rng).await?; + + // concurrent write + fork.write( + &["second_client.txt".into()], + true, + Utc::now(), + b"second".to_vec(), + forest_fork, + store, + rng, + ) + .await?; + + fork.store(forest, store, rng).await?; + + // we merge the forests + *forest = Arc::new(forest.merge(forest_fork, store).await?); + + // This should reconcile the changes + dir = dir.search_latest_reconciled(forest, store).await?; + + let entries = dir.get_entries().cloned().collect::>(); + + assert_eq!( + entries, + vec![ + "first_client.txt".to_string(), + "second_client.txt".to_string() + ] + ); + + Ok(()) + } + + #[async_std::test] + async fn test_conflict_reconciliation_concurrently_created_files() -> TestResult { + let rng = &mut ChaCha12Rng::from_entropy(); + let store = &MemoryBlockStore::new(); + let forest = &mut Arc::new(HamtForest::new_rsa_2048(rng)); + let mut dir = + PrivateDirectory::new_and_store(&forest.empty_name(), Utc::now(), forest, store, rng) + .await?; + + dir.write( + &["file.txt".into()], + true, + Utc::now(), + b"init".to_vec(), + forest, + store, + rng, + ) + .await?; + + dir.store(forest, store, rng).await?; + + // Another client works on a fork + let mut fork = Arc::clone(&dir); + let forest_fork = &mut Arc::clone(forest); + + dir.write( + &["file.txt".into()], + true, + Utc::now(), + b"first".to_vec(), + forest, + store, + rng, + ) + .await?; + + dir.store(forest, store, rng).await?; + + // concurrent write + fork.write( + &["file.txt".into()], + true, + Utc::now(), + b"second".to_vec(), + forest_fork, + store, + rng, + ) + .await?; + + fork.store(forest, store, rng).await?; + + // we merge the forests + *forest = Arc::new(forest.merge(forest_fork, store).await?); + + let content = + String::from_utf8(dir.read(&["file.txt".into()], true, forest, store).await?)?; + + assert_ne!(content, "init"); + assert!(content == "first" || content == "second"); + + Ok(()) + } } #[cfg(test)] diff --git a/wnfs/src/private/encrypted.rs b/wnfs/src/private/encrypted.rs index acc740d1..9928f034 100644 --- a/wnfs/src/private/encrypted.rs +++ b/wnfs/src/private/encrypted.rs @@ -1,4 +1,5 @@ use super::TemporalKey; +use crate::utils::OnceCellDebug; use anyhow::Result; use once_cell::sync::OnceCell; use serde::{de::DeserializeOwned, Deserialize, Serialize}; @@ -16,12 +17,24 @@ use serde::{de::DeserializeOwned, Deserialize, Serialize}; /// It can be resolved to the plaintext value `T`, when /// you call `resolve_value`. Any subsequent calls to /// `resolve_value` will re-use a cached, decrypted value. -#[derive(Debug, Clone, Eq)] +#[derive(Clone, Eq)] pub struct Encrypted { ciphertext: Vec, value_cache: OnceCell, } +impl std::fmt::Debug for Encrypted { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("Encrypted") + .field("ciphertext", &hex::encode(&self.ciphertext)) + .field( + "value_cache", + &OnceCellDebug(self.value_cache.get().map(|inner| format!("{inner:?}"))), + ) + .finish() + } +} + impl Encrypted { /// Constructs an `Encrypted` wrapper from a given plaintext value. /// diff --git a/wnfs/src/private/file.rs b/wnfs/src/private/file.rs index af144696..21b5aeb2 100644 --- a/wnfs/src/private/file.rs +++ b/wnfs/src/private/file.rs @@ -3,7 +3,9 @@ use super::{ PrivateNode, PrivateNodeContentSerializable, PrivateNodeHeader, PrivateRef, SnapshotKey, TemporalKey, AUTHENTICATION_TAG_SIZE, BLOCK_SEGMENT_DSI, HIDING_SEGMENT_DSI, NONCE_SIZE, }; -use crate::{error::FsError, is_readable_wnfs_version, traits::Id, WNFS_VERSION}; +use crate::{ + error::FsError, is_readable_wnfs_version, traits::Id, utils::OnceCellDebug, WNFS_VERSION, +}; use anyhow::{bail, Result}; use async_once_cell::OnceCell; use async_stream::try_stream; @@ -16,7 +18,7 @@ use libipld_core::{ }; use rand_core::CryptoRngCore; use serde::{Deserialize, Serialize}; -use std::{collections::BTreeSet, iter}; +use std::{cmp::Ordering, collections::BTreeSet, iter}; use wnfs_common::{ utils::{self, Arc, BoxStream}, BlockStore, Metadata, CODEC_RAW, MAX_BLOCK_SIZE, @@ -81,7 +83,6 @@ pub struct PrivateFile { pub(crate) content: PrivateFileContent, } -#[derive(Debug)] pub(crate) struct PrivateFileContent { pub(crate) persisted_as: OnceCell, pub(crate) previous: BTreeSet<(usize, Encrypted)>, @@ -686,7 +687,7 @@ impl PrivateFile { store: &impl BlockStore, rng: &mut impl CryptoRngCore, ) -> Result<()> { - self.content.metadata = Metadata::new(time); + self.content.metadata.upsert_mtime(time); // TODO(matheus23): Use heuristic to figure out whether to store data inline self.content.content = Self::prepare_content_streaming(self.header.get_name(), content, forest, store, rng) @@ -752,6 +753,49 @@ impl PrivateFile { Ok(cloned) } + /// Call this function to prepare this file for conflict reconciliation merge changes. + /// Advances this node to the revision given in `target_header`. + /// Generates another previous link, unless this node is already a merge node, then this + /// simply updates all previous links to use the correct steps back. + /// Merge nodes preferably just grow in size. This allows them to combine more nicely + /// without causing further conflicts. + pub(crate) fn prepare_next_merge<'a>( + self: &'a mut Arc, + current_cid: Cid, + target_header: PrivateNodeHeader, + ) -> Result<&'a mut Self> { + let ratchet_diff = target_header.ratchet_diff_for_merge(&self.header)?; + + if self.content.previous.len() > 1 { + // This is a merge node + let cloned = Arc::make_mut(self); + cloned.content.persisted_as = OnceCell::new(); + cloned.header = target_header; + cloned.content.previous = std::mem::take(&mut cloned.content.previous) + .into_iter() + .map(|(ratchet_steps, link)| (ratchet_steps + ratchet_diff, link)) + .collect(); + + return Ok(cloned); + } + + // It's not a merge node, we need to advance the revision + + let temporal_key = self.header.derive_temporal_key(); + let previous_link = ( + ratchet_diff, + Encrypted::from_value(current_cid, &temporal_key)?, + ); + let cloned = Arc::make_mut(self); + + // We make sure to clear any cached states. + cloned.content.persisted_as = OnceCell::new(); + cloned.header = target_header; + cloned.content.previous = [previous_link].into_iter().collect(); + + Ok(cloned) + } + /// This prepares this file for key rotation, usually for moving or /// copying the file to some other place. /// @@ -835,6 +879,65 @@ impl PrivateFile { pub fn as_node(self: &Arc) -> PrivateNode { PrivateNode::File(Arc::clone(self)) } + + /// Merges two private files together. + /// The files must have been stored before (that's the CIDs that + /// are passed in). + /// This function is both commutative and associative. + pub(crate) fn merge( + self: &mut Arc, + target_header: PrivateNodeHeader, + our_cid: Cid, + other: &Arc, + other_cid: Cid, + ) -> Result<()> { + if our_cid == other_cid { + return Ok(()); + } + + let other_ratchet_diff = target_header.ratchet_diff_for_merge(&other.header)?; + + let our = self.prepare_next_merge(our_cid, target_header)?; + + if our.content.previous.len() > 1 { + // This is a merge node. We'll just add its previous links. + our.content.previous.extend( + other + .content + .previous + .iter() + .cloned() + .map(|(rev_back, link)| (rev_back + other_ratchet_diff, link)), + ); + } else { + // The other node represents a write - we need to store a link to its CID + let temporal_key = &other.header.derive_temporal_key(); + our.content.previous.insert(( + other_ratchet_diff, + Encrypted::from_value(other_cid, temporal_key)?, + )); + } + + let our_hash = our.content.content.crdt_tiebreaker()?; + let other_hash = other.content.content.crdt_tiebreaker()?; + + match our_hash.cmp(&other_hash) { + Ordering::Greater => { + our.content.content.clone_from(&other.content.content); + our.content.metadata.clone_from(&other.content.metadata); + } + Ordering::Equal => { + our.content + .metadata + .tie_break_with(&other.content.metadata)?; + } + Ordering::Less => { + // we take ours + } + } + + Ok(()) + } } impl PrivateFileContent { @@ -877,6 +980,13 @@ impl PrivateFileContent { } } +impl FileContent { + pub(crate) fn crdt_tiebreaker(&self) -> Result<[u8; 32]> { + let bytes = serde_ipld_dagcbor::to_vec(self)?; + Ok(blake3::hash(&bytes).into()) + } +} + impl PrivateForestContent { /// Take some plaintext to encrypt and store in given private forest. /// @@ -1185,6 +1295,20 @@ impl Id for PrivateFile { } } +impl std::fmt::Debug for PrivateFileContent { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("PrivateFileContent") + .field( + "persisted_as", + &OnceCellDebug(self.persisted_as.get().map(|cid| format!("{cid}"))), + ) + .field("previous", &self.previous) + .field("metadata", &self.metadata) + .field("content", &self.content) + .finish() + } +} + //-------------------------------------------------------------------------------------------------- // Tests //-------------------------------------------------------------------------------------------------- diff --git a/wnfs/src/private/forest/traits.rs b/wnfs/src/private/forest/traits.rs index cc9833eb..266edbd6 100644 --- a/wnfs/src/private/forest/traits.rs +++ b/wnfs/src/private/forest/traits.rs @@ -140,7 +140,7 @@ pub trait PrivateForest: CondSync { temporal_key: &'a TemporalKey, store: &'a impl BlockStore, parent_name: Option, - ) -> BoxStream<'a, Result> + ) -> BoxStream<'a, Result<(Cid, PrivateNode)>> where Self: Sized, { @@ -152,7 +152,7 @@ pub trait PrivateForest: CondSync { Ok(Some(cids)) => { for cid in cids { match PrivateNode::from_cid(*cid, temporal_key, self, store, parent_name.clone()).await { - Ok(node) => yield Ok(node), + Ok(node) => yield Ok((*cid, node)), Err(e) if e.downcast_ref::().is_some() => { // we likely matched a PrivateNodeHeader instead of a PrivateNode. // we skip it diff --git a/wnfs/src/private/keys/privateref.rs b/wnfs/src/private/keys/privateref.rs index 100c98a1..ecc95f11 100644 --- a/wnfs/src/private/keys/privateref.rs +++ b/wnfs/src/private/keys/privateref.rs @@ -130,8 +130,8 @@ impl Debug for PrivateRef { f.debug_struct("PrivateRef") .field("label", &rev_name_hash_str) - .field("temporal_key", &self.temporal_key.0) - .field("content_cid", &self.content_cid) + .field("temporal_key", &hex::encode(self.temporal_key.0)) + .field("content_cid", &format!("{}", self.content_cid)) .finish() } } diff --git a/wnfs/src/private/link.rs b/wnfs/src/private/link.rs index 391c7f5e..fa3dcf7c 100644 --- a/wnfs/src/private/link.rs +++ b/wnfs/src/private/link.rs @@ -1,9 +1,11 @@ use super::{ forest::traits::PrivateForest, PrivateDirectory, PrivateFile, PrivateNode, PrivateRef, }; -use anyhow::Result; +use crate::utils::OnceCellDebug; +use anyhow::{anyhow, Result}; use async_once_cell::OnceCell; use async_recursion::async_recursion; +use libipld_core::{cid::Cid, multihash::MultihashGeneric}; use rand_core::CryptoRngCore; use wnfs_common::{ utils::{Arc, CondSend}, @@ -11,7 +13,6 @@ use wnfs_common::{ }; use wnfs_nameaccumulator::Name; -#[derive(Debug)] pub(crate) enum PrivateLink { Encrypted { private_ref: PrivateRef, @@ -24,6 +25,19 @@ pub(crate) enum PrivateLink { }, } +impl std::fmt::Debug for PrivateLink { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::Encrypted { private_ref, cache } => f + .debug_struct("Encrypted") + .field("private_ref", private_ref) + .field("cache", &OnceCellDebug(cache.get())) + .finish(), + Self::Decrypted { node } => f.debug_struct("Decrypted").field("node", node).finish(), + } + } +} + impl PrivateLink { pub(crate) fn from_ref(private_ref: PrivateRef) -> Self { Self::Encrypted { @@ -126,6 +140,13 @@ impl PrivateLink { } } + pub fn get_content_cid(&self) -> Option<&Cid> { + match self { + Self::Encrypted { private_ref, .. } => Some(&private_ref.content_cid), + Self::Decrypted { node } => node.get_persisted_as().get(), + } + } + /// Creates a link to a directory node. #[inline] pub(crate) fn with_dir(dir: PrivateDirectory) -> Self { @@ -137,6 +158,10 @@ impl PrivateLink { pub(crate) fn with_file(file: PrivateFile) -> Self { Self::from(PrivateNode::File(Arc::new(file))) } + + pub(crate) fn crdt_tiebreaker(&self) -> Result> { + Ok(*self.get_content_cid().ok_or_else(|| anyhow!("Impossible case: CRDT tiebreaker needed on node wasn't persisted before tie breaking"))?.hash()) + } } impl PartialEq for PrivateLink { diff --git a/wnfs/src/private/node/header.rs b/wnfs/src/private/node/header.rs index fa850b02..2731b60a 100644 --- a/wnfs/src/private/node/header.rs +++ b/wnfs/src/private/node/header.rs @@ -1,13 +1,14 @@ -use super::{PrivateNodeHeaderSerializable, TemporalKey, REVISION_SEGMENT_DSI}; +use super::{PrivateNode, PrivateNodeHeaderSerializable, TemporalKey, REVISION_SEGMENT_DSI}; use crate::{ error::FsError, private::{forest::traits::PrivateForest, RevisionRef}, }; -use anyhow::{bail, Result}; +use anyhow::{anyhow, bail, Result}; +use futures::TryStreamExt; use libipld_core::cid::Cid; use rand_core::CryptoRngCore; use skip_ratchet::Ratchet; -use std::fmt::Debug; +use std::{collections::BTreeMap, fmt::Debug}; use wnfs_common::{BlockStore, CODEC_RAW}; use wnfs_hamt::Hasher; use wnfs_nameaccumulator::{Name, NameSegment}; @@ -214,6 +215,78 @@ impl PrivateNodeHeader { } Ok(header) } + + /// Returns the multivalue of nodes (and their corresponding CIDs) from + /// the forest at this header's revision. + pub(crate) async fn get_multivalue( + &self, + forest: &impl PrivateForest, + store: &impl BlockStore, + ) -> Result> { + let mountpoint = self.name.parent(); + + let name_hash = + blake3::Hasher::hash(&forest.get_accumulated_name(&self.get_revision_name())); + + forest + .get_multivalue_by_hash(&name_hash, &self.derive_temporal_key(), store, mountpoint) + .try_collect::>() + .await + } + + /// Seeks this header to the next free private forest slot + /// as well as the set of private nodes that were written to + pub(crate) async fn seek_unmerged_heads( + &mut self, + forest: &impl PrivateForest, + store: &impl BlockStore, + ) -> Result> { + let mut previous_keys = Vec::with_capacity(1); + let mut heads = BTreeMap::new(); + + loop { + let nodes = self.get_multivalue(forest, store).await?; + + if nodes.is_empty() { + break; + } + + for (cid, node) in nodes { + // decrypt all previous links & remove any heads that they refer to + for (reach_back, encrypted_cid) in node.get_previous().iter() { + // This requires linear memory in the amount of revisions we seek, but that's *probably* fine? + // I'm pretty sure we're allocating and holding on to more memory linearly in the implementation + // of `PrivateForest` per-revision anyways, so if we wanted to optimize that, we'd look there + // instead. + // None if reach_back > previous_keys.len(), then it's older than from where we started + if *reach_back <= previous_keys.len() { + let key = &previous_keys[previous_keys.len() - reach_back]; + let previous_cid = encrypted_cid.resolve_value(key)?; + // We don't need to merge the older head, as we found a newer + // version of this node. + heads.remove(previous_cid); + } + } + // Add the newly found node to our heads + heads.insert(cid, node); + } + + previous_keys.push(TemporalKey::new(&self.ratchet)); + self.advance_ratchet(); + } + + Ok(heads) + } + + pub(crate) fn ratchet_diff_for_merge(&self, other: &Self) -> Result { + self.ratchet + .compare(&other.ratchet, 10_000_000) + .map_err(|e| { + anyhow!("merge node set on different ratchet track (or history too far away): {e}") + })? + .try_into() + .map_err(|_| anyhow!("merge node set to past revision")) + } } impl PartialEq for PrivateNodeHeader { diff --git a/wnfs/src/private/node/keys.rs b/wnfs/src/private/node/keys.rs index 337600c7..25a359a7 100644 --- a/wnfs/src/private/node/keys.rs +++ b/wnfs/src/private/node/keys.rs @@ -55,11 +55,11 @@ pub(crate) const SNAPSHOT_KEY_DSI: &str = "wnfs/1.0/snapshot key derivation from //-------------------------------------------------------------------------------------------------- /// The key used to encrypt the content of a node. -#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] +#[derive(PartialEq, Eq, Clone, Serialize, Deserialize)] pub struct SnapshotKey(#[serde(with = "serde_byte_array")] pub(crate) [u8; KEY_BYTE_SIZE]); /// The key used to encrypt the header section of a node. -#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] +#[derive(PartialEq, Eq, Clone, Serialize, Deserialize)] pub struct TemporalKey(#[serde(with = "serde_byte_array")] pub(crate) [u8; KEY_BYTE_SIZE]); //-------------------------------------------------------------------------------------------------- @@ -215,6 +215,22 @@ impl SnapshotKey { } } +impl Debug for SnapshotKey { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_tuple("SnapshotKey") + .field(&hex::encode(&self.0[..8])) + .finish() + } +} + +impl Debug for TemporalKey { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_tuple("TemporalKey") + .field(&hex::encode(&self.0[..8])) + .finish() + } +} + //-------------------------------------------------------------------------------------------------- // Proptests //-------------------------------------------------------------------------------------------------- diff --git a/wnfs/src/private/node/node.rs b/wnfs/src/private/node/node.rs index 92ebed34..76b2f6cb 100644 --- a/wnfs/src/private/node/node.rs +++ b/wnfs/src/private/node/node.rs @@ -11,16 +11,18 @@ use anyhow::{bail, Result}; use async_once_cell::OnceCell; use async_recursion::async_recursion; use chrono::{DateTime, Utc}; -use futures::StreamExt; use libipld_core::cid::Cid; use rand_core::CryptoRngCore; use skip_ratchet::{JumpSize, RatchetSeeker}; -use std::{cmp::Ordering, collections::BTreeSet, fmt::Debug}; +use std::{ + cmp::Ordering, + collections::{BTreeMap, BTreeSet}, + fmt::Debug, +}; use wnfs_common::{ utils::{Arc, CondSend}, BlockStore, }; -use wnfs_hamt::Hasher; use wnfs_nameaccumulator::Name; //-------------------------------------------------------------------------------------------------- @@ -183,10 +185,6 @@ impl PrivateNode { /// If this node is a merge-node, it has two or more previous Cids. /// A single previous Cid must be from the previous revision, but all /// other Cids may appear in even older revisions. - /// - /// The previous links is `None`, it doesn't have previous Cids. - /// The node is malformed if the previous links are `Some`, but - /// the `BTreeSet` inside is empty. #[allow(clippy::mutable_key_type)] pub fn get_previous(&self) -> &BTreeSet<(usize, Encrypted)> { match self { @@ -382,6 +380,87 @@ impl PrivateNode { .ok_or(FsError::NotFound.into()) } + /// Go to the latest known node and do conflict reconciliation, if multiple + /// concurrent writes are detected. + pub async fn reconcile_latest( + &mut self, + forest: &mut impl PrivateForest, + store: &impl BlockStore, + rng: &mut (impl CryptoRngCore + CondSend), + ) -> Result<()> { + self.store(forest, store, rng).await?; + self.search_latest_reconciled(forest, store).await?; + Ok(()) + } + + /// Will reconcile this node with any newer changes fetched from the + /// PrivateForest. But will overwrite any in-memory changes that haven't been + /// persisted yet. + pub async fn search_latest_reconciled( + &self, + forest: &impl PrivateForest, + store: &impl BlockStore, + ) -> Result { + let mut header = self.get_header().clone(); + let mut unmerged_heads = header.seek_unmerged_heads(forest, store).await?; + + if let Some((cid, head)) = unmerged_heads.pop_first() { + if unmerged_heads.is_empty() { + // There was only one unmerged head, we can fast forward + Ok(head) + } else { + // We need to create a merge node + Self::merge(header, (cid, head), unmerged_heads, forest, store).await + } + } else { + // If None, then there's nothing to merge in (and this node was never stored) + Ok(self.clone()) + } + } + + /// Merges a non-empty set of conflicting private nodes together + /// by merging them pair-wise. + pub(crate) async fn merge( + header: PrivateNodeHeader, + (cid, node): (Cid, PrivateNode), + nodes: BTreeMap, + forest: &impl PrivateForest, + store: &impl BlockStore, + ) -> Result { + match node { + PrivateNode::File(mut file) => { + // They *should* all be files, but we won't error out if they're not. + let files = nodes + .into_iter() + .filter_map(|(cid, node)| node.as_file().ok().map(|file| (cid, file))) + .collect::>(); + + for (other_cid, other_file) in files { + file.merge(header.clone(), cid, &other_file, other_cid)?; + } + + Ok(PrivateNode::File(file)) + } + PrivateNode::Dir(mut dir) => { + // They *should* all be directories, but we won't error out if one of them isn't. + let dirs = nodes + .into_iter() + .filter_map(|(cid, node)| node.as_dir().ok().map(|dir| (cid, dir))) + .collect::>(); + + for (other_cid, other_dir) in dirs { + // Need to pass in rng & mutable forest access + // for the cases where we haven't yet written a node to + // the forest, but need its hash for tie-breaking. + dir.merge(header.clone(), cid, &other_dir, other_cid, forest, store) + .await?; + } + + Ok(PrivateNode::Dir(dir)) + } + } + } + /// Seek ahead to the latest revision in this node's history. /// /// The result are all nodes from the latest revision, each one @@ -392,7 +471,6 @@ impl PrivateNode { store: &impl BlockStore, ) -> Result> { let header = self.get_header(); - let mountpoint = header.name.parent(); let current_name = &header.get_revision_name(); if !forest.has(current_name, store).await? { @@ -426,21 +504,12 @@ impl PrivateNode { } current_header.update_ratchet(search.current().clone()); - - let name_hash = - blake3::Hasher::hash(&forest.get_accumulated_name(¤t_header.get_revision_name())); - - forest - .get_multivalue_by_hash( - &name_hash, - ¤t_header.derive_temporal_key(), - store, - mountpoint, - ) - .collect::>>() - .await + Ok(current_header + .get_multivalue(forest, store) + .await? .into_iter() - .collect::>>() + .map(|(_, node)| node) + .collect()) } /// Tries to deserialize and decrypt a PrivateNode at provided PrivateRef diff --git a/wnfs/src/private/snapshots/wnfs__private__directory__snapshot_tests__private_fs.snap b/wnfs/src/private/snapshots/wnfs__private__directory__snapshot_tests__private_fs.snap index c262b2a5..1d0e1aae 100644 --- a/wnfs/src/private/snapshots/wnfs__private__directory__snapshot_tests__private_fs.snap +++ b/wnfs/src/private/snapshots/wnfs__private__directory__snapshot_tests__private_fs.snap @@ -4,7 +4,7 @@ expression: values --- [ { - "cid": "bafyr4ibfiuriisxil5heizpfzjgjezce2t44ob7t7njd2ygsuye7adokzi", + "cid": "bafyr4iadotazcy7rlc5bohldge57jghoqhlzm6i6zd3kjmfo6dsmhxqmum", "value": { "accumulator": { "generator": { @@ -34,10 +34,10 @@ expression: values }, [ { - "/": "bafkr4iacv4rx64g5hcak7p3eqh5rjvtctk3tms3l55l7s6524uojui3gpy" + "/": "bafkr4ica5jxbgptjixaefiihhiueqiw2jh5opj77yhjf7xbalqjq3i7p24" }, { - "/": "bafkr4ignsuoyxnoxqlw6wrryymod2qpzczjwqdaallf4ldv4ujzbzj73je" + "/": "bafkr4ihckkhdnl2o2aruyty5k43rzqserloitjkmc6c6tmmjqhz4kfyapa" } ] ] @@ -51,10 +51,10 @@ expression: values }, [ { - "/": "bafkr4iahin3hzsm2b73deeogau3shuwtrq2k5ygczipcdcnvf2xoopd64y" + "/": "bafkr4ie3csut53hpy4iuinpnbub52zalqiskgjhu7avkyj7t553gfvxjbu" }, { - "/": "bafkr4ihzowv3xejcx7gmjdjeiekbdynuoyu3ghn6zunvwu57s4dw3kwhmi" + "/": "bafkr4igqi5pawxlga75cbj4rtmxviawihqrrndrmbmzfzt7membnfvpdgy" } ] ] @@ -68,10 +68,10 @@ expression: values }, [ { - "/": "bafkr4ibhraqq4prlc4zsuddrlwebj2l3emgxehgdcuvppohr6y2ruoozx4" + "/": "bafkr4ifclqucnvehol5nhv7o4it2jcrykb7vqfueh3h5qguziesf3dz4uq" }, { - "/": "bafkr4ibpva2zlmfnlujo3znj2wox3bvysnhhhykiwd4xeksazyivwihria" + "/": "bafkr4igm2czfndo37tusfikagtz5kejhstu4s6ti7jwzg7gajiie2zzc7y" } ] ] @@ -85,10 +85,10 @@ expression: values }, [ { - "/": "bafkr4icyunetfy6kvn4wrplm7mruibripujkyjjbso4yoixcvoi53qfboy" + "/": "bafkr4ibojs5rmbq5bwcsi2lfi7zp2ktnr2awouczs3rul3b4mioxhqdi7q" }, { - "/": "bafkr4idfb6czevqvtq4r5m5trlchtxo35gmhm3tzqiyhzldtn4aaey2vpe" + "/": "bafkr4ig2dh6lqnfslf3waewp52o4m7vjgfe7rpaguf4r7hnltqelodz4om" } ] ] @@ -102,10 +102,10 @@ expression: values }, [ { - "/": "bafkr4ia5xkxzhnkaxwvtfvz2ot4m4pf3aapvusg57ixrnubf2g2pe5vsdq" + "/": "bafkr4icdf6vi235jl6bqrmg3fmdba7ximvdsac45syigmxmpb4wolbtidy" }, { - "/": "bafkr4iev75qq7mmrndgf5rtrwfbp7h3acwrs6ws322micp6lqmatzuv6iq" + "/": "bafkr4ie4rlwzcbhcxirnqhgdxngizjvnybonto5hxevbipxkzpkhj2y55q" } ] ] @@ -119,10 +119,10 @@ expression: values }, [ { - "/": "bafkr4if2ng6ts2xei6cca53d6tgq2igjioiirk7gm4bvciwhdddhqno77i" + "/": "bafkr4igljnzokpfougv3yiqmsxhkqpvz26q6y7jadyuhmzpsvggz2ver7e" }, { - "/": "bafkr4ihhaet6xdsol6oabwqjopk5jpppfd7sshvtdrfhekryrvi6qspxdy" + "/": "bafkr4igtg3oup6h2veg7susxuthdrad6zlifvm2ejxt7gbiq6r5ptyrrzm" } ] ], @@ -134,10 +134,10 @@ expression: values }, [ { - "/": "bafkr4idg6snyh35lnpvzcgesjkaaxx6zjxshpogd64ze64a5kktfo3nzvq" + "/": "bafkr4ic4myx7wgjgmmygtaxaz33krp5mxx2zeciu6xvcwsv63eegcq4rju" }, { - "/": "bafkr4ifigj5hkswtnxpipcaklzl7jjte4u2jzry6azviw4uionctsa5wqi" + "/": "bafkr4ih2d4uzcjq5uagh4r7woymauxmyg3qar2bea5pv7jul7mqpy5rljq" } ] ] @@ -187,10 +187,10 @@ expression: values "structure": "hamt", "version": "0.1.0" }, - "bytes": "pGRyb290gkLpDYiBglkBAJSKro8RwpMKaVt++iCbLBnMcuafEy0K0vQ6W09eA4eTbFKcQG4cqemTj1+hq1iyC9o8YXxzCwAq/z1Mv15OUDPjHUxWxiJ7f3E+Ta/AE0eq+kXRI1PcIe5+8AwsVaGHHruC8KaB2u+DrO9fOf+wzgWIqnRu1leQsuADqS0nWm53V4W/sDClh165KMjovUdFMbQVyVpzXQC2U75BI93aynh32h9o75AGqdWy/LYd5ma+x4XwiTDt4M7vFLdrQC7MVnVTi/QaFRHPhj45aO1uKc9qQjPCKObpxJ2/J8HZWpEKYDhrI6PUsV+743HDIKGJmuNz1cQlJOJa69LZ/1orXvqC2CpYJQABVR4gAq8jf3DdOICvv2SB+xTWYpq3Nktr71f5e7rlHJojZn7YKlglAAFVHiDNlR2LtdeC7etGOMMcPUH5FlNoDABay8WOvKJyHKf7SYGCWQEAoQFcAlCbAaqjLdfLoKs5ES5a+CNCfJz16DfVCFUsXAHhv1IFwEoWZrNxcm/e9ufBeH4YIGW05YN9aoy4iv6iHBeT8XgHay5LgBUKWAWl3NPMlt/N9Y7hk5kjynmAXNI8nkGwKfe0UamToMdLTpqpzeiTpjo2D/sIHDwZBpGAe/M496cLPZAXQe/nkqiePII8UfpIuoEJ0MaZWcOVIBJ+15YhJSW/f1ver2dr3TpWqJzZ80Ftc+oUJSZ3zqQwz6EJC1bqIfMufm1MjSZV4s09xe5QnI7WSjK/Z+jintpsAZOJ6znSrj+u12MKOKbxnykxRCm+8KmVqaeRqHzUmAY7ZoLYKlglAAFVHiAHQ3Z8yZoP9jIRxgU3I9LTjDSu4MLKHiGJtS6u5zx+5tgqWCUAAVUeIPl1q7uRIr/MxI0kQRQR4bR2KbMdvs0bW1O/lwdtqsdigYJZAQCefbz69NUTn2iwR7ptOqxi/wDxJ90NULG9M4tKcllguV3lcA5ejNv+Zj7tXi/mOI4NFGtqxnyQCb3PKmCu8w61OCuhUUSKcYBKEb6mz6K/EnCEbbEAoixSew5Di3Tum1q8XItu8EGDsvch2bV9QhcgN8RkcA9vRRDMMaBkoGA0uXAR2YtEwvRo6HtoysRTRjpuL73kyKV3+VTGnyTWr/5uvGfmEPv4L9poWNJp0pjsvX/j+zMv/0DpKz5ZdXH4HwccOmflR8hg71IMhwvOjH/LAb9vEEXyxp8w9nCWtvm3pNF2lcG95NxWMMb71y8+h+0+g2b89kIn5h/mxJZuF9SUgtgqWCUAAVUeICeIIQ4+KxczKgxxXYgU6XsjDXIcwxUq97jx9jUaOdm/2CpYJQABVR4gL6g1lbCtXRLt5anVnX2GuJNOc+FIsPlyKkDOEVsg8UCBglkBAKRPHWPRPAgojBiUaQlfWxksWEnsweUhAiupm51CYF12Q7ObWji1kkThmo0lNPiOFFkAjQ+9ADz30YbBB9iMSGDAZp40uomncAgeZeSM0tKiDGad0nXgjh8rL1/5re4+8zMb0oDGKXf8gVfiaYx1vRF7+jbdZ6fHQgokFC2csGTqF95yccvgU+gBBMrTSVBcj6nn6Vy96u7MFU8lsPVMkj/e5hI6xBXShG7R+CXT5qiEcGxLuBgN4CdsPKbDXas08ZlGuB7kHFP7WvzN5ec3HjXA+RNxuDyHETmZEse8CwnZw8V0lN7yAWLwp+tgw4Hsli6nHOE8Ee/JbPUE1zkJzdqC2CpYJQABVR4gWKNJMuPKq3lovWz7I0QGKH0SrCUhk7mHIuKrkd3AoXbYKlglAAFVHiBlD4WSVhWcOR6zs4rEed3b6Zh2bnmCMHysc28AAmNVeYGCWQEAJ/4F0qCn+UoYdwTymAGlzfpfFMaqi6qaxDiQZ0UZiMnbmlz0tf6jD0vuYVaopoS40TSfQLRF9GJ9n1tItJsvPiQzgQg2O8LSRH9yPimXczCxzG6pVBbNzlq9kSeSA0ydIjE0MQIj7pDiq0dHjbJLAFgYo82bfndbtB7jlETUijI7lO6MJnrb0DonXzH8DKh1MDtG2SjFjUMmj4cp1t/gyZRTpYIxboqT7GYqPD/C4Tc1ulEeN1Px0evQs/V2ihdKi8/+oJND5ZddkSI0w0H8SvFRcXgyl95SXE9oA2u/JsJFNsDujBPH9nU5pikYknf4hEsQJWoM4RMR8l0ZS/Io1YLYKlglAAFVHiAduq+TtUC9qzLXOnT4zjy7AB9aSN36LxbQJdG08nayHNgqWCUAAVUeIJX/YQ+xkWjMXsZxsUL/n2AVoy9aW9aYgT/LgwE80r5EgoJZAQCUqFT+tyUFe6BL9OHa07LPCk+uxl3YL+CX8cej0nhZohcWCO9DKiqu9E89wrO4fNt4d1ONwbWKGxDmJr5q1gY0LH1GF/GeNesLF0yk/hlM4t+4mGLq9DzjQ2Ny610x9Snc6ZkKreSWHAwItu9bdGD3br0UESFevOGOIUWikv1C7NTK/ePNsL36fOdcDeaD7zI7yUUJgKSVFaIR7/bcpl2afyHRqUgtzDUozb7TBwogbRruSHcaSedYGFmnRFybloq9Nxr8ToadrrXjnIJnnVWtrZBqI+rnFueCyeWkD8Ye5oDW359UGfKLnh54UU26t+jGur+FHZ2rqCwkOmDY0MkAgtgqWCUAAVUeILppvTlq5EeEIHdj9M0NIMlDkIir5mcDUSLHGMZ4Nd/62CpYJQABVR4g5wEn645OX5wA2glz1dS97yj/KR6zHEpyKjiNUehJ9x6CWQEAZCS6Ok+fnR00uTBixwlVE0L9Ch+lN3joVJ8yUl4cASzc420cupVjWmkETKVCuWtGOB87gKXG9+K5cJZwujztD3f02l1XVVnIrlIzxeMAIoeghKL2Bc//LccukHuM24yxuWO4ZK5Ui03nXmjVNp3AoUsGUYA9tcRHSgP39HSCvZRFMoB917TBzKgcYgne0ty2JYcovcGzzA6qMHeW70GOdolbfiHBGn2+4vB7et1rsh5eu5wnn4W9Rt0NwYaIklm5aXtuazFUI7SmA/DOzr42dGcayx5hk167gk7OWnrhzQgfNaDkLS5JFUwBAgV6o3/6HHn1Rk0BRRQ6l3RJuaI50oLYKlglAAFVHiBm9JuD76tr65EYkkqAC9/ZTeR3uMP3Mk9wHVKmV225rNgqWCUAAVUeIKgyenVK023eh4gKXlf0pmTlNJzHHgZqi3KIc0U5A7aCgoJZAQCTvZBtiKapslQGbilovxKWKIPK9/Nsf9bYtVPHve1K+VuLrbsdoHRaXfK4I5fIpSxMed+WEb8+UP4UOHHK3jVoFyL9AIo1xYQszBtOHMS/BWk7KvqeZjwIrbFkTExVhkb1finzLGguTuUvs7t2YoA28PVzx0y1nXrdcQWfWN84QX3CBS62lkgkpi/blM2K5HvFAS+uQbXa2CUZMIVxhOVCqGsa6ypK3NY3ZjFSHABfmgkYu6DMMhjO6XvYPi0xlMW4F4N8qQ9zgCMIhnK1GqjmemH6bTDzrqkd9BZoVVYXVQaOIGOvVukyN6bf/2S+YMgdvPm6XlkREX5bnsLM79sDgdgqWCUAAVUeINrjoqE//ec+fGgBeBu/I3ZwCRLI3gtpzPu+H67wa0mVglkBAAL4su6sox0cUvxzEjMYNNdmAIIHQwJbX/MOq8mHUyYooGjusY2pzlgmCqaFDoYJ0NYrsLqp6Mos0Yjd9E0R7oOr/5qfvIt34IVgL2CeaxWrVIpMAnjELtNIgQRL7QTRlhfsXs5agchj4hfmDNrBJ9JLfdgkrpwDpr3RlgHSdxINwBfoJ0jYb9guLyMRS4D3J2ywEH7wfMsPiB/nm8pJDIJMT7mz1k+jMrvzldyrFrMUFmBx8mH+4Q/KBZ/wgKETISzvizY1G61YOiEgvHkiuskzlfqT5LLXVzN3sNlmdbFK/uJFd37ESUzZMoE9XS90MAc4cUWq2sXJXOUEgZF49jWB2CpYJQABVR4gAQ81ozX86UaR8c2PffcuD4iX3bgrbhDAbcRuIVATaCyBglkBAKvDcF7cDxb+6QjY/nQIRDdn73/4yZLRFim5M6m0ZU1beCdvPREXCIkhJtIzVi6gCRXIbivtz4T1sal3XIXKMn9WtVkvA4oVp+wpAtxCHeysieWBsgiePVYGz+6W85Ef9NHW9hpH+GAb6LnX515QOJQEL8/EQ9y8z5p/TUAyGquptuMUhR04uXESYQT/Txau/CTnMc9+id6g3YUI+2DqDBNWMMgz+mYvCqoCKHz2TsL048pFJHXxyJccpiPBYXqOBdJF3n3y5fx7qnvW/ZcnW1Q0yZYmRd5SMPghuhfibVVA/L+d4OLi5scHOwsA8ykHdFkU2UC9yzjGA/+b/uuuXFmB2CpYJQABVR4gWU43U3K7k2+XUgIvzuls0wdJa0YH9J/tc2p/mrvXwLpndmVyc2lvbmUwLjEuMGlzdHJ1Y3R1cmVkaGFtdGthY2N1bXVsYXRvcqJnbW9kdWx1c1kBAMeXDO7cw7B1RJAgGnqmE81zkRCBx5D18ahyb0Y1ULtbf/Dbjh6hGJ7HL5PRZQARvXIa7qzCrN4yoEEH8GSMKBOjH1sLd2X/i0S0tv/JM4S2RusJx89ehZLUDqM8gAOfNbTxSgS1H3v9eBvk0WcxZLqOuZHCxNcwu7419ZK971JK9+ja79JsZvwCxHmvidZNNz9EJwlDneZs65VfPqN9UVn2E1gJ+FM0tcsYE63cgM0FYJ8QrGqVrWWHLJCVJb2tMrxylZJkKSDyTGHcWzw7eSPlaxak2dNz2HIfJKP8DxsxMfVWFRcoZrzMMPlQVMgk5zOl62gX97wWOZ1IxjYcx+VpZ2VuZXJhdG9yWQEADnwXmD/vORPcLzdf1evo7nGljNInOtYHpODrD3+82Nnpu0qfQPxFLKSB2dhylrLkh4UmTnLZtphq+jBbSjrWkqRf6C/qEToqzAhkAPtkF048lnLaI3UjBCXagQjJv8boXybWdaxiKxTFN2nu9B2vzNyUl1QqO9wXmNkzWM1P4T8lIm6FTjWSbHg/TVTXkpv8nTgQIUA1A0Kk7jEtjb/Vl8VdTZ2UgBywKE1Pvf8HbmXDc6Cjg0K5+XXC6SW1Bk71iLdLM174Mu8KWDjb3qotRpqrGGeSIv1KI1v1VWCI8ZuohkVe4zT5JvzyKIizsVDKcPTKGR60H6enSeQZgShFww==" + "bytes": "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" }, { - "cid": "bafkr4iacv4rx64g5hcak7p3eqh5rjvtctk3tms3l55l7s6524uojui3gpy", + "cid": "bafkr4ica5jxbgptjixaefiihhiueqiw2jh5opj77yhjf7xbalqjq3i7p24", "value": { "inumber": { "/": { @@ -227,16 +227,16 @@ expression: values "smallCounter": 224 } }, - "bytes": "2JavjpQDjD/eipAgVbGkNTH/2yZrZxuveDgKCHXLpQWEZdwWTdM23Cr4lp6oTJvVpw3qMhbn2KPFdF57v5tOM3LM+wDU9b8zeRP5lU0ewQmabaR5JEsSp3kE/PPk7xjaOCP1xFT1ZdXkwC+35Yote85VrQH25TBm8eWcAtJ1UbdTJH79r4EzG2ABx+kMoLMOTEUCWu6zRBRwcCL65/BxD4YWs8kL9dpsSV7kQb4xuoffb58Dt7TbY0wogs6XLhO1h4yP+ko1CGaxy6V4dFqaKktsqDShG6eQL5ATc2MEu1ROUB/95uqP+oKVfC8lmNww0aFjpXK1nvhc8hNG45JWVSGsm6m3aLQrTUrJPa4pPWFWyOQw9UAFCS+eEXxbmDfxlOe2R7NmSTpsQH8Ha8X8li7WIwP0c391qc9AYwYL3XBJvqnSwY3GnoZ5ya7MnAovs/hHVd8Lf/3ErkIIGU55OmpoH9PMfHGT9BjN1trw2cMomokSCXJhNHoyT7LtgCHD1XqsmCjw1PcyDoQqDqFXdBsJplna4MEUskaZOFM7M3k7rPh3UEi+Y+ZK2Fhx+iNhzZw3bA43FnX2C067nY3cFz+05+09nwXxZOBuJ8nKtnbv5+/NAsLJgvwwvpQRhSoBWVaQKcXStjlH+Q5JMKWqRYwm7RwYiRLSe8A8VtV+0FX7oIu2f895nw==" + "bytes": "oH2Gl+wNVSW3s7m7wWtgqtsIh1un/gPGDKX0rQOC1+NESEkTjvIiL/vOiF6R1VA3ivH393UkzXl/1cUcqWt853+Ob4gcFfyBLIMbJUXENBOY8o4Az5G5SoV6KVv6s6rn2o9GEdHVLhGAf4Cbgjkvl/kIkRSE60uNWCp3Yvxq9sKfREnSYMONuvb+y0Q3Xyiohm7IgvWo647xaEEdisnC5WQ2yngYD6YW45iQxLG7M8y7/wwq2zYayz9rUj3Dtv5n18ItKzZA9YXbyAN6Q0rCXz6fiD5zv/zSBVWn4nXhKiwqQ+1ZBJnqdOKhl9SBqCF/jEz2xJl9rkeMWc/hW4WdfEtZYaP1F4Q/1i5cOfOlkrV7JgybMQmkgwEw/4fy4VZYjCoDQrazlwDswanQjCL8vlgdAmRwcU1AoewvobAiOnWC3DvoAgvGPaXS6FmC6Pdm8ANKCIECzDQMl4QQN1/uhSJB6ooqLjztbc0sQZTJUz1qoqyANkzH/ajANMaXX6HuCBfY80F61aPCwciUt9T2Q9XgCpWqqyk/tvWywSuLCw8iOGMM3GQexFIzedcZ+g8GRniabBuAnv64UUHK/SYTHG9o+zv1ZZY226oT5nrxf6hZ9gVHbS89Bu3OFzpSDIOhNODLs9elWDL4ou4DAKkWRycYKHpGC4i5uM0FxhHniKD0jkfqH5JrLQ==" }, { - "cid": "bafkr4ignsuoyxnoxqlw6wrryymod2qpzczjwqdaallf4ldv4ujzbzj73je", + "cid": "bafkr4ihckkhdnl2o2aruyty5k43rzqserloitjkmc6c6tmmjqhz4kfyapa", "value": { "wnfs/priv/dir": { "entries": { "movies": { "contentCid": { - "/": "bafkr4ifigj5hkswtnxpipcaklzl7jjte4u2jzry6azviw4uionctsa5wqi" + "/": "bafkr4ih2d4uzcjq5uagh4r7woymauxmyg3qar2bea5pv7jul7mqpy5rljq" }, "label": { "/": { @@ -256,7 +256,7 @@ expression: values } }, "headerCid": { - "/": "bafkr4iacv4rx64g5hcak7p3eqh5rjvtctk3tms3l55l7s6524uojui3gpy" + "/": "bafkr4ica5jxbgptjixaefiihhiueqiw2jh5opj77yhjf7xbalqjq3i7p24" }, "metadata": { "created": 0, @@ -266,56 +266,16 @@ expression: values "version": "1.0.0" } }, - "bytes": "Cza5T+uIf+6zBPzXJcYOTSgpGd8O8kMRKVEAGPlts5APSVvpUjmGAoIoaPPmWZv3Eeo6NeHfnK0916Dhh4MgXqhjbyoMBjvyaXjNe8paWK7qALH4gfOOH+TZJ4rXNTh80kDZ66qC45Ra71XhJiJ2zDfIJNnZiD059Lxmm56qGnoQWYeT0R1K5iBwyJEyxR1HEHOuOEoZo3hRvF24mBQrbBU7ky9G4EvNAwAqL1I2MCPdunDtodue9bhJ2THd5zUgcTUm7d1LsSmPyHzHJHcJJ5ES7lxrTC4MVIfY3LHR/EwkgT2XyHObKuxX+tY8TN1hV/eiQr+sxmmd4EADAfw3KnY4UbQ/pIzZAHQgJr1No8Xakw/UyoYHNIw1LwHYWsTFEhxwc5ptE7L0NwXzil6J/sK4exITR7CbKTkq5/vDf+prsHAHa1gTPbLeEMhMMD5xJrdPzt4WYFhWVG4HFZyCHGMZXFgAg+XAgq18rR+Uq1ZG" + "bytes": "Cza5T+uIf+6zBPzXJcYOTSgpGd8O8kMRKVEAGPlts5APSVvpUjmGAoI7Y/XnWZHq1b15armGka7r17rpipM/huGA7xf3OfzoqbUU7YvlGCXZI+o14XHoWVVLL9cgxAY4uvzYHnPAzZHB+8X+RO0ycxSvD6+UF1ZxAfsPWjCzPv4DIPmrLSvCg6cwpqgEBvK8V+q2Z3QbtWWRqkO/gQkFesgG34gR2DamupzbrzIdnbus6Wz9+FLJ6ZkpQ/ChabiOtFsDdOG7Y+ac0W7FDmIDF9aW4EdjdIgkO2ktbUS/oVqgfmPUDKzokFonBRlMCuQ9VtPfOyUyfA+J4lsWHP0/KVM4GcInevnPHHHSqYOfMyYUjSVs1Gk10/QQKXpBXUX6TGLMIUAWiDaxBH2LmbSD+cmtehkVR7CbKTkq5/vDf+prWKgTDSypFawbOcUoT4L1mBuBtb73p+CC+sYoQ6giRTbQjym1pJ0NOwjqeYIL3VmM" }, { - "cid": "bafkr4iahin3hzsm2b73deeogau3shuwtrq2k5ygczipcdcnvf2xoopd64y", - "value": { - "inumber": { - "/": { - "bytes": "wTIY5Lj52cZAPjN2QxQb04Tvs5ben9hjXKIVD5UpCeE" - } - }, - "name": { - "/": { - "bytes": "WzUFTg2et93G6urhSL2Viqdf49sAgAv0vv8SE1SgzA2V80ukVHaZR6+PcbbkvJa7kqRzKbUJ8si3pckU/2L30Kmr+JVM38v6cQAT5N0y9KiTmXX6EyUIkQ5r+zfH8xybEhJ00mPJbRpB76OgZ24z9a1VLWQCcenR6GsrPWUkU94p3r8XBQtIBni/uHjKlpFvR/Csq+pmoBqK5qOYaDsgWn6nV8pgMIIRFifu6S7bw9SSMtRUrW/FFfcu1GjRHeq7UV71wyUGGB2gpC4Ekm8Y/tri1S3zHbLnh54ck+tjUZM0MMRSWnL+FvwXcYKaxfRmxooi0Jajw3zF+xGdW8hlnw" - } - }, - "ratchet": { - "large": { - "/": { - "bytes": "0Xcz7RLjVmm+AzcWeY2i2QLcclCjoJktNy65o58rQDw" - } - }, - "medium": { - "/": { - "bytes": "Nk4K4fSXXGSIL1hQ0gHHVGKjY/xSLm4fcLv3z0IPI5U" - } - }, - "mediumCounter": 187, - "salt": { - "/": { - "bytes": "ONa5zrgjyuV6QSBzqKdagXT6HqmDbOX6b0+TK6spVOw" - } - }, - "small": { - "/": { - "bytes": "/L33L32w93i0T7oGYx8u0Yxb9QWBumanpcvXJWQQWHY" - } - }, - "smallCounter": 183 - } - }, - "bytes": "7hBOK8/9N8LTsZ07nmvXlVYeJuxJi6xLyf90IOlERtDf7KJmA5w7490h3we6S+3wcNH6mxurxELKkcNQSqhWlBZ20jssL4D9iUEtHg0s3AtSbcPjYvPv6uhNGHcF/aNMyokLO6n3NZ1hRdNy7dzxBmAmx8P1hL+2U5IywQCatHraSS8AiDZS12nktfSUbo7PTfW3IfbtN+rAR5Y5/ZwCbBjqzPvhzmdSjXDQ+7m/Ady9GS/AeOnpp9oH6MbdcWT1YwuJXO2e8+hKSmIEdPLpJmgdqfw9NpqUVHenABPjPiUtUScDRx1AiRgwxQKXo3yLyGHTk1GQRCQuvZc21kwBwwnP3RMqXiK8ZkUjiMM11RFeee71mHFcvgzC5RT0YkvDWalR6EoLzs6AV0OX8v4pFhmzVZyByiYcGkX+fb3qnuArbl3RpHLH+cO1iHScvCgqLT9M0TtIB+Y4UiOE6gwZJR4X0Pwdm1PxcYYcBe9Lo4Ln7A+7knWMp1j3SJaFGCu+WCAqwAv6RVwHR3RkJGVHHgFUgLKKCVQu/obEUyjh+RPw8AabldmG62lLzTvamKKpb0xUEG44zApJqlRlztQ0gZ7bSXSE6Wuy52RMB4geEvi6n9vByG/9WsGZZU7AW5JCCVj1BSDc95WZjb0xRw/o+l8tglC6YV1OQa54Dk+/LRK96xudFBHzAA==" - }, - { - "cid": "bafkr4ihzowv3xejcx7gmjdjeiekbdynuoyu3ghn6zunvwu57s4dw3kwhmi", + "cid": "bafkr4ie3csut53hpy4iuinpnbub52zalqiskgjhu7avkyj7t553gfvxjbu", "value": { "wnfs/priv/dir": { "entries": { "music": { "contentCid": { - "/": "bafkr4ihhaet6xdsol6oabwqjopk5jpppfd7sshvtdrfhekryrvi6qspxdy" + "/": "bafkr4igljnzokpfougv3yiqmsxhkqpvz26q6y7jadyuhmzpsvggz2ver7e" }, "label": { "/": { @@ -335,7 +295,7 @@ expression: values }, "text.txt": { "contentCid": { - "/": "bafkr4ibhraqq4prlc4zsuddrlwebj2l3emgxehgdcuvppohr6y2ruoozx4" + "/": "bafkr4ifclqucnvehol5nhv7o4it2jcrykb7vqfueh3h5qguziesf3dz4uq" }, "label": { "/": { @@ -355,7 +315,7 @@ expression: values }, "videos": { "contentCid": { - "/": "bafkr4ignsuoyxnoxqlw6wrryymod2qpzczjwqdaallf4ldv4ujzbzj73je" + "/": "bafkr4ihckkhdnl2o2aruyty5k43rzqserloitjkmc6c6tmmjqhz4kfyapa" }, "label": { "/": { @@ -375,7 +335,7 @@ expression: values } }, "headerCid": { - "/": "bafkr4iahin3hzsm2b73deeogau3shuwtrq2k5ygczipcdcnvf2xoopd64y" + "/": "bafkr4igqi5pawxlga75cbj4rtmxviawihqrrndrmbmzfzt7membnfvpdgy" }, "metadata": { "created": 0, @@ -385,10 +345,50 @@ expression: values "version": "1.0.0" } }, - "bytes": "2dCKfxMwtLYKoHGOWQffL7tjJ8bbRdU7a0x5374pwy5cjcGVt56PntkCqWbSJDh72nnN58BI2myQOfp18zbvAgkjLXGao99wr4qR8ihsuUpWO8sjMkvWm9IL/72y6fL3zE/JxnsQWBPmO9mJLk/LHy6Dur5atpjy0pxqGT4Ma/2k8Ov5otfOEuOF2UHFjol57tyLaRtIitIUdUsHg2TFa1C6dX4001xXUIKWiif+E61L574FpC0m25Epa2eE27qeFZlpB1Fq25Glk0Z3TH9own31WsXHThcxNFGtyu+b4eaPyvP0D8kC6k3bVd6+QDL7mB2f0SixhfZwZzyRUrXt+STc1GG9as/LQbOZDAdJQtW+8SNtC+G083XPn7wY8kNSoK4iarXOLYNpwWmam9yhW2leKQWPAyJR/A7c6587dCzKKu9tq2fRiGHi0HEiWKvzruAA5BExkieL4Wa0QUEnIOY89kOEtjOlDovbaIGcyFYZopRv6yKeRR9CEqn3GTtMaTH9pR6UPbRjl478JUktRe3RfWuiW0hnMCXk1rv+D5311g/3oNowA7CTGKRaevg/9ajPnJjGLVAkIjmv0jl9AnkwQ2TMc/cav4VW9BrHpmSCA8L+Z8IrC9Ik737+VSBdY1TRZXavnKdJslr1z6SWIEm2K05b8TMJi6lNbteazNcTbHzGkxDeJ2g5Gl4Z85fuO5nfL2I78JNjqMJjqJB1GqdFQTyo/cC7NQz3YHkrETMkFpZ/Ul6Npux6DbwK9HtD9XY+a+G1791+jBsSAc6Aly75uF2aFk44x5w/Qdh7WQ9iX4PJM6aFNH9M9Rt9a1K7teOE4zLp/90wapMru47CC+A8tjTYUFvcAcRGGfDCfqCArju4ZB6xwe0Nr3J+1F91ixdjVW3/f6KHX6nPUlWNSfrTIUZt5XGVDiGu5VVw+wiLyYwSREqnL/pzkwfTkPerxbIl02zI47Clo5sNaoxf+6M7mBwmIfQiIuQkAT0Cb8oKGhkYdXnOo/z9gktGvu4g0jg=" + "bytes": "2dCKfxMwtLYKoHGOWQffL7tjJ8bbRdU7a0x5374pwy5cjcGVt56PntkRomDTJDJmHC2Oop0R0biHMO1++S/EoufQWEYJ1gW7dACUXJjX/bOyQFGRu3I+WVm1+JdWSvlwhf51JDvb1qVvTJzYsTlA+BOoQvb8mJ52ilO/0yBJBBoPOaElEXZKAqz/mFHJGUT0FO105AJSgcDHY04dhEbDtm328WK8dxd1iCojTHBC56M8JASWN6/2YR1ttJBEIrCDwxfza8FipU68gURdWXVYhR4wgSAhI95JYh1OKeoP58WUcID/adhzGpkm0M3y4Z2AHJbJnMO886ZzfCWaRbvyFiTJ7SvPiCl38i5HfTO4dcF/l05GT8WgDufvIG9RpaoTTSwIzSNqrrwvkBvQhdqgQV5SI6nmMmOJ1wPny3w85DqCZRilaWaTQ1YkG0Z9UJ+5ygisExOkWaZkzuudwnu+X/A590iVkiV4M8cnyY/zq8VCApUBIMlLYbxEMeuMoQRCDvG7vDJT87thsgUWWL0WTvTDf0G3UXggS6r6jQVDaQ9ILucMFDwGX/+NF8/xgTdkiaioKymm8neK3ufHgF9JknQpVnPKPO8prlhrsHRhuCo8vmreidXcN+EllnDyk+N5N7IExo2tTi2XUzD/BgD/oUvCHsle/CgCkbhgc/ArglccNFiTjGViW42K01Le3sbUPj3ASPQ+4RUt7S5RZxKkRmjdvsGI/lCBMxnia2VqEQA1y6szDH6gEw6v4n6VBEfJMhbjic6DT5MgzirU463PRUAwENdcS6qjecYmU9pRTAVSGCXlJ3zdqfPMfPq0CMH57TcjFR602OvA98EUBpqjZBdf6oMSM9sEmW5EAuXff6iDizvwEgZNlvTDyruscv85mSMrx+BSod7Yke8459fFz7g246l7BaPB9qC12NPdEQKMwpkTT0ynL/pzkwfTkPerxbLSHBPNgP21apGmikr4u0iIhzJCsxs8Ok9THOg1pyYwk++ZO/SPIWXrB7Pc8Zaqi6I=" }, { - "cid": "bafkr4ibhraqq4prlc4zsuddrlwebj2l3emgxehgdcuvppohr6y2ruoozx4", + "cid": "bafkr4igqi5pawxlga75cbj4rtmxviawihqrrndrmbmzfzt7membnfvpdgy", + "value": { + "inumber": { + "/": { + "bytes": "wTIY5Lj52cZAPjN2QxQb04Tvs5ben9hjXKIVD5UpCeE" + } + }, + "name": { + "/": { + "bytes": "WzUFTg2et93G6urhSL2Viqdf49sAgAv0vv8SE1SgzA2V80ukVHaZR6+PcbbkvJa7kqRzKbUJ8si3pckU/2L30Kmr+JVM38v6cQAT5N0y9KiTmXX6EyUIkQ5r+zfH8xybEhJ00mPJbRpB76OgZ24z9a1VLWQCcenR6GsrPWUkU94p3r8XBQtIBni/uHjKlpFvR/Csq+pmoBqK5qOYaDsgWn6nV8pgMIIRFifu6S7bw9SSMtRUrW/FFfcu1GjRHeq7UV71wyUGGB2gpC4Ekm8Y/tri1S3zHbLnh54ck+tjUZM0MMRSWnL+FvwXcYKaxfRmxooi0Jajw3zF+xGdW8hlnw" + } + }, + "ratchet": { + "large": { + "/": { + "bytes": "0Xcz7RLjVmm+AzcWeY2i2QLcclCjoJktNy65o58rQDw" + } + }, + "medium": { + "/": { + "bytes": "Nk4K4fSXXGSIL1hQ0gHHVGKjY/xSLm4fcLv3z0IPI5U" + } + }, + "mediumCounter": 187, + "salt": { + "/": { + "bytes": "ONa5zrgjyuV6QSBzqKdagXT6HqmDbOX6b0+TK6spVOw" + } + }, + "small": { + "/": { + "bytes": "/L33L32w93i0T7oGYx8u0Yxb9QWBumanpcvXJWQQWHY" + } + }, + "smallCounter": 183 + } + }, + "bytes": "DHAqFkyhSq1pfHhVFwjM3mOGavKHKzImFFIHQFbCO9GW5F1WvrJyRJ/O1ddtH1Y10UElHzGdBWCDGmAeCD3s9LliEeX/zviQrxll+49pBLuemBCrEec41NMorg/Izhf2ggaGoAnHClDJRy6v0DsNKMegjjQcJ9HOOqPLRTnjEJKJr1RRRBoLia9ibSAmHb3W67okaE0PParzKfe5+qhzirTGlnoN5y9cpjsErV5WK/V0+6o1loFRE5dvsgX87KdmyM033rKaE2Las8VJq4p+hIGuVxenuhptNI+VyRKfi4ZBz/2pOxNqh5vQGywPwNh/kVY+H9Riy1oJMJMep8BfJoLYgt8e0Nl+EAjYc/RKUi6QoUWAENvd2nhHUKjjW0y8+sQBFM0i735gkZFgIL5V7Eq6YM0FlJcBniBSUjkJOf/cGHyhAmQH9/XMf5Q4/8DKmOU7XSMhmTR2M1SDRspBomPlarXtUUVtER7p8+lGNcWWZAAGzFYhPiJ4wyaJXRVkZ0E/yFn+lGgWiKs9H+VpJZ0xFrB1PXhLbuIoUNgFEZvErIuHQdFzdwIwHQPjeIeR4Sf9cyZFMZS3puKYkE2K2ItF8XH1g89pPhijKeDp8/wBPAuouX4VhaHZQVVv6+aVohKWGSUNXWX2bTpDLP+/1aM5gQb9U1EsNNUrW8J5DwS9rYZg43NWsg==" + }, + { + "cid": "bafkr4ifclqucnvehol5nhv7o4it2jcrykb7vqfueh3h5qguziesf3dz4uq", "value": { "wnfs/priv/file": { "content": { @@ -408,7 +408,7 @@ expression: values } }, "headerCid": { - "/": "bafkr4ibpva2zlmfnlujo3znj2wox3bvysnhhhykiwd4xeksazyivwihria" + "/": "bafkr4igm2czfndo37tusfikagtz5kejhstu4s6ti7jwzg7gajiie2zzc7y" }, "metadata": { "created": 0, @@ -418,10 +418,10 @@ expression: values "version": "1.0.0" } }, - "bytes": "+IU4xTGhOAuWwYvbYU3qdgyjhSyIOYpWtVNE1j5IG0GoQ+52FKMYJeScXXH9fpG4WJWhGsZxChQ/icSVclEYRqlcy7Pw7YDB1QSEC156epy9JMm4iATGfi7bU+XCJppUx1CtCk0yu9nKmsTvgJpha6jbN65VpDSSt3GxJouzF19dRtQrmyqBrvepZ5Dp7Il2tOAGyWoe8IaUyxMLTdQYFcuP1r8NvEx4Wkg+TWwRAnyYSWbH9KL0ALhHp0bmDof7htt9PxyofoaV0lC/6xXC/nk5NQ/sML43BQto59hlRudMqQ/s9ydFuQ4R/lGbt4CAvSTrFZ+T4ZT6wXutTEM4XH+MLo/luiq7Pzvhw01SAQ4iDHimvDNM59F0jq8wByJAB16vj+xbk+C8+dr/xpgJXUCTdlIOFBMsvOTvE4YCsJV2xv8asmVTKjHMDPGNBKISw3qQbrZl1L/JjRdbSGLVDFbrqVSub7nGTiP2BDQbHoyyfC6VQ3fnEq4yi/BA4BR+2ImW8onbKB60ovK0rOi0v3B+RF2TcOTYescWtKZmX74//LAZLrsc/7P+sRjcdCK4s3CqXFQya6OUvmk/HdpjiT9iNDOYBHojFfEyEdl0eHm2eCQ+BW/OAxLjeLr7X7Wb93upW0mp3f4B57v5iIbkBsSJsOk6Dj07cde4fPr9U6ymbtlqZaNljA==" + "bytes": "+IU4xTGhOAuWwYvbYU3qdgyjhSyIOYpWtVNE1j5IG0GoQ+52FKMYJeScSHvheZ25QlH4UY4rXw85jclVdEg+VpWkhUtHVfjYKPEa7ISZXTi/AtdjfsLzF2XjTeXvJgJvfYHvKOJQhbdat8nG8/8Y7Eq8/20ZN2K5FoUA+MAuyqTC/Akd9TVrl1MpUGhpjEBjc84DTBqn8GgerjX6RX0pqJU6i0zzR/a8ICZqC5hV6KaGPh1jvuFy4FCap26v6TY5v0bQkiQn/KEwVLVyv7fh2xAzEhJs7h0CPfzdstqd6058Cw90hvWP89M9ZEm1RSPiWPGwCW9jOKiV5QOt6xB3HmG4n7iEe8qUFV1JPNzjy4Aqsbd4RfKOTnIA8j0HD+Wf43UfQrOrodsebeUXFrmGQtZ3mOKxnTa6J41S96IRrkEIvfgW45d6QqFeWPNLR8g2MASQSLSTC511p3AIGXFmWDna5YKpx7wGidmkFGX0wA7EodRWDDmHT/DABKqzsiYqxTBO/36IinuOGtR15e9gikGBPiRWVlYFbzdbmwIOVC7Jhi7d6gLPUh8DymfK9PBC07hDA631FzwyV08rSteQ7sYdLp5fh9Rfs8kFXyQrM6O7KqyNRMm6QbJcqYc16zwcoduZDdYTr7LWYRz3hRL9xtEzn+N3auAd4dCAZl0lr9/AgqQxUs6eUg==" }, { - "cid": "bafkr4ibpva2zlmfnlujo3znj2wox3bvysnhhhykiwd4xeksazyivwihria", + "cid": "bafkr4igm2czfndo37tusfikagtz5kejhstu4s6ti7jwzg7gajiie2zzc7y", "value": { "inumber": { "/": { @@ -458,10 +458,43 @@ expression: values "smallCounter": 149 } }, - "bytes": "ZdknKoTdr+MZPqhDm9EjVBqUYIYexwzykz6Eqs9W9dIY8hYv3spCQfo6XThgRAaWjOg3otQku5FWcSsMg78767CVaA9ida0NUhOdU+ITZ+20j0Qq964LDT0t4QBeST1SzH3nG2Av6qOWMD4jVaD9d8Qv3bN5W8YoECjltXGen+ZE38HtPJWW+QlGVQedj0LEcDsAw8zXpgjOI+74m7EAYdOdwC2W1cJStcjv0VVunMA9m4ScOJc3Wr9TtorZP0s0P7SlwXStI13MDayiMiMciEWnO0HWCyPkA1Ol9LQPfqfFZhnrzVMhd93xBxj8070wpjWzilvWCDc4DvQscMRwgceYyG6EJ9lxepej8G4pXnO6kJsH8lIldbIhPYeqzQ5FRBHhzx4W3z7GaeRSpb6EgAhi9NmOLEgB6XOTQb46MYIO0Rt1pXJ9LxD/oOdN8yOLYvWPirnuSBh+/smWwkV2WjjstdgCjFzKRJ8VSrThv2cyBPaZWehc2lZzz1DljUUka/4bbeydWtliTInLKF33ZgEcugBZrXzmnzGrR4Qw1BFqie8MMC2BUNMwHoQOlc/AJ+HKoy9vUNxZevOHUMSsGqsh/4+UHIXcPyMfKicJvrc+SzZHG98T/iR3LSlH6UurWn4hlbJg+6sgI0KQKQx9SisBNkUvndfwZfg4d12QhcZmxNT34POoVg==" + "bytes": "+ruhxD5iWl3v0yvDSMJgFKSmnlR0lnisxzSTNwTXM1eHH1T9lz4uiW7rCphzDtgZPX/mHswwxSY7U9zjRq96NEd5S0cc/Oj3vM12Vcl+eUnmtdsgLiSy5oq0II99i/guuHFJ0merz0tAzWUzsCk9dUoFwfzvIpCEe/l4FCDLZaZiL2O91gnxFxZUenW4yxI5DOnHdtWnshPY29cg/LgbBd1IB0PnafWZWl3WqiQcsS5Op+xm7LvRXkkj07g953hULhAdNmAR3h5XCuyrmarQxUHoFPJpy8e5TPOy0SzBgZyaADibDggvAOLIItIKi/YkQ+bjl7cRx0xKMYRIjxahhH6bMIzcD3e+Vvu/t4Wa6Exlu/3iq6u/W1nOCzSFKnbU7VLdgjwr941aYPqEvCdsDP/61VNL4cfz74JoibAkRppXdd6Rh/QuSWnhazhWmPBa2phZYkg3CXhvrycR4XMPmyohLnvI2Ds2xoA5rv3Gj53JKbmMq8BOuwTBlFyNkO/RU2umVBhiXWT6HAt6U18kXUGxNlCQ1anQxmIdpzseaO9U8hOSPF1zM2Hk4Wd9yNMueio4CEJu+HsydIjGXY/bP1WVCvs/6K0Bfa1Tcs0CeIFH++EeMn8Bu0TR9nc/R11Jc6Fz8J7jh/ZKOM74xEU7nx6uJBJT76RObwreKKr0HGTBGAJUDUzLUQ==" + }, + { + "cid": "bafkr4ibojs5rmbq5bwcsi2lfi7zp2ktnr2awouczs3rul3b4mioxhqdi7q", + "value": { + "wnfs/priv/file": { + "content": { + "external": { + "baseName": { + "/": { + "bytes": "dVymeXd4adLmab4jsI0csAM5VOUW+87ceK/LaaPGseoozJqUDT9ZtPEFTxMRJPRMdOonmdcC09jM+0NyGhCCWftzsNrbvQz+iLLBpfFETG5JHTNH9Mn0lHMdKFhs5b0P0s2Y/jhljSepRgQ0XQAC76MNllO7xSjoQx5TW8X+ppkqNsAW6YljncWafmAvrytjEFw3AWZfLhUjCWCcxcpPxa0yrUcMbu7gIYKr1IHF+7oMxFSpsfdeAKTr+1FhNeClA3fnzrWcHPIbbYT74SaSXq/N1XNIk4BEu+aUEjDkTcZeY+VTen9/OSCrWLYzcaJgqGBTijls+I2gA3vik0EE2A" + } + }, + "blockContentSize": 262104, + "blockCount": 1, + "key": { + "/": { + "bytes": "jVcwDN/TdjHv5AfNidTSi4YTVNCx+2xZGF9Z1+pTi88" + } + } + } + }, + "headerCid": { + "/": "bafkr4ig2dh6lqnfslf3waewp52o4m7vjgfe7rpaguf4r7hnltqelodz4om" + }, + "metadata": { + "created": 0, + "modified": 0 + }, + "previous": [], + "version": "1.0.0" + } + }, + "bytes": "KNb/g8e03KQjyeUy9xeoZpgabhtQAkR7xRrY6QLQXuspUPs5yZ8aGFQ6jqbiYyDFqkPajTCy2wX+70g7N92+cyjQScmlQJxcLPGar2DJrMZn4JHo7/+RLWG+aL1irAEKOpel+f3vFemqvw+3VtcDr1VMrHWaYuKcyDElKzVZKV1aw6UeDgMd9tGG+GkBWUnNeCcSk4cBxyGOa1ehYGy+/UcDDETAh1xycJFq+Q8QgjdbExieWHRmvWlSxRiceVaBEHkHkvebJrE6wCgaV9XLy1SFkEabnQhI3CDRw1FTqtjaabN5sSk822gCyFmXvXEX/rxGjR2lE3BeM/Ntt+ShxXAZ9zlbtnRViERejw5f3Cow33bikyg92Kzxb+qX52ktGokczCrGOBAzYO94qxe21EggCyVr/QZDZ+bsPUVsYmD764hD25fUTbbLTPKeDCSpGFCmlc1HKM8CXDJ+jc25+c8r5Qj9Q1c03WPQoAM8gaSA/82kY2lkHmuzxS21h6c3qjj4cZAqYqjd2C5n1j4d1n+mzi+rWfkMpHV7/L+Vu8ec0YUhV6PHgA7lOeCEL6bRWiERUJV0fAAvb5aJgu4x1TiNIP72h1m9mBD8pGmrgioVCdlMrGdVQxVRiYRg4CiQmWmML0ztraOT1A9LyX7HzS6YrHNPmaQUnoZ3/9nWn6JxcCDYIXtrHA==" }, { - "cid": "bafkr4icyunetfy6kvn4wrplm7mruibripujkyjjbso4yoixcvoi53qfboy", + "cid": "bafkr4ig2dh6lqnfslf3waewp52o4m7vjgfe7rpaguf4r7hnltqelodz4om", "value": { "inumber": { "/": { @@ -498,43 +531,10 @@ expression: values "smallCounter": 233 } }, - "bytes": "Qh/sW1x1Kho9Z1zVqz2MgQCC/nE4rvvbJEcrq2SkhsO3Jr5JB5B9bKRyUA44gDSvtvKff3eCMTQh4/CTcC5twPDcuPkPf4gh1u1SsE8Cqyy8aiGczewq92N/1SjRpxHj1iTicUa+3rjipR788bCNIt0eYZ7Mestmr71rUVZ7n94ezyj+WTLCg0PX6sPpIj2ox+HemhKwzbZW7izfRwqIFsOXKx5C27Ge4aLFs9JH+8baszOS185y6n+wuWBnOPOEjHgdkxEaBU/egUzAkMnaXs5OLpg9n980K0oN8Ysp+enPoXebD7Ws7BgIcxygVWyqPDWB30rDJE99siHIHguoF50Br96l7f6gleFeQdvf1Qi/Q+Yprbzpu3TLn9jpNzwuQ++xqg+L4zbsWjao3Hyj50h9RW36HcXIrJPpMj5KfHDTeUukaGrX70igwWuq+GiwA7814DEXReRNkNrbI2CWIONJVi1Pl2Axs7NhL+eUvs3e74zuJwn7Dx8COizC4sLw/QzKRyfOTvM9gq93V/W9dgiLMKZKlm9eTSaT2seFK8DJImEjqyXYN7o/zRz4iP48hC/9QaFQX0xAVG17PtIZIVUphQMvvhw+uEl/dI+T4AgwT4zFF4TMPIqBrflWSF/ZSnXu1mAsOsYyRDBw19ccPn+Wqoo73xoEVozbKRQiMS+lvhb8K66B+g==" - }, - { - "cid": "bafkr4idfb6czevqvtq4r5m5trlchtxo35gmhm3tzqiyhzldtn4aaey2vpe", - "value": { - "wnfs/priv/file": { - "content": { - "external": { - "baseName": { - "/": { - "bytes": "dVymeXd4adLmab4jsI0csAM5VOUW+87ceK/LaaPGseoozJqUDT9ZtPEFTxMRJPRMdOonmdcC09jM+0NyGhCCWftzsNrbvQz+iLLBpfFETG5JHTNH9Mn0lHMdKFhs5b0P0s2Y/jhljSepRgQ0XQAC76MNllO7xSjoQx5TW8X+ppkqNsAW6YljncWafmAvrytjEFw3AWZfLhUjCWCcxcpPxa0yrUcMbu7gIYKr1IHF+7oMxFSpsfdeAKTr+1FhNeClA3fnzrWcHPIbbYT74SaSXq/N1XNIk4BEu+aUEjDkTcZeY+VTen9/OSCrWLYzcaJgqGBTijls+I2gA3vik0EE2A" - } - }, - "blockContentSize": 262104, - "blockCount": 1, - "key": { - "/": { - "bytes": "jVcwDN/TdjHv5AfNidTSi4YTVNCx+2xZGF9Z1+pTi88" - } - } - } - }, - "headerCid": { - "/": "bafkr4icyunetfy6kvn4wrplm7mruibripujkyjjbso4yoixcvoi53qfboy" - }, - "metadata": { - "created": 0, - "modified": 0 - }, - "previous": [], - "version": "1.0.0" - } - }, - "bytes": "KNb/g8e03KQjyeUy9xeoZpgabhtQAkR7xRrY6QLQXuspUPs5yZ8aGFQ6m6z+ZCzEsIeDxnjojh7460X7McSYYxQo7sawTELaROAt6C42xtgeEn9G19QDkgvPDfCXXsrKCN/veTcNrWdqpAKeJbIAmpxAqI2b3WGBF3b00khLTQd8Q9KRpbtlMXeAP8bW2gRl4tR8w7DBU0q12S7g7FSvZQ77t+JwNPXwa8P9vr1Fpped+CzHU0dn23p8sk+Ex65nT2frBFrYv/+ZVyydi6l8SK0WzXoXutRSfm37uzpu77zyGbgxhXF8/G+8G1z/+COO9cMMws/S/ia6x9H9xTNAnAgLgEKB7yO2z0FMR5JCvePe6mCc/5HnKbf/NZJgo+1bj4Vcfzio1eb7dnqEvybGvoe20lzKAM/je+M1floVZOsqrJ3QWTzMprSKx9P7IjnUrlgZFBTnIlKa/OiGTDDUA+LB88suredrkYAlvinxyM+MDGsFb8O8QrL1uSE3COXeQoMXwA7+Gj/gC/qKiD1G5eOBymg4lZUVJorgUI1XyMd9XgVjpIkJ77z1AxZlH3hTzltM27zbRAqvWOyejaV0CAlUZvzUjpm4qv6gutJPRvFEs28NqeohAaMnFlcXPQSJjXozo71EsGHh8pmDqrHKgdpJVWH4lWe/BmQ1s0tR/us/iw82FPuk0Q==" + "bytes": "3DVHGu+1d0gWqsWtICwgQus6vALnIl1s35ZX06gx1Tm+b2nEYr4cy7k7OqiuTN2M2rMb8mAvHrfhby1A0jtqXUIfnFeC0RJVXClJUEUrFz6tjkGY+4w0aCMNIgLQTpuT4NT3Jjj4jukrh/+P5T6LAjRMXZpEar6Y22Mf4Q8nvRf02+mS9gE0EqUfFJUlfC/gXvfQj8e4uhDGM/WfSquz/adVsTEp/C9AE03LgzjYJMcsQpLIte0/YEZOEWKF/auMUiKaBWRlMDiFVz0ZNZ500s7SVBApRByt1RyhbBB0RlMd86opsSxZIQjzJUtgWaxikARIkRy+F4pDZA9+KH1OX5Bc0MFbY2cVh/0Iuu+F13LIlPMf7xclTminR3e7OBJiMnL6VZyqP/dS0RUtpfAGRuRMf8CTylYU6qKNwFE8QdC7bW2Hz/VSPOgoUI8A9Q1dfDaQNWPExSXZALMWVhIsZxDq4H3w1xqi3Zb4SkkxqNiG4G9+pgYXm6KM+PvpNiRGuPICjycV8dAy/Mkqg3guxaKWZDDugppWaNqp3wrViok1iVE8n18TovJIHQmMlYsNQmjc/q9D7PMg7+XhNcjkuJ4QMC0/UMuKOQKkYJrzFsnObyCYENkkSBX0pcnr1Z7q/AA2SPd787WZM8GJwpz1N5yMErKEe9djvDgGcejOczV/530xRNWmbQ==" }, { - "cid": "bafkr4ia5xkxzhnkaxwvtfvz2ot4m4pf3aapvusg57ixrnubf2g2pe5vsdq", + "cid": "bafkr4icdf6vi235jl6bqrmg3fmdba7ximvdsac45syigmxmpb4wolbtidy", "value": { "inumber": { "/": { @@ -571,10 +571,10 @@ expression: values "smallCounter": 116 } }, - "bytes": "SP0a5PQ6pa9IfNhACq2KTEJxNTFxcBoQlwrescKL8inIic6kGQFh2JOZYHezK8rWGcYey2Hlc+7QdRma1FzOQjxDylzDHJnRb9Qzb0UC5K2PXHGi9+a4cNRdedjiJ44IliMe/egLKAV2Sj5VTy7NltGdmIhf3A7mBKJxW1rswvsvF2fT2COKzoqYTpXhq0aEG481oJEcYWI+UK+9HLrFdTO1LKAjLLZ8/+gwASEBnMJl9Km+x6yX2CNI9HA1VieXGFmdCUwB8aBLQRGCDhcU+fKbvG9rP6sUP4s1VNZ+1zd6kTfgcl3LR+CFv3ZuWQ1AC6f5nB0YnwcCy+txXB8aaPZrF/pOOe/VZmyRHQhBkaCCHIsD2BfdKAX2DlyWYyRoZ9X3zuCs96ggJeSKVeT29+1/46YY/P9PzQ8TXpTMiSl1+mMgnQFKgzGY2TeaRFaKARp9JI2jPGD/xvbP9kp2NZ36p6fhILKG6K3M5K0HL79mHY1WvlF7Q5ljX410fKi1YWO2qW8pmPszcQ0tyyFlsp0JLF97HCrOMV4lWcdSkAHefX0Etk32+CQqJhomb8XWKfdIpYfrFVoHVRq3+lPTiKN0+sCHh3Xm6JZ9EllfmSLxJl8QbWqJr0D03xfC4uVfwpqP00dJ7TrM3KQ7J+fingMRYJ0Rv5RG7TVNzL2Iw6gy3Zwd92NwuA==" + "bytes": "T5fBA7x72km1/nQsgT3OaTo3ErQGl3UX/D/eMsj5elt82Zn2ImkvTPGj82norM4F3XJjOQQyb58iChLlBSB4DIEy7nU/4AVGChzIp4R1n8os5Y2Y824VGSBjwnQqAEpbN8kBQgK2ePAR6pdYwvpCGMjnwsSUrDhIZ8XFwO/+ISEC5iVfhKwFwvjqYyk7i/hkfTs+D75DsNRNpXhanhtUF+MVxvH7W9ncx2coCVU/8MvvOkPJkfErfp9nyE0RDsLbLMcJHRE+OY/zPXifbJYPH6wjubaw03SeDyeHsolGPQrbMnpzEuR85yVdZWTnNzgtoehnGFiWjTrEhDkbBWWCD9MGbREttYnwkjZZ0ACdn+l9jAB+uZdNiqzDJSU96AHZcScdGk1KQMFSkXNawsbBKNNMSvkGz7J2W/lZ5qOxswVqf61Ap4xPcoKV6j4osBzT3ZlrYkElNHpD7wCPp4/qCfBThr5FYJdFiIL7A54seXc9bGZjep3stSqevdPXBN19VB/ApXwvW54S9Stk0hqoFP86Rnd8M1usyD/UNSYx3T8GG2RvFAeBPgjrtTmIgJlpxfnG36sdXaWXecaTH43lE3zO5L6Jp8PRmBylHTKB2dUnG9xWDjZN4u4pR47LC2Kvk0Bg9XRlMd3zUWTubHxZB0Buzl9dnVGZwd5iiXp8/mOq4gA2gg+tDg==" }, { - "cid": "bafkr4iev75qq7mmrndgf5rtrwfbp7h3acwrs6ws322micp6lqmatzuv6iq", + "cid": "bafkr4ie4rlwzcbhcxirnqhgdxngizjvnybonto5hxevbipxkzpkhj2y55q", "value": { "wnfs/priv/file": { "content": { @@ -594,7 +594,7 @@ expression: values } }, "headerCid": { - "/": "bafkr4ia5xkxzhnkaxwvtfvz2ot4m4pf3aapvusg57ixrnubf2g2pe5vsdq" + "/": "bafkr4icdf6vi235jl6bqrmg3fmdba7ximvdsac45syigmxmpb4wolbtidy" }, "metadata": { "created": 0, @@ -604,10 +604,49 @@ expression: values "version": "1.0.0" } }, - "bytes": "UxsjWntevfOu6Qzk1fNZJm6/iIpgysHyUiqc0wcGJrkynPLYAp44wsfTpC4XZIwCHiiY6JDGSWeDZtwmW09XXdMYmSygNH646nBix42s24841SgZyBNkKIMUwtGcED7KMrL8Bc13+0VMUvztfoR1LbzeZsX4mp5VgREP/yFPicpX68bVwmJmgaUepDzsRQM2UC+TNxklM3A9YH7kb6RDKHuhcM1yI+95s0UNgqm1iUmRRZGv+xWzdZQuvgGsCtbNbHirho40lfLbkXdHYQmFbFfoIOV8zTQ2YMOlVC4uDwZJGBKDOFdb4Qru5pnIk3+2VNKOmn+Kqj4MVyKIBE5TX3g38Cbgmc+57FSWPWACRZDYneNrOBIP1Wi1D/U1fO9DKabZJVbhMzM88M//vGmPqqQv33oJEwyw9b19x72XPXYw/QDtA6F61atljIhxifw9GxJM2KcBUDYKfm93JqWjrp0ONM59lGWoKzDyydK532kAnoYU7D+xUokGxhTlXu87YiuuYolo4RBnNJu17lc74mvzy15Hc7Qgzjz3XHKjD6uZHc/wuyWNF3lVc28BcFr5v9UUdNzAsnLGo02Hymx1HgFgMeXM+OzM+CR7CHtZb/i7TEhXxkNjoZw6m3IlfQBggXapL2I+ruBvn6Rz0aG6mtwMk6vDhWt94iUThyy3nUxCsvJBUrKyIg==" + "bytes": "UxsjWntevfOu6Qzk1fNZJm6/iIpgysHyUiqc0wcGJrkynPLYAp44wsfTsSQLY4ADBOzBo9icHHyFYtHmXVZxTe/g9kHqHvuomUbkuXsD5OxmJ6JWKYKHqEmA0iVfuvv1oyFEQn2wbH2fI/HEDeGqTNH46AZAJDaFYFQkavUUmmcNFgnid8wD0R3lVpw27TOEDZZApRClRrsJ4olQn1opWQWD5KvWQNPAr4AWI10DUdVumwltoUP3wF9txl9xFx2aNdxsSJa748lkPVNpttmMtoU9+cdeAbTawB3grNSUIg0wQ/ln5GNDQDEBFn2gjOUIx1b/zqJLlY22DvkrYr+JbSipo+o/mdnyMSuXqKjMv7I/Azq7GzBIA1xqRx/DWvyxVPOcRzNjl3jzBdRk2qNcNFk2F4YMd1GGECewHvpdkJYujcP+SUExkwlULLimmBRxmwkSmoeWITE9fj+R0r2VCmSlYK/9W07isM1VR2n6rEOhzRwooJZn3l58MTIxj5dfh1OL+hlKSCdbAXsLjS6waGz7YpLTvWYuVz1d3O9UVmSqS982vldosaLLeqIAjZR05PZ4LgZ1UDgwq00KIlye6Rkf8+3Zidhoh2whRbn66v0aVAbEK98X47N6UpQJuyqN/ccCZghBs2NJt+oMKVner+j5+Z0mAPy7B01k/Qx3Ks1WgGWNxYfyNQ==" }, { - "cid": "bafkr4if2ng6ts2xei6cca53d6tgq2igjioiirk7gm4bvciwhdddhqno77i", + "cid": "bafkr4igljnzokpfougv3yiqmsxhkqpvz26q6y7jadyuhmzpsvggz2ver7e", + "value": { + "wnfs/priv/dir": { + "entries": { + "jazz": { + "contentCid": { + "/": "bafkr4ie4rlwzcbhcxirnqhgdxngizjvnybonto5hxevbipxkzpkhj2y55q" + }, + "label": { + "/": { + "bytes": "dQ5WMVfLlOwXDDZN7O0UPMOyDxztE80f9O8NLSe8Nd8" + } + }, + "snapshotKey": { + "/": { + "bytes": "wgoQtwsOrB+0hooUC/hIbIqrhOi2E1V0f6edZTMzNSE" + } + }, + "temporalKey": { + "/": { + "bytes": "Z0lE6T/vSa4vXjn0BQe12aJGA3wkotPuNb0Yq7yx0TxhNatdy+iFxA" + } + } + } + }, + "headerCid": { + "/": "bafkr4igtg3oup6h2veg7susxuthdrad6zlifvm2ejxt7gbiq6r5ptyrrzm" + }, + "metadata": { + "created": 0, + "modified": 0 + }, + "previous": [], + "version": "1.0.0" + } + }, + "bytes": "L4pYG5OW5YyMbIdJgNTG207RdlwnC6q86F59KgR/7lfiinXMhTN+Ha07HocErORldyHMfXm9mF0Bs4+O/VvSKgni5TrFZf1IibncaHucK+t6u2/0BEgPldqlqmf4wY//pRmXLNCZLu3LVOhD68otD8TKXaLACw9fbubKTLHCmkpuzwYGpmnR4f9lH7UVmh1+CHQaIFZpa5Ft/HlAaNmBYmbijrKBb/a3Vlw2FWOf7XcqNq8oWt2GfiwJN3MTMP0PHjXjntLd/d/mdWz9U5zqOztWAPDeDarfZiZ6IeLvYEcqB2tMJnThtDAPHnRtXo98bbK+FzSMYu73IY9TS4KQV4FC8NQnU7TTlYaRq7x1NxIoknvdVYfInKk6PT9wBcvGjszrqX4h8s9CwpdK4xn8wA5yZDGmITOYA13yrffxWj6ZrSsq4H0S4RE7WDmDDaNzcRp130Qn3yxAVV/t0MNgOxyfKHrrf4qZF/lC9R5kyQ==" + }, + { + "cid": "bafkr4igtg3oup6h2veg7susxuthdrad6zlifvm2ejxt7gbiq6r5ptyrrzm", "value": { "inumber": { "/": { @@ -644,49 +683,10 @@ expression: values "smallCounter": 253 } }, - "bytes": "1qsr7kXq0aun7B5+QEwVoq6tIP8PItdhqcY/pKO6MERiWJcIgaE9ELzipX+OnI6rlyPElEiZGzbArxXgD1m5lzL0H3kFhPidxlQq/oQOUiGbrBYXlHSgJxYOdh4YLq0nWCzM43uB+QlTNUnTA5/efGmrd5cI7B4ER93MAC+ozIJL5C0EH2lXEoOP9RD45//RvjCDorpcnUKkv4ChDO0WaF0RtMvaSM3f8aOpFEIFugxM3YnfNrBwjn9iJeRnS3JFiHFYwjc51jE9t4XUrJvmn6/jH4EhEg4pKT3jNZD0Blvo6MkSVAbnRzHPLzMsG7yCMn8HM1+TfZGdrP/ILuN2r4/3/0wa/PuD0lShnNrQWXd1h+scqvJMdo5C+TB9AxBK8ts18AcF7ICGUbZE80YdNVgtSxmF7ZFc5E6qGt4+PDMsq4ULjjA2FeYI/GQAfp2rkdNiUK2JGANs4FQWYxwEhB4gJ5WU00L6kHqd4wU7K5A6Ol+bNx1FACTNW6lxlkUtbKp+gVnFGkq2okbMGht7NCIXaquPY7AMkgJv24fNsEuRax+6aE0CnJMBuiYI+yoCG/GHvr4ZeZUQ1q62bUKAB2gkYp9IsV5zqtKx2Fzzc1MgqAQm9a2P1ajPFVNqgZKKblHEzZqyd9PFsV4SjvWtAIjldj7Vyd4Pav3G940maa/DQsbnb4NEyQ==" - }, - { - "cid": "bafkr4ihhaet6xdsol6oabwqjopk5jpppfd7sshvtdrfhekryrvi6qspxdy", - "value": { - "wnfs/priv/dir": { - "entries": { - "jazz": { - "contentCid": { - "/": "bafkr4iev75qq7mmrndgf5rtrwfbp7h3acwrs6ws322micp6lqmatzuv6iq" - }, - "label": { - "/": { - "bytes": "dQ5WMVfLlOwXDDZN7O0UPMOyDxztE80f9O8NLSe8Nd8" - } - }, - "snapshotKey": { - "/": { - "bytes": "wgoQtwsOrB+0hooUC/hIbIqrhOi2E1V0f6edZTMzNSE" - } - }, - "temporalKey": { - "/": { - "bytes": "Z0lE6T/vSa4vXjn0BQe12aJGA3wkotPuNb0Yq7yx0TxhNatdy+iFxA" - } - } - } - }, - "headerCid": { - "/": "bafkr4if2ng6ts2xei6cca53d6tgq2igjioiirk7gm4bvciwhdddhqno77i" - }, - "metadata": { - "created": 0, - "modified": 0 - }, - "previous": [], - "version": "1.0.0" - } - }, - "bytes": "L4pYG5OW5YyMbIdJgNTG207RdlwnC6q86F59KgR/7lfiinXMhTN+Ha0oFYEFrO54s3SILC33VEgft5uC/naB327csQxqlGMc7OtJrs6tFymdqlOjfjgpC9HvA2Azl6RYy1YwGyV/8UjFM2FLdPfrdqQLh1Yng+o66D2c9Q9mQnSHCN+jnrACKykrYu2WNK0KhAyYP1dub5K/8HxVWcZcXypB5sdaPNhuR76ByLwA+ShKiklAX3+p6Op5jANlztHO0FO63AOYTcb0d0boWaytKDl3kJcRhg7gjxSAiPruP294D+8g6C2kBWWhpp2o8BSAPSrQ6f1i0uzsNJJSQ4G1V8k06J1efzCJDq5b5ZYtYXBMVcceZ+HQuGOEvG6kewkfWx2/uDnv2W3FMiCg6R731Q95YjGmITOYA13yrffxWnhQEWNji7zTRoUdTbVEEr2sAm+cwN9YrRabIiQo4EzvJG54Uo6Fd+8EbQKcN/OD/Q==" + "bytes": "++mhKSZ/fr+zbRp9cFm1FvswbhHAzNux47bZq1/re4APgBXRf9++Fz+pkcx2vOW6eagGs7E3n8EInQfSYDAl8cs9MdFz3dsIuTSIXj7deMLeafvMwpEeU0soefpW7c6K1U8Ad2I9KCpmKFjff2iGmkfZouuy1d6L8IfKk7qQej16S15xeidHnTXv0jaCwVBOEwb6bsfWtW5MI4OH97YDpdQUPE5mQMPaMNz/sU+fblO755LZlqBrm+W0Stb9NFpemtUMjoenvSX72YfA5tGA19y8EqzAVFPa26ns1dqmWOLM6CCH0oHF52gzN1lCGJ+qP3psyKU6dkbNYL3FeMEAx5yZfQk0sBQoV4Dxai4bbTF0tmxeKtN1hvxH5LRNgdj0CeukaNhap5Lmy00SVwC6IUqfDmLg4EnQDB4YVBjHjsJH2RmMriI0XQImkptnCxrti924bfIN4Asn5BYcVBTL0iBVi3yfo5FgMMaYL+G2DXw/qZky0RV88jsdCxPnbO31Dzk+VEg75N/QaqGBq8c9ZeGn0tHzbWtplCZ9E0pYo3dPTE3sy0zUaNNTh7ChrYHINLnORPfssQ6SdaM+9h+nbL9uvjElakPWMn/+JZBVx+/OFtcx4EWHJBjiu2gtlznAipt8WomIXEZO2GuVHIJ82SVVVcqhQE3lOmomHGlD/OXo/8ZM2tzbjw==" }, { - "cid": "bafkr4idg6snyh35lnpvzcgesjkaaxx6zjxshpogd64ze64a5kktfo3nzvq", + "cid": "bafkr4ic4myx7wgjgmmygtaxaz33krp5mxx2zeciu6xvcwsv63eegcq4rju", "value": { "inumber": { "/": { @@ -723,16 +723,16 @@ expression: values "smallCounter": 207 } }, - "bytes": "NBHV1M9vcBaFL5XMgorch+zRyoL9Oqe6yvc7+3LKN9mO384eIB5ponXqDTpULoSVnB5y8eDWLaeDr/EPVaIqR/qyivMyvm6Oz5vQG2LZJ7H5UkrA0Rhl0k8G8EZUhVmLkBWdHWQ4x86FFyfGkdGZyqq/zCKVrMZ+1GRSbFoT1b7Ps+DIjcg8o5haF7h2Eto6S1ILZjzjnqA/vaDlcjsBc+wh5fzKxInj1tXZDhAe+XXHbpkdLN9fDlFuIFfcJsViJFhm/kBeOH+IidzbsU8+axs2KGh1paeecE7HtCl47XdSkHzbUlZw5hV3TkQcaYGGYvAnYBtId1O78d9Hd27arzv64nKiH1krYo4VGxVrwloXrwM3OOtFkn2Rh3jbFMEqDFO0vMt7EC8uS/FIhj7eYLofuNj3NDlWqYU/KVALtw9WnqhWEZJ8+fuKRdHF/gRRO+OEpnJ2Ye+cj6aHGgbEzgoVn2aWjcL8C3004uM2BUOrlCKXLEH8FtS6QmjXBY5BISx5Apc5dX5vXG3aAwhX4KcgmsQ10RObQf0UT1BCwtDdiYZyZCGPTFjyAksAsbfCEJTq0apXydMXJ6HPa+SkO3x0UGg/+zMfHQ4+5/sdbSM82CHoU5SZQXbi7JwGZRJHJKSG57UO0JghOjc22cMccVCv0LzjwF1uuTrIxVyOS7erPCIncRC1SQ==" + "bytes": "hyzKhZ/77ZbVsUsuCVsb8yO83+SFy3HoUahYEKHtpE3Qz/vCWjhoY09osolymIgOi0eD8Y9RiDTipK6uopTWkwRwPJZ2SEEkG/AK9Y+yXkxeH7JCkOkTDplYH5dn8Ru+vJu2pW/G/E5pLGvsn1yEGiG6igeM/vBT+P66wn7TACjJ5ZlYQTb5tBXzDvstaDhN3/Y470ncabaoRa5GhMRtxr5mYVftc1tSDuEQKFGYJSAZ3mRA82vplr74YaRLYAPcZVxn1L2P8bjgVIEjEoqxzdum/JdFYM/yZ05mjyfqCo0KzMy440cz/MklYGuGR3ky0hOIMz7Kou+q/WZwTuY6xAIH5hvMpoC5EoqdUftfHit/PL/24YeNcw9s3r+Txo0gP/M8/b3Hs0COJtzQdn6Gj4vRmUxZNb2Mpm9Qe4r6tboINJy1IbgyY90TGYYGyZO0TeomKezDgpcyicFQ8oFmY6PPfco+PIruTe9SWwUO/AJWuEqA2VJ9PY+nozUU6QVNyg91aLQTnu0wShz1snQWhqvRQmQrqt2MQEl5XSMwknFGXa+tFO/n0m5+KXnS5bJQpHRStW8O4Vqy7a25OFuc50LAw/CEgvRaH/LUFU/biovw4xPriTCLPKTZPzdS5lG0KiwwoHAYcbnXicgxr72nKFrjfIyYcMqubFFxw9omhXcFtwd1YDcmAg==" }, { - "cid": "bafkr4ifigj5hkswtnxpipcaklzl7jjte4u2jzry6azviw4uionctsa5wqi", + "cid": "bafkr4ih2d4uzcjq5uagh4r7woymauxmyg3qar2bea5pv7jul7mqpy5rljq", "value": { "wnfs/priv/dir": { "entries": { "anime": { "contentCid": { - "/": "bafkr4idfb6czevqvtq4r5m5trlchtxo35gmhm3tzqiyhzldtn4aaey2vpe" + "/": "bafkr4ibojs5rmbq5bwcsi2lfi7zp2ktnr2awouczs3rul3b4mioxhqdi7q" }, "label": { "/": { @@ -752,7 +752,7 @@ expression: values } }, "headerCid": { - "/": "bafkr4idg6snyh35lnpvzcgesjkaaxx6zjxshpogd64ze64a5kktfo3nzvq" + "/": "bafkr4ic4myx7wgjgmmygtaxaz33krp5mxx2zeciu6xvcwsv63eegcq4rju" }, "metadata": { "created": 0, @@ -762,7 +762,7 @@ expression: values "version": "1.0.0" } }, - "bytes": "T6EjSLJGR1Ckk85SRNTa+2HUBkjM3oPJWq8lThHbxO1NzlGPDx3qlR0J8XVUegpx27nsxDAzGVOUMSKDC5A/6NbfqNRbou56de2rMyeDc26hJb96kCmsFoIliNXEWAFg+6+Qu4Ho8uqcO2S/p1cnKNG9l3JYYd0UeIRt1Et2QsNXbw/CXz6IS8QnaiJG+WFldHk4iFBSJZFuzSel1jak/Sg4mYKm2IQ4Ph+9dA/I5jP2e80TzTLDXs1qKlT5ME2X60ZHYjOzsXQu0F5ECUvdRmT1pirIykBEChWRVDQ9wR7COPRf0xuNJ/Jp26fFl5+TosmieSXjNsC5Oy6HY0T0yDRpkEz+72jhLg0ttBwiHYjAhlM7SQ/HCykEYjgwgJEW9rcFJ3+UAejaXpDTSmGTj2tMjCOlwXthu3WeSmQb3Zo29LRylIts/mm75KpmVzvGCTWNy9xh/6y58t2QgP+qaQk2FDY1NKbSZFVwUOPantk=" + "bytes": "T6EjSLJGR1Ckk85SRNTa+2HUBkjM3oPJWq8lThHbxO1NzlGPDx3qlR0a+nNVegBsH+2jmnduFIeDODWIAYkUSN3WTm70FTUZrZQi228BogmBhpQVPB2ysCXLVtzRc3MomhMmmBH6JF0oYE8XkF2kf71RJTobSBJjGvgUMM14RPbA81HKtb+HdvLV4AHDoGd4YNw+AElILoO/2y6kyxCkIBV0zrwUz+uKYwp+5Ry5VjqTZB5fSf/W9h8bK8X5fL7XKM8Zjltn+dM3wlxuHEHtAZ/lwo0Rwhag/I4LQ/XMJqyNg+u7YMjx9M0aB6r0vsU3AJfVhtf+e527IDuaYkz37TQh5lRfhAFSylEsaFy20a9ZYIamv2Okok698Qr/8O+8BTZVc/VbfWiOIMOJoGuUhH5NhyWlwXthu3WeSmQb3ZoPnR4b27iT9x6Kt+5UhlmxXVhprLEWJftfP2uY499uXadfdYlDJi7etpoCk+UodVA=" }, { "cid": "bafkr4ig24orkcp75447hy2abpan36i3woaerfsg6bnu4z656d6xpa22jsu", diff --git a/wnfs/src/snapshots/wnfs__root_tree__snapshot_tests__root_filesystems.snap b/wnfs/src/snapshots/wnfs__root_tree__snapshot_tests__root_filesystems.snap index 9488d0f4..78b984c9 100644 --- a/wnfs/src/snapshots/wnfs__root_tree__snapshot_tests__root_filesystems.snap +++ b/wnfs/src/snapshots/wnfs__root_tree__snapshot_tests__root_filesystems.snap @@ -4,23 +4,23 @@ expression: values --- [ { - "cid": "bafyr4iheuuydjam7pbrh7f36nxwmgqmpz7yzym35mitk33gokp56ne4ivy", + "cid": "bafyr4idwg7affs3dqx2pgjz43nl6txu5ih7eujfruh5xym64354tjbio7m", "value": { "exchange": { "/": "bafyr4ih3k2ipwwqryrlmtmwtolma4t772gknmx7pxqu5opjwsrr2nc27qq" }, "forest": { - "/": "bafyr4ifm3iuhqtorqgsknwaa55kxlkylxly422so5tgbds7oixx6auclde" + "/": "bafyr4ifsnrb47gv5b7tqjg4ayo5r5xc2uqqdyusz6co7afcxnn75kmc6jm" }, "public": { "/": "bafyr4ih3k2ipwwqryrlmtmwtolma4t772gknmx7pxqu5opjwsrr2nc27qq" }, "version": "1.0.0" }, - "bytes": "pGZmb3Jlc3TYKlglAAFxHiCs2ih4TdGBpKbYAO9VdasLuvHNak7szBHL7kXv4FBLGWZwdWJsaWPYKlglAAFxHiD7VpD7WhHEVsmy03LYDk//0ZTWX++8Kdc9NpRjpotfhGd2ZXJzaW9uZTEuMC4waGV4Y2hhbmdl2CpYJQABcR4g+1aQ+1oRxFbJstNy2A5P/9GU1l/vvCnXPTaUY6aLX4Q=" + "bytes": "pGZmb3Jlc3TYKlglAAFxHiCybEPPmr0P5wSbgMO7HtxapCA8UlnwnfAUV2t/1TBeS2ZwdWJsaWPYKlglAAFxHiD7VpD7WhHEVsmy03LYDk//0ZTWX++8Kdc9NpRjpotfhGd2ZXJzaW9uZTEuMC4waGV4Y2hhbmdl2CpYJQABcR4g+1aQ+1oRxFbJstNy2A5P/9GU1l/vvCnXPTaUY6aLX4Q=" }, { - "cid": "bafyr4ifm3iuhqtorqgsknwaa55kxlkylxly422so5tgbds7oixx6auclde", + "cid": "bafyr4ifsnrb47gv5b7tqjg4ayo5r5xc2uqqdyusz6co7afcxnn75kmc6jm", "value": { "accumulator": { "generator": { @@ -50,10 +50,10 @@ expression: values }, [ { - "/": "bafkr4ibhabqoafmrp6hwfgr4t2nhuaubcdmiyj5gabmmb4dfixikm5onyu" + "/": "bafkr4ia7j7qr7tr5mjtfubc3gymkywenrgox467roubruh5zxk25h3zaoq" }, { - "/": "bafkr4idllpieugl4biudvfi5qpw3g45pagbmifo5xzmrmhelvq6bm63cqa" + "/": "bafkr4ifqkvnneofnypnyy5earqinowocjkmr2ermdhobraxej5x7ymhyfq" } ] ] @@ -67,10 +67,10 @@ expression: values }, [ { - "/": "bafkr4iahin3hzsm2b73deeogau3shuwtrq2k5ygczipcdcnvf2xoopd64y" + "/": "bafkr4ie6tsog34cj43okjbawm3oihenft5phyojfjocgtckzfpcqa2sp3a" }, { - "/": "bafkr4ieeumiq23ogcl7447hxztp5wxh4a7biumjvzpft56vduqjusq5wsm" + "/": "bafkr4igqi5pawxlga75cbj4rtmxviawihqrrndrmbmzfzt7membnfvpdgy" } ] ] @@ -98,10 +98,10 @@ expression: values }, [ { - "/": "bafkr4ibsfetuv2shlfs6lhpr3s3xzcczizrni25taxs6cf5ik2ul5nirpi" + "/": "bafkr4iadhte4pke7e7rlbggscpbhgcejcfiue5wszithlcs3xpx436x6oa" }, { - "/": "bafkr4igxwg7sdlh7no6xlvgkyeal2h7nt572ztxz5keeckua3aadvhedr4" + "/": "bafkr4ieaxnzqx2afsmwmpf6boru6ke5j3hybs73xmx456vljohcbdiw52m" } ] ] @@ -111,7 +111,7 @@ expression: values "structure": "hamt", "version": "0.1.0" }, - "bytes": "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" + "bytes": "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" }, { "cid": "bafyr4ih3k2ipwwqryrlmtmwtolma4t772gknmx7pxqu5opjwsrr2nc27qq", @@ -129,53 +129,13 @@ expression: values "bytes": "oWx3bmZzL3B1Yi9kaXKkZ3ZlcnNpb25lMS4wLjBobWV0YWRhdGGiZ2NyZWF0ZWQAaG1vZGlmaWVkAGhwcmV2aW91c4BodXNlcmxhbmSg" }, { - "cid": "bafkr4ibhabqoafmrp6hwfgr4t2nhuaubcdmiyj5gabmmb4dfixikm5onyu", - "value": { - "inumber": { - "/": { - "bytes": "wTIY5Lj52cZAPjN2QxQb04Tvs5ben9hjXKIVD5UpCeE" - } - }, - "name": { - "/": { - "bytes": "WzUFTg2et93G6urhSL2Viqdf49sAgAv0vv8SE1SgzA2V80ukVHaZR6+PcbbkvJa7kqRzKbUJ8si3pckU/2L30Kmr+JVM38v6cQAT5N0y9KiTmXX6EyUIkQ5r+zfH8xybEhJ00mPJbRpB76OgZ24z9a1VLWQCcenR6GsrPWUkU94p3r8XBQtIBni/uHjKlpFvR/Csq+pmoBqK5qOYaDsgWn6nV8pgMIIRFifu6S7bw9SSMtRUrW/FFfcu1GjRHeq7UV71wyUGGB2gpC4Ekm8Y/tri1S3zHbLnh54ck+tjUZM0MMRSWnL+FvwXcYKaxfRmxooi0Jajw3zF+xGdW8hlnw" - } - }, - "ratchet": { - "large": { - "/": { - "bytes": "0Xcz7RLjVmm+AzcWeY2i2QLcclCjoJktNy65o58rQDw" - } - }, - "medium": { - "/": { - "bytes": "Nk4K4fSXXGSIL1hQ0gHHVGKjY/xSLm4fcLv3z0IPI5U" - } - }, - "mediumCounter": 187, - "salt": { - "/": { - "bytes": "ONa5zrgjyuV6QSBzqKdagXT6HqmDbOX6b0+TK6spVOw" - } - }, - "small": { - "/": { - "bytes": "GW6XCdcS0jHPZikFzLxI+KfsQ7zW4fZDxUHoah+l5hU" - } - }, - "smallCounter": 184 - } - }, - "bytes": "6bOExcGiQkZF4QyssM3SpoTIO8gh00SnOITC2x432WLvaLerZ0H3599c/bYp/fPktSx5qqFpyqXdee0/QXn7bU3f80Bi834OuBmeZThhTaziZUwJpBk6Iuo3eVCb7BEIl+3itdi4ZVI2wE29caepXpbeKkCAG2Keg0dediZNRE0+MJg/tt1yEMfmlZhrj1D8ZWAY/lzzzpvQcL4fIfXtpXZ4PmBa9nanhEVAdHomvipPsCTn64Sd6lJtfl/ZX+V95PIOJDltdS0plOSSRuG/MR4lLS4EavQU6dRoRiyQl+kzElS+1jr3HdnQwicFPRnBUYc0qtp6lACewo9wqK0cMKvd/ddU5P52tPCXYPOVFEYdcXI+O7ZhBxt5OAU9eeyFSZvtBp3dMSkk2+JLjuIcgmiYlZrkGMQ2Eweh2vwVou5mJ8PkC8gswKEKJNGQ50itgOHOkArlPV82pwjjhZRudZ5iK9O8iw6KqX4zA2By8LkkcYCPquIBD3iiUL3AQ3UlMzCNU9OwIykhFcHsw46fZ0UyODs3H9PWtIPyuIGask5gDaygOv/ydLzeki49dXyNXD6xTDMDZBn+fag8r3OseJyx829mk9uohNygPd9628JRUVpADJCQPabCPQkq2dIuLpJ7+1IHuePXlcp412BYf3xz2d2fRNEbJNQPE9KBT5fmqt11IzMcAw==" - }, - { - "cid": "bafkr4idllpieugl4biudvfi5qpw3g45pagbmifo5xzmrmhelvq6bm63cqa", + "cid": "bafkr4ia7j7qr7tr5mjtfubc3gymkywenrgox467roubruh5zxk25h3zaoq", "value": { "wnfs/priv/dir": { "entries": { "videos": { "contentCid": { - "/": "bafkr4ibsfetuv2shlfs6lhpr3s3xzcczizrni25taxs6cf5ik2ul5nirpi" + "/": "bafkr4iadhte4pke7e7rlbggscpbhgcejcfiue5wszithlcs3xpx436x6oa" }, "label": { "/": { @@ -195,7 +155,7 @@ expression: values } }, "headerCid": { - "/": "bafkr4ibhabqoafmrp6hwfgr4t2nhuaubcdmiyj5gabmmb4dfixikm5onyu" + "/": "bafkr4ifqkvnneofnypnyy5earqinowocjkmr2ermdhobraxej5x7ymhyfq" }, "metadata": { "created": 0, @@ -206,7 +166,7 @@ expression: values 1, { "/": { - "bytes": "EuBCdAHvQg7ypzevZrDVzAC6sTERuq6QuEqwr//3CT6cGilB9LcnlV/QZvE35u92EBXxFvZrcIQ" + "bytes": "qF533vnhhUek/eYchX7NHXD18uLePur7zdCVFgPLTtmoP3j0spdv4ApNGJoWvoiyWQJ/5tGdp/4" } } ] @@ -214,25 +174,65 @@ expression: values "version": "1.0.0" } }, - "bytes": "lGkOYRCu2AOX6pLROoK4EeP9HdsoYT+ezxC7LvMo7B3FY4atKGO3On6ZTil03oMpMZqhK3F/1qJiGPXAfzmFSfA0plB7xzbeN7LI1t9it5PNH6lGr4APeI1LhvSknOZUPvPqEU36MRgf1Nx4MTaqCAHkAytlrgWuMEec6Y+mCsgHVyFbK2j1oSonAujJaZqYqVzTXzBfULzK21NNus7D8qqzQboAJLq8HngCr9XtL6bap+7dDZKI34A+eXDP44JEeZEXQmQZ6rx5N4Milt3lp1aIVYRkFTaQb8dwKMjjAQY9LCEPClSowenhfj9FLgK8MDqxWLx9ugta6Zeacg/Xe+YJXT7SoY2csqoYbTlMvzLudK8B9UHFgDS9yKfjRg1Q3ixR5YOz/tBL/I2pqVfD2S8FN3D0EArCxGgG2kVU7b3QpHCuJj6zC92zf71SWvDRPiP2wY6jTlKqAbah/IqPKr4/ZgGIgYTDn9GehHaBXt3ZgYBgKYd0Lyet5vmq+nyFcN28EN47Sj2vfI54zwmxXYxpyRyQIDg75GrWb+1UI8PBA2Ua/WJxGUbf0reE" + "bytes": "lGkOYRCu2AOX6pLROoK4EeP9HdsoYT+ezxC7LvMo7B3FY4atKGO3On6KRS913ok09c35cjsq0aG0GO/IcimakFL8//LcZMMOKdFxKY2l5tC1nsoy72o3HDtKd7aOPr70h26AQL+UfTefIJKJtsyU3DYDuUNVuMhxAYRzSgR+93tw8CAQyx18yQTQyM/p/eEERvHJtNFLrLAxl76/r7gJhwtnRjxv2NUcnf2HBDI26m6SXlZHFD+ekNQ91A5grdNSq7VHRH8Y7qp/IIZOut3yiwzkxTd1U5b/sQJmfsq4T0+EdQShX2Ta+7uyU+gl+Ncc6CRmd3I2a3JD3miqp8fhxhqEhB+k5M6avr8fZDJZgDY1S+xT/4QetbZ99cceNGSWktX5HpYP7pvL8SzQEPlkq8EZp0X3q55TLl3DS+gtEZs1vPWbZPy7M43oy0hhctEyq8YXCIOuj2Ui8Safm0q3xU7zjsAnHTKfYUWUg32UX9bfgYBgKYd0Lyet5vmqeAD46A9WimBSo0z/2yWpVAVKlPX21SVptXQiIyhThruGNEGTtDBMZmQQEydNFyEP" + }, + { + "cid": "bafkr4ifqkvnneofnypnyy5earqinowocjkmr2ermdhobraxej5x7ymhyfq", + "value": { + "inumber": { + "/": { + "bytes": "wTIY5Lj52cZAPjN2QxQb04Tvs5ben9hjXKIVD5UpCeE" + } + }, + "name": { + "/": { + "bytes": "WzUFTg2et93G6urhSL2Viqdf49sAgAv0vv8SE1SgzA2V80ukVHaZR6+PcbbkvJa7kqRzKbUJ8si3pckU/2L30Kmr+JVM38v6cQAT5N0y9KiTmXX6EyUIkQ5r+zfH8xybEhJ00mPJbRpB76OgZ24z9a1VLWQCcenR6GsrPWUkU94p3r8XBQtIBni/uHjKlpFvR/Csq+pmoBqK5qOYaDsgWn6nV8pgMIIRFifu6S7bw9SSMtRUrW/FFfcu1GjRHeq7UV71wyUGGB2gpC4Ekm8Y/tri1S3zHbLnh54ck+tjUZM0MMRSWnL+FvwXcYKaxfRmxooi0Jajw3zF+xGdW8hlnw" + } + }, + "ratchet": { + "large": { + "/": { + "bytes": "0Xcz7RLjVmm+AzcWeY2i2QLcclCjoJktNy65o58rQDw" + } + }, + "medium": { + "/": { + "bytes": "Nk4K4fSXXGSIL1hQ0gHHVGKjY/xSLm4fcLv3z0IPI5U" + } + }, + "mediumCounter": 187, + "salt": { + "/": { + "bytes": "ONa5zrgjyuV6QSBzqKdagXT6HqmDbOX6b0+TK6spVOw" + } + }, + "small": { + "/": { + "bytes": "GW6XCdcS0jHPZikFzLxI+KfsQ7zW4fZDxUHoah+l5hU" + } + }, + "smallCounter": 184 + } + }, + "bytes": "EAc+yk8dlWg1IgUl8Qi5Hc6njiV2dZLiOHLA8wPnB37EhWYy7mBS+6DxHeY7iiDbBNjVG+93Sy5QYK3G1VBwIi/mu2ECvrtVghiHcB1JZNDjUApu8STu5vc5YaR44w/l+K5Fq3NLRye9pc1fYOj3om6OtUOMzGxOjgI7NsvP0u7OI4hIV9lv6SsLYNZAmQA3+IkhCO6GNWJE9yT2dKPEe6R2nqLvf8QhUowapFuhfaP5aa1ui/9fi9CYGqK/UeVEUVwBTvd0rECiwR2nt4ioFQlVrsvQV7+qhkhZuksmfywu0PgEaWAylcdcWLsjDWYtnHEnEu1pRgEtZIf+yAEdl/GvgliHns/urWviOmj1bIf3Yqu3/2jrnNg/rYhgOMZ/i/C4JTZI2KbXi86MVCmNwc0CcqyuyfCP3AQqrTb6QGfAfwyVweCFaWHsweNVZFnoKIzZVbp4ew59mMksJ9Y4aswQDNe9LCAyzBUpE1PR6HxG2bkZt0UrcLv2S7e8uKFB59JqqBZUIh+xS5w3C80g1IpeuKF2GbNME6TIKXMAy0McqdTUybQHKBaoDnanF4foElHwD9hP2sr5u/+AcN8GPsqc1IcWQx2Tm4ne1k3Sz+BFGd4BcCVobORd2c/jDKukQLKNgoS+olgqjktgvQjlQ9CtxmYjX5j6nbbEDPzgzhduArVMbSxoUQ==" }, { - "cid": "bafkr4iahin3hzsm2b73deeogau3shuwtrq2k5ygczipcdcnvf2xoopd64y", + "cid": "bafkr4ie6tsog34cj43okjbawm3oihenft5phyojfjocgtckzfpcqa2sp3a", "value": { "/": { - "bytes": "7hBOK8/9N8LTsZ07nmvXlVYeJuxJi6xLyf90IOlERtDf7KJmA5w7490h3we6S+3wcNH6mxurxELKkcNQSqhWlBZ20jssL4D9iUEtHg0s3AtSbcPjYvPv6uhNGHcF/aNMyokLO6n3NZ1hRdNy7dzxBmAmx8P1hL+2U5IywQCatHraSS8AiDZS12nktfSUbo7PTfW3IfbtN+rAR5Y5/ZwCbBjqzPvhzmdSjXDQ+7m/Ady9GS/AeOnpp9oH6MbdcWT1YwuJXO2e8+hKSmIEdPLpJmgdqfw9NpqUVHenABPjPiUtUScDRx1AiRgwxQKXo3yLyGHTk1GQRCQuvZc21kwBwwnP3RMqXiK8ZkUjiMM11RFeee71mHFcvgzC5RT0YkvDWalR6EoLzs6AV0OX8v4pFhmzVZyByiYcGkX+fb3qnuArbl3RpHLH+cO1iHScvCgqLT9M0TtIB+Y4UiOE6gwZJR4X0Pwdm1PxcYYcBe9Lo4Ln7A+7knWMp1j3SJaFGCu+WCAqwAv6RVwHR3RkJGVHHgFUgLKKCVQu/obEUyjh+RPw8AabldmG62lLzTvamKKpb0xUEG44zApJqlRlztQ0gZ7bSXSE6Wuy52RMB4geEvi6n9vByG/9WsGZZU7AW5JCCVj1BSDc95WZjb0xRw/o+l8tglC6YV1OQa54Dk+/LRK96xudFBHzAA" + "bytes": "e7jkHFUGlv3veP/28BO7NGJ7pQyi1jtux67NqxpxYiDeYXYnuRl8LKEKreqYrh51gc+20hSeleXs0ZEc8gI4ORRHcBKlt6aVmSH6CpfubeN4H7nWlwspcPJlf6FVq54r/DSyajNZCYMFDT58D75PolUL7x4Gd723YACtm6pT9sMD+HFjGigi+tL9D1LzubEv2D7K8Ns3Fa2IUBa2JuTDqhp+uC4Z0RiVvg" } }, - "bytes": "7hBOK8/9N8LTsZ07nmvXlVYeJuxJi6xLyf90IOlERtDf7KJmA5w7490h3we6S+3wcNH6mxurxELKkcNQSqhWlBZ20jssL4D9iUEtHg0s3AtSbcPjYvPv6uhNGHcF/aNMyokLO6n3NZ1hRdNy7dzxBmAmx8P1hL+2U5IywQCatHraSS8AiDZS12nktfSUbo7PTfW3IfbtN+rAR5Y5/ZwCbBjqzPvhzmdSjXDQ+7m/Ady9GS/AeOnpp9oH6MbdcWT1YwuJXO2e8+hKSmIEdPLpJmgdqfw9NpqUVHenABPjPiUtUScDRx1AiRgwxQKXo3yLyGHTk1GQRCQuvZc21kwBwwnP3RMqXiK8ZkUjiMM11RFeee71mHFcvgzC5RT0YkvDWalR6EoLzs6AV0OX8v4pFhmzVZyByiYcGkX+fb3qnuArbl3RpHLH+cO1iHScvCgqLT9M0TtIB+Y4UiOE6gwZJR4X0Pwdm1PxcYYcBe9Lo4Ln7A+7knWMp1j3SJaFGCu+WCAqwAv6RVwHR3RkJGVHHgFUgLKKCVQu/obEUyjh+RPw8AabldmG62lLzTvamKKpb0xUEG44zApJqlRlztQ0gZ7bSXSE6Wuy52RMB4geEvi6n9vByG/9WsGZZU7AW5JCCVj1BSDc95WZjb0xRw/o+l8tglC6YV1OQa54Dk+/LRK96xudFBHzAA==" + "bytes": "e7jkHFUGlv3veP/28BO7NGJ7pQyi1jtux67NqxpxYiDeYXYnuRl8LKEKreqYrh51gc+20hSeleXs0ZEc8gI4ORRHcBKlt6aVmSH6CpfubeN4H7nWlwspcPJlf6FVq54r/DSyajNZCYMFDT58D75PolUL7x4Gd723YACtm6pT9sMD+HFjGigi+tL9D1LzubEv2D7K8Ns3Fa2IUBa2JuTDqhp+uC4Z0RiVvg==" }, { - "cid": "bafkr4ieeumiq23ogcl7447hxztp5wxh4a7biumjvzpft56vduqjusq5wsm", + "cid": "bafkr4igqi5pawxlga75cbj4rtmxviawihqrrndrmbmzfzt7membnfvpdgy", "value": { "/": { - "bytes": "e7jkHFUGlv3veP/28BO7NGJ7pQyi1jtux67NqxpxYiDeYXYnuRl8LKEZpuyZrhRoRJnuh0jdlPrw0dZbrVl70RBKYRKls6C3UiJBUqqqGYdJAfG8uxk83wEP7ZMsHel5qY8Ok3R3gCmqcnuQyNOIIbFfUVNrE5zIJLGepANp87acuaKX5QcelXWlRSIU8N4d45RIp6uMpT0eMgb6t8T8U8lZLuo02x1RrQ" + "bytes": "DHAqFkyhSq1pfHhVFwjM3mOGavKHKzImFFIHQFbCO9GW5F1WvrJyRJ/O1ddtH1Y10UElHzGdBWCDGmAeCD3s9LliEeX/zviQrxll+49pBLuemBCrEec41NMorg/Izhf2ggaGoAnHClDJRy6v0DsNKMegjjQcJ9HOOqPLRTnjEJKJr1RRRBoLia9ibSAmHb3W67okaE0PParzKfe5+qhzirTGlnoN5y9cpjsErV5WK/V0+6o1loFRE5dvsgX87KdmyM033rKaE2Las8VJq4p+hIGuVxenuhptNI+VyRKfi4ZBz/2pOxNqh5vQGywPwNh/kVY+H9Riy1oJMJMep8BfJoLYgt8e0Nl+EAjYc/RKUi6QoUWAENvd2nhHUKjjW0y8+sQBFM0i735gkZFgIL5V7Eq6YM0FlJcBniBSUjkJOf/cGHyhAmQH9/XMf5Q4/8DKmOU7XSMhmTR2M1SDRspBomPlarXtUUVtER7p8+lGNcWWZAAGzFYhPiJ4wyaJXRVkZ0E/yFn+lGgWiKs9H+VpJZ0xFrB1PXhLbuIoUNgFEZvErIuHQdFzdwIwHQPjeIeR4Sf9cyZFMZS3puKYkE2K2ItF8XH1g89pPhijKeDp8/wBPAuouX4VhaHZQVVv6+aVohKWGSUNXWX2bTpDLP+/1aM5gQb9U1EsNNUrW8J5DwS9rYZg43NWsg" } }, - "bytes": "e7jkHFUGlv3veP/28BO7NGJ7pQyi1jtux67NqxpxYiDeYXYnuRl8LKEZpuyZrhRoRJnuh0jdlPrw0dZbrVl70RBKYRKls6C3UiJBUqqqGYdJAfG8uxk83wEP7ZMsHel5qY8Ok3R3gCmqcnuQyNOIIbFfUVNrE5zIJLGepANp87acuaKX5QcelXWlRSIU8N4d45RIp6uMpT0eMgb6t8T8U8lZLuo02x1RrQ==" + "bytes": "DHAqFkyhSq1pfHhVFwjM3mOGavKHKzImFFIHQFbCO9GW5F1WvrJyRJ/O1ddtH1Y10UElHzGdBWCDGmAeCD3s9LliEeX/zviQrxll+49pBLuemBCrEec41NMorg/Izhf2ggaGoAnHClDJRy6v0DsNKMegjjQcJ9HOOqPLRTnjEJKJr1RRRBoLia9ibSAmHb3W67okaE0PParzKfe5+qhzirTGlnoN5y9cpjsErV5WK/V0+6o1loFRE5dvsgX87KdmyM033rKaE2Las8VJq4p+hIGuVxenuhptNI+VyRKfi4ZBz/2pOxNqh5vQGywPwNh/kVY+H9Riy1oJMJMep8BfJoLYgt8e0Nl+EAjYc/RKUi6QoUWAENvd2nhHUKjjW0y8+sQBFM0i735gkZFgIL5V7Eq6YM0FlJcBniBSUjkJOf/cGHyhAmQH9/XMf5Q4/8DKmOU7XSMhmTR2M1SDRspBomPlarXtUUVtER7p8+lGNcWWZAAGzFYhPiJ4wyaJXRVkZ0E/yFn+lGgWiKs9H+VpJZ0xFrB1PXhLbuIoUNgFEZvErIuHQdFzdwIwHQPjeIeR4Sf9cyZFMZS3puKYkE2K2ItF8XH1g89pPhijKeDp8/wBPAuouX4VhaHZQVVv6+aVohKWGSUNXWX2bTpDLP+/1aM5gQb9U1EsNNUrW8J5DwS9rYZg43NWsg==" }, { "cid": "bafkr4if5i2ranqh33wx2ztludcfuvkk2wak56dz4iuu23pi3hfna4aqboa", @@ -244,7 +244,7 @@ expression: values "bytes": "VgFiuyjwLxAVo9zsONyk/HNTWymLC4A3EEuSozh0iYFkMP8FTIeeG/VSDYTUaa7kwqcP" }, { - "cid": "bafkr4ibsfetuv2shlfs6lhpr3s3xzcczizrni25taxs6cf5ik2ul5nirpi", + "cid": "bafkr4iadhte4pke7e7rlbggscpbhgcejcfiue5wszithlcs3xpx436x6oa", "value": { "wnfs/priv/file": { "content": { @@ -264,7 +264,7 @@ expression: values } }, "headerCid": { - "/": "bafkr4igxwg7sdlh7no6xlvgkyeal2h7nt572ztxz5keeckua3aadvhedr4" + "/": "bafkr4ieaxnzqx2afsmwmpf6boru6ke5j3hybs73xmx456vljohcbdiw52m" }, "metadata": { "created": 0, @@ -274,10 +274,10 @@ expression: values "version": "1.0.0" } }, - "bytes": "B37cb+IrIPpyzAtM7pjd6qWgYmMRNV2tU+3ZCp6e/xGfkyaJ2+ocfd9mRBLoZthTe+8PoJbnPY0/1sTbTn0G8BDnG3YW3WnUW46X2RIyrEQwLv73cAEy/YUuW4tneY8QsHRQNILOdhhCilgnLQNPQ4xdiMpBE3kmvcu4C52bkvS/q73uDFflDNIjuuNZ4Tjj98NuLXdBD0PcJR+AKxFno17EaDl72EtFvX6r5ZblLsMDVVsxnRKIY4Q4v0bpUYJN5u4zG/LU5V6kDP05rsWUvfQZsGZ7s662dTr0EmD9iiMVBTTLMR7ociKVfRKwwklCg8DHXGO2UCNZHHnbTvTq63x0utR9dgUjE9q2kZ20svsA7epx63dWgOzXEXRrbP4PavG6uTYV7SRdy9AKoen9O9D3s90sPMPektSJqLTtGO66DaL2StuzIRj2l8C9JGj7Fw4xSLe9FJXKz9+3tPtrvlYkd2iMQpBt+4hBB4+TRlEFqcxjF67q3nr+oMl66VNkw0gae2Wzs6izmjMS+YrWEelK0LxscPy4siHcxDyvzPHAHQub3R8Ai9pEz7VUHFrGuvl84QyR1EdHqz7HvRsCghwXe5cgjOh9S7jptuid/kCf63U6S/nlC110u6u6PP/KPDrRZFn4k6dbqbv3hgPRGhezC1zoGUyBQUBvj44wVSO1gSAQV/rxyQ==" + "bytes": "B37cb+IrIPpyzAtM7pjd6qWgYmMRNV2tU+3ZCp6e/xGfkyaJ2+ocfd9mURj0YdRSYStW6969aJY50skbSGQg4CwfvGBtPLgKBg2YbPqsCVvO6aSxkZjV1twj7tHifApj2+sS1ju9KcqgaFUOXmaEJJu5dSMGvjOQqIMx67rjirS6OKsufZHhvfnwA65Wf9Es6aFGmyfXG2DoEb90zLOGhXzupQaIlzxqVolFnKeIMBiThSpaf4JM8T/RFM/aUGDf+h5yJ0AB+mATtHybnVIHWcDWGjcPV30PIB4pz3UTavlOt0k4Wcfei8S+mssieqhXPpExAZf9yx+sln+/Vrv2kWPo3JReGttQgjvgmRZ8wBk9lHGW9jOtl2OIWiRfisXQMR5KOfhOMlWX8GxNbLTzB3pOvFC0Na/5vz5YbIJkOtbfgBgzF6Xb9R1pHDMEcAUYRYgIuzQXaShFKkMYvWR+Hra/6ZFyJ8Q61azjxbp+dhS0bFibTy3/BIBRKHtkTgVI3AuWMIEUMVavnCKTL4vzvB4XYpBJWv5NKc8UudhyPhHdIXQz/wYtpvUfVKFSOJhukJAPGv+vlhfhlJcxyNn/hQFwuTI0xoIvIchfgHM8o/jEnlwpw/uRSbGgq8sRVhmIj6xgclxy42XBNsz8lAhcliugH4L5uG6KLoXecj3D+Y0ggOr0OnDZ1A==" }, { - "cid": "bafkr4igxwg7sdlh7no6xlvgkyeal2h7nt572ztxz5keeckua3aadvhedr4", + "cid": "bafkr4ieaxnzqx2afsmwmpf6boru6ke5j3hybs73xmx456vljohcbdiw52m", "value": { "inumber": { "/": { @@ -314,6 +314,6 @@ expression: values "smallCounter": 20 } }, - "bytes": "xj9M46nMXNbMdI8ZDIpAKPiaZnLxCiSO+Zj3CVEvd+FDQue8Dd1gPMOc5nXjGP4PBDmsZLILWmQ89g3o0pkyb23LWXhVJFg2CKcMS+MqLwnFB6WevOkZaQWdx/URS4P+CQvyRC5nqJGzUN8+SQCh/IHf/5mKqOyF4UtG3H/BLoX+orKybQW96S/Dv8DA553CXHjMG03qpo1Bm/Uull2HdSDsVbVbH8wTyV9cctG09qEfKFOmY8/65HoMm0Y/4Fo/ouFIKc4sPblJy3D+4mPNsx61/A7kM9LFu1jLLkVZPP8h5pmwRBCCsHn2zfZL/OYNlEADieYqt/dmsbwzVsTbgaBYU8aehY2hscquonyVN94MvUtG3WepaplabK0ANR9aYXoZtCHAd7ODwyPi9KwA+RKLTVcciD8Ocl3EH72IfBbw2baa2TPqUiiTs2lSgysH7AchtNPvO449p9tNxI4tffRkkHAXOyINXoHjw7/E/+sQT69nETnMi6KDiZWg/yPpxRmXjvcPhskVBveFZEY9u5rJCMqxDWIiiG3NeDP6ftS92ZgPC6n7830guk/oUMqgpn99qRR3mb0lWkwZuznwNxpAcTvyWxCuswj1nKWyWh8JCj7p3SkXv8ylKxQt3eSjdnGxiUz+D9qQZ1MoVPBM9AkHQPQgoYK4FTwpOpLSEcZPn7iaD4PmNg==" + "bytes": "N7wdaPdPxzmYQOJ7edmSQLgLG1h/dh/o2iGEwgrUgcVOGCH3l+LZGlWTWSUpThsAUJ9PthEHx1Vh35E+ruszmko1D1VanK/HD4Xd43o5LQoYjpPZua05+niYlfwUu6C9tpO8STn3nozwJxKDmOAnKzZ8Wfi+OafWAPpGG1ilAScwpXNDwPupW+3XC4XsYvDv1ARaWKlMA6jMcQU+isa/VjvpFB6DJRiF/I6oCF+V1zlW6gxt8yh4w7vN5Q2A+n7XmMLtRyad3QmFvch/oo+2M+Hny/wdGOOb4ch5tn0rC90aiQnsGteF8DejqhRSjGvuXOyZ4MnClGJ75E70QoOAtmWFUB5Nrqg8L5W7ZUQTc+TiaVlj9H8mxbmxwoGxEMZzncT6LIUyuvEjyWOOuje3zsBadpe29nmjc/BmP2ASerG+CtxYj7Ogzrt+uQ7GroRylElCGJz1sn7DmCMKOuJJlRK5aR9cbM2BrCKLaTXQkYUlnI1Vahk/st/GbvMvP7b5yWghRlMTpiRZta7GycJ2oKMpm0JBsjeLpbIxn6PIOMuY3jGpjQ9vOc52FH/tItN+FheT1Rbl05+8AgPuS3m3S4fsahWqpWpyMAKD0qaFVV7cAu0cKQnnQeK7uoOWSieoG4eBk2DHwovJo/xSBypO6U6PF+hI4q3Oer4LdGNjeenba2mtj/NsMA==" } ] diff --git a/wnfs/src/utils/common.rs b/wnfs/src/utils/common.rs index 40ac16c6..b3175f3a 100644 --- a/wnfs/src/utils/common.rs +++ b/wnfs/src/utils/common.rs @@ -1,7 +1,16 @@ use crate::error::FsError; use anyhow::Result; +use std::fmt::Debug; use wnfs_common::utils::error; +pub struct OnceCellDebug(pub Option); + +impl Debug for OnceCellDebug { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_tuple("OnceCell").field(&self.0).finish() + } +} + //-------------------------------------------------------------------------------------------------- // Functions //--------------------------------------------------------------------------------------------------