fangorn-sdk 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +20 -0
- package/README.md +104 -0
- package/lib/_virtual/rolldown_runtime.js +5 -0
- package/lib/circuits/poseiden1_hash/target/poseiden1_hash.js +46 -0
- package/lib/circuits/poseiden1_hash/target/poseiden1_hash.js.map +1 -0
- package/lib/circuits/poseiden2_hash/target/poseiden2_hash.js +50 -0
- package/lib/circuits/poseiden2_hash/target/poseiden2_hash.js.map +1 -0
- package/lib/circuits/preimage/target/preimage.js +160 -0
- package/lib/circuits/preimage/target/preimage.js.map +1 -0
- package/lib/crypto/constants.d.ts +5 -0
- package/lib/crypto/constants.d.ts.map +1 -0
- package/lib/crypto/constants.js +6 -0
- package/lib/crypto/constants.js.map +1 -0
- package/lib/crypto/encryption.d.ts +11 -0
- package/lib/crypto/encryption.d.ts.map +1 -0
- package/lib/crypto/encryption.js +52 -0
- package/lib/crypto/encryption.js.map +1 -0
- package/lib/crypto/merkle.d.ts +15 -0
- package/lib/crypto/merkle.d.ts.map +1 -0
- package/lib/crypto/merkle.js +56 -0
- package/lib/crypto/merkle.js.map +1 -0
- package/lib/crypto/proof.d.ts +12 -0
- package/lib/crypto/proof.d.ts.map +1 -0
- package/lib/crypto/proof.js +69 -0
- package/lib/crypto/proof.js.map +1 -0
- package/lib/crypto/rand.d.ts +6 -0
- package/lib/crypto/rand.d.ts.map +1 -0
- package/lib/crypto/rand.js +17 -0
- package/lib/crypto/rand.js.map +1 -0
- package/lib/deployContract.d.ts +62 -0
- package/lib/deployContract.d.ts.map +1 -0
- package/lib/deployContract.js +230 -0
- package/lib/deployContract.js.map +1 -0
- package/lib/fangorn.d.ts +86 -0
- package/lib/fangorn.d.ts.map +1 -0
- package/lib/fangorn.js +264 -0
- package/lib/fangorn.js.map +1 -0
- package/lib/index.d.ts +2 -0
- package/lib/index.js +3 -0
- package/lib/interface/index.d.ts +2 -0
- package/lib/interface/index.js +3 -0
- package/lib/interface/manifest.d.ts +8 -0
- package/lib/interface/manifest.d.ts.map +1 -0
- package/lib/interface/manifest.js +11 -0
- package/lib/interface/manifest.js.map +1 -0
- package/lib/interface/zkGate.d.ts +36 -0
- package/lib/interface/zkGate.d.ts.map +1 -0
- package/lib/interface/zkGate.js +375 -0
- package/lib/interface/zkGate.js.map +1 -0
- package/lib/test/index.d.ts +8 -0
- package/lib/test/index.d.ts.map +1 -0
- package/lib/test/index.js +26 -0
- package/lib/test/index.js.map +1 -0
- package/lib/test/testbed.d.ts +18 -0
- package/lib/test/testbed.d.ts.map +1 -0
- package/lib/test/testbed.js +42 -0
- package/lib/test/testbed.js.map +1 -0
- package/lib/types/types.d.ts +51 -0
- package/lib/types/types.d.ts.map +1 -0
- package/lib/types/types.js +1 -0
- package/lib/utils/index.d.ts +13 -0
- package/lib/utils/index.d.ts.map +1 -0
- package/lib/utils/index.js +47 -0
- package/lib/utils/index.js.map +1 -0
- package/package.json +82 -0
package/LICENSE.md
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# MIT License
|
|
2
|
+
|
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
4
|
+
a copy of this software and associated documentation files (the
|
|
5
|
+
'Software'), to deal in the Software without restriction, including
|
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
|
9
|
+
the following conditions:
|
|
10
|
+
|
|
11
|
+
The above copyright notice and this permission notice shall be
|
|
12
|
+
included in all copies or substantial portions of the Software.
|
|
13
|
+
|
|
14
|
+
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
17
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
18
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
19
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
20
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# Fangorn
|
|
2
|
+
|
|
3
|
+
Intent-Bound Data.
|
|
4
|
+
|
|
5
|
+
> This is currently a pragmatic initial version of our vision. Expect this repo to undergo radical changes over the coming months.
|
|
6
|
+
|
|
7
|
+
## Usage
|
|
8
|
+
|
|
9
|
+
Fangorn allows wallets to create private data "vaults" that are password protected. Data can be accessed by providing a zero-knowledge proof, limiting information published onchain about which data was accessed. While this initial version leaks the user address and the id of the vault, it hides the content identifier of actual data accessed.
|
|
10
|
+
|
|
11
|
+
## Setup
|
|
12
|
+
|
|
13
|
+
To build this project, navigate to the root directory and run `pnpm i`.
|
|
14
|
+
|
|
15
|
+
### Encryption
|
|
16
|
+
|
|
17
|
+
Fangorn allows encrypted data to be added to a 'vault' protected by a user-defined password. First, a user creates a vault
|
|
18
|
+
|
|
19
|
+
```js
|
|
20
|
+
// initialize a new fangorn client against the default testnet configuration (base sepolia)
|
|
21
|
+
const fangorn = await Fangorn.init(delegatorAccount, jwt, gateway);
|
|
22
|
+
|
|
23
|
+
// create a new vault bound to a password
|
|
24
|
+
const vaultName = "myvault-001";
|
|
25
|
+
const password = "test";
|
|
26
|
+
const vaultId = await fangorn.createVault(vaultName, password);
|
|
27
|
+
|
|
28
|
+
// upload files to the vault
|
|
29
|
+
let filedata = [
|
|
30
|
+
{ tag: "test0", data: "content0", extension: ".txt", fileType: "text/plain" },
|
|
31
|
+
{ tag: "test1", data: "content1", extension: ".png", fileType: "image/png" },
|
|
32
|
+
];
|
|
33
|
+
await fangorn.upload(vaultId, filedata);
|
|
34
|
+
|
|
35
|
+
// easily add more files to the vault
|
|
36
|
+
let filedata = [
|
|
37
|
+
{ tag: "test2", data: "content2", extension: ".mp4", fileType: "video/mp4" },
|
|
38
|
+
];
|
|
39
|
+
await fangorn.upload(vaultId, filedata);
|
|
40
|
+
|
|
41
|
+
// overwrite a vault
|
|
42
|
+
let filedata = [
|
|
43
|
+
{
|
|
44
|
+
tag: "test3",
|
|
45
|
+
data: "content3",
|
|
46
|
+
extension: ".js",
|
|
47
|
+
fileType: "text/javascript",
|
|
48
|
+
},
|
|
49
|
+
];
|
|
50
|
+
await fangorn.upload(vaultId, filedata, true);
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Decryption
|
|
54
|
+
|
|
55
|
+
Decryption works by providing a vault id, tag, and the valid password to unlock the data. Proof generation is handled by the Fangorn SDK.
|
|
56
|
+
|
|
57
|
+
```js
|
|
58
|
+
// The tag associated with the data we want to decrypt
|
|
59
|
+
const taxTag = "tax-2025";
|
|
60
|
+
const password = "test";
|
|
61
|
+
|
|
62
|
+
const fangornDelegatee = await Fangorn.init(delegateeAccount, jwt, gateway);
|
|
63
|
+
// try to recover plaintext
|
|
64
|
+
const plaintext = await fangornDelegatee.decryptFile(vaultId, taxTag, password);
|
|
65
|
+
|
|
66
|
+
console.log("we got the plaintext " + plaintext);
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## Testing
|
|
70
|
+
|
|
71
|
+
### Setup
|
|
72
|
+
|
|
73
|
+
The e2e test suite requires various environment variables that must be manually configured.
|
|
74
|
+
|
|
75
|
+
Testnet tokens (ETH on Base Sepolia) can be obtained from Coinbase's official faucet https://portal.cdp.coinbase.com/
|
|
76
|
+
|
|
77
|
+
1. `cp .env.example .env`
|
|
78
|
+
2. Fill in the ENVs:
|
|
79
|
+
- `DELEGATOR_ETH_PRIVATE_KEY`: The private key of the delegator account
|
|
80
|
+
- Needs to have a balance of test ETH to send transactions
|
|
81
|
+
- `DELEGATEE_ETH_PRIVATE_KEY`: The private key of the delegatee account
|
|
82
|
+
- Needs to have a balance of test ETH to send transactions
|
|
83
|
+
- `CHAIN_RPC_URL`: The RPC URL of the ERC20 chain
|
|
84
|
+
- Expected to be Base sepolia testnet: https://base-sepolia-public.nodies.app
|
|
85
|
+
- It does not currently support other networks (would require modifying the lit action, which we will do in the future)
|
|
86
|
+
- `PINATA_JWT`: The JWT for Pinata
|
|
87
|
+
- Can be obtained from: https://app.pinata.cloud/developers/api-keys
|
|
88
|
+
- `PINATA_GATEWAY`: The gateway for Pinata
|
|
89
|
+
- Can use your own gateway or the default 'https://gateway.pinata.cloud'
|
|
90
|
+
- `LIT_ACTION_CID`: The CID of the lit action for access control checks
|
|
91
|
+
- Can be deployed by the test script, else use "QmcDkeo7YnJbuyYnXfxcnB65UCkjFhLDG5qa3hknMmrDmQ"
|
|
92
|
+
- `VERIFIER_CONTRACT_ADDR`: The Barretenberg verifier contract address
|
|
93
|
+
- Can be deployed by the test script, else use "0xb88e05a06bb2a2a424c1740515b5a46c0d181639"
|
|
94
|
+
- `ZK_GATE_ADDR`: The ZkGate.sol contract address
|
|
95
|
+
- Can be deployed by the test script, else use "0xec2b41e50ca1b9fc3262b9fd6ad9744c64f135a6"
|
|
96
|
+
|
|
97
|
+
### Running the tests
|
|
98
|
+
|
|
99
|
+
`pnpm test`
|
|
100
|
+
|
|
101
|
+
The tests will:
|
|
102
|
+
|
|
103
|
+
1. Build and deploy the solidity verifier to base sepolia (unless it is defined in .env)
|
|
104
|
+
2. Upload the Lit Action to IPFS (unless it is defined in .env)
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
//#region circuits/poseiden1_hash/target/poseiden1_hash.json
|
|
2
|
+
var poseiden1_hash_default = {
|
|
3
|
+
noir_version: "1.0.0-beta.16+2d46fca7203545cbbfb31a0d0328de6c10a8db95",
|
|
4
|
+
hash: "9790157143135327864",
|
|
5
|
+
abi: {
|
|
6
|
+
"parameters": [{
|
|
7
|
+
"name": "value",
|
|
8
|
+
"type": { "kind": "field" },
|
|
9
|
+
"visibility": "public"
|
|
10
|
+
}],
|
|
11
|
+
"return_type": {
|
|
12
|
+
"abi_type": { "kind": "field" },
|
|
13
|
+
"visibility": "public"
|
|
14
|
+
},
|
|
15
|
+
"error_types": {}
|
|
16
|
+
},
|
|
17
|
+
bytecode: "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",
|
|
18
|
+
debug_symbols: "tZhNbuM4EEbv4nUWquJ/X2UwCJzEaRgwnMCdNDAI+u4jWt9zkoU0hoVZkWYVn6kSnyj7Y/O0e3j/eb8/Pr/82vz462PzcNofDvuf94eXx+3b/uU4jn78udvw8f7ttNuNQ5sv8XHW6/a0O75tfhzfD4e7ze/t4f2c9Ot1ezy3b9vTGB3uNrvj09iOwOf9Ydd7f+4+Zw/zU3PW3NYuk5N9m23zs23IfLcNNX0S4jeCzxPcYhXB3T8vIIVvhDBPiIUlxFrnVhDn54fgmh/GC7/ML1fPT1xAKH7L/BKZ/3X95drrT84tTKXMXX9dqN8QqJ99+f589fe3pPnZ8tz327C0iViA2WwBbWkXWisQfPiswfctZL5E+ATk2SUsFGH8WnbxwjUsAeyiQYg3ASIaeBpu2EY5sA1z8tnbWFZ6tAi4RqRFwEqTcm2aX9zmSrAwv0QqUPLsk8h95S5aBFyzixYBK3dRqTyM6hBnS5AXTGx2KcHsabAE8IvKHuwmQGiXEtwICP8NWKhhvZyIbRhmt6H9f0/0dtlFLbTZBYSVT/QQ1z7RQ1r5RA95pYuLgGtcXASsdLElrqCV2VezOKx9MxrWvhoNtzzR/x4/bR/3p2/v05thvN3jprCxGQvrUxOmwTh9SlOTx2Zkl6mpU9M0fZhyzKZhc40HjUeNJ7WCWVFeVV6bxl3LctblGg9qxfOkvKw8rc6rxpsuaOh7amxNrasNfdOMbexbZmyTxrPaonhVvE3jUbwoXvQpL4YpL0aNixez4kXxqnHx0jDFk03xpPWloFa8lJSXlVc0Ll4SL4uXxcviZfFyVDwpruvN4mXxcpvyyjDlFV1vEa+ofkX1K7reIl4Rr1TltSmvqn5VvCpeFa+KV8Wr4lXxqnhVvCZeE6/pfjTdj6b6NfGaeE28Jl4TzwYBbTA6Qo5PanIioUQnk1PIqYR0Z8wgG2SDbJANskE2yAbZIBtkh9ytOSd3bc7JHghBdsgO2SE7ZIeMPhYgB8gBcoAcEjmZnEIIMh4ZIlmEHCFHyMhk2GToZPhkCGUYZShlOGVIZVhlaGV4ZYhlmGWoZUkuWJYMlrmD6GX4ZQhmGGYoZjhmSGZYZmhmeGaIZgVygVwgI5thmxXIBXKFjHGGclYhV6pRqUalGnhnFXKF3CDjnjXIDXJjzY01I6BhoDXITWQfRHYc9MHpBDqR5ERyJlToVDqQDTIOukE2yDjolpiVmQUZBx0H3bXr3LXr3CHjoOOgO2SH7JBx0HHQcdBx0HHQcdBx0DnHPGSSC8mQcdAja46sObJmHHQcdBx0HHQcdBx0HPTEmhNrTqwZBx0HPUFO3MFUmFWZBTlDxkHHQc86QzzrEPEMGQcdBz1XkvXk9wIZB73o+ewlkMOaOe8cBx0HnSPPOfOcQ89x0CvkChkHnZPPK3Wu1BkHvVINjj9v1LlRZxx0jkBv7LrGrsNBx0HHwYCDoTsYSu84nUAn0kn9rbN3RnL/TRi6g1OoEmoKdQfPIYNskLuD5+Tu4JScCGVChVAl1NRxyN3Bc3J38JzsrLk7OIUSoUyINTvk7uA5uTt4Tg6suTs4hTq5//T7vT3ttw+Hnf6tfn4/Pn758/rtn1ci/L39enp53D29n3b9xfwcG1/V/wU=",
|
|
19
|
+
file_map: {
|
|
20
|
+
"3": {
|
|
21
|
+
"source": "use crate::cmp::{Eq, Ord};\nuse crate::convert::From;\nuse crate::runtime::is_unconstrained;\n\nmod check_shuffle;\nmod quicksort;\n\nimpl<T, let N: u32> [T; N] {\n /// Returns the length of this array.\n ///\n /// ```noir\n /// fn len(self) -> Field\n /// ```\n ///\n /// example\n ///\n /// ```noir\n /// fn main() {\n /// let array = [42, 42];\n /// assert(array.len() == 2);\n /// }\n /// ```\n #[builtin(array_len)]\n pub fn len(self) -> u32 {}\n\n /// Returns this array as a slice.\n ///\n /// ```noir\n /// let array = [1, 2];\n /// let slice = array.as_slice();\n /// assert_eq(slice, &[1, 2]);\n /// ```\n #[builtin(as_slice)]\n pub fn as_slice(self) -> [T] {}\n\n /// Applies a function to each element of this array, returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.map(|a| a * 2);\n /// assert_eq(b, [2, 4, 6]);\n /// ```\n pub fn map<U, Env>(self, f: fn[Env](T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array along with its index,\n /// returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.mapi(|i, a| i + a * 2);\n /// assert_eq(b, [2, 5, 8]);\n /// ```\n pub fn mapi<U, Env>(self, f: fn[Env](u32, T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(i, self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// let mut i = 0;\n /// a.for_each(|x| {\n /// b[i] = x;\n /// i += 1;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_each<Env>(self, f: fn[Env](T) -> ()) {\n for i in 0..self.len() {\n f(self[i]);\n }\n }\n\n /// Applies a function to each element of this array along with its index.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// a.for_eachi(|i, x| {\n /// b[i] = x;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_eachi<Env>(self, f: fn[Env](u32, T) -> ()) {\n for i in 0..self.len() {\n f(i, self[i]);\n }\n }\n\n /// Applies a function to each element of the array, returning the final accumulated value. The first\n /// parameter is the initial value.\n ///\n /// This is a left fold, so the given function will be applied to the accumulator and first element of\n /// the array, then the second, and so on. For a given call the expected result would be equivalent to:\n ///\n /// ```rust\n /// let a1 = [1];\n /// let a2 = [1, 2];\n /// let a3 = [1, 2, 3];\n ///\n /// let f = |a, b| a - b;\n /// a1.fold(10, f); //=> f(10, 1)\n /// a2.fold(10, f); //=> f(f(10, 1), 2)\n /// a3.fold(10, f); //=> f(f(f(10, 1), 2), 3)\n ///\n /// assert_eq(a3.fold(10, f), 10 - 1 - 2 - 3);\n /// ```\n pub fn fold<U, Env>(self, mut accumulator: U, f: fn[Env](U, T) -> U) -> U {\n for elem in self {\n accumulator = f(accumulator, elem);\n }\n accumulator\n }\n\n /// Same as fold, but uses the first element as the starting element.\n ///\n /// Requires the input array to be non-empty.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [1, 2, 3, 4];\n /// let reduced = arr.reduce(|a, b| a + b);\n /// assert(reduced == 10);\n /// }\n /// ```\n pub fn reduce<Env>(self, f: fn[Env](T, T) -> T) -> T {\n let mut accumulator = self[0];\n for i in 1..self.len() {\n accumulator = f(accumulator, self[i]);\n }\n accumulator\n }\n\n /// Returns true if all the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 2];\n /// let all = arr.all(|a| a == 2);\n /// assert(all);\n /// }\n /// ```\n pub fn all<Env>(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = true;\n for elem in self {\n ret &= predicate(elem);\n }\n ret\n }\n\n /// Returns true if any of the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 5];\n /// let any = arr.any(|a| a == 5);\n /// assert(any);\n /// }\n /// ```\n pub fn any<Env>(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n for elem in self {\n ret |= predicate(elem);\n }\n ret\n }\n\n /// Concatenates this array with another array.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr1 = [1, 2, 3, 4];\n /// let arr2 = [6, 7, 8, 9, 10, 11];\n /// let concatenated_arr = arr1.concat(arr2);\n /// assert(concatenated_arr == [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n /// }\n /// ```\n pub fn concat<let M: u32>(self, array2: [T; M]) -> [T; N + M] {\n let mut result = [crate::mem::zeroed(); N + M];\n for i in 0..N {\n result[i] = self[i];\n }\n for i in 0..M {\n result[i + N] = array2[i];\n }\n result\n }\n}\n\nimpl<T, let N: u32> [T; N]\nwhere\n T: Ord + Eq,\n{\n /// Returns a new sorted array. The original array remains untouched. Notice that this function will\n /// only work for arrays of fields or integers, not for any arbitrary type. This is because the sorting\n /// logic it uses internally is optimized specifically for these values. If you need a sort function to\n /// sort any type, you should use the [`Self::sort_via`] function.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32];\n /// let sorted = arr.sort();\n /// assert(sorted == [32, 42]);\n /// }\n /// ```\n pub fn sort(self) -> Self {\n self.sort_via(|a, b| a <= b)\n }\n}\n\nimpl<T, let N: u32> [T; N]\nwhere\n T: Eq,\n{\n /// Returns a new sorted array by sorting it with a custom comparison function.\n /// The original array remains untouched.\n /// The ordering function must return true if the first argument should be sorted to be before the second argument or is equal to the second argument.\n ///\n /// Using this method with an operator like `<` that does not return `true` for equal values will result in an assertion failure for arrays with equal elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32]\n /// let sorted_ascending = arr.sort_via(|a, b| a <= b);\n /// assert(sorted_ascending == [32, 42]); // verifies\n ///\n /// let sorted_descending = arr.sort_via(|a, b| a >= b);\n /// assert(sorted_descending == [32, 42]); // does not verify\n /// }\n /// ```\n pub fn sort_via<Env>(self, ordering: fn[Env](T, T) -> bool) -> Self {\n // Safety: `sorted` array is checked to be:\n // a. a permutation of `input`'s elements\n // b. satisfying the predicate `ordering`\n let sorted = unsafe { quicksort::quicksort(self, ordering) };\n\n if !is_unconstrained() {\n for i in 0..N - 1 {\n assert(\n ordering(sorted[i], sorted[i + 1]),\n \"Array has not been sorted correctly according to `ordering`.\",\n );\n }\n check_shuffle::check_shuffle(self, sorted);\n }\n sorted\n }\n}\n\nimpl<let N: u32> [u8; N] {\n /// Converts a byte array of type `[u8; N]` to a string. Note that this performs no UTF-8 validation -\n /// the given array is interpreted as-is as a string.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let hi = [104, 105].as_str_unchecked();\n /// assert_eq(hi, \"hi\");\n /// }\n /// ```\n #[builtin(array_as_str_unchecked)]\n pub fn as_str_unchecked(self) -> str<N> {}\n}\n\nimpl<let N: u32> From<str<N>> for [u8; N] {\n /// Returns an array of the string bytes.\n fn from(s: str<N>) -> Self {\n s.as_bytes()\n }\n}\n\nmod test {\n #[test]\n fn map_empty() {\n assert_eq([].map(|x| x + 1), []);\n }\n\n global arr_with_100_values: [u32; 100] = [\n 42, 123, 87, 93, 48, 80, 50, 5, 104, 84, 70, 47, 119, 66, 71, 121, 3, 29, 42, 118, 2, 54,\n 89, 44, 81, 0, 26, 106, 68, 96, 84, 48, 95, 54, 45, 32, 89, 100, 109, 19, 37, 41, 19, 98,\n 53, 114, 107, 66, 6, 74, 13, 19, 105, 64, 123, 28, 44, 50, 89, 58, 123, 126, 21, 43, 86, 35,\n 21, 62, 82, 0, 108, 120, 72, 72, 62, 80, 12, 71, 70, 86, 116, 73, 38, 15, 127, 81, 30, 8,\n 125, 28, 26, 69, 114, 63, 27, 28, 61, 42, 13, 32,\n ];\n global expected_with_100_values: [u32; 100] = [\n 0, 0, 2, 3, 5, 6, 8, 12, 13, 13, 15, 19, 19, 19, 21, 21, 26, 26, 27, 28, 28, 28, 29, 30, 32,\n 32, 35, 37, 38, 41, 42, 42, 42, 43, 44, 44, 45, 47, 48, 48, 50, 50, 53, 54, 54, 58, 61, 62,\n 62, 63, 64, 66, 66, 68, 69, 70, 70, 71, 71, 72, 72, 73, 74, 80, 80, 81, 81, 82, 84, 84, 86,\n 86, 87, 89, 89, 89, 93, 95, 96, 98, 100, 104, 105, 106, 107, 108, 109, 114, 114, 116, 118,\n 119, 120, 121, 123, 123, 123, 125, 126, 127,\n ];\n fn sort_u32(a: u32, b: u32) -> bool {\n a <= b\n }\n\n #[test]\n fn test_sort() {\n let mut arr: [u32; 7] = [3, 6, 8, 10, 1, 2, 1];\n\n let sorted = arr.sort();\n\n let expected: [u32; 7] = [1, 1, 2, 3, 6, 8, 10];\n assert(sorted == expected);\n }\n\n #[test]\n fn test_sort_100_values() {\n let mut arr: [u32; 100] = [\n 42, 123, 87, 93, 48, 80, 50, 5, 104, 84, 70, 47, 119, 66, 71, 121, 3, 29, 42, 118, 2,\n 54, 89, 44, 81, 0, 26, 106, 68, 96, 84, 48, 95, 54, 45, 32, 89, 100, 109, 19, 37, 41,\n 19, 98, 53, 114, 107, 66, 6, 74, 13, 19, 105, 64, 123, 28, 44, 50, 89, 58, 123, 126, 21,\n 43, 86, 35, 21, 62, 82, 0, 108, 120, 72, 72, 62, 80, 12, 71, 70, 86, 116, 73, 38, 15,\n 127, 81, 30, 8, 125, 28, 26, 69, 114, 63, 27, 28, 61, 42, 13, 32,\n ];\n\n let sorted = arr.sort();\n\n let expected: [u32; 100] = [\n 0, 0, 2, 3, 5, 6, 8, 12, 13, 13, 15, 19, 19, 19, 21, 21, 26, 26, 27, 28, 28, 28, 29, 30,\n 32, 32, 35, 37, 38, 41, 42, 42, 42, 43, 44, 44, 45, 47, 48, 48, 50, 50, 53, 54, 54, 58,\n 61, 62, 62, 63, 64, 66, 66, 68, 69, 70, 70, 71, 71, 72, 72, 73, 74, 80, 80, 81, 81, 82,\n 84, 84, 86, 86, 87, 89, 89, 89, 93, 95, 96, 98, 100, 104, 105, 106, 107, 108, 109, 114,\n 114, 116, 118, 119, 120, 121, 123, 123, 123, 125, 126, 127,\n ];\n assert(sorted == expected);\n }\n\n #[test]\n fn test_sort_100_values_comptime() {\n let sorted = arr_with_100_values.sort();\n assert(sorted == expected_with_100_values);\n }\n\n #[test]\n fn test_sort_via() {\n let mut arr: [u32; 7] = [3, 6, 8, 10, 1, 2, 1];\n\n let sorted = arr.sort_via(sort_u32);\n\n let expected: [u32; 7] = [1, 1, 2, 3, 6, 8, 10];\n assert(sorted == expected);\n }\n\n #[test]\n fn test_sort_via_100_values() {\n let mut arr: [u32; 100] = [\n 42, 123, 87, 93, 48, 80, 50, 5, 104, 84, 70, 47, 119, 66, 71, 121, 3, 29, 42, 118, 2,\n 54, 89, 44, 81, 0, 26, 106, 68, 96, 84, 48, 95, 54, 45, 32, 89, 100, 109, 19, 37, 41,\n 19, 98, 53, 114, 107, 66, 6, 74, 13, 19, 105, 64, 123, 28, 44, 50, 89, 58, 123, 126, 21,\n 43, 86, 35, 21, 62, 82, 0, 108, 120, 72, 72, 62, 80, 12, 71, 70, 86, 116, 73, 38, 15,\n 127, 81, 30, 8, 125, 28, 26, 69, 114, 63, 27, 28, 61, 42, 13, 32,\n ];\n\n let sorted = arr.sort_via(sort_u32);\n\n let expected: [u32; 100] = [\n 0, 0, 2, 3, 5, 6, 8, 12, 13, 13, 15, 19, 19, 19, 21, 21, 26, 26, 27, 28, 28, 28, 29, 30,\n 32, 32, 35, 37, 38, 41, 42, 42, 42, 43, 44, 44, 45, 47, 48, 48, 50, 50, 53, 54, 54, 58,\n 61, 62, 62, 63, 64, 66, 66, 68, 69, 70, 70, 71, 71, 72, 72, 73, 74, 80, 80, 81, 81, 82,\n 84, 84, 86, 86, 87, 89, 89, 89, 93, 95, 96, 98, 100, 104, 105, 106, 107, 108, 109, 114,\n 114, 116, 118, 119, 120, 121, 123, 123, 123, 125, 126, 127,\n ];\n assert(sorted == expected);\n }\n\n #[test]\n fn mapi_empty() {\n assert_eq([].mapi(|i, x| i * x + 1), []);\n }\n\n #[test]\n fn for_each_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_each(|_x| assert(false));\n }\n\n #[test]\n fn for_eachi_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_eachi(|_i, _x| assert(false));\n }\n\n #[test]\n fn map_example() {\n let a = [1, 2, 3];\n let b = a.map(|a| a * 2);\n assert_eq(b, [2, 4, 6]);\n }\n\n #[test]\n fn mapi_example() {\n let a = [1, 2, 3];\n let b = a.mapi(|i, a| i + a * 2);\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn for_each_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n let mut i = 0;\n let i_ref = &mut i;\n a.for_each(|x| {\n b_ref[*i_ref] = x * 2;\n *i_ref += 1;\n });\n assert_eq(b, [2, 4, 6]);\n assert_eq(i, 3);\n }\n\n #[test]\n fn for_eachi_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n a.for_eachi(|i, a| { b_ref[i] = i + a * 2; });\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn concat() {\n let arr1 = [1, 2, 3, 4];\n let arr2 = [6, 7, 8, 9, 10, 11];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n }\n\n #[test]\n fn concat_zero_length_with_something() {\n let arr1 = [];\n let arr2 = [1];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_something_with_zero_length() {\n let arr1 = [1];\n let arr2 = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_zero_lengths() {\n let arr1: [Field; 0] = [];\n let arr2: [Field; 0] = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, []);\n }\n}\n",
|
|
22
|
+
"path": "std/array/mod.nr"
|
|
23
|
+
},
|
|
24
|
+
"51": {
|
|
25
|
+
"source": "use dep::poseidon2;\n\nfn main(value: pub Field) -> pub Field {\n poseidon2::bn254::hash_1([value])\n}",
|
|
26
|
+
"path": "/home/driemworks/fangorn/example-naga-litaction-decryption/circuits/poseiden1_hash/src/main.nr"
|
|
27
|
+
},
|
|
28
|
+
"53": {
|
|
29
|
+
"source": "use crate::bn254::permute_bn254;\nuse crate::bn254::consts;\nuse dep::hash_utils::poseidon;\nuse dep::std::collections::vec::Vec;\n\nfn internal_2(state: [Field; 2]) -> [Field; 2] {\n let sum = state[0] + state[1];\n [sum + state[0], sum + 2 * state[1]]\n}\n\nfn internal_3(state: [Field; 3]) -> [Field; 3] {\n let sum = state.reduce(|a, b| a + b);\n let mut ret_val = [0; 3];\n ret_val[0] = state[0] + sum;\n ret_val[1] = state[1] + sum;\n ret_val[2] = 2 * state[2] + sum;\n ret_val\n}\n\nfn external_3(mut state: [Field; 3]) -> [Field; 3] {\n let sum = state.reduce(|a, b| a + b);\n state[0] += sum;\n state[1] += sum;\n state[2] += sum;\n state\n}\n\nfn external<let T: u32>(mut state: [Field; T]) -> [Field; T] {\n let mut mds_parts: Vec<[Field; 4]> = Vec::new();\n for i in 0..T / 4 {\n let offset = (4 * i);\n mds_parts.push(poseidon::mds_4([\n state[0 + offset],\n state[1 + offset],\n state[2 + offset],\n state[3 + offset],\n ]))\n }\n for i in 0..T / 4 {\n for j in 0..4 {\n state[i * 4 + j] = mds_parts.get(i)[j];\n }\n }\n\n let mut stored = [0; 4];\n for l in 0..4 {\n stored[l] = mds_parts.get(0)[l];\n for j in 1..T / 4 {\n stored[l] += mds_parts.get(j)[l];\n }\n }\n for i in 0..T / 4 {\n for j in 0..4 {\n state[i * 4 + j] += stored[j];\n }\n }\n\n state\n}\n\nfn internal_4(mut state: [Field; 4]) -> [Field; 4] {\n diag_mat_mul(state, consts::internal_diag4)\n}\n\nfn internal_8(mut state: [Field; 8]) -> [Field; 8] {\n diag_mat_mul(state, consts::internal_diag8)\n}\n\nfn internal_12(mut state: [Field; 12]) -> [Field; 12] {\n diag_mat_mul(state, consts::internal_diag12)\n}\n\nfn internal_16(mut state: [Field; 16]) -> [Field; 16] {\n diag_mat_mul(state, consts::internal_diag16)\n}\n\nfn diag_mat_mul<let T: u32>(mut state: [Field; T], diag: [Field; T]) -> [Field; T] {\n let sum = state.reduce(|a, b| a + b);\n for i in 0..T {\n state[i] *= diag[i];\n state[i] += sum;\n }\n state\n}\n\n#[field(bn254)]\npub fn x5_2(input: [Field; 2]) -> [Field; 2] {\n permute_bn254(input, poseidon::mds_2, internal_2, consts::x5_2_config())\n}\n\n#[field(bn254)]\npub fn x5_3(input: [Field; 3]) -> [Field; 3] {\n permute_bn254(input, external_3, internal_3, consts::x5_3_config())\n}\n\n#[field(bn254)]\npub fn x5_4(input: [Field; 4]) -> [Field; 4] {\n permute_bn254(input, poseidon::mds_4, internal_4, consts::x5_4_config())\n}\n\n#[field(bn254)]\npub fn x5_8(input: [Field; 8]) -> [Field; 8] {\n permute_bn254(input, external, internal_8, consts::x5_8_config())\n}\n\n#[field(bn254)]\npub fn x5_12(input: [Field; 12]) -> [Field; 12] {\n permute_bn254(input, external, internal_12, consts::x5_12_config())\n}\n\n#[field(bn254)]\npub fn x5_16(input: [Field; 16]) -> [Field; 16] {\n permute_bn254(input, external, internal_16, consts::x5_16_config())\n}\n\n#[test]\nfn test_x5_2() {\n assert(\n x5_2([0, 1])\n == [\n 0x1d01e56f49579cec72319e145f06f6177f6c5253206e78c2689781452a31878b,\n 0x0d189ec589c41b8cffa88cfc523618a055abe8192c70f75aa72fc514560f6c61,\n ],\n );\n assert(\n x5_2([\n 0x0ae097f5ad29d8a8329dc964d961c9933a57667122baa88351719021510aadcc,\n 0x1db0afb64a7847b404e509b8076ea6f113e0dc33c8d8923850288b297b366a96,\n ])\n == [\n 0x234411a64c9117a670dcbb2e32887c05695108becb3746a4b63a5e0c64abf213,\n 0x0aeacd239c8086b9199880f4c20576cab326b06c4692d3dec9e13a35228a2a47,\n ],\n );\n assert(\n x5_2([\n 0x190e9f8d74c3ee7e6f9a5fc4f3e9aea43e4c636652d64732663ce4d4e9a82dfc,\n 0x116d4666591fd484d3f63b2143851ecf51790d344f076703aff0ea2ae73d84c0,\n ])\n == [\n 0x184f08154e7c0ae8d1dd611de726a33b46e83c881e7dcc83969ab5225bb1ffd2,\n 0x1c869eaf711604998e0015346275a1df87c872497cf501796b5c665bac5e6c51,\n ],\n );\n assert(\n x5_2([\n 0x0765449fba54a8f027fdfc4bba2251e13867d2999658961503e1c552eb8d30f0,\n 0x2458fc60fe06af665be546da89f792db27ba8122735483b028f7945b79a0121d,\n ])\n == [\n 0x00b99fef7542031ec0fc94e798c29b8d270ae80b0496316c722f149ddbd24c10,\n 0x05a9add2dfce4303c28124e1165154fcf44b7784d3adcc56f505d4e5917b8096,\n ],\n );\n assert(\n x5_2([\n 0x05df817f34e9cc11af435dd58951c0dc120a9637f1625dae110c900fd64fac01,\n 0x165798534b555615e2d3a7c0371d7c6b37814e4816dfcbcce9a7f5134166bf95,\n ])\n == [\n 0x2383496930a272a7d99e2db4dcfbe427ac7ece01dbb2c74e0393f44807131987,\n 0x238c2be5f5769977c50e089de45933dc1a00ef4f451497fa67b880fcbb5086da,\n ],\n );\n assert(\n x5_2([\n 0x278ab5ceb7ccf50051df09e958a60cdc29304d5a8bc5f512e8c05e4e8344b494,\n 0x0691450210975cfd5ad15ad9b7b8d2c0b0e15bc964511530830691b9bdb1deab,\n ])\n == [\n 0x267529bf7c33acceb53850eba2b713f4449a04d168f90b211c9cbfc2977955e8,\n 0x0dd91eb3904b8fd295abae96ce1e387d3ce1c06f1e68b8b14567c283a2719c10,\n ],\n );\n assert(\n x5_2([\n 0x0c19d1ab43ce3d913418687b4a60b758e2be814434c5310c7f0a6f5813befa40,\n 0x0cff2930faece292fb8ef0447faa51eca7538b91999d308c914ffe166deae4b2,\n ])\n == [\n 0x1ac275a60d969f95feead488e81955aa70680121066220a8e313309e76ce8c59,\n 0x05119d1c349bf5ad1b9af9ca6f17c40cd378cf971125709f1905b68d5172826c,\n ],\n );\n assert(\n x5_2([\n 0x23b96a10b3a6b5cb32a4a48ba9e2c7fd95a0381977051d377aba654ce3f46d3f,\n 0x12c4411263a01236387f3ad010243a44ac532a834589d6d7a38a0149748bf187,\n ])\n == [\n 0x26603ba36cd41bdbde16e06c6f1ec040743059b6ce45fe6f34e00bcb6e535b04,\n 0x0301f7923f6d373b7a36ce42a8f8be025d3f88e0abcd0b54e78ebfbf9116a9bf,\n ],\n );\n assert(\n x5_2([\n 0x2f1df4234732c49ac7567c29d2e066308f807e1bbf0951136b7fccba2602ea9e,\n 0x04a23083267080ae4ee1a3cb4173dbce507c86edcfdd02853b0399cdab611517,\n ])\n == [\n 0x0d6e20ac92800c7b08438805fe94a871c5f756ec07a919923c4e007cf01fa87e,\n 0x0d0e60f1acb65d948e7ff874e255c2c07a0f0ecc15e4d14209bc5d5715951ccb,\n ],\n );\n assert(\n x5_2([\n 0x106babe89343a47ce296eed78129b6f7af056b46ad808b2cabb66f371180dd17,\n 0x2f01d999b6e58284d87640c08c49e96d538ba3ffba0c544090fe858dbb5bc28e,\n ])\n == [\n 0x08d523548b9f396c877536b5f96fdfd1826ecdc0c806e24ae328586e8a405d8f,\n 0x1c1c5eeb613b596dd524fe59264ae5ef173cbd271e7f476a5f15d56175cb7478,\n ],\n );\n assert(\n x5_2([\n 0x299c0a40411ed9d7de7792fa299b262937b21fabfa386fa761e3f079c1d9045f,\n 0x2ace2e81e39d97a8e6d83c9e50a8643f4bf01a1465177518558305e7ab254c62,\n ])\n == [\n 0x2c62b5c08ee75aa967809de58131cb38e953fdbdccb9140ed92ea89adebcda85,\n 0x2c507b864995a399f7c1143f8c9dc67b7aca63419a2443a879715404a16ec6b8,\n ],\n );\n}\n\n#[test]\nfn test_x5_3() {\n assert(\n x5_3([0, 1, 2])\n == [\n 0x0bb61d24daca55eebcb1929a82650f328134334da98ea4f847f760054f4a3033,\n 0x303b6f7c86d043bfcbcc80214f26a30277a15d3f74ca654992defe7ff8d03570,\n 0x1ed25194542b12eef8617361c3ba7c52e660b145994427cc86296242cf766ec8,\n ],\n );\n assert(\n x5_3([\n 0x2c6422c33190d036a17bd4281738ad60a6b4544c1020da1c0c84880a0ddc71c4,\n 0x245cd98e5af9a6ebb35945b092c7e877ab9549c8919940250956a0bfedb457ab,\n 0x0b43c424171231016dfe2072518b825a18c759383dba4e09a47bcd8b1a55da21,\n ])\n == [\n 0x0b6f503d74ca8c80934b48d8d9e41c239ea6bcee17f658d416a0b72fd7daf1b8,\n 0x2845997bb81ad9d29f0b7ba57550cb7160b6930c70c92287207c7b5f65b2814b,\n 0x0a97e625f336a7c5e51bb2881e3b4e224f6e2e01ae5d698fa19446dbc407ac3f,\n ],\n );\n assert(\n x5_3([\n 0x124ce2326b4a95fe09743697c1e5c9ac9f6940cab7221decfd0162a8873c63ea,\n 0x167148c1014f9f1ae03bb93892ec0164c6f65f779b526c3499d7ac374e84af86,\n 0x18c0badc1c5aa472c434c254786f8e1aa8b519a7ec017dfd20bc1e5dfb820caa,\n ])\n == [\n 0x2791fa7cca97f87cc3de6ce004bccf28e3cb631e4fd31d50b38fc79b7e43dbbf,\n 0x22e42774e15a97e78d378b0225379ecbcb76060beef46e10e4b630bbd256003b,\n 0x2e56288af3d63be34692074d7db4ce2f9eda91f7a55ba60d7661d8c2bfca9580,\n ],\n );\n assert(\n x5_3([\n 0x034f5155557b5e85db4fba5c254882f8658baa03376a38d37ff03fef1f850cfd,\n 0x23975b943c4070c2bc98ec66b4a9e1f0ca1c812b38317bdbfac98aa748b5b059,\n 0x03f9ef0d827a433a679060b654b556daa963c9658f628a3522dee7e839ab3615,\n ])\n == [\n 0x0014a5e7728d210b90ef439df76561371be410051332852cea084ef73271ccbd,\n 0x05c0808fa8657cb6091ee49fd5a0b32de2affeab6bed761043044982b3d7e3f5,\n 0x2f6cc98fa05d79737a559115be171d2863e65080353c281b2104bb17b01f9c49,\n ],\n );\n assert(\n x5_3([\n 0x184561698ba999c39dcd5effd2f073e95345fb74f023ba25e162995a206ba79e,\n 0x294e74e9b2f87eb7f5e00a350a22ff02e22397c278d48cecae04a4a83085a9ce,\n 0x2840b008f9dd0379037622060b97bbe9fb5ffcf3e765c0a7feb5be13405ad2d8,\n ])\n == [\n 0x13b47f0963b7751e01c8ff9775b02df2b185d8a968edfded67d518fe00a13104,\n 0x287fc57d4458c6853c98a361b93fbfa6176e346bd75bbb11773b00356d496b6c,\n 0x200f5d2604826c715b6b0b731a5365d9bc24cba1fbeec033e3e0a434a6505251,\n ],\n );\n assert(\n x5_3([\n 0x1c3c047ca883688ca6b6ddec715eef99a40282a4dc1d1b33910f59f30074e8f4,\n 0x0a3aed04e3acb73a0f74d42f0d304f1afeefc00859a77d956120638d9007fbc5,\n 0x07d9e5a9a2ac225871d7616f13a7a0185731fa679d931762ce1ef7767a3e63df,\n ])\n == [\n 0x0df5bd217aa8e906435455b0151adae8dccb5f1fef23c0bd36a15f78f7b90ea7,\n 0x2f6ae610ef9f92d6bce4540aaecfd2f0e93bad0671f544f0c16bd8546de44928,\n 0x1b74956ba343323130615d776a667187f72ade7bc295c7750551170721f5253f,\n ],\n );\n assert(\n x5_3([\n 0x1e7cb866b31dc33c91585591e7c82530ef2a25c3feef3273b1c4fc382790ab2b,\n 0x2781a330739b20aff560c61207ac9a3dd0f74b78dd9d4ec97a3db650c4d05ae6,\n 0x275dc90993858ee8bcee5a94d1010f30c9731a49eb799e3aa0dfe94c73d1d28a,\n ])\n == [\n 0x1c8317bbb73ba936b89bb337d1a91a48639602b721e0400e0b9d5799f64c3dd7,\n 0x1a4887a3b86e801f5602aabf3d247a4fd508ecf6eb5d1e54d53eaeef7235b123,\n 0x1a1298a0b4d732d42c85649ac7167073350be052dedbc334d05cdbb2e636b72c,\n ],\n );\n assert(\n x5_3([\n 0x276d519f50629d7ab7b0362da8e532da858c989c37765d77e56d570ef67037d1,\n 0x2b7cd64f3fdb10e2006a924c051cd3ea53dfa82e75993bad8d0eb4ca8f3756b4,\n 0x07dc1f509cb68ec98ce1c9d18a89fa75a28a300ea58769a5fdc5ae19b4459c24,\n ])\n == [\n 0x2ad18eae7534d3d0efe05e897a4daebc441027e39256c1b647350f4a1969ed22,\n 0x089f6c4f52414101923991f94065e403aa9ddb7af3381c74b595650460d883ef,\n 0x1cfdc65275dc88f45a862bb5618c586c52a548a7ad33fa6240cb06cc79988278,\n ],\n );\n assert(\n x5_3([\n 0x0c6c15f4368f09bdaa7e7f4bc63d65d597eafe75764d82cb4d774e1982fce517,\n 0x2e250d17689425c849b6d94bf822783c14086e5b5a145f6bd67d61d227e5dfa5,\n 0x18693f449496390c0d6daa3f03170629b987b27c832c9e2aa586e3e36c6eac8e,\n ])\n == [\n 0x0d35a94d34a9fe5527a72ddb2a6654bfde040cb5ed436944146971939790429b,\n 0x0bf853441574d5367ebfb250538322e16bda7cd1ed8097a7924f937c3bdb6807,\n 0x1e9ece2f587bdcc047d4f18419934d2d53f5e1aeef8ae5ac7a66bea8eea657b2,\n ],\n );\n assert(\n x5_3([\n 0x2fb3cd143630e3dd1a1eda75a9e8e698ee7a3a877ec6ecd7a77de97a1e0b6657,\n 0x0c525ee6e5674c991dd70bd04a00bc62119d0ae97a1f1ec89cbdd34ac139edb4,\n 0x2b6d256970b78cda94586db4eb7db119b10ee087b9ba107afe8c64e7b34625b1,\n ])\n == [\n 0x131f70df273c7fe22667903a3aaeecfd8a873067c836159ffeb6b7e9f9ff347c,\n 0x2c3734764e1decc2f5edef11beeaa1e7319594a4fdd850ac34370fe616f07fc8,\n 0x06aaada4c2611fd916e1e0e7c31625e60d3e0b3ff972de980a3327350896ba2a,\n ],\n );\n}\n#[test]\nfn test_x5_4() {\n assert(\n x5_4([\n 0x0000000000000000000000000000000000000000000000000000000000000000,\n 0x0000000000000000000000000000000000000000000000000000000000000001,\n 0x0000000000000000000000000000000000000000000000000000000000000002,\n 0x0000000000000000000000000000000000000000000000000000000000000003,\n ])\n == [\n 0x01bd538c2ee014ed5141b29e9ae240bf8db3fe5b9a38629a9647cf8d76c01737,\n 0x239b62e7db98aa3a2a8f6a0d2fa1709e7a35959aa6c7034814d9daa90cbac662,\n 0x04cbb44c61d928ed06808456bf758cbf0c18d1e15a7b6dbc8245fa7515d5e3cb,\n 0x2e11c5cff2a22c64d01304b778d78f6998eff1ab73163a35603f54794c30847a,\n ],\n );\n assert(\n x5_4([\n 0x0c8c9889597488008e2e96985b843092fa78004ac3406c9df51ed2b6cf1165cd,\n 0x20519dc2e54103607f781cb4c3e0728db3c0183b0d8e32b7a18b3ee7226d1866,\n 0x17f6e0269a9439e0cbafb92fb6a33448460becc662da31786bf22935ca8734ed,\n 0x18bd21d391158c54dd641afa11a9020a2bc49948f16864fbaf161d746d49b3a8,\n ])\n == [\n 0x17853a421466990a70c8df0ca883fc9580968a8ff381c573ccdb2a17b4717f1a,\n 0x16c5b3481f48b51a628fc4595f30198f9c7eef5315e126d668a555076d6b77b3,\n 0x06c6ff5c992138c00e99c9daa6a4eeb86cce3b1b8cc9fa8b30c3a9350dedd1cb,\n 0x0fb18430a0e66a85bdf65c38f2d23be9005c48fae709f297268d13bff5076b1c,\n ],\n );\n assert(\n x5_4([\n 0x1854b7992ec5a1349e9ed40970bbae67373bf98cac98055c7baf28d664384085,\n 0x12d3bf93b4c656e57eb1f4e1fe74f4dc5dacd2b95f27a12f0cc51c8aad9b4ceb,\n 0x26c5ff636e75996c5d4953e2f44fc31403710c59e017cc0c68d7f7b547e5e12d,\n 0x1c29859e1768d3def45f2a97f7f96fd13149e50bd809fe6f49ee960e9d625f3e,\n ])\n == [\n 0x17d01a086c63a77d6315cd7a1cdbac3ca89534c1a1da4e778f5ce60bdc77b28f,\n 0x0c64c46dbae63fb3e07037ae5d732c5cdf0da73971b940dbd32b2aa5c0bd7a5f,\n 0x2bcdcd400e2f052facc52233728cea88f9088313746a0f44fc286c5b6fef5f8c,\n 0x0fb03a8ea938397d9aaacde31fd4510d89ad5a11d353603448d19bcd4bdcda8c,\n ],\n );\n assert(\n x5_4([\n 0x24ad6b688e5398429ffb1e3ba8ab3cd798f9909155b45812325cba5a16d2d220,\n 0x300687b9652aa54e7cae4137d9408e3ddf88a869428998d30b86f788ce92e1d1,\n 0x2aaff3037bd20cd938462fbf41dac988afe9104d7794016c017a29aa411912d0,\n 0x195cf02bd9aeebd4482b3f72dc509221de8c2ebf37361f8766f600bc748de617,\n ])\n == [\n 0x143d9fb2ffcec25c75977edf8ffa3d3007cdd38e1bd4d64b0a6603b7e38380a7,\n 0x1d2b015c19154421416a0204b88da26fbb74fa545116bea2c1c252d8cc43f284,\n 0x25bcf030113a4e13e812ebefc4b2af53687c21729bc197462b1f52b9d38820be,\n 0x0758b5e5e91eadf63054e205c4239ad12b950fe183800db6e2673408a4ef2600,\n ],\n );\n assert(\n x5_4([\n 0x16e6e596105e785a3e0bc02bb15398a4b08c55b9cba3536877ff40b7de1f2a38,\n 0x2530d6ae25e495a3ccf8d51121e0d7134825264c630c9aacb0f78c380498e5eb,\n 0x1586aaed4606463b8d7ebd287062d9128df99c8cebb06d8ddaac95e258e5a804,\n 0x02082849eead984e1db4f4bf307e310a1fa562b14e446cc62f8a7232673b868a,\n ])\n == [\n 0x1b9c747e2cec9adeb3d6e37f0f2eb39d3e5055afee568d4feee3396618c86670,\n 0x2752b18bc2f394a02c93e39322a62d37107810fea619c69e5f855390f29af3d5,\n 0x1e6ca93880b078c245c1388d6756d2e222ac749360c0e8890f59cc3469498f89,\n 0x2554845bc6555c2614692cfb69936fc1fdd64df889198dcddaad8fe34fdfd02e,\n ],\n );\n assert(\n x5_4([\n 0x1e0efaac6c6acea57222f9161313ec9579cda0c85e22f180345af12abc70b5a1,\n 0x0d0f3071f2e4fc48d9dd9f37367de2ec12260ab9a8729269fa1510e9d093a5b3,\n 0x26b2e5123ade4de33a0185d7ee08bb10ab217d8cf44227673904ed9ba7d6d0bf,\n 0x192aa37419458e66c367d86966f9c3f12e1a4ea89883bf21f98989ac5404c163,\n ])\n == [\n 0x1882d48c13b9d810e8a260a6097864328e80253b650c95178bc23cf9784a6221,\n 0x14716a2a8cefec1867e13d2972da49ff8eaa54a8a6d570ad3f941e3503c04051,\n 0x1d7d8881a73cc7b1a72651a8ed89ac423a80c81a25b81b9f29da1a46242a2315,\n 0x01727d8c17208e420a5aef8388c19dc1bcf1aa95de99b14fcc954fb830db09e9,\n ],\n );\n assert(\n x5_4([\n 0x1420cb6e80553413972d39a0e2aa1b0fce8e1759e8955b9d0b4183bfe7cd2577,\n 0x0e0bed978ef7b27a34d0fc3f4db4dd6a62eb2a89deacde38ab43d23b5001d9ec,\n 0x1f52d011ec77d06560315f14de37b7e6af34fa77c8689f82b5cec53a6f731a8f,\n 0x2b6f87516d48fd88765f571998ff308eedbfecb4de3eab9f541845fd5a079a10,\n ])\n == [\n 0x1cc0885e44b1e34b49d5a222b7c61d4423b1cb2ef5c7ddfdf79ccfc09d7969fa,\n 0x269f78e3b703e373d6bba5bf975850256e59fe346fee340934a6f8d11aa06d1e,\n 0x20ca89ea0ebbc138a7486139a8661cfd9c60e0f6a4448cee512359f53115d637,\n 0x1608f2be9dd70626d5faf42532b6f3d91bbfe9cf0dc48df9fc70786c22f36e5a,\n ],\n );\n assert(\n x5_4([\n 0x02ed7335766c6990f8c4c07e406dbe441efe9fe3f8a3b3c36efcf8d5b2466a78,\n 0x2e1b45eb605cde0d22d13f244108dc47d45c395a1854afee35822424b6cc022d,\n 0x2f26a4bd4c1472f8fb3d475c64647acb9371432589214dba81a90cef7e84c3f3,\n 0x018dad8abf0ebbc641d59f342ef89b61a0645dbfb601e4220595050d4927efe6,\n ])\n == [\n 0x07ea9ac7ee426db731f066f680e808598fa2a2e2a2a0184343332cac349192cc,\n 0x138eb891fa8db7ced98b0068a5a0d601f0e35c846e92bd89dc99b26fb4c1ca2f,\n 0x08ff879f042fbb823506632bfa99626ec1f8e02849fe0710a915c1f2b1c17e2c,\n 0x234785ac2b70c4e7c0de52b4b9f5b03d04325950cc88e26a2c59f2ee45f1ebdc,\n ],\n );\n assert(\n x5_4([\n 0x2668dc5c24a61ba1ea716788ca323027411c67114fcf8d3037ec85cf04f9ab49,\n 0x2ff5ef931ab5091bbc32352e20b9971475f2096cdec6a2540897bf383b3f491e,\n 0x269edac091156e2f0b78bf1bda18b4bc0fa57c5da2d9223c0af89e7e32360079,\n 0x0a26433da1fc61b268edb2be549944559ae70c4b90cffb6d3b37f16f1ac7626b,\n ])\n == [\n 0x0d1ebc93de138f542afad67b1b7ed5a0a91b6386417a61ef775c4498f324c339,\n 0x02363f63f074a61ea1857ac0e821c228794a18b481adc3bcb52c4a2f1d2b271d,\n 0x2b39691b7342e1b0b5d50511ffb83b7ff01d604b2ad3e9b216d78dd9538bdb3b,\n 0x1b99a6480116544d64604ab259da12cc1a7948106b6107949457356ccdbfa4d4,\n ],\n );\n assert(\n x5_4([\n 0x0b714049d73a453d12fd8d29b6d3827fca2e9bdb2b81700f91a99af577c7fe7b,\n 0x2f0f7fed2d8dfcd4abb28e3622eae01279c61d4256a6be4cb3b1fd51b8d723bb,\n 0x305e7764e1a84dee8dc9a1f80d850ad02302840f301590f274789f97c8c1f2d1,\n 0x207557596ad35e035c50acafdc27a0073889426cfbe4ba1832d6ef7cef5302ec,\n ])\n == [\n 0x021fa88b38fd0749af48dc29fa661c3c4741ea05f359384caa04000481e1d1ef,\n 0x2e62acd7dd3e2bc28218108633a8c30c9cd16957b3122b80e58a04738b9a6974,\n 0x13f8bd5eb5b4d726e77555718c121d9765be75c7eb75f0ece17788d69861141f,\n 0x1843371c51a20880032443ed629204bfc54ae1db656feee8c11c6d4ef2a7cf73,\n ],\n );\n assert(\n x5_4([\n 0x044d9089d0d731e323eb08218c16222676b1b170bd13d06ce96759a21ebe3279,\n 0x120b8825613c5d3d12545a5806743e5234cc1586f1d1bae59bbde22eb973178d,\n 0x2b5a57fce5f044b2e8b26f6f669b88eb1880183e7bfa2903a16ef0236f2f3faa,\n 0x07f4a9b793b47b8781ede417ad119323d1ae6743d5c3dc990183eec04ae03e0d,\n ])\n == [\n 0x2519d1f27af8da43d481547ab075f18bf96be7f94c81439e9a666e9724cc01b2,\n 0x0043d337bfd1462f71190d710e163df4959d74c85977efe90a356a65e4bdff9d,\n 0x2bf3a9750b18f92d984cdfe1f61f23c427e1bd0764095fa2d96c0339cdd4771f,\n 0x00478202dc2b091483edea6c313c77aff25a45419cdab2d88e662fdc007f4c67,\n ],\n );\n}\n\n#[test]\nfn test_x5_8() {\n assert(\n x5_8([0, 1, 2, 3, 4, 5, 6, 7])\n == [\n 0x1d1a50bcde871247856df135d56a4ca61af575f1140ed9b1503c77528cf345df,\n 0x2d3943cf476ed49fd8a636660d8a76c83b55f07d06bc082005ad7eb1a21791c5,\n 0x2fcda2dd846fadfde8104b1d05175dcf3cf8bd698ed8ea3ad2fbcf9c06e00310,\n 0x28811ac7e0829171f9d3d81f1c0ff8f34b360d407a16b331a1cb6b5d992de094,\n 0x2c07c1817cfccb67c1297935514885c07abad5a0e15477f6c076c0b0fb1ad6f3,\n 0x1b6114397199bc44e37437dd3ba1754dff007d3315bfcdcdc14ec27d02452f52,\n 0x1431250baf36fb61a07618caee4dd2f500da339a05c553e8f529a3349e617aa2,\n 0x0b19bfa00c8f1d505074130e7f8b49a8624b1905e280ceca5ba11099b081b265,\n ],\n );\n assert(\n x5_8([\n 0x11e027e38a43d36a72be06d524c0856d027363f604c347937fd91acdd47e04f7,\n 0x28b51285afdea43557ffd2b5ad3ec85c08e1f718e263bf9e8709889d6bb9a745,\n 0x290a6954438d96f11db1a59092c454379c233b5a07bd0b70f29ea12c03a3b729,\n 0x06869a7aa196418515672ba3e3de0124866d8448d387e33d69de16cd0a0cd9d8,\n 0x2aa9acb0cfdabf42c8254db2fe4980c757daaffa7429e87bbbd5756334a01b86,\n 0x10356d863c177d1a97fd1a908b89a6ff0bccda3eae346c96ae8a72f3b44d59ee,\n 0x09b24b777e6352b7908cc4961942624f2725412f84c75ed93238ccd42b2efd49,\n 0x241fd4790bab98a9185d5b11d083ffe5360b3e2094bf1123142bcea4eadf6012,\n ])\n == [\n 0x301e58def5ed2e1a5dcaa44a9cd47919246011f39575de8212cd631da771686a,\n 0x23d5d952e536aea304ebc4c83d206a8f1dff4c1480334ac954bb24e273ba2120,\n 0x12386a450b5c89202ee12619ff486c1c2ba39ae969b24f7b850afe0a7f0db2ea,\n 0x1100f7e0935587cc6e3d2a59b69045e12c1e1ca3c442365c5769ea2df8c370a7,\n 0x20bc910a6ec6aacc4007e5dfc7bd7b51adfa1dae2516aa3060e15e5a42106b5e,\n 0x0550bb9366d5da5470ac98c4e97fb12cb04e70fb1e47d17d365e9444a9860761,\n 0x1049903ff3d9d6a8286508e3e7b8e3f3d254228aa00c322ef9d305d3248b8754,\n 0x076dc291e1cdc9f48efeaf713a161de6d43e407133f38b82d56df9279d723de9,\n ],\n );\n assert(\n x5_8([\n 0x25776de965f9e74ee70f66a4aa501b2e5bdd7f1dc2910bf1a060cc5fd746ed1e,\n 0x2b5b27c3c2f2f6991ce700ba074c7cb8bad876e2a8f09e712310c50f77af22b0,\n 0x2f43305136fcb3ef1d0fa9347702dbcdddd8475ebb01d617a598add5b0d62aca,\n 0x16812fd128edf911aa4f7e27568814a208023bc9ffa8183117efa78ff356734b,\n 0x0811490d27c169cc8a8a774c686cd25dfcebdbfdf9865152728f10b02f416a8a,\n 0x04955c2c8ad3bab330220fb515cd610fd14f3a20d4c8939846580f46cf23b6af,\n 0x048ba851a27072d279d88094f1f3871974d645e1dbd9226fa35f81731ecea4e0,\n 0x065be967a2d16752761af356145ed461a2056ad0a7e9166940623e4d140b76a0,\n ])\n == [\n 0x01fdac4b572d213e5b5438a33af928caa48a2325ac8cc30239ceea2f45819e0e,\n 0x1dd13703749821c20ece4e35213b89da18b635672d791e520196a00c6885f575,\n 0x0df6f1389b8d70c99487871540ca5e0cf4607cf5e4556bd2d039a14916bbdc17,\n 0x10d97ee74863b8809387176212ea8d7458d2fb89e5216e6e7fa80fba63c0af7a,\n 0x1384c276930a90e80c8669d30a72706ff550e66e4b5becefa4a4a9f434419d9a,\n 0x27848d26ca176da553cb66917754c38f234c00b0b0d28c2a48e1d5d15a8d8bd6,\n 0x108255dd7381e3b8af4bd33974092e732e5a1bc6be7e6974a9e7d3c4a77f4005,\n 0x2b95ca49b2b7e7316bd7832d29e3235bc3769ffd04b98671af8d116a2ac565ee,\n ],\n );\n assert(\n x5_8([\n 0x03cab88b5d93ab657ab738c39575c2812e61f87d188d787ec9c920da592c2243,\n 0x1657057a76dc5a0846c28c33fbfcdfed94a3baea5daf495df4aa61ed4bad34d5,\n 0x050fc77fea82eb8ae11537eeeeee6cb66ad4f77810df293cb0ceb614fa86328a,\n 0x0f5574ad89685ce5ae2beab6db16631d32b16789fc9a1d4178bc1b73ad83be17,\n 0x282d72510f9ca1e6fbc868d709137e17e516cc26654ec034fee1cf5bce179bc5,\n 0x1d84329514de9a7030a7ad080cc7683ba63de7b2b14c71611f0cb3565340e223,\n 0x2605438a072c04502ef613759e28d86b51dac43671182ce62250e7a806e4bf9c,\n 0x2aea2975994ffd70c4ff8b6c75840cca6736fde04f03aa784c1cc5b7a27b006f,\n ])\n == [\n 0x295df3c1a93aaf9c6e852d06fc490c2811646eb73143f55eb86e679b1ca7354d,\n 0x1ad9d7447e57f1c6ae9a8b2300349e2c9332e5edb6813e12e428922bb66630c6,\n 0x2697581dcc42d3162ea222c0b5a47b3ea975824909a707d0af1431a2a2932c87,\n 0x22829b572f388ea29335c16f079d9e1ea8081a1709e45b9be089932fa70b5e58,\n 0x0398a6b47097a23a0afba8d9b76e126befdf2fcd7742c3136600b751ed18c106,\n 0x203aaf9774c8d558d14c52085d9a4c2406394d0000e640f3372d0084ecc84aa1,\n 0x14be6fa6b09e9b03b603e75baa6a80764e170941fe782879d02988d0428a115d,\n 0x01579c9185a70c3885e75ad94de88c2b6237d7be5fb8f84ebd7c3f2733a04f3f,\n ],\n );\n assert(\n x5_8([\n 0x01b7c953d757d279f1e4b8b29b70cdb5b181807c1952fe7ad9cc88e441ef4f65,\n 0x09891fea0252d6f9b61c944b994f28f6dccd6f8a3965f8b7b796aec3d81182b2,\n 0x014790065d8a6de104535d6aa5977dca5ef04320eadd4186b590fa810decb825,\n 0x05cf8199af1df3045f8aac45d9c5eb0b301ef9e9d305db6fc6883ca98db1ce02,\n 0x0071c2a63515055a6e739f7f615c549055d12a62336a5458e0dd69857e1ed5f3,\n 0x0b81cf03fa8159f33a588137731941ba56001003494172f97ebc0db4af7f0c97,\n 0x17f989a8604550ff01a9950cfb4499fee9902f763c5c5eac009122da69e8afd8,\n 0x01f0f10c2672f33e6e7510229b2ad4c6507cd678f856b7a7b3497b94da784463,\n ])\n == [\n 0x2a989aca81a76dc71608ecce97a1c8a9cbeb17fbc3384155de797d4ebdba2b6c,\n 0x09e6484583737642bc573e4ae77885d5b28f7b4954fa59980d0057e781e1b69f,\n 0x1d738584ceb67d8b49b3ee78b4b3ef1b808f7cac646e5b84517f66342d26e0bd,\n 0x2b0202533b12d6a69de9d2c54360755853b2fe7dbe111af464a3d25ee7a2bb06,\n 0x1b72cbdc33d5b147be615f4cf8c270cf0d49d81911fa03a8108c961f4a83da7d,\n 0x1d15628748330de1caf59dd3246228da6b54cc42b5f2657c274552acefa0ffc7,\n 0x2fb4d731d2643b8247e322052c3fcdaef68775df06174f649d93fa0ff1930bcc,\n 0x0313b7cfffa0ff58a8a1f54fdf6b95f7f772a5d9d24acee109c08c055cde351e,\n ],\n );\n assert(\n x5_8([\n 0x1a9c3fa290fa302f24a32fc7196e3fbad886e55f0416fc05a0c4ea5f92cac771,\n 0x071a29de76b7de4cf5d077d2ffa826b3bf8fab45f1becafa8eef4173b8c1693b,\n 0x0cd670e01cf5d1f3f45324fcd78776e60a113a7d804cb370cfcb9ab480e47fa6,\n 0x0f4d079133acdc2c86fa92aece9c1a14cb80c64abba63608b233ebd6451d0b08,\n 0x2ea0a7982d4b2cdd448ffdef1635aa69ba5a97520d6825921ea52afbee172a25,\n 0x083171a1ce6c5b90113821f2bf850211372151fef1a5df8efa29845c2c6704b2,\n 0x12e9ede1912ded64927bde975941151f9c2ab111823df2f0ea72fcfe9a6ecb5f,\n 0x2bee3febf6d48fcea7846c6480949bd7c6ed3237b39ba61d48a00f3e6db4afa8,\n ])\n == [\n 0x028d3fae682b98b85071b577781c740da8199fce5a379a9dc68fd9f00c6e5520,\n 0x19ba3cd5167c9fbb57abecbbbb9832323f711d36fd37dea79b7571a53d1b5a00,\n 0x118186bc3696352f5e7215011e870b7f2cf9e09989da49e4de935696723365bc,\n 0x04307689687696afb89acae109697ea3c428f9791c03a42dbdd32670d45fb455,\n 0x03a71c8c430e0d2b7ed54ea400147ca5d7441dd63cc9a0ca945ceb11258e3107,\n 0x20ed2ac661874da03bcbe13a250eb08487152d44bef8eb44d1ca1a76dc5cee83,\n 0x034fc10be3c3194c5de940ad9e58cae869ea950c2911d998569658e8ccc25c5c,\n 0x115758ad61eeaff2405b0422c178a9203cd208a7499700768d06c8bbeaaa6399,\n ],\n );\n assert(\n x5_8([\n 0x05af85a2a83bbf0c8e1745d32f821fd445e7f0e16e3efca09f7b670a7d1b3303,\n 0x2db863f54326e5338ac73f56d5c93d591241489cc2a21faf87385c13dcb73de6,\n 0x04f20a97ec43ba9ab2595f72f6806be8cf6defbf2c5a62338992310c82f3f4b5,\n 0x13f04b49992fe7feceb79da483d1291c04ba82d7ef41321aab047dae78726ee3,\n 0x2e378dff8c0aaa5c7e68f4d288fc3f937eb034c8abccac668bdbb40397bb1189,\n 0x1d3ce99b763439ce5d7e7b461b34d52cf7d2ce66a60017f124d5a89a57ff92d6,\n 0x0467533be3b8b58c27a480b3271328d74e58b1b7fd0135c5871c1cfff3288eb2,\n 0x17efb1242817bc50e52ac1508414af0463ed75b2cd39ceb6b510ec6ce872b631,\n ])\n == [\n 0x248c269a62e166b3b921c7aba80b75f73a8db719b3e5bbeeeb519ba146b5ef48,\n 0x00d743b68fa94736b4ee629fa69f1d05ada368b86e272c6187a09bb9ad45e084,\n 0x17ff35e315ac5d8a79f120d82ffa2daf92aa01316b4c56704243af1d342314cf,\n 0x18ebb33f68d51fc94b4815bdb4213aaaf8127d0fcdde245a1a143bf117b95a6c,\n 0x1dba46042e735f0e5171b9ac3740e4448034a69a5c1fb62de8c7e3a89d022161,\n 0x1372c3c58af5ae0ce04419601e8a03e2f613f1f4baafb9561d483b691bc625e4,\n 0x274fe183a550bf98870960b13668ddffd5ae00b457e145695e6752d372152ac9,\n 0x262db490dd2a0370e2a96bc9c5d9296dff723e984b36415273f66eaa55314cfa,\n ],\n );\n assert(\n x5_8([\n 0x2c8ef342682e4a13c4471f202bd59b9e1a3a89a4f58f456d279c73e92653364f,\n 0x1180875747bff92f8ec8e698a513965c142bb3c2d9d60276a9f3c37f4181fb4a,\n 0x27c395d2f21b9f73aca6fac113a2623cc015c5ebdf87ac3581022a5d55065931,\n 0x01689ef1805380ceac4d0a7e2e80445d0853a5a3813a4922dd9d3dc1c1a1380f,\n 0x2f9bacde66bdd6b539df5ca9a80933db287013d55dab4acdbb5d84b3da018f46,\n 0x26b5f43cf484dca908d3a557b990eeca6a8e6acf9303ac8ffe39366e66bdb863,\n 0x1552a91453438609e676b073b0f5aa68b0713b602adebb39049654ec1c6680b5,\n 0x2d75ac7fcd54f53156a38651170b52281504be4098deebcbf475a2bf4f74e66d,\n ])\n == [\n 0x09b846d7cbedab163a34651b199c13fd5d63fae2ef0db60e0e5febde9067ac26,\n 0x1e0ecfd870f8d60d801b899b0070162d919eaa3c130e86e92a5f95e82748477a,\n 0x05e646017cfce6a345cf4a57f3b1d7807371d99ba68bd97ea7ee438e207602b2,\n 0x233c61724808502fc7756361bbc10a45956ae30ee7121f2896b3dc4e764714ba,\n 0x13467a221ce5d3bf338d36280d0a718bacb895e7630edada9fb700dabb95ca51,\n 0x2d996fb08004f0fac8896517d88634daab4484e2d6506f12aa38bbfbba2492f4,\n 0x202b9e2900240d9b062ca7b1e795b5f8265311de20d2c67ed4dfaedcb03c63a0,\n 0x2ebe566b153b14dfe3602a610a23f53c3db2af715dfa9d51be7df965b83ee0f6,\n ],\n );\n assert(\n x5_8([\n 0x032227d5200a7a32ea6e15021e3e0eec3381e3ed9eba437657422ecd23e7fe53,\n 0x23043016d0bd81048340c78dc7a30339fbf5d6e1a2ff320869af5ad4ecda70cd,\n 0x05f4fb3ae740d37ca96cebd4e5f8b4f115f74793885cbc318f6b15c8666d7cf3,\n 0x1ce79da00c696eb21049015a1c1b00bef6e6d9e097a01d92101518020e7764eb,\n 0x02f2b1d10ceda238ca16f4a1a99449f4858b822ee79e032ca3b73cc17d9e5d61,\n 0x0573ef89a24f29c0e17f1f4429e03a67cadddf208a692610570e9671a9666b51,\n 0x1d8b2b93983ca3167f92af6e873e3eb3fc00912f9d0ff552f2a0eecc4bf5ef34,\n 0x168fbe71a83806e9181500ebbd4655ae1883055b04bb6b7e478fd755b7de5b9d,\n ])\n == [\n 0x21e9bac62e77ff814dbe0e6a24c75135936f4988f23197bffce2466810a2b07d,\n 0x25196718e461793cd23d5f04687ceca0cfc9dd398afe89acfa73449630016f50,\n 0x07079236786886d210f62709c3b5921a7ce5bfbfc4a00bc71918bccfb8b15377,\n 0x133fdd783f3a83c6f4d7555919cb08f669433520affb73d01782039749ed70c9,\n 0x290a5a0bbf07a09a3aba494da79f3c8137d772b0359b664b6eb56b7e84db453e,\n 0x184102d72083529789e0b89be0dfa370fc46b62b934f520654752ac8c1de5c93,\n 0x283faa9f66498adc14cef4a5ddb3affc5bf5b67857e52090b515a7a3c4b156fa,\n 0x166a12fabdd43d13c5627a47641eb870946b46361b4c037eac90da1995c4e64b,\n ],\n );\n assert(\n x5_8([\n 0x2b38c44e6d922f1916c6fe209b60f11d79690da00dfdfc688b083a84e2226575,\n 0x28ffe5213d9d33b4152a2f9df1cbe5be036519f9931371568d3675ddcaf0513e,\n 0x12f3dc47fa9ecd2c8471c8921797ffd99a647b0e0a7f053fac7d20cfd4e7c45e,\n 0x019b85fbfbf4063ff1c2abf19456b9b1a102f35d6fdb93b47b16baad1ba4109a,\n 0x1af5fc2f51aa73bbb6983d3f3208e2443c5b91f5ff862121c05d3f46dab238db,\n 0x2824df6732b46722fddfebbee5ad5dc247cab77531be5e0d46b85ed5d62acae9,\n 0x2160a8293c32813fea9fe6b91cdb3e8bd464b8f0213425874b0b335487675138,\n 0x11766143563259de702db02548131cb0f4898db4823769304c806123d1bdbd43,\n ])\n == [\n 0x302d72785ca7f277a71d3f4ecaa03425402f2469f0b412915d7693454449ab55,\n 0x06dc87f90a66d0fc9beb26840a5ce5e8f6ee9372eb2cc6c1e68d26a48dd2380f,\n 0x0d612fc26aa0f5198ea2b6cb6d7ff1b87e7d0fb85e6251107405c0acf24a8c49,\n 0x02da5053884af86f628c215d924f8c5d506f8a6e704f25884c932b5679cff1b3,\n 0x0ee0fcfb45654a9459ef304b5c7ef5413573743f16c661fe0b488270648514f8,\n 0x03d82d7c49a21bdeaed9d646dc878803076564da8a6716d2ff27d98672a9015e,\n 0x06e695edbf722cf7f00c732537f849c950d805819c2fb697319441ee6c369a2d,\n 0x01be2f8cebfbba528e81e581c55280cc32e33931f6299f68f68a2afc4858e334,\n ],\n );\n assert(\n x5_8([\n 0x16e42b1b9957861119562d0f04fec5050762947b381e0578367260b083327887,\n 0x1ab2141e8e0a746272d9af6699d4e82d5674c69d25d11dd6b5be1725a3beb451,\n 0x1acb3bcff3b760b884bdc302d3003dc62559cb9461f037ae65ed8f625d115f22,\n 0x18297976ae4add63f033d6d282271ca89083d63a8890640b98e3e1324ee7569b,\n 0x077d73a6f7a05d84e5fa59da6c1d3f406852cc9e514cc3547b5d6d467f727a36,\n 0x177aaaf8c8e7ccb27e2ea54943d5b303936e88059ecf15b0a0dd93d07803a928,\n 0x108a170d6203db76a36ac6db771c3519f9754ec6451fae681b774762c2d06c2d,\n 0x143070956a890ae047b64d289805262f80116094005dcf064bf76513c13674d7,\n ])\n == [\n 0x17764106391c20d0e4c05715425aa46b968df076f693b32c6e9691807a7df01b,\n 0x006c8e661c70f83b92538e86bfa9d9824eddab837e2cc73db916126902c8538a,\n 0x2a90c3b5b82ce25c30483012671c78a59b0973cf1b547e6e708608879a0a6332,\n 0x17c46fa699248524eae3cabe54df82bd3058209481ffe64d2979c33ae0495ce4,\n 0x1d3ac6bbea4783bd4768316f1673a1e878e0541f5c6aa313530bb732373aa245,\n 0x1c489d5d8b6a312d7e0b038709cc6a8a38e312f34b30398e5efe01da4f4c571b,\n 0x045239eeb3d5e28490bbb2ecadde5f93c8770a0fcce6d6a15f37902ddd93fa02,\n 0x2868346064d8bcc538161402cbd9c297872f9e42205130ecc9838a8f41599d59,\n ],\n );\n}\n\n#[test]\nfn test_x5_12() {\n assert(\n x5_12([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])\n == [\n 0x3014e0ec17029f7e4f5cfe8c7c54fc3df6a5f7539f6aa304b2f3c747a9105618,\n 0x2f90753e7aaf46c158cd12346da7dd37c3136353ec51525cabbaaf2b2350f9b2,\n 0x2e28bdc8b2c68b09da0cb653ee7e54eca909cf2ae010784554aa3e165b1a105f,\n 0x1d6a97ef87dbd3476a848af45beebe6b5d79cb047b37212e3e5839f1e80b397a,\n 0x24e23df24b19b75f44218a08d107709d35561bc1b982cfc317d54568cd496519,\n 0x185a08e623b85e797844191a1f184f7b8fc486253919eb20f1186a8331757018,\n 0x069ed78df853a105c8949dae5b4e81cbe370e8f6e25735a688aa8ff3df9659eb,\n 0x284395d79b64123211a4a59b81a90f9cfa8d8314dccde4cef22ec1e31431efd3,\n 0x0f24be5a8c95e3504ead0da9e792b77d7056f94461d69b04b33ea5d239f8e444,\n 0x022469ccfef0ce5a237518c38dec31fc2804e633b3b365c23a9f703ca31ef393,\n 0x1fcdcee218d5a0101bd233d572f184964854d445ca08d2bd6df6ceba5651e322,\n 0x0905469a776b7d5a3f18841edb90fa0d8c6de479c2789c042dafefb367ad1a2b,\n ],\n );\n assert(\n x5_12([\n 0x2954cb9ff6347d5c499f1fc52db830ea8fa29f01e77c979c5611ae2aaae0e3de,\n 0x2e12b253c9034b6cc304cb4420dd4bf63c9216a8db85b157b55f45570fafbaa5,\n 0x2de62fca9606e83d76d60bd222c14d4413e9fff2d15f8864a18586b76b32a632,\n 0x053aa142100d013792bbd568174ebef586796425b95544a3f6a206a634be52cb,\n 0x22e8c7cd6ced3be1e324aa7ec1f6c7347c849792e943af4a6d20c962df7a8e00,\n 0x13a81629feaef1e972cb07eb6d159532540d824adc6447dc68ddd3d87f57d767,\n 0x2e28fe5682677d8cf856dac08146a2be10967e4a4e4f4566997862b2e6d05b2a,\n 0x01d5081e49390999b33ea02ab069f0b8855d3fa8bbfd43f9121b4cf28783369b,\n 0x105dba4ad50f65b112ba7114004c8e78acdb8d82e503eff0bbdce42ae5ec7b31,\n 0x141fad864e665d79d8db92eda98782ffb2b2c2f9a3614b3fb777c52415e7d8eb,\n 0x222b0b923438c6a043369e9aa8eca0bbca03c6a27043cd522093da00e0f74967,\n 0x29a6fd647be4d6cd66d9a1113b7360370a4c6709218470c593429b96af7dabba,\n ])\n == [\n 0x0257f0ad69a35000c0f2098903aca10697d8b0909bd7e95f54602daddfec71ff,\n 0x2d9ef8a8b201f129cf9ee4778dc349d8f07fef770b637c599869d38b210079a7,\n 0x28f7af08ebbd432d38e754beed5388259415787336308d3368afb59a7afaf483,\n 0x05ff1f845ae26942c954561231bbcbe486d11910dffb70b79eb4623ba0fc6ef0,\n 0x040e1059dbe09077cbfc249c44a14c15bd76d593223daeb3bb96d2c103e867f9,\n 0x0aa8fe67e12b6fd4bc4f43aabf21d3e2c0527a0d708fc15537e49b8138fb14be,\n 0x1c79772645dad9c4b23063d6af5caa9265477748de8d1cd6f09d8e8e7f0bfa3c,\n 0x1da93a274000eb66d6f0745165382a3ce35f8a6984f4f013913e05294113d80e,\n 0x230a40b2e0b5c7f1421896cbadca811b6ab7bd7d550c009048a9a3f1b5102aa4,\n 0x19ba5c10d702746c2a91c418c7da7529fc7739ecc8b9ebb9930cf3882c734161,\n 0x20fb88db1e84b64a269d166dab1b4fb41eea93fc70e8ac70fba15c41ed94440a,\n 0x026a4a32f3788bf37504e335a6565b53554c80f61dd4affa003d399a704a8916,\n ],\n );\n assert(\n x5_12([\n 0x2668dc335384b37562764a5a19c9e518210e99df10eaadfd8234582773424edc,\n 0x1547f370a3afc9e04397c85b7a3c4fcb4a1a9a82c496f97a24586ddb2899991e,\n 0x301401729a06d886a0e6994e5eeb05df0f132f1e296c7c27ede1ae6e635badb8,\n 0x1f3baa6f3437051086ca888b5bfdf4fd52c0d7dd0530e7ac7da2e28f18a3f8a9,\n 0x274c0f2fe96c00f0b5a429330c5d353f11df9be99d647de5ba2f304c93c16a0e,\n 0x0fb1c188d5e118878c27d579087530bd62fac3244567a97eba7f894fbc769d44,\n 0x25954b4a8b7715fdba97363ab8eae609ffb4f8c4e21a95d0c5e33fbcd44b8e4e,\n 0x27cb4b4b9dd72782a603042e9055c323528979f9e7cc20b9e9732c4a893b0240,\n 0x19945581bc40d43994ec03b221b67bc066c0acad440b8e088e053a0c48bdbb57,\n 0x1871e044e029613b440f0e4c42f7016f2d5996afba39803537cd43d231bed230,\n 0x2cc3e85d2fa143ec0d4360f4b9e818177aed14aa1729abda9fa599895b255b06,\n 0x263692e752e88ca26f0a11f287bc6e34ee9293960a3272317306cedcae431daa,\n ])\n == [\n 0x2761fccbeda551f0c04e8b2ff444c1069d9f6b1ffbd27a6cdfada182ba8dcca0,\n 0x12229ab4e7120c8d3b6ce91a8dd6cbfab56b47c0a83f975c1a6e02f9e3d66ef2,\n 0x2f21544af0290c7c29df3aa46d799a0c0e90d1643598b45d6c5372699fcca267,\n 0x26e3da009605d1bba4a63c81b74274a52c61d0700084c8ea08bfd74fdac2d65d,\n 0x17de00cb801527c11534a372fcfabf0f671172b6e868b8d5be1c513065f3a11c,\n 0x1047b435887e2641c56bb84203a54971509ea420628366fa567588e66fd968c8,\n 0x165d2fb6addc9d82bf44c478ccbf2ab3f60d07eee609a4840367accb3ae309bb,\n 0x23fc43f57315da64e45970d84a4200312b65d7ec8c6778831e5f0bb03748bfb1,\n 0x2fce79cba7d35f3b7ded143dffd7f63ced3310a240fa9f8b87b3ad209cdcd999,\n 0x02f7c02befa262f3ee29bd5b7090500636c85bde0de0279166dd0fd9a4235aba,\n 0x0ca46b5a35de6bba8669fbeac600724eea86fa910dfa5e7aea6644cd874bf6c1,\n 0x01eb392b97282a8841f0aee92cfecab3ce141aaf895e011dec35c41ff483a3c7,\n ],\n );\n assert(\n x5_12([\n 0x12b0aa3d80398d5a38e8bd25d2e0deafd716d06d5b81226951fb503441fd05b0,\n 0x1b9dffbb066e42c5e5fe85e5850f542afb97ff19d0d9e336e13c342b1d856b00,\n 0x2feda7e3978df56ba8ff3b2f922c1dc14b1eeec68c5b4439c48fcb588dab04d4,\n 0x2412a693e4bb430dfe125d42dd27ef6796aa5243325c2da78de0f67387e6666c,\n 0x02173d9ff42d29fb20ac917034ca2b71ebe1c3fe601155505e5506f248a7b4e0,\n 0x0e4e6b1d12b4f45c77e827c9d3456a06f8e072549f5ad6fa306e9a43a803a605,\n 0x2150a663f9e09a48f2ebddae69702f805f876c4857e339312fccb02ee6ad7b21,\n 0x2e35e0cc3cef89f252e864a60c17a99a33992ea8dbb9c99c8d45d8a515499d09,\n 0x0ca9ed526f7bf21c7b1c94cc628da0bb5195a0219663dfb6205d3f6e58a64123,\n 0x283102b3b664803689b7455d3ac787e983718440d1629ab68099f844613bf82b,\n 0x113416a1d8301bacfdc5b45e533a93f7d00ea8882d1dc8a9f0dfd1ac13f8b138,\n 0x107b2566c5b160848eabecfa4b917f7a1ebb03e9593a57b7dd964fdd0263f221,\n ])\n == [\n 0x16a931fb7416d55742ae30f51abaac8b2d50374461b45bd7c0d3944325cd892e,\n 0x10ecf93f67f0a304cd49bc0701a89a649a22d407e7172e0d588e8efe39b9fc70,\n 0x1ef1c158ae71004e37af4e204fe4e8de4e09a6eda70526f8de2497a43a43aadf,\n 0x1d1d8ccf693996a2e6ee6911a46afddcfa21eaf13bdbd595b95da72de5cbb0f3,\n 0x0aa36ee23897734da0727d13d55a08708aa02b34e831d46351f2ddc697f90969,\n 0x0aca8aea0e6f9407a7e505bd4bbd17b236d960bde0de04ec8fc780b85db2c4d4,\n 0x15b91aade12b7ef464f05f0f2d1bb28e5351aae1b69b23459102fa8c749e8b59,\n 0x2d446ff7f6e277dadf83f087de11f06845edc688248fdafbde1d003fb67afb57,\n 0x21e2cdd361f7000d443656eee38424e84e6b8ea759f6166223104f5c1ae4145d,\n 0x0786373dd287cb1d1af2e54a065efd1ab958069279a0a42e2e902fb59c136e41,\n 0x20f80e49d40a3100f0e47d677efce1a5754aabbbe942a268f09435bff7fae158,\n 0x0de42ffbe0e04712b1d7d0f921567de60274c5889cb26ea4a843b3e8ff0ac7f6,\n ],\n );\n assert(\n x5_12([\n 0x06f913e735c17444995621ccb42a892f5793b5bd46bdf03a98b6eee8c982541f,\n 0x0574c7bd5902a962ed3077ff2e512248814d80d4ab986a333e61501ab784d116,\n 0x156f483ead068aeea616b0207af754c9d196ccde6a4cbf3c065a4a0d6cf8336f,\n 0x0c36eb86f67eda21629faa9edfe7161811affbc1c74b60d24aa07069f56661bf,\n 0x20044ad0f60425e723a914e7e1c24c795ec1545a0fc82d9772a33bac351b74ff,\n 0x0544490febb34958b8f5e1dcb49707b33cae9de07a14437fc19d076be4a36586,\n 0x2f763f8c88ead599291f6fb6b2d3638b8ab2c786d0c1d3cd4d228acbc69511f8,\n 0x0b27f81a39605a7a02f36150b6a4925178a1fd47fc978fa04d79998226e8393c,\n 0x2a7ea9a50b2d5ddfaaa08d928af2e106fd9310effa7c26e477f5e09b7766a87a,\n 0x23cefc7bfa7eae7afb78d4477e9c0dd80b9f352c2cf740339c2c90ad8c6562cf,\n 0x0e34dc8ad491c9d2a5dc1735e5ef048adc86e83263fdea28d8d6bf169b6edcad,\n 0x2672af63011515728922cfeaa20a049e4780434e752ee204c83495e5ec6a71b1,\n ])\n == [\n 0x168fa37ee9e60b2a56d222d0f46cbcf2a9df856988d85de1984da99c7938a19e,\n 0x0a73702bbdf479e17920fd6c3ec1dc23388dc682ba923b58ceaebd10e965f984,\n 0x2ac4fbdf9eb9b89fee2459c2f3b0815a202f00810102a71efb0a7af8b2da788c,\n 0x2813a024b1a4d2d0f7a84b7c342832ee114543d0721c0f64ac6dd38d4b11d8ec,\n 0x1dd01cbf89bfb151ff192e3288bbcf8ab945beca481dcff187e4d618912aba49,\n 0x14c705069f9c78085477d0e6271a3028fc91b598e5d18d80e458274744bb382b,\n 0x0f60201b8442b0bb2565efd1811ef6a676f1e2255fa7b58485c8462f6fba6a51,\n 0x2237f69bb366146603f4e99213a34100c68de11bb266753ed12a3db609301f40,\n 0x06abbdc76d0a8a44752c71c18f6a171dd7fe06a28bb2e44986589be9a1b6e154,\n 0x26b80d0401753addf90bcd9b049b1368e9fb319cd9d75c41799d55c57b2cc1f1,\n 0x0fca323792bb9dbb480e3a11815750654c819f9a65881632c6bd28bc565d3565,\n 0x21baa4015d5311a3bc0f3c06b2ef48ffec89381da52d64f7b514bfa4c019edf7,\n ],\n );\n assert(\n x5_12([\n 0x177a260bc01e2206326dad4ae268443ea9f9705eb56166656d4282182e48956a,\n 0x13a9fcfe422c32519591d2a702cea14eea6e86d596cf540f74e6e46288bd53af,\n 0x091fe67afb9b11c527c44796558c13948377689f5a0287ef66bc03c5cf5e7057,\n 0x22fef16b4f5f91be49cb622133c2a2810df4ecb92434c9ccc59fadd66f4f8ac8,\n 0x03aee156ecb1432ef49a275c47f05dbd418c0495377f9711ef9a475cdd6678c8,\n 0x18a8fa0bc6076c19f4de1dad675096485f2dd87f7d609a62dda31a190dd1a73b,\n 0x04e9d288d148ae100fe9c0a0fec1d380bfcfbecaf5793cbdb1f0ae63798390ee,\n 0x268588efef94f39d1bd2ec66efbcbaa874e8bd82c25d9ba3033667005672d70c,\n 0x2cefb1f70bfce0734fcae65b774ab4ae43d3ebcfe6dd8de89ed04d2ced55641a,\n 0x01f5dcd717cdb8520a7c5cfcdba85f39650963569f9f489f777c198795cde267,\n 0x05fe859357c4d9d97482e1e19a8ceea5643fdc8dd765940e671323b46839ec19,\n 0x0285aeb28910cfa907fc8997e86a9e839dc895f0a0e5784eaadfa963fc15e325,\n ])\n == [\n 0x1fd6005c290e81d9c34318a8adbd11dc97926d229d62857ccd76eaf410e71bcb,\n 0x0a81e443d16f10e0ea7383c8dc0ff87de8de5f90f98cc2aafb273d9b3a65dc2f,\n 0x3060c2ef68c8a51854e47610c28209e4dddbcdaa9d8ee59ceab07a40d723c792,\n 0x215cc5f37b3678e6b1d7e150690f7ab0062169a1220bcadf3016d8105f1e2731,\n 0x159ff7fa2d966d31abf6cdf41a6a3b574fcf9e9cfedd74a55ab78acf3e7481ec,\n 0x08ce401382ef70859aa564acd3a653c9b01aaec2c98b8437f9ed265303a660e6,\n 0x1ef105d5bfd674ee5c1e9484c8123d8bbc658c1346547b6ea008cb0ebb29f1cd,\n 0x1cdf6648a93f8f8d391c623a239b7bd0da434252d4b32e3f02ee01a96aebd9ce,\n 0x21988200cbea79d3ee52bcd026fc1bc6b0376b9caac771224d1a767d8d362cdf,\n 0x02b094dc06e309d26b5d6afc8f209fafe77b5cded58c661564404b74111a1f8b,\n 0x21cc36fda0788830adc7a7113a4909f9877c8357f926cea204eac3f544881341,\n 0x05049e36b9f79cdf36b6d1e9a61a68c9c863f8d40055816a1ec97acda3f9f9ff,\n ],\n );\n assert(\n x5_12([\n 0x0a354297f59aa014f9204280e96ca66b80d72a39a338c65aef8673cd113015eb,\n 0x2241a377f9b8ae774bf59d6d48b1035da05bc0095f63cc88045b4a6150327191,\n 0x096d075a1c648963c8422186bc33cc4b4312bdd7af67e10ff5ad88a3c6ca7afe,\n 0x196dd3fde8e4b0a246636a3a729f9a9edf9c5be51d60979a031b74922f29865d,\n 0x10b42b3ab5dece6450a23aa00cf1be5e982fc9fa50695d672a62ad6823cc54cd,\n 0x12e6f93b0c38eef45bead71ed2c20bd370acac6c144ce3b2fb93f32b9d3ac2da,\n 0x2528654f111a309cc8dd885cd49c3c075682d7a683d56d9d5f2d66da33caec30,\n 0x282ae441aaf30c2b08e0e0bbc657bc37eeb00b9f94c326f81ebdd5f1d7193311,\n 0x2d2fd1872fc0aa489d34d8726bab7d4db12c0edf4a0ceaffddd547b4564df0fa,\n 0x27f0c934ddfae26f31f1ac4ddbd61539320ef641e256efe6ac45a81c6a5357f5,\n 0x23ef2eb57a5a9a5e544a41c786229d4ca7d601bb8bd53981bd79bd67cbf4cb45,\n 0x12a74499eb59691ce7cf48f8725d4097082a9281a2c2b5f54e4d9a9341969b95,\n ])\n == [\n 0x194eab2c8b53787a84dd6e88590b591db109c63bdbcb4dc180e31d1031a7342e,\n 0x2118c1a10302af8ce58b29dd5b32ff8f9787f54721619c111095f3327f6a70d2,\n 0x212f12c1b70f000983b1d2272838230c69954f5dd7d197fb0d53cd4cfa80fd0a,\n 0x2409845ae9673176bc51ae77ddfc98053cff90112efa3dc67fa5e07cdacb1fa6,\n 0x22abb8e62ab7f47dfe5ec1d87ca8381a63e7dfbe26d0eacb66040b472941278d,\n 0x0eaa0d6fbcc999cb08aca688d4c4c3a5f6b65f9f6380ff6f744b2d8b288252db,\n 0x255cb80c5ce5182a68536ffd6ad4ebd98058836647d8f276e90e71fd19bebff1,\n 0x123074efc3df4076da754532886d7c37e3c3eeb4ac3879b0e225466ceb735967,\n 0x0f3f4ba00481221e9d34f5878560f932ee12d045325df064c224f2d8db8551c3,\n 0x256915e6e98bb1e24a1a0845fdefc7c6a53c690e94c39ead0c76c19a629e7834,\n 0x1936288460695d01815205027a3892a23649ccb9f12506a47ffc63d8c35ad7d4,\n 0x2fb218ed949c4eaec724e1f2ba132bd4e390c9ff3b4d28f6b328b2387a8b9934,\n ],\n );\n assert(\n x5_12([\n 0x038c3a316e56fbfcbe9cf422c1563a0551b6f6fb6ca764db2cad53ee63c06c86,\n 0x15c3f186965de711887fcd8ef5b395e97f924941134119e21d204a4e1ebc687d,\n 0x26989306c28e62da14bfe4b08459b27483e6522eca75b0938080048d3d34daf4,\n 0x1d0e2c7034504270f703809ebd28af720fe2ee1d08d681e1ab00db3200ed9664,\n 0x201ba1f00c33a6b1a7dd0f774b94c6378bc3e4a69f6c018cbdfacf019e896791,\n 0x09d545e35cffcfe4fae0d83fdfb2d3c2018fcb0338afda6d0a74baa4f1b8098b,\n 0x0f002baca28a8a79c2e1f4f68c2f3eb6d12409ac71ab33ca35ad528f018dd6b8,\n 0x24364b11b5769a8ce7253f6fd6d1b948410173285d276a5441a0239f483a0df0,\n 0x26611dc5eb9bdf8b12ac7493cc531e3a8d758822ea2c4b687611abff37e4a560,\n 0x2b202bee34a7958f47448ba49ce44bb535ea9835e72a6b9726ab59ebbbfd1d49,\n 0x1813fa6108f51d636cbe5a23dae341506442c5ef4f327a9b6ca122e707f7431d,\n 0x05b75d9774d263e55429b82ebe8660d7b28a0e7cbad28a1533834641c1f47969,\n ])\n == [\n 0x0315c8823973adf8f0278ac8112f2b04ecd95b87719463c4393573581fe0d6f8,\n 0x065f4248729ec96b816a59af7d1b7df71df49c58cc2a9afbc0395bb3ddbd6be8,\n 0x1406e102b472cde209f5c37213f62b265dec185dbd631971cb2023d985d5ce04,\n 0x04d8865d19fc211c94a232513129140c0f86306623e36f117635891541bc6263,\n 0x0d9577e818494042f48e998aa57672f620bfeed5e89f6b929728743318c3bff1,\n 0x2d4fdbc297d26614016e31cc6b51be3e048efc42ffb32ec878d7da8366b62e12,\n 0x1e7adfa1a68b390a0d9b681b9b37e0fe773038b84f51dd2239545d070c7f9c13,\n 0x1f7137c1db6ed9c608cba8df75a131bd8173566c80d7c6f0429d40893bbc7cdb,\n 0x22b3c88196bb3cf52d93cf0505f3141b01a9d696f9b75273a9ed29aff7c8c7a7,\n 0x14c1c9487ac3fb49fa10efada3e36dced10487077ff24fbbc1c6859fc4437378,\n 0x09093266b2846e1b72402111b6207c45c22ea66fd5a12c9b451ceef95e4f21d3,\n 0x255d822cc1dd2aed4245128fadb29cccfbfe65c02e6adbddb5af28f1e7317654,\n ],\n );\n assert(\n x5_12([\n 0x2cb1a7dc7f386ebc390c83c64eb12d23d6ce767d27d96935a9247e32812fb7f9,\n 0x0cf7df2f03aa0771560d176d3e1805c34873c5a7fc00c872f5102ef7ab5bd550,\n 0x28b52e69a1ffd2df7f6812a11207f1543c7aa0e40c565f051a721175cfb8dc03,\n 0x18fa26f37810ff1d6dde96dc5fa3d488c213e18739feb0a52d7338dadf00029e,\n 0x08ca33109f8fb4ce0ab6395f90577abfdcb8658abf1dcf300e06f507d7dc1948,\n 0x1401ebcd255db5d34fc562cd00053a1a077c8c1ce780a2a41004a726877d6a9c,\n 0x1b41a43c3a4559c4d13ab91093b9fd53520dd2be02385db4d622e42cffcf15b0,\n 0x1456d6acbd7c08ca242c4dc24152db5f98ccadb20fb4047d5197f900dc78f577,\n 0x2d0e37473c0f1d3bda010e4136dd9d68ed347b23d0425f79921fb57721d2666e,\n 0x0165e900128e5aff68b7db9d0add1c1615e1c1b309514d400798131c748823ab,\n 0x2e9f73bff715be4ef077978ab0c7c3257e74c9e09f416a9d2c02ccc7dc631fbc,\n 0x2546acfa813df1d7bed750425da06ef3971c6fc1378ebd349dea0a15884940ad,\n ])\n == [\n 0x0d94945223c7d15a1c19de3b05cc406cad22b679ddae9e6f14ae083a3b629ea4,\n 0x1dd61aeb528386b7b712092ef4a5e298c3ab6374d7b192cb5fde14fb0cca5dc5,\n 0x2d7a2d302733f8dd024e0b0c0a730256ac851cc585f4424e0946e3b811d6fcf3,\n 0x29330025d49a6632ea66d245af5fed97600710f757389310a30bb772e2f86a99,\n 0x284a71b77bd2a264443e4d94b073f2be991d1f16cafdc4536df1411ccd547f3a,\n 0x11593ad25beacd1fd84db833ed62802b962bd5e0c40d70bae9a89d3c75c73642,\n 0x1f241e83d36b3f8e365b6d5e2804678801eb427cdbc9eaacaee1d4b7e847316d,\n 0x26afe3cd8d36343dbc763ed8e97097c555a6982094a0e43c6ab60e30ba6a2342,\n 0x2f0fb792a6860a99ea231776cf1c356811ddff2f95a8bb3a0b122409434955fb,\n 0x051d2c3dc512f089685de894e4182d701f4753cf815d2b509c0ac4c3adbcb011,\n 0x0e84382257339dad52727c2ae9017a298f47a84df54e20187c95f1a411af76e3,\n 0x0dfb0fa8b51ba9c7a88504eea234dbb963cae0d7528bc01b842b521c39b8120e,\n ],\n );\n assert(\n x5_12([\n 0x27dea82d8f6011df0fb78da7e82e2a13a22f566bb125274842ee68c942ef7553,\n 0x2c7efbf12d19e481fe927c5cedc2ea0ad4e7f3a461501e5b8cd2d559b7d848b4,\n 0x23c963940566be144921a594c3fb1f65068f8ca74fd2102b4475a06328c6e9ec,\n 0x05131895b08c5568114cfa055e5fdd9a43619a11cdea859ef88e40406b10e70e,\n 0x241cb1dea84f0fd68f06eb8e2b37425b017301a93b42fbcf01fef489ddcabd50,\n 0x1c19a4160692eb67a4e98f0c1ec74e34364c8e2004cc06c05fa29a8301db0599,\n 0x1817b5d0a05e86e72f9827f4b7c857a8860ecfef963b18ce965b8e039f075ce9,\n 0x012faeb2c72841492df2192a637f27b0d31a20ca554d451fa2432f953747f6d2,\n 0x253d1d4759f5ddc1c15401bc232e6041e8e7fe7af9d55646a9285ca0c1bf3225,\n 0x226f9d027230383e36b643d17cf11b259e25fbb938d9381b3cdcbdde16006186,\n 0x0b1e4e3b45c23370e9a33a44965b6ed9c70b3193b10f9fa1ddf61747952bef9c,\n 0x1da8de91caece3da1f98e36523b57d29ffea0f5a0364ae04fe6384bea8421789,\n ])\n == [\n 0x11e785574a8422eb0a7b9974a4704d2d07a8105268753a96abb59ba492c68d44,\n 0x2d655fb4b6e277d7651728826bb37d7e636c1dee8d532c3e7dddd83d610a6ec7,\n 0x091b41bdefe0e8cd69d94e37eb036f2bd89c82301fe73ec875879bb16b6c9ed2,\n 0x27be34771f7b56c9eceb72e2cacc6c81f18e2317ab1de0d6b330c78ec4d25c49,\n 0x1810db044a8de7cf325fb71272cc1b159f5c7c2572d5a2e254ae246eca122ca8,\n 0x0b9e2f6caa86d76a496ecdaa802431d8e7ce640fb34671f16b59d43719a181c0,\n 0x2d54f8498ced37fc8a89dde3dd4533b229d5afa9f212108b31e7e229712eade9,\n 0x142c4d823407ce1a45cf7204e0bc3afaeb7dc99ecc19a05e2ce17cfd0549e81b,\n 0x2576c6e7dfc1b1f565c01d9ea548c960c94a2c3cf9fafffdc2574db6973df1dc,\n 0x15c96db01380eade5c28754ea21abb2ea9051ea8bd03a74c41f5562906376ed0,\n 0x0e94430cbc9671b09b1a378684d53c5e38181585dac969ee6afd72ac2fe80d52,\n 0x08ed6b7f639aa70211b8aba5e661ee0309ec827690a9472d84f6e50886af4d41,\n ],\n );\n assert(\n x5_12([\n 0x26e19349657f94d69ef38f895ef34f6cd3dfa6677b8f083b158491bc9d019325,\n 0x10a908d07457a6b73175c274fac62205da9696826a4d2ae29c7d95896c74d4c1,\n 0x1a5b072d9790d06ec111e6220a1505f7a7bf604325634738da0c17abf980b4da,\n 0x23c06f97c13ff15b47a5498b081aad0e853e4c606b920430dc8f74147e1813a6,\n 0x069b8ddaae46ff2333637161daa57868cf58348528844f39b1c9db77556a6f7b,\n 0x0a2f40d0fb59d436d45066a15442aeb5a779ff5c5901761499e37c46e04a0829,\n 0x240811d7aacb9e5bc330b6c2b87048efa021463b33193d6dbeb0070fab3f12b8,\n 0x18025d1b4cd88a705ffe58cf9c537441a46c730e549967f7714c3d879c8f632f,\n 0x00f8aa0d972181b48333521e50f58ae30f76d524da5a76abfb55a34999d30a41,\n 0x1973258be07ec6637cbb9068b4459ac04eed5e6b5a82d24f5b3e04d8b4e4b573,\n 0x239d3d9e7599144aca6dab517d82df07f99a80fd8907ac590626ce6c8752ada7,\n 0x0205b13226797036e6099fe4860572e772c9e6a741b6dacc38f823b6db0139e9,\n ])\n == [\n 0x237d0dbf07704544f78073b01b7551f4c91a9b830d87719efddc466b70482fdc,\n 0x2e8753b472abc3b9950c82084c89fd6315f2e18821695d5d7748ccd55e7e0f8c,\n 0x0dd69fc03905ed5a5b9e8f1698cd25757e8fb62d8029e6e1186cda5ee8cafeaf,\n 0x2035d4d8fa26e694a2ef3d21dc5c5e37f1f287e0e89e43e84730e59cd8e567e6,\n 0x17c1631a572db0572bea9aa8d42e39091e182bc7ba125b1b69c482c7388085a6,\n 0x2fdd08a43d40740c7419c28785951c220cd078e8678332dd875f6b15b816d21f,\n 0x2eaa4630bd3804b09117864bad7d138c43b0f8098b75407c68d37ec98f5d860c,\n 0x1475cad03a214e262f4e0f1b70993c068f0c9e508075ee72dac7a91ef5e85fbf,\n 0x030767e78eee3e7a0a33432482a6429d5cd01f5b3cee823ad789d53492110d5d,\n 0x0bc095c941cd2404b561304bf3cd2310f075f55e711ef0e96ba22b8a7e91fcb2,\n 0x0772fc2464ea3d268900b9fcafdc13dcaecb6c2deae2b84f0d75fa5652e42d91,\n 0x29dcba74ee5bb080a8e156999617ac14112435779afec154a9e08c36d286947c,\n ],\n );\n}\n\n#[test]\nfn test_x5_16() {\n assert(\n x5_16([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])\n == [\n 0x0fc2e6b758f493969e1d860f9a44ee3bdffdf796f382aa4ffb16fa4e9bcc333f,\n 0x0c118155a0dfeca3f91faf14a350511228ac33743be91249c6e0b3a635a50de4,\n 0x1a02b3a6571f22bb6392322d3f9f5de145b4f00bdf483072ce6188c30ba0f83d,\n 0x26631df6b2522ecde57413cd680ed590ded356e1c680f865f45be8eb960d1e06,\n 0x250ac4dfed40dc37bac9abe46f7bff3a80481d52a157ac80a1e5d39a5ed60e18,\n 0x17160980d8e7d9cb31addaf294cf047768bffd9fe433e8903b4ed262ee913f5b,\n 0x1d708a9f0995c2e0cd2f55e5dc795126f7191a0eb934ac8172bf54e520361ff6,\n 0x20721a18915e96e37e12c9697427f34d6a366787ea94ea65565c36813a0d77a3,\n 0x08671a9e58105eed9ac673249dcf22f08f098e3c6eb28f9eaa55d67d755972d0,\n 0x01e879484303c6d057128fbcc3a4222c779a62d3666df65d4e0b64c8031d7cc4,\n 0x239e2ce87955ebe19aaad000b38725b729f51175ab7d688f15d997edf0e3b7fc,\n 0x06be612f42b3ebdbade3fe199338c9118eb6b5fb760bda96e45443f130a8b2de,\n 0x11b2c04b4eb9e4844e5ddbb19b56059a815ed5d69405ba51786961235d5f073c,\n 0x006da33e2d57616c0ffc855b48d225a1237c3d80fc7e6b6e73b74e162b85c8a8,\n 0x0ef50c2615882523c6c73a69b4371332a066b2dc4b9630f186db47e3bfca88c8,\n 0x0e2ceb1f8fde5f80be1f41bd239fabdc2f6133a6a98920a55c42891c3a925152,\n ],\n );\n assert(\n x5_16([\n 0x2ef5bd70482d1d5bce16a04a5220175878dc715c51070672fd79df2f36fb719d,\n 0x015425a96665c5004e9210cf6828d8019c057cd587408a27347d951d9dffc2d9,\n 0x1551585c9c4cd84962ce750509aa7c10f6070167cf02f413b1ebb99b46070f9d,\n 0x13b3e781956e21bfa1ab9b729c8870cd6834165331261b613ed155bec20c705c,\n 0x1efcc38f5d29388649ac90a53f2f18199b3b85b18a817e0ecc35fc8bc0c8f935,\n 0x301c505d503072bf6273b63ddb8ab6decf288fe0ca24e01e9d29d1c2b445840f,\n 0x1d0f515363f3f1d7a730fa40ee5adfc9dbc64ee624f748578583724b9c950d4d,\n 0x08d0a79b8f7f9900e653719a0fa83eddea4cb60912ab072a7c53c5e06be06f57,\n 0x257634dc118a69195eba44a7d683b806b13b6954284c00df03fa6fec498d7136,\n 0x1c3a1e671b80722c3093704597f0682648d4ed2edf527c394437f83455c6dc9f,\n 0x2b9b5fa799f3e7e3b25f5789aea0ad85cf688df558df55cd5aa01e08ad61a0f3,\n 0x2976d9a19d3daaa5d4754b07212dd1790e1a2e792bb1f3f3c1fdf29cb9876a0c,\n 0x024e57dba7a40fcd9c055126821db288671ca25c7a2d331f0a44aafd281c420c,\n 0x2ace2b5e9b3840a1bf285ba01256a92c847585a0387d82959331e1ff831fe7eb,\n 0x095eee248104564b4123f8b16cd2e659a84ee02453ee37267a42d29fb4698efe,\n 0x023a74b7eec73c64bf4c824bf7b15004252f23594d733e8b5e3df99057a1a402,\n ])\n == [\n 0x199f8c0ddd4fc19fbabcce889b860aea0840b953d7cb9897a24c03aa91321f30,\n 0x0488d23f20fce69d1c4f405f407987c50e605487002856e3d100a531fbef76b9,\n 0x263a13c6a63a36b7f83690126f3da9083932a4c310fc8273faf7fc7d4106a61b,\n 0x0c819a478981b1e3056aa6eacb7ca03c75df4ef8106dea2e920c6a30ee6eb295,\n 0x186a0cfec51820f97f3c64ca9a3f9fe84d728c3fc65298308db8c252e7763d2a,\n 0x1de58fac635c3539da015d1ae4f775af54ca361c1bb33949146ebc92ec08ed05,\n 0x22cdb2286d74a378ab0e73265d8ea805e70487bab78b09624fae0111e72e7c17,\n 0x2a530cf261e7fa2c5610fd39d40e5363d238b66127bc4da42d3c3e41252f2746,\n 0x1435915959547c0b78257f1ceaddf744d24f20054b06901686a409f3fb7fdd02,\n 0x07d3142e793fc9b5d09fb56da48bdbaf9f3b0c0a60e65c22faea8abcd81fc68a,\n 0x0b68ef91843d5f6a4d2c9274f6ddaa7bd6d78677502d1f2f6b220016fa569b92,\n 0x08473d26da0495891ba80a6b8a306c62d0084260690ccd9f5528a11bf25d18aa,\n 0x2a6c3ab5f6ec231bfab2908184025cf5107cd9231d9e24bfe4676f93e4232528,\n 0x1e7b9102952e2c43c201ca85d589c2ee2f15a0fc44d3c1b14674044b4380f9bc,\n 0x3013bd07b9ff2be6b049d89513b0a65965980986383a64cd5dee34a1f5952917,\n 0x02bfe073ffc8a0c7cc5c2887333dfa9252df70099500399034bf491bb4cee13a,\n ],\n );\n assert(\n x5_16([\n 0x06b55384dd1f8432d7a1c51b5a6233347e1a01d6ccf71e4df8a97e6acfea494b,\n 0x1fb69c58f691a3f1a356ff552ff6472e1159c39eca1298ff6692ebf1221f21c0,\n 0x1b57c97bd134be1d2ad6ee333fe8f0edb31fd49777b62b78f8ae06c9fda9e4c0,\n 0x21147db82f08d38c7f0041c175f162a5c446de7358cfb084b0290da8eed8a6c7,\n 0x05d9295c10f3f4d7dc74e642e028503ee78745e579cbfa3f1aa69d51921e7f2a,\n 0x08b7ed23161d249564b4fea706cfd77493bd09177077ff0e0c37c708c9137593,\n 0x0f6088e95561f9048541eac5e33fe33cb0a63531feea3fc00158956f4b3cc005,\n 0x231f9caba6d6a31d08fcec1da6c51624fe4563dffdc58f8874cb7e466c98dc50,\n 0x2da993dfb755a6c0c91a1253ee0edc67da208952f85ee94bd4748bfe07b7dcf4,\n 0x2b570a865c287eb3a020b7c5e8d6f9111d77624b77800061df004bc4840e69e9,\n 0x1073ae829bcf6044b33dc5879e01e2e85dc2f555704210a9dda4b1e1540ea2d3,\n 0x2ddd9346aadd09f246abac523816c59f66742633fff2f678556e08620e06b885,\n 0x05c56534c601f945933edbad83040a988aeb0c807891be8270571d942af99cf3,\n 0x26b1a1a534e46eb0e05289e4212b98b3c3c9f03ef2e6d26c85eeca1727ab8628,\n 0x0be9f33db4474cc99f5e835083737dde85a90a009b4d0d06afe4e0fc9230a2c1,\n 0x2bb8306d7c7ec521001e46c904e4761fe8336f9f1fe6ace0e1b5b8b1f473af55,\n ])\n == [\n 0x16870ef1a96a29aa6f91b1bc5f129795424bb1651dbfa593b6d67c45a015a325,\n 0x0b61b9d5c43ce81a4101b1a0cf6fe7e8f04af3f8c0af1c00661b89f70addd21a,\n 0x26ed8fb676ab100a0bdbb5835e2ae78378dc93af64926e79ce6b4f67f40a9f2e,\n 0x00afc78c94142cb0b383199db78411ca62cdfdc7642c262b50d82c9e4fd9bb2b,\n 0x100bff127ee5f3050e32522e45372280894ff84b2d73ef46f6b0a0fdccaf7ff9,\n 0x12414b2266a60acf06663ac7396712445676cd748589f272ce0fa143a503af20,\n 0x0bff1c82da41aeb1e380e8fda26480b010e054739d086bdb1236fd173166c032,\n 0x1e969d843bc4ab33ab1ee96d266d57be7c3a401660a5005f2e60378f20913a2f,\n 0x05848e0592a24fd0084d974d1ff4993a11a6b421ae3483bc3c875ab8902c52da,\n 0x17c202dbd22d4ac3d67ee56f02c9a7f707962224d1627bb40a6d780a6c166b09,\n 0x24e7c391772e5cc73fdc171313791b86d0463bc51e7208d4cfdaad7209bf8281,\n 0x0e206595d4d2e3ddb5eb38d58b0bdfa5099b4968a5239912f2840355c67c02ec,\n 0x26323fca2471db34936ee8ec5e48e20de20897de79170ef2411df3e438be8739,\n 0x0a4e622b558ef6d52c7cd3eaa99dfbef28625d7c6c97cabd4f4133c1595eb51d,\n 0x0c64abe0b9786cd362618b6f82c51759cb62844cf2dbb5d42c46f219dfe0f2ac,\n 0x13be1ac72d72e5228b27c42bf32e0672c9cae552f97b89facb63b940e3f8eacc,\n ],\n );\n assert(\n x5_16([\n 0x1cbaec6b27c2ebc5fdb69e1333798b981dcba6b38391557b7ac7b9b58d0f66c2,\n 0x189851071e8428ff3c8a96ac2ddb17ed0880c59988c3fee8dbfb62e195867fbd,\n 0x154f46875dfe815d037f8c06b2067e2b5cce8b77a9464a65ef2f6e665652b293,\n 0x210f88d63fa89778096ad54e6c0936d8f4d2453536f8f86b83ef5136ff2bc98b,\n 0x041e749316da9c8b5dd8897666b38053a14242ddc349d6f327eaa1e42ca5b570,\n 0x3021a34419c0bf5d11966d97e65789e3c614f59cb295c26b03139e59a053ad2d,\n 0x153dc912ce0688cca194db013cb5af4bf76dd0bcccb59803d6f47a626e838629,\n 0x145ef2786cf7f7dc887e77cfc268fe97d0ce8d3dbd62bf349dd28e8f2a77b008,\n 0x2d284de1cf215ed8a1cf131eacd8f192ba61c98383d2856696da2e670a5b23c1,\n 0x258f58bac3d054ad5f27eae324fa6fe5bba15ca5b84c93887aae8bbfb81488c1,\n 0x1312478dee9197edff1690bf7b350856b0f6960f0f4bd97b1aeb1866f0e6697b,\n 0x0633a7322a72259ae4201daf36ff2dfe2465227bf3a0d521b7b6aab723db6c1a,\n 0x1d712e293228228b7f0b05446a2f4b27c8746711f59ed13bad7218be7aad98fb,\n 0x11745f000bdcf819b4ddbd377ce1d9eb7c326025159c771b055a7ac41e46eb72,\n 0x1fed00452611c593649df2ae4c8f83545a897e67ed2d9acb028f94d114810505,\n 0x2525294c748d48ab2b1f30a660c134608427b3be80a4d72ab723b17d25ed5d52,\n ])\n == [\n 0x2b20cdac71d0877cd2ca763fd3b97286a7c6958b9032ff694f7f9a0fab0e6195,\n 0x23aceba4409f64808b72fc225720057fb9bf610fec117d3f981c8743884fcbee,\n 0x08662d7bfef474d3ead01bf3c94fe4ef10e70baf5f6d1cf3e07ce4b6853f66ac,\n 0x0bdb073e51bde89f93a65cbfd98e80ea7f091299ea93eb6cdfadfcec86757077,\n 0x2c78c4dd3279322e16ade03e9c9391b46933d39d5d38d12e6f390b50591ca9f8,\n 0x2d4d8765fb401a33b156176d07abbee282c9e7f5a87a1b6e288d5dca2111d909,\n 0x16a8cf0704071589af3113d86f0b3d0911a56504392015f5adca2c02cc73ccc5,\n 0x055f44503d034bfe2a2699bedbd15681610407737fd8dfffc1513fe10f39b289,\n 0x087742e5845e1b2c965e7f2bc5b408cee716df9c019fb7a770138d5d847e02fa,\n 0x178cbed7704d0d1da3751950067f811e807ffd9c932a7e8ca5d640a41f596f04,\n 0x1bd115492e405f8d46cfd0f60404ad75497aed79a906ec85a29e396f69936ef0,\n 0x27a5f932a5d1078475096c225559697ff8ef6b1a99dec900d802042b71b41987,\n 0x25f29fa8ce03cd5248cfcf4485993eb06d6c0f3223a9ee97af994688bc6d8208,\n 0x0120aea7c2e569bd1cd3ff49623c9d71e0b98e569659802a6ff1d93dae4e4ad0,\n 0x1b8c8cfe6aa076226c4e38ea6ce8407e1e1180720c6c033e041822a809172253,\n 0x20676fd2b77c0704dbf127d2d57e4f3bc12f91a8097c3e99b7a38e9b2e600239,\n ],\n );\n assert(\n x5_16([\n 0x0aa86dccef554a9a7f6c92f6c0165a13f7a8be302163322a6d5f711eb9e3845d,\n 0x0a190cad0005aa2ce4a7cf7fa9a62653d3f3a43827fff30110fd020402c53905,\n 0x164cbb52ddfd371ffa882dcb7439e0ecb65f82252436ae949192267587120c4d,\n 0x299cad782ce98cb776b5e6eb0f4b14c6cf9ac946c456e42c8285b697e3c6050b,\n 0x088dc71bce272415ab0d566f058612e22395a813a883f38db1822cb18b267009,\n 0x2e1a2c50ad4ab0658989e698e8f5e44e6d6430dcc58b72d2411c670eb2503eeb,\n 0x20b75de40aa801f2d32c39f6e7047f160488af0a746b7b17093f413ef51d2890,\n 0x0ae46fe3de0323cad20b5406bfee689dfbc9d50ed8001d76da9d1690dc396b92,\n 0x2089eb57a6f3fddfddcc41c1eb802f9a01e05f507031cf884329d6db8c7e2bbb,\n 0x1328bee68b74f2941de5e0566a6d512f1911a499af6898269d711c5cc5a571cb,\n 0x25494cc367bf5e4e32161791117ddf46b07f1953a884f32f5cc538bd9593cbae,\n 0x0b9296169e0ab77ce037b47c252113c58a5df01a3cf1578b13e8c5b321311bb4,\n 0x183100059e377c7b243ccedf3fc23fb155ed5033a418ef1918171442bb980623,\n 0x11d7d6603136f4524c6f56871d3d6b55b34535181e10784cab6523a9e22b7972,\n 0x262b84aa27a96cd7969bc7a159bcf16ebc47bc5796ece3990722e8a3748488d5,\n 0x1ce939c908883e403f196b23e35aae5318fe443f56732c7ae3e2e6e8cfa8fb9d,\n ])\n == [\n 0x087f30225a428d5c33a5f30a20e144a4bad98168691c477a5d937513c145ac42,\n 0x2e02134b3b4c94e8225b7bda60deae0c941f0d8f1046808bd0bbe6399eb1ca15,\n 0x152f5d1a0c0d5d54478de754fb8749b7085809fd00c084e367798ca4266e3a36,\n 0x2765d29175aef99be7800a2bc4be36b70a967d2d71b717e826d42d996fa36b27,\n 0x0ae1f733d0dde6cfe966688adbbf57d158243f8241cdd4f2ba3a4ed3a33f97b5,\n 0x0ce104a162f4a18b7987c192108df72d8d01fe734d8ff37eba67abc3011b431c,\n 0x2f90f4b7bbf3803960e5d0135933a5b16b95883b0ab32b658e5bd144f7a6e4f2,\n 0x218bdb3f6179a9c2749e5506e3ea3abc9134e1adc1ea964d38060f10d7b842fc,\n 0x016366359c1a2491cd62fb3fc0dff757e731b36149aa71d17ca09e566726cfe3,\n 0x1c3dc890ded994bdac60f387495ced2a17d3cf36debd0b6552726fa18559ac04,\n 0x1280cd57db233133595afa3d60353b3e2bd5bc204bc004598a4c6c4177fdc230,\n 0x051fe637e05e3df14a490a6361c49813eeb572f1ec0e9cdf2bd1b083a3bb4690,\n 0x120f57aaa9a2d63ea48f48d66f3ca7b49bfb2c643a82345086484f07c3d10a9a,\n 0x0569b317c695653ea95ad1238b4c27849cd83fc9915e0942bb5dc04a09b83b22,\n 0x1d8ec58c597322831f4d7ba4cdb1854b16e4a1d50b3dd5d50f5a831068317159,\n 0x11f9675abab82860419f58f50d66788b10c925bace3c0744d4b35d2d705590d1,\n ],\n );\n assert(\n x5_16([\n 0x1f215d88b7e0d178c8fb74da91021f394ca93b27c8492a2864916ded48b7d7f4,\n 0x031a1f5e05f55ef8abeef5ad6441e6dd3216715223dbcd72b81c4f8bad05c7b4,\n 0x1e7f0b196954bf7434714f11608fb1bb75442a19baba47a538815c8094a4a13f,\n 0x2be3508f3255fdc6e87ed923c0efd1a636015e0300c7b60961413fb1c7fe638a,\n 0x1b57649397840798aa1b82ae73879f3854e93ca5762952136f07af4117b664df,\n 0x1ef0f16ba5fdb90a989f414e49644e591f6ecedc58e932b2382ff136e86ee1f7,\n 0x147db07a080e692a95b481b01fec39845c2663e2cb169a7d31b1968a8a8f91fe,\n 0x1c1b51578fad85b1e0ffc548ecee7354deed9bc75fb45587a6c9cacac3df063d,\n 0x08d54dd1583ec89851a7b6c34f0b684a8a2f2ce0548dbcf3d3f0f0817ef46cd9,\n 0x0674f9986e4f58e1e6b2f66e44138bc1ab5e62d1088eabd0768d1ef294f14e26,\n 0x0b30b59f455281a391c44098a8a25e00ab0f0bee6bb6b6f0b708868000b9d32b,\n 0x025646f735b1b00118aee20d7c8915fad5ac40183cedecd7663ba4d9e065ce4a,\n 0x193a13cb2f3bee2ff69cd7d2abfeee46b0e36df272a405cd13ee20edd821d6d6,\n 0x299c2b6a27955503fffa9ed3dd8d442a075ba565b1c9a063314d8e9f2ed4a776,\n 0x21847ebcbaaa7ef15a86d70147cb83568bf13deaa9616bdd193d9cad4f700e03,\n 0x212bd19baa0935e3533da9d039c0573c6cc511d86ae155e3ff3824b09a24bdfb,\n ])\n == [\n 0x2d77aba67df78b757cf497916e42ea927f54c5e31328e6cf1bebab015c52091d,\n 0x1fe50bd2ce720f50a5abc9cacc5e642bf9f0cf48674ce0555ee74259553a4502,\n 0x016149390f59f06de6f97e8a0ba28b041819189b5f92909214867b8e92df0628,\n 0x1b207e3f2968d97fe5602898d8c5ea1e3b950eb44d377042ee50f0fd64891c66,\n 0x198ad95eb80134726e88e82db424001636458d2d5a6f5da69c940af1d61c9d45,\n 0x08c5ff8ac18ad588ef8ebb581cdf38356b94b8cf1ab542ab63f198c13ad3cfbb,\n 0x010b0064966e3457d4a908e9598c6221f73ddf3989df7341f043e7d2df870c93,\n 0x0d2bd5aaed8f574f0ebd0475f7ec3babce372fa1786c0aa36c1ac4cae21dae6a,\n 0x04b2f761bc78dfcf0775a25fb55937efe2f7ffdd6302bbe6d6926caeed70a10a,\n 0x0fea7bbcfbdca10018a0bc6dbf81bae027f12ce721d68b8a6fbd345f564e8c63,\n 0x0ae4518b024d662df03438a13507afdcded21346938c502e5f6fb6cc3eb660ac,\n 0x27007a4792c9d5fb181500ad4c516dda340d96762e0b6326a5d1ff5a4b3b5bca,\n 0x0956ad62323a65c3ba1d1c4ffa34e0401c9d29993a59ad0f4c063b0f8129c3b9,\n 0x2d854411c11ffcf486ce7d6f458782afc80cf2eac1104b605aefa8f7b1eb4392,\n 0x1f4a4de11c6554fb2575b17f7ccb63bdc465ae8db1dadaf6da09f9881a904e9d,\n 0x0c4ce5037da00596b60762c0299771d6c1f3c3ae77d47caa177050c5e655b323,\n ],\n );\n assert(\n x5_16([\n 0x2d68b06ac8a6c173e6c3973ba865a74dffe3294bff9d0a000f0e48c743f7e5b6,\n 0x11a9b30e033e2e4f6d9953273ea2b0c334dc0d3f0548ee1480ddb8089cecab4d,\n 0x2c8863dd10933bfe3670a9f4626056b32d12c85064b06f69ac6f20b8fd2c3160,\n 0x044d774b22af32615ea0d456d6da216c1ed077b96e363bad69fbe72d45220069,\n 0x218a83e6f91618448f25852a405e540302d5b28719a11491b1ce1bd26997614b,\n 0x286ee17de5be4fe8bd04522619f5624d8e115daeea42237d2beb5e98de6a015b,\n 0x211481e4b0452fc24fdefbb1c1a5f1135816e16b02291c1d88ed3a94b830c9b5,\n 0x1f0d0f9d07e1dfe6471a3772a74b4cc3da80d771fa1a34558c52769ded61f838,\n 0x15b13d0d6834a8794655db51720dcc9c7b454fb2ff919e52767fed602eaf00ba,\n 0x2802cf4fa69f1bca58dc8197bc3aa601022546375f1503964f33727eb610d03b,\n 0x18c298e8be0426a033d82eb001fe15d623867737ddd036ba66508982d02cc8e0,\n 0x153f39a3285da9162d7bd51d5ce90bf0b6c0c1b56943ef4ea1dbb3e0edba079f,\n 0x09e4d973fe24511b29d3ff119362d6fe3f8c545ba0203b2fc2f5b2332b6af67b,\n 0x183c4791f6af7b260faef4dee944dbd032b7a6b36ce6db1dafe39a68581b05da,\n 0x0fecff05819aef06b229c4c9c45303caab0b6a10ef21b2c78ff4335777a950b4,\n 0x2fd2a822e9dad5b1bbf05c48a646fb3baf8fa569ea56b5095f9932c478b402e9,\n ])\n == [\n 0x00e7985063474e552a70ee705434a9cb8ad5fd3332081ca7ea29cc2e04736443,\n 0x0bb32611f7a673adaf873ecf44903c4683fdf054c7991868b60986a3fc2434e1,\n 0x2a34a647e4399d41bd6d56b18455e55472e9a3d0b8891ebebb4cb195f1805818,\n 0x1df3d37d4594605755b6db26c7c491f90b166c97e0e2e272947964a406123931,\n 0x296720f19be76efa3be6247b0cb47b5da39a5720f2da232d48be8898c24c644b,\n 0x2f3d7fe8e710de783b56b53b924e1721d80f2f278fbd4a8237dcef5106054295,\n 0x1163dfa4447a370bf32a35ba50ebe6b891c79ec77eace1c189e7122391dd7692,\n 0x2dee066e4cb642e4c36622c7709d56be8e0d4e085edb8504a03b886e5243d9a2,\n 0x20968bd0e88eddb3223fbaa9a4ade0da528774a350851631400da87726794b29,\n 0x22363da61fcced4f9abdbaa90adaee6fba2971e3a2a0e79a2e6f1677b402bab9,\n 0x2b0b7eb2a75f97a809fa1300193648a3d018fdbf879ad078789190ba39d5eef4,\n 0x0a635c902e1d0e7f0b9200babbc49fe779db22445399e372faab05b95a5b0462,\n 0x2af2db88a9a4093bd91bbef603d279ce7ba9fe39da2fb8e43d8640c123c5e91c,\n 0x0389be83959d40d19b73060cf322298ab5031761f18ae2e8ef537b6ea44ab19b,\n 0x2a77063695be741137fa3933536515607abde3f7704a644f763eb7e609e1a78c,\n 0x191a8fa7d5bbdd528c0ea7878e0c731ece9cc1e6e5cc0a6abaab4ae0caf0f769,\n ],\n );\n assert(\n x5_16([\n 0x26fcf669c5d648ed59490ddca7bbe354b02b4b3ce3413abf45bcc763632216ad,\n 0x217c47cd62feb6c1858beb1af22a9520f7e7dbcef978235471c0255f789fdc63,\n 0x0c9847f7f873b8730c65861cc42a77de4d2a863b853b146c7ee7e3241d9e9f09,\n 0x2bd4ceea8f15ca63bb3e9a0513fff8e0386ab82a2ff7e58cb42e528f5873ae4a,\n 0x2064aaaf465b56437ae42ef30be0970d48508b9ba52aa11da7bc197ea7762df4,\n 0x03faf493e27a84593a1659730c1c124c9b0dc0c9c4a18db3c72ea927ad14b11d,\n 0x13aac7c7b4ea5d86003dcc4b744a058eeb0ab360447e7ff9c8418f6f6e508cc7,\n 0x1775eec665148054cdaa7657b3389473dae36b6c01ab64f18656ae00de9489b0,\n 0x1901be4b7481ff0c8964fa2c77794b164a2e43aed5e36c2c6ccd8f8191c94873,\n 0x2784dc417a5202f66f681f7d4c356dfb01c9522f8ce5eb63c9fec159f3402c86,\n 0x0f6efebb5fd0520b3daa0097aac54c42314945ec6fc96cf5f2f5aeaa191f652d,\n 0x1dba0aebaef806f37235faa2cf8fbdae9da9763cb3d9a6838fcff82ca527d437,\n 0x163d27405b027e50d35bf55eb6431cb75350ffc44eed52185b403b39d5b30b18,\n 0x030735bcca423d70e78a04a53d3a4e728ad28efdc5ceb2f0628937cdadb0ab5e,\n 0x00543427a4899ec4c8756511dc295bc07839445eff4a448ceb3f0480a9f9585e,\n 0x1235ce720c56b2590126a1057c953bee0810f2c9acb12c4b01bb5d9c2bd9bbd5,\n ])\n == [\n 0x2824245824515d822c894f4c63e85aa06e957089b7204e11f1b45b4d0c2a6b93,\n 0x0c4a5cc6128bf7d5b1af586ef4c8e8ec1d3258030df4bf9d8c8f169940a8ab46,\n 0x2cdbbc6158e398a4cdbef4b3bc9c6a8ffad29713423d7130d866fd33e046d76c,\n 0x2feae397ccab260ab856007290e7f08c7f04cd1ceeac8b8c31cca55340550b6e,\n 0x14018fd8912b3e30321df757fb6af8e8aea684f2a41663f1aee7e3cad04fb27d,\n 0x15e89fd27ca5fdbd3cf6b39f4a5515f986554ccbf7bc52803a5c989efe392c55,\n 0x1b8cc493266cf81639c10391213e5f822c348991965bbe07b5c9c3e5f78f677c,\n 0x07453d273cfa90c10d4c8e22c77e5bca6c56c0cae0ae1a324dda13615929e2f4,\n 0x01ed8c8bf6308a7a4edbff5280b09d72a74579c3e1d300cfa1432192c240564b,\n 0x1ac754480d4b218c33d23a9264406d16faf30279c3db2fa2b1e1e9e024ae74e8,\n 0x236c9c959c107f7908a670c8a4df73a6487920f5ad811bf06a1dd2c798d7c88a,\n 0x29bf91f77f69fa46f5d605c5bdb40567070a7b45ef6c30ea9c47249829e75915,\n 0x233cb5f0b7bd3b55b11270311018acdde7b7c61a3bbb2ddecc3c61f10d7080f3,\n 0x22082ab254896b3c8d771dc14c9e834878797a505a5ea83e2b624811ec0ba67e,\n 0x09c5e4ca4cb94aa5cd0006b14b62ee34aa916e69c9f52bad52e6b4c4a3b102f7,\n 0x0b6bafed1b7f470294a95eed0c44cc35c87480f167115cad591995e62c069357,\n ],\n );\n assert(\n x5_16([\n 0x1f30f9fbd02de3245ffa2a842a35c503836cdf7bd91b7bc81eef191c0ed00d91,\n 0x23ef9c7a64ae98919c4aebd890beef09ff5d1b450e3ed7a690a3e6067755101c,\n 0x0a941ca919639269ce0f274572c3bd82ab586684c14f46d648d7ebeb98795354,\n 0x115ac08664baf4020b32a68d9bf3e040e87c1672954d2601bc477121936ceb0c,\n 0x20b24021688034db1d514a2dc2eb17f02eea63e5805efd68ecebd59783d5c13b,\n 0x1802b6eed394a6f2c054a1b1cbf33c842f97ab9a6ec03fd0aeb1b7cced9077db,\n 0x14ef482e31c50bffcc62b1e4d9013f30df6bc380a2b0896fe4e483b4c18c3990,\n 0x130fa7ff2494fdf702c1fc076fb0315917add56464217960bdcdf17162d8e9fe,\n 0x2ecdfab787c80b25dd05f2ba55f49fc6c7817eeda780e464239c99cfb03e445c,\n 0x100c0d9bf6a2384940dcd88e1553609a9480c032b3be8820a3e534544de505fc,\n 0x1ef6e0c3b8d177b3a13f7af721af9d13d4043ea3ff248d4bc155639fce11867c,\n 0x2c9302b8df110fec10b69a6436f2e7cce058e8fb10de6166f2dc7dcd9e717440,\n 0x242411f186e4dd6761a58a115fc4a12a72afe15ab2a8cba314bb36c3af628485,\n 0x27f6a9b6ae28fbf5ef658e8a8d7548578c2321be2fe7d8e61437358c27313bb1,\n 0x2e6b453486b8154a925a8d8f6343d70e3e7b3cf8ae5f98fe5dad385caf3a5b6d,\n 0x251a976a3bb9b67f9c5ce1633ae24fc78d8556949fe699b89b4a496ca8fd33ca,\n ])\n == [\n 0x2f73ecbfd328236b62a0de2f90fda6aa39027d2445904729de2cbb132f04eef7,\n 0x2e3b0e241e80ecb5c94599ef79b36384d50924dd78b29d136a78ba8dd4eac3e4,\n 0x240e35568bcf3d794be5b658207a13f30d3be889e85b735a5658c1e8ad8ecd06,\n 0x08f9a03ac71ded3712140d95fb4d84b6247f6ed3f005edc22c11c5749dcce0bb,\n 0x23d19806e8344c08f772bf1e4e6abb068bbe34f262a9e8e4dd1dd87cccfa76b9,\n 0x1d43aa80b45193c0fd0e0ffc51217feb505c0127558bfc4d60f8640a2f799225,\n 0x22bd86bb51b7941c6aeb8905d680a9f2b5d073cee1d72171aad90ee25f07d2f3,\n 0x21acac96adb169d04127c7ad9074753b49ce0ad68d1ecd4be803c7a7bd75049c,\n 0x2d3ccbacd3110045e3d7dda3a9c0114f03fcbbcefb5bf2b864627fa7e015c026,\n 0x0ecd348155a751f395a2c867f4f82a6e2e6a0e549784c3da3c6defd3ed8d2593,\n 0x17cd880e932fc4490b11b73a32e741052df57fd9b563f94192f0dada59fa7eeb,\n 0x0507ec99efeb586fa4a628563ad4c18d92a9ac3f3b69bbffdaad18c43a37c774,\n 0x22ba5e12ee0de1a7db0cf232639db2006be109a47dfd591f9ad4745844b28985,\n 0x0103ad1ccfccb7097c13a71f89d806294a355a4e0e24e9d7d353fa27a60599ed,\n 0x0a2744a2b3f1a1e9f0e365f195dc7bfb2becce17d346623407b68f2be38e6840,\n 0x1a10bad64f9099c918f1e3a713b34d43c9c8442eca37ac2be2933ef06a85f274,\n ],\n );\n assert(\n x5_16([\n 0x102aaf737cf6e4eded17a778873de94a33432c19f78c93ff6a438b54503073e6,\n 0x010ccff329d1680eb37dc0a14d1df9ecb51b563fbbe8e02f4b973a6d7c5a3ad9,\n 0x1c80734fefdf741d96d23dd5c9494a69eca35ad4c52e6781fe64fec042a39034,\n 0x1fd6d6a936a506af5a88f4efbcf6bacdaf166e18c1a9d9ec2706097e049a48d8,\n 0x0fcd3cf6478e2303fd67a88e8da308c99c6b034b9d9e8505a5cdb1f1328ac19f,\n 0x00a894f3228b2f40329bce6db4aed140044ca13388fe31dbeb7e920c47626b98,\n 0x05627ce9f83ba4ec21200390b4459d20a841b7b6bff58f54f859746e6a1a5bad,\n 0x1a6d68c2e6da0187cc187f14fd60d574347ee8e3b2e6d5377ca28d1c2126d579,\n 0x0796ff0b481621f97e6205b7098b3f34d9e25ce2a568823d34960d10675abe00,\n 0x1658c8c71f79eb8c1cbed9176d3fced3f102f6f3185c0086ca281621421ea687,\n 0x17b29467b557e95e2c98a68a62ae669bfea7e60f6f4b5c6c748536606f9559dd,\n 0x2db966ef0090e9b6b5e8bb41890ed54469beac546172968de44ac4fe1c91fc57,\n 0x116734a408c7898e7c14361cb189db728557f6cc7bf643ead36f46387e474105,\n 0x278912d4acb55f15c263054ee5961722234b0e8fc257d8afe3f55cd707fa8450,\n 0x2a3dbf10426ec43bd82e1aef23553b695b1a9d2339a99ec299649fdd128c7ffb,\n 0x1431dae2b608ec8aff9dbeabfaef7bbabb7a990241b2d2cb84d2b16b474dbec4,\n ])\n == [\n 0x04421416d3b0398c2089bea526a32fb66d78da31fb45bd5f1586fd52303adeb7,\n 0x1d8195ae558ec24145f22963dbe020eb9eb32f9b77993dee1a6651de4e043d6b,\n 0x065012470d069eafbdbe2e9472843e570a6c4bec2bff368a7e5177ace65cd7aa,\n 0x28293baa71d7e924399a38aa199be1886bef192b9bd170f4b5061cc266cce797,\n 0x1bf0bff909c28f440eb3a7b2fb48f3b58d30e7e35126eb4c8eb9dabdf4173caf,\n 0x006e32aafe5fc019cf7f2121640ed5877695317872900b005821e902855cb9e2,\n 0x077ce2784361c15f00bd94be5923b0d423e690a51427b82ac6da1bc3e15ff202,\n 0x04bec35d3bfe48abc26f1b213b37a46a6837ea4ef4c7c66aec7d6ec506b4816e,\n 0x09891cb5c5f97bfb53df6fa616a15454a20d2d9d4b1730b143b80603f1d2ead8,\n 0x2d2049ee1c7ade77d7f24e30d79274e6d4b65e32ca00485efbe7fcabe880ecdf,\n 0x0f3f82629e5571fa2d37501eb2c42ff2532b23dfa8b60a250406aea842752891,\n 0x154b6ac1520182ff79d85376c19f8c622c251762b269deae81db64257c3f8853,\n 0x092ebf535121a0cd3342dbf040e69031c5ee7f73a46cba5d7077cc40f1fe7623,\n 0x2e013478205cbe8b6c9315e2fe24374e6954b13a121f84a046656defd81b6aa7,\n 0x14899d106105b55a748e7b8180c6cc6ce1a1700dd723a182ad421bee03bea38d,\n 0x15a2465a074528248166bd7ab12dd8c1f7b0a523acf560393fb53cad0f9ff4a7,\n ],\n );\n assert(\n x5_16([\n 0x2c8251563bf2daf3832f54b41e1019e416f097fff0185b8972a24baab0041945,\n 0x1c5af36107dd27a50ed1b7be11fecc96955c940f7d1e8d85c73b55d2a72636cd,\n 0x0c2745de6e816df7564b63085fb2bbfac5b7901f3bea6c06527fc367886f25ff,\n 0x19019d42f79fd8654f69436c8230120b91d81a74a2c54a2b99b65b1104a4f855,\n 0x0beab5f110eba2ed3e125e96f33173ce8c969ab78b3ca023c1bcc765ce5df31f,\n 0x11d9b237b412ffd1a2a9d9ddddcf8eb725222a138a12d7dcfdca0856b2048c89,\n 0x1c448b112e517ee96e6ac2f8593f51ddcfea072bf6ad1d117e9072a8084c6a21,\n 0x095dfcdc5f3bb500206ed7fcd09ce1db8a89087a1767dfadf94b1d4a8719ecff,\n 0x2b83981c4547a9a91ddcf3e3d415c6a229e5b79c0194faa17a79fec0c7656625,\n 0x0dfc540c74084bd916dca0116e701424bbb4255575d997ac0980124380c79cba,\n 0x1ee3fd68c5face1c3bde5cc8a09820cf0d55e20c354006d5a1e7c17502fada01,\n 0x1731821cf372f905084ef42395e5cf7377b8e845539fbe75d431c460efb52f56,\n 0x095dd1057519b92facabf3d1bf4cfd9cfba721f13777ee1b156a94982aa0ea92,\n 0x09d8c656b448b642be7e5ba2820cde88395ee99c1609fc57a10e1a761bcec40e,\n 0x2cefff7d3c2d8de4caa6555ef6fe2d20ea75ab55295cd3d422f1e7706d00265b,\n 0x2af9da783cf3f2cdb98d1d0db2d46b500ab16b22d528c3290f9fa61a16e90c77,\n ])\n == [\n 0x045fd3534e4e3a441672b2174823a1b0f2bf33744dcedd04decafac412491ba5,\n 0x2e26d947a155dc04da57a4e2d08ff2789601da31999bd3d2d509ce74336db980,\n 0x252121c4d1f937e2a2bbf228252e3d5970b693269061b30ec67a7f46ce4eb28c,\n 0x13461512448fa47d7c334f17166a9791c79b0c7c744b5ec85b944fbcf3b8b364,\n 0x1e00352c73e0c20163f184f610dbc509b6a60e5b6df8636b2e238ea0867004be,\n 0x2256f5718367f8eb6730eb4a3bb0cc69a539b7c5d2e156212944f2f974693159,\n 0x243fc53f1ef63853cb507d4354c41153690522215a975a3b6bbd3f039ee91f71,\n 0x025aa431a3197a94e85c1390f0ae568c6aff20657428413bd8fd636b5db7e457,\n 0x1932edb2b21bf6cba1f674b00b70f923fee4a222872c1858559a60fe33e7baa9,\n 0x2ea0e86e9b5f04901a072c94cdc9c04c512acbc3da27e41a364ce5d4586166f5,\n 0x1b1c638d7c7637ba8a0732f02aa3666dd61c9aa502bc4bc78f4ce8fcc8c0599b,\n 0x2fabaf28f4bb95ee4f11593906d38519054372938ba6ce3be2a3227064ba5104,\n 0x1ec7790f18b886f8806f9865a1b047532fdde00a429656cb02532a1c77d6ff90,\n 0x28535227e19514f1ab220db019b2933cce0670c1c7439bda9aac0daaf63b086e,\n 0x14226659240668ad038136362481d9b9870d4ad6ab62e73bef74ed2ab66429c2,\n 0x0eae0bc0112d05992ae574f1b33f08f5a5bcd3092a6ec79c917effa908fa511f,\n ],\n );\n}\n",
|
|
30
|
+
"path": "/home/driemworks/nargo/github.com/TaceoLabs/noir-poseidon/v0.4.0/poseidon2/src/bn254/perm.nr"
|
|
31
|
+
},
|
|
32
|
+
"54": {
|
|
33
|
+
"source": "mod consts;\nmod perm;\nuse dep::hash_utils;\nuse dep::hash_utils::poseidon;\n\npub struct Poseidon2Bn254Config<let T: u32, let R: u32> {\n first_full_rc: [[Field; T]; 4],\n partial_rc: [Field; R],\n second_full_rc: [[Field; T]; 4],\n}\n\nfn permute_bn254<let T: u32, let R: u32>(\n mut state: [Field; T],\n mm_external: fn([Field; T]) -> [Field; T],\n mm_internal: fn([Field; T]) -> [Field; T],\n config: Poseidon2Bn254Config<T, R>,\n) -> [Field; T] {\n state = mm_external(state);\n for r in 0..4 {\n state = hash_utils::vec_add(state, config.first_full_rc[r]);\n state = poseidon::sbox(state);\n state = mm_external(state);\n }\n\n for r in 0..R {\n state[0] += config.partial_rc[r];\n state[0] = poseidon::sbox_e(state[0]);\n state = mm_internal(state);\n }\n for r in 0..4 {\n state = hash_utils::vec_add(state, config.second_full_rc[r]);\n state = poseidon::sbox(state);\n state = mm_external(state);\n }\n state\n}\n\n#[field(bn254)]\npub fn hash_1(input: [Field; 1]) -> Field {\n perm::x5_2([input[0], 1])[0]\n}\n\n#[field(bn254)]\npub fn hash_2(input: [Field; 2]) -> Field {\n perm::x5_2(input)[0]\n}\n\n#[field(bn254)]\npub fn hash_3(input: [Field; 3]) -> Field {\n perm::x5_3(input)[0]\n}\n\n#[field(bn254)]\npub fn hash_4(input: [Field; 4]) -> Field {\n perm::x5_4(input)[0]\n}\n\n#[field(bn254)]\npub fn hash_8(input: [Field; 8]) -> Field {\n perm::x5_8(input)[0]\n}\n\n#[field(bn254)]\npub fn hash_12(input: [Field; 12]) -> Field {\n perm::x5_12(input)[0]\n}\n\n#[field(bn254)]\npub fn hash_16(input: [Field; 16]) -> Field {\n perm::x5_16(input)[0]\n}\n",
|
|
34
|
+
"path": "/home/driemworks/nargo/github.com/TaceoLabs/noir-poseidon/v0.4.0/poseidon2/src/bn254.nr"
|
|
35
|
+
},
|
|
36
|
+
"57": {
|
|
37
|
+
"source": "use crate::double;\n\n#[field(bn254)]\npub fn sbox<let T: u32>(mut state: [Field; T]) -> [Field; T] {\n state.map(|x| sbox_e(x))\n}\n\n#[field(bn254)]\npub fn sbox_e(mut x: Field) -> Field {\n let mut result = x * x;\n result *= result;\n result * x\n}\n\n#[field(bn254)]\npub fn mds_2(state: [Field; 2]) -> [Field; 2] {\n let sum = state[0] + state[1];\n [sum + state[0], sum + state[1]]\n}\n\npub fn mds_3(state: [Field; 3]) -> [Field; 3] {\n let sum = state.reduce(|a, b| a + b);\n let mut ret_val = [0; 3];\n ret_val[0] = state[0] + sum;\n ret_val[1] = 2 * state[1] + sum;\n ret_val[2] = state[2] + sum;\n ret_val\n}\n\n#[field(bn254)]\npub fn mds_4(mut state: [Field; 4]) -> [Field; 4] {\n let t_0 = state[0] + state[1];\n let t_1 = state[2] + state[3];\n let t_2 = double(state[1]) + t_1;\n let t_3 = double(state[3]) + t_0;\n let t_4 = double(double(t_1)) + t_3;\n let t_5 = double(double(t_0)) + t_2;\n state[0] = t_3 + t_5;\n state[1] = t_5;\n state[2] = t_2 + t_4;\n state[3] = t_4;\n state\n}\n",
|
|
38
|
+
"path": "/home/driemworks/nargo/github.com/TaceoLabs/noir-poseidon/v0.4.0/hash_utils/src/poseidon.nr"
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
expression_width: { "Bounded": { "width": 4 } }
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
//#endregion
|
|
45
|
+
export { poseiden1_hash_default as default };
|
|
46
|
+
//# sourceMappingURL=poseiden1_hash.js.map
|